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

Source Code for Module specific_fns.relax_fit

  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 re import match 
 24   
 25   
26 -class Relax_fit:
27 - def __init__(self, relax):
28 """Class containing functions for relaxation data.""" 29 30 self.relax = relax
31 32
33 - def get_data_name(self, name):
34 """ 35 Relaxation curve fitting data type string matching patterns 36 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 37 38 ____________________________________________________________________________________________ 39 | | | | 40 | Data type | Object name | Patterns | 41 |________________________|______________|__________________________________________________| 42 | | | | 43 | rate | rate | '^[Rr]ate$' | 44 |________________________|______________|__________________________________________________| 45 46 """ 47 48 # Rate. 49 if match('^[Rr]ate$', name): 50 return 'rate'
51 52
53 - def read(self, run=None, file=None, dir=None, relax_time=0.0, fit_type=None, format=None, heteronuc=None, proton=None, int_col=None):
54 """Function for reading peak intensity data.""" 55 56 # Arguments. 57 self.run = run 58 self.relax_time = relax_time 59 self.fit_type = fit_type 60 self.format = format 61 self.heteronuc = heteronuc 62 self.proton = proton 63 self.int_col = int_col 64 65 # Fit type argument. 66 fit_type_list = ['exp', 'inv'] 67 if self.fit_type not in fit_type_list: 68 raise RelaxArgNotInListError, ('fit type', self.fit_type, fit_type_list) 69 if self.fit_type == 'exp': 70 print "Two parameter exponential fit." 71 if self.fit_type == 'inv': 72 print "Three parameter inversion recovery fit." 73 74 # Generic intensity function. 75 self.relax.generic.intensity.read(run=run, file=file, dir=dir, format=format, heteronuc=heteronuc, proton=proton, int_col=int_col)
76 77
78 - def read_columnar_results(self, run, file_data):
79 """Function for reading the results file.""" 80 81 # Arguments. 82 self.run = run 83 84 # Extract and remove the header. 85 header = file_data[0] 86 file_data = file_data[1:] 87 88 # Sort the column numbers. 89 col = {} 90 for i in xrange(len(header)): 91 if header[i] == 'Num': 92 col['num'] = i 93 elif header[i] == 'Name': 94 col['name'] = i 95 elif header[i] == 'Selected': 96 col['select'] = i 97 elif header[i] == 'Ref_intensity': 98 col['ref_int'] = i 99 elif header[i] == 'Ref_error': 100 col['ref_err'] = i 101 elif header[i] == 'Sat_intensity': 102 col['sat_int'] = i 103 elif header[i] == 'Sat_error': 104 col['sat_err'] = i 105 elif header[i] == 'NOE': 106 col['noe'] = i 107 elif header[i] == 'NOE_error': 108 col['noe_err'] = i 109 110 # Test the file. 111 if len(col) < 2: 112 raise RelaxInvalidDataError 113 114 115 # Sequence. 116 ########### 117 118 # Generate the sequence. 119 for i in xrange(len(file_data)): 120 # Residue number and name. 121 try: 122 res_num = int(file_data[i][col['num']]) 123 except ValueError: 124 raise RelaxError, "The residue number " + file_data[i][col['num']] + " is not an integer." 125 res_name = file_data[i][col['name']] 126 127 # Add the residue. 128 self.relax.generic.sequence.add(self.run, res_num, res_name, select=int(file_data[i][col['select']])) 129 130 131 # Data. 132 ####### 133 134 # Loop over the file data. 135 for i in xrange(len(file_data)): 136 # Residue number and name. 137 try: 138 res_num = int(file_data[i][col['num']]) 139 except ValueError: 140 raise RelaxError, "The residue number " + file_data[i][col['num']] + " is not an integer." 141 res_name = file_data[i][col['name']] 142 143 # Find the residue index. 144 index = None 145 for j in xrange(len(self.relax.data.res[self.run])): 146 if self.relax.data.res[self.run][j].num == res_num and self.relax.data.res[self.run][j].name == res_name: 147 index = j 148 break 149 if index == None: 150 raise RelaxError, "Residue " + `res_num` + " " + res_name + " cannot be found in the sequence." 151 152 # Reassign data structure. 153 data = self.relax.data.res[self.run][index] 154 155 # Skip unselected residues. 156 if not data.select: 157 continue 158 159 # Reference intensity. 160 try: 161 data.ref = float(file_data[i][col['ref_int']]) 162 except ValueError: 163 data.ref = None 164 165 # Reference error. 166 try: 167 data.ref_err = float(file_data[i][col['ref_err']]) 168 except ValueError: 169 data.ref_err = None 170 171 # Saturated intensity. 172 try: 173 data.sat = float(file_data[i][col['sat_int']]) 174 except ValueError: 175 data.sat = None 176 177 # Saturated error. 178 try: 179 data.sat_err = float(file_data[i][col['sat_err']]) 180 except ValueError: 181 data.sat_err = None 182 183 # NOE. 184 try: 185 data.noe = float(file_data[i][col['noe']]) 186 except ValueError: 187 data.noe = None 188 189 # NOE error. 190 try: 191 data.noe_err = float(file_data[i][col['noe_err']]) 192 except ValueError: 193 data.noe_err = None
194 195
196 - def return_value(self, run, i, data_type='noe'):
197 """Function for returning the NOE value and error.""" 198 199 # Arguments. 200 self.run = run 201 202 # Remap the data structure 'self.relax.data.res[run][i]'. 203 data = self.relax.data.res[run][i] 204 205 # Get the object. 206 object_name = self.get_data_name(data_type) 207 if not object_name: 208 raise RelaxError, "The NOE calculation data type " + `data_type` + " does not exist." 209 object_error = object_name + "_err" 210 211 # Get the value. 212 value = None 213 if hasattr(data, object_name): 214 value = getattr(data, object_name) 215 216 # Get the error. 217 error = None 218 if hasattr(data, object_error): 219 error = getattr(data, object_error) 220 221 # Return the data. 222 return value, error
223 224
225 - def set_error(self, run=None, error=0.0, spectrum_type=None, res_num=None, res_name=None):
226 """Function for setting the errors.""" 227 228 # Arguments. 229 self.run = run 230 self.spectrum_type = spectrum_type 231 self.res_num = res_num 232 self.res_name = res_name 233 234 # Test if the run exists. 235 if not run in self.relax.data.run_names: 236 raise RelaxNoRunError, run 237 238 # Test if the sequence data is loaded. 239 if not self.relax.data.res.has_key(run): 240 raise RelaxNoSequenceError, run 241 242 # Test if the residue number is a valid regular expression. 243 if type(res_num) == str: 244 try: 245 compile(res_num) 246 except: 247 raise RelaxRegExpError, ('residue number', res_num) 248 249 # Test if the residue name is a valid regular expression. 250 if res_name: 251 try: 252 compile(res_name) 253 except: 254 raise RelaxRegExpError, ('residue name', res_name) 255 256 # Loop over the sequence. 257 for i in xrange(len(self.relax.data.res[run])): 258 # Remap the data structure 'self.relax.data.res[self.run][i]'. 259 data = self.relax.data.res[self.run][i] 260 261 # Skip unselected residues. 262 if not data.select: 263 continue 264 265 # If 'res_num' is not None, skip the residue if there is no match. 266 if type(res_num) == int and not data.num == res_num: 267 continue 268 elif type(res_num) == str and not match(res_num, `data.num`): 269 continue 270 271 # If 'res_name' is not None, skip the residue if there is no match. 272 if res_name != None and not match(res_name, data.name): 273 continue 274 275 # Set the error. 276 if self.spectrum_type == 'ref': 277 data.ref_err = float(error) 278 elif self.spectrum_type == 'sat': 279 data.sat_err = float(error)
280 281
282 - def write(self, run=None, file=None, dir=None, force=0):
283 """Function for writing NOE values and errors to a file.""" 284 285 # Arguments 286 self.run = run 287 288 # Test if the run exists. 289 if not self.run in self.relax.data.run_names: 290 raise RelaxNoRunError, self.run 291 292 # Test if the sequence data is loaded. 293 if not self.relax.data.res.has_key(self.run): 294 raise RelaxNoSequenceError, self.run 295 296 # Open the file for writing. 297 noe_file = self.relax.IO.open_write_file(file, dir, force) 298 299 # Write the data. 300 self.relax.generic.value.write_data(self.run, None, noe_file, return_value=self.return_value) 301 302 # Close the file. 303 noe_file.close()
304 305
306 - 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):
307 """Function for printing a single line of the columnar formatted results.""" 308 309 # Residue number and name. 310 file.write("%-4s %-5s " % (num, name)) 311 312 # Selected flag and data set. 313 file.write("%-9s " % select) 314 if not select: 315 file.write("\n") 316 return 317 318 # Reference and saturated data. 319 file.write("%-25s %-25s " % (ref_int, ref_err)) 320 file.write("%-25s %-25s " % (sat_int, sat_err)) 321 322 # NOE and error. 323 file.write("%-25s %-25s " % (noe, noe_err)) 324 325 # End of the line. 326 file.write("\n")
327 328
329 - def write_columnar_results(self, file, run):
330 """Function for printing the results into a file.""" 331 332 # Arguments. 333 self.run = run 334 335 # Test if the run exists. 336 if not self.run in self.relax.data.run_names: 337 raise RelaxNoRunError, self.run 338 339 # Test if sequence data is loaded. 340 if not self.relax.data.res.has_key(self.run): 341 raise RelaxNoSequenceError, self.run 342 343 344 # Header. 345 ######### 346 347 348 # Write the header line. 349 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') 350 351 352 # Values. 353 ######### 354 355 # Loop over the sequence. 356 for i in xrange(len(self.relax.data.res[self.run])): 357 # Reassign data structure. 358 data = self.relax.data.res[self.run][i] 359 360 # Unselected residues. 361 if not data.select: 362 self.write_columnar_line(file=file, num=data.num, name=data.name, select=0) 363 continue 364 365 # Reference intensity. 366 ref_int = None 367 if hasattr(data, 'ref'): 368 ref_int = data.ref 369 370 # Reference error. 371 ref_err = None 372 if hasattr(data, 'ref_err'): 373 ref_err = data.ref_err 374 375 # Saturated intensity. 376 sat_int = None 377 if hasattr(data, 'sat'): 378 sat_int = data.sat 379 380 # Saturated error. 381 sat_err = None 382 if hasattr(data, 'sat_err'): 383 sat_err = data.sat_err 384 385 # NOE 386 noe = None 387 if hasattr(data, 'noe'): 388 noe = data.noe 389 390 # NOE error. 391 noe_err = None 392 if hasattr(data, 'noe_err'): 393 noe_err = data.noe_err 394 395 # Write the line. 396 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)
397