Mercurial > repos > guerler > springsuite
diff spring_model.py @ 17:c790d25086dc draft
"planemo upload commit b0ede77caf410ab69043d33a44e190054024d340-dirty"
author | guerler |
---|---|
date | Wed, 28 Oct 2020 05:11:56 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/spring_model.py Wed Oct 28 05:11:56 2020 +0000 @@ -0,0 +1,105 @@ +#! /usr/bin/env python3 +import argparse +import os + +from spring_package.Alignment import Alignment +from spring_package.Energy import Energy +from spring_package.Molecule import Molecule + +def buildModel(resultFile, templateFile, chainName, outputName): + template = Molecule(templateFile) + if chainName not in template.calpha: + raise Exception("Chain not found in template [%s]" % chainName) + chain = template.calpha[chainName] + alignment = Alignment(resultFile) + alignment.createModel(chain) + template.saveChain(chainName, outputName) + os.system("./build/pulchra %s" % outputName) + +def TMalign(fileA, fileB): + baseA = os.path.basename(fileA) + baseB = os.path.basename(fileB) + baseA = os.path.splitext(baseA)[0] + baseB = os.path.splitext(baseB)[0] + tmName = "temp/tmalign.%s.%s" % (baseA, baseB) + os.system("build/TMalign %s %s -m %s.mat > %s.out" % (fileA, fileB, tmName, tmName)) + rotmat = list() + with open("%s.mat" % tmName) as file: + line = next(file) + line = next(file) + for i in range(3): + line = next(file) + rotmatLine = line[1:].split() + rotmatLine = list(map(lambda x: float(x), rotmatLine)) + rotmatLine = [rotmatLine[1], rotmatLine[2], rotmatLine[3], rotmatLine[0]] + rotmat.append(rotmatLine) + with open("%s.out" % tmName) as file: + for i in range(14): + line = next(file) + try: + tmscore = float(line[9:17]) + line = next(file) + tmscore = max(tmscore, float(line[9:17])) + except: + raise Exception("TMalign::Failed to retrieve TMscore.") + molecule = Molecule(fileA) + for atom in molecule.atoms: + molecule.applyMatrix(atom, rotmat) + return tmscore, molecule + +def main(args): + os.system("mkdir -p temp") + os.system("rm -f temp/*.*") + buildModel(args.a_result, args.a_template, args.a_chain, "temp/monomerA.pdb") + buildModel(args.b_result, args.b_template, args.b_chain, "temp/monomerB.pdb") + interfaceEnergy = Energy() + templateMolecule = Molecule(args.template) + modelCount = 0 + for biomolNumber in range(len(templateMolecule.rotmat.keys())): + os.system("rm -f temp/template*.pdb") + if biomolNumber == 0: + bioMolecule = templateMolecule + else: + bioMolecule = templateMolecule.createUnit(biomolNumber) + if len(bioMolecule.calpha.keys()) > 1 and args.template_core in bioMolecule.calpha: + for chainName in bioMolecule.calpha.keys(): + bioMolecule.saveChain(chainName, "temp/template%s.pdb" % chainName) + coreTMscore, coreMolecule = TMalign("temp/monomerA.rebuilt.pdb", "temp/template%s.pdb" % args.template_core) + maxScore = -9999 + maxMolecule = None + for chainName in bioMolecule.calpha.keys(): + if chainName != args.template_core and len(bioMolecule.calpha[chainName]) > 0: + print("Evaluating chain %s..." % chainName) + try: + partnerTMscore, partnerMolecule = TMalign("temp/monomerB.rebuilt.pdb", "temp/template%s.pdb" % chainName) + except: + continue + minTM = min(coreTMscore, partnerTMscore) + print("min-TMscore: %5.5f" % minTM) + energy = interfaceEnergy.get(coreMolecule, partnerMolecule) + print("Interaction: %5.5f" % energy) + springScore = minTM * args.wtm - energy * args.wenergy + print("SpringScore: %5.5f" % springScore) + if springScore > maxScore: + maxMolecule = partnerMolecule + modelName = "temp/model%s_%s.pdb" % (modelCount, chainName) + coreMolecule.save(modelName, chainName="A") + maxMolecule.save(modelName, chainName="B", append=True) + modelCount = modelCount + 1 + +if __name__ == "__main__": + parser = argparse.ArgumentParser(description='Create a 3D model from HH-search results.') + parser.add_argument('-ar', '--a_result', help='First HHR target file result', required=True) + parser.add_argument('-ac', '--a_chain', help='First template chain name', required=True) + parser.add_argument('-at', '--a_template', help='First template PDB', required=True) + parser.add_argument('-br', '--b_result', help='Second HHR target file result', required=True) + parser.add_argument('-bc', '--b_chain', help='Second structure chain name', required=True) + parser.add_argument('-bt', '--b_template', help='Second template PDB', required=True) + parser.add_argument('-ts', '--template', help='Structure template', required=True) + parser.add_argument('-tc', '--template_core', help='Core template chain name', required=True) + parser.add_argument('-o', '--output', help='Output PDB file', required=False) + parser.add_argument('-wt', '--wtm', help='Weight TM-score', type=float, default=12.4, required=False) + parser.add_argument('-we', '--wenergy', help='Weight Energy term', type=float, default=-0.2, required=False) + args = parser.parse_args() + main(args) + \ No newline at end of file