Package model_selection :: Module farrow
[hide private]
[frames] | no frames]

Source Code for Module model_selection.farrow

  1  # The method given by Farrow et al., 1994: 
  2  # 
  3  #       Stage 1:   Creation of the files for the initial model-free calculations for models 1 to 5, 
  4  #               and f-tests between them. 
  5  #       Stage 2:   Model selection. 
  6  # 
  7   
  8  import sys 
  9  from re import match 
 10   
 11  from common_ops import common_operations 
 12   
 13   
14 -class farrow(common_operations):
15 - def __init__(self, mf):
16 """The model-free analysis of Farrow. 17 18 Farrow's method for model-free analysis. (Farrow et al., 1994) 19 """ 20 self.mf = mf
21 22
23 - def farrows_tests(self):
24 "Check the 95% confidence limits and if the parameter is greater than its error." 25 26 data = self.mf.data.data 27 relax_data = self.mf.data.relax_data 28 29 for res in range(len(relax_data[0])): 30 for model in self.mf.data.runs: 31 # 95% confidence limit test. 32 fail = 0 33 for i in range(self.mf.data.num_ri): 34 label_fit = self.mf.data.frq_label[self.mf.data.remap_table[i]] + "_" + self.mf.data.data_types[i] + "_fit" 35 diff = self.mf.data.relax_data[i][res][2] - self.mf.data.data[model][res][label_fit] 36 if diff < 0: 37 diff = -diff 38 limit = 1.96 * float(relax_data[i][res][3]) 39 if diff > limit: 40 fail = fail + 1 41 if fail == 0: 42 data[model][res]['conf_lim'] = 1 43 else: 44 data[model][res]['conf_lim'] = 0 45 46 # Parameter greater than err test. 47 if match('m1', model): 48 params = [ data[model][res]['s2'] ] 49 errs = [ data[model][res]['s2_err'] ] 50 if match('m2', model): 51 params = [ data[model][res]['s2'], data[model][res]['te'] ] 52 errs = [ data[model][res]['s2_err'], data[model][res]['te_err'] ] 53 if match('m3', model): 54 params = [ data[model][res]['s2'], data[model][res]['rex'] ] 55 errs = [ data[model][res]['s2_err'], data[model][res]['rex_err'] ] 56 if match('m4', model): 57 params = [ data[model][res]['s2'], data[model][res]['te'], data[model][res]['rex'] ] 58 errs = [ data[model][res]['s2_err'], data[model][res]['te_err'], data[model][res]['rex_err'] ] 59 if match('m5', model): 60 params = [ data[model][res]['s2f'], data[model][res]['s2s'], data[model][res]['te'] ] 61 errs = [ data[model][res]['s2f_err'], data[model][res]['s2s_err'], data[model][res]['te_err'] ] 62 data[model][res]['param_test'] = self.test_param(params, errs)
63 64
65 - def model_selection(self):
66 "Farrow's model selection." 67 68 data = self.mf.data.data 69 self.farrows_tests() 70 71 if self.mf.debug: 72 self.mf.log.write("\n\n<<< Farrow's model selection >>>\n\n") 73 74 for res in range(len(self.mf.data.relax_data[0])): 75 self.mf.data.results.append({}) 76 77 if self.mf.debug: 78 self.mf.log.write('%-22s\n' % ( "Checking res " + data['m1'][res]['res_num'] )) 79 80 self.model = '0' 81 82 # Model 1 to 5 tests. 83 model_tests = [ 0, 0, 0, 0, 0 ] 84 if data['m1'][res]['conf_lim'] and data['m1'][res]['param_test']: 85 model_tests[0] = 1 86 if data['m2'][res]['conf_lim'] and data['m2'][res]['param_test']: 87 model_tests[1] = 1 88 if data['m3'][res]['conf_lim'] and data['m3'][res]['param_test']: 89 model_tests[2] = 1 90 if data['m4'][res]['conf_lim'] and data['m4'][res]['param_test']: 91 model_tests[3] = 1 92 if data['m5'][res]['conf_lim'] and data['m5'][res]['param_test']: 93 model_tests[4] = 1 94 95 # Check if multiple models pass (m1 to m4). 96 # Pick the model with the lowest chi squared value. 97 for i in range(4): 98 if match('0', self.model) and model_tests[i]: 99 self.model = `i + 1` 100 elif not match('0', self.model) and model_tests[i]: 101 # Test if the chi2 of this new model is lower than the chi2 of the old. 102 if data["m"+`i+1`][res]['chi2'] < data["m"+self.model][res]['chi2']: 103 self.model = `i + 1` 104 105 # Model 5 test (only if no other models fit). 106 if match('0', self.model) and model_tests[4]: 107 self.model = '5' 108 109 # Fill in the results. 110 if not match('0', self.model): 111 self.mf.data.results[res] = self.fill_results(data["m"+self.model][res], model=self.model) 112 else: 113 self.mf.data.results[res] = self.fill_results(data['m1'][res], model='0')
114 115
116 - def print_data(self):
117 "Print all the data into the 'data_all' file." 118 119 file = open('data_all', 'w') 120 121 sys.stdout.write("[") 122 for res in range(len(self.mf.data.results)): 123 sys.stdout.write("-") 124 file.write("\n\n<<< Residue " + self.mf.data.results[res]['res_num']) 125 file.write(", Model " + self.mf.data.results[res]['model'] + " >>>\n") 126 file.write('%-20s' % '') 127 file.write('%-19s' % 'Model 1') 128 file.write('%-19s' % 'Model 2') 129 file.write('%-19s' % 'Model 3') 130 file.write('%-19s' % 'Model 4') 131 file.write('%-19s' % 'Model 5') 132 133 # S2. 134 file.write('\n%-20s' % 'S2') 135 for model in self.mf.data.runs: 136 file.write('%9.3f' % self.mf.data.data[model][res]['s2']) 137 file.write('%1s' % '±') 138 file.write('%-9.3f' % self.mf.data.data[model][res]['s2_err']) 139 140 # S2f. 141 file.write('\n%-20s' % 'S2f') 142 for model in self.mf.data.runs: 143 file.write('%9.3f' % self.mf.data.data[model][res]['s2f']) 144 file.write('%1s' % '±') 145 file.write('%-9.3f' % self.mf.data.data[model][res]['s2f_err']) 146 147 # S2s. 148 file.write('\n%-20s' % 'S2s') 149 for model in self.mf.data.runs: 150 file.write('%9.3f' % self.mf.data.data[model][res]['s2s']) 151 file.write('%1s' % '±') 152 file.write('%-9.3f' % self.mf.data.data[model][res]['s2s_err']) 153 154 # te. 155 file.write('\n%-20s' % 'te') 156 for model in self.mf.data.runs: 157 file.write('%9.2f' % self.mf.data.data[model][res]['te']) 158 file.write('%1s' % '±') 159 file.write('%-9.2f' % self.mf.data.data[model][res]['te_err']) 160 161 # Rex. 162 file.write('\n%-20s' % 'Rex') 163 for model in self.mf.data.runs: 164 file.write('%9.3f' % self.mf.data.data[model][res]['rex']) 165 file.write('%1s' % '±') 166 file.write('%-9.3f' % self.mf.data.data[model][res]['rex_err']) 167 168 # Chi2. 169 file.write('\n%-20s' % 'Chi2') 170 for model in self.mf.data.runs: 171 file.write('%-19.3f' % self.mf.data.data[model][res]['chi2']) 172 173 # 95% confidence limits. 174 file.write('\n%-20s' % '95% conf limits') 175 for model in self.mf.data.runs: 176 file.write('%-19i' % self.mf.data.data[model][res]['conf_lim']) 177 178 # Parameters greater than errors test. 179 file.write('\n%-20s' % 'params > errs') 180 for model in self.mf.data.runs: 181 file.write('%-19i' % self.mf.data.data[model][res]['param_test']) 182 183 # Relaxation values 184 for i in range(self.mf.data.num_ri): 185 file.write('\n%-20s' % (self.mf.data.frq_label[self.mf.data.remap_table[i]] + " " + self.mf.data.data_types[i])) 186 for model in self.mf.data.runs: 187 label_fit = self.mf.data.frq_label[self.mf.data.remap_table[i]] + "_" + self.mf.data.data_types[i] + "_fit" 188 file.write('%9.3f' % self.mf.data.relax_data[i][res][2]) 189 file.write('%1s' % "|") 190 file.write('%-9.3f' % self.mf.data.data[model][res][label_fit]) 191 file.write('\n %-20s' % "diff ± 95%") 192 for model in self.mf.data.runs: 193 label_fit = self.mf.data.frq_label[self.mf.data.remap_table[i]] + "_" + self.mf.data.data_types[i] + "_fit" 194 diff = self.mf.data.relax_data[i][res][2] - self.mf.data.data[model][res][label_fit] 195 if diff < 0: 196 diff = -diff 197 file.write('%9.3f' % diff) 198 file.write('%1s' % '±') 199 file.write('%-9.3f' % (1.96 * float(self.mf.data.relax_data[i][res][3]))) 200 201 202 file.write('\n') 203 sys.stdout.write("]\n") 204 file.close()
205