
from CCP4PluginScript import CPluginScript
from CCP4Modules import PROCESSMANAGER
import CCP4ErrorHandling
import sys

class mrbump_basic(CPluginScript):

    TASKTITLE='MrBUMP Basic'
    TASKNAME = 'mrbump_basic'
    TASKMODULE= 'test'
    TASKCOMMAND = sys.executable
    TASKVERSION= 0.1
    MAINTAINER = 'ronan.keegan@stfc.ac.uk'

    def processInputFiles(self):
        import CCP4XtalData
        error = None
        self.hklin = None
        dataObjects = []
        #Append Observation with representation dependent on whether we are detwining on Is or not
        dataObjects += [['F_SIGF',CCP4XtalData.CObsDataFile.CONTENT_FLAG_FMEAN]]
        #Include FreeRflag if called for
        if self.container.inputData.FREERFLAG.isSet():
            dataObjects += ['FREERFLAG']
        self.hklin,error = self.makeHklin(dataObjects)
        if error.maxSeverity()>CCP4ErrorHandling.SEVERITY_WARNING:
            return CPluginScript.FAILED
        else:
            return CPluginScript.SUCCEEDED
    
    def makeCommandAndScript(self):

      inp = self.container.inputData
      par = self.container.controlParameters
      gui = self.container.guiParameters
      out = self.container.outputData

      import CCP4Utils
      import os

      #keyin = "JOBID test_mrbump\n" 
      #keyin += "LABIN F=F SIGF=SIGF FreeR_flag=FREER\n" 
      #keyin += "MAPROGRAM clustalw2\n" 
      #keyin += "MRPROGRAM molrep phaser\n" 
      #keyin += "DOFASTA False\n" 
      #keyin += "DOPHMMER True\n" 
      #keyin += "DOHHPRED False\n" 
      #keyin += "MDLU False\n" 
      #keyin += "MDLD False\n" 
      #keyin += "MDLC True\n" 
      #keyin += "MDLM False\n" 
      #keyin += "MDLP False\n" 
      #keyin += "MDLS True\n" 
      #keyin += "MRNUM 1\n" 
      #keyin += "NCYC 10\n" 
      #keyin += "TRYALL True\n" 
      #keyin += "UPDATE False\n" 
      #keyin += "PDBLOCAL /media/china/pdb\n" 
      #keyin += "END\n" 

      #keyin = "JOBID test_mrbump\n" 
      #keyin += "LABIN F=F SIGF=SIGF FreeR_flag=FREER\n" 
      keyin = "MAPROGRAM clustalw2\n" 
      keyin += "MRPROGRAM phaser\n" 
      keyin += "DOFASTA False\n" 
      keyin += "DOPHMMER True\n" 
      keyin += "DOHHPRED False\n" 
      keyin += "RLEVEL 70\n" 
      keyin += "PICKLE False\n" 
      keyin += "MDLU False\n" 
      keyin += "MDLD False\n" 
      keyin += "MDLC False\n" 
      keyin += "MDLM False\n" 
      keyin += "MDLP False\n" 
      keyin += "MDLS True\n" 
      keyin += "USEPQS False\n" 
      keyin += "MRNUM 5\n" 
      keyin += "NCYC 30\n" 
      keyin += "USEENSEM True\n" 
      keyin += "GESE False\n" 
      keyin += "TRYALL True\n" 
      keyin += "UPDATE False\n" 
      #keyin += "PDBLOCAL /media/china/pdb\n" 
      keyin += "END\n" 

      keyfile=os.path.join(self.getWorkDirectory(), "keywords.txt")
      kf=open(keyfile, "w")
      kf.write(keyin)
      kf.close()

      self.appendCommandLine( [ '-m', 'mrbump' ] )
      self.appendCommandLine( [ 'HKLIN', self.hklin ] )
      self.appendCommandLine( [ 'SEQIN', str( inp.SEQIN.fullPath ) ] )
      self.appendCommandLine( [ 'KEYIN', str( keyfile ) ] )
      #self.appendCommandLine( [ 'HKLOUT', str( out.HKLOUT.fullPath ) ] )
      #self.appendCommandLine( [ 'XYZOUT', str( out.XYZOUT.fullPath ) ] )

      #self.appendCommandLine(['XYZOUT',self.container.outputData.XYZOUT.fullPath])
      #self.appendCommandLine(['HKLOUT',self.container.outputData.HKLOUT.fullPath])

      self.appendCommandLine( [ 'XMLOUT', str( self.makeFileName( 'PROGRAMXML' ) ) ] )

