| Trees | Indices | Help |
|
|---|
|
|
1 ###############################################################################
2 # #
3 # relax #
4 # #
5 # Protein dynamics by NMR relaxation data analysis #
6 # #
7 # by Edward d'Auvergne #
8 # #
9 ###############################################################################
10 # #
11 # Licence #
12 # #
13 # relax, a program for relaxation data analysis. #
14 # #
15 # Copyright (C) 2001-2006 Edward d'Auvergne #
16 # Copyright (C) 2006-2014 the relax development team #
17 # #
18 # This program is free software; you can redistribute it and/or modify #
19 # it under the terms of the GNU General Public License as published by #
20 # the Free Software Foundation, either version 3 of the License, or #
21 # (at your option) any later version. #
22 # #
23 # This program is distributed in the hope that it will be useful, #
24 # but WITHOUT ANY WARRANTY; without even the implied warranty of #
25 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #
26 # GNU Library General Public License for more details. #
27 # #
28 # You should have received a copy of the GNU General Public License #
29 # along with this program; if not, write to the Free Software #
30 # #
31 ###############################################################################
32
33 # Module docstring.
34 """The main module for relax execution."""
35
36 # Dependency checks.
37 import dep_check
38
39 # Eliminate the ^[[?1034h escape code being produced on Linux systems by the import of the readline module.
40 import os
41 if 'TERM' in os.environ and os.environ['TERM'] == 'xterm':
42 os.environ['TERM'] = 'linux'
43
44 # Set up the Python 2 and 3 work-arounds.
45 import lib.compat
46
47 # Python modules.
48 import numpy
49 from optparse import Option, OptionGroup, OptionParser
50 from os import F_OK, access, getpid, putenv
51 if dep_check.cprofile_module:
52 import cProfile as profile
53 elif dep_check.profile_module:
54 import profile
55 import pstats
56 from pydoc import pager
57 import sys
58
59 # relax modules.
60 from info import Info_box
61 import lib.errors
62 from lib.io import io_streams_log, io_streams_tee
63 import lib.warnings
64 from multi import Application_callback, load_multiprocessor
65 from prompt import interpreter
66 from status import Status; status = Status()
67 import user_functions
68 import version
69
70
71 # Set up the user functions.
72 user_functions.initialise()
73
74 # Modify the environmental variables.
75 putenv('PDBVIEWER', 'vmd')
76
77
79 """Execute relax.
80
81 @keyword mode: Force a relax mode, overriding the command line.
82 @type mode: str
83 @keyword profile_flag: Change this flag to True for code profiling.
84 @type profile_flag: bool
85 """
86
87 # Normal relax operation.
88 relax = Relax()
89
90 # Override normal operation.
91 if mode:
92 # Override the mode.
93 relax.mode = mode
94
95 # Some defaults.
96 relax.script_file = None
97 relax.log_file = None
98 relax.tee_file = None
99 relax.multiprocessor_type = 'uni'
100 relax.n_processors = 1
101
102 # Process the command line arguments.
103 else:
104 relax.arguments()
105
106 # Store some start up info in the status object.
107 status.relax_mode = relax.mode
108
109 # Set up the multi-processor elements.
110 callbacks = Application_callback(master=relax)
111 verbosity = 0
112 if status.debug:
113 verbosity = 1
114 processor = load_multiprocessor(relax.multiprocessor_type, callbacks, processor_size=relax.n_processors, verbosity=verbosity)
115
116 # Place the processor fabric intro string into the info box.
117 info = Info_box()
118 info.multi_processor_string = processor.get_intro_string()
119
120 # Normal relax operation.
121 if not profile_flag:
122 # Execute relax in multi-processor mode (this includes the uni-processor for normal operation).
123 processor.run()
124
125 # relax in profiling mode.
126 else:
127 def print_stats(stats, status=0):
128 pstats.Stats(stats).sort_stats('time', 'name').print_stats()
129
130 # No profile module.
131 if not dep_check.profile_module:
132 sys.stderr.write("The profile module is not available, please install the Python development packages for profiling.\n\n")
133 sys.exit()
134
135 # Run relax in profiling mode.
136 profile.Profile.print_stats = print_stats
137 profile.runctx('processor.run()', globals(), locals())
138
139
140
142 """The main relax class.
143
144 This contains information about the running state, for example the mode of operation of relax,
145 whether debugging is turned on, etc.
146 """
147
149 """The top level class for initialising the program.
150
151 @keyword mode: Force a relax mode, overriding the command line.
152 @type mode: str
153 """
154
155 # Get and store the PID of this process.
156 self.pid = getpid()
157
158
160 """Execute relax.
161
162 This is the application callback method executed by the multi-processor framework.
163 """
164
165 # Set up the warning system.
166 lib.warnings.setup()
167
168 # Logging.
169 if self.log_file:
170 io_streams_log(self.log_file)
171
172 # Tee.
173 elif self.tee_file:
174 io_streams_tee(self.tee_file)
175
176 # Show the version number and exit.
177 if self.mode == 'version':
178 print('relax ' + version.version_full())
179 return
180
181 # Show the relax info and exit.
182 if self.mode == 'info':
183 # Initialise the information box.
184 info = Info_box()
185
186 # Print the program intro.
187 print(info.intro_text())
188
189 # Print the system info.
190 print(info.sys_info())
191
192 # Stop execution.
193 return
194
195 # Run the interpreter for the prompt or script modes.
196 if self.mode == 'prompt' or self.mode == 'script':
197 # Run the interpreter.
198 self.interpreter = interpreter.Interpreter()
199 self.interpreter.run(self.script_file)
200
201 # Execute the relax GUI.
202 elif self.mode == 'gui':
203 # Dependency check.
204 if not dep_check.wx_module:
205 sys.stderr.write("Please install the wx Python module to access the relax GUI.\n\n")
206 return
207
208 # Only import the module in this mode (to improve program start up speeds).
209 import gui
210
211 # Set the GUI flag in the status object.
212 status.show_gui = True
213
214 # Start the relax GUI wx application.
215 app = gui.App(script_file=self.script_file)
216 app.MainLoop()
217
218 # Execute the relax test suite
219 elif self.mode == 'test suite':
220 # Only import the module in the test modes (to improve program start up speeds).
221 from test_suite.test_suite_runner import Test_suite_runner
222
223 # Load the interpreter and turn intros on.
224 self.interpreter = interpreter.Interpreter(show_script=False, raise_relax_error=True)
225 self.interpreter.on()
226
227 # Run the tests.
228 runner = Test_suite_runner(self.tests, timing=self.test_timings)
229 runner.run_all_tests()
230
231 # Execute the relax system tests.
232 elif self.mode == 'system tests':
233 # Only import the module in the test modes (to improve program start up speeds).
234 from test_suite.test_suite_runner import Test_suite_runner
235
236 # Load the interpreter and turn intros on.
237 self.interpreter = interpreter.Interpreter(show_script=False, raise_relax_error=True)
238 self.interpreter.on()
239
240 # Run the tests.
241 runner = Test_suite_runner(self.tests, timing=self.test_timings)
242 runner.run_system_tests()
243
244 # Execute the relax unit tests.
245 elif self.mode == 'unit tests':
246 # Only import the module in the test modes (to improve program start up speeds).
247 from test_suite.test_suite_runner import Test_suite_runner
248
249 # Run the tests.
250 runner = Test_suite_runner(self.tests, timing=self.test_timings)
251 runner.run_unit_tests()
252
253 # Execute the relax GUI tests.
254 elif self.mode == 'GUI tests':
255 # Only import the module in the test modes (to improve program start up speeds).
256 from test_suite.test_suite_runner import Test_suite_runner
257
258 # Run the tests.
259 runner = Test_suite_runner(self.tests, timing=self.test_timings)
260 runner.run_gui_tests()
261
262 # Execute the relax verification tests.
263 elif self.mode == 'verification tests':
264 # Only import the module in the test modes (to improve program start up speeds).
265 from test_suite.test_suite_runner import Test_suite_runner
266
267 # Run the tests.
268 runner = Test_suite_runner(self.tests, timing=self.test_timings)
269 runner.run_verification_tests()
270
271 # Test mode.
272 elif self.mode == 'test':
273 self.test_mode()
274
275 # Licence mode.
276 elif self.mode == 'licence':
277 self.licence()
278
279 # Unknown mode.
280 else:
281 raise lib.errors.RelaxError("The '%s' mode is unknown." % self.mode)
282
283
285 """Process the command line arguments."""
286
287 # Parser object.
288 parser = RelaxParser(self, usage="usage: %prog [options] [script_file]")
289
290 # Recognised command line options for the UI.
291 group = OptionGroup(parser, 'UI options')
292 group.add_option('-p', '--prompt', action='store_true', dest='prompt', default=0, help='launch relax in prompt mode after running any optionally supplied scripts')
293 group.add_option('-g', '--gui', action='store_true', dest='gui', default=0, help='launch the relax GUI')
294 group.add_option('-i', '--info', action='store_true', dest='info', default=0, help='display information about this version of relax')
295 group.add_option('-v', '--version', action='store_true', dest='version', default=0, help='show the version number and exit')
296 group.add_option('--licence', action='store_true', dest='licence', default=0, help='display the licence')
297 group.add_option('--test', action='store_true', dest='test', default=0, help='run relax in test mode')
298 parser.add_option_group(group)
299
300 # Recognised command line options for the multiprocessor.
301 group = OptionGroup(parser, 'Multi-processor options')
302 group.add_option('-m', '--multi', action='store', type='string', dest='multiprocessor', default='uni', help='set multi processor method')
303 group.add_option('-n', '--processors', action='store', type='int', dest='n_processors', default=-1, help='set number of processors (may be ignored)')
304 parser.add_option_group(group)
305
306 # Recognised command line options for IO redirection.
307 group = OptionGroup(parser, 'IO redirection options')
308 group.add_option('-l', '--log', action='store', type='string', dest='log', help='log relax output to the file LOG_FILE', metavar='LOG_FILE')
309 group.add_option('-t', '--tee', action='store', type='string', dest='tee', help='tee relax output to both stdout and the file LOG_FILE', metavar='LOG_FILE')
310 parser.add_option_group(group)
311
312 # Recognised command line options for the test suite.
313 group = OptionGroup(parser, 'Test suite options')
314 group.add_option('-x', '--test-suite', action='store_true', dest='test_suite', default=0, help='execute the full relax test suite')
315 group.add_option('-s', '--system-tests', action='store_true', dest='system_tests', default=0, help='execute the system/functional tests')
316 group.add_option('-u', '--unit-tests', action='store_true', dest='unit_tests', default=0, help='execute the unit tests')
317 group.add_option('--gui-tests', action='store_true', dest='gui_tests', default=0, help='execute the GUI tests')
318 group.add_option('--verification-tests', action='store_true', dest='verification_tests', default=0, help='execute the software verification tests')
319 group.add_option('--time', action='store_true', dest='tt', default=0, help='enable the timing of individual tests in the test suite')
320 parser.add_option_group(group)
321
322 # Recognised command line options for debugging.
323 group = OptionGroup(parser, 'Debugging options')
324 group.add_option('-d', '--debug', action='store_true', dest='debug', default=0, help='enable debugging output')
325 group.add_option('--error-state', action='store_true', dest='error_state', default=0, help='save a pickled state file when a RelaxError occurs')
326 group.add_option('--traceback', action='store_true', dest='traceback', default=0, help='show stack tracebacks on all RelaxErrors and RelaxWarnings')
327 group.add_option('-e', '--escalate', action='store_true', dest='escalate', default=0, help='escalate all warnings to errors')
328 group.add_option('--numpy-raise', action='store_true', dest='numpy_raise', default=0, help='convert numpy warnings to errors')
329 parser.add_option_group(group)
330
331 # Parse the options.
332 (options, args) = parser.parse_args()
333
334 # Debugging options: Debugging flag, escalate flag, traceback flag, and numpy warning to error conversion.
335 if options.debug:
336 status.debug = True
337 if options.escalate:
338 lib.warnings.ESCALATE = True
339 if options.traceback:
340 status.traceback = True
341 lib.warnings.TRACEBACK = True
342 if options.numpy_raise:
343 numpy.seterr(all='raise')
344 if options.error_state:
345 lib.errors.SAVE_ERROR_STATE = True
346
347 # Script prompt interactive inspection flag.
348 if options.prompt:
349 status.prompt = True
350
351 # Logging.
352 if options.log:
353 # Exclusive modes.
354 if options.tee:
355 parser.error("the logging and tee options cannot be set simultaneously")
356
357 # The log file.
358 self.log_file = options.log
359
360 # Fail if the file already exists.
361 if access(self.log_file, F_OK):
362 parser.error("the log file " + repr(self.log_file) + " already exists")
363 else:
364 self.log_file = None
365
366 # Tee.
367 if options.tee:
368 # Exclusive modes.
369 if options.log:
370 parser.error("the tee and logging options cannot be set simultaneously")
371
372 # The tee file.
373 self.tee_file = options.tee
374
375 # Fail if the file already exists.
376 if access(self.tee_file, F_OK):
377 parser.error("the tee file " + repr(self.tee_file) + " already exists")
378 else:
379 self.tee_file = None
380
381 # Test suite mode, therefore the args are the tests to run and not a script file.
382 if options.test_suite or options.system_tests or options.unit_tests or options.gui_tests or options.verification_tests:
383 # Store the arguments.
384 self.tests = args
385
386 # Test timings.
387 self.test_timings = False
388 if options.tt:
389 self.test_timings = True
390
391 # The argument is a script.
392 else:
393 # Number of positional arguments should only be 0 or 1. 1 should be the script file.
394 if len(args) > 1:
395 parser.error("incorrect number of arguments")
396
397 # Script file.
398 self.script_file = None
399 if len(args) == 1:
400 self.script_file = args[0]
401
402 # Test if the script file exists.
403 if not access(self.script_file, F_OK):
404 parser.error("the script file " + repr(self.script_file) + " does not exist")
405
406 # Set the multi-processor type and number.
407 self.multiprocessor_type = options.multiprocessor
408 self.n_processors = options.n_processors
409
410 # Checks for the multiprocessor mode.
411 if self.multiprocessor_type == 'mpi4py' and not dep_check.mpi4py_module:
412 parser.error(dep_check.mpi4py_message)
413
414
415 # Determine the relax mode and test for mutually exclusive modes.
416 #################################################################
417
418 # Show the version number.
419 if options.version:
420 self.mode = 'version'
421
422 # Show the info about this relax version.
423 elif options.info:
424 self.mode = 'info'
425
426 # Run the relax tests.
427 elif options.test_suite or options.system_tests or options.unit_tests or options.gui_tests or options.verification_tests:
428 # Exclusive modes.
429 if options.test:
430 parser.error("executing the relax test suite and running relax in test mode are mutually exclusive")
431 elif options.licence:
432 parser.error("executing the relax test suite and running relax in licence mode are mutually exclusive")
433
434 # Set the mode.
435 if options.test_suite:
436 self.mode = 'test suite'
437 elif options.system_tests:
438 self.mode = 'system tests'
439 elif options.unit_tests:
440 self.mode = 'unit tests'
441 elif options.gui_tests:
442 self.mode = 'GUI tests'
443 elif options.verification_tests:
444 self.mode = 'verification tests'
445
446 # Set the status flag.
447 status.test_mode = True
448
449 # Test mode.
450 elif options.test:
451 # Make sure no script is supplied.
452 if self.script_file:
453 parser.error("a script should not be supplied in test mode")
454
455 # Exclusive modes.
456 if options.test_suite or options.system_tests or options.unit_tests or options.gui_tests or options.verification_tests:
457 parser.error("the relax test mode and executing the test suite are mutually exclusive")
458 elif options.licence:
459 parser.error("the relax modes test and licence are mutually exclusive")
460
461 # Set the mode.
462 self.mode = 'test'
463
464 # Licence mode.
465 elif options.licence:
466 # Make sure no script is supplied.
467 if self.script_file:
468 parser.error("a script should not be supplied in test mode")
469
470 # Exclusive modes.
471 if options.test_suite or options.system_tests or options.unit_tests or options.gui_tests or options.verification_tests:
472 parser.error("the relax licence mode and executing the test suite are mutually exclusive")
473 elif options.test:
474 parser.error("the relax modes licence and test are mutually exclusive")
475
476 # Set the mode.
477 self.mode = 'licence'
478
479 # GUI.
480 elif options.gui:
481 # Exclusive models.
482 if options.test_suite or options.system_tests or options.unit_tests or options.gui_tests or options.verification_tests:
483 parser.error("the relax GUI mode and testing modes are mutually exclusive")
484 elif options.licence:
485 parser.error("the relax GUI mode and licence mode are mutually exclusive")
486
487 # Missing wx module.
488 if not dep_check.wx_module:
489 # Not installed.
490 if dep_check.wx_module_message == "No module named 'wx'":
491 parser.error("To use the GUI, the wxPython module must be installed.")
492
493 # Broken.
494 else:
495 parser.error("The wxPython installation is broken:\n%s." % dep_check.wx_module_message)
496
497 # Set the mode.
498 self.mode = 'gui'
499
500 # Script mode.
501 elif self.script_file:
502 self.mode = 'script'
503
504 # Prompt mode (default).
505 else:
506 self.mode = 'prompt'
507
508
510 """Function for displaying the licence."""
511
512 # Present the GPL using paging.
513 file = open('docs/COPYING')
514 pager(file.read())
515
516
522
523
524
526 - def __init__(self, relax, usage=None, option_list=None, option_class=Option, version=None, conflict_handler="error", description=None, formatter=None, add_help_option=1, prog=None):
527 """Subclassed OptionParser class with a replacement error function."""
528
529 # Relax base class.
530 self.relax = relax
531
532 # Run the __init__ method of the OptionParser class.
533 OptionParser.__init__(self, usage, option_list, option_class, version, conflict_handler, description, formatter, add_help_option, prog)
534
535
537 """Replacement error function."""
538
539 # Usage message.
540 self.print_usage(sys.stderr)
541
542 # Raise a clean error.
543 try:
544 raise lib.errors.RelaxError(message)
545 except lib.errors.AllRelaxErrors:
546 instance = sys.exc_info()[1]
547 sys.stderr.write(instance.__str__())
548
549 # Exit.
550 sys.exit()
551
552
553 # Start relax if this file is passed to Python.
554 if __name__ == "__main__":
555 start()
556
| Trees | Indices | Help |
|
|---|
| Generated by Epydoc 3.0.1 on Thu Jul 3 13:38:52 2014 | http://epydoc.sourceforge.net |