Mercurial > repos > bgruening > openbabel_structure_distance_finder
comparison distance_finder.py @ 5:8302ab092300 draft default tip
planemo upload for repository https://github.com/bgruening/galaxytools/tree/master/chemicaltoolbox/openbabel commit d9c51279c061a1da948a2582d5b502ca7573adbf
author | bgruening |
---|---|
date | Thu, 15 Aug 2024 11:01:11 +0000 |
parents | 49242402887b |
children |
comparison
equal
deleted
inserted
replaced
4:2c5c7da26e08 | 5:8302ab092300 |
---|---|
17 | 17 |
18 from openbabel import pybel | 18 from openbabel import pybel |
19 | 19 |
20 | 20 |
21 def log(*args, **kwargs): | 21 def log(*args, **kwargs): |
22 """Log output to STDERR | 22 """Log output to STDERR""" |
23 """ | 23 print(*args, file=sys.stderr, **kwargs) |
24 print(*args, file=sys.stderr, ** kwargs) | |
25 | 24 |
26 | 25 |
27 def execute(ligands_sdf, points_file, outfile): | 26 def execute(ligands_sdf, points_file, outfile): |
28 """ | 27 """ |
29 :param ligands_sdf: A SDF with the 3D molecules to test | 28 :param ligands_sdf: A SDF with the 3D molecules to test |
33 """ | 32 """ |
34 | 33 |
35 points = [] | 34 points = [] |
36 | 35 |
37 # read the points | 36 # read the points |
38 with open(points_file, 'r') as f: | 37 with open(points_file, "r") as f: |
39 for line in f.readlines(): | 38 for line in f.readlines(): |
40 line.strip() | 39 line.strip() |
41 if line: | 40 if line: |
42 p = line.split() | 41 p = line.split() |
43 if len(p) == 3: | 42 if len(p) == 3: |
44 points.append((float(p[0]), float(p[1]), float(p[2]))) | 43 points.append((float(p[0]), float(p[1]), float(p[2]))) |
45 log("Read points", p) | 44 log("Read points", p) |
46 continue | 45 continue |
47 log("Failed to read line:", line) | 46 log("Failed to read line:", line) |
48 log('Found', len(points), 'atom points') | 47 log("Found", len(points), "atom points") |
49 | 48 |
50 sdf_writer = pybel.Outputfile("sdf", outfile, overwrite=True) | 49 sdf_writer = pybel.Outputfile("sdf", outfile, overwrite=True) |
51 | 50 |
52 count = 0 | 51 count = 0 |
53 for mol in pybel.readfile("sdf", ligands_sdf): | 52 for mol in pybel.readfile("sdf", ligands_sdf): |
54 count += 1 | 53 count += 1 |
55 if count % 50000 == 0: | 54 if count % 50000 == 0: |
56 log('Processed', count) | 55 log("Processed", count) |
57 | 56 |
58 try: | 57 try: |
59 # print("Processing mol", mol.title) | 58 # print("Processing mol", mol.title) |
60 clone = pybel.Molecule(mol) | 59 clone = pybel.Molecule(mol) |
61 clone.removeh() | 60 clone.removeh() |
68 for point in points: | 67 for point in points: |
69 p += 1 | 68 p += 1 |
70 distances = [] | 69 distances = [] |
71 for i in coords: | 70 for i in coords: |
72 # calculates distance based on cartesian coordinates | 71 # calculates distance based on cartesian coordinates |
73 distance = math.sqrt((point[0] - i[0])**2 + (point[1] - i[1])**2 + (point[2] - i[2])**2) | 72 distance = math.sqrt( |
73 (point[0] - i[0]) ** 2 | |
74 + (point[1] - i[1]) ** 2 | |
75 + (point[2] - i[2]) ** 2 | |
76 ) | |
74 distances.append(distance) | 77 distances.append(distance) |
75 # log("distance:", distance) | 78 # log("distance:", distance) |
76 min_distance = min(distances) | 79 min_distance = min(distances) |
77 # log('Min:', min_distance) | 80 # log('Min:', min_distance) |
78 # log(count, p, min_distance) | 81 # log(count, p, min_distance) |
79 | 82 |
80 mol.data['distance' + str(p)] = min_distance | 83 mol.data["distance" + str(p)] = min_distance |
81 | 84 |
82 sdf_writer.write(mol) | 85 sdf_writer.write(mol) |
83 | 86 |
84 except Exception as e: | 87 except Exception as e: |
85 log('Failed to handle molecule: ' + str(e)) | 88 log("Failed to handle molecule: " + str(e)) |
86 continue | 89 continue |
87 | 90 |
88 sdf_writer.close() | 91 sdf_writer.close() |
89 log('Wrote', count, 'molecules') | 92 log("Wrote", count, "molecules") |
90 | 93 |
91 | 94 |
92 def main(): | 95 def main(): |
93 global work_dir | 96 global work_dir |
94 | 97 |
95 parser = argparse.ArgumentParser(description='XChem distances - measure distances to particular points') | 98 parser = argparse.ArgumentParser( |
96 parser.add_argument('-i', '--input', help="SDF containing the 3D molecules to score)") | 99 description="XChem distances - measure distances to particular points" |
97 parser.add_argument('-p', '--points', help="PDB format file with atoms") | 100 ) |
98 parser.add_argument('-o', '--outfile', default='output.sdf', help="File name for results") | 101 parser.add_argument( |
102 "-i", "--input", help="SDF containing the 3D molecules to score)" | |
103 ) | |
104 parser.add_argument("-p", "--points", help="PDB format file with atoms") | |
105 parser.add_argument( | |
106 "-o", "--outfile", default="output.sdf", help="File name for results" | |
107 ) | |
99 | 108 |
100 args = parser.parse_args() | 109 args = parser.parse_args() |
101 log("XChem distances args: ", args) | 110 log("XChem distances args: ", args) |
102 | 111 |
103 execute(args.input, args.points, args.outfile) | 112 execute(args.input, args.points, args.outfile) |