# Mtz2Scalepack.py
# Maintained by G.Winter
# 12th February 2007
#
# A module to convert a reflection file in MTZ format into a number of
# scalepack files containing the I's - one per wavelength / dataset defined
# in the input file, with names derived in the same way as for the
# CCP4ScalerImplementation (e.g. PNAME_XNAME_scaled_DNAME.sca)
#

import os
import sys
import math

if not os.environ.has_key('XIA2_ROOT'):
  raise RuntimeError, 'XIA2_ROOT not defined'

if not os.environ['XIA2_ROOT'] in sys.path:
  sys.path.append(os.environ['XIA2_ROOT'])

from Wrappers.CCP4.Mtzdump import Mtzdump as _Mtzdump
from Wrappers.CCP4.Mtz2various import Mtz2various as _Mtz2various

class Mtz2Scalepack(object):
  '''A jiffy class to convert an MTZ file to scalepack merged format,
  for all pname, xname, dname found in the file.'''

  def __init__(self):
    self._hklin = None
    self._working_directory = os.getcwd()
    self._hklout = { }

    return

  def set_working_directory(self, working_directory):
    self._working_directory = working_directory
    return

  def get_working_directory(self):
    return self._working_directory

  def set_hklin(self, hklin):
    self._hklin = hklin
    return

  # factory methods

  def Mtzdump(self):
    m = _Mtzdump()
    m.set_working_directory(self.get_working_directory())
    return m

  def Mtz2various(self):
    m = _Mtz2various()
    m.set_working_directory(self.get_working_directory())
    return m

  def convert(self):
    if not self._hklin:
      raise RuntimeError, 'HKLIN not defined'

    # run mtzdump to get a list of the projects etc from the
    # reflection file

    m = self.Mtzdump()

    m.set_hklin(self._hklin)
    m.dump()

    datasets = m.get_datasets()

    # then for each combination run mtz2various to convert it
    # to scalepack format

    for d in datasets:
      pname, xname, dname = tuple(d.split('/'))

      # this will look for I(+) etc columns.
      # possible problem warning - what happens if
      # this is given a reflection file
      #
      # (1) without I's only F's?
      # (2) not separated anomalous pairs???

      m2 = self.Mtz2various()
      m2.set_hklin(self._hklin)
      m2.set_hklout(os.path.join(
          self._working_directory,
          '%s_%s_scaled_%s.sca' % \
          (pname, xname, dname)))
      m2.set_suffix(dname)
      m2.convert()

      # record this for external access
      self._hklout[dname] = m2.get_hklout()

    return self._hklout

if __name__ == '__main__':
  # then run a test...

  hklin = os.path.join(os.environ['X2TD_ROOT'],
                       'Test', 'UnitTest', 'Interfaces',
                       'Scaler', 'Merged', 'TS00_13185_merged_free.mtz')


  m2s = Mtz2Scalepack()
  m2s.set_hklin(hklin)
  print m2s.convert()
