def make_multi_panel(single_panel_detector): """Create a 3x3 multi-panel detector filling the same space as a supplied single panel detector""" from dials.test.algorithms.refinement.tst_multi_panel_detector_parameterisation \ import make_panel_in_array from dials.test.algorithms.refinement.setup_geometry import \ random_vector_close_to multi_panel_detector = Detector() for x in range(3): for y in range(3): new_panel = make_panel_in_array( (x, y), single_panel_detector[0]) multi_panel_detector.add_panel(new_panel) # apply small random shifts & rotations to each panel for p in multi_panel_detector: # perturb origin vector o_multiplier = random.gauss(1.0, 0.01) new_origin = random_vector_close_to(p.get_origin(), sd=0.1) new_origin *= o_multiplier # perturb fast direction vector new_dir1 = random_vector_close_to(p.get_fast_axis(), sd=0.5) # create vector in the plane of dir1-dir2 dir1_dir2 = random_vector_close_to(p.get_slow_axis(), sd=0.5) # find normal to panel plane and thus new slow direction vector dn = new_dir1.cross(dir1_dir2) new_dir2 = dn.cross(new_dir1) # set panel frame p.set_frame(new_dir1, new_dir2, new_origin) return multi_panel_detector
def make_multi_panel(single_panel_detector): """Create a 3x3 multi-panel detector filling the same space as a supplied single panel detector""" from dials.test.algorithms.refinement.tst_multi_panel_detector_parameterisation \ import make_panel_in_array from dials.test.algorithms.refinement.setup_geometry import \ random_vector_close_to multi_panel_detector = Detector() for x in range(3): for y in range(3): new_panel = make_panel_in_array((x, y), single_panel_detector[0]) multi_panel_detector.add_panel(new_panel) # apply small random shifts & rotations to each panel for p in multi_panel_detector: # perturb origin vector o_multiplier = random.gauss(1.0, 0.01) new_origin = random_vector_close_to(p.get_origin(), sd=0.1) new_origin *= o_multiplier # perturb fast direction vector new_dir1 = random_vector_close_to(p.get_fast_axis(), sd=0.5) # create vector in the plane of dir1-dir2 dir1_dir2 = random_vector_close_to(p.get_slow_axis(), sd=0.5) # find normal to panel plane and thus new slow direction vector dn = new_dir1.cross(dir1_dir2) new_dir2 = dn.cross(new_dir1) # set panel frame p.set_frame(new_dir1, new_dir2, new_origin) return multi_panel_detector
models = setup_geometry.Extract(master_phil, cmdline_args = args) single_panel_detector = models.detector mygonio = models.goniometer mycrystal = models.crystal mybeam = models.beam # Make a 3x3 multi panel detector filling the same space as the existing # single panel detector. Each panel of the multi-panel detector has pixels with # 1/3 the length dimensions of the single panel. multi_panel_detector = Detector() for x in range(3): for y in range(3): new_panel = make_panel_in_array((x, y), single_panel_detector[0]) multi_panel_detector.add_panel(new_panel) # Build a mock scan for a 180 degree sweep sf = scan_factory() myscan = sf.make_scan(image_range = (1,1800), exposure_times = 0.1, oscillation = (0, 0.1), epochs = range(1800), deg = True) sweep_range = myscan.get_oscillation_range(deg=False) im_width = myscan.get_oscillation(deg=False)[1] assert sweep_range == (0., pi) assert approx_equal(im_width, 0.1 * pi / 180.) # Build ExperimentLists experiments_single_panel = ExperimentList()