Package specific_fns :: Module noe
[hide private]
[frames] | no frames]

Source Code for Module specific_fns.noe

  1  ############################################################################### 
  2  #                                                                             # 
  3  # Copyright (C) 2004 Edward d'Auvergne                                        # 
  4  #                                                                             # 
  5  # This file is part of the program relax.                                     # 
  6  #                                                                             # 
  7  # relax is free software; you can redistribute it and/or modify               # 
  8  # it under the terms of the GNU General Public License as published by        # 
  9  # the Free Software Foundation; either version 2 of the License, or           # 
 10  # (at your option) any later version.                                         # 
 11  #                                                                             # 
 12  # relax is distributed in the hope that it will be useful,                    # 
 13  # but WITHOUT ANY WARRANTY; without even the implied warranty of              # 
 14  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the               # 
 15  # GNU General Public License for more details.                                # 
 16  #                                                                             # 
 17  # You should have received a copy of the GNU General Public License           # 
 18  # along with relax; if not, write to the Free Software                        # 
 19  # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA   # 
 20  #                                                                             # 
 21  ############################################################################### 
 22   
 23  from math import sqrt 
 24  from re import match 
 25   
 26   
27 -class Noe:
28 - def __init__(self, relax):
29 """Class containing functions for relaxation data.""" 30 31 self.relax = relax
32 33
34 - def assign_function(self, run=None, i=None, intensity=None):
35 """Function for assigning peak intensity data to either the reference or saturated spectra.""" 36 37 # Add the data. 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
44 - def calculate(self, run=None, print_flag=1):
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 # Arguments. 55 self.run = run 56 57 # Test if the run exists. 58 if not self.run in self.relax.data.run_names: 59 raise RelaxNoRunError, self.run 60 61 # Test if sequence data is loaded. 62 if not self.relax.data.res.has_key(self.run): 63 raise RelaxNoSequenceError, self.run 64 65 # Loop over the sequence. 66 for i in xrange(len(self.relax.data.res[self.run])): 67 # Remap the data structure 'self.relax.data.res[self.run][i]'. 68 data = self.relax.data.res[self.run][i] 69 70 # Skip unselected residues. 71 if not data.select: 72 continue 73 74 # Skip residues which have no intensity values or errors. 75 if not (hasattr(data, 'ref') and hasattr(data, 'sat') and hasattr(data, 'ref_err') and hasattr(data, 'sat_err')): 76 continue 77 78 # Calculate the NOE. 79 data.noe = data.sat / data.ref 80 81 # Calculate the error. 82 data.noe_err = sqrt((data.sat_err * data.ref)**2 + (data.ref_err * data.sat)**2) / data.ref**2
83 84
85 - def get_data_name(self, name):
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 # Reference intensity. 107 if match('^[Rr]ef$', name) or match('[Rr]ef[ -_][Ii]nt', name): 108 return 'ref' 109 110 # Saturated intensity. 111 if match('^[Ss]at$', name) or match('[Ss]at[ -_][Ii]nt', name): 112 return 'sat' 113 114 # NOE. 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 # Arguments. 123 self.run = run 124 self.spectrum_type = spectrum_type 125 126 # Spectrum type argument. 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 # Generic intensity function. 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
139 - def read_columnar_results(self, run, file_data):
140 """Function for reading the results file.""" 141 142 # Arguments. 143 self.run = run 144 145 # Extract and remove the header. 146 header = file_data[0] 147 file_data = file_data[1:] 148 149 # Sort the column numbers. 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 # Test the file. 172 if len(col) < 2: 173 raise RelaxInvalidDataError 174 175 176 # Sequence. 177 ########### 178 179 # Generate the sequence. 180 for i in xrange(len(file_data)): 181 # Residue number and name. 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 # Add the residue. 189 self.relax.generic.sequence.add(self.run, res_num, res_name, select=int(file_data[i][col['select']])) 190 191 192 # Data. 193 ####### 194 195 # Loop over the file data. 196 for i in xrange(len(file_data)): 197 # Residue number and name. 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 # Find the residue index. 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 # Reassign data structure. 214 data = self.relax.data.res[self.run][index] 215 216 # Skip unselected residues. 217 if not data.select: 218 continue 219 220 # Reference intensity. 221 try: 222 data.ref = float(file_data[i][col['ref_int']]) 223 except ValueError: 224 data.ref = None 225 226 # Reference error. 227 try: 228 data.ref_err = float(file_data[i][col['ref_err']]) 229 except ValueError: 230 data.ref_err = None 231 232 # Saturated intensity. 233 try: 234 data.sat = float(file_data[i][col['sat_int']]) 235 except ValueError: 236 data.sat = None 237 238 # Saturated error. 239 try: 240 data.sat_err = float(file_data[i][col['sat_err']]) 241 except ValueError: 242 data.sat_err = None 243 244 # NOE. 245 try: 246 data.noe = float(file_data[i][col['noe']]) 247 except ValueError: 248 data.noe = None 249 250 # NOE error. 251 try: 252 data.noe_err = float(file_data[i][col['noe_err']]) 253 except ValueError: 254 data.noe_err = None
255 256
257 - def return_value(self, run, i, data_type='noe'):
258 """Function for returning the NOE value and error.""" 259 260 # Arguments. 261 self.run = run 262 263 # Remap the data structure 'self.relax.data.res[run][i]'. 264 data = self.relax.data.res[run][i] 265 266 # Get the object. 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 # Get the value. 273 value = None 274 if hasattr(data, object_name): 275 value = getattr(data, object_name) 276 277 # Get the error. 278 error = None 279 if hasattr(data, object_error): 280 error = getattr(data, object_error) 281 282 # Return the data. 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 # Arguments. 290 self.run = run 291 self.spectrum_type = spectrum_type 292 self.res_num = res_num 293 self.res_name = res_name 294 295 # Test if the run exists. 296 if not run in self.relax.data.run_names: 297 raise RelaxNoRunError, run 298 299 # Test if the sequence data is loaded. 300 if not self.relax.data.res.has_key(run): 301 raise RelaxNoSequenceError, run 302 303 # Test if the residue number is a valid regular expression. 304 if type(res_num) == str: 305 try: 306 compile(res_num) 307 except: 308 raise RelaxRegExpError, ('residue number', res_num) 309 310 # Test if the residue name is a valid regular expression. 311 if res_name: 312 try: 313 compile(res_name) 314 except: 315 raise RelaxRegExpError, ('residue name', res_name) 316 317 # Loop over the sequence. 318 for i in xrange(len(self.relax.data.res[run])): 319 # Remap the data structure 'self.relax.data.res[self.run][i]'. 320 data = self.relax.data.res[self.run][i] 321 322 # Skip unselected residues. 323 if not data.select: 324 continue 325 326 # If 'res_num' is not None, skip the residue if there is no match. 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 # If 'res_name' is not None, skip the residue if there is no match. 333 if res_name != None and not match(res_name, data.name): 334 continue 335 336 # Set the error. 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):
344 """Function for writing NOE values and errors to a file.""" 345 346 # Arguments 347 self.run = run 348 349 # Test if the run exists. 350 if not self.run in self.relax.data.run_names: 351 raise RelaxNoRunError, self.run 352 353 # Test if the sequence data is loaded. 354 if not self.relax.data.res.has_key(self.run): 355 raise RelaxNoSequenceError, self.run 356 357 # Open the file for writing. 358 noe_file = self.relax.IO.open_write_file(file, dir, force) 359 360 # Write the data. 361 self.relax.generic.value.write_data(self.run, None, noe_file, return_value=self.return_value) 362 363 # Close the file. 364 noe_file.close()
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 # Residue number and name. 371 file.write("%-4s %-5s " % (num, name)) 372 373 # Selected flag and data set. 374 file.write("%-9s " % select) 375 if not select: 376 file.write("\n") 377 return 378 379 # Reference and saturated data. 380 file.write("%-25s %-25s " % (ref_int, ref_err)) 381 file.write("%-25s %-25s " % (sat_int, sat_err)) 382 383 # NOE and error. 384 file.write("%-25s %-25s " % (noe, noe_err)) 385 386 # End of the line. 387 file.write("\n")
388 389
390 - def write_columnar_results(self, file, run):
391 """Function for printing the results into a file.""" 392 393 # Arguments. 394 self.run = run 395 396 # Test if the run exists. 397 if not self.run in self.relax.data.run_names: 398 raise RelaxNoRunError, self.run 399 400 # Test if sequence data is loaded. 401 if not self.relax.data.res.has_key(self.run): 402 raise RelaxNoSequenceError, self.run 403 404 405 # Header. 406 ######### 407 408 409 # Write the header line. 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 # Values. 414 ######### 415 416 # Loop over the sequence. 417 for i in xrange(len(self.relax.data.res[self.run])): 418 # Reassign data structure. 419 data = self.relax.data.res[self.run][i] 420 421 # Unselected residues. 422 if not data.select: 423 self.write_columnar_line(file=file, num=data.num, name=data.name, select=0) 424 continue 425 426 # Reference intensity. 427 ref_int = None 428 if hasattr(data, 'ref'): 429 ref_int = data.ref 430 431 # Reference error. 432 ref_err = None 433 if hasattr(data, 'ref_err'): 434 ref_err = data.ref_err 435 436 # Saturated intensity. 437 sat_int = None 438 if hasattr(data, 'sat'): 439 sat_int = data.sat 440 441 # Saturated error. 442 sat_err = None 443 if hasattr(data, 'sat_err'): 444 sat_err = data.sat_err 445 446 # NOE 447 noe = None 448 if hasattr(data, 'noe'): 449 noe = data.noe 450 451 # NOE error. 452 noe_err = None 453 if hasattr(data, 'noe_err'): 454 noe_err = data.noe_err 455 456 # Write the line. 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