def do_import(filename): logger.info("Loading %s" % os.path.basename(filename)) datablocks = DataBlockFactory.from_filenames([filename]) if len(datablocks) == 0: try: datablocks = DataBlockFactory.from_json_file(filename) except ValueError: raise Abort("Could not load %s" % filename) if len(datablocks) == 0: raise Abort("Could not load %s" % filename) if len(datablocks) > 1: raise Abort("Got multiple datablocks from file %s" % filename) # Ensure the indexer and downstream applications treat this as set of stills reset_sets = [] from dxtbx.imageset import ImageSetFactory for imageset in datablocks[0].extract_imagesets(): imageset = ImageSetFactory.imageset_from_anyset(imageset) imageset.set_scan(None) imageset.set_goniometer(None) reset_sets.append(imageset) return DataBlockFactory.from_imageset(reset_sets)[0]
def __call__(self, imageset): """ Override the parameters """ from dxtbx.imageset import ImageSequence, ImageSetFactory from dxtbx.model import BeamFactory from dxtbx.model import DetectorFactory from dxtbx.model import GoniometerFactory from dxtbx.model import ScanFactory from copy import deepcopy if self.params.geometry.convert_sequences_to_stills: imageset = ImageSetFactory.imageset_from_anyset(imageset) for j in imageset.indices(): imageset.set_scan(None, j) imageset.set_goniometer(None, j) if not isinstance(imageset, ImageSequence): if self.params.geometry.convert_stills_to_sequences: imageset = self.convert_stills_to_sequence(imageset) if isinstance(imageset, ImageSequence): beam = BeamFactory.from_phil(self.params.geometry, imageset.get_beam()) detector = DetectorFactory.from_phil( self.params.geometry, imageset.get_detector(), beam ) goniometer = GoniometerFactory.from_phil( self.params.geometry, imageset.get_goniometer() ) scan = ScanFactory.from_phil( self.params.geometry, deepcopy(imageset.get_scan()) ) i0, i1 = scan.get_array_range() j0, j1 = imageset.get_scan().get_array_range() if i0 < j0 or i1 > j1: imageset = self.extrapolate_imageset( imageset=imageset, beam=beam, detector=detector, goniometer=goniometer, scan=scan, ) else: imageset.set_beam(beam) imageset.set_detector(detector) imageset.set_goniometer(goniometer) imageset.set_scan(scan) else: for i in range(len(imageset)): beam = BeamFactory.from_phil(self.params.geometry, imageset.get_beam(i)) detector = DetectorFactory.from_phil( self.params.geometry, imageset.get_detector(i), beam ) goniometer = GoniometerFactory.from_phil( self.params.geometry, imageset.get_goniometer(i) ) scan = ScanFactory.from_phil(self.params.geometry, imageset.get_scan(i)) imageset.set_beam(beam, i) imageset.set_detector(detector, i) imageset.set_goniometer(goniometer, i) imageset.set_scan(scan, i) return imageset
def do_import(filename, load_models=True): logger.info("Loading %s" % os.path.basename(filename)) experiments = ExperimentListFactory.from_filenames([filename], load_models=False) if len(experiments) == 0: try: experiments = ExperimentListFactory.from_json_file(filename) except ValueError: raise Abort("Could not load %s" % filename) if len(experiments) == 0: raise Abort("Could not load %s" % filename) from dxtbx.imageset import ImageSetFactory for experiment in experiments: if load_models: experiment.load_models() imageset = ImageSetFactory.imageset_from_anyset(experiment.imageset) imageset.set_scan(None) imageset.set_goniometer(None) experiment.imageset = imageset experiment.scan = None experiment.goniometer = None return experiments
def index(experiments, reflections, params): """ Index the input experiments and reflections. Args: experiments: The experiments to index reflections (list): A list of reflection tables containing strong spots params: An instance of the indexing phil scope Returns: (tuple): tuple containing: experiments: The indexed experiment list reflections (dials.array_family.flex.reflection_table): The indexed reflections """ if experiments.crystals()[0] is not None: known_crystal_models = experiments.crystals() else: known_crystal_models = None if len(reflections) == 0: raise ValueError("No reflection lists found in input") elif len(reflections) == 1: reflections[0]["imageset_id"] = reflections[0]["id"] elif len(reflections) > 1: assert len(reflections) == len(experiments) for i in range(len(reflections)): reflections[i]["imageset_id"] = flex.int(len(reflections[i]), i) if i > 0: reflections[0].extend(reflections[i]) reflections = reflections[0] # If there are scan and goniometer objects present but the oscillation angle is zero # then expt.scan and expt.goniometer to None, as the behaviour of some downstream # algorithms depend on the presence/absence of these objects for expt in experiments: if (expt.goniometer is not None and expt.scan is not None and expt.scan.is_still()): expt.imageset = ImageSetFactory.imageset_from_anyset(expt.imageset) expt.goniometer = None expt.scan = None if params.indexing.image_range: reflections = slice_reflections(reflections, params.indexing.image_range) if len(experiments) == 1 or params.indexing.joint_indexing: indexed_experiments, indexed_reflections = _index_experiments( experiments, reflections, copy.deepcopy(params), known_crystal_models=known_crystal_models, ) else: indexed_experiments = ExperimentList() indexed_reflections = flex.reflection_table() with concurrent.futures.ProcessPoolExecutor( max_workers=params.indexing.nproc) as pool: futures = [] for i_expt, expt in enumerate(experiments): refl = reflections.select(reflections["imageset_id"] == i_expt) refl["imageset_id"] = flex.size_t(len(refl), 0) futures.append( pool.submit( _index_experiments, ExperimentList([expt]), refl, copy.deepcopy(params), known_crystal_models=known_crystal_models, )) for future in concurrent.futures.as_completed(futures): try: idx_expts, idx_refl = future.result() except Exception as e: print(e) else: if idx_expts is None: continue for j_expt, _ in enumerate(idx_expts): sel = idx_refl["id"] == j_expt idx_refl["id"].set_selected( sel, len(indexed_experiments) + j_expt) idx_refl["imageset_id"] = flex.size_t( len(idx_refl), i_expt) indexed_reflections.extend(idx_refl) indexed_experiments.extend(idx_expts) return indexed_experiments, indexed_reflections