Mercurial > repos > chemteam > gmx_editconf
comparison merge_top.py @ 4:3b8a9d5ced85 draft
"planemo upload for repository https://github.com/galaxycomputationalchemistry/galaxy-tools-compchem/tools/gromacs commit 71a3084d6e402b31563b1662bb629d5a959ce7b7"
author | chemteam |
---|---|
date | Wed, 15 Apr 2020 14:17:43 -0400 |
parents | 7b23265126b0 |
children |
comparison
equal
deleted
inserted
replaced
3:e69ce1e7fb6a | 4:3b8a9d5ced85 |
---|---|
1 import re | 1 import argparse |
2 import sys | 2 |
3 import parmed as pmd | |
3 | 4 |
4 | 5 |
5 def combine_tops(top_text, itp_texts): | 6 def merge_gro_files(prot_gro, lig_gro, cmplx_gro): |
6 """ | 7 prot = pmd.load_file(prot_gro) |
7 Search through parent topology top_text and replace | 8 lig = pmd.load_file(lig_gro) |
8 #include lines with the relevant child topologies | 9 cmplx = prot + lig |
9 from the dictionary itp_texts | 10 cmplx.save(cmplx_gro) |
10 """ | |
11 for itp in itp_texts: | |
12 # split on include string, then rejoin around itp file | |
13 spl = re.split('#include ".*{}"\n'.format(itp), top_text) | |
14 top_text = itp_texts[itp].join(spl) | |
15 return top_text | |
16 | 11 |
17 | 12 |
18 top = sys.argv[1] # parent topology file | 13 def merge_top_files(prot_top, lig_top, cmplx_top): |
19 itps_file = sys.argv[2] # file with list of child topologies (.itp files) | 14 with open(lig_top, 'r') as f: |
15 lig_top_sections = f.read().split('\n[') | |
20 | 16 |
21 with open(itps_file) as f: | 17 # open ligand topology |
22 itps = f.read().split() | 18 for n in range(len(lig_top_sections)): |
19 if 'atomtypes' in lig_top_sections[n][:10]: | |
20 lig_atomtypes = lig_top_sections[n] | |
21 del lig_top_sections[n] | |
22 break | |
23 else: | |
24 lig_atomtypes = None | |
25 lig_top_updated = '\n['.join(lig_top_sections) | |
23 | 26 |
24 with open(top, 'r') as f: | 27 # open protein topology |
25 top_text = f.read() | 28 with open(prot_top, 'r') as f: |
29 prot_top_combined = f.read() | |
30 if lig_atomtypes: | |
31 prot_top_sections = prot_top_combined.split('[ moleculetype ]\n') | |
32 prot_top_combined = (prot_top_sections[0] + | |
33 '; Include ligand atomtypes\n[' + | |
34 lig_atomtypes + | |
35 '\n[ moleculetype ]\n' + | |
36 prot_top_sections[1]) | |
37 prot_top_sections = prot_top_combined.split('; Include water topology') | |
38 prot_top_combined = (prot_top_sections[0] + | |
39 '; Include ligand topology\n' + | |
40 lig_top_updated + | |
41 '\n; Include water topology' + | |
42 prot_top_sections[1]) | |
43 prot_top_combined += 'base 1\n' | |
26 | 44 |
27 itp_texts = {} # create dictionary of child topologies | 45 # save complex topology |
28 for itp in itps: | 46 with open(cmplx_top, 'w') as f: |
29 with open(itp, 'r') as f: | 47 f.write(prot_top_combined) |
30 itp_texts[itp] = f.read() | |
31 | 48 |
32 for itp in itp_texts: | |
33 # child tops may also refer to each other; we need to check this | |
34 itp_texts[itp] = combine_tops(itp_texts[itp], itp_texts) | |
35 | 49 |
36 with open('top_output.top', 'w') as f: | 50 def main(): |
37 # now combine all children into the parent | 51 parser = argparse.ArgumentParser( |
38 f.write(combine_tops(top_text, itp_texts)) | 52 description='Perform SMD runs for dynamic undocking') |
53 parser.add_argument('--lig-top', help='Ligand TOP file.') | |
54 parser.add_argument('--prot-top', help='Protein TOP file.') | |
55 parser.add_argument('--lig-gro', help='Ligand GRO file.') | |
56 parser.add_argument('--prot-gro', help='Protein GRO file.') | |
57 parser.add_argument('--complex-top', help='Complex TOP file.') | |
58 parser.add_argument('--complex-gro', help='Complex GRO file.') | |
59 args = parser.parse_args() | |
60 merge_gro_files(args.prot_gro, args.lig_gro, args.complex_gro) | |
61 merge_top_files(args.prot_top, args.lig_top, args.complex_top) | |
62 | |
63 | |
64 if __name__ == "__main__": | |
65 main() |