1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 from os import sep
24 import wx
25
26
27 from data_store import Relax_data_store; ds = Relax_data_store()
28 from pipe_control.interatomic import interatomic_loop
29 from pipe_control.mol_res_spin import spin_loop
30 from status import Status; status = Status()
31 from test_suite.gui_tests.base_classes import GuiTestCase
32
33
34 from gui.analyses import auto_model_free
35 from gui.interpreter import Interpreter; interpreter = Interpreter()
36 from gui.string_conv import str_to_gui
37 from gui.uf_objects import Uf_storage; uf_store = Uf_storage()
38
39
40 -class Mf(GuiTestCase):
41 """Class for testing various aspects specific to the model-free auto-analysis."""
42
44 """Catch U{bug #20479<https://web.archive.org/web/https://gna.org/bugs/?20479>}, the failure to load a relax state in the GUI.
45
46 This was reported by U{Stanislava Panova<https://web.archive.org/web/https://gna.org/users/stacy>}.
47 """
48
49
50 self.app.gui.analysis.menu_new(None)
51 page = self.app.gui.analysis.new_wizard.wizard.get_page(0)
52 page.select_mf(None)
53 page.analysis_name.SetValue(str_to_gui("Model-free test"))
54 self.app.gui.analysis.new_wizard.wizard._go_next(None)
55 page = self.app.gui.analysis.new_wizard.wizard.get_page(1)
56 self.app.gui.analysis.new_wizard.wizard._go_next(None)
57
58
59 analysis_type, analysis_name, pipe_name, pipe_bundle, uf_exec = self.app.gui.analysis.new_wizard.get_data()
60
61
62 self.app.gui.analysis.new_analysis(analysis_type=analysis_type, analysis_name=analysis_name, pipe_name=pipe_name, pipe_bundle=pipe_bundle)
63
64
65 analysis = self.app.gui.analysis.get_page_from_name("Model-free test")
66
67
68 analysis.field_results_dir.SetValue(str_to_gui(ds.tmpdir))
69
70
71 data_path = status.install_path + sep + 'test_suite' + sep + 'shared_data' + sep + 'model_free' + sep + 'bug_20479_gui_final_pipe' + sep
72
73
74 self.app.gui.show_tree()
75
76
77 self.app.gui.spin_viewer.load_spins_wizard()
78
79
80 page = self.app.gui.spin_viewer.wizard.get_page(0)
81 page.selection = 'sequence'
82 self.app.gui.spin_viewer.wizard._go_next()
83 page = self.app.gui.spin_viewer.wizard.get_page(self.app.gui.spin_viewer.wizard._current_page)
84 page.uf_args['file'].SetValue(str_to_gui(data_path + 'NoeRelN'))
85 self.app.gui.spin_viewer.wizard._go_next()
86 interpreter.flush()
87
88
89 self.app.gui.spin_viewer.wizard._go_next()
90 interpreter.flush()
91
92
93 self.app.gui.spin_viewer.handler_close()
94
95
96 interpreter.flush()
97
98
99 self._execute_uf(uf_name='spin.element', element='N')
100
101
102 data = [
103 ['NoeRelN', 'noe_800', 'NOE', 800000031.0],
104 ['R1850', 'r1_800', 'R1', 800000031.0],
105 ['R2863', 'r2_800', 'R2', 800000031.0],
106 ['R2604', 'r2_600', 'R2', 599999000.0]
107 ]
108 for i in range(len(data)):
109 self._execute_uf(uf_name='relax_data.read', file=data_path+data[i][0], ri_id=data[i][1], ri_type=data[i][2], frq=data[i][3], mol_name_col=1, res_num_col=2, res_name_col=3, spin_num_col=4, spin_name_col=5, data_col=6, error_col=7)
110
111
112 self._execute_uf(uf_name='sequence.attach_protons')
113
114
115 analysis.setup_dipole_pair()
116 analysis.dipole_wizard._skip()
117 analysis.dipole_wizard._skip()
118 analysis.dipole_wizard._go_next()
119 interpreter.flush()
120 analysis.dipole_wizard._go_next()
121 interpreter.flush()
122 analysis.dipole_wizard._skip()
123
124
125 analysis.value_set_csa()
126 uf_store['value.set'].wizard._go_next()
127 interpreter.flush()
128
129
130 analysis.spin_isotope_heteronuc()
131 uf_store['spin.isotope'].wizard._go_next()
132 interpreter.flush()
133 analysis.spin_isotope_proton()
134 uf_store['spin.isotope'].wizard._go_next()
135 interpreter.flush()
136
137
138 analysis.local_tm_model_field.select = [True, True, False, False, False, False, False, False, False, False]
139 analysis.local_tm_model_field.modify()
140
141
142 analysis.mf_model_field.select = [False, True, True, False, False, False, False, False, False, False]
143 analysis.mf_model_field.modify()
144
145
146 analysis.grid_inc.SetValue(3)
147 analysis.data.diff_tensor_grid_inc = {'sphere': 5, 'prolate': 5, 'oblate': 5, 'ellipsoid': 3}
148
149
150 analysis.mc_sim_num.SetValue(2)
151
152
153 analysis.max_iter.control.SetRange(0, 100)
154 analysis.max_iter.SetValue(1)
155
156
157 auto_model_free.dauvergne_protocol.dAuvergne_protocol.opt_func_tol = 1e-5
158 auto_model_free.dauvergne_protocol.dAuvergne_protocol.opt_max_iterations = 1000
159
160
161 for protocol in ['local_tm', 'sphere', 'final']:
162
163 text = "Sequential global model optimisation: %s" % protocol
164 char = "%"
165 print("\n\n\n\n%s\n%s %s %s\n%s\n\n\n" % (char*(len(text)+4), char, text, char, char*(len(text)+4)))
166
167
168 if protocol == 'local_tm':
169 analysis.mode_win.select_local_tm()
170 elif protocol == 'sphere':
171 analysis.mode_win.select_sphere()
172 else:
173 analysis.mode_win.select_final()
174 analysis.mode_dialog()
175
176
177 state = analysis.execute(wx.CommandEvent(wx.wxEVT_COMMAND_BUTTON_CLICKED, analysis.button_exec_relax.GetId()))
178
179
180 if hasattr(analysis, 'thread'):
181 analysis.thread.join()
182
183
184 wx.Yield()
185
186
187 self.check_exceptions()
188
189
191 """Catch U{bug #21615<https://web.archive.org/web/https://gna.org/bugs/?21615>}, the failure of showing the missing data dialog when executing the analysis with an incomplete setup.
192
193 This was reported by Ivan Leung.
194 """
195
196
197 self.app.gui.analysis.menu_new(None)
198 page = self.app.gui.analysis.new_wizard.wizard.get_page(0)
199 page.select_mf(None)
200 page.analysis_name.SetValue(str_to_gui("Model-free incomplete setup failure"))
201 self.app.gui.analysis.new_wizard.wizard._go_next(None)
202 page = self.app.gui.analysis.new_wizard.wizard.get_page(1)
203 self.app.gui.analysis.new_wizard.wizard._go_next(None)
204
205
206 analysis_type, analysis_name, pipe_name, pipe_bundle, uf_exec = self.app.gui.analysis.new_wizard.get_data()
207
208
209 self.app.gui.analysis.new_analysis(analysis_type=analysis_type, analysis_name=analysis_name, pipe_name=pipe_name, pipe_bundle=pipe_bundle)
210
211
212 analysis = self.app.gui.analysis.get_page_from_name("Model-free incomplete setup failure")
213
214
215 analysis.field_results_dir.SetValue(str_to_gui(ds.tmpdir))
216
217
218 data_path = status.install_path + sep + 'test_suite' + sep + 'shared_data' + sep + 'model_free' + sep + 'bug_21615_incomplete_setup_failure' + sep
219
220
221 self.app.gui.show_tree()
222
223
224 self.app.gui.spin_viewer.load_spins_wizard()
225
226
227 page = self.app.gui.spin_viewer.wizard.get_page(0)
228 page.selection = 'new pdb'
229 self.app.gui.spin_viewer.wizard._go_next()
230 page = self.app.gui.spin_viewer.wizard.get_page(self.app.gui.spin_viewer.wizard._current_page)
231 page.uf_args['file'].SetValue(str_to_gui(data_path + 'Truncated_ForBugReport.pdb'))
232 self.app.gui.spin_viewer.wizard._go_next()
233 interpreter.flush()
234
235
236 page = self.app.gui.spin_viewer.wizard.get_page(self.app.gui.spin_viewer.wizard._current_page)
237 page.uf_args['spin_id'].SetValue(str_to_gui('@N'))
238 self.app.gui.spin_viewer.wizard._apply()
239 page.uf_args['spin_id'].SetValue(str_to_gui('@H'))
240 self.app.gui.spin_viewer.wizard._go_next()
241 interpreter.flush()
242
243
244 self.app.gui.spin_viewer.handler_close()
245
246
247 interpreter.flush()
248
249
250 self._execute_uf(uf_name='spin.element', element='N')
251
252
253 data = [
254 ['NOE_ForBugReport.txt', 'noe_800', 'NOE', 800000001.0],
255 ['T1_ForBugReport.txt', 'r1_800', 'R1', 800000001.0],
256 ['T2_ForBugReport.txt', 'r2_800', 'R2', 800000001.0]
257 ]
258 for i in range(len(data)):
259 self._execute_uf(uf_name='relax_data.read', file=data_path+data[i][0], ri_id=data[i][1], ri_type=data[i][2], frq=data[i][3], mol_name_col=1, res_num_col=2, res_name_col=3, spin_num_col=4, spin_name_col=5, data_col=6, error_col=7)
260
261
262 state = analysis.execute(wx.CommandEvent(wx.wxEVT_COMMAND_BUTTON_CLICKED, analysis.button_exec_relax.GetId()))
263
264
265 if hasattr(analysis, 'thread'):
266 analysis.thread.join()
267
268
269 wx.Yield()
270
271
272 self.check_exceptions()
273
274
276 """Test the model-free auto-analysis.
277
278 This now catches U{bug #20603<https://web.archive.org/web/https://gna.org/bugs/?20603>}.
279 """
280
281
282 self.app.gui.analysis.menu_new(None)
283 page = self.app.gui.analysis.new_wizard.wizard.get_page(0)
284 page.select_mf(None)
285 page.analysis_name.SetValue(str_to_gui("Model-free test"))
286 self.app.gui.analysis.new_wizard.wizard._go_next(None)
287 page = self.app.gui.analysis.new_wizard.wizard.get_page(1)
288 self.app.gui.analysis.new_wizard.wizard._go_next(None)
289
290
291 analysis_type, analysis_name, pipe_name, pipe_bundle, uf_exec = self.app.gui.analysis.new_wizard.get_data()
292
293
294 self.app.gui.analysis.new_analysis(analysis_type=analysis_type, analysis_name=analysis_name, pipe_name=pipe_name, pipe_bundle=pipe_bundle)
295
296
297 analysis = self.app.gui.analysis.get_page_from_name("Model-free test")
298
299
300 analysis.field_results_dir.SetValue(str_to_gui(ds.tmpdir))
301
302
303 data_path = status.install_path + sep + 'test_suite' + sep + 'shared_data' + sep + 'model_free' + sep + 'sphere' + sep
304
305
306 analysis._about()
307 analysis.about_dialog.Close()
308
309
310 self.app.gui.show_tree()
311
312
313 self.app.gui.spin_viewer.load_spins_wizard()
314
315
316 page = self.app.gui.spin_viewer.wizard.get_page(0)
317 page.selection = 'new pdb'
318 self.app.gui.spin_viewer.wizard._go_next()
319 page = self.app.gui.spin_viewer.wizard.get_page(self.app.gui.spin_viewer.wizard._current_page)
320 page.uf_args['file'].SetValue(str_to_gui(status.install_path + sep + 'test_suite' + sep + 'shared_data' + sep + 'model_free' + sep + 'sphere' + sep + 'sphere.pdb'))
321 self.app.gui.spin_viewer.wizard._go_next()
322 interpreter.flush()
323
324
325 self.app.gui.spin_viewer.wizard._go_next()
326 interpreter.flush()
327
328
329 self.app.gui.spin_viewer.handler_close()
330
331
332 interpreter.flush()
333
334
335 data = [
336 ['noe.500.out', 'noe_500', 'NOE', 500e6],
337 ['r1.500.out', 'r1_500', 'R1', 500e6],
338 ['r2.500.out', 'r2_500', 'R2', 500e6],
339 ['noe.900.out', 'noe_900', 'NOE', 900e6],
340 ['r1.900.out', 'r1_900', 'R1', 900e6],
341 ['r2.900.out', 'r2_900', 'R2', 900e6]
342 ]
343 for i in range(len(data)):
344 self._execute_uf(uf_name='relax_data.read', file=data_path+data[i][0], ri_id=data[i][1], ri_type=data[i][2], frq=data[i][3], mol_name_col=1, res_num_col=2, res_name_col=3, spin_num_col=4, spin_name_col=5, data_col=6, error_col=7)
345
346
347 analysis.relax_data.on_right_click(Fake_right_click())
348
349
350 analysis.setup_dipole_pair()
351
352
353 analysis.dipole_wizard._apply()
354 interpreter.flush()
355 page = analysis.dipole_wizard.get_page(0)
356 page.uf_args['spin_id1'].SetValue(str_to_gui("@NE1"))
357 page.uf_args['spin_id2'].SetValue(str_to_gui("@HE1"))
358 analysis.dipole_wizard._go_next()
359 interpreter.flush()
360 analysis.dipole_wizard._go_next()
361 interpreter.flush()
362 analysis.dipole_wizard._go_next()
363 interpreter.flush()
364
365
366 analysis.value_set_csa()
367 uf_store['value.set'].wizard._go_next()
368 interpreter.flush()
369
370
371 analysis.spin_isotope_heteronuc()
372 uf_store['spin.isotope'].wizard._go_next()
373 interpreter.flush()
374 analysis.spin_isotope_proton()
375 uf_store['spin.isotope'].wizard._go_next()
376 interpreter.flush()
377
378
379 analysis.local_tm_model_field.select = [True, True, False, False, False, False, False, False, False, False]
380 analysis.local_tm_model_field.modify()
381
382
383 analysis.mf_model_field.select = [False, True, True, False, False, False, False, False, False, False]
384 analysis.mf_model_field.modify()
385
386
387 analysis.grid_inc.SetValue(3)
388 analysis.data.diff_tensor_grid_inc = {'sphere': 5, 'prolate': 5, 'oblate': 5, 'ellipsoid': 3}
389
390
391 analysis.mc_sim_num.SetValue(2)
392
393
394 analysis.max_iter.control.SetRange(0, 100)
395 analysis.max_iter.SetValue(1)
396
397
398 analysis.mode_win.select_full_analysis()
399 analysis.mode_dialog()
400
401
402 analysis.sync_ds(upload=True)
403 self.assertEqual(analysis.data.save_dir, ds.tmpdir)
404 self.assertEqual(analysis.data.local_tm_models, ['tm0', 'tm1'])
405 self.assertEqual(analysis.data.mf_models, ['m1', 'm2'])
406 self.assertEqual(analysis.data.grid_inc, 3)
407 self.assertEqual(analysis.data.mc_sim_num, 2)
408 self.assertEqual(analysis.data.max_iter, 1)
409 self.assertEqual(analysis.data.diff_tensor_grid_inc['sphere'], 5)
410 self.assertEqual(analysis.data.diff_tensor_grid_inc['prolate'], 5)
411 self.assertEqual(analysis.data.diff_tensor_grid_inc['oblate'], 5)
412 self.assertEqual(analysis.data.diff_tensor_grid_inc['ellipsoid'], 3)
413
414
415 auto_model_free.dauvergne_protocol.dAuvergne_protocol.opt_func_tol = 1e-5
416 auto_model_free.dauvergne_protocol.dAuvergne_protocol.opt_max_iterations = 1000
417
418
419 state = analysis.execute(wx.CommandEvent(wx.wxEVT_COMMAND_BUTTON_CLICKED, analysis.button_exec_relax.GetId()))
420
421
422 if hasattr(analysis, 'thread'):
423 analysis.thread.join()
424
425
426 wx.Yield()
427
428
429 self.check_exceptions()
430
431
432
433 if status.relax_mode != 'gui' and wx.version() != '2.9.4.1 gtk2 (classic)':
434 self.assertEqual(self.app.gui.controller.mc_gauge_mf.GetValue(), 100)
435 self.assertEqual(self.app.gui.controller.progress_gauge_mf.GetValue(), 100)
436 self.assertEqual(self.app.gui.controller.main_gauge.GetValue(), 100)
437
438
439 self.assertEqual(cdp.diff_tensor.type, 'sphere')
440 self.assertAlmostEqual(cdp.diff_tensor.tm, 1e-8)
441 self.assertEqual(cdp.diff_tensor.fixed, True)
442
443
444 self.assertAlmostEqual(cdp.chi2, 4e-19)
445
446
447 mol_names = ["sphere_mol1"] * 20
448 res_names = ["GLY"] * 20
449 res_nums = []
450 for i in range(1, 10):
451 res_nums.append(i)
452 res_nums.append(i)
453 res_nums.append(i)
454 res_nums.append(i)
455 spin_names = ["N", "H"] * 9 + ["NE1", "HE1"]
456 spin_nums = list(range(1, 21))
457 isotopes = ["15N", "1H"] * 10
458 csa = [-172e-6, None] * 10
459 select = [True, False] * 10
460 fixed = [False, False] * 10
461 s2 = [0.8, None] * 10
462 te = [20e-12, None] * 10
463
464
465 i = 0
466 for spin, mol_name, res_num, res_name in spin_loop(full_info=True):
467
468 self.assertEqual(mol_name, mol_names[i])
469 self.assertEqual(res_name, res_names[i])
470 self.assertEqual(res_num, res_nums[i])
471 self.assertEqual(spin.name, spin_names[i])
472 self.assertEqual(spin.num, spin_nums[i])
473
474
475 self.assertEqual(spin.select, select[i])
476 self.assertEqual(spin.fixed, fixed[i])
477 self.assertEqual(spin.isotope, isotopes[i])
478 if csa[i] == None:
479 self.assertEqual(spin.csa, None)
480 else:
481 self.assertAlmostEqual(spin.csa, csa[i])
482
483
484 self.assertEqual(spin.model, 'm2')
485 self.assertEqual(spin.equation, 'mf_orig')
486 self.assertEqual(len(spin.params), 2)
487 self.assertEqual(spin.params[0], 's2')
488 self.assertEqual(spin.params[1], 'te')
489 if s2[i] == None:
490 self.assertEqual(spin.s2, None)
491 else:
492 self.assertAlmostEqual(spin.s2, 0.8)
493 self.assertEqual(spin.s2f, None)
494 self.assertEqual(spin.s2s, None)
495 self.assertEqual(spin.local_tm, None)
496 if te[i] == None:
497 self.assertEqual(spin.te, None)
498 else:
499 self.assertAlmostEqual(spin.te, 20e-12)
500 self.assertEqual(spin.tf, None)
501 self.assertEqual(spin.ts, None)
502 self.assertEqual(spin.rex, None)
503
504
505 self.assertEqual(spin.chi2, None)
506 self.assertEqual(spin.iter, None)
507 self.assertEqual(spin.f_count, None)
508 self.assertEqual(spin.g_count, None)
509 self.assertEqual(spin.h_count, None)
510 self.assertEqual(spin.warning, None)
511
512
513 i += 1
514
515
516 i = 0
517 for interatom in interatomic_loop():
518 self.assertAlmostEqual(interatom.r, 1.02 * 1e-10)
519
520
522 """Mapping the {S2, te, Rex} chi2 space through the OpenDX user function dx.map().
523
524 This is to catch U{bug #22035<https://web.archive.org/web/https://gna.org/bugs/?22035>}, the dx.map user function being broken in the GUI.
525 """
526
527
528 self.script_exec(status.install_path + sep+'test_suite'+sep+'system_tests'+sep+'scripts'+sep+'model_free'+sep+'opendx_s2_te_rex.py')
529
530
531
533 """Simulate a grid_cell_right_click event ."""
534
536 """Simulate the GetPosition() method."""
537
538
539 return wx.Point(10, 10)
540
541
543 """Simulate the GetRow() method."""
544
545
546 return 0
547