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 sqrt
24 from re import match
25
26
29 """Class containing functions for relaxation data."""
30
31 self.relax = relax
32
33
35 """Function for assigning peak intensity data to either the reference or saturated spectra."""
36
37
38 if self.spectrum_type == 'ref':
39 self.relax.data.res[run][i].ref = intensity
40 elif self.spectrum_type == 'sat':
41 self.relax.data.res[run][i].sat = intensity
42
43
45 """Function for calculating the NOE and its error.
46
47 The error for each peak is calculated using the formula:
48 ___________________________________________
49 \/ {sd(sat)*I(unsat)}^2 + {sd(unsat)*I(sat)}^2
50 sd(NOE) = -----------------------------------------------
51 I(unsat)^2
52 """
53
54
55 self.run = run
56
57
58 if not self.run in self.relax.data.run_names:
59 raise RelaxNoRunError, self.run
60
61
62 if not self.relax.data.res.has_key(self.run):
63 raise RelaxNoSequenceError, self.run
64
65
66 for i in xrange(len(self.relax.data.res[self.run])):
67
68 data = self.relax.data.res[self.run][i]
69
70
71 if not data.select:
72 continue
73
74
75 if not (hasattr(data, 'ref') and hasattr(data, 'sat') and hasattr(data, 'ref_err') and hasattr(data, 'sat_err')):
76 continue
77
78
79 data.noe = data.sat / data.ref
80
81
82 data.noe_err = sqrt((data.sat_err * data.ref)**2 + (data.ref_err * data.sat)**2) / data.ref**2
83
84
86 """
87 NOE calculation data type string matching patterns
88 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
89
90 ____________________________________________________________________________________________
91 | | | |
92 | Data type | Object name | Patterns |
93 |________________________|______________|__________________________________________________|
94 | | | |
95 | Reference intensity | ref | '^[Rr]ef$' or '[Rr]ef[ -_][Ii]nt' |
96 |________________________|______________|__________________________________________________|
97 | | | |
98 | Saturated intensity | sat | '^[Ss]at$' or '[Ss]at[ -_][Ii]nt' |
99 |________________________|______________|__________________________________________________|
100 | | | |
101 | NOE | noe | '^[Nn][Oo][Ee]$' |
102 |________________________|______________|__________________________________________________|
103
104 """
105
106
107 if match('^[Rr]ef$', name) or match('[Rr]ef[ -_][Ii]nt', name):
108 return 'ref'
109
110
111 if match('^[Ss]at$', name) or match('[Ss]at[ -_][Ii]nt', name):
112 return 'sat'
113
114
115 if match('^[Nn][Oo][Ee]$', name):
116 return 'noe'
117
118
119 - def read(self, run=None, file=None, dir=None, spectrum_type=None, format=None, heteronuc=None, proton=None, int_col=None):
120 """Function for reading peak intensity data."""
121
122
123 self.run = run
124 self.spectrum_type = spectrum_type
125
126
127 spect_type_list = ['ref', 'sat']
128 if self.spectrum_type not in spect_type_list:
129 raise RelaxArgNotInListError, ('spectrum type', self.spectrum_type, spect_type_list)
130 if self.spectrum_type == 'ref':
131 print "Reference spectrum."
132 if self.spectrum_type == 'sat':
133 print "Saturated spectrum."
134
135
136 self.relax.generic.intensity.read(run=run, file=file, dir=dir, format=format, heteronuc=heteronuc, proton=proton, int_col=int_col, assign_func=self.assign_function)
137
138
140 """Function for reading the results file."""
141
142
143 self.run = run
144
145
146 header = file_data[0]
147 file_data = file_data[1:]
148
149
150 col = {}
151 for i in xrange(len(header)):
152 if header[i] == 'Num':
153 col['num'] = i
154 elif header[i] == 'Name':
155 col['name'] = i
156 elif header[i] == 'Selected':
157 col['select'] = i
158 elif header[i] == 'Ref_intensity':
159 col['ref_int'] = i
160 elif header[i] == 'Ref_error':
161 col['ref_err'] = i
162 elif header[i] == 'Sat_intensity':
163 col['sat_int'] = i
164 elif header[i] == 'Sat_error':
165 col['sat_err'] = i
166 elif header[i] == 'NOE':
167 col['noe'] = i
168 elif header[i] == 'NOE_error':
169 col['noe_err'] = i
170
171
172 if len(col) < 2:
173 raise RelaxInvalidDataError
174
175
176
177
178
179
180 for i in xrange(len(file_data)):
181
182 try:
183 res_num = int(file_data[i][col['num']])
184 except ValueError:
185 raise RelaxError, "The residue number " + file_data[i][col['num']] + " is not an integer."
186 res_name = file_data[i][col['name']]
187
188
189 self.relax.generic.sequence.add(self.run, res_num, res_name, select=int(file_data[i][col['select']]))
190
191
192
193
194
195
196 for i in xrange(len(file_data)):
197
198 try:
199 res_num = int(file_data[i][col['num']])
200 except ValueError:
201 raise RelaxError, "The residue number " + file_data[i][col['num']] + " is not an integer."
202 res_name = file_data[i][col['name']]
203
204
205 index = None
206 for j in xrange(len(self.relax.data.res[self.run])):
207 if self.relax.data.res[self.run][j].num == res_num and self.relax.data.res[self.run][j].name == res_name:
208 index = j
209 break
210 if index == None:
211 raise RelaxError, "Residue " + `res_num` + " " + res_name + " cannot be found in the sequence."
212
213
214 data = self.relax.data.res[self.run][index]
215
216
217 if not data.select:
218 continue
219
220
221 try:
222 data.ref = float(file_data[i][col['ref_int']])
223 except ValueError:
224 data.ref = None
225
226
227 try:
228 data.ref_err = float(file_data[i][col['ref_err']])
229 except ValueError:
230 data.ref_err = None
231
232
233 try:
234 data.sat = float(file_data[i][col['sat_int']])
235 except ValueError:
236 data.sat = None
237
238
239 try:
240 data.sat_err = float(file_data[i][col['sat_err']])
241 except ValueError:
242 data.sat_err = None
243
244
245 try:
246 data.noe = float(file_data[i][col['noe']])
247 except ValueError:
248 data.noe = None
249
250
251 try:
252 data.noe_err = float(file_data[i][col['noe_err']])
253 except ValueError:
254 data.noe_err = None
255
256
258 """Function for returning the NOE value and error."""
259
260
261 self.run = run
262
263
264 data = self.relax.data.res[run][i]
265
266
267 object_name = self.get_data_name(data_type)
268 if not object_name:
269 raise RelaxError, "The NOE calculation data type " + `data_type` + " does not exist."
270 object_error = object_name + "_err"
271
272
273 value = None
274 if hasattr(data, object_name):
275 value = getattr(data, object_name)
276
277
278 error = None
279 if hasattr(data, object_error):
280 error = getattr(data, object_error)
281
282
283 return value, error
284
285
286 - def set_error(self, run=None, error=0.0, spectrum_type=None, res_num=None, res_name=None):
287 """Function for setting the errors."""
288
289
290 self.run = run
291 self.spectrum_type = spectrum_type
292 self.res_num = res_num
293 self.res_name = res_name
294
295
296 if not run in self.relax.data.run_names:
297 raise RelaxNoRunError, run
298
299
300 if not self.relax.data.res.has_key(run):
301 raise RelaxNoSequenceError, run
302
303
304 if type(res_num) == str:
305 try:
306 compile(res_num)
307 except:
308 raise RelaxRegExpError, ('residue number', res_num)
309
310
311 if res_name:
312 try:
313 compile(res_name)
314 except:
315 raise RelaxRegExpError, ('residue name', res_name)
316
317
318 for i in xrange(len(self.relax.data.res[run])):
319
320 data = self.relax.data.res[self.run][i]
321
322
323 if not data.select:
324 continue
325
326
327 if type(res_num) == int and not data.num == res_num:
328 continue
329 elif type(res_num) == str and not match(res_num, `data.num`):
330 continue
331
332
333 if res_name != None and not match(res_name, data.name):
334 continue
335
336
337 if self.spectrum_type == 'ref':
338 data.ref_err = float(error)
339 elif self.spectrum_type == 'sat':
340 data.sat_err = float(error)
341
342
343 - def write(self, run=None, file=None, dir=None, force=0):
365
366
367 - def write_columnar_line(self, file=None, num=None, name=None, select=None, ref_int=None, ref_err=None, sat_int=None, sat_err=None, noe=None, noe_err=None):
368 """Function for printing a single line of the columnar formatted results."""
369
370
371 file.write("%-4s %-5s " % (num, name))
372
373
374 file.write("%-9s " % select)
375 if not select:
376 file.write("\n")
377 return
378
379
380 file.write("%-25s %-25s " % (ref_int, ref_err))
381 file.write("%-25s %-25s " % (sat_int, sat_err))
382
383
384 file.write("%-25s %-25s " % (noe, noe_err))
385
386
387 file.write("\n")
388
389
391 """Function for printing the results into a file."""
392
393
394 self.run = run
395
396
397 if not self.run in self.relax.data.run_names:
398 raise RelaxNoRunError, self.run
399
400
401 if not self.relax.data.res.has_key(self.run):
402 raise RelaxNoSequenceError, self.run
403
404
405
406
407
408
409
410 self.write_columnar_line(file=file, num='Num', name='Name', select='Selected', ref_int='Ref_intensity', ref_err='Ref_error', sat_int='Sat_intensity', sat_err='Sat_error', noe='NOE', noe_err='NOE_error')
411
412
413
414
415
416
417 for i in xrange(len(self.relax.data.res[self.run])):
418
419 data = self.relax.data.res[self.run][i]
420
421
422 if not data.select:
423 self.write_columnar_line(file=file, num=data.num, name=data.name, select=0)
424 continue
425
426
427 ref_int = None
428 if hasattr(data, 'ref'):
429 ref_int = data.ref
430
431
432 ref_err = None
433 if hasattr(data, 'ref_err'):
434 ref_err = data.ref_err
435
436
437 sat_int = None
438 if hasattr(data, 'sat'):
439 sat_int = data.sat
440
441
442 sat_err = None
443 if hasattr(data, 'sat_err'):
444 sat_err = data.sat_err
445
446
447 noe = None
448 if hasattr(data, 'noe'):
449 noe = data.noe
450
451
452 noe_err = None
453 if hasattr(data, 'noe_err'):
454 noe_err = data.noe_err
455
456
457 self.write_columnar_line(file=file, num=data.num, name=data.name, select=data.select, ref_int=ref_int, ref_err=ref_err, sat_int=sat_int, sat_err=sat_err, noe=noe, noe_err=noe_err)
458