Exemplo n.º 1
0
 def wrapModelToNative(self,
                       mrPdb,
                       nativePdb,
                       origin=[0.0,0.0,0.0],
                       csymmatchPdb=None,
                       workdir=None,
                       cleanup=True):
     """Take a pdb and wrap it onto the nativePdb using csymmatch.
     If origin is not [0.0,0.0,0.0] we also move the structure onto the new origin before wrapping"""
     
     if workdir is None: 
         workdir = os.getcwd()
     
     assert os.path.isfile(mrPdb) and os.path.isfile(nativePdb),"Cannot find: {0} or {1}".format(mrPdb,nativePdb)
     
     originMrPdb = None
     if origin != [ 0.0, 0.0, 0.0 ]:
         ostr="o{}_{}".format(origin, str(uuid.uuid1())).replace(" ","" )
         originMrPdb = ample_util.filename_append(filename=mrPdb, astr=ostr, directory=workdir)
         pdb_edit.translate(inpdb=mrPdb, outpdb=originMrPdb, ftranslate=origin)
         mrPdb = originMrPdb
     
     if csymmatchPdb is None:
         csymmatchPdb = ample_util.filename_append(filename=mrPdb, astr="csymmatch_{}".format(str(uuid.uuid1())), 
                                                   directory=workdir)
     
     self.run(refPdb=nativePdb, inPdb=mrPdb, outPdb=csymmatchPdb, originHand=False, cleanup=cleanup)
     
     if not os.path.isfile( csymmatchPdb ): 
         raise RuntimeError("Error generating csymmatchPdb")
     
     if cleanup and originMrPdb: 
         os.unlink(originMrPdb)
            
     return csymmatchPdb
Exemplo n.º 2
0
def run(nativePdb, nativeMtz=None, nativeMap=None, mrPdbs=None, outDir=None):

    logging.info("Using native PDB file: %s", os.path.abspath(nativePdb))
    logging.info("Using native MTZ file: %s", os.path.abspath(nativeMtz))
    logging.info("Wrapping the following MTZ files to the native: %s",
                 " ".join(mrPdbs))

    phenix = False

    if outDir is not None:
        if not os.path.isdir(outDir):
            msg = "Cannot find output directory: {}".format(outDir)
            raise RuntimeError(msg)
        outDir = os.path.abspath(outDir)
    else:
        outDir = os.getcwd()

    if phenix:
        if nativeMap is None:
            nativeMap = generateMap(nativePdb, nativeMtz)
        if not os.path.isfile(nativeMap):
            msg = "Cannot find nativeMap: {}".format(nativeMap)
            raise RuntimeError(msg)
    else:
        shelxeExe = ample_util.find_exe('shelxe')

    removables = []
    for mrPdb in mrPdbs:
        if phenix:
            logging.debug("Searching for origin shift using: %s %s", nativeMap,
                          mrPdb)
            origin = phenixer.ccmtzOrigin(nativeMap, mrPdb)
            # offset.pdb is the mrPdb moved onto the new origin
            offsetPdb = "offset.pdb"
            logging.debug("Found origin: %s\nOffset pdb is: %s", origin,
                          offsetPdb)
        else:

            mrinfo = shelxe.MRinfo(shelxeExe, nativePdb, nativeMtz)
            mrinfo.analyse(mrPdb)
            originShift = mrinfo.originShift
            logging.debug("Found origin: {0}".format(originShift))
            offsetPdb = ample_util.filename_append(mrPdb,
                                                   astr='offset',
                                                   directory=os.getcwd())
            pdb_edit.translate(mrPdb, offsetPdb, originShift)

        csymmPdb = ample_util.filename_append(filename=mrPdb,
                                              astr="csymmatch",
                                              directory=outDir)
        logging.debug("Running csymmatch to wrap %s onto native %s", offsetPdb,
                      nativePdb)
        csymmatch.Csymmatch().run(refPdb=nativePdb,
                                  inPdb=offsetPdb,
                                  outPdb=csymmPdb,
                                  originHand=False)
        removables += [offsetPdb]
        logging.info("Matched PDB is: %s", csymmPdb)

    map(os.remove, removables + ["shelxe-input.hkl", "shelxe-input.ent"])
