Module errors
[hide private]
[frames] | no frames]

Source Code for Module errors

  1  ############################################################################### 
  2  #                                                                             # 
  3  # Copyright (C) 2003-2006 Edward d'Auvergne                                   # 
  4  #                                                                             # 
  5  # This file is part of the program relax.                                     # 
  6  #                                                                             # 
  7  # relax is free software; you can redistribute it and/or modify               # 
  8  # it under the terms of the GNU General Public License as published by        # 
  9  # the Free Software Foundation; either version 2 of the License, or           # 
 10  # (at your option) any later version.                                         # 
 11  #                                                                             # 
 12  # relax is distributed in the hope that it will be useful,                    # 
 13  # but WITHOUT ANY WARRANTY; without even the implied warranty of              # 
 14  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the               # 
 15  # GNU General Public License for more details.                                # 
 16  #                                                                             # 
 17  # You should have received a copy of the GNU General Public License           # 
 18  # along with relax; if not, write to the Free Software                        # 
 19  # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA   # 
 20  #                                                                             # 
 21  ############################################################################### 
 22   
 23  import __builtin__ 
 24  from re import match 
 25  from types import ClassType 
 26  import time 
 27  import warnings 
 28  import inspect 
 29   
 30   
 31   
 32  # The RelaxError system. 
 33  ######################## 
 34   
