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          for i in xrange(len(self.relax.data.res[self.run])): 
 63               
 64              data = self.relax.data.res[self.run][i] 
 65   
 66               
 67              if not data.select: 
 68                  continue 
 69   
 70               
 71              data.noe = data.sat / data.ref 
 72   
 73               
 74              data.noe_err = sqrt((data.sat_err * data.ref)**2 + (data.ref_err * data.sat)**2) / data.ref**2 
  75   
 76   
 78          """Function for deselecting residues without sufficient data to support calculation""" 
 79   
 80           
 81          if not self.relax.data.res.has_key(run): 
 82              raise RelaxNoSequenceError, run 
 83   
 84           
 85          for residue in self.relax.data.res[run]: 
 86   
 87               
 88              if not (hasattr(residue, 'ref') and hasattr(residue, 'sat') and hasattr(residue, 'ref_err') and hasattr(residue, 'sat_err')): 
 89                  residue.select = 0 
 90                  continue 
  91   
 92   
 93 -    def read(self, run=None, file=None, dir=None, spectrum_type=None, format=None, heteronuc=None, proton=None, int_col=None): 
  94          """Function for reading peak intensity data.""" 
 95   
 96           
 97          self.run = run 
 98          self.spectrum_type = spectrum_type 
 99   
100           
101          spect_type_list = ['ref', 'sat'] 
102          if self.spectrum_type not in spect_type_list: 
103              raise RelaxArgNotInListError, ('spectrum type', self.spectrum_type, spect_type_list) 
104          if self.spectrum_type == 'ref': 
105              print "Reference spectrum." 
106          if self.spectrum_type == 'sat': 
107              print "Saturated spectrum." 
108   
109           
110          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) 
 111   
112   
114          """Function for reading the results file.""" 
115   
116           
117          self.run = run 
118   
119           
120          header = file_data[0] 
121          file_data = file_data[1:] 
122   
123           
124          col = {} 
125          for i in xrange(len(header)): 
126              if header[i] == 'Num': 
127                  col['num'] = i 
128              elif header[i] == 'Name': 
129                  col['name'] = i 
130              elif header[i] == 'Selected': 
131                  col['select'] = i 
132              elif header[i] == 'Ref_intensity': 
133                  col['ref_int'] = i 
134              elif header[i] == 'Ref_error': 
135                  col['ref_err'] = i 
136              elif header[i] == 'Sat_intensity': 
137                  col['sat_int'] = i 
138              elif header[i] == 'Sat_error': 
139                  col['sat_err'] = i 
140              elif header[i] == 'NOE': 
141                  col['noe'] = i 
142              elif header[i] == 'NOE_error': 
143                  col['noe_err'] = i 
144   
145           
146          if len(col) < 2: 
147              raise RelaxInvalidDataError 
148   
149   
150           
151           
152   
153           
154          for i in xrange(len(file_data)): 
155               
156              try: 
157                  res_num = int(file_data[i][col['num']]) 
158              except ValueError: 
159                  raise RelaxError, "The residue number " + file_data[i][col['num']] + " is not an integer." 
160              res_name = file_data[i][col['name']] 
161   
162               
163              self.relax.generic.sequence.add(self.run, res_num, res_name, select=int(file_data[i][col['select']])) 
164   
165   
166           
167           
168   
169           
170          for i in xrange(len(file_data)): 
171               
172              try: 
173                  res_num = int(file_data[i][col['num']]) 
174              except ValueError: 
175                  raise RelaxError, "The residue number " + file_data[i][col['num']] + " is not an integer." 
176              res_name = file_data[i][col['name']] 
177   
178               
179              index = None 
180              for j in xrange(len(self.relax.data.res[self.run])): 
181                  if self.relax.data.res[self.run][j].num == res_num and self.relax.data.res[self.run][j].name == res_name: 
182                      index = j 
183                      break 
184              if index == None: 
185                  raise RelaxError, "Residue " + `res_num` + " " + res_name + " cannot be found in the sequence." 
186   
187               
188              data = self.relax.data.res[self.run][index] 
189   
190               
191              if not data.select: 
192                  continue 
193   
194               
195              try: 
196                  data.ref = float(file_data[i][col['ref_int']]) 
197              except ValueError: 
198                  data.ref = None 
199   
200               
201              try: 
202                  data.ref_err = float(file_data[i][col['ref_err']]) 
203              except ValueError: 
204                  data.ref_err = None 
205   
206               
207              try: 
208                  data.sat = float(file_data[i][col['sat_int']]) 
209              except ValueError: 
210                  data.sat = None 
211   
212               
213              try: 
214                  data.sat_err = float(file_data[i][col['sat_err']]) 
215              except ValueError: 
216                  data.sat_err = None 
217   
218               
219              try: 
220                  data.noe = float(file_data[i][col['noe']]) 
221              except ValueError: 
222                  data.noe = None 
223   
224               
225              try: 
226                  data.noe_err = float(file_data[i][col['noe_err']]) 
227              except ValueError: 
228                  data.noe_err = None 
 229   
230   
232          """Dummy function for returning 1.0.""" 
233   
234          return 1.0 
 235   