Exemplo n.º 3
0
    def scoreOrigin(self,
                    origin=None,
                    mrPdbInfo=None,
                    nativePdbInfo=None,
                    resSeqMap=None,
                    workdir=os.getcwd()
                     ):
        
        self.workdir = workdir
        if not resSeqMap.resSeqMatch():
            # We need to create a copy of the placed pdb with numbering matching the native
            mrPdbRes = ample_util.filename_append( filename=mrPdbInfo.pdb, astr="reseq", directory=self.workdir )
            pdb_edit.match_resseq( targetPdb=mrPdbInfo.pdb, sourcePdb=None, outPdb=mrPdbRes, resMap=resSeqMap )
            mrPdb = mrPdbRes
        else:
            mrPdb = mrPdbInfo.pdb
 
        # Make a copy of mrPdb with chains renamed to lower case
        ucChains = mrPdbInfo.models[0].chains
        toChains = [ c.lower() for c in ucChains ]
        mrAaPdb = ample_util.filename_append( filename=mrPdb, astr="ren", directory=self.workdir )
        pdb_edit.rename_chains( inpdb=mrPdb, outpdb=mrAaPdb, fromChain=ucChains, toChain=toChains )

        # The list of chains in the native that we will be checking contacts from
        fromChains = nativePdbInfo.models[0].chains
        
        mrOriginPdb =  mrAaPdb
        if origin != [ 0.0, 0.0, 0.0 ]:
            # Move pdb to new origin
            #ostr="origin{0}".format(i)
            ostr="o{0}".format( origin ).replace(" ","" )
            mrOriginPdb = ample_util.filename_append( filename=mrAaPdb, astr=ostr, directory=self.workdir )
            pdb_edit.translate( inpdb=mrAaPdb, outpdb=mrOriginPdb, ftranslate=origin )
        
        # Concatenate into one file
        joinedPdb = ample_util.filename_append( filename=mrOriginPdb, astr="joined", directory=self.workdir )
        pdb_edit.merge( pdb1=nativePdbInfo.pdb, pdb2=mrOriginPdb, pdbout=joinedPdb )
            
        # Run ncont
        data = RioData()
        data.origin = origin
        data.originPdb = mrOriginPdb
        data.joinedPdb = joinedPdb
        data.fromChains = fromChains
        data.toChains = toChains

        # First get AllAtom score        
        self.calcAllAtom( data )
        
        # Then score RIO
        self.calcRio( data )
        #data.numGood = data.inregister + data.ooregister
        
        # clean up
        os.unlink(mrOriginPdb)
        os.unlink(joinedPdb)
        if os.path.isfile(mrAaPdb): os.unlink(mrAaPdb)
        
        return data
