def __init__(self, image_number, *args): ScanVaryingCrystalOrientationParameterisation.__init__(self, *args) # set overloads now, after construction of the base class self.compose = self._compose self.get_state = self._get_state self.set_time_point(image_number)
def create_models(self, cmdline_overrides=None): from dxtbx.model import ScanFactory from libtbx.phil import parse from dials.test.algorithms.refinement.setup_geometry import Extract if cmdline_overrides is None: cmdline_overrides = [] overrides = """geometry.parameters.crystal.a.length.range = 10 50 geometry.parameters.crystal.b.length.range = 10 50 geometry.parameters.crystal.c.length.range = 10 50""" master_phil = parse( """ include scope dials.test.algorithms.refinement.geometry_phil """, process_includes=True, ) # Extract models models = Extract(master_phil, overrides, cmdline_args=cmdline_overrides) self.detector = models.detector self.goniometer = models.goniometer self.crystal = models.crystal self.beam = models.beam # Make a scan of 1-20 * 0.5 deg images sf = ScanFactory() self.scan = sf.make_scan((1, 20), 0.5, (0, 0.5), list(range(20))) # Generate an ExperimentList self.experiments = ExperimentList() self.experiments.append( Experiment( beam=self.beam, detector=self.detector, goniometer=self.goniometer, scan=self.scan, crystal=self.crystal, imageset=None, )) # Create a reflection predictor for the experiments self.ref_predictor = ScansExperimentsPredictor(self.experiments) # Create scan-varying parameterisations of these models, with 3 samples self.det_param = ScanVaryingDetectorParameterisationSinglePanel( self.detector, self.scan.get_array_range(), 3) self.s0_param = ScanVaryingBeamParameterisation( self.beam, self.scan.get_array_range(), 3, self.goniometer) self.xlo_param = ScanVaryingCrystalOrientationParameterisation( self.crystal, self.scan.get_array_range(), 3) self.xluc_param = ScanVaryingCrystalUnitCellParameterisation( self.crystal, self.scan.get_array_range(), 3) self.gon_param = ScanVaryingGoniometerParameterisation( self.goniometer, self.scan.get_array_range(), 3, self.beam)
def _get_state(self): """override for get_state to do so only at the requested t""" # ensure the state is updated by re-composing self.compose() return ScanVaryingCrystalOrientationParameterisation.get_state(self)
def _compose(self): """override for compose to pass in the requested t""" ScanVaryingCrystalOrientationParameterisation.compose(self, self.image_number)
def _compose(self): """override for compose to pass in the requested t""" ScanVaryingCrystalOrientationParameterisation.compose( self, self.image_number)
def __init__(self, image_number, *args): ScanVaryingCrystalOrientationParameterisation.__init__(self, *args) self.set_time_point(image_number)
mydetector = models.detector mygonio = models.goniometer mycrystal = models.crystal mybeam = models.beam # Make a scan of 1-360 * 0.5 deg images sf = scan_factory() myscan = sf.make_scan((1,360), 0.5, (0, 0.5), range(360)) # Create parameterisations of these models, with 5 samples for the # scan-varying crystal parameterisations det_param = DetectorParameterisationSinglePanel(mydetector) s0_param = BeamParameterisation(mybeam, mygonio) xlo_param = ScanVaryingCrystalOrientationParameterisation( mycrystal, myscan.get_array_range(), 5) xluc_param = ScanVaryingCrystalUnitCellParameterisation( mycrystal, myscan.get_array_range(), 5) #### Cause the crystal U and B to vary over the scan # Vary orientation angles by ~1.0 mrad each checkpoint p_vals = xlo_param.get_param_vals() sigmas = [1.0] * len(p_vals) new_vals = random_param_shift(p_vals, sigmas) xlo_param.set_param_vals(new_vals) # Vary unit cell parameters, on order of 1% of the initial metrical # matrix parameters p_vals = xluc_param.get_param_vals() sigmas = [0.01 * p for p in p_vals]