Source code for rna_tools.tools.mq.RASP.RASP

#!/usr/bin/env python
# -*- coding: utf-8 -*-

"""This module contains functions for computing RASP potential
"""
import os
from shutil import copyfile
from rna_tools.tools.mq.lib.wrappers.SubprocessUtils import run_command
from rna_tools.tools.pdb_formatix.PDBFile import PDBFile#resname_check_and_3to1, set_residues_bfactor
from rna_tools.tools.mq.lib.wrappers.base_wrappers import ProgramWrapper
from rna_tools.rna_tools_config import RASP_PATH, RASP_PATH_DIR

# directory where this script is
# files for some commands are also here
DIRECTORY = os.path.dirname(__file__)


[docs] class RASP(ProgramWrapper): """ Wrapper class for running RASP automatically. """ program_name = ['rasp_fd', 'rasp_profile_fd'] executable = ['rasp_fd', 'rasp_profile_fd'] def __init__(self, job_id=None): super(RASP, self).__init__('', '', job_id=job_id, path=RASP_PATH)
[docs] def run(self, path_to_pdb, global_energy_score=True, potentials=['c3', 'bb', 'bbr', 'all'], handler=True, verbose=False): """Compute RASP potential for a single file ``rasp_fd`` generates: ``output_all.txt``:: -9869.61 66447 -0.148534 0 0 0 ``rasp_profile_fd`` generates: ``profile_all.txt``:: C 1 R -775.038 C 2 R -1164.22 U 3 R -2054.17 G 4 R -1601.13 [..] Input: * path_to_pdb = path to PDB file * potential_type = all, bbr or c3 * global_energy_score = True/False (See Output), default=True * hander = True (if you use PYRO)/FALSE otherwise Output: * the output depends on global_enery_score value T/F You might get: ``-9869.61`` ``profile [('C', 1, 'R', -775.03800000000001), ('C', 2, 'R', -1164.22) ..`` """ # step 0 if handler: copyfile(path_to_pdb, self.sandbox_dir + os.sep + 'query.pdb') else: # if Pyro needs this because it cannot access file on client # TODO: make a function decorator with this f = open(self.sandbox_dir + os.sep + 'query.pdb', 'w') f.write(path_to_pdb) f.close() old_pwd = os.getcwd() os.chdir(self.sandbox_dir) pdb_file = PDBFile(pdb_path=os.path.join(self.sandbox_dir, 'query.pdb')) pdb_file.resname_check_and_3to1() pdb_file.save(os.path.join(self.sandbox_dir, 'query.pdb')) self.pdb_fixes = pdb_file.fixes scores = [] # colect all scores! if global_energy_score: # : # this order is important, should not be changed!!! (based on this order mqaprnadb_load_from.csv reads the data for potential_type in potentials: self.log('Running "global_energy_score"') if run_command(RASP_PATH + os.sep + 'bin' + os.sep + self.executable[0], ['-e', potential_type, '-p', 'query.pdb'], env={'RASP': RASP_PATH}, stdout_file='output_' + potential_type + '.txt', verbose=verbose): print('Computing global energy failed') return -1 else: f = open('output_' + potential_type + '.txt') result = [l.split() for l in f.readlines()] scores += result[0] # ['-1.9657', '144', '-0.0136507', '0.794594', '1.10601', '-2.49573', '-2309.53', '8595', '-0.268707', '-2199.69', '18.6549', '-5.88841', '-5055.01', '19931', '-0.253625', '-4665.96', '44.262', '-8.7896', '-9869.61', '66447', '-0.148534', '0', '0', '0'] #result = float(result[0][2]) f.close() else: self.log('Running profile calculation') if run_command(self.sandbox_dir + os.sep + self.executable[1], ['-e', potential_type, '-p', 'query.pdb'], env={'RASP': RASP_PATH}, stdout_file='profile_' + potential_type + '.txt'): print('Computing profile failed') return -1 else: f = open('profile_' + potential_type + '.txt') result = [l.split() for l in f.readlines()] try: result = [(int(i[1]), float(i[3])) for i in result] except IndexError: result = [(int(i[1]), float(i[2])) for i in result] f.close() self.log('Run finished') os.chdir(old_pwd) #return '\t'.join(scores) return scores
#return result or -1 # return -1 if result is 0 or None
[docs] def colour_by_local_score(self, path_to_pdb, potential_type='all'): local_scores = self.run(path_to_pdb, potential_type, global_energy_score=False) local_scores = [float(i[1]) for i in local_scores] with open(path_to_pdb) as f: pdb_file = PDBFile(pdb_string=f.read()) pdb_file.set_residues_bfactor(local_scores) return pdb_file.pdb_string