Exemplo n.º 4
0
def analyseSolution(amoptd, d, mrinfo):

    logger.info("Benchmark: analysing result: {0}".format(d['ensemble_name']))

    mrPdb = None
    if d['MR_program'] == "PHASER":
        mrPdb = d['PHASER_pdbout']
        mrMTZ = d['PHASER_mtzout']
    elif d['MR_program'] == "MOLREP":
        mrPdb = d['MOLREP_pdbout']
    elif d['MR_program'] == "unknown":
        return

    if mrPdb is None or not os.path.isfile(mrPdb):
        #logger.critical("Cannot find mrPdb {0} for solution {1}".format(mrPdb,d))
        return

    # debug - copy into work directory as reforigin struggles with long pathnames
    shutil.copy(
        mrPdb,
        os.path.join(fixpath(amoptd['benchmark_dir']),
                     os.path.basename(mrPdb)))

    mrPdbInfo = pdb_edit.get_info(mrPdb)

    d['num_placed_chains'] = mrPdbInfo.numChains()
    d['num_placed_atoms'] = mrPdbInfo.numAtoms()
    d['num_placed_CA'] = mrPdbInfo.numCalpha()

    if amoptd['native_pdb']:
        if not d['SHELXE_os']:
            logger.critical(
                "mrPdb {0} has no SHELXE_os origin shift. Calculating...".
                format(mrPdb))
            mrinfo.analyse(mrPdb)
            mrOrigin = mrinfo.originShift
            d['SHELXE_MPE'] = mrinfo.MPE
            d['SHELXE_wMPE'] = mrinfo.wMPE
        else:
            mrOrigin = [c * -1 for c in d['SHELXE_os']]

        # Move pdb onto new origin
        originPdb = ample_util.filename_append(mrPdb,
                                               astr='offset',
                                               directory=fixpath(
                                                   amoptd['benchmark_dir']))
        #print(mrPdb, originPdb, mrOrigin)
        pdb_edit.translate(mrPdb, originPdb, mrOrigin)

        # offset.pdb is the mrModel shifted onto the new origin use csymmatch to wrap onto native
        csymmatch.Csymmatch().wrapModelToNative(
            originPdb,
            amoptd['native_pdb'],
            csymmatchPdb=os.path.join(
                fixpath(amoptd['benchmark_dir']),
                "phaser_{0}_csymmatch.pdb".format(d['ensemble_name'])))
        # can now delete origin pdb
        os.unlink(originPdb)

        # Calculate phase error for the MR PDB
        try:
            mrinfo.analyse(mrPdb)
            d['MR_MPE'] = mrinfo.MPE
            d['MR_wMPE'] = mrinfo.wMPE
        except Exception as e:
            logger.critical("Error analysing mrPdb: {0}\n{1}".format(mrPdb, e))

        # We cannot calculate the Reforigin RMSDs or RIO scores for runs where we don't have a full initial model
        # to compare to the native to allow us to determine which parts of the ensemble correspond to which parts of
        # the native structure.
        if not (amoptd['homologs'] or \
                amoptd['ideal_helices'] or \
                amoptd['import_ensembles'] or \
                amoptd['single_model_mode']):

            # Get reforigin info
            rmsder = reforigin.ReforiginRmsd()
            try:
                rmsder.getRmsd(nativePdbInfo=amoptd['native_pdb_info'],
                               placedPdbInfo=mrPdbInfo,
                               refModelPdbInfo=amoptd['ref_model_pdb_info'],
                               cAlphaOnly=True,
                               workdir=fixpath(amoptd['benchmark_dir']))
                d['reforigin_RMSD'] = rmsder.rmsd
            except Exception as e:
                logger.critical("Error calculating RMSD: {0}".format(e))
                d['reforigin_RMSD'] = 999

            # Score the origin with all-atom and rio
            rioData = rio.Rio().scoreOrigin(
                mrOrigin,
                mrPdbInfo=mrPdbInfo,
                nativePdbInfo=amoptd['native_pdb_info'],
                resSeqMap=amoptd['res_seq_map'],
                workdir=fixpath(amoptd['benchmark_dir']))

            # Set attributes
            d['AA_num_contacts'] = rioData.aaNumContacts
            d['RIO_num_contacts'] = rioData.rioNumContacts
            d['RIO_in_register'] = rioData.rioInRegister
            d['RIO_oo_register'] = rioData.rioOoRegister
            d['RIO_backwards'] = rioData.rioBackwards
            d['RIO'] = rioData.rioInRegister + rioData.rioOoRegister
            d['RIO_no_cat'] = rioData.rioNumContacts - (rioData.rioInRegister +
                                                        rioData.rioOoRegister)
            d['RIO_norm'] = float(d['RIO']) / float(
                d['native_pdb_num_residues'])
        else:
            d['AA_num_contacts'] = None
            d['RIO_num_contacts'] = None
            d['RIO_in_register'] = None
            d['RIO_oo_register'] = None
            d['RIO_backwards'] = None
            d['RIO'] = None
            d['RIO_no_cat'] = None
            d['RIO_norm'] = None

    #     # Now get the helix
    #     helixSequence = contacts.Rio().helixFromContacts( contacts=rioData.contacts,
    #                                                            dsspLog=dsspLog )
    #     if helixSequence is not None:
    #         ampleResult.rioHelixSequence = helixSequence
    #         ampleResult.rioLenHelix      = len( helixSequence )
    #         hfile = os.path.join( workdir, "{0}.helix".format( ampleResult.ensembleName ) )
    #         with open( hfile, 'w' ) as f:
    #             f.write( helixSequence+"\n" )

    #
    # This purely for checking and so we have pdbs to view
    #
    # Wrap shelxe trace onto native using Csymmatch
        if not d['SHELXE_pdbout'] is None and os.path.isfile(
                fixpath(d['SHELXE_pdbout'])):
            csymmatch.Csymmatch().wrapModelToNative(
                fixpath(d['SHELXE_pdbout']),
                amoptd['native_pdb'],
                origin=mrOrigin,
                workdir=fixpath(amoptd['benchmark_dir']))

        if not ('SHELXE_wMPE' in d and d['SHELXE_wMPE']):
            try:
                mrinfo.analyse(d['SHELXE_pdbout'])
                d['SHELXE_MPE'] = mrinfo.MPE
                d['SHELXE_wMPE'] = mrinfo.wMPE
            except Exception as e:
                logger.critical(
                    "Error analysing SHELXE_pdbout: {0}\n{1}".format(
                        d['SHELXE_pdbout'], e))

        # Wrap parse_buccaneer model onto native
        if d['SXRBUCC_pdbout'] and os.path.isfile(fixpath(
                d['SXRBUCC_pdbout'])):
            # Need to rename Pdb as is just called buccSX_output.pdb
            csymmatchPdb = os.path.join(
                fixpath(amoptd['benchmark_dir']),
                "buccaneer_{0}_csymmatch.pdb".format(d['ensemble_name']))

            csymmatch.Csymmatch().wrapModelToNative(
                fixpath(d['SXRBUCC_pdbout']),
                amoptd['native_pdb'],
                origin=mrOrigin,
                csymmatchPdb=csymmatchPdb,
                workdir=fixpath(amoptd['benchmark_dir']))
            # Calculate phase error
            try:
                mrinfo.analyse(d['SXRBUCC_pdbout'])
                d['SXRBUCC_MPE'] = mrinfo.MPE
                d['SXRBUCC_wMPE'] = mrinfo.wMPE
            except Exception as e:
                logger.critical(
                    "Error analysing SXRBUCC_pdbout: {0}\n{1}".format(
                        d['SXRBUCC_pdbout'], e))

        # Wrap parse_buccaneer model onto native
        if d['SXRARP_pdbout'] and os.path.isfile(fixpath(d['SXRARP_pdbout'])):
            # Need to rename Pdb as is just called buccSX_output.pdb
            csymmatchPdb = os.path.join(
                fixpath(amoptd['benchmark_dir']),
                "arpwarp_{0}_csymmatch.pdb".format(d['ensemble_name']))

            csymmatch.Csymmatch().wrapModelToNative(
                fixpath(d['SXRARP_pdbout']),
                amoptd['native_pdb'],
                origin=mrOrigin,
                csymmatchPdb=csymmatchPdb,
                workdir=fixpath(amoptd['benchmark_dir']))
            # Calculate phase error
            try:
                mrinfo.analyse(d['SXRARP_pdbout'])
                d['SXRARP_MPE'] = mrinfo.MPE
                d['SXRARP_wMPE'] = mrinfo.wMPE
            except Exception as e:
                logger.critical(
                    "Error analysing SXRARP_pdbout: {0}\n{1}".format(
                        d['SXRARP_pdbout'], e))
    return
