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