1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 from re import compile, match
25 import sys
26
27
30 """Class containing functions for the setting up of data structures."""
31
32 self.relax = relax
33
34
35 - def copy(self, run1=None, run2=None, data_type=None):
36 """Function for copying residue specific data values from run1 to run2."""
37
38
39 self.data_type = data_type
40
41
42 if not run1 in self.relax.data.run_names:
43 raise RelaxNoRunError, run1
44
45
46 if not run2 in self.relax.data.run_names:
47 raise RelaxNoRunError, run2
48
49
50 if not self.relax.data.res.has_key(run1):
51 raise RelaxNoSequenceError, run1
52
53
54 if not self.relax.data.res.has_key(run2):
55 raise RelaxNoSequenceError, run2
56
57
58 function_type = self.relax.data.run_types[self.relax.data.run_names.index(run1)]
59
60
61 return_value = self.relax.specific_setup.setup('return_value', function_type)
62
63
64 set = self.relax.specific_setup.setup('set', function_type)
65
66
67 for i in xrange(len(self.relax.data.res[run2])):
68
69 value, error = return_value(run2, i, data_type)
70
71
72 if value != None or error != None:
73 raise RelaxValueError, (data_type, run2)
74
75
76 for i in xrange(len(self.relax.data.res[run1])):
77
78 value, error = return_value(run1, i, data_type)
79
80
81 set(run=run2, value=value, error=error, data_type=data_type, index=i)
82
83
84 self.reset_min_stats(run2, i)
85
86
87 - def display(self, run=None, data_type=None):
104
105
106 - def read(self, run=None, data_type=None, file=None, num_col=0, name_col=1, data_col=2, error_col=3, sep=None):
107 """Function for reading residue specific data values from a file."""
108
109
110 self.run = run
111 self.data_type = data_type
112
113
114 if not self.run in self.relax.data.run_names:
115 raise RelaxNoRunError, self.run
116
117
118 if not self.relax.data.res.has_key(self.run):
119 raise RelaxNoSequenceError, self.run
120
121
122 function_type = self.relax.data.run_types[self.relax.data.run_names.index(self.run)]
123
124
125 return_value = self.relax.specific_setup.setup('return_value', function_type)
126
127
128 set = self.relax.specific_setup.setup('set', function_type)
129
130
131 for i in xrange(len(self.relax.data.res[self.run])):
132
133 value, error = return_value(self.run, i, data_type)
134
135
136 if value != None or error != None:
137 raise RelaxValueError, (data_type, self.run)
138
139
140 file_data = self.relax.IO.extract_data(file)
141
142
143 header_lines = 0
144 for i in xrange(len(file_data)):
145 try:
146 int(file_data[i][num_col])
147 except:
148 header_lines = header_lines + 1
149 else:
150 break
151
152
153 file_data = file_data[header_lines:]
154
155
156 file_data = self.relax.IO.strip(file_data)
157
158
159 if not file_data:
160 raise RelaxFileEmptyError
161
162
163 for i in xrange(len(file_data)):
164 try:
165
166 int(file_data[i][num_col])
167
168
169 if file_data[i][data_col] != 'None':
170 float(file_data[i][data_col])
171
172
173 if error_col != None and file_data[i][error_col] != 'None':
174 float(file_data[i][error_col])
175
176 except ValueError:
177 if error_col != None:
178 raise RelaxError, "The data is invalid (num=" + file_data[i][num_col] + ", name=" + file_data[i][name_col] + ", data=" + file_data[i][data_col] + ", error=" + file_data[i][error_col] + ")."
179 else:
180 raise RelaxError, "The data is invalid (num=" + file_data[i][num_col] + ", name=" + file_data[i][name_col] + ", data=" + file_data[i][data_col] + ")."
181
182
183 for i in xrange(len(file_data)):
184
185 res_num = int(file_data[i][num_col])
186
187
188 res_name = file_data[i][name_col]
189
190
191 if file_data[i][data_col] != 'None':
192 value = float(file_data[i][data_col])
193 else:
194 value = None
195
196
197 if error_col != None and file_data[i][error_col] != 'None':
198 error = float(file_data[i][error_col])
199 else:
200 error = None
201
202
203 index = None
204 for j in xrange(len(self.relax.data.res[self.run])):
205 if self.relax.data.res[self.run][j].num == res_num and self.relax.data.res[self.run][j].name == res_name:
206 index = j
207 break
208 if index == None:
209 raise RelaxNoResError, (res_num, res_name)
210
211
212 set(run=run, value=value, error=error, data_type=data_type, index=i)
213
214
215 self.reset_min_stats(self.run, i)
216
217
218 - def set(self, run=None, value=None, data_type=None, res_num=None, res_name=None, force=0):
219 """Function for setting residue specific data values."""
220
221
222 if not run in self.relax.data.run_names:
223 raise RelaxNoRunError, run
224
225
226 if not self.relax.data.res.has_key(run):
227 raise RelaxNoSequenceError, run
228
229
230 if type(res_num) == str:
231 try:
232 compile(res_num)
233 except:
234 raise RelaxRegExpError, ('residue number', res_num)
235
236
237 if res_name:
238 try:
239 compile(res_name)
240 except:
241 raise RelaxRegExpError, ('residue name', res_name)
242
243
244 function_type = self.relax.data.run_types[self.relax.data.run_names.index(run)]
245
246
247 return_value = self.relax.specific_setup.setup('return_value', function_type)
248
249
250 set = self.relax.specific_setup.setup('set', function_type)
251
252
253 if data_type and not force:
254
255 if type(data_type) == str:
256 data_type_array = [data_type]
257 else:
258 data_type_array = data_type
259
260
261 for i in xrange(len(self.relax.data.res[run])):
262
263 if not self.relax.data.res[run][i].select:
264 continue
265
266
267 if type(res_num) == int and not self.relax.data.res[run][i].num == res_num:
268 continue
269 elif type(res_num) == str and not match(res_num, `self.relax.data.res[run][i].num`):
270 continue
271
272
273 if res_name != None and not match(res_name, self.relax.data.res[run][i].name):
274 continue
275
276
277 for name in data_type_array:
278
279 temp_value, temp_error = return_value(run, i, name)
280
281
282 if temp_value != None or temp_error != None:
283 raise RelaxValueError, (name, run)
284
285
286 for i in xrange(len(self.relax.data.res[run])):
287
288
289
290
291 if not self.relax.data.res[run][i].select:
292 continue
293
294
295 if type(res_num) == int and not self.relax.data.res[run][i].num == res_num:
296 continue
297 elif type(res_num) == str and not match(res_num, `self.relax.data.res[run][i].num`):
298 continue
299
300
301 if res_name != None and not match(res_name, self.relax.data.res[run][i].name):
302 continue
303
304
305
306
307
308
309 if data_type == None:
310 set(run=run, value=value, error=None, data_type=data_type, index=i)
311
312
313 if type(data_type) == str:
314 set(run=run, value=value, error=None, data_type=data_type, index=i)
315
316
317 if type(data_type) == list:
318 for j in xrange(len(data_type)):
319
320 if type(value) == None:
321 val = None
322 elif type(value) == list:
323 val = value[j]
324 else:
325 val = value
326
327
328 set(run=run, value=val, error=None, data_type=data_type[j], index=i)
329
330
331 self.reset_min_stats(run, i)
332
333
335 """Reset the minimisation statistics."""
336
337
338 if hasattr(self.relax.data.res[run][i], 'chi2'):
339 self.relax.data.res[run][i].chi2 = None
340
341
342 if hasattr(self.relax.data.res[run][i], 'iter'):
343 self.relax.data.res[run][i].iter = None
344
345
346 if hasattr(self.relax.data.res[run][i], 'f_count'):
347 self.relax.data.res[run][i].f_count = None
348
349
350 if hasattr(self.relax.data.res[run][i], 'g_count'):
351 self.relax.data.res[run][i].g_count = None
352
353
354 if hasattr(self.relax.data.res[run][i], 'h_count'):
355 self.relax.data.res[run][i].h_count = None
356
357
358 if hasattr(self.relax.data.res[run][i], 'warning'):
359 self.relax.data.res[run][i].warning = None
360
361
362 - def write(self, run=None, data_type=None, file=None, dir=None, force=0):
384
385
386 - def write_data(self, run, data_type, file, return_value=None):
387 """Function for writing data."""
388
389
390 if not return_value:
391
392 function_type = self.relax.data.run_types[self.relax.data.run_names.index(run)]
393
394
395 return_value = self.relax.specific_setup.setup('return_value', function_type)
396
397
398 file.write("%-5s%-6s%-30s%-30s\n" % ('Num', 'Name', 'Value', 'Error'))
399
400
401 for i in xrange(len(self.relax.data.res[run])):
402
403 data = self.relax.data.res[run][i]
404
405
406 value, error = return_value(run, i, data_type)
407
408
409 file.write("%-5i%-6s%-30s%-30s\n" % (data.num, data.name, `value`, `error`))
410