#!/usr/bin/python
import os,sys
from program import program
import common

class gcx(program):
  name="GCX"
  binary="gcx"
  ccp4_parsing=True
  stat={}
  stat['solvent_content'] = common.stats(name='solvent content', xpath="parameters/solvent_content")
  stat['monomers_asym'] = common.stats(name='number of monomers in asymetric unit', xpath="parameters/nmonomers")
  stat['wilson_B'] = common.stats(name='Wilson\'s overall B factor', xpath="parameters/bfactor")
  stat['residues_mon'] = common.stats(name='number of residues in a monomer', xpath="parameters/residues")


  def TreatInput(self):
    # input sequence
    seq=self.inp.Get('sequence')
    if seq:
      if seq.GetFileName():
        # setting an absolute path here for backwards compatibility - there used to be a bug in gcx
        self.SetArg('seqin',seq.GetFileName(),relpath=False)
      elif seq.residues_mon:
        self.SetKey('NRES',seq.residues_mon)
      else:
        common.Error('No sequence information inputted for {0}'.format(self.name))
    else:
      common.Error('No sequence inputted for {0}'.format(self.name))
    # data
    f=self.inp.Get('fsigf',filetype='mtz',col='sigf',typ='average')
    if not f:
      common.Error('No X-ray data inputted for {0}'.format(self.name))
    self.model=self.inp.Get('model')
    if self.model: 
      if self.model.xname!=self.model.default_unknown:
        self.SetKey('XTAL', self.model.xname)
      if self.model.dname!=self.model.default_unknown:
        self.SetKey('DNAME', self.model.dname)
    if not self.IsKey('XTAL'):
      self.SetKey('XTAL', 'dummy')
    if not self.IsKey('DNAME'):
      self.SetKey('DNAME', 'dummy')
    self.SetKey('MTZIn',f.GetFileName('mtz'))
    self.SetKey('COLU', ('F='+f.GetLabel('f'),'SF='+f.GetLabel('sigf')) )
    # number of monomers
    if self.inp.Get(has_monomers_asym=True) and not self.GetKey('NMON'):
      self.SetKey('NMON', self.inp.Get(has_monomers_asym=True).monomers_asym)

  def DefineOutput(self):
    self.outputbase='gcx'
    self.out.AddNew('datafile',typ='xml',filename=self.outputbase+'.xml',filetype='xml')

  def TreatOutput(self):
    self.SetKey('outp {0}'.format(self.outputbase))