#      self.appendCommandScript( "JOBID test_mrbump" )
#      self.appendCommandScript( "LABIN F=F SIGF=SIGF FreeR_flag=FREER" )
#      self.appendCommandScript( "MAPROGRAM clustalw2" )
#      self.appendCommandScript( "DOFASTA False" )
#      self.appendCommandScript( "DOPHMMER True" )
#      self.appendCommandScript( "DOHHPRED False" )
#      self.appendCommandScript( "MDLU False" )
#      self.appendCommandScript( "MDLD False" )
#      self.appendCommandScript( "MDLC False" )
#      self.appendCommandScript( "MDLM False" )
#      self.appendCommandScript( "MDLP False" )
#      self.appendCommandScript( "MDLS True" )
#      self.appendCommandScript( "MRNUM 1" )
#      self.appendCommandScript( "END" )
      self.appendCommandScript( "" )

      return CPluginScript.SUCCEEDED

#    """
#    def postProcess( self, processId=-1, data={} ) :
#      import os
#      out = self.container.outputData
#      xmlout = str( self.makeFileName( 'PROGRAMXML' ) )
#      self.reportStatus(0)
#    """
#

    # process one or more output files
    # also writes the XML file, previously done by postProcess()
    def processOutputFiles(self):
        import os,shutil

        xyzout = os.path.join(self.getWorkDirectory(), "mrbump_mrbump_1.pdb")
        if os.path.exists(xyzout):
            self.container.outputData.XYZOUT=xyzout
            #self.container.outputData.XYZOUT[-1].annotation = 'Positioned and refined coordinates for solution '+str(i)
            #self.container.outputData.XYZOUT[-1].subType = 1
        
        hklout = os.path.join(self.getWorkDirectory(), "mrbump_mrbump_1.mtz")
        if os.path.exists(hklout):
            self.container.outputData.HKLOUT=hklout

        import CCP4XtalData
        import CCP4File
        import os
        
        # Need to set the expected content flag  for phases data
        self.container.outputData.XYZOUT.annotation = 'Model from MrBump refinement'
        self.container.outputData.FPHIOUT.annotation = 'Weighted map from MrBump refinement'
        self.container.outputData.DIFFPHIOUT.annotation = 'Weighted difference map from MrBump refinement'
        #self.container.outputData.ABCDOUT.annotation = 'Calculated phases from refinement'
        #self.container.outputData.ABCDOUT.contentFlag = CCP4XtalData.CPhsDataFile.CONTENT_FLAG_HL
        #self.container.outputData.TLSOUT.annotation = 'TLS parameters from refinement'
        #self.container.outputData.LIBOUT.annotation = 'Generated dictionary from refinement'

        # Split out data objects that have been generated. Do this after applying the annotation, and flagging
        # above, since splitHklout needs to know the ABCDOUT contentFlag
        
        outputFiles = ['FPHIOUT','DIFFPHIOUT']
        outputColumns = ['FWT,PHWT','DELFWT,PHDELWT']
        #if self.container.controlParameters.PHOUT:
        #    outputFiles+=['ABCDOUT']
        #    outputColumns+=['HLACOMB,HLBCOMB,HLCCOMB,HLDCOMB']
        error = self.splitHklout(outputFiles,outputColumns,infile=hklout)
        if error.maxSeverity()>CCP4ErrorHandling.SEVERITY_WARNING:
            return CPluginScript.FAILED

        #for indx in range(len(self.container.outputData.MAPOUT)):
        #    self.container.outputData.MAPOUT[indx].annotation = 'Map for solution '+str(indx+1)
        #    self.container.outputData.MAPOUT[indx].subType = 1
        #    self.container.outputData.DIFMAPOUT[indx].annotation = 'Difference map for solution '+str(indx+1)
        #    self.container.outputData.DIFMAPOUT[indx].subType = 2
        #    self.container.outputData.PHASEOUT[indx].annotation = 'Phases for solution '+str(indx+1)

        return CPluginScript.SUCCEEDED

#------------------------------------------------------------------------------------
import unittest

class testmrbump_basic( unittest.TestCase ) :

#- def setUp( self ) :
#- def tearDown( self ) :
#- def test2( self ) :

   def test1( self ) :

      from CCP4Utils import getCCP4I2Dir
      import os

      xmlInput = os.path.join( getCCP4I2Dir(), 'wrappers', 'mrbump_basic', 'test_data', 'test1'+'.params.xml' )
      self.wrapper = mrbump_basic( name='job' )
      self.wrapper.container.loadDataFromXml( xmlInput )
      self.wrapper.setWaitForFinished( 1000000 )

      pid = self.wrapper.process()
      self.wrapper.setWaitForFinished( -1 )
      if len(self.wrapper.errorReport)>0:
         print self.wrapper.errorReport.report()

def TESTSUITE() :

   suite = unittest.TestLoader().loadTestsFromTestCase( testmrbump_basic )
   return suite

def testModule() :

   suite = TESTSUITE()
   unittest.TextTestRunner( verbosity=2 ).run( suite )