Exemplo n.º 5
0
    def scoreOrigin(self,
                    origin=None,
                    mrPdbInfo=None,
                    nativePdbInfo=None,
                    resSeqMap=None,
                    workdir=os.getcwd()):

        self.workdir = workdir
        if not resSeqMap.resSeqMatch():
            # We need to create a copy of the placed pdb with numbering matching the native
            mrPdbRes = ample_util.filename_append(filename=mrPdbInfo.pdb,
                                                  astr="reseq",
                                                  directory=self.workdir)
            pdb_edit.match_resseq(targetPdb=mrPdbInfo.pdb,
                                  sourcePdb=None,
                                  outPdb=mrPdbRes,
                                  resMap=resSeqMap)
            mrPdb = mrPdbRes
        else:
            mrPdb = mrPdbInfo.pdb

        # Make a copy of mrPdb with chains renamed to lower case
        ucChains = mrPdbInfo.models[0].chains
        toChains = [c.lower() for c in ucChains]
        mrAaPdb = ample_util.filename_append(filename=mrPdb,
                                             astr="ren",
                                             directory=self.workdir)
        pdb_edit.rename_chains(inpdb=mrPdb,
                               outpdb=mrAaPdb,
                               fromChain=ucChains,
                               toChain=toChains)

        # The list of chains in the native that we will be checking contacts from
        fromChains = nativePdbInfo.models[0].chains

        mrOriginPdb = mrAaPdb
        if origin != [0.0, 0.0, 0.0]:
            # Move pdb to new origin
            #ostr="origin{0}".format(i)
            ostr = "o{0}".format(origin).replace(" ", "")
            mrOriginPdb = ample_util.filename_append(filename=mrAaPdb,
                                                     astr=ostr,
                                                     directory=self.workdir)
            pdb_edit.translate(inpdb=mrAaPdb,
                               outpdb=mrOriginPdb,
                               ftranslate=origin)

        # Concatenate into one file
        joinedPdb = ample_util.filename_append(filename=mrOriginPdb,
                                               astr="joined",
                                               directory=self.workdir)
        pdb_edit.merge(pdb1=nativePdbInfo.pdb,
                       pdb2=mrOriginPdb,
                       pdbout=joinedPdb)

        # Run ncont
        data = RioData()
        data.origin = origin
        data.originPdb = mrOriginPdb
        data.joinedPdb = joinedPdb
        data.fromChains = fromChains
        data.toChains = toChains

        # First get AllAtom score
        self.calcAllAtom(data)

        # Then score RIO
        self.calcRio(data)
        #data.numGood = data.inregister + data.ooregister

        # clean up
        os.unlink(mrOriginPdb)
        os.unlink(joinedPdb)
        if os.path.isfile(mrAaPdb): os.unlink(mrAaPdb)

        return data
