def simple(fmodel, pdb_hierarchy, params=None, log=None, show_results=False):
    if (params is None): params = master_params().extract()
    if (log is None): log = sys.stdout

    crystal_gridding = None
    unit_cell = None
    d_min = 1.0
    map_1 = None
    map_2 = None

    # compute map_1 and map_2 if given F_obs (fmodel exists)
    if ((params.map_file_name is None)
            and (params.map_coefficients_file_name is None)
            and (fmodel is not None)):
        e_map_obj = fmodel.electron_density_map()
        coeffs_2 = e_map_obj.map_coefficients(
            map_type=params.map_2.type,
            fill_missing=params.map_2.fill_missing_reflections,
            isotropize=params.map_2.isotropize)
        fft_map_2 = coeffs_2.fft_map(
            resolution_factor=params.resolution_factor)
        crystal_gridding = fft_map_2
        fft_map_2.apply_sigma_scaling()
        map_2 = fft_map_2.real_map_unpadded()

        coeffs_1 = e_map_obj.map_coefficients(
            map_type=params.map_1.type,
            fill_missing=params.map_1.fill_missing_reflections,
            isotropize=params.map_1.isotropize)
        fft_map_1 = miller.fft_map(crystal_gridding=crystal_gridding,
                                   fourier_coefficients=coeffs_1)
        fft_map_1.apply_sigma_scaling()
        map_1 = fft_map_1.real_map_unpadded()

        unit_cell = fmodel.xray_structure.unit_cell()
        d_min = fmodel.f_obs().d_min()

    # or read map coefficents
    elif (params.map_coefficients_file_name is not None):
        map_handle = any_file(params.map_coefficients_file_name)
        crystal_symmetry = get_crystal_symmetry(map_handle)
        unit_cell = crystal_symmetry.unit_cell()
        d_min = get_d_min(map_handle)
        crystal_gridding = maptbx.crystal_gridding(
            crystal_symmetry.unit_cell(),
            d_min=d_min,
            resolution_factor=params.resolution_factor,
            space_group_info=crystal_symmetry.space_group_info())
        coeffs_2 = map_handle.file_server.get_miller_array(
            params.map_coefficients_label)
        fft_map_2 = miller.fft_map(crystal_gridding=crystal_gridding,
                                   fourier_coefficients=coeffs_2)
        fft_map_2.apply_sigma_scaling()
        map_2 = fft_map_2.real_map_unpadded()

    # or read CCP4 map
    else:
        map_handle = any_file(params.map_file_name)
        unit_cell = map_handle.file_object.unit_cell()
        sg_info = space_group_info(map_handle.file_object.space_group_number)
        n_real = map_handle.file_object.unit_cell_grid
        crystal_gridding = maptbx.crystal_gridding(
            unit_cell, space_group_info=sg_info, pre_determined_n_real=n_real)
        map_2 = map_handle.file_object.map_data()

        # check for origin shift
        # modified from phenix.command_line.real_space_refine
        # plan to centralize functionality in another location
        # -------------------------------------------------------------------------
        shift_manager = mmtbx.utils.shift_origin(
            map_data=map_2,
            pdb_hierarchy=pdb_hierarchy,
            crystal_symmetry=map_handle.crystal_symmetry())
        if (shift_manager.shift_cart is not None):
            print("Map origin is not at (0,0,0): shifting the map and model.",
                  file=log)
        pdb_hierarchy = shift_manager.pdb_hierarchy
        map_2 = shift_manager.map_data
        # -------------------------------------------------------------------------

    # compute map_1 (Fc) if given a map (fmodel does not exist)
    if (map_1 is None):
        xray_structure = pdb_hierarchy.extract_xray_structure(
            crystal_symmetry=crystal_gridding.crystal_symmetry())
        fft_map_1 = compute_map_from_model(d_min,
                                           None,
                                           xray_structure,
                                           crystal_gridding=crystal_gridding)
        fft_map_1.apply_sigma_scaling()
        map_1 = fft_map_1.real_map_unpadded()

    # compute cc
    assert ((map_1 is not None) and (map_2 is not None))
    broadcast(m="Map correlation and map values", log=log)
    overall_cc = flex.linear_correlation(x=map_1.as_1d(),
                                         y=map_2.as_1d()).coefficient()
    print("  Overall map cc(%s,%s): %6.4f" %
          (params.map_1.type, params.map_2.type, overall_cc),
          file=log)
    detail, atom_radius = params.detail, params.atom_radius
    detail, atom_radius = set_detail_level_and_radius(detail=detail,
                                                      atom_radius=atom_radius,
                                                      d_min=d_min)
    use_hydrogens = params.use_hydrogens
    if (use_hydrogens is None):
        if (params.scattering_table == "neutron" or d_min <= 1.2):
            use_hydrogens = True
        else:
            use_hydrogens = False
    hydrogen_atom_radius = params.hydrogen_atom_radius
    if (hydrogen_atom_radius is None):
        if (params.scattering_table == "neutron"):
            hydrogen_atom_radius = atom_radius
        else:
            hydrogen_atom_radius = 1
    results = compute(pdb_hierarchy=pdb_hierarchy,
                      unit_cell=unit_cell,
                      fft_n_real=map_1.focus(),
                      fft_m_real=map_1.all(),
                      map_1=map_1,
                      map_2=map_2,
                      detail=detail,
                      atom_radius=atom_radius,
                      use_hydrogens=use_hydrogens,
                      hydrogen_atom_radius=hydrogen_atom_radius)
    if (show_results):
        show(log=log, results=results, params=params, detail=detail)
    return overall_cc, results
def simple(fmodel, pdb_hierarchy, params=None, log=None, show_results=False):
  if(params is None): params = master_params().extract()
  if(log is None): log = sys.stdout

  crystal_gridding = None
  unit_cell = None
  d_min = 1.0
  map_1 = None
  map_2 = None

  # compute map_1 and map_2 if given F_obs (fmodel exists)
  if ( (params.map_file_name is None) and
       (params.map_coefficients_file_name is None) and
       (fmodel is not None) ):
    e_map_obj = fmodel.electron_density_map()
    coeffs_2 = e_map_obj.map_coefficients(
      map_type     = params.map_2.type,
      fill_missing = params.map_2.fill_missing_reflections,
      isotropize   = params.map_2.isotropize)
    fft_map_2 = coeffs_2.fft_map(resolution_factor = params.resolution_factor)
    crystal_gridding = fft_map_2
    fft_map_2.apply_sigma_scaling()
    map_2 = fft_map_2.real_map_unpadded()

    coeffs_1 = e_map_obj.map_coefficients(
      map_type     = params.map_1.type,
      fill_missing = params.map_1.fill_missing_reflections,
      isotropize   = params.map_1.isotropize)
    fft_map_1 = miller.fft_map(crystal_gridding = crystal_gridding,
                               fourier_coefficients = coeffs_1)
    fft_map_1.apply_sigma_scaling()
    map_1 = fft_map_1.real_map_unpadded()

    unit_cell = fmodel.xray_structure.unit_cell()
    d_min = fmodel.f_obs().d_min()

  # or read map coefficents
  elif (params.map_coefficients_file_name is not None):
    map_handle = any_file(params.map_coefficients_file_name)
    crystal_symmetry = get_crystal_symmetry(map_handle)
    unit_cell = crystal_symmetry.unit_cell()
    d_min = get_d_min(map_handle)
    crystal_gridding = maptbx.crystal_gridding(
      crystal_symmetry.unit_cell(), d_min=d_min,
      resolution_factor=params.resolution_factor,
      space_group_info=crystal_symmetry.space_group_info())
    coeffs_2 = map_handle.file_server.get_miller_array(
      params.map_coefficients_label)
    fft_map_2 = miller.fft_map(crystal_gridding=crystal_gridding,
                               fourier_coefficients=coeffs_2)
    fft_map_2.apply_sigma_scaling()
    map_2 = fft_map_2.real_map_unpadded()

  # or read CCP4 map
  else:
    map_handle = any_file(params.map_file_name)
    unit_cell = map_handle.file_object.unit_cell()
    sg_info = space_group_info(map_handle.file_object.space_group_number)
    n_real = map_handle.file_object.unit_cell_grid
    crystal_gridding = maptbx.crystal_gridding(
      unit_cell, space_group_info=sg_info, pre_determined_n_real=n_real)
    map_2 = map_handle.file_object.map_data()

  # compute map_1 (Fc) if given a map (fmodel does not exist)
  if (map_1 is None):
    xray_structure = pdb_hierarchy.extract_xray_structure(
      crystal_symmetry=crystal_gridding.crystal_symmetry())
    fft_map_1 = compute_map_from_model(d_min, None, xray_structure,
                                       crystal_gridding=crystal_gridding)
    fft_map_1.apply_sigma_scaling()
    map_1 = fft_map_1.real_map_unpadded()

  # compute cc
  assert ( (map_1 is not None) and (map_2 is not None) )
  broadcast(m="Map correlation and map values", log=log)
  overall_cc = flex.linear_correlation(x = map_1.as_1d(),
    y = map_2.as_1d()).coefficient()
  print >> log, "  Overall map cc(%s,%s): %6.4f"%(params.map_1.type,
    params.map_2.type, overall_cc)
  detail, atom_radius = params.detail, params.atom_radius
  detail, atom_radius = set_detail_level_and_radius(
    detail=detail, atom_radius=atom_radius, d_min=d_min)
  use_hydrogens = params.use_hydrogens
  if(use_hydrogens is None):
    if(params.scattering_table == "neutron" or d_min <= 1.2):
      use_hydrogens = True
    else:
      use_hydrogens = False
  hydrogen_atom_radius = params.hydrogen_atom_radius
  if(hydrogen_atom_radius is None):
    if(params.scattering_table == "neutron"):
      hydrogen_atom_radius = atom_radius
    else:
      hydrogen_atom_radius = 1
  results = compute(
    pdb_hierarchy        = pdb_hierarchy,
    unit_cell            = unit_cell,
    fft_n_real           = map_1.focus(),
    fft_m_real           = map_1.all(),
    map_1                = map_1,
    map_2                = map_2,
    detail               = detail,
    atom_radius          = atom_radius,
    use_hydrogens        = use_hydrogens,
    hydrogen_atom_radius = hydrogen_atom_radius)
  if(show_results):
    show(log=log, results=results, params=params, detail=detail)
  return results
def cmd_run(args, command_name, log=None):
    if (log is None): log = sys.stdout
    args = list(args)
    msg = """\

Compute map correlation coefficient given input PDB model and reflection data.

Examples:

  phenix.real_space_correlation m.pdb d.mtz
  phenix.real_space_correlation m.pdb d.mtz detail=atom
  phenix.real_space_correlation m.pdb d.mtz detail=residue
  phenix.real_space_correlation m.pdb d.mtz data_labels=FOBS
  phenix.real_space_correlation m.pdb d.mtz scattering_table=neutron
  phenix.real_space_correlation m.pdb d.mtz detail=atom use_hydrogens=true
  phenix.real_space_correlation m.pdb d.mtz map_1.type=Fc map_2.type="2mFo-DFc"

  phenix.real_space_correlation m.pdb d.mtz map_coefficients_label="2FOFCWT,PH2FOFCWT"
  phenix.real_space_correlation m.pdb d.ccp4
"""
    if (len(args) == 0) or (args == ["--help"]) or (args == ["--options"]):
        print(msg, file=log)
        broadcast(m="Default parameters:", log=log)
        master_params().show(out=log, prefix="  ")
        return
    else:
        pdb_file = None
        reflection_file = None
        map_file = None
        phil_objects = []
        n_files = 0
        for arg in args:
            if (os.path.isfile(arg)):
                inp = any_file(arg)
                if (inp.file_type == "phil"):
                    phil_objects.append(inp.file_object)
                elif (inp.file_type == "pdb"):
                    pdb_file = inp
                elif (inp.file_type == "hkl"):
                    reflection_file = inp
                elif (inp.file_type == "ccp4_map"):
                    map_file = inp
                else:
                    raise Sorry((
                        "Don't know how to deal with the file %s - unrecognized "
                        +
                        "format '%s'.  Please verify that the syntax is correct."
                    ) % (arg, str(inp.file_type)))
                n_files += 1
            else:
                try:
                    phil_objects.append(iotbx.phil.parse(arg))
                except RuntimeError as e:
                    raise Sorry(
                        "Unrecognized parameter or command-line argument '%s'."
                        % arg)
        if (n_files > 2):
            raise Sorry('Only 2 files are needed, a structure and the data')
        working_phil, unused = master_params().fetch(
            sources=phil_objects, track_unused_definitions=True)
        if (len(unused) > 0):
            for u in unused:
                print(str(u))
            raise Sorry("Unused parameters: see above.")
        params = working_phil.extract()

        # PDB file
        extract_input_pdb(pdb_file=pdb_file, params=params)
        broadcast(m="Input PDB file name: %s" % params.pdb_file_name, log=log)
        pdbo = pdb_to_xrs(pdb_file_name=params.pdb_file_name,
                          scattering_table=params.scattering_table)
        pdbo.xray_structure.show_summary(f=log, prefix="  ")

        # data file
        # set params.reflection_file_name and params.map_coefficients_file_name
        extract_input_data(hkl_file=reflection_file, params=params)
        data_and_flags = None
        if (params.reflection_file_name is not None):
            broadcast(m="Input reflection file name: %s" %
                      params.reflection_file_name,
                      log=log)
            data_and_flags = extract_data_and_flags(params=params)
            data_and_flags.f_obs.show_comprehensive_summary(f=log, prefix="  ")

        # map file (if available)
        # set params.map_file_name
        check_map_file(map_file, params)
        map_name = ((params.map_coefficients_file_name)
                    or (params.map_file_name))
        if (map_name is not None):
            map_handle = any_file(map_name)
            broadcast(m='Input map file name: %s' % map_name, log=log)
            print('  Map type: ', end=' ', file=log)
            if (map_handle.file_type == 'hkl'):
                print('map coefficients', file=log)
                print('  Map labels:', params.map_coefficients_label, file=log)
            else:
                print('CCP4-format', file=log)

            # check crystal symmetry
            cs1 = pdbo.xray_structure.crystal_symmetry()
            cs2 = get_crystal_symmetry(map_handle)
            if (cs1.is_similar_symmetry(cs2) is False):
                raise Sorry(
                    'The symmetry of the two files, %s and %s, is not similar'
                    % (fobs_handle.file_name, map_handle.file_name))

        # check that only one data file is defined
        if ((map_name is not None)
                and (params.reflection_file_name is not None)):
            raise Sorry('Please use F_obs or a map, not both.')
        if ((params.reflection_file_name is None) and (map_name is None)):
            raise Sorry('A data file is required.')

        # create fmodel with f_obs (if available)
        fmodel = None
        if (params.reflection_file_name is not None):
            r_free_flags = data_and_flags.f_obs.array(
                data=flex.bool(data_and_flags.f_obs.size(), False))
            fmodel = mmtbx.utils.fmodel_simple(
                xray_structures=[pdbo.xray_structure],
                scattering_table=params.scattering_table,
                f_obs=data_and_flags.f_obs,
                r_free_flags=r_free_flags)
            broadcast(m="R-factors, reflection counts and scales", log=log)
            fmodel.show(log=log, show_header=False)

        # compute cc
        results = simple(fmodel=fmodel,
                         pdb_hierarchy=pdbo.pdb_hierarchy,
                         params=params,
                         show_results=True,
                         log=log)
