def _get_integrater(self): '''Get my integrater, and if it is not set, create one.''' if self._integrater == None: # set the working directory for this, based on the hierarchy # defined herein... # that would be CRYSTAL_ID/WAVELENGTH/SWEEP/index &c. if not self.get_wavelength(): wavelength_id = "default" crystal_id = "default" project_id = "default" else: wavelength_id = self.get_wavelength().get_name() crystal_id = self.get_wavelength().get_crystal().get_name() project_id = self.get_wavelength().get_crystal().get_project().get_name() working_directory = Environment.generate_directory( [crystal_id, wavelength_id, self.get_name(), 'integrate']) json_file = os.path.join(working_directory, 'xia2.json') if (Flags.get_serialize_state() and os.path.isdir(working_directory) and os.path.isfile(json_file)): self._integrater = IntegraterFactory.IntegraterForXSweep( self, json_file=json_file) else: self._integrater = IntegraterFactory.IntegraterForXSweep(self) # configure the integrater with the indexer - unless # we don't want to... self._integrater.set_integrater_refiner(self._get_refiner()) Debug.write('Integrater / refiner / indexer for sweep %s: %s/%s/%s' % \ (self._name, self._integrater.__class__.__name__, self._get_refiner().__class__.__name__, self._get_indexer().__class__.__name__)) # or if we have been told this on the command-line - # N.B. should really add a mechanism to specify the ice # rings we want removing, #1317. if Flags.get_ice(): self._integrater.set_integrater_ice(Flags.get_ice()) # or if we were told about ice or specific excluded resolution # ranges via the xinfo file if self._ice: self._integrater.set_integrater_ice(self._ice) if len(self._excluded_regions) > 0: self._integrater.set_integrater_excluded_regions( self._excluded_regions) self._integrater.set_integrater_project_info( project_id, crystal_id, wavelength_id) self._integrater.set_integrater_sweep_name(self._name) # copy across anomalous flags in case it's useful - #871 self._integrater.set_integrater_anomalous( self.get_wavelength().get_crystal().get_anomalous()) # see if we have any useful detector parameters to pass on if self.get_gain(): self._integrater.set_gain(self.get_gain()) if self.get_polarization(): self._integrater.set_polarization(self.get_polarization()) # look to see if there are any global integration parameters # we can set... if global_integration_parameters.get_parameters(crystal_id): Debug.write('Using integration parameters for crystal %s' \ % crystal_id) self._integrater.set_integrater_parameters( global_integration_parameters.get_parameters(crystal_id)) # frames to process... if self._frames_to_process: frames = self._frames_to_process self._integrater.set_integrater_wedge(frames[0], frames[1]) self._integrater.set_frame_wedge(frames[0], frames[1]) self._integrater.set_integrater_epoch( self.get_epoch(self._frames_to_process[0])) self._integrater.set_working_directory(working_directory) return self._integrater
def _get_refiner(self): if self._refiner == None: # set the working directory for this, based on the hierarchy # defined herein... # that would be CRYSTAL_ID/WAVELENGTH/SWEEP/index &c. if not self.get_wavelength(): wavelength_id = "default" crystal_id = "default" else: wavelength_id = self.get_wavelength().get_name() crystal_id = self.get_wavelength().get_crystal().get_name() working_directory = Environment.generate_directory( [crystal_id, wavelength_id, self.get_name(), 'refine']) json_file = None if Flags.get_serialize_state() and os.path.isdir(working_directory): json_file = os.path.join(working_directory, 'xia2.json') if not os.path.isfile(json_file): json_file = None # FIXME the indexer factory should probably be able to # take self [this object] as input, to help with deciding # the most appropriate indexer to use... this will certainly # be the case for the integrater. Maintaining this link # will also help the system cope with updates (which # was going to be one of the big problems...) # 06/SEP/06 no keep these interfaces separate - want to # keep "pure" interfaces to the programs for reuse, then # wrap in XStyle. self._refiner = RefinerFactory.RefinerForXSweep( self, json_file=json_file) ## set the user supplied lattice if there is one #if self._user_lattice: #self._indexer.set_indexer_input_lattice(self._user_lattice) #self._indexer.set_indexer_user_input_lattice(True) ## and also the cell constants - but only if lattice is ## assigned #if self._user_cell: #self._indexer.set_indexer_input_cell(self._user_cell) #else: #if self._user_cell: #raise RuntimeError, 'cannot assign cell without lattice' self._refiner.set_working_directory(working_directory) #if self._frames_to_process: #frames = self._frames_to_process #self._refiner.set_frame_wedge(frames[0], frames[1]) #self._refiner.set_indexer_sweep_name(self._name) self._refiner.add_refiner_indexer( self.get_epoch(self._frames_to_process[0]), self._get_indexer()) return self._refiner