def pdb(): """Get PDB content of selection. .. image:: ../../rna_tools/utils/PyMOL4RNA/doc/pdb.png""" tmpfn = '/tmp/pymol_get_pdb.pdb' cmd.save(tmpfn, '(sele)') s = RNAStructure(tmpfn) for l in s.lines: print(l)
# get version version = os.path.basename(os.path.dirname( os.path.abspath(__file__))), get_version(__file__) version = version[1].strip() # get parser and arguments parser = get_parser() args = parser.parse_args() # quick fix for one files vs file-s if list == type(args.file) and len(args.file) == 1: args.file = args.file[0] if args.report: s = RNAStructure(args.file) print(s.get_report) print(s.get_preview()) print(s.get_info_chains()) if args.clean: s = RNAStructure(args.file) s.decap_gtp() s.std_resn() s.remove_hydrogen() s.remove_ion() s.remove_water() s.renum_atoms() s.fix_O_in_UC() s.fix_op_atoms() # print s.get_preview()
def run(self, pdb_file, numSteps, verbose=False): """Compute SimRNA energy for a single file Arguments: * pdb_file = path to a PDB file * numSteps, number of SimRNA steps Output: * global energy as a floating point number """ self.log('Running program') self.log('input - pdb_file: %s' % pdb_file) #copyfile(pdb_file, self.sandbox_dir + os.sep + 'query.pdb') s = RNAStructure(pdb_file) s.get_rnapuzzle_ready() s.write(self.sandbox_dir + os.sep + 'query.pdb', False) try: old_pwd = os.getcwd() except OSError: old_pwd = None os.chdir(self.sandbox_dir) if verbose: print('simrna::', self.sandbox_dir) # This is the place why you run SimRNA (self.src_bin) # you can add options like '-c', '~/tmp/config' # following flags mean: # -n 0 = 0 steps of simulation # -R 0 = set random seed to a constant, # results should be the same every time if run_command( self.src_bin, [ '-p', self.sandbox_dir + os.sep + 'query.pdb', '-n', str(numSteps), '-R', '0' ], # 16000 stderr_file=self.sandbox_dir + os.sep + 'output.txt'): self.log('Run failed', 'error') # the place where I read the output file (stderr_file) of SimRNA f = open(self.sandbox_dir + os.sep + 'output.txt') stderr = f.read() f.close() self.log('STDERR:\n' + stderr, 'debug') if old_pwd: os.chdir(old_pwd) return -1 if old_pwd: os.chdir(old_pwd) self.log('Run finished') # parse output scores = [] f = open(self.sandbox_dir + os.sep + 'output.txt') lines_temp = f.read().split('\n') lines = lines_temp if verbose: print('simrna::', '\n'.join(lines)) # the output is dicombosed into score total_enrg = [l for l in lines if 'Total energy of system' in l][-1].split(' ')[-1] bb = [l for l in lines if 'Base-Base interactions energy' in l][-1].split(' ')[-1] ss = [l for l in lines if 'where: short stacking energy' in l ][-1].strip().split(' ')[-1] bbc = [l for l in lines if 'Base-Backbone interact. energy' in l ][-1].strip().split(' ')[-1] lge = [l for l in lines if 'Local geometry energy' in l][-1].strip().split(' ')[-1] bcp = [l for l in lines if "bonds (distance) C4'-P" in l][-1].strip().split(' ')[-1] bpc = [l for l in lines if "bonds (distance) P-C4'" in l][-1].strip().split(' ')[-1] fa = [l for l in lines if "flat angles C4'-P-C4'" in l][-1].strip().split(' ')[-1] fa2 = [l for l in lines if "flat angles P-C4'-P" in l][-1].strip().split(' ')[-1] tor = [l for l in lines if "tors. eta vs tors. theta" in l][-1].strip().split(' ')[-1] lim = '' # empty at the moment '' # [l for l in lines if "limit. sphere exceed penalty:" in l][-1].strip().split(' ')[-1] cc = [l for l in lines if "current chain energy:" in l][-1].strip().split(' ')[-1] scores += [numSteps] + [total_enrg] + [bb] + [ss] + [bbc] + [lge] + [ bcp ] + [bpc] + [fa] + [fa2] + [tor] + [lim] + [cc] f.close() if verbose: print(' simrna::steps:', numSteps) #s = '\t'.join(scores) #if verbose: print ' simrna::scores:', s #return s return scores
#!/usr/bin/env python import sys from rna_tools.rna_tools_lib import RNAStructure if __name__ == '__main__': files = sys.argv[1:] if not files: print('rna_pdb_merge_into_one.py test_in/*.pdb') sys.exit(1) c = 1 for f in files: s = RNAStructure(f) print("MODEL " + str(c)) print(s.get_text(add_end=False)) print('ENDMDL') c += 1 print('END')
nmdp += l if verbose: print(nmdp) with open(mdp_out, 'w') as f: f.write(nmdp) def get_parser(): parser = argparse.ArgumentParser( description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter) #parser.add_argument('-', "--", help="", default="") parser.add_argument("-v", "--verbose", action="store_true", help="be verbose") parser.add_argument("file", help="", default="") return parser # main if __name__ == '__main__': #fn = 'test_data/decoy0165_amb_clx.pdb' fn = 'test_data/1duq.pdb' fn = 'test_data/1duq_rpr.pdb' # format_score_mdp('out.txt', '', '') # print(open('out.txt').read()) from rna_tools.rna_tools_lib import RNAStructure r = RNAStructure(fn) for i in r.get_all_chain_ids(): chain = r.get_chain(i) nchain = make_rna_gromacs_ready(chain) print(nchain).strip()
def get_rmsd_to(self, other_rnamodel, way="", triple_mode=False, save=True): """Calc rmsd P-atom based rmsd to other rna model""" sup = Bio.PDB.Superimposer() if way == 'backbone+sugar': self.atoms_for_rmsd = [] for a in self.atoms: if a.name in "P,OP1,OP2,C5',O5',C4',O4',C3',O3',C2',O2',C1'".split( ','): self.atoms_for_rmsd.append(a) if args.debug: print('atoms_for_rmsd', len(self.atoms_for_rmsd)) other_atoms_for_rmsd = [] for a in other_rnamodel.atoms: if a.name in "P,OP1,OP2,C5',O5',C4',O4',C3',O3',C2',O2',C1'".split( ','): other_atoms_for_rmsd.append(a) if args.debug: print('other_atoms_for_rmsd', len(other_atoms_for_rmsd)) else: self.atoms_for_rmsd = self.atoms other_atoms_for_rmsd = other_rnamodel.atoms if triple_mode: def chunks(lst, n): """Yield successive n-sized chunks from lst. https://stackoverflow.com/questions/312443/how-do-you-split-a-list-into-evenly-sized-chunks """ for i in range(0, len(lst), n): yield lst[i:i + n] rmsd_min = 10000 # ugly import itertools per = list(itertools.permutations([0, 1, 2])) lst = list(chunks(other_atoms_for_rmsd, 12)) sup_min = None for p in per: patoms = [] for i in p: # p=(1, 2, 3) patoms.extend(lst[i]) #print(self.atoms_for_rmsd) ## print('patoms') ## for a in patoms: ## print(a, a.get_parent().get_id()) ## print('self.atoms_for_rmsd') ## for a in self.atoms_for_rmsd: ## print(a, a.get_parent().get_id()) #sup.set_atoms(patoms, self.atoms_for_rmsd) sup.set_atoms(self.atoms_for_rmsd, patoms) rms = round(sup.rms, 3) rt = None seq = '' for a in patoms: r = a.get_parent() if r != rt: rt = r seq += r.get_resname().strip() if rms < rmsd_min: rmsd_min = rms sup_min = copy.copy(sup) suffix = seq p_min = p seq_min = seq if args.debug: print(p, '', [i + 1 for i in p], end=' ') print(seq, 'seq_min:', seq_min, rms) index = [0, 0, 0] index[0] = p_min.index(0) index[1] = p_min.index(1) index[2] = p_min.index(2) # ugly re-set 123 to crazy id ! + 100, so this will # fill up 1 2 3 for the second for rs = other_rnamodel.struc[0].get_residues() for i, r in enumerate(rs): r.id = (' ', index[i] + 153, ' ') # ugly, some random offset for i, r in enumerate(other_rnamodel.struc[0].get_residues()): r.id = (' ', index[i] + 1, ' ') if args.debug: print(r) io = Bio.PDB.PDBIO() sup_min.apply(other_rnamodel.struc.get_atoms()) # if args.debug: print(p_min, [i + 1 for i in p_min]) io.set_structure(other_rnamodel.struc) fout = other_rnamodel.fpath.replace('.pdb', '_aligned' + suffix + '.pdb') # if args.debug: print(fout) io.save(fout) # ugly set chain to A set_chain_for_struc(fout, 'A', save_file_inplace=True) # and now run this to sort into 1 2 3 r = RNAStructure(fout) remarks = r.get_remarks_text() r1 = r.get_res_text('A', 1) r2 = r.get_res_text('A', 2) r3 = r.get_res_text('A', 3) with open(fout, 'w') as f: f.write(remarks) f.write(r1) f.write(r2) f.write(r3) r.reload() r.get_rnapuzzle_ready() r.write() return str(rmsd_min) + ',' + seq_min else: sup.set_atoms(self.atoms_for_rmsd, other_atoms_for_rmsd) rms = round(sup.rms, 2) if save: ## io = Bio.PDB.PDBIO() ## sup.apply(self.struc.get_atoms()) ## io.set_structure(self.struc) ## io.save("aligned.pdb") io = Bio.PDB.PDBIO() sup.apply(other_rnamodel.struc.get_atoms()) io.set_structure(other_rnamodel.struc) io.save( other_rnamodel.fpath.replace('.pdb', '_' + args.suffix + '.pdb')) return rms
def get_rmsd_to(self, other_rnamodel, way="", triple_mode=False, save=True, tseq=''): """Calc rmsd P-atom based rmsd to other rna model sugar now 10 atoms ;-) """ sup = Bio.PDB.Superimposer() if way in ['c1', 'backbone+sugar', 'sugar']: if way == 'c1': atomslist = ["C1'"] # ,"C2'","O4'"] #, "C2'"] elif way == 'sugar': atomslist = "C5',O5',C4',O4',C3',O3',C2',O2',C1'".split(',') elif way == 'backbone+sugar': atomslist = "P,OP1,OP2,C5',O5',C4',O4',C3',O3',C2',O2',C1'".split( ',') self.atoms_for_rmsd = [] for a in self.atoms: nt = a.get_parent().get_resname().strip() if nt in ['G', 'A']: atomslistx = atomslist + ['N9'] if nt in ['C', 'U']: atomslistx = atomslist + ['N1'] if a.name in atomslistx: self.atoms_for_rmsd.append(a) if args.debug: print('atoms_for_rmsd', len(self.atoms_for_rmsd)) other_atoms_for_rmsd = [] for a in other_rnamodel.atoms: nt = a.get_parent().get_resname().strip() if nt in ['G', 'A']: atomslistx = atomslist + ['N9'] if nt in ['C', 'U']: atomslistx = atomslist + ['N1'] if a.name in atomslistx: other_atoms_for_rmsd.append(a) if args.debug: print('other_atoms_for_rmsd', len(other_atoms_for_rmsd)) elif way == 'c1+Nx': self.atoms_for_rmsd = [] for a in self.atoms: nt = a.get_parent().get_resname().strip() # G if nt in ['G', 'A']: atomslist = ["C1'", 'N9'] # , 'N1'] if nt in ['C', 'U']: atomslist = ["C1'", 'N1'] # , 'N1'] if a.name in atomslist: self.atoms_for_rmsd.append(a) if args.debug: print('atoms_for_rmsd', len(self.atoms_for_rmsd)) other_atoms_for_rmsd = [] for a in other_rnamodel.atoms: nt = a.get_parent().get_resname().strip() # G if nt in ['G', 'A']: atomslist = ["C1'", 'N9'] # , 'N1'] if nt in ['C', 'U']: atomslist = ["C1'", 'N1'] # , 'N1'] if a.name in atomslist: other_atoms_for_rmsd.append(a) if args.debug: print('other_atoms_for_rmsd', len(other_atoms_for_rmsd)) else: self.atoms_for_rmsd = self.atoms other_atoms_for_rmsd = other_rnamodel.atoms # calc rmsd # if not tseq: tseq = '' rt = None for a in self.atoms_for_rmsd: r = a.get_parent() if r != rt: rt = r tseq += r.get_resname().strip() if triple_mode: def chunks(lst, n): """Yield successive n-sized chunks from lst. https://stackoverflow.com/questions/312443/how-do-you-split-a-list-into-evenly-sized-chunks """ for i in range(0, len(lst), n): yield lst[i:i + n] rmsd_min = 10000 # ugly import itertools # ok, for different residues now it's a problem per = list( itertools.permutations([0, 1, 2]) ) # [(0, 1, 2), (0, 2, 1), (1, 0, 2), (1, 2, 0), (2, 0, 1), (2, 1, 0)] lst = list( chunks(other_atoms_for_rmsd, int(len(other_atoms_for_rmsd) / 3))) # for 1 atom, this will be 1 x 3 [3 residues] # so so len is 3 atoms so / by 3 to get how many atoms per residue print(lst) sup_min = None seq_min = 'not yet obtained, rmsd rejected!' p_min = None rms = -1 for p in per: patoms = [] for i in p: # p=(1, 2, 3) patoms.extend(lst[i]) #print(self.atoms_for_rmsd) ## print('patoms') ## for a in patoms: ## print(a, a.get_parent().get_id()) ## print('self.atoms_for_rmsd') ## for a in self.atoms_for_rmsd: ## print(a, a.get_parent().get_id()) #sup.set_atoms(patoms, self.atoms_for_rmsd) rt = None seq = '' for a in patoms: r = a.get_parent() if r != rt: rt = r seq += r.get_resname().strip() ic(tseq.lower(), seq.lower(), other_rnamodel.fpath) # dont' even calc rmsd if the curr seq and tseq are not the same if tseq.lower() == seq.lower(): # only if seq is the same print(self.atoms_for_rmsd) print(patoms) print(len(self.atoms_for_rmsd), len(patoms)) for a, b in zip(self.atoms_for_rmsd, patoms): print(a, a.get_parent().id, a.get_parent().get_resname(), b.get_parent().id, b.get_parent().get_resname()) print(len(self.atoms_for_rmsd), len(patoms)) try: sup.set_atoms(self.atoms_for_rmsd, patoms) except: pass rms = round(sup.rms, 2) if rms < rmsd_min: rmsd_min = rms sup_min = copy.copy(sup) suffix = seq p_min = p seq_min = seq if args.debug: 'set new rmsd_min', rmsd_min if args.debug: print(p, '', [i + 1 for i in p], end=' ') print(seq, 'seq_min: ' + seq_min, rms) if p_min: # found target sequence # what is this? ;-) index = [0, 0, 0] index[0] = p_min.index(0) index[1] = p_min.index(1) index[2] = p_min.index(2) # ugly re-set 123 to crazy id ! + 100, so this will # fill up 1 2 3 for the second for rs = other_rnamodel.struc[0].get_residues() for i, r in enumerate(rs): r.id = (' ', index[i] + 253, ' ' ) # ugly, some random offset for i, r in enumerate(other_rnamodel.struc[0].get_residues()): r.id = (' ', index[i] + 1, ' ') if args.debug: print('r', r) io = Bio.PDB.PDBIO() sup_min.apply(other_rnamodel.struc.get_atoms()) # if args.debug: print(p_min, [i + 1 for i in p_min]) io.set_structure(other_rnamodel.struc) args.save_here = True if args.save_here and save: folder = os.path.basename( self.fpath.replace( '.pdb', '_' + args.folder_prefix + '_aligned')) # print(f) try: os.mkdir(folder) except: pass fout = folder + os.sep + "{:1.2f}".format( rmsd_min) + '-' + os.path.basename( other_rnamodel.fpath ) #.replace('.pdb', '-' + str(rms) + '.pdb')) #_s' + suffix + '.pdb')) else: fout = other_rnamodel.fpath.replace( '.pdb', '_aligned.pdb') #_s' + suffix + '.pdb') if args.debug: print(fout) if save: io.save(fout) # ugly set chain to A set_chain_for_struc(fout, 'A', save_file_inplace=True) # and now run this to sort into 1 2 3 r = RNAStructure(fout) remarks = r.get_remarks_text() r1 = r.get_res_text('A', 1) r2 = r.get_res_text('A', 2) r3 = r.get_res_text('A', 3) with open(fout, 'w') as f: f.write(remarks) f.write(r1) f.write(r2) f.write(r3) r.reload() r.get_rnapuzzle_ready() if rmsd_min < 1: # !!!!!!!!!!!! ugly r.write() return str(rmsd_min ) # + ',s' + seq_min + ',' + os.path.basename(fout) else: # check if number of the same atoms # # if not the same then return -1 # # print(len(self.atoms_for_rmsd), len(other_atoms_for_rmsd)) if len(self.atoms_for_rmsd) != len(other_atoms_for_rmsd): return -1 sup.set_atoms(self.atoms_for_rmsd, other_atoms_for_rmsd) rms = round(sup.rms, 2) if save: ## io = Bio.PDB.PDBIO() ## sup.apply(self.struc.get_atoms()) ## io.set_structure(self.struc) ## io.save("aligned.pdb") io = Bio.PDB.PDBIO() sup.apply(other_rnamodel.struc.get_atoms()) io.set_structure(other_rnamodel.struc) args.save_here = True if args.save_here and save: f = os.path.basename(self.fpath.replace('.pdb', '_aligned')) # print(f) try: os.mkdir(f) except: pass # fout = f + os.sep + os.path.basename(other_rnamodel.fpath.replace('.pdb', '_aligned_s' + suffix + '.pdb')) fout = f + os.sep + os.path.basename( other_rnamodel.fpath) #.replace('.pdb', '_aligned')) else: fout = other_rnamodel.fpath.replace('.pdb', '_aligned.pdb') if save: io.save(fout) return rms
if __name__ == '__main__': # get version version = os.path.basename(os.path.dirname(os.path.abspath(__file__))), get_version(__file__) version = version[1].strip() # get parser and arguments parser = get_parser() args = parser.parse_args() # quick fix for one files vs file-s if list == type(args.file) and len(args.file) == 1: args.file = args.file[0] if args.report: s = RNAStructure(args.file) print(s.get_report) print(s.get_preview()) print(s.get_info_chains()) if args.clean: s = RNAStructure(args.file) s.decap_gtp() s.std_resn() s.remove_hydrogen() s.remove_ion() s.remove_water() s.renum_atoms() s.fix_O_in_UC() s.fix_op_atoms() # print s.get_preview()
description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter) #parser.add_argument('-', "--", help="", default="") parser.add_argument("-v", "--verbose", action="store_true", help="be verbose") parser.add_argument("file", help="", default="") # nargs='+') parser.add_argument("insert", help="", default="") # nargs='+') parser.add_argument("--output", help="by default <file>_rpl.pdb", default="") # nargs='+') return parser if __name__ == '__main__': parser = get_parser() args = parser.parse_args() f1 = args.file f2 = args.insert r1 = RNAStructure(f1) r2 = RNAStructure(f2) t = replace_atoms(f1, f2) if not args.output: with open(args.file.replace('.pdb', '_rpl.pdb'), 'w') as f: f.write(t)