# FindFreeFlag.py
# Maintained by G.Winter
# 11th July 2008
#
# A jiffy to try and identify the FreeR column in an MTZ file - will look for
# FreeR_flag, then *free*, will check that the column type is 'I' and so
# will be useful when an external reflection file is passed in for copying
# of the FreeR column.
#

import os
import sys
import math

if not os.path.join(os.environ['XIA2CORE_ROOT'], 'Python') in sys.path:
  sys.path.append(os.path.join(os.environ['XIA2CORE_ROOT'], 'Python'))

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

from Wrappers.CCP4.Mtzdump import Mtzdump

def FindFreeFlag(hklin):
  '''Try to find the FREE column in hklin. Raise exception if no column is
  found or if more than one candidate is found.'''

  # get the information we need here...

  mtzdump = Mtzdump()
  mtzdump.set_hklin(hklin)
  mtzdump.dump()
  columns = mtzdump.get_columns()

  ctypes = { }

  for c in columns:
    ctypes[c[0]] = c[1]

  if 'FreeR_flag' in ctypes.keys():
    if ctypes['FreeR_flag'] != 'I':
      raise RuntimeError, 'FreeR_flag column found: type not I'

    return 'FreeR_flag'

  # ok, so the usual one wasn't there, look for anything with "free"
  # in it...

  possibilities = []

  for c in ctypes.keys():
    if 'free' in c.lower():
      possibilities.append(c)

  if len(possibilities) == 0:
    raise RuntimeError, 'no candidate FreeR_flag columns found'

  if len(possibilities) == 1:
    if ctypes[possibilities[0]] != 'I':
      raise RuntimeError, 'FreeR_flag column found (%s): type not I' % \
            possibilities[0]

    return possibilities[0]

  raise RuntimeError, 'Multiple candidate FreeR_flag columns found'

if __name__ == '__main__':

  if len(sys.argv) < 2:
    raise RuntimeError, '%s hklin' % sys.argv[0]

  print FindFreeFlag(sys.argv[1])