236   
238          """ 
239          NOE calculation data type string matching patterns 
240          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
241   
242          ____________________________________________________________________________________________ 
243          |                        |              |                                                  | 
244          | Data type              | Object name  | Patterns                                         | 
245          |________________________|______________|__________________________________________________| 
246          |                        |              |                                                  | 
247          | Reference intensity    | 'ref'        | '^[Rr]ef$' or '[Rr]ef[ -_][Ii]nt'                | 
248          |                        |              |                                                  | 
249          | Saturated intensity    | 'sat'        | '^[Ss]at$' or '[Ss]at[ -_][Ii]nt'                | 
250          |                        |              |                                                  | 
251          | NOE                    | 'noe'        | '^[Nn][Oo][Ee]$'                                 | 
252          |________________________|______________|__________________________________________________| 
253   
254          """ 
255   
256           
257          if match('^[Rr]ef$', name) or match('[Rr]ef[ -_][Ii]nt', name): 
258              return 'ref' 
259   
260           
261          if match('^[Ss]at$', name) or match('[Ss]at[ -_][Ii]nt', name): 
262              return 'sat' 
263   
264           
265          if match('^[Nn][Oo][Ee]$', name): 
266              return 'noe' 
 267   
268   
270          """Function for returning the Grace string representing the data type for axis labelling.""" 
271   
272           
273          object_name = self.return_data_name(data_type) 
274   
275           
276          if object_name == 'ref': 
277              grace_string = 'Reference intensity' 
278   
279           
280          if object_name == 'sat': 
281              grace_string = 'Saturated intensity' 
282   
283           
284          if object_name == 'noe': 
285              grace_string = '\\qNOE\\Q' 
286   
287           
288          return grace_string 
 289   
290   
292          """Dummy function which returns None as the stats have no units.""" 
293   
294          return None 
 295   
296   
298          """Function for returning the NOE value and error.""" 
299   
300           
301          self.run = run 
302   
303           
304          data = self.relax.data.res[run][i] 
305   
306           
307          object_name = self.return_data_name(data_type) 
308          if not object_name: 
309              raise RelaxError, "The NOE calculation data type " + `data_type` + " does not exist." 
310          object_error = object_name + "_err" 
311   
312           
313          value = None 
314          if hasattr(data, object_name): 
315              value = getattr(data, object_name) 
316   
317           
318          error = None 
319          if hasattr(data, object_error): 
320              error = getattr(data, object_error) 
321   
322           
323          return value, error 
 324   
325   
326 -    def set_error(self, run=None, error=0.0, spectrum_type=None, res_num=None, res_name=None): 
 327          """Function for setting the errors.""" 
328   
329           
330          self.run = run 
331          self.spectrum_type = spectrum_type 
332          self.res_num = res_num 
333          self.res_name = res_name 
334   
335           
336          if not run in self.relax.data.run_names: 
337              raise RelaxNoRunError, run 
338   
339           
340          if not self.relax.data.res.has_key(run): 
341              raise RelaxNoSequenceError, run 
342   
343           
344          if type(res_num) == str: 
345              try: 
346                  compile(res_num) 
347              except: 
348                  raise RelaxRegExpError, ('residue number', res_num) 
349   
350           
351          if res_name: 
352              try: 
353                  compile(res_name) 
354              except: 
355                  raise RelaxRegExpError, ('residue name', res_name) 
356   
357           
358          for i in xrange(len(self.relax.data.res[run])): 
359               
360              data = self.relax.data.res[self.run][i] 
361   
362               
363              if not data.select: 
364                  continue 
365   
366               
367              if type(res_num) == int and not data.num == res_num: 
368                  continue 
369              elif type(res_num) == str and not match(res_num, `data.num`): 
370                  continue 
371   
372               
373              if res_name != None and not match(res_name, data.name): 
374                  continue 
375   
376               
377              if self.spectrum_type == 'ref': 
378                  data.ref_err = float(error) 
379              elif self.spectrum_type == 'sat': 
380                  data.sat_err = float(error) 
 381   
382   
383 -    def write(self, run=None, file=None, dir=None, force=0): 
 405   
406   
407 -    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): 
 408          """Function for printing a single line of the columnar formatted results.""" 
409   
410           
411          file.write("%-4s %-5s " % (num, name)) 
412   
413           
414          file.write("%-9s " % select) 
415          if not select: 
416              file.write("\n") 
417              return 
418   
419           
420          file.write("%-25s %-25s " % (ref_int, ref_err)) 
421          file.write("%-25s %-25s " % (sat_int, sat_err)) 
422   
423           
424          file.write("%-25s %-25s " % (noe, noe_err)) 
425   
426           
427          file.write("\n") 
 428   
429   
431          """Function for printing the results into a file.""" 
432   
433           
434          self.run = run 
435   
436           
437          if not self.run in self.relax.data.run_names: 
438              raise RelaxNoRunError, self.run 
439   
440           
441          if not self.relax.data.res.has_key(self.run): 
442              raise RelaxNoSequenceError, self.run 
443   
444   
445           
446           
447   
448   
449           
450          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') 
451   
452   
453           
454           
455   
456           
457          for i in xrange(len(self.relax.data.res[self.run])): 
458               
459              data = self.relax.data.res[self.run][i] 
460   
461               
462              if not data.select: 
463                  self.write_columnar_line(file=file, num=data.num, name=data.name, select=0) 
464                  continue 
465   
466               
467              ref_int = None 
468              if hasattr(data, 'ref'): 
469                  ref_int = data.ref 
470   
471               
472              ref_err = None 
473              if hasattr(data, 'ref_err'): 
474                  ref_err = data.ref_err 
475   
476               
477              sat_int = None 
478              if hasattr(data, 'sat'): 
479                  sat_int = data.sat 
480   
481               
482              sat_err = None 
483              if hasattr(data, 'sat_err'): 
484                  sat_err = data.sat_err 
485   
486               
487              noe = None 
488              if hasattr(data, 'noe'): 
489                  noe = data.noe 
490   
491               
492              noe_err = None 
493              if hasattr(data, 'noe_err'): 
494                  noe_err = data.noe_err 
495   
496               
497              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)