Exemplo n.º 6
0
    def findOrigin(self,
                   nativePdbInfo=None,
                   mrPdbInfo=None,
                   resSeqMap=None,
                   origins=None,
                   allAtom=False,
                   workdir=os.getcwd()):
        """Find the origin using the maximum number of contacts as metric"""

        self.workdir = workdir
        if not resSeqMap.resSeqMatch():
            # We need to create a copy of the placed pdb with numbering matching the native
            mrPdbRes = ample_util.filename_append(filename=mrPdbInfo.pdb,
                                                  astr="reseq",
                                                  directory=self.workdir)
            pdb_edit.match_resseq(targetPdb=mrPdbInfo.pdb,
                                  sourcePdb=None,
                                  outPdb=mrPdbRes,
                                  resMap=resSeqMap)
            mrPdb = mrPdbRes
        else:
            mrPdb = mrPdbInfo.pdb

        # Make a copy of mrPdb with chains renamed to lower case
        ucChains = mrPdbInfo.models[0].chains
        toChains = [c.lower() for c in ucChains]
        placedAaPdb = ample_util.filename_append(filename=mrPdb,
                                                 astr="ren",
                                                 directory=self.workdir)
        pdb_edit.rename_chains(inpdb=mrPdb,
                               outpdb=placedAaPdb,
                               fromChain=ucChains,
                               toChain=toChains)

        # The list of chains in the native that we will be checking contacts from
        fromChains = nativePdbInfo.models[0].chains

        # Loop over origins, move the placed pdb to the new origin and then run ncont
        # Object to hold data on best origin
        self.data = None
        for origin in origins:
            placedOriginPdb = placedAaPdb
            if origin != [0.0, 0.0, 0.0]:
                # Move pdb to new origin
                #ostr="origin{0}".format(i)
                ostr = "o{0}".format(origin).replace(" ", "")
                placedOriginPdb = ample_util.filename_append(
                    filename=placedAaPdb, astr=ostr, directory=self.workdir)
                pdb_edit.translate(inpdb=placedAaPdb,
                                   outpdb=placedOriginPdb,
                                   ftranslate=origin)

            # Concatenate into one file
            joinedPdb = ample_util.filename_append(filename=placedOriginPdb,
                                                   astr="joined",
                                                   directory=self.workdir)
            pdb_edit.merge(pdb1=nativePdbInfo.pdb,
                           pdb2=placedOriginPdb,
                           pdbout=joinedPdb)

            # Set up object to hold data
            data = RioData()
            data.origin = origin
            data.originPdb = placedOriginPdb
            data.joinedPdb = joinedPdb
            data.fromChains = fromChains
            data.toChains = toChains
            data.numGood = 0  # For holding the metric

            # Run ncont
            if allAtom:
                self.calcAllAtom(data)
                data.numGood = data.aaNumContacts
            else:
                self.calcRio(data)
                data.numGood = data.rioInRegister + data.rioOoRegister

            # Save the first origin and only update if we get a better score
            if not self.data or data.numGood > self.data.numGood:
                self.data = data

        # End loop over origins

        # Now need to calculate data for whichever one we didn't calculate
        if allAtom:
            self.calcRio(self.data)
        else:
            self.calcAllAtom(self.data)

        if self.data.numGood > 0:

            # If we got a match run csymmatch so we can see the result
            csym = csymmatch.Csymmatch()
            csymmatchPdb = ample_util.filename_append(
                filename=self.data.originPdb,
                astr="csymmatch_best",
                directory=self.workdir)
            csym.run(refPdb=nativePdbInfo.pdb,
                     inPdb=self.data.originPdb,
                     outPdb=csymmatchPdb,
                     originHand=False)

        return self.data
