1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 from math import pi
24 from os import F_OK, P_WAIT, access, chdir, chmod, getcwd, listdir, remove, spawnlp, system
25 from re import match, search
26 from string import split
27
28
31 """Class used to create and process input and output for the program Modelfree 4."""
32
33 self.relax = relax
34
35
36 - def create(self, run, dir, force, diff_search, sims, sim_type, trim, steps, constraints, nucleus, atom1, atom2):
37 """Function for creating the Modelfree4 input files.
38
39 The following files are created:
40 dir/mfin
41 dir/mfdata
42 dir/mfpar
43 dir/mfmodel
44 dir/run.sh
45 """
46
47
48 if not run in self.relax.data.run_names:
49 raise RelaxNoRunError, run
50
51
52 if not self.relax.data.res.has_key(run):
53 raise RelaxNoSequenceError, run
54
55
56 if not self.relax.data.diff[run].type == 'sphere' and not self.relax.data.pdb.has_key(run):
57 raise RelaxNoPdbError, run
58
59
60 if not hasattr(self.relax.data, 'gx'):
61 raise RelaxNucleusError
62
63
64 if dir == None:
65 dir = run
66 self.relax.IO.mkdir(dir, print_flag=0)
67
68
69 self.run = run
70 self.dir = dir
71 self.force = force
72 self.diff_search = diff_search
73 self.sims = sims
74 self.sim_type = sim_type
75 self.trim = trim
76 self.steps = steps
77 self.constraints = constraints
78 self.nucleus = nucleus
79 self.atom1 = atom1
80 self.atom2 = atom2
81
82
83 self.num_frq = 0
84 self.frq = []
85 for i in xrange(len(self.relax.data.res[self.run])):
86 if hasattr(self.relax.data.res[self.run][i], 'num_frq'):
87 if self.relax.data.res[self.run][i].num_frq > self.num_frq:
88
89 self.num_frq = self.relax.data.res[self.run][i].num_frq
90
91
92 for frq in self.relax.data.res[self.run][i].frq:
93 if frq not in self.frq:
94 self.frq.append(frq)
95
96
97 mfin = self.open_file('mfin')
98 self.create_mfin(mfin)
99 mfin.close()
100
101
102 mfdata = self.open_file('mfdata')
103 mfmodel = self.open_file('mfmodel')
104 mfpar = self.open_file('mfpar')
105
106
107 for i in xrange(len(self.relax.data.res[self.run])):
108 if hasattr(self.relax.data.res[self.run][i], 'num_frq'):
109
110 if not self.create_mfdata(i, mfdata):
111 continue
112
113
114 self.create_mfmodel(i, mfmodel)
115
116
117 self.create_mfpar(i, mfpar)
118
119
120 mfdata.close()
121 mfmodel.close()
122 mfpar.close()
123
124
125 run = self.open_file('run.sh')
126 self.create_run(run)
127 run.close()
128 chmod(self.dir + '/run.sh', 0755)
129
130
132 """Create the Modelfree4 input file 'mfmodel'."""
133
134
135 file.write("\nspin " + self.relax.data.res[self.run][i].name + "_" + `self.relax.data.res[self.run][i].num` + "\n")
136
137
138 written = 0
139
140
141 for j in xrange(self.num_frq):
142
143 r1, r2, noe = None, None, None
144
145
146 for k in xrange(self.relax.data.res[self.run][i].num_ri):
147 if self.frq[j] != self.relax.data.res[self.run][i].frq[self.relax.data.res[self.run][i].remap_table[k]]:
148 continue
149
150
151 if self.relax.data.res[self.run][i].ri_labels[k] == 'R1':
152 r1 = self.relax.data.res[self.run][i].relax_data[k]
153 r1_err = self.relax.data.res[self.run][i].relax_error[k]
154
155
156 elif self.relax.data.res[self.run][i].ri_labels[k] == 'R2':
157 r2 = self.relax.data.res[self.run][i].relax_data[k]
158 r2_err = self.relax.data.res[self.run][i].relax_error[k]
159
160
161 elif self.relax.data.res[self.run][i].ri_labels[k] == 'NOE':
162 noe = self.relax.data.res[self.run][i].relax_data[k]
163 noe_err = self.relax.data.res[self.run][i].relax_error[k]
164
165
166 if r1:
167 file.write('%-7s%-10.3f%20f%20f %-3i\n' % ('R1', self.frq[j]*1e-6, r1, r1_err, 1))
168 else:
169 file.write('%-7s%-10.3f%20f%20f %-3i\n' % ('R1', self.frq[j]*1e-6, 0, 0, 0))
170
171
172 if r2:
173 file.write('%-7s%-10.3f%20f%20f %-3i\n' % ('R2', self.frq[j]*1e-6, r2, r2_err, 1))
174 else:
175 file.write('%-7s%-10.3f%20f%20f %-3i\n' % ('R2', self.frq[j]*1e-6, 0, 0, 0))
176
177
178 if noe:
179 file.write('%-7s%-10.3f%20f%20f %-3i\n' % ('NOE', self.frq[j]*1e-6, noe, noe_err, 1))
180 else:
181 file.write('%-7s%-10.3f%20f%20f %-3i\n' % ('NOE', self.frq[j]*1e-6, 0, 0, 0))
182
183 written = 1
184
185 return written
186
187
189 """Create the Modelfree4 input file 'mfin'."""
190
191
192 if self.relax.data.diff[self.run].type == 'sphere':
193 diff = 'isotropic'
194 algorithm = 'brent'
195 tm = self.relax.data.diff[self.run].tm / 1e-9
196 dratio = 1
197 theta = 0
198 phi = 0
199 elif self.relax.data.diff[self.run].type == 'spheroid':
200 diff = 'axial'
201 algorithm = 'powell'
202 tm = self.relax.data.diff[self.run].tm / 1e-9
203 dratio = self.relax.data.diff[self.run].Dratio
204 theta = self.relax.data.diff[self.run].theta * 360.0 / (2.0 * pi)
205 phi = self.relax.data.diff[self.run].phi * 360.0 / (2.0 * pi)
206 elif self.relax.data.diff[self.run].type == 'ellipsoid':
207 diff = 'anisotropic'
208 algorithm = 'powell'
209 tm = self.relax.data.diff[self.run].tm / 1e-9
210 dratio = 0
211 theta = 0
212 phi = 0
213
214
215 file.write("optimization tval\n\n")
216 file.write("seed 0\n\n")
217 file.write("search grid\n\n")
218
219
220 if self.relax.data.diff[self.run].fixed:
221 algorithm = 'fix'
222
223 file.write("diffusion " + diff + " " + self.diff_search + "\n\n")
224 file.write("algorithm " + algorithm + "\n\n")
225
226
227 if self.sims:
228 file.write("simulations " + self.sim_type + " " + `self.sims` + " " + `self.trim` + "\n\n")
229 else:
230 file.write("simulations none\n\n")
231
232 selection = 'none'
233 file.write("selection " + selection + "\n\n")
234 file.write("sim_algorithm " + algorithm + "\n\n")
235
236 file.write("fields " + `self.num_frq`)
237 for frq in self.frq:
238 file.write(" " + `frq*1e-6`)
239 file.write("\n")
240
241
242 file.write('%-7s' % 'tm')
243 file.write('%14.3f' % tm)
244 file.write('%2i' % 1)
245 file.write('%3i' % 0)
246 file.write('%5i' % 5)
247 file.write('%6i' % 15)
248 file.write('%4i\n' % 20)
249
250
251 file.write('%-7s' % 'Dratio')
252 file.write('%14s' % dratio)
253 file.write('%2i' % 1)
254 file.write('%3i' % 0)
255 file.write('%5i' % 0)
256 file.write('%6i' % 2)
257 file.write('%4i\n' % 5)
258
259
260 file.write('%-7s' % 'Theta')
261 file.write('%14s' % theta)
262 file.write('%2i' % 1)
263 file.write('%3i' % 0)
264 file.write('%5i' % 0)
265 file.write('%6i' % 180)
266 file.write('%4i\n' % 10)
267
268
269 file.write('%-7s' % 'Phi')
270 file.write('%14s' % phi)
271 file.write('%2i' % 1)
272 file.write('%3i' % 0)
273 file.write('%5i' % 0)
274 file.write('%6i' % 360)
275 file.write('%4i\n' % 10)
276
277
279 """Create the Modelfree4 input file 'mfmodel'."""
280
281
282 file.write("\nspin " + self.relax.data.res[self.run][i].name + "_" + `self.relax.data.res[self.run][i].num` + "\n")
283
284
285 file.write('%-3s%-6s%-6.1f' % ('M1', 'tloc', 0))
286 if 'tm' in self.relax.data.res[self.run][i].params:
287 file.write('%-4i' % 1)
288 else:
289 file.write('%-4i' % 0)
290
291 if self.constraints:
292 file.write('%-2i' % 2)
293 else:
294 file.write('%-2i' % 0)
295
296 file.write('%11.3f%12.3f %-4s\n' % (0, 20, self.steps))
297
298
299 file.write('%-3s%-6s%-6.1f' % ('M1', 'Theta', 0))
300 file.write('%-4i' % 0)
301
302 if self.constraints:
303 file.write('%-2i' % 2)
304 else:
305 file.write('%-2i' % 0)
306
307 file.write('%11.3f%12.3f %-4s\n' % (0, 90, self.steps))
308
309
310 file.write('%-3s%-6s%-6.1f' % ('M1', 'Sf2', 1))
311 if 'S2f' in self.relax.data.res[self.run][i].params:
312 file.write('%-4i' % 1)
313 else:
314 file.write('%-4i' % 0)
315
316 if self.constraints:
317 file.write('%-2i' % 2)
318 else:
319 file.write('%-2i' % 0)
320
321 file.write('%11.3f%12.3f %-4s\n' % (0, 1, self.steps))
322
323
324 file.write('%-3s%-6s%-6.1f' % ('M1', 'Ss2', 1))
325 if 'S2s' in self.relax.data.res[self.run][i].params or 'S2' in self.relax.data.res[self.run][i].params:
326 file.write('%-4i' % 1)
327 else:
328 file.write('%-4i' % 0)
329
330 if self.constraints:
331 file.write('%-2i' % 2)
332 else:
333 file.write('%-2i' % 0)
334
335 file.write('%11.3f%12.3f %-4s\n' % (0, 1, self.steps))
336
337
338 file.write('%-3s%-6s%-6.1f' % ('M1', 'te', 0))
339 if 'te' in self.relax.data.res[self.run][i].params or 'ts' in self.relax.data.res[self.run][i].params:
340 file.write('%-4i' % 1)
341 else:
342 file.write('%-4i' % 0)
343
344 if self.constraints:
345 file.write('%-2i' % 2)
346 else:
347 file.write('%-2i' % 0)
348
349 file.write('%11.3f%12.3f %-4s\n' % (0, 10000, self.steps))
350
351
352 file.write('%-3s%-6s%-6.1f' % ('M1', 'Rex', 0))
353 if 'Rex' in self.relax.data.res[self.run][i].params:
354 file.write('%-4i' % 1)
355 else:
356 file.write('%-4i' % 0)
357
358 if self.constraints:
359 file.write('%-2i' % -1)
360 else:
361 file.write('%-2i' % 0)
362
363 file.write('%11.3f%12.3f %-4s\n' % (0, 20, self.steps))
364
365
367 """Create the Modelfree4 input file 'mfpar'."""
368
369
370 file.write("\nspin " + self.relax.data.res[self.run][i].name + "_" + `self.relax.data.res[self.run][i].num` + "\n")
371
372 file.write('%-14s' % "constants")
373 file.write('%-6i' % self.relax.data.res[self.run][i].num)
374 file.write('%-7s' % self.nucleus)
375 file.write('%-8.3f' % (self.relax.data.gx / 1e7))
376 file.write('%-8.3f' % (self.relax.data.res[self.run][i].r * 1e10))
377 file.write('%-8.3f\n' % (self.relax.data.res[self.run][i].csa * 1e6))
378
379 file.write('%-10s' % "vector")
380 file.write('%-4s' % self.atom1)
381 file.write('%-4s\n' % self.atom2)
382
383
385 """Create the script 'run.sh' for the execution of Modelfree4."""
386
387 file.write("#! /bin/sh\n")
388 file.write("modelfree4 -i mfin -d mfdata -p mfpar -m mfmodel -o mfout -e out")
389 if self.relax.data.diff[self.run].type != 'sphere':
390
391 system('cp ' + self.relax.data.pdb[self.run].file_name + ' ' + self.dir)
392 file.write(" -s " + self.relax.data.pdb[self.run].file_name.split('/')[-1])
393 file.write("\n")
394
395
396 - def execute(self, run, dir, force):
397 """Function for executing Modelfree4.
398
399 BUG: Control-C during execution causes the cwd to stay as dir.
400 """
401
402
403 orig_dir = getcwd()
404
405
406 if dir == None:
407 dir = run
408 if not access(dir, F_OK):
409 raise RelaxDirError, ('Modelfree4', dir)
410
411
412 chdir(dir)
413
414
415 try:
416
417 if not access('mfin', F_OK):
418 raise RelaxFileError, ('mfin input', 'mfin')
419
420
421 if not access('mfdata', F_OK):
422 raise RelaxFileError, ('mfdata input', 'mfdata')
423
424
425 if not access('mfmodel', F_OK):
426 raise RelaxFileError, ('mfmodel input', 'mfmodel')
427
428
429 if not access('mfpar', F_OK):
430 raise RelaxFileError, ('mfpar input', 'mfpar')
431
432
433 if self.relax.data.diff[run].type != 'sphere':
434 pdb = self.relax.data.pdb[self.run].file_name.split('/')[-1]
435 if not access(pdb, F_OK):
436 raise RelaxFileError, ('PDB', pdb)
437 else:
438 pdb = None
439
440
441 if force:
442 for file in listdir(getcwd()):
443 if search('out$', file) or search('rotate$', file):
444 remove(file)
445
446
447 if pdb:
448 spawnlp(P_WAIT, 'modelfree4', 'modelfree4', '-i', 'mfin', '-d', 'mfdata', '-p', 'mfpar', '-m', 'mfmodel', '-o', 'mfout', '-e', 'out', '-s', pdb)
449 else:
450 test = spawnlp(P_WAIT, 'modelfree4', 'modelfree4', '-i', 'mfin', '-d', 'mfdata', '-p', 'mfpar', '-m', 'mfmodel', '-o', 'mfout', '-e', 'out')
451 if test:
452 raise RelaxProgFailError, 'Modelfree4'
453
454
455 except:
456
457 chdir(orig_dir)
458
459
460 raise
461
462
463 chdir(orig_dir)
464
465
467 """Function for extracting the Modelfree4 results out of the 'mfout' file."""
468
469
470 self.run = run
471
472
473 if not self.relax.data.res.has_key(self.run):
474 raise RelaxNoSequenceError, self.run
475
476
477 if dir == None:
478 dir = run
479 if not access(dir, F_OK):
480 raise RelaxDirError, ('Modelfree4', dir)
481
482
483 if not access(dir + "/mfout", F_OK):
484 raise RelaxFileError, ('Modelfree4', dir + "/mfout")
485
486
487 mfout_file = open(dir + "/mfout", 'r')
488 mfout = mfout_file.readlines()
489 mfout_file.close()
490
491
492 sims = 0
493 for i in xrange(len(mfout)):
494 if search('_iterations', mfout[i]):
495 row = split(mfout[i])
496 sims = int(row[1])
497
498
499 for i in xrange(len(self.relax.data.res[self.run])):
500
501 if not hasattr(self.relax.data.res[self.run][i], 'model'):
502 continue
503
504
505 data = self.get_mf_data('S2', mfout, self.relax.data.res[self.run][i].num)
506 if data != None:
507 s2, s2_err = data
508 self.relax.data.res[self.run][i].s2 = s2
509
510
511
512 if 'S2f' in self.relax.data.res[self.run][i].params or 'S2s' in self.relax.data.res[self.run][i].params:
513 data = self.get_mf_data('S2f', mfout, self.relax.data.res[self.run][i].num)
514 if data != None:
515 s2f, s2f_err = data
516 self.relax.data.res[self.run][i].s2f = s2f
517
518
519
520 if 'S2f' in self.relax.data.res[self.run][i].params or 'S2s' in self.relax.data.res[self.run][i].params:
521 data = self.get_mf_data('S2s', mfout, self.relax.data.res[self.run][i].num)
522 if data != None:
523 s2s, s2s_err = data
524 self.relax.data.res[self.run][i].s2s = s2s
525
526
527
528 if 'te' in self.relax.data.res[self.run][i].params or 'ts' in self.relax.data.res[self.run][i].params:
529 data = self.get_mf_data('te', mfout, self.relax.data.res[self.run][i].num)
530 if data != None:
531 te, te_err = data
532 self.relax.data.res[self.run][i].te = te / 1e12
533
534 if 'ts' in self.relax.data.res[self.run][i].params:
535 self.relax.data.res[self.run][i].ts = te / 1e12
536
537
538
539 if 'Rex' in self.relax.data.res[self.run][i].params:
540 data = self.get_mf_data('Rex', mfout, self.relax.data.res[self.run][i].num)
541 if data != None:
542 rex, rex_err = data
543 self.relax.data.res[self.run][i].rex = rex / (2.0 * pi * self.relax.data.res[self.run][i].frq[0])**2
544
545
546
547 self.relax.data.res[self.run][i].chi2 = self.get_chi2(sims, mfout, self.relax.data.res[self.run][i].num)
548
549
551 """Extract the chi-squared data from the mfout file."""
552
553
554 for i in xrange(len(mfout)):
555 if match('data_sse', mfout[i]):
556 break
557
558
559 for j in xrange(i+3, len(mfout)):
560 row = split(mfout[j])
561 if `res` == row[0]:
562 return float(row[1])
563
564
565 if row[0] == 'data_correlation_matrix':
566 return
567
568
570 """Extract the model-free data from the mfout file."""
571
572
573 for i in xrange(len(mfout)):
574 if match('data_model_1', mfout[i]):
575 break
576
577
578 for j in xrange(i, len(mfout)):
579 row = split(mfout[j])
580 if len(row) == 0:
581 continue
582 elif match(data_type, row[0]):
583 break
584
585
586 for k in xrange(j+1, len(mfout)):
587 row = split(mfout[k])
588 if `res` == row[0]:
589 try:
590
591 val = split(row[1], '*')
592 err = split(row[4], '*')
593
594
595 return float(val[0]), float(err[0])
596 except:
597 return None, None
598
599
600 if row[0] == 'stop_':
601 return
602
603
605 """Function for opening a file to write to."""
606
607 file_name = self.dir + "/" + file_name
608 if access(file_name, F_OK) and not self.force:
609 raise RelaxFileOverwriteError, (file_name, 'force flag')
610 return open(file_name, 'w')
611