1 from re import match
2 from string import split
3
6 "Class to extract model-free data from the STAR formatted mfout file."
7
8 self.mf = mf
9
10
12 "Extract the data from the mfout file and Return it as a 2D data structure."
13
14 self.mfout = mfout
15 self.num_res = num_res
16 self.chi2_lim = chi2_lim
17 self.ftest_lim = ftest_lim
18 self.ftest = ftest
19
20 self.data = []
21 for i in range(self.num_res):
22 self.data.append({})
23 self.line_num = 0
24
25 if match('n', self.ftest):
26 self.get_relax_values()
27 self.get_s2()
28 self.get_s2f()
29 self.get_s2s()
30 self.get_te()
31 self.get_rex()
32 self.get_chi2()
33 elif match('y', self.ftest):
34 self.get_ftest()
35
36 return self.data
37
38
40
41 for line in range(len(self.mfout)):
42 self.row = split(self.mfout[line])
43 try:
44 self.row[0]
45 except IndexError:
46 continue
47
48 if match('data_sse', self.row[0]):
49 self.line_num = line + 3
50 break
51 if match('y', self.mf.data.mfin.sims):
52 self.line_num = self.line_num + 2
53 for i in range(self.num_res):
54 self.row = [[]]
55 self.row[0] = split(self.mfout[self.line_num])
56 percentile = int(self.chi2_lim * 100.0 / 5.0)
57 self.line_num = self.line_num + percentile
58 self.row.append(split(self.mfout[self.line_num]))
59 lines_next_res = 2 + ( 20 - int(percentile) )
60 self.line_num = self.line_num + lines_next_res
61 self.data[i]['chi2'] = float(self.row[0][1])
62 self.data[i]['chi2_lim'] = float(self.row[1][1])
63 else:
64 self.split_rows(self.line_num, self.num_res)
65 for i in range(self.num_res):
66 self.data[i]['chi2'] = float(self.row[i][1])
67
68
70
71 for line in range(len(self.mfout)):
72 self.row = [[]]
73 self.row[0] = split(self.mfout[line])
74 try:
75 self.row[0][0]
76 except IndexError:
77 continue
78 if match('data_F_dist', self.row[0][0]):
79 self.line_num = line + 5
80 break
81 for i in range(self.num_res):
82 self.row = [[]]
83 self.row[0] = split(self.mfout[self.line_num])
84 percentile = int(self.ftest_lim * 100.0 / 5.0)
85 self.line_num = self.line_num + percentile
86 self.row.append(split(self.mfout[self.line_num]))
87 lines_next_res = 2 + ( 20 - int(percentile) )
88 self.line_num = self.line_num + lines_next_res
89 self.data[i]['res_num'] = self.row[0][0]
90 self.data[i]['fstat'] = float(self.row[0][1])
91 self.data[i]['fstat_lim'] = float(self.row[1][1])
92
93
95
96 for line in range(len(self.mfout)):
97 self.row = split(self.mfout[line])
98 try:
99 self.row[0]
100 except IndexError:
101 continue
102
103 if match('data_relaxation', self.row[0]):
104 self.line_num = line + 7
105 break
106 for i in range(self.mf.data.num_ri):
107 self.split_rows(self.line_num, self.num_res)
108
109 label = self.mf.data.frq_label[self.mf.data.remap_table[i]] + "_" + self.mf.data.data_types[i]
110 label_err = self.mf.data.frq_label[self.mf.data.remap_table[i]] + "_" + self.mf.data.data_types[i] + "_err"
111 label_fit = self.mf.data.frq_label[self.mf.data.remap_table[i]] + "_" + self.mf.data.data_types[i] + "_fit"
112
113 for i in range(self.num_res):
114 self.data[i][label] = float(self.row[i][1])
115 self.data[i][label_err] = float(self.row[i][2])
116 self.data[i][label_fit] = float(self.row[i][4])
117
118 self.line_num = self.line_num + self.num_res + 3
119
120
122
123 for line in range(len(self.mfout)):
124 self.row = split(self.mfout[line])
125 try:
126 self.row[0]
127 except IndexError:
128 continue
129
130 if match('Rex', self.row[0]):
131 self.line_num = line + 1
132 break
133 self.split_rows(self.line_num, self.num_res)
134 for i in range(self.num_res):
135 self.data[i]['rex'] = float(self.row[i][1])
136 self.data[i]['rex_err'] = float(self.row[i][5])
137
138
140
141 for line in range(len(self.mfout)):
142 self.row = split(self.mfout[line])
143 try:
144 self.row[0]
145 except IndexError:
146 continue
147
148 if match('S2', self.row[0]):
149 self.line_num = line + 1
150 break
151 self.split_rows(self.line_num, self.num_res)
152 for i in range(self.num_res):
153 self.data[i]['res_num'] = self.row[i][0]
154 self.data[i]['s2'] = float(self.row[i][1])
155 self.data[i]['s2_err'] = float(self.row[i][5])
156
157
159
160 for line in range(len(self.mfout)):
161 self.row = split(self.mfout[line])
162 try:
163 self.row[0]
164 except IndexError:
165 continue
166
167 if match('S2f', self.row[0]):
168 self.line_num = line + 1
169 break
170 self.split_rows(self.line_num, self.num_res)
171 for i in range(self.num_res):
172 self.data[i]['s2f'] = float(self.row[i][1])
173 self.data[i]['s2f_err'] = float(self.row[i][5])
174
175
177
178 for line in range(len(self.mfout)):
179 self.row = split(self.mfout[line])
180 try:
181 self.row[0]
182 except IndexError:
183 continue
184
185 if match('S2s', self.row[0]):
186 self.line_num = line + 1
187 break
188 self.split_rows(self.line_num, self.num_res)
189 for i in range(self.num_res):
190 self.data[i]['s2s'] = float(self.row[i][1])
191 self.data[i]['s2s_err'] = float(self.row[i][5])
192
193
195
196 for line in range(len(self.mfout)):
197 self.row = split(self.mfout[line])
198 try:
199 self.row[0]
200 except IndexError:
201 continue
202
203 if match('te', self.row[0]):
204 self.line_num = line + 1
205 break
206 self.split_rows(self.line_num, self.num_res)
207 for i in range(self.num_res):
208 self.data[i]['te'] = float(self.row[i][1])
209 self.data[i]['te_err'] = float(self.row[i][5])
210
211
213 "Get the next 'num_res' lines after a match."
214
215 for i in range(num_lines):
216 if i == 0:
217 self.row = [[]]
218 self.row[0] = split(self.mfout[line_num])
219 else:
220 self.row.append(split(self.mfout[line_num + i]))
221