Exemplo n.º 7
0
def analyseSolution(amoptd, d, mrinfo):

    logger.info("Benchmark: analysing result: {0}".format(d['ensemble_name']))

    mrPdb=None
    if d['MR_program']=="PHASER":
        mrPdb = d['PHASER_pdbout']
        mrMTZ = d['PHASER_mtzout']
    elif d['MR_program']=="MOLREP":
        mrPdb = d['MOLREP_pdbout']
    elif d['MR_program']=="unknown":
        return

    if mrPdb is None or not os.path.isfile(mrPdb):
        #logger.critical("Cannot find mrPdb {0} for solution {1}".format(mrPdb,d))
        return

    # debug - copy into work directory as reforigin struggles with long pathnames
    shutil.copy(mrPdb, os.path.join(fixpath(amoptd['benchmark_dir']), os.path.basename(mrPdb)))
    
    mrPdbInfo = pdb_edit.get_info( mrPdb )
    
    d['num_placed_chains'] = mrPdbInfo.numChains()
    d['num_placed_atoms'] = mrPdbInfo.numAtoms()
    d['num_placed_CA'] = mrPdbInfo.numCalpha()
    
    if amoptd['native_pdb']:
        if not d['SHELXE_os']:
            logger.critical("mrPdb {0} has no SHELXE_os origin shift. Calculating...".format(mrPdb))
            mrinfo.analyse(mrPdb)
            mrOrigin = mrinfo.originShift
            d['SHELXE_MPE'] = mrinfo.MPE
            d['SHELXE_wMPE'] = mrinfo.wMPE
        else:
            mrOrigin=[c*-1 for c in d['SHELXE_os']]
        
        # Move pdb onto new origin
        originPdb = ample_util.filename_append(mrPdb, astr='offset',directory=fixpath(amoptd['benchmark_dir']))
        #print(mrPdb, originPdb, mrOrigin)
        pdb_edit.translate(mrPdb, originPdb, mrOrigin)
        
        # offset.pdb is the mrModel shifted onto the new origin use csymmatch to wrap onto native
        csymmatch.Csymmatch().wrapModelToNative(originPdb,
                                                amoptd['native_pdb'],
                                                csymmatchPdb=os.path.join(fixpath(amoptd['benchmark_dir']),
                                                "phaser_{0}_csymmatch.pdb".format(d['ensemble_name'])))
        # can now delete origin pdb
        os.unlink(originPdb)
        
        # Calculate phase error for the MR PDB
        try:
            mrinfo.analyse(mrPdb)
            d['MR_MPE'] = mrinfo.MPE
            d['MR_wMPE'] = mrinfo.wMPE
        except Exception as e:
            logger.critical("Error analysing mrPdb: {0}\n{1}".format(mrPdb,e))         
    
        # We cannot calculate the Reforigin RMSDs or RIO scores for runs where we don't have a full initial model
        # to compare to the native to allow us to determine which parts of the ensemble correspond to which parts of 
        # the native structure - or if we were unable to calculate a res_seq_map
        if not (amoptd['homologs'] or \
                amoptd['ideal_helices'] or \
                amoptd['import_ensembles'] or \
                amoptd['single_model_mode'] or \
                amoptd['res_seq_map']):
    
            # Get reforigin info
            rmsder = reforigin.ReforiginRmsd()
            try:
                rmsder.getRmsd(nativePdbInfo=amoptd['native_pdb_info'],
                               placedPdbInfo=mrPdbInfo,
                               refModelPdbInfo=amoptd['ref_model_pdb_info'],
                               cAlphaOnly=True,
                               workdir=fixpath(amoptd['benchmark_dir']))
                d['reforigin_RMSD'] = rmsder.rmsd
            except Exception as e:
                logger.critical("Error calculating RMSD: {0}".format(e))
                d['reforigin_RMSD'] = 999
    
    
            # Score the origin with all-atom and rio
            rioData = rio.Rio().scoreOrigin(mrOrigin,
                                          mrPdbInfo=mrPdbInfo,
                                          nativePdbInfo=amoptd['native_pdb_info'],
                                          resSeqMap=amoptd['res_seq_map'],
                                          workdir=fixpath(amoptd['benchmark_dir'])
                                          )
        
            # Set attributes
            d['AA_num_contacts']  = rioData.aaNumContacts
            d['RIO_num_contacts'] = rioData.rioNumContacts
            d['RIO_in_register']  = rioData.rioInRegister
            d['RIO_oo_register']  = rioData.rioOoRegister
            d['RIO_backwards']    = rioData.rioBackwards
            d['RIO']              = rioData.rioInRegister + rioData.rioOoRegister
            d['RIO_no_cat']       = rioData.rioNumContacts - ( rioData.rioInRegister + rioData.rioOoRegister )
            d['RIO_norm']         = float(d['RIO']) / float(d['native_pdb_num_residues'])
        else:
            d['AA_num_contacts']  = None
            d['RIO_num_contacts'] = None
            d['RIO_in_register']  = None
            d['RIO_oo_register']  = None
            d['RIO_backwards']    = None
            d['RIO']              = None
            d['RIO_no_cat']       = None
            d['RIO_norm']         = None
    
    #     # Now get the helix
    #     helixSequence = contacts.Rio().helixFromContacts( contacts=rioData.contacts,
    #                                                            dsspLog=dsspLog )
    #     if helixSequence is not None:
    #         ampleResult.rioHelixSequence = helixSequence
    #         ampleResult.rioLenHelix      = len( helixSequence )
    #         hfile = os.path.join( workdir, "{0}.helix".format( ampleResult.ensembleName ) )
    #         with open( hfile, 'w' ) as f:
    #             f.write( helixSequence+"\n" )
    
        #
        # This purely for checking and so we have pdbs to view
        # 
        # Wrap shelxe trace onto native using Csymmatch
        if not d['SHELXE_pdbout'] is None and os.path.isfile(fixpath(d['SHELXE_pdbout'])):
            csymmatch.Csymmatch().wrapModelToNative( fixpath(d['SHELXE_pdbout']),
                                                     amoptd['native_pdb'],
                                                     origin=mrOrigin,
                                                     workdir=fixpath(amoptd['benchmark_dir']))

        if not('SHELXE_wMPE' in d and d['SHELXE_wMPE']):
            try:
                mrinfo.analyse(d['SHELXE_pdbout'])
                d['SHELXE_MPE'] = mrinfo.MPE
                d['SHELXE_wMPE'] = mrinfo.wMPE
            except Exception as e:
                logger.critical("Error analysing SHELXE_pdbout: {0}\n{1}".format(d['SHELXE_pdbout'],e))    
                
        # Wrap parse_buccaneer model onto native
        if d['SXRBUCC_pdbout'] and os.path.isfile(fixpath(d['SXRBUCC_pdbout'])):
            # Need to rename Pdb as is just called buccSX_output.pdb
            csymmatchPdb = os.path.join(fixpath(amoptd['benchmark_dir']), "buccaneer_{0}_csymmatch.pdb".format(d['ensemble_name']))
    
            csymmatch.Csymmatch().wrapModelToNative( fixpath(d['SXRBUCC_pdbout']),
                                                     amoptd['native_pdb'],
                                                     origin=mrOrigin,
                                                     csymmatchPdb=csymmatchPdb,
                                                     workdir=fixpath(amoptd['benchmark_dir']))
            # Calculate phase error
            try:
                mrinfo.analyse(d['SXRBUCC_pdbout'])
                d['SXRBUCC_MPE'] = mrinfo.MPE
                d['SXRBUCC_wMPE'] = mrinfo.wMPE
            except Exception as e:
                logger.critical("Error analysing SXRBUCC_pdbout: {0}\n{1}".format(d['SXRBUCC_pdbout'],e))
                            
        # Wrap parse_buccaneer model onto native
        if d['SXRARP_pdbout'] and os.path.isfile(fixpath(d['SXRARP_pdbout'])):
            # Need to rename Pdb as is just called buccSX_output.pdb
            csymmatchPdb = os.path.join(fixpath(amoptd['benchmark_dir']), "arpwarp_{0}_csymmatch.pdb".format(d['ensemble_name']))
    
            csymmatch.Csymmatch().wrapModelToNative( fixpath(d['SXRARP_pdbout']),
                                                     amoptd['native_pdb'],
                                                     origin=mrOrigin,
                                                     csymmatchPdb=csymmatchPdb,
                                                     workdir=fixpath(amoptd['benchmark_dir']))
            # Calculate phase error
            try:
                mrinfo.analyse(d['SXRARP_pdbout'])
                d['SXRARP_MPE'] = mrinfo.MPE
                d['SXRARP_wMPE'] = mrinfo.wMPE
            except Exception as e:
                logger.critical("Error analysing SXRARP_pdbout: {0}\n{1}".format(d['SXRARP_pdbout'],e))
    return