35 -class RelaxErrors:
36 - def __init__(self, relax):
37 """Class for placing all the errors below into __builtin__""" 38 39 # Loop over all objects in 'self'. 40 for name in dir(self): 41 # Get the object. 42 object = getattr(self, name) 43 44 # Skip over all non error class objects. 45 if not (isinstance(object, ClassType) or isinstance(object, type(type))) or not match('Relax', name): 46 continue 47 48 # Add the top level relax class: 49 setattr(object, '_relax', relax) 50 51 # Place the exceptions into __builtin__ 52 __builtin__.__setattr__(name, object) 53 54 # Tuple of all the errors. 55 if hasattr(__builtin__, 'AllRelaxErrors'): 56 __builtin__.AllRelaxErrors = __builtin__.AllRelaxErrors, object 57 else: 58 __builtin__.AllRelaxErrors = object,
59 60 61 # Base class for all errors. 62 ############################ 63
64 - class BaseError(Exception):
65 - def __str__(self):
66 return ("RelaxError: " + self.text + "\n")
67 68
69 - def save_state(self):
70 """Function for saving the program state.""" 71 72 now = time.localtime() 73 file_name = "relax_state_%i%02i%02i_%02i%02i%02i" % (now[0], now[2], now[1], now[3], now[4], now[5]) 74 self._relax.interpreter._State.save(file_name)
75 76 77 # Standard errors. 78 ################## 79
80 - class RelaxError(BaseError):
81 - def __init__(self, text):
82 self.text = text 83 if Debug: 84 self.save_state()
85 86 87 # Fault. 88 ######## 89
90 - class RelaxFault(BaseError):
91 - def __init__(self):
92 self.text = "Impossible to be here, please re-run relax with the '--debug' flag and summit a bug report at https://web.archive.org/web/https://gna.org/projects/relax/." 93 self.save_state()
94 95 96 # Program errors. 97 ################# 98 99 # Cannot locate the program.
100 - class RelaxProgError(BaseError):
101 - def __init__(self, name):
102 self.text = "The program " + `name` + " cannot be found." 103 if Debug: 104 self.save_state()
105 106 107 # The binary executable file does not exist (full path has been given!).
108 - class RelaxMissingBinaryError(BaseError):
109 - def __init__(self, name):
110 self.text = "The binary executable file " + `name` + " does not exist." 111 if Debug: 112 self.save_state()
113 114 115 # The binary executable file is not executable.
116 - class RelaxNonExecError(BaseError):
117 - def __init__(self, name):
118 self.text = "The binary executable file " + `name` + " is not executable." 119 if Debug: 120 self.save_state()
121 122 123 # The binary executable file is not located within the system path.
124 - class RelaxNoInPathError(BaseError):
125 - def __init__(self, name):
126 self.text = "The binary executable file " + `name` + " is not located within the system path." 127 if Debug: 128 self.save_state()
129 130 131 # Program execution failure.
132 - class RelaxProgFailError(BaseError):
133 - def __init__(self, name):
134 self.text = "Execution of the program " + name + " has failed." 135 if Debug: 136 self.save_state()
137 138 139 # PDB errors. 140 ############# 141 142 # PDB data corresponding to the run already exists.
143 - class RelaxPdbError(BaseError):
144 - def __init__(self, run):
145 self.text = "PDB data corresponding to the run " + `run` + " already exists." 146 if Debug: 147 self.save_state()
148 149 # No PDB loaded.
150 - class RelaxNoPdbError(BaseError):
151 - def __init__(self, run):
152 self.text = "No PDB file has been loaded for the run " + `run` + "." 153 if Debug: 154 self.save_state()
155 156 # Loading error.
157 - class RelaxPdbLoadError(BaseError):
158 - def __init__(self, name):
159 self.text = "The PDB file " + `name` + " could not be loaded properly, no molecular chains could be extracted." 160 if Debug: 161 self.save_state()
162 163 # No unit vectors.
164 - class RelaxNoVectorsError(BaseError):
165 - def __init__(self, run):
166 self.text = "The unit XH bond vectors for the run " + `run` + " have not been calculated." 167 if Debug: 168 self.save_state()
169 170 # PDB data corresponding to the run already exists.
171 - class RelaxNoPdbChainError(BaseError):
172 - def __init__(self):
173 self.text = "No peptide or nucleotide chains can be found within the PDB file." 174 if Debug: 175 self.save_state()
176 177 178 # Nuclear errors. 179 ################# 180 181 # Nucleus not set.
182 - class RelaxNucleusError(BaseError):
183 - def __init__(self):
184 self.text = "The type of nucleus has not yet been set." 185 if Debug: 186 self.save_state()
187 188 # Argument errors. 189 ################## 190 191 # Invalid argument.
192 - class RelaxInvalidError(BaseError):
193 - def __init__(self, name, value):
194 self.text = "The " + name + " argument " + `value` + " is invalid." 195 if Debug: 196 self.save_state()
197 198 # Argument not in the list.
199 - class RelaxArgNotInListError(BaseError):
200 - def __init__(self, name, value, list):
201 self.text = "The " + name + " argument " + `value` + " is neither " 202 for i in xrange(len(list)-1): 203 self.text = self.text + `list[i]` + ', ' 204 self.text = self.text + 'nor ' + `list[-1]` + "." 205 if Debug: 206 self.save_state()
207 208 # Binary - integers 0 and 1.
209 - class RelaxBinError(BaseError):
210 - def __init__(self, name, value):
211 self.text = "The " + name + " argument " + `value` + " must either be the integer 0 or 1." 212 if Debug: 213 self.save_state()
214 215 # Float.
216 - class RelaxFloatError(BaseError):
217 - def __init__(self, name, value):
218 self.text = "The " + name + " argument " + `value` + " must be a floating point number." 219 if Debug: 220 self.save_state()
221 222 # Number.
223 - class RelaxNumError(BaseError):
224 - def __init__(self, name, value):
225 self.text = "The " + name + " argument " + `value` + " must be a number." 226 if Debug: 227 self.save_state()
228 229 # Function.
230 - class RelaxFunctionError(BaseError):
231 - def __init__(self, name, value):
232 self.text = "The " + name + " argument " + `value` + " must be a function." 233 if Debug: 234 self.save_state()
235 236 # Integer.
237 - class RelaxIntError(BaseError):
238 - def __init__(self, name, value):
239 self.text = "The " + name + " argument " + `value` + " must be an integer." 240 if Debug: 241 self.save_state()
242 243 # Integer or list of integers.
244 - class RelaxIntListIntError(BaseError):
245 - def __init__(self, name, value):
246 self.text = "The " + name + " argument " + `value` + " must either be an integer or an array of integers." 247 if Debug: 248 self.save_state()
249 250 # Integer or string
251 - class RelaxIntStrError(BaseError):
252 - def __init__(self, name, value):
253 self.text = "The " + name + " argument " + `value` + " must either be an integer or a string." 254 if Debug: 255 self.save_state()
256 257 # Length of the list.
258 - class RelaxLenError(BaseError):
259 - def __init__(self, name, len):
260 self.text = "The " + name + " argument must be of length " + `len` + "." 261 if Debug: 262 self.save_state()
263 264 # List.
265 - class RelaxListError(BaseError):
266 - def __init__(self, name, value):
267 self.text = "The " + name + " argument " + `value` + " must be an array." 268 if Debug: 269 self.save_state()
270 271 # List of floating point numbers.
272 - class RelaxListFloatError(BaseError):
273 - def __init__(self, name, value):
274 self.text = "The " + name + " argument " + `value` + " must be an array of floating point numbers." 275 if Debug: 276 self.save_state()
277 278 # List of integers.
279 - class RelaxListIntError(BaseError):
280 - def __init__(self, name, value):
281 self.text = "The " + name + " argument " + `value` + " must be an array of integers." 282 if Debug: 283 self.save_state()
284 285 # List of numbers.
286 - class RelaxListNumError(BaseError):
287 - def __init__(self, name, value):
288 self.text = "The " + name + " argument " + `value` + " must be an array of numbers." 289 if Debug: 290 self.save_state()
291 292 # List of strings.
293 - class RelaxListStrError(BaseError):
294 - def __init__(self, name, value):
295 self.text = "The " + name + " argument " + `value` + " must be an array of strings." 296 if Debug: 297 self.save_state()
298 299 # Tuple.
300 - class RelaxTupleError(BaseError):
301 - def __init__(self, name, value):
302 self.text = "The " + name + " argument " + `value` + " must be a tuple." 303 if Debug: 304 self.save_state()
305 306 # Tuple or number.
307 - class RelaxNumTupleError(BaseError):
308 - def __init__(self, name, value):
309 self.text = "The " + name + " argument " + `value` + " must either be a number or tuple of numbers." 310 if Debug: 311 self.save_state()
312 313 # None.
314 - class RelaxNoneError(BaseError):
315 - def __init__(self, name):
316 self.text = "The " + name + " argument has not been supplied." 317 if Debug: 318 self.save_state()
319 320 # None or float.
321 - class RelaxNoneFloatError(BaseError):
322 - def __init__(self, name, value):
323 self.text = "The " + name + " argument " + `value` + " must either be a floating point number or None." 324 if Debug: 325 self.save_state()
326 327 # None, float, or list.
328 - class RelaxNoneFloatListError(BaseError):
329 - def __init__(self, name, value):
330 self.text = "The " + name + " argument " + `value` + " must either be a floating point number, a list, or None." 331 if Debug: 332 self.save_state()
333 334 # None or integer.
335 - class RelaxNoneIntError(BaseError):
336 - def __init__(self, name, value):
337 self.text = "The " + name + " argument " + `value` + " must either be an integer or None." 338 if Debug: 339 self.save_state()
340 341 # None, integer, or string.
342 - class RelaxNoneIntStrError(BaseError):
343 - def __init__(self, name, value):
344 self.text = "The " + name + " argument " + `value` + " must either be an integer, a string, or None." 345 if Debug: 346 self.save_state()
347 348 # None or list.
349 - class RelaxNoneListError(BaseError):
350 - def __init__(self, name, value):
351 self.text = "The " + name + " argument " + `value` + " must either be an array or None." 352 if Debug: 353 self.save_state()
354 355 # None or number.
356 - class RelaxNoneNumError(BaseError):
357 - def __init__(self, name, value):
358 self.text = "The " + name + " argument " + `value` + " must either be a number or None." 359 if Debug: 360 self.save_state()
361 362 # None or string.
363 - class RelaxNoneStrError(BaseError):
364 - def __init__(self, name, value):
365 self.text = "The " + name + " argument " + `value` + " must either be a string or None." 366 if Debug: 367 self.save_state()
368 369 # None, string, or list.
370 - class RelaxNoneStrListError(BaseError):
371 - def __init__(self, name, value):
372 self.text = "The " + name + " argument " + `value` + " must either be a string or None." 373 if Debug: 374 self.save_state()
375 376 # None or tuple.
377 - class RelaxNoneTupleError(BaseError):
378 - def __init__(self, name, value):
379 self.text = "The " + name + " argument " + `value` + " must either be a tuple or None." 380 if Debug: 381 self.save_state()
382 383 # String.
384 - class RelaxStrError(BaseError):
385 - def __init__(self, name, value):
386 self.text = "The " + name + " argument " + `value` + " must be a string." 387 if Debug: 388 self.save_state()
389 390 # String or list of strings.
391 - class RelaxStrListStrError(BaseError):
392 - def __init__(self, name, value):
393 self.text = "The " + name + " argument " + `value` + " must either be an string or an array of strings." 394 if Debug: 395 self.save_state()
396 397 398 # Sequence errors. 399 ################## 400 401 # No sequence loaded.
402 - class RelaxNoSequenceError(BaseError):
403 - def __init__(self, run):
404 self.text = "The sequence data for the run " + `run` + " does not exist." 405 if Debug: 406 self.save_state()
407 408 # The sequence already exists.
409 - class RelaxSequenceError(BaseError):
410 - def __init__(self, run):
411 self.text = "The sequence data for the run " + `run` + " already exists." 412 if Debug: 413 self.save_state()
414 415 # The two sequences are different.
416 - class RelaxDiffSeqError(BaseError):
417 - def __init__(self, run1, run2):
418 self.text = "The sequences for the runs " + `run1` + " and " + `run2` + " are not the same." 419 if Debug: 420 self.save_state()
421 422 # Cannot find the residue in the sequence.
423 - class RelaxNoResError(BaseError):
424 - def __init__(self, number, name=None):
425 if name == None: 426 self.text = "The residue '" + `number` + "' cannot be found in the sequence." 427 else: 428 self.text = "The residue '" + `number` + " " + name + "' cannot be found in the sequence." 429 if Debug: 430 self.save_state()
431 432 433 # Relaxation data errors. 434 ######################### 435 436 # No relaxation data.
437 - class RelaxNoRiError(BaseError):
438 - def __init__(self, ri_label, frq_label):
439 self.text = "Relaxation data corresponding to ri_label = " + `ri_label` + " and frq_label = " + `frq_label` + " does not exist." 440 if Debug: 441 self.save_state()
442 443 # Relaxation data already exists.
444 - class RelaxRiError(BaseError):
445 - def __init__(self, ri_label, frq_label):
446 self.text = "Relaxation data corresponding to ri_label = " + `ri_label` + " and frq_label = " + `frq_label` + " already exists." 447 if Debug: 448 self.save_state()
449 450 451 # Model-free errors. 452 #################### 453 454 # Model-free data already exists.
455 - class RelaxMfError(BaseError):
456 - def __init__(self, run):
457 self.text = "Model-free data corresponding to the run " + `run` + " already exists." 458 if Debug: 459 self.save_state()
460 461 462 # Tensor errors. 463 ################ 464 465 # Diffusion tensor data corresponding to the run already exists.
466 - class RelaxTensorError(BaseError):
467 - def __init__(self, run):
468 self.text = "Diffusion tensor data corresponding to the run " + `run` + " already exists." 469 if Debug: 470 self.save_state()
471 472 # No diffusion tensor data loaded.
473 - class RelaxNoTensorError(BaseError):
474 - def __init__(self, run):
475 self.text = "No diffusion tensor data is loaded for the run " + `run` + "." 476 if Debug: 477 self.save_state()
478 479 480 # File errors. 481 ############## 482 483 # No directory.
484 - class RelaxDirError(BaseError):
485 - def __init__(self, name, dir):
486 if name == None: 487 self.text = "The directory " + `dir` + " does not exist." 488 else: 489 self.text = "The " + name + " directory " + `dir` + " does not exist." 490 if Debug: 491 self.save_state()
492 493 # No file.
494 - class RelaxFileError(BaseError):
495 - def __init__(self, name, file_name=None):
496 if file_name == None: 497 self.text = "The file " + `name` + " does not exist." 498 else: 499 self.text = "The " + name + " file " + `file_name` + " does not exist." 500 if Debug: 501 self.save_state()
502 503 # No data in file.
504 - class RelaxFileEmptyError(BaseError):
505 - def __init__(self):
506 self.text = "The file contains no data." 507 if Debug: 508 self.save_state()
509 510 # Overwrite file.
511 - class RelaxFileOverwriteError(BaseError):
512 - def __init__(self, file_name, flag):
513 self.text = "The file " + `file_name` + " already exists. Set the " + flag + " to 1 to overwrite." 514 if Debug: 515 self.save_state()
516 517 # Invalid data format.
518 - class RelaxInvalidDataError(BaseError):
519 - def __init__(self):
520 self.text = "The format of the data is invalid." 521 if Debug: 522 self.save_state()
523 524 525 # Run errors. 526 ############# 527 528 # Run already exists.
529 - class RelaxRunError(BaseError):
530 - def __init__(self, run):
531 self.text = "The run " + `run` + " already exists." 532 if Debug: 533 self.save_state()
534 535 # No run.
536 - class RelaxNoRunError(BaseError):
537 - def __init__(self, run):
538 self.text = "The run " + `run` + " has not been created yet." 539 if Debug: 540 self.save_state()
541 542 543 # Setup errors. 544 ############### 545 546 # Cannot setup the functions.
547 - class RelaxFuncSetupError(BaseError):
548 - def __init__(self, string):
549 self.text = "This function is not available for " + string + "." 550 if Debug: 551 self.save_state()
552 553 # The model has not been setup.
554 - class RelaxNoModelError(BaseError):
555 - def __init__(self, run):
556 self.text = "The models corresponding to the run " + `run` + " have not been setup." 557 if Debug: 558 self.save_state()
559 560 561 # Regular expression errors. 562 ############################ 563 564 # Bad regular expression.
565 - class RelaxRegExpError(BaseError):
566 - def __init__(self, name, value):
567 self.text = "The " + name + " argument " + `value` + " is not valid regular expression." 568 if Debug: 569 self.save_state()
570 571 572 # Data type errors. 573 ################### 574 575 # Value already exists.
576 - class RelaxValueError(BaseError):
577 - def __init__(self, data_type, run):
578 self.text = "The data type " + `data_type` + " already exists for " + `run` + "." 579 if Debug: 580 self.save_state()
581 582 # No data value.
583 - class RelaxNoValueError(BaseError):
584 - def __init__(self, name):
585 self.text = "The " + `name` + " value has not yet been set." 586 if Debug: 587 self.save_state()
588 589 # Unknown data type.
590 - class RelaxUnknownDataTypeError(BaseError):
591 - def __init__(self, name):
592 self.text = "The data type " + `name` + " is unknown." 593 if Debug: 594 self.save_state()
595 596 # Unknown parameter.
597 - class RelaxUnknownParamError(BaseError):
598 - def __init__(self, name, param_type=None):
599 if param_type: 600 self.text = "The " + param_type + " parameter " + `name` + " is unknown." 601 else: 602 self.text = "The parameter " + `name` + " is unknown." 603 if Debug: 604 self.save_state()
605 606 # Unknown parameter combination.
607 - class RelaxUnknownParamCombError(BaseError):
608 - def __init__(self, name, data):
609 self.text = "The " + `name` + " argument " + `data` + " represents an unknown parameter combination." 610 if Debug: 611 self.save_state()
612 613 614 # Simulation errors. 615 #################### 616 617 # No simulations.
618 - class RelaxNoSimError(BaseError):
619 - def __init__(self, run):
620 self.text = "Simulations for the run " + `run` + " have not been setup." 621 if Debug: 622 self.save_state()
623 624 625 # Style errors. 626 ############### 627 628 # Unknown style.
629 - class RelaxStyleError(BaseError):
630 - def __init__(self, style):
631 self.text = "The style " + `style` + " is unknown." 632 if Debug: 633 self.save_state()
634 635 636 # Colour errors. 637 ################ 638 639 # Invalid colour.
640 - class RelaxInvalidColourError(BaseError):
641 - def __init__(self, colour):
642 self.text = "The colour " + `colour` + " is invalid." 643 if Debug: 644 self.save_state()
645 646 647 # Value errors. 648 ############### 649 650 # Infinity.
651 - class RelaxInfError(BaseError):
652 - def __init__(self, name):
653 self.text = "The invalid " + name + " floating point value of infinity has occurred." 654 if Debug: 655 self.save_state()
656 657 # NaN (Not a Number).
658 - class RelaxNaNError(BaseError):
659 - def __init__(self, name):
660 self.text = "The invalid " + name + " floating point value of NaN (Not a Number) has occurred." 661 if Debug: 662 self.save_state()
663 664 665 666 # The RelaxWarning system. 667 ########################## 668
669 -class RelaxWarnings:
670 - def __init__(self):
671 """Class for placing all the warnings below into __builtin__""" 672 673 # Loop over all objects in 'self'. 674 for name in dir(self): 675 # Get the object. 676 object = getattr(self, name) 677 678 # Skip over all non-warning class objects. 679 if not (isinstance(object, ClassType) or isinstance(object, type(type))) or not match('Relax', name): 680 continue 681 682 # Place the warnings into __builtin__ 683 __builtin__.__setattr__(name, object) 684 685 # Tuple of all the warnings. 686 if hasattr(__builtin__, 'AllRelaxWarnings'): 687 __builtin__.AllRelaxWarnings = __builtin__.AllRelaxWarnings, object 688 else: 689 __builtin__.AllRelaxWarnings = object, 690 691 # Format warning messages. 692 warnings.formatwarning = self.format 693 694 # Set warning filters. 695 if Pedantic: 696 warnings.filterwarnings('error', category=self.BaseWarning) 697 else: 698 warnings.filterwarnings('always', category=self.BaseWarning)
699 700
701 - def format(self, message, category, filename, lineno):
702 """ Replacement for warnings.formatwarning to customise output format.""" 703 704 # Add the text 'RelaxWarning: ' to the start of the warning message. 705 if issubclass(category, self.BaseWarning): 706 message = "RelaxWarning: %s\n\n" % message 707 708 # Print stack-trace in debug mode. 709 if Debug: 710 tb = "" 711 for frame in inspect.stack()[4:]: 712 file = frame[1] 713 lineNo = frame[2] 714 func = frame[3] 715 tb_frame = ' File "%s", line %i, in %s\n' % (file, lineNo, func) 716 try: 717 context = frame[4][frame[5]] 718 except TypeError: 719 pass 720 else: 721 tb_frame = '%s %s\n' % (tb_frame, context.strip()) 722 tb = tb_frame + tb 723 tb = "Traceback (most recent call last):\n%s" % tb 724 message = tb + message 725 726 # Return the warning message. 727 return message
728 729 730 # Base class for all warnings. 731 ############################## 732
733 - class BaseWarning(Warning, RelaxErrors.BaseError):
734 - def __str__(self):
735 return self.text
736 737 738 # Standard warnings. 739 #################### 740
741 - class RelaxWarning(BaseWarning):
742 - def __init__(self, text):
743 self.text = text
744 745 746 # PDB warnings. 747 ############### 748 749 # Zero length XH bond vector.
750 - class RelaxZeroVectorWarning(BaseWarning):
751 - def __init__(self, res):
752 self.text = "The XH bond vector for residue " + `res` + " is of zero length."
753 754 755 # The atom is missing from the PDB file.
756 - class RelaxNoAtomWarning(BaseWarning):
757 - def __init__(self, atom, res):
758 self.text = "The atom %s could not be found for residue %i" % (atom, res)
759 760 761 # The PDB file is missing.
762 - class RelaxNoPDBFileWarning(BaseWarning):
763 - def __init__(self, file):
764 self.text = "The PDB file %s cannot be found, no structures will be loaded." % file
765