Module common_ops
[hide private]
[frames] | no frames]

Source Code for Module common_ops

  1  from os import system 
  2  from re import match 
  3  from string import split 
  4  import sys 
  5   
  6   
7 -class common_ops:
8 - def __init__(self, mf):
9 "Operations, functions, etc common to the different model-free analysis methods." 10 11 self.mf = mf
12
13 - def extract_relax_data(self):
14 "Extract the relaxation data from the files given in the file 'input'" 15 print "\n[ Relaxation data extraction ]\n" 16 for i in range(self.mf.data.num_ri): 17 data = self.mf.file_ops.relax_data(self.mf.data.data_files[i]) 18 self.mf.data.relax_data.append(data)
19 20
21 - def fill_results(self, data, model='0'):
22 "Initialise the next row of the results data structure." 23 24 results = {} 25 results['res_num'] = data['res_num'] 26 results['model'] = model 27 if match('0', model) or match('2\+3', model) or match('4\+5', model): 28 results['s2'] = '' 29 results['s2_err'] = '' 30 results['s2f'] = '' 31 results['s2f_err'] = '' 32 results['s2s'] = '' 33 results['s2s_err'] = '' 34 results['te'] = '' 35 results['te_err'] = '' 36 results['rex'] = '' 37 results['rex_err'] = '' 38 results['chi2'] = data['chi2'] 39 else: 40 results['s2'] = data['s2'] 41 results['s2_err'] = data['s2_err'] 42 results['s2f'] = data['s2f'] 43 results['s2f_err'] = data['s2f_err'] 44 results['s2s'] = data['s2s'] 45 results['s2s_err'] = data['s2s_err'] 46 results['te'] = data['te'] 47 results['te_err'] = data['te_err'] 48 results['rex'] = data['rex'] 49 results['rex_err'] = data['rex_err'] 50 results['chi2'] = data['chi2'] 51 return results
52 53
54 - def grace(self, file_name, type, subtitle):
55 "Create grace files for the results." 56 57 file = open(file_name, 'w') 58 59 if match('Chi2', type): 60 file.write(self.grace_header(type + ' values', subtitle, 'Residue Number', type, 'xy')) 61 else: 62 file.write(self.grace_header(type + ' values', subtitle, 'Residue Number', type, 'xydy')) 63 64 for res in range(len(self.mf.data.results)): 65 if match('S2', type) and self.mf.data.results[res]['s2']: 66 file.write(self.mf.data.results[res]['res_num'] + " ") 67 file.write(`self.mf.data.results[res]['s2']` + " ") 68 file.write(`self.mf.data.results[res]['s2_err']` + "\n") 69 elif match('S2s', type) and self.mf.data.results[res]['s2s']: 70 file.write(self.mf.data.results[res]['res_num'] + " ") 71 file.write(`self.mf.data.results[res]['s2s']` + " ") 72 file.write(`self.mf.data.results[res]['s2s_err']` + "\n") 73 elif match('S2f', type) and self.mf.data.results[res]['s2f']: 74 file.write(self.mf.data.results[res]['res_num'] + " ") 75 file.write(`self.mf.data.results[res]['s2f']` + " ") 76 file.write(`self.mf.data.results[res]['s2f_err']` + "\n") 77 elif match('te', type) and self.mf.data.results[res]['te']: 78 file.write(self.mf.data.results[res]['res_num'] + " ") 79 file.write(`self.mf.data.results[res]['te']` + " ") 80 file.write(`self.mf.data.results[res]['te_err']` + "\n") 81 elif match('Rex', type) and self.mf.data.results[res]['rex']: 82 file.write(self.mf.data.results[res]['res_num'] + " ") 83 file.write(`self.mf.data.results[res]['rex']` + " ") 84 file.write(`self.mf.data.results[res]['rex_err']` + "\n") 85 elif match('Chi2', type) and self.mf.data.results[res]['chi2']: 86 file.write(self.mf.data.results[res]['res_num'] + " ") 87 file.write(`self.mf.data.results[res]['chi2']` + "\n") 88 file.write("&\n") 89 file.close()
90 91
92 - def grace_header(self, title, subtitle, x, y, type):
93 "Create and return a grace header." 94 95 text = "@version 50100\n" 96 text = text + "@with g0\n" 97 if match('Residue Number', x): 98 text = text + "@ world xmax 165\n" 99 if match('R1', x) and match('Chi2', y): 100 text = text + "@ world xmin 0.8\n" 101 text = text + "@ world xmax 2\n" 102 text = text + "@ world ymin 0\n" 103 text = text + "@ world ymax 2000\n" 104 if match('R2', x) and match('Chi2', y): 105 text = text + "@ world xmin 5\n" 106 text = text + "@ world xmax 45\n" 107 text = text + "@ world ymin 0\n" 108 text = text + "@ world ymax 2000\n" 109 if match('NOE', x) and match('Chi2', y): 110 text = text + "@ world xmin 0\n" 111 text = text + "@ world xmax 1\n" 112 text = text + "@ world ymin 0\n" 113 text = text + "@ world ymax 2000\n" 114 text = text + "@ view xmax 1.22\n" 115 text = text + "@ title \"" + title + "\"\n" 116 text = text + "@ subtitle \"" + subtitle + "\"\n" 117 text = text + "@ xaxis label \"" + x + "\"\n" 118 if match('Residue Number', x): 119 text = text + "@ xaxis tick major 10\n" 120 if match('R1', x) and match('Chi2', y): 121 text = text + "@ xaxis tick major 0.2\n" 122 if match('R2', x) and match('Chi2', y): 123 text = text + "@ xaxis tick major 5\n" 124 if match('NOE', x) and match('Chi2', y): 125 text = text + "@ xaxis tick major 0.1\n" 126 text = text + "@ xaxis tick major size 0.480000\n" 127 text = text + "@ xaxis tick major linewidth 0.5\n" 128 text = text + "@ xaxis tick minor linewidth 0.5\n" 129 text = text + "@ xaxis tick minor size 0.240000\n" 130 text = text + "@ xaxis ticklabel char size 0.790000\n" 131 text = text + "@ yaxis label \"" + y + "\"\n" 132 if match('R1', x) and match('Chi2', y): 133 text = text + "@ yaxis tick major 200\n" 134 if match('R2', x) and match('Chi2', y): 135 text = text + "@ yaxis tick major 200\n" 136 if match('NOE', x) and match('Chi2', y): 137 text = text + "@ yaxis tick major 200\n" 138 text = text + "@ yaxis tick major size 0.480000\n" 139 text = text + "@ yaxis tick major linewidth 0.5\n" 140 text = text + "@ yaxis tick minor linewidth 0.5\n" 141 text = text + "@ yaxis tick minor size 0.240000\n" 142 text = text + "@ yaxis ticklabel char size 0.790000\n" 143 text = text + "@ frame linewidth 0.5\n" 144 text = text + "@ s0 symbol 1\n" 145 text = text + "@ s0 symbol size 0.49\n" 146 text = text + "@ s0 symbol fill pattern 1\n" 147 text = text + "@ s0 symbol linewidth 0.5\n" 148 text = text + "@ s0 line linestyle 0\n" 149 text = text + "@target G0.S0\n@type " + type + "\n" 150 return text
151 152
153 - def log_input_info(self):
154 for i in range(self.mf.data.num_ri): 155 self.mf.log.write('%-25s%-20s\n' % ("Data label:", self.mf.data.data_types[i])) 156 #self.mf.log.write('%-25s%-20s\n' % ("NMR frequency label:", self.mf.data.frq_label[i])) 157 #self.mf.log.write('%-25s%-20s\n' % ("NMR proton frequency:", `self.mf.data.frq[i]`)) 158 self.mf.log.write('%-25s%-20s\n\n' % ("File name:", self.mf.data.files[i])) 159 self.mf.log.write("Number of frequencies:\t" + `self.mf.data.num_frq` + "\n") 160 self.mf.log.write("Number of data sets:\t" + `self.mf.data.num_ri` + "\n\n")
161 162
163 - def log_params(self, name, mdx):
164 "Put the parameter data structures into the log file." 165 166 self.mf.log.write("\n" + name + " data structure\n") 167 for param in ['tloc', 'theta', 'ss2', 'sf2', 'te', 'rex']: 168 self.mf.log.write('%-10s' % ( param + ":" )) 169 self.mf.log.write('%-15s' % ( "start = " + mdx[param]['start'] )) 170 self.mf.log.write('%-11s' % ( "flag = " + mdx[param]['flag'] )) 171 self.mf.log.write('%-13s' % ( "bound = " + mdx[param]['bound'] )) 172 self.mf.log.write('%-20s' % ( "lower = " + mdx[param]['lower'] )) 173 self.mf.log.write('%-20s' % ( "upper = " + mdx[param]['upper'] )) 174 self.mf.log.write('%-10s\n' % ( "steps = " + mdx[param]['steps'] ))
175 176
177 - def print_results(self):
178 "Print the results into the results file." 179 180 file = open('results', 'w') 181 182 file.write('%-6s%-6s%-13s%-13s%-13s' % ( 'ResNo', 'Model', ' S2', ' S2f', ' S2s' )) 183 file.write('%-19s%-13s%-10s\n' % ( ' te', ' Rex', ' Chi2' )) 184 sys.stdout.write("[") 185 for res in range(len(self.mf.data.results)): 186 sys.stdout.write("-") 187 file.write('%-6s' % self.mf.data.results[res]['res_num']) 188 file.write('%-6s' % self.mf.data.results[res]['model']) 189 190 if self.mf.data.results[res]['model'] in ["1", "2", "3", "4", "5"]: 191 file.write('%5.3f%1s%-5.3f ' % ( self.mf.data.results[res]['s2'], '±', self.mf.data.results[res]['s2_err'] )) 192 else: 193 file.write('%13s' % '') 194 if self.mf.data.results[res]['model'] in ["5"]: 195 file.write('%5.3f%1s%-5.3f ' % ( self.mf.data.results[res]['s2f'], '±', self.mf.data.results[res]['s2f_err'] )) 196 file.write('%5.3f%1s%-5.3f ' % ( self.mf.data.results[res]['s2s'], '±', self.mf.data.results[res]['s2s_err'] )) 197 else: 198 file.write('%26s' % '') 199 if self.mf.data.results[res]['model'] in ["2", "4", "5"]: 200 file.write('%8.2f%1s%-8.2f ' % ( self.mf.data.results[res]['te'], '±', self.mf.data.results[res]['te_err'] )) 201 else: 202 file.write('%19s' % '') 203 if self.mf.data.results[res]['model'] in ["3", "4"]: 204 file.write('%5.3f%1s%-5.3f ' % ( self.mf.data.results[res]['rex'], '±', self.mf.data.results[res]['rex_err'] )) 205 else: 206 file.write('%13s' % '') 207 file.write('%10.3f\n' % self.mf.data.results[res]['chi2']) 208 sys.stdout.write("]\n") 209 210 file.close()
211 212
213 - def stage_selection(self):
214 "The stage for model selection common to all techniques." 215 216 print "\n[ Model-free data extraction ]\n" 217 self.extract_mf_data() 218 219 print "\n[ " + self.mf.usr_param.method + " model selection ]\n" 220 self.model_selection.run() 221 222 print "\n[ Printing results ]\n" 223 self.print_results() 224 225 print "\n[ Placing data structures into \"data_all\" ]\n" 226 self.print_data() 227 228 print "\n[ Grace file creation ]\n" 229 self.mf.file_ops.mkdir('grace') 230 self.grace('grace/S2.agr', 'S2', subtitle="After model selection, unoptimised") 231 self.grace('grace/S2f.agr', 'S2f', subtitle="After model selection, unoptimised") 232 self.grace('grace/S2s.agr', 'S2s', subtitle="After model selection, unoptimised") 233 self.grace('grace/te.agr', 'te', subtitle="After model selection, unoptimised") 234 self.grace('grace/Rex.agr', 'Rex', subtitle="After model selection, unoptimised") 235 self.grace('grace/Chi2.agr', 'Chi2', subtitle="After model selection, unoptimised")
236 237
238 - def update_data(self):
239 "Extract all the information from the input info." 240 241 242 trans_table = [] 243 trans_frq_table = [] 244 last_frq = 0.0 245 self.mf.data.num_ri = len(self.mf.usr_param.input_info) 246 247 # Create the frequency data structures. 248 for i in range(self.mf.data.num_ri): 249 flag = 1 250 if len(self.mf.data.frq) > 0: 251 for frq in range(len(self.mf.data.frq)): 252 if self.mf.usr_param.input_info[i][2] == self.mf.data.frq[frq]: 253 flag = 0 254 # Update entries. 255 if flag: 256 self.mf.data.num_frq = self.mf.data.num_frq + 1 257 self.mf.data.frq_label.append(self.mf.usr_param.input_info[i][1]) 258 self.mf.data.frq.append(float(self.mf.usr_param.input_info[i][2])) 259 trans_frq_table.append(self.mf.data.num_frq + 1) 260 last_frq = self.mf.usr_param.input_info[i][2] 261 262 # Fill the data structures with nothing. 263 self.mf.data.data_types.append(None) 264 self.mf.data.data_files.append(None) 265 self.mf.data.remap_table.append(None) 266 self.mf.data.noe_r1_table.append(None) 267 trans_table.append(None) 268 269 # Rearrange the data in self.mf.usr_param.input_info by creating the translation table 'trans_table' 270 counter = 0 271 for frq in range(len(self.mf.data.frq)): 272 for i in range(self.mf.data.num_ri): 273 if self.mf.data.frq[frq] == self.mf.usr_param.input_info[i][2]: 274 if match('R1', self.mf.usr_param.input_info[i][0]): 275 trans_table[i] = counter 276 counter = counter + 1 277 for i in range(self.mf.data.num_ri): 278 if self.mf.data.frq[frq] == self.mf.usr_param.input_info[i][2]: 279 if match('R2', self.mf.usr_param.input_info[i][0]): 280 trans_table[i] = counter 281 counter = counter + 1 282 for i in range(self.mf.data.num_ri): 283 if self.mf.data.frq[frq] == self.mf.usr_param.input_info[i][2]: 284 if match('NOE', self.mf.usr_param.input_info[i][0]): 285 trans_table[i] = counter 286 counter = counter + 1 287 288 # Fill the data structures using the trans_table to reorder. 289 for i in range(self.mf.data.num_ri): 290 self.mf.data.data_types[trans_table[i]] = self.mf.usr_param.input_info[i][0] 291 self.mf.data.data_files[trans_table[i]] = self.mf.usr_param.input_info[i][3] 292 for frq in range(len(self.mf.data.frq)): 293 if self.mf.data.frq[frq] == self.mf.usr_param.input_info[i][2]: 294 self.mf.data.remap_table[trans_table[i]] = frq 295 if match('NOE', self.mf.usr_param.input_info[i][0]): 296 for j in range(self.mf.data.num_ri): 297 if match('R1', self.mf.usr_param.input_info[j][0]) and self.mf.usr_param.input_info[i][2] == self.mf.usr_param.input_info[j][2]: 298 self.mf.data.noe_r1_table[trans_table[i]] = trans_table[j] 299 300 if self.mf.debug: 301 print "%-20s%-20s" % ("Input info:", `self.mf.usr_param.input_info`) 302 print "%-20s%-20s" % ("Trans frq table:", `trans_frq_table`) 303 print "%-20s%-20s" % ("Trans table:", `trans_table`) 304 print "%-20s%-20i" % ("Num ri:", self.mf.data.num_ri) 305 print "%-20s%-20i" % ("Num frq:", self.mf.data.num_frq) 306 print "%-20s%-20s" % ("Data types:", `self.mf.data.data_types`) 307 print "%-20s%-20s" % ("Data files:", `self.mf.data.data_files`) 308 print "%-20s%-20s" % ("Remap table:", `self.mf.data.remap_table`) 309 print "%-20s%-20s" % ("NOE to R1 table:", `self.mf.data.noe_r1_table`) 310 print "%-20s%-20s" % ("Frq labels:", `self.mf.data.frq_label`) 311 print "%-20s%-20s" % ("Frqs:", `self.mf.data.frq`) 312 print "\n"
313