Exemplo n.º 8
0
    def findOrigin(self,
                   nativePdbInfo=None,
                   mrPdbInfo=None,
                   resSeqMap=None,
                   origins=None,
                   allAtom=False,
                   workdir=os.getcwd() ):
        """Find the origin using the maximum number of contacts as metric"""
        
        self.workdir = workdir
        if not resSeqMap.resSeqMatch():
            # We need to create a copy of the placed pdb with numbering matching the native
            mrPdbRes = ample_util.filename_append( filename=mrPdbInfo.pdb, astr="reseq", directory=self.workdir )
            pdb_edit.match_resseq( targetPdb=mrPdbInfo.pdb, sourcePdb=None, outPdb=mrPdbRes, resMap=resSeqMap )
            mrPdb = mrPdbRes
        else:
            mrPdb = mrPdbInfo.pdb
 
        # Make a copy of mrPdb with chains renamed to lower case
        ucChains = mrPdbInfo.models[0].chains
        toChains = [ c.lower() for c in ucChains ]
        placedAaPdb = ample_util.filename_append( filename=mrPdb, astr="ren", directory=self.workdir )
        pdb_edit.rename_chains( inpdb=mrPdb, outpdb=placedAaPdb, fromChain=ucChains, toChain=toChains )

        # The list of chains in the native that we will be checking contacts from
        fromChains = nativePdbInfo.models[0].chains
        
        # Loop over origins, move the placed pdb to the new origin and then run ncont
        # Object to hold data on best origin
        self.data = None
        for origin in origins:
            placedOriginPdb =  placedAaPdb
            if origin != [ 0.0, 0.0, 0.0 ]:
                # Move pdb to new origin
                #ostr="origin{0}".format(i)
                ostr="o{0}".format( origin ).replace(" ","" )
                placedOriginPdb = ample_util.filename_append( filename=placedAaPdb, astr=ostr, directory=self.workdir )
                pdb_edit.translate( inpdb=placedAaPdb, outpdb=placedOriginPdb, ftranslate=origin )
            
            # Concatenate into one file
            joinedPdb = ample_util.filename_append( filename=placedOriginPdb, astr="joined", directory=self.workdir )
            pdb_edit.merge( pdb1=nativePdbInfo.pdb, pdb2=placedOriginPdb, pdbout=joinedPdb )
            
            # Set up object to hold data
            data            = RioData()
            data.origin     = origin
            data.originPdb  = placedOriginPdb
            data.joinedPdb  = joinedPdb
            data.fromChains = fromChains
            data.toChains   = toChains
            data.numGood    = 0 # For holding the metric
            
            # Run ncont
            if allAtom:
                self.calcAllAtom( data )
                data.numGood = data.aaNumContacts
            else:
                self.calcRio( data )
                data.numGood = data.rioInRegister + data.rioOoRegister
            
            # Save the first origin and only update if we get a better score
            if not self.data or data.numGood > self.data.numGood:
                self.data = data

        # End loop over origins
        
        # Now need to calculate data for whichever one we didn't calculate
        if allAtom:
            self.calcRio( self.data )
        else:
            self.calcAllAtom( self.data )
        
        if self.data.numGood > 0:
            
            # If we got a match run csymmatch so we can see the result
            csym = csymmatch.Csymmatch()
            csymmatchPdb = ample_util.filename_append( filename=self.data.originPdb,
                                                       astr="csymmatch_best",
                                                       directory=self.workdir )
            csym.run( refPdb=nativePdbInfo.pdb,
                      inPdb=self.data.originPdb,
                      outPdb=csymmatchPdb,
                      originHand=False )
        
        return self.data