def cmd_run(args, command_name, log=None):
  if(log is None): log = sys.stdout
  args = list(args)
  msg = """\

Compute map correlation coefficient given input PDB model and reflection data.

Examples:

  phenix.real_space_correlation m.pdb d.mtz
  phenix.real_space_correlation m.pdb d.mtz detail=atom
  phenix.real_space_correlation m.pdb d.mtz detail=residue
  phenix.real_space_correlation m.pdb d.mtz data_labels=FOBS
  phenix.real_space_correlation m.pdb d.mtz scattering_table=neutron
  phenix.real_space_correlation m.pdb d.mtz detail=atom use_hydrogens=true
  phenix.real_space_correlation m.pdb d.mtz map_1.type=Fc map_2.type="2mFo-DFc"

  phenix.real_space_correlation m.pdb d.mtz map_coefficients_label="2FOFCWT,PH2FOFCWT"
  phenix.real_space_correlation m.pdb d.ccp4
"""
  if(len(args) == 0) or (args == ["--help"]) or (args == ["--options"]):
    print >> log, msg
    broadcast(m="Default parameters:", log = log)
    master_params().show(out = log, prefix="  ")
    return
  else :
    pdb_file = None
    reflection_file = None
    map_file = None
    phil_objects = []
    n_files = 0
    for arg in args :
      if(os.path.isfile(arg)) :
        inp = any_file(arg)
        if(  inp.file_type == "phil"): phil_objects.append(inp.file_object)
        elif(inp.file_type == "pdb"):  pdb_file = inp
        elif(inp.file_type == "hkl"):  reflection_file = inp
        elif(inp.file_type == "ccp4_map"): map_file = inp
        else:
          raise Sorry(("Don't know how to deal with the file %s - unrecognized "+
            "format '%s'.  Please verify that the syntax is correct.") % (arg,
              str(inp.file_type)))
        n_files += 1
      else:
        try:
          phil_objects.append(iotbx.phil.parse(arg))
        except RuntimeError, e:
          raise Sorry("Unrecognized parameter or command-line argument '%s'." %
            arg)
    if (n_files > 2):
      raise Sorry('Only 2 files are needed, a structure and the data')
    working_phil, unused = master_params().fetch(sources=phil_objects,
      track_unused_definitions=True)
    if(len(unused)>0):
      for u in unused:
        print str(u)
      raise Sorry("Unused parameters: see above.")
    params = working_phil.extract()

    # PDB file
    extract_input_pdb(pdb_file=pdb_file, params=params)
    broadcast(m="Input PDB file name: %s"%params.pdb_file_name, log=log)
    pdbo = pdb_to_xrs(pdb_file_name=params.pdb_file_name,
      scattering_table=params.scattering_table)
    pdbo.xray_structure.show_summary(f=log, prefix="  ")

    # data file
    # set params.reflection_file_name and params.map_coefficients_file_name
    extract_input_data(hkl_file=reflection_file, params=params)
    data_and_flags = None
    if (params.reflection_file_name is not None):
      broadcast(
        m="Input reflection file name: %s"%params.reflection_file_name, log=log)
      data_and_flags = extract_data_and_flags(params = params)
      data_and_flags.f_obs.show_comprehensive_summary(f=log, prefix="  ")

    # map file (if available)
    # set params.map_file_name
    check_map_file(map_file, params)
    map_name = ( (params.map_coefficients_file_name) or
                 (params.map_file_name) )
    if (map_name is not None):
      map_handle = any_file(map_name)
      broadcast(m='Input map file name: %s' % map_name, log=log)
      print >> log, '  Map type: ',
      if (map_handle.file_type == 'hkl'):
        print >> log, 'map coefficients'
        print >> log, '  Map labels:', params.map_coefficients_label
      else:
        print >> log, 'CCP4-format'

      # check crystal symmetry
      cs1 = pdbo.xray_structure.crystal_symmetry()
      cs2 = get_crystal_symmetry(map_handle)
      if (cs1.is_similar_symmetry(cs2) is False):
        raise Sorry('The symmetry of the two files, %s and %s, is not similar' %
                    (fobs_handle.file_name, map_handle.file_name))

    # check that only one data file is defined
    if ( (map_name is not None) and
         (params.reflection_file_name is not None) ):
      raise Sorry('Please use F_obs or a map, not both.')
    if ( (params.reflection_file_name is None) and
         (map_name is None) ):
      raise Sorry('A data file is required.')

    # create fmodel with f_obs (if available)
    fmodel = None
    if (params.reflection_file_name is not None):
      r_free_flags = data_and_flags.f_obs.array(
        data = flex.bool(data_and_flags.f_obs.size(), False))
      fmodel = mmtbx.utils.fmodel_simple(
        xray_structures     = [pdbo.xray_structure],
        scattering_table    = params.scattering_table,
        f_obs               = data_and_flags.f_obs,
        r_free_flags        = r_free_flags)
      broadcast(m="R-factors, reflection counts and scales", log=log)
      fmodel.show(log=log, show_header=False)

    # compute cc
    results = simple(
      fmodel        = fmodel,
      pdb_hierarchy = pdbo.pdb_hierarchy,
      params        = params,
      show_results  = True,
      log           = log)