Manipulation of reflection data and models
xmanip can be invoked via the command line interface with instructions given in a specific definition file:
phenix.xmanip params.def
The full set of definitions can be obtained by typing:
phenix.xmanip
which results in:
xmanip {
  input {
    unit_cell = None
    space_group = None
    xray_data {
      file_name = None
      labels = None
      label_appendix = None
      name = None
      write_out = None
    }
    model {
      file_name = None
    }
  }
  parameters {
    action = reindex manipulate_pdb *manipulate_miller
    reindex {
      standard_laws = niggli *reference_setting invert user_supplied
      user_supplied_law = "h,k,l"
    }
    manipulate_miller {
      task = get_dano get_diso lsq_scale sfcalc *custom None
      output_label_root = "FMODEL"
      get_dano {
        input_data = None
      }
      get_diso {
        native = None
        derivative = None
        use_intensities = True
        use_weights = True
        scale_weight = True
      }
      lsq_scale {
        input_data_1 = None
        input_data_2 = None
        use_intensities = True
        use_weights = True
        scale_weight = True
      }
      sfcalc {
        fobs = None
        output = *2mFo-DFc mFo-DFc complex_fcalc abs_fcalc intensities
        use_bulk_and_scale = *as_estimated user_upplied
        bulk_and_scale_parameters {
          d_min = 2
          overall {
            b_cart {
              b_11 = 0
              b_22 = 0
              b_33 = 0
              b_12 = 0
              b_13 = 0
              b_23 = 0
            }
            k_overall = 0.1
          }
          solvent {
            k_sol = 0.3
            b_sol = 56
          }
        }
      }
      custom{
        code = print >> out, "hello world"
      }
    }
    manipulate_pdb{
      task = apply_operator *set_b
      apply_operator{
        operator = "x,y,z"
        invert=False
        concatenate_model=False
        chain_id_increment=1
      }
      set_b{
        b_iso = 30
      }
    }
  }
  output {
    logfile = "xmanip.log"
    hklout = "xmanip.mtz"
    xyzout = "xmanip.pdb"
  }
}
Detailed explanation of the scopes follow below.
The xmanip.input scope defines which files and which data xmanip reads in:
input {
  unit_cell = None        # unit cell. Specify when not in reflection or pdb files
  space_group = None      # space group. Specify when not in reflection or pdb files
  xray_data {
    file_name = None      # File from which data will be read
    labels = None         # Labels to read in.
    label_appendix = None # Label appendix: when writing out the new mtz file, this
                            appendix will be added to the current label.
    name = None           # A data set name. Useful for manipulation
    write_out = None      # Determines if this data set will be written to the final
                            mtz file
  }
  model {
    file_name = None      # An input pdb file
  }
}
One can define as many sub-scopes of xray_data as desired (see examples). The specific tasks of xmanip are controlled by the xmanip.parameters.action key. Possible options are:
Reindexing: reindexing of a data set (and a model) is controlled by the xmanip.parameters.reindex scope. Standard laws are available:
manipulate_pdb: A pdb file can be modified by either applying a symmetry operator to the coordinates (select the apply_operator task from the manipulate_pdb.task list. The operator needs to be specified by apply_operator.operator. Setting apply_operator.invert to true will invert the supplied operator. One can choose to put out the newly generated chain with the original chain (set concatenate_model = True). The new chain ID can be controlled with the chain_id_increment parameter. manipulate miller: Reflection data can be manipulate in various ways:
bulk solvent and scaling parameters will be either estimated from observed data if supplied, or set by the user (using keywords in the bulk_and_scale_parameters scope)
Reindexing a data set and model ::
  xmanip {
    input {
      xray_data {
        file_name = mydata.mtz
        labels = FOBS,SIGFOBS
        write_out = True
      }
      xray_data {
        file_name = mydata.mtz
        labels = R_FREE_FLAG
        write_out = True
      }
      model {
        file_name = mymodel.pdb
      }
    }
    parameters {
      action = reindex
      reindex {
        standard_laws = *niggli
        user_supplied_law = "h,k,l"
      }
    }
    output {
      logfile = "xmanip.log"
      hklout = "reindex.mtz"
      xyzout = "reindex.pdb"
    }
  }
Applying a symmetry operator to a pdb file ::
  xmanip {
    input {
      model {
        file_name = mymodel.pdb
      }
    }
    parameters {
      action = manipulate_pdb
      manipulate_pdb {
        task = apply_operator
        apply_operator{
          operator = "x+1/3,y-2/3,z+1/8"
        }
      }
    }
    output {
      logfile = "xmanip.log"
      xyzout = "shifted.pdb"
    }
  }
Printing out some useful information for an mtz file ::
  xmanip {
    input {
      xray_data {
        file_name = mydata.mtz
        labels = FOBS,SIGFOBS
        name = fobs
      }
    }
    parameters {
      action = custom
      custom{
        code = """
  print >> out, "Printing d_spacings, epsilons and intensities"
  #change amplitude to intensities
  fobs = fobs.f_as_f_sq()
  #get epsilons
  epsilons = fobs.epsilons().data().as_double()
  #get d spacings
  d_hkl = fobs.d_spacings().data()
  #print the lot to a file
  output_file = open("jiffy_result.txt", 'w')
  for ii, eps, dd in zip( fobs.data(), epsilons, d_hkl):
    print >> output_file, ii, eps, dd
  print >> out, "Done"
               """
      }
    }
  }