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

Source Code for Module info

   1  ############################################################################### 
   2  #                                                                             # 
   3  # Copyright (C) 2003-2016 Edward d'Auvergne                                   # 
   4  #                                                                             # 
   5  # This file is part of the program relax (http://www.nmr-relax.com).          # 
   6  #                                                                             # 
   7  # This program 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 3 of the License, or           # 
  10  # (at your option) any later version.                                         # 
  11  #                                                                             # 
  12  # This program 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 this program.  If not, see <http://www.gnu.org/licenses/>.       # 
  19  #                                                                             # 
  20  ############################################################################### 
  21   
  22  # Module docstring. 
  23  """Module containing the introductory text container.""" 
  24   
  25  # Dependencies. 
  26  import dep_check 
  27   
  28  # Python module imports. 
  29  if dep_check.ctypes_module: 
  30      import ctypes 
  31      if hasattr(ctypes, 'windll'): 
  32          import ctypes.wintypes 
  33  else: 
  34      ctypes = None 
  35  if dep_check.ctypes_structure_module: 
  36      from ctypes import Structure 
  37  else: 
  38      Structure = object 
  39  from os import environ, pathsep, waitpid 
  40  import platform 
  41  from re import search, sub 
  42  PIPE, Popen = None, None 
  43  if dep_check.subprocess_module: 
  44      from subprocess import PIPE, Popen 
  45  import sys 
  46  from textwrap import wrap 
  47   
  48  # relax module imports. 
  49  from status import Status; status = Status() 
  50  from version import repo_revision, repo_url, version, version_full 
  51   
  52   
  61   
  62   
  63   
64 -class Info_box(object):
65 """A container storing information about relax.""" 66 67 # Class variable for storing the class instance. 68 instance = None 69
70 - def __init__(self):
71 """Create the program introduction text stings. 72 73 This class generates a container with the following objects: 74 - title: The program title 'relax' 75 - version: For example 'repository checkout' or '1.3.8'. 76 - desc: The short program description. 77 - copyright: A list of copyright statements. 78 - licence: Text pertaining to the licencing. 79 - errors: A list of import errors. 80 """ 81 82 # Program name and version. 83 self.title = "relax" 84 self.version = version 85 86 # The relax website. 87 self.website = "http://www.nmr-relax.com" 88 89 # Program description. 90 self.desc = "Molecular dynamics by NMR data analysis" 91 92 # Long description 93 self.desc_long = "The program relax is designed for the study of the dynamics of proteins or other macromolecules though the analysis of experimental NMR data. It is a community driven project created by NMR spectroscopists for NMR spectroscopists. It supports exponential curve fitting for the calculation of the R1 and R2 relaxation rates, calculation of the NOE, reduced spectral density mapping, and the Lipari and Szabo model-free analysis." 94 95 # Copyright printout. 96 self.copyright = [] 97 self.copyright.append("Copyright (C) 2001-2006 Edward d'Auvergne") 98 self.copyright.append("Copyright (C) 2006-2016 the relax development team") 99 self.copyright_short = "Copyright (C) 2001-2016 the relax development team" 100 101 # Program licence and help. 102 self.licence = "This is free software which you are welcome to modify and redistribute under the conditions of the GNU General Public License (GPL). This program, including all modules, is licensed under the GPL and comes with absolutely no warranty. For details type 'GPL' within the relax prompt." 103 104 # ImportErrors, if any. 105 self.errors = [] 106 if not dep_check.C_module_exp_fn: 107 self.errors.append(dep_check.C_module_exp_fn_mesg) 108 109 # References. 110 self._setup_references()
111 112
113 - def __new__(self, *args, **kargs):
114 """Replacement function for implementing the singleton design pattern.""" 115 116 # First initialisation. 117 if self.instance is None: 118 self.instance = object.__new__(self, *args, **kargs) 119 120 # Already initialised, so return the instance. 121 return self.instance
122 123
124 - def _setup_references(self):
125 """Build a dictionary of all references useful for relax.""" 126 127 # Initialise the dictionary. 128 self.bib = {} 129 130 # Place the containers into the dictionary. 131 self.bib['Bieri11'] = Bieri11() 132 self.bib['Clore90'] = Clore90() 133 self.bib['dAuvergne06'] = dAuvergne06() 134 self.bib['dAuvergneGooley03'] = dAuvergneGooley03() 135 self.bib['dAuvergneGooley06'] = dAuvergneGooley06() 136 self.bib['dAuvergneGooley07'] = dAuvergneGooley07() 137 self.bib['dAuvergneGooley08a'] = dAuvergneGooley08a() 138 self.bib['dAuvergneGooley08b'] = dAuvergneGooley08b() 139 self.bib['Delaglio95'] = Delaglio95() 140 self.bib['GoddardKneller'] = GoddardKneller() 141 self.bib['LipariSzabo82a'] = LipariSzabo82a() 142 self.bib['LipariSzabo82b'] = LipariSzabo82b()
143 144
145 - def centre(self, string, width=100):
146 """Format the string to be centred to a certain number of spaces. 147 148 @param string: The string to centre. 149 @type string: str 150 @keyword width: The number of characters to centre to. 151 @type width: int 152 @return: The centred string with leading whitespace added. 153 @rtype: str 154 """ 155 156 # Calculate the number of spaces needed. 157 spaces = int((width - len(string)) / 2) 158 159 # The new string. 160 string = spaces * ' ' + string 161 162 # Return the new string. 163 return string
164 165
166 - def file_type(self, path):
167 """Return a string representation of the file type. 168 169 @param path: The full path of the file to return information about. 170 @type path: str 171 @return: The single line file type information string. 172 @rtype: str 173 """ 174 175 # Python 2.3 and earlier. 176 if Popen == None: 177 return '' 178 179 # Test if the 'file' program is installed. 180 pipe = Popen('file --help', shell=True, stdout=PIPE, stderr=PIPE, close_fds=False) 181 err = pipe.stderr.readlines() 182 if err: 183 return '' 184 185 # The command. 186 cmd = "file -b '%s'" % path 187 188 # Execute. 189 pipe = Popen(cmd, shell=True, stdout=PIPE, close_fds=False) 190 if not hasattr(ctypes, 'windll'): 191 waitpid(pipe.pid, 0) 192 193 # The STDOUT data. 194 data = pipe.stdout.readlines() 195 196 # Mac OS X 3-way binary. 197 if data[0][:-1] == 'Mach-O universal binary with 3 architectures': 198 # Arch. 199 arch = [None, None, None] 200 for i in range(3): 201 row = data[i+1].split('\t') 202 arch[i] = row[1][:-1] 203 arch.sort() 204 205 # The full file type printout. 206 if arch == ['Mach-O 64-bit executable x86_64', 'Mach-O executable i386', 'Mach-O executable ppc']: 207 file_type = '3-way exec (i386, ppc, x86_64)' 208 elif arch == ['Mach-O 64-bit bundle x86_64', 'Mach-O bundle i386', 'Mach-O bundle ppc']: 209 file_type = '3-way bundle (i386, ppc, x86_64)' 210 elif arch == ['Mach-O 64-bit dynamically linked shared library x86_64', 'Mach-O dynamically linked shared library i386', 'Mach-O dynamically linked shared library ppc']: 211 file_type = '3-way lib (i386, ppc, x86_64)' 212 elif arch == ['Mach-O 64-bit object x86_64', 'Mach-O object i386', 'Mach-O object ppc']: 213 file_type = '3-way obj (i386, ppc, x86_64)' 214 else: 215 file_type = '3-way %s' % arch 216 217 # Mac OS X 2-way binary. 218 elif data[0][:-1] == 'Mach-O universal binary with 2 architectures': 219 # Arch. 220 arch = [None, None] 221 for i in range(2): 222 row = data[i+1].split('\t') 223 arch[i] = row[1][:-1] 224 arch.sort() 225 226 # The full file type printout. 227 if arch == ['Mach-O executable i386', 'Mach-O executable ppc']: 228 file_type = '2-way exec (i386, ppc)' 229 elif arch == ['Mach-O bundle i386', 'Mach-O bundle ppc']: 230 file_type = '2-way bundle (i386, ppc)' 231 elif arch == ['Mach-O dynamically linked shared library i386', 'Mach-O dynamically linked shared library ppc']: 232 file_type = '2-way lib (i386, ppc)' 233 elif arch == ['Mach-O object i386', 'Mach-O object ppc']: 234 file_type = '2-way obj (i386, ppc)' 235 else: 236 file_type = '2-way %s' % arch 237 238 # Default to all info. 239 else: 240 file_type = data[0][:-1] 241 for i in range(1, len(data)): 242 row = data[i].split('\t') 243 arch[i] = row[1][:-1] 244 file_type += " %s" % arch 245 246 # Return a string value. 247 if file_type == None: 248 return '' 249 return file_type
250 251
252 - def format_max_width(self, data):
253 """Return the text formatting width for the given data. 254 255 @param data: The list of things to print out. 256 @type data: list 257 @return: The maximum width of the elements in the list. 258 @rtype: int 259 """ 260 261 # Init. 262 width = 0 263 264 # Loop over the data. 265 for i in range(len(data)): 266 # The string representation size. 267 size = len(repr(data[i])) 268 269 # Find the max size. 270 if size > width: 271 width = size 272 273 # Return the max width. 274 return width
275 276
277 - def intro_text(self):
278 """Create the introductory string for STDOUT printing. 279 280 This text is word-wrapped to a fixed width of 100 characters (or 80 on MS Windows). 281 282 283 @return: The introductory string. 284 @rtype: str 285 """ 286 287 # Some new lines. 288 intro_string = '\n\n\n' 289 290 # Program name and version - subversion code. 291 if version == 'repository checkout': 292 text = "%s %s r%s" % (self.title, self.version, repo_revision) 293 text2 = "%s" % (repo_url) 294 intro_string = intro_string + self.centre(text, status.text_width) + '\n' + self.centre(text2, status.text_width) + '\n\n' 295 296 # Program name and version - official releases. 297 else: 298 text = "%s %s" % (self.title, self.version) 299 intro_string = intro_string + self.centre(text, status.text_width) + '\n\n' 300 301 # Program description. 302 intro_string = intro_string + self.centre(self.desc, status.text_width) + '\n\n' 303 304 # Copyright printout. 305 for i in range(len(self.copyright)): 306 intro_string = intro_string + self.centre(self.copyright[i], status.text_width) + '\n' 307 intro_string = intro_string + '\n' 308 309 # Program licence and help (wrapped). 310 for line in wrap(self.licence, status.text_width): 311 intro_string = intro_string + line + '\n' 312 intro_string = intro_string + '\n' 313 314 # Help message. 315 help = "Assistance in using the relax prompt and scripting interface can be accessed by typing 'help' within the prompt." 316 for line in wrap(help, status.text_width): 317 intro_string = intro_string + line + '\n' 318 319 # ImportErrors, if any. 320 for i in range(len(self.errors)): 321 intro_string = intro_string + '\n' + self.errors[i] + '\n' 322 intro_string = intro_string + '\n' 323 324 # The multi-processor message, if it exists. 325 if hasattr(self, 'multi_processor_string'): 326 for line in wrap('Processor fabric: %s\n' % self.multi_processor_string, status.text_width): 327 intro_string = intro_string + line + '\n' 328 329 # Return the formatted text. 330 return intro_string
331 332
333 - def package_info(self):
334 """Return a string for printing to STDOUT with info from the Python packages used by relax. 335 336 @return: The info string. 337 @rtype: str 338 """ 339 340 # Init. 341 text = '' 342 package = [] 343 status = [] 344 version = [] 345 path = [] 346 347 # Intro. 348 text = text + ("\nPython packages and modules (most are optional):\n\n") 349 350 # Header. 351 package.append("Name") 352 status.append("Installed") 353 version.append("Version") 354 path.append("Path") 355 356 # minfx. 357 package.append('minfx') 358 status.append(True) 359 if hasattr(dep_check.minfx, '__version__'): 360 version.append(dep_check.minfx.__version__) 361 else: 362 version.append('Unknown') 363 path.append(dep_check.minfx.__path__[0]) 364 365 # bmrblib. 366 package.append('bmrblib') 367 status.append(dep_check.bmrblib_module) 368 try: 369 if hasattr(dep_check.bmrblib, '__version__'): 370 version.append(dep_check.bmrblib.__version__) 371 else: 372 version.append('Unknown') 373 except: 374 version.append('') 375 try: 376 path.append(dep_check.bmrblib.__path__[0]) 377 except: 378 path.append('') 379 380 # numpy. 381 package.append('numpy') 382 status.append(True) 383 try: 384 version.append(dep_check.numpy.version.version) 385 path.append(dep_check.numpy.__path__[0]) 386 except: 387 version.append('') 388 path.append('') 389 390 # scipy. 391 package.append('scipy') 392 status.append(dep_check.scipy_module) 393 try: 394 version.append(dep_check.scipy.version.version) 395 path.append(dep_check.scipy.__path__[0]) 396 except: 397 version.append('') 398 path.append('') 399 400 # wxPython. 401 package.append('wxPython') 402 status.append(dep_check.wx_module) 403 try: 404 version.append(dep_check.wx.version()) 405 path.append(dep_check.wx.__path__[0]) 406 except: 407 version.append('') 408 path.append('') 409 410 # matplotlib. 411 package.append('matplotlib') 412 status.append(dep_check.matplotlib_module) 413 try: 414 version.append(dep_check.matplotlib.__version__) 415 path.append(dep_check.matplotlib.__path__[0]) 416 except: 417 version.append('') 418 path.append('') 419 420 # mpi4py. 421 package.append('mpi4py') 422 status.append(dep_check.mpi4py_module) 423 try: 424 version.append(dep_check.mpi4py.__version__) 425 path.append(dep_check.mpi4py.__path__[0]) 426 427 # MPI version. 428 try: 429 import mpi4py.MPI 430 vendor = mpi4py.MPI.get_vendor() 431 version[-1] += (" (%s %s.%s.%s)" % (vendor[0], vendor[1][0], vendor[1][1], vendor[1][2])) 432 except: 433 pass 434 435 except: 436 version.append('') 437 path.append('') 438 439 # epydoc. 440 package.append('epydoc') 441 status.append(dep_check.epydoc_module) 442 try: 443 version.append(dep_check.epydoc.__version__) 444 path.append(dep_check.epydoc.__path__[0]) 445 except: 446 version.append('') 447 path.append('') 448 449 # optparse. 450 package.append('optparse') 451 status.append(True) 452 try: 453 version.append(dep_check.optparse.__version__) 454 path.append(dep_check.optparse.__file__) 455 except: 456 version.append('') 457 path.append('') 458 459 # readline. 460 package.append('readline') 461 status.append(dep_check.readline_module) 462 version.append('') 463 try: 464 path.append(dep_check.readline.__file__) 465 except: 466 path.append('') 467 468 # profile. 469 package.append('profile') 470 status.append(dep_check.profile_module) 471 version.append('') 472 try: 473 path.append(dep_check.profile.__file__) 474 except: 475 path.append('') 476 477 # BZ2. 478 package.append('bz2') 479 status.append(dep_check.bz2_module) 480 version.append('') 481 try: 482 path.append(dep_check.bz2.__file__) 483 except: 484 path.append('') 485 486 # gzip. 487 package.append('gzip') 488 status.append(dep_check.gzip_module) 489 version.append('') 490 try: 491 path.append(dep_check.gzip.__file__) 492 except: 493 path.append('') 494 495 # IO. 496 package.append('io') 497 status.append(dep_check.io_module) 498 version.append('') 499 try: 500 path.append(dep_check.io.__file__) 501 except: 502 path.append('') 503 504 # XML. 505 package.append('xml') 506 status.append(dep_check.xml_module) 507 if dep_check.xml_module: 508 version.append("%s (%s)" % (dep_check.xml_version, dep_check.xml_type)) 509 path.append(dep_check.xml.__file__) 510 else: 511 version.append('') 512 path.append('') 513 514 # XML minidom. 515 package.append('xml.dom.minidom') 516 version.append('') 517 try: 518 import xml.dom.minidom 519 status.append(True) 520 except: 521 status.append(False) 522 try: 523 path.append(xml.dom.minidom.__file__) 524 except: 525 path.append('') 526 527 # Format the data. 528 fmt_package = "%%-%ss" % (self.format_max_width(package) + 2) 529 fmt_status = "%%-%ss" % (self.format_max_width(status) + 2) 530 fmt_version = "%%-%ss" % (self.format_max_width(version) + 2) 531 fmt_path = "%%-%ss" % (self.format_max_width(path) + 2) 532 533 # Add the text. 534 for i in range(len(package)): 535 text += fmt_package % package[i] 536 text += fmt_status % status[i] 537 text += fmt_version % version[i] 538 text += fmt_path % path[i] 539 text += '\n' 540 541 # Return the info string. 542 return text
543 544
545 - def processor_name(self):
546 """Return a string for the processor name. 547 548 @return: The processor name, in much more detail than platform.processor(). 549 @rtype: str 550 """ 551 552 # Python 2.3 and earlier. 553 if Popen == None: 554 return "" 555 556 # No subprocess module. 557 if not dep_check.subprocess_module: 558 return "" 559 560 # The system. 561 system = platform.system() 562 563 # Linux systems. 564 if system == 'Linux': 565 # The command to run. 566 cmd = "cat /proc/cpuinfo" 567 568 # Execute the command. 569 pipe = Popen(cmd, shell=True, stdout=PIPE, close_fds=False) 570 waitpid(pipe.pid, 0) 571 572 # Get the STDOUT data. 573 data = pipe.stdout.readlines() 574 575 # Loop over the lines, returning the first model name with the leading "model name :" text stripped. 576 for line in data: 577 # Decode Python 3 byte arrays. 578 if hasattr(line, 'decode'): 579 line = line.decode() 580 581 # Find the processor name. 582 if search("model name", line): 583 # Convert the text. 584 name = sub(".*model name.*:", "", line, 1) 585 name = name.strip() 586 587 # Return the name. 588 return name 589 590 # Windows systems. 591 if system == 'Windows' or system == 'Microsoft': 592 return platform.processor() 593 594 # Mac OS X systems. 595 if system == 'Darwin': 596 # Add the 'sysctl' path to the environment (if needed). 597 environ['PATH'] += pathsep + '/usr/sbin' 598 599 # The command to run. 600 cmd = "sysctl -n machdep.cpu.brand_string" 601 602 # Execute the command in a fail safe way, return the result or nothing. 603 try: 604 # Execute. 605 pipe = Popen(cmd, shell=True, stdout=PIPE, close_fds=False) 606 waitpid(pipe.pid, 0) 607 608 # Get the STDOUT data. 609 data = pipe.stdout.readlines() 610 611 # Decode Python 3 byte arrays. 612 string = data[0] 613 if hasattr(string, 'decode'): 614 string = string.decode() 615 616 # Find the processor name. 617 # Return the string. 618 return string.strip() 619 620 # Nothing. 621 except: 622 return "" 623 624 # Unknown. 625 return ""
626 627
628 - def ram_info(self, format=" %-25s%s\n"):
629 """Return a string for printing to STDOUT with info from the Python packages used by relax. 630 631 @keyword format: The formatting string. 632 @type format: str 633 @return: The info string. 634 @rtype: str 635 """ 636 637 # Python 2.3 and earlier. 638 if Popen == None: 639 return '' 640 641 # Init. 642 text = '' 643 644 # The system. 645 system = platform.system() 646 647 # Unix and GNU/Linux systems. 648 if system == 'Linux': 649 pipe = Popen('free -m', shell=True, stdin=PIPE, stdout=PIPE, stderr=PIPE, close_fds=False) 650 free_lines = pipe.stdout.readlines() 651 if free_lines: 652 # Extract the info. 653 for line in free_lines: 654 # Split up the line. 655 row = line.split() 656 657 # The RAM size. 658 if row[0] == 'Mem:': 659 text += format % ("Total RAM size: ", row[1], "Mb") 660 661 # The swap size. 662 if row[0] == 'Swap:': 663 text += format % ("Total swap size: ", row[1], "Mb") 664 665 # Windows systems (supported by ctypes.windll). 666 if system == 'Windows' or system == 'Microsoft': 667 # Initialise the memory info class. 668 mem = MemoryStatusEx() 669 670 # The RAM size. 671 text += format % ("Total RAM size: ", mem.ullTotalPhys / 1024.**2, "Mb") 672 673 # The swap size. 674 text += format % ("Total swap size: ", mem.ullTotalVirtual / 1024.**2, "Mb") 675 676 # Mac OS X systems. 677 if system == 'Darwin': 678 # Add the 'sysctl' path to the environment (if needed). 679 environ['PATH'] += pathsep + '/usr/sbin' 680 681 # The commands to run. 682 cmd = "sysctl -n hw.physmem" 683 cmd2 = "sysctl -n hw.memsize" 684 685 # Execute the command in a fail safe way, return the result or nothing. 686 try: 687 # Execute. 688 pipe = Popen(cmd, shell=True, stdout=PIPE, close_fds=False) 689 waitpid(pipe.pid, 0) 690 691 # Get the STDOUT data. 692 data = pipe.stdout.readlines() 693 694 # Execute. 695 pipe = Popen(cmd2, shell=True, stdout=PIPE, close_fds=False) 696 waitpid(pipe.pid, 0) 697 698 # Get the STDOUT data. 699 data2 = pipe.stdout.readlines() 700 701 # Convert the values. 702 ram = int(data[0].strip()) 703 total = int(data2[0].strip()) 704 swap = total - ram 705 706 # The RAM size. 707 text += format % ("Total RAM size: ", ram / 1024.**2, "Mb") 708 709 # The swap size. 710 text += format % ("Total swap size: ", swap / 1024.**2, "Mb") 711 712 # Nothing. 713 except: 714 pass 715 716 # Unknown. 717 if not text: 718 text += format % ("Total RAM size: ", "?", "Mb") 719 text += format % ("Total swap size: ", "?", "Mb") 720 721 # Return the info string. 722 return text
723 724
725 - def relax_module_info(self):
726 """Return a string with info about the relax modules. 727 728 @return: The info string. 729 @rtype: str 730 """ 731 732 # Init. 733 text = '' 734 name = [] 735 status = [] 736 file_type = [] 737 path = [] 738 739 # Intro. 740 text = text + ("\nrelax C modules:\n\n") 741 742 # Header. 743 name.append("Module") 744 status.append("Compiled") 745 file_type.append("File type") 746 path.append("Path") 747 748 # relaxation curve-fitting. 749 name.append('target_functions.relax_fit') 750 status.append(dep_check.C_module_exp_fn) 751 if hasattr(dep_check, 'relax_fit'): 752 file_type.append(self.file_type(dep_check.relax_fit.__file__)) 753 path.append(dep_check.relax_fit.__file__) 754 else: 755 file_type.append('') 756 path.append('') 757 758 # Format the data. 759 fmt_name = "%%-%ss" % (self.format_max_width(name) + 2) 760 fmt_status = "%%-%ss" % (self.format_max_width(status) + 2) 761 fmt_file_type = "%%-%ss" % (self.format_max_width(file_type) + 2) 762 fmt_path = "%%-%ss" % (self.format_max_width(path) + 2) 763 764 # Add the text. 765 for i in range(len(name)): 766 text += fmt_name % name[i] 767 text += fmt_status % status[i] 768 text += fmt_file_type % file_type[i] 769 text += fmt_path % path[i] 770 text += '\n' 771 772 # Return the info string. 773 return text
774 775
776 - def sys_info(self):
777 """Return a string for printing to STDOUT with info about the current relax instance. 778 779 @return: The info string. 780 @rtype: str 781 """ 782 783 # Init. 784 text = '' 785 786 # Formatting string. 787 format = " %-25s%s\n" 788 format2 = " %-25s%s %s\n" 789 790 # Hardware info. 791 text = text + ("\nHardware information:\n") 792 if hasattr(platform, 'machine'): 793 text = text + (format % ("Machine: ", platform.machine())) 794 if hasattr(platform, 'processor'): 795 text = text + (format % ("Processor: ", platform.processor())) 796 text = text + (format % ("Processor name: ", self.processor_name())) 797 text = text + (format % ("Endianness: ", sys.byteorder)) 798 text = text + self.ram_info(format=format2) 799 800 # OS info. 801 text = text + ("\nOperating system information:\n") 802 if hasattr(platform, 'system'): 803 text = text + (format % ("System: ", platform.system())) 804 if hasattr(platform, 'release'): 805 text = text + (format % ("Release: ", platform.release())) 806 if hasattr(platform, 'version'): 807 text = text + (format % ("Version: ", platform.version())) 808 if hasattr(platform, 'win32_ver') and platform.win32_ver()[0]: 809 text = text + (format % ("Win32 version: ", (platform.win32_ver()[0] + " " + platform.win32_ver()[1] + " " + platform.win32_ver()[2] + " " + platform.win32_ver()[3]))) 810 if hasattr(platform, 'linux_distribution') and platform.linux_distribution()[0]: 811 text = text + (format % ("GNU/Linux version: ", (platform.linux_distribution()[0] + " " + platform.linux_distribution()[1] + " " + platform.linux_distribution()[2]))) 812 if hasattr(platform, 'mac_ver') and platform.mac_ver()[0]: 813 text = text + (format % ("Mac version: ", (platform.mac_ver()[0] + " (" + platform.mac_ver()[1][0] + ", " + platform.mac_ver()[1][1] + ", " + platform.mac_ver()[1][2] + ") " + platform.mac_ver()[2]))) 814 if hasattr(platform, 'dist'): 815 text = text + (format % ("Distribution: ", (platform.dist()[0] + " " + platform.dist()[1] + " " + platform.dist()[2]))) 816 if hasattr(platform, 'platform'): 817 text = text + (format % ("Full platform string: ", (platform.platform()))) 818 if hasattr(ctypes, 'windll'): 819 text = text + (format % ("Windows architecture: ", (self.win_arch()))) 820 821 # Python info. 822 text = text + ("\nPython information:\n") 823 if hasattr(platform, 'architecture'): 824 text = text + (format % ("Architecture: ", (platform.architecture()[0] + " " + platform.architecture()[1]))) 825 if hasattr(platform, 'python_version'): 826 text = text + (format % ("Python version: ", platform.python_version())) 827 if hasattr(platform, 'python_branch'): 828 text = text + (format % ("Python branch: ", platform.python_branch())) 829 if hasattr(platform, 'python_build'): 830 text = text + ((format[:-1]+', %s\n') % ("Python build: ", platform.python_build()[0], platform.python_build()[1])) 831 if hasattr(platform, 'python_compiler'): 832 text = text + (format % ("Python compiler: ", platform.python_compiler())) 833 if hasattr(platform, 'libc_ver'): 834 text = text + (format % ("Libc version: ", (platform.libc_ver()[0] + " " + platform.libc_ver()[1]))) 835 if hasattr(platform, 'python_implementation'): 836 text = text + (format % ("Python implementation: ", platform.python_implementation())) 837 if hasattr(platform, 'python_revision'): 838 text = text + (format % ("Python revision: ", platform.python_revision())) 839 if sys.executable: 840 text = text + (format % ("Python executable: ", sys.executable)) 841 if hasattr(sys, 'flags'): 842 text = text + (format % ("Python flags: ", sys.flags)) 843 if hasattr(sys, 'float_info'): 844 text = text + (format % ("Python float info: ", sys.float_info)) 845 text = text + (format % ("Python module path: ", sys.path)) 846 847 # Python packages. 848 text = text + self.package_info() 849 850 # relax info: 851 text = text + "\nrelax information:\n" 852 text = text + (format % ("Version: ", version_full())) 853 if hasattr(self, "multi_processor_string"): 854 text += format % ("Processor fabric: ", self.multi_processor_string) 855 856 # relax modules. 857 text = text + self.relax_module_info() 858 859 # End with an empty newline. 860 text = text + ("\n") 861 862 # Return the text. 863 return text
864 865
866 - def win_arch(self):
867 """Determine the MS Windows architecture. 868 869 @return: The architecture string. 870 @rtype: str 871 """ 872 873 # 64-bit versions. 874 if 'PROCESSOR_ARCHITEW6432' in environ: 875 arch = environ['PROCESSOR_ARCHITEW6432'] 876 877 # Default 32-bit. 878 else: 879 arch = environ['PROCESSOR_ARCHITECTURE'] 880 881 # Return the architecture. 882 return arch
883 884 885
886 -class MemoryStatusEx(Structure):
887 """Special object for obtaining hardware info in MS Windows.""" 888 889 if hasattr(ctypes, 'windll'): 890 _fields_ = [ 891 ('dwLength', ctypes.wintypes.DWORD), 892 ('dwMemoryLoad', ctypes.wintypes.DWORD), 893 ('ullTotalPhys', ctypes.c_ulonglong), 894 ('ullAvailPhys', ctypes.c_ulonglong), 895 ('ullTotalPageFile', ctypes.c_ulonglong), 896 ('ullAvailPageFile', ctypes.c_ulonglong), 897 ('ullTotalVirtual', ctypes.c_ulonglong), 898 ('ullAvailVirtual', ctypes.c_ulonglong), 899 ('ullExtendedVirtual', ctypes.c_ulonglong), 900 ] 901
902 - def __init__(self):
903 """Set up the information and handle non MS Windows systems.""" 904 905 # Get the required info (for MS Windows only). 906 if hasattr(ctypes, 'windll'): 907 self.dwLength = ctypes.sizeof(self) 908 ctypes.windll.kernel32.GlobalMemoryStatusEx(ctypes.byref(self))
909 910 911
912 -class Ref:
913 """Reference base class.""" 914 915 # Initialise all class variables to None. 916 type = None 917 author = None 918 author2 = None 919 title = None 920 status = None 921 journal = None 922 journal_full = None 923 volume = None 924 number = None 925 doi = None 926 pubmed_id = None 927 url = None 928 pages = None 929 year = None 930 931
932 - def __getattr__(self, name):
933 """Generate some variables on the fly. 934 935 This is only called for objects not found in the class. 936 937 @param name: The name of the object. 938 @type name: str 939 @raises AttributeError: If the object cannot be created. 940 @returns: The generated object. 941 @rtype: anything 942 """ 943 944 # Page numbers. 945 if name in ['page_first', 'page_last']: 946 # No page info. 947 if not self.pages: 948 return None 949 950 # First split the page range. 951 vals = self.pages.split('-') 952 953 # Single page. 954 if len(vals) == 1: 955 return vals[0] 956 957 # First page. 958 if name == 'page_first': 959 return vals[0] 960 961 # Last page. 962 if name == 'page_last': 963 return vals[1] 964 965 raise AttributeError(name)
966 967
968 - def cite_short(self, author=True, title=True, journal=True, volume=True, number=True, pages=True, year=True, doi=True, url=True, status=True):
969 """Compile a short citation. 970 971 The returned text will have the form of: 972 973 - d'Auvergne, E.J. and Gooley, P.R. (2008). Optimisation of NMR dynamic models I. Minimisation algorithms and their performance within the model-free and Brownian rotational diffusion spaces. J. Biomol. NMR, 40(2), 107-119. 974 975 976 @keyword author: The author flag. 977 @type author: bool 978 @keyword title: The title flag. 979 @type title: bool 980 @keyword journal: The journal flag. 981 @type journal: bool 982 @keyword volume: The volume flag. 983 @type volume: bool 984 @keyword number: The number flag. 985 @type number: bool 986 @keyword pages: The pages flag. 987 @type pages: bool 988 @keyword year: The year flag. 989 @type year: bool 990 @keyword doi: The doi flag. 991 @type doi: bool 992 @keyword url: The url flag. 993 @type url: bool 994 @keyword status: The status flag. This will only be shown if not 'published'. 995 @type status: bool 996 @return: The full citation. 997 @rtype: str 998 """ 999 1000 # Build the citation. 1001 cite = '' 1002 if author and self.author and hasattr(self, 'author'): 1003 cite = cite + self.author 1004 if year and self.year and hasattr(self, 'year'): 1005 cite = cite + ' (' + repr(self.year) + ').' 1006 if title and self.title and hasattr(self, 'title'): 1007 cite = cite + ' ' + self.title 1008 if journal and self.journal and hasattr(self, 'journal'): 1009 cite = cite + ' ' + self.journal + ',' 1010 if volume and self.volume and hasattr(self, 'volume'): 1011 cite = cite + ' ' + self.volume 1012 if number and self.number and hasattr(self, 'number'): 1013 cite = cite + '(' + self.number + '),' 1014 if pages and self.pages and hasattr(self, 'pages'): 1015 cite = cite + ' ' + self.pages 1016 if doi and self.doi and hasattr(self, 'doi'): 1017 cite = cite + ' (http://dx.doi.org/'+self.doi + ')' 1018 if url and self.url and hasattr(self, 'url'): 1019 cite = cite + ' (' + self.url + ')' 1020 if status and hasattr(self, 'status') and self.status != 'published': 1021 cite = cite + ' (' + self.status + ')' 1022 1023 # End. 1024 if cite[-1] != '.': 1025 cite = cite + '.' 1026 1027 # Return the citation. 1028 return cite
1029 1030
1031 - def cite_html(self, author=True, title=True, journal=True, volume=True, number=True, pages=True, year=True, doi=True, url=True, status=True):
1032 """Compile a citation for HTML display. 1033 1034 @keyword author: The author flag. 1035 @type author: bool 1036 @keyword title: The title flag. 1037 @type title: bool 1038 @keyword journal: The journal flag. 1039 @type journal: bool 1040 @keyword volume: The volume flag. 1041 @type volume: bool 1042 @keyword number: The number flag. 1043 @type number: bool 1044 @keyword pages: The pages flag. 1045 @type pages: bool 1046 @keyword year: The year flag. 1047 @type year: bool 1048 @keyword doi: The doi flag. 1049 @type doi: bool 1050 @keyword url: The url flag. 1051 @type url: bool 1052 @keyword status: The status flag. This will only be shown if not 'published'. 1053 @type status: bool 1054 @return: The full citation. 1055 @rtype: str 1056 """ 1057 1058 # Build the citation. 1059 cite = '' 1060 if author and hasattr(self, 'author') and self.author: 1061 cite = cite + self.author 1062 if year and hasattr(self, 'year') and self.year: 1063 cite = cite + ' (' + repr(self.year) + ').' 1064 if title and hasattr(self, 'title') and self.title: 1065 cite = cite + ' ' + self.title 1066 if journal and hasattr(self, 'journal') and self.journal: 1067 cite = cite + ' <em>' + self.journal + '</em>,' 1068 if volume and hasattr(self, 'volume') and self.volume: 1069 cite = cite + ' <strong>' + self.volume + '</strong>' 1070 if number and hasattr(self, 'number') and self.number: 1071 cite = cite + '(' + self.number + '),' 1072 if pages and hasattr(self, 'pages') and self.pages: 1073 cite = cite + ' ' + self.pages 1074 if doi and hasattr(self, 'doi') and self.doi: 1075 cite = cite + ' (<a href="http://dx.doi.org/%s">abstract</a>)' % self.doi 1076 if url and hasattr(self, 'url') and self.url: 1077 cite = cite + ' (<a href="%s">url</a>)' % self.url 1078 if status and hasattr(self, 'status') and self.status != 'published': 1079 cite = cite + ' (<i>%s</i>)' % self.status 1080 1081 # End. 1082 if cite[-1] != '.': 1083 cite = cite + '.' 1084 1085 # Return the citation. 1086 return cite
1087 1088 1089
1090 -class Bieri11(Ref):
1091 """Bibliography container.""" 1092 1093 type = "journal" 1094 author = "Bieri, M., d'Auvergne, E. J. and Gooley, P. R." 1095 author2 = [["Michael", "Bieri", "M.", ""], ["Edward", "d'Auvergne", "E.", "J."], ["Paul", "Gooley", "P.", "R."]] 1096 title = "relaxGUI: a new software for fast and simple NMR relaxation data analysis and calculation of ps-ns and micro-s motion of proteins" 1097 journal = "J. Biomol. NMR" 1098 journal_full = "Journal of Biomolecular NMR" 1099 abstract = "Investigation of protein dynamics on the ps-ns and mus-ms timeframes provides detailed insight into the mechanisms of enzymes and the binding properties of proteins. Nuclear magnetic resonance (NMR) is an excellent tool for studying protein dynamics at atomic resolution. Analysis of relaxation data using model-free analysis can be a tedious and time consuming process, which requires good knowledge of scripting procedures. The software relaxGUI was developed for fast and simple model-free analysis and is fully integrated into the software package relax. It is written in Python and uses wxPython to build the graphical user interface (GUI) for maximum performance and multi-platform use. This software allows the analysis of NMR relaxation data with ease and the generation of publication quality graphs as well as color coded images of molecular structures. The interface is designed for simple data analysis and management. The software was tested and validated against the command line version of relax." 1100 authoraddress = "Department of Biochemistry and Molecular Biology, University of Melbourne, Melbourne, Victoria 3010, Australia." 1101 doi = "10.1007/s10858-011-9509-1" 1102 pubmed_id = 21618018 1103 status = "published" 1104 year = 2011
1105 1106 1107
1108 -class Clore90(Ref):
1109 """Bibliography container.""" 1110 1111 type = "journal" 1112 author = "Clore, G. M. and Szabo, A. and Bax, A. and Kay, L. E. and Driscoll, P. C. and Gronenborn, A. M." 1113 title = "Deviations from the simple 2-parameter model-free approach to the interpretation of N-15 nuclear magnetic-relaxation of proteins" 1114 journal = "J. Am. Chem. Soc." 1115 journal_full = "Journal of the American Chemical Society" 1116 volume = "112" 1117 number = "12" 1118 pages = "4989-4991" 1119 address = "1155 16th St, NW, Washington, DC 20036" 1120 sourceid = "ISI:A1990DH27700070" 1121 status = "published" 1122 year = 1990
1123 1124 1125
1126 -class dAuvergne06(Ref):
1127 """Bibliography container.""" 1128 1129 type = "thesis" 1130 author = "d'Auvergne, E. J." 1131 author2 = [["Edward", "d'Auvergne", "E.", "J."]] 1132 title = "Protein dynamics: a study of the model-free analysis of NMR relaxation data." 1133 school = "Biochemistry and Molecular Biology, University of Melbourne." 1134 url = "http://eprints.infodiv.unimelb.edu.au/archive/00002799/" 1135 status = "published" 1136 year = 2006
1137 1138 1139
1140 -class dAuvergneGooley03(Ref):
1141 """Bibliography container.""" 1142 1143 type = "journal" 1144 author = "d'Auvergne, E. J. and Gooley, P. R." 1145 author2 = [["Edward", "d'Auvergne", "E.", "J."], ["Paul", "Gooley", "P.", "R."]] 1146 title = "The use of model selection in the model-free analysis of protein dynamics." 1147 journal = "J. Biomol. NMR" 1148 journal_full = "Journal of Biomolecular NMR" 1149 volume = "25" 1150 number = "1" 1151 pages = "25-39" 1152 abstract = "Model-free analysis of NMR relaxation data, which is widely used for the study of protein dynamics, consists of the separation of the global rotational diffusion from internal motions relative to the diffusion frame and the description of these internal motions by amplitude and timescale. Five model-free models exist, each of which describes a different type of motion. Model-free analysis requires the selection of the model which best describes the dynamics of the NH bond. It will be demonstrated that the model selection technique currently used has two significant flaws, under-fitting, and not selecting a model when one ought to be selected. Under-fitting breaks the principle of parsimony causing bias in the final model-free results, visible as an overestimation of S2 and an underestimation of taue and Rex. As a consequence the protein falsely appears to be more rigid than it actually is. Model selection has been extensively developed in other fields. The techniques known as Akaike's Information Criteria (AIC), small sample size corrected AIC (AICc), Bayesian Information Criteria (BIC), bootstrap methods, and cross-validation will be compared to the currently used technique. To analyse the variety of techniques, synthetic noisy data covering all model-free motions was created. The data consists of two types of three-dimensional grid, the Rex grids covering single motions with chemical exchange [S2,taue,Rex], and the Double Motion grids covering two internal motions [S f 2,S s 2,tau s ]. The conclusion of the comparison is that for accurate model-free results, AIC model selection is essential. As the method neither under, nor over-fits, AIC is the best tool for applying Occam's razor and has the additional benefits of simplifying and speeding up model-free analysis." 1153 authoraddress = "Department of Biochemistry and Molecular Biology, University of Melbourne, Melbourne, Victoria 3010, Australia." 1154 keywords = "Amines ; Diffusion ; *Models, Molecular ; Motion ; Nuclear Magnetic Resonance, Biomolecular/*methods ; Proteins/*chemistry ; Research Support, Non-U.S. Gov't ; Rotation" 1155 doi = "10.1023/A:1021902006114" 1156 pubmed_id = 12566997 1157 status = "published" 1158 year = 2003
1159 1160 1161
1162 -class dAuvergneGooley06(Ref):
1163 """Bibliography container.""" 1164 1165 type = "journal" 1166 author = "d'Auvergne, E. J. and Gooley, P. R." 1167 author2 = [["Edward", "d'Auvergne", "E.", "J."], ["Paul", "Gooley", "P.", "R."]] 1168 title = "Model-free model elimination: A new step in the model-free dynamic analysis of NMR relaxation data." 1169 journal = "J. Biomol. NMR" 1170 journal_full = "Journal of Biomolecular NMR" 1171 volume = "35" 1172 number = "2" 1173 pages = "117-135" 1174 abstract = "Model-free analysis is a technique commonly used within the field of NMR spectroscopy to extract atomic resolution, interpretable dynamic information on multiple timescales from the R (1), R (2), and steady state NOE. Model-free approaches employ two disparate areas of data analysis, the discipline of mathematical optimisation, specifically the minimisation of a chi(2) function, and the statistical field of model selection. By searching through a large number of model-free minimisations, which were setup using synthetic relaxation data whereby the true underlying dynamics is known, certain model-free models have been identified to, at times, fail. This has been characterised as either the internal correlation times, tau( e ), tau( f ), or tau( s ), or the global correlation time parameter, local tau( m ), heading towards infinity, the result being that the final parameter values are far from the true values. In a number of cases the minimised chi(2) value of the failed model is significantly lower than that of all other models and, hence, will be the model which is chosen by model selection techniques. If these models are not removed prior to model selection the final model-free results could be far from the truth. By implementing a series of empirical rules involving inequalities these models can be specifically isolated and removed. Model-free analysis should therefore consist of three distinct steps: model-free minimisation, model-free model elimination, and finally model-free model selection. Failure has also been identified to affect the individual Monte Carlo simulations used within error analysis. Each simulation involves an independent randomised relaxation data set and model-free minimisation, thus simulations suffer from exactly the same types of failure as model-free models. Therefore, to prevent these outliers from causing a significant overestimation of the errors the failed Monte Carlo simulations need to be culled prior to calculating the parameter standard deviations." 1175 authoraddress = "Department of Biochemistry and Molecular Biology, Bio21 Institute of Biotechnology and Molecular Science, University of Melbourne, Parkville, Victoria, 3010, Australia" 1176 doi = "10.1007/s10858-006-9007-z" 1177 pubmed_id = 16791734 1178 status = "published" 1179 year = 2006
1180 1181 1182
1183 -class dAuvergneGooley07(Ref):
1184 """Bibliography container.""" 1185 1186 type = "journal" 1187 author = "d'Auvergne, E. J. and Gooley, P. R." 1188 author2 = [["Edward", "d'Auvergne", "E.", "J."], ["Paul", "Gooley", "P.", "R."]] 1189 title = "Set theory formulation of the model-free problem and the diffusion seeded model-free paradigm." 1190 journal = "Mol. Biosys." 1191 journal_full = "Molecular BioSystems" 1192 volume = "3" 1193 number = "7" 1194 pages = "483-494" 1195 abstract = "Model-free analysis of NMR relaxation data, which describes the motion of individual atoms, is a problem intricately linked to the Brownian rotational diffusion of the macromolecule. The diffusion tensor parameters strongly influence the optimisation of the various model-free models and the subsequent model selection between them. Finding the optimal model of the dynamics of the system among the numerous diffusion and model-free models is hence quite complex. Using set theory, the entirety of this global problem has been encapsulated by the universal set Ll, and its resolution mathematically formulated as the universal solution Ll. Ever since the original Lipari and Szabo papers the model-free dynamics of a molecule has most often been solved by initially estimating the diffusion tensor. The model-free models which depend on the diffusion parameter values are then optimised and the best model is chosen to represent the dynamics of the residue. Finally, the global model of all diffusion and model-free parameters is optimised. These steps are repeated until convergence. For simplicity this approach to Ll will be labelled the diffusion seeded model-free paradigm. Although this technique suffers from a number of problems many have been solved. All aspects of the diffusion seeded paradigm and its consequences, together with a few alternatives to the paradigm, will be reviewed through the use of set notation." 1196 authoraddress = "Department of Biochemistry and Molecular Biology, Bio21 Institute of Biotechnology and Molecular Science, University of Melbourne, Parkville, Melbourne, Victoria 3010, Australia." 1197 keywords = "Magnetic Resonance Spectroscopy/*methods ; *Models, Theoretical ; Proteins/chemistry ; Thermodynamics" 1198 doi = "10.1039/b702202f" 1199 pubmed_id = 17579774 1200 status = "published" 1201 year = 2007
1202 1203 1204
1205 -class dAuvergneGooley08a(Ref):
1206 """Bibliography container.""" 1207 1208 type = "journal" 1209 author = "d'Auvergne, E. J. and Gooley, P. R." 1210 author2 = [["Edward", "d'Auvergne", "E.", "J."], ["Paul", "Gooley", "P.", "R."]] 1211 title = "Optimisation of NMR dynamic models I. Minimisation algorithms and their performance within the model-free and Brownian rotational diffusion spaces." 1212 journal = "J. Biomol. NMR" 1213 journal_full = "Journal of Biomolecular NMR" 1214 volume = "40" 1215 number = "2" 1216 pages = "107-119" 1217 abstract = "The key to obtaining the model-free description of the dynamics of a macromolecule is the optimisation of the model-free and Brownian rotational diffusion parameters using the collected R (1), R (2) and steady-state NOE relaxation data. The problem of optimising the chi-squared value is often assumed to be trivial, however, the long chain of dependencies required for its calculation complicates the model-free chi-squared space. Convolutions are induced by the Lorentzian form of the spectral density functions, the linear recombinations of certain spectral density values to obtain the relaxation rates, the calculation of the NOE using the ratio of two of these rates, and finally the quadratic form of the chi-squared equation itself. Two major topological features of the model-free space complicate optimisation. The first is a long, shallow valley which commences at infinite correlation times and gradually approaches the minimum. The most severe convolution occurs for motions on two timescales in which the minimum is often located at the end of a long, deep, curved tunnel or multidimensional valley through the space. A large number of optimisation algorithms will be investigated and their performance compared to determine which techniques are suitable for use in model-free analysis. Local optimisation algorithms will be shown to be sufficient for minimisation not only within the model-free space but also for the minimisation of the Brownian rotational diffusion tensor. In addition the performance of the programs Modelfree and Dasha are investigated. A number of model-free optimisation failures were identified: the inability to slide along the limits, the singular matrix failure of the Levenberg-Marquardt minimisation algorithm, the low precision of both programs, and a bug in Modelfree. Significantly, the singular matrix failure of the Levenberg-Marquardt algorithm occurs when internal correlation times are undefined and is greatly amplified in model-free analysis by both the grid search and constraint algorithms. The program relax ( http://www.nmr-relax.com ) is also presented as a new software package designed for the analysis of macromolecular dynamics through the use of NMR relaxation data and which alleviates all of the problems inherent within model-free analysis." 1218 authoraddress = "Department of NMR-based Structural Biology, Max Planck Institute for Biophysical Chemistry, Am Fassberg 11, D-37077, Goettingen, Germany" 1219 keywords = "*Algorithms ; Cytochromes c2/chemistry ; Diffusion ; *Models, Molecular ; Nuclear Magnetic Resonance, Biomolecular/*methods ; Rhodobacter capsulatus/chemistry ; *Rotation" 1220 doi = "10.1007/s10858-007-9214-2" 1221 pubmed_id = 18085410 1222 status = "published" 1223 year = 2008
1224 1225 1226
1227 -class dAuvergneGooley08b(Ref):
1228 """Bibliography container.""" 1229 1230 type = "journal" 1231 author = "d'Auvergne, E. J. and Gooley, P. R." 1232 author2 = [["Edward", "d'Auvergne", "E.", "J."], ["Paul", "Gooley", "P.", "R."]] 1233 title = "Optimisation of NMR dynamic models II. A new methodology for the dual optimisation of the model-free parameters and the Brownian rotational diffusion tensor." 1234 journal = "J. Biomol. NMR" 1235 journal_full = "Journal of Biomolecular NMR" 1236 volume = "40" 1237 number = "2" 1238 pages = "121-133" 1239 abstract = "Finding the dynamics of an entire macromolecule is a complex problem as the model-free parameter values are intricately linked to the Brownian rotational diffusion of the molecule, mathematically through the autocorrelation function of the motion and statistically through model selection. The solution to this problem was formulated using set theory as an element of the universal set [formula: see text]-the union of all model-free spaces (d'Auvergne EJ and Gooley PR (2007) Mol. BioSyst. 3(7), 483-494). The current procedure commonly used to find the universal solution is to initially estimate the diffusion tensor parameters, to optimise the model-free parameters of numerous models, and then to choose the best model via model selection. The global model is then optimised and the procedure repeated until convergence. In this paper a new methodology is presented which takes a different approach to this diffusion seeded model-free paradigm. Rather than starting with the diffusion tensor this iterative protocol begins by optimising the model-free parameters in the absence of any global model parameters, selecting between all the model-free models, and finally optimising the diffusion tensor. The new model-free optimisation protocol will be validated using synthetic data from Schurr JM et al. (1994) J. Magn. Reson. B 105(3), 211-224 and the relaxation data of the bacteriorhodopsin (1-36)BR fragment from Orekhov VY (1999) J. Biomol. NMR 14(4), 345-356. To demonstrate the importance of this new procedure the NMR relaxation data of the Olfactory Marker Protein (OMP) of Gitti R et al. (2005) Biochem. 44(28), 9673-9679 is reanalysed. The result is that the dynamics for certain secondary structural elements is very different from those originally reported." 1240 authoraddress = "Department of NMR-based Structural Biology, Max Planck Institute for Biophysical Chemistry, Am Fassberg 11, Goettingen, D-37077, Germany" 1241 keywords = "Algorithms ; Amides/chemistry ; Bacteriorhodopsins/chemistry ; Crystallography, X-Ray ; Diffusion ; *Models, Molecular ; Nuclear Magnetic Resonance, Biomolecular/*methods ; Olfactory Marker Protein/chemistry ; Peptide Fragments/chemistry ; Protein Structure, Secondary ; *Rotation" 1242 language = "eng" 1243 doi = "10.1007/s10858-007-9213-3" 1244 pubmed_id = 18085411 1245 status = "published" 1246 year = 2008
1247 1248 1249
1250 -class Delaglio95(Ref):
1251 """Bibliography container.""" 1252 1253 type = "journal" 1254 author = "Delaglio, F., Grzesiek, S., Vuister, G.W., Zhu, G., Pfeifer, J. and Bax, A." 1255 author2 = [["Frank", "Delaglio", "F.", None], ["Stephan", "Grzesiek", "S.", None], ["Geerten", "Vuister", "G.", "W."], ["Guang", "Zhu", "G.", None], ["John", "Pfeifer", "J.", None], ["Ad", "Bax", "A.", None]] 1256 title = "NMRPipe: a multidimensional spectral processing system based on UNIX pipes." 1257 journal = "J. Biomol. NMR" 1258 journal_full = "Journal of Biomolecular NMR" 1259 volume = "6" 1260 number = "3" 1261 pages = "277-293" 1262 abstract = "The NMRPipe system is a UNIX software environment of processing, graphics, and analysis tools designed to meet current routine and research-oriented multidimensional processing requirements, and to anticipate and accommodate future demands and developments. The system is based on UNIX pipes, which allow programs running simultaneously to exchange streams of data under user control. In an NMRPipe processing scheme, a stream of spectral data flows through a pipeline of processing programs, each of which performs one component of the overall scheme, such as Fourier transformation or linear prediction. Complete multidimensional processing schemes are constructed as simple UNIX shell scripts. The processing modules themselves maintain and exploit accurate records of data sizes, detection modes, and calibration information in all dimensions, so that schemes can be constructed without the need to explicitly define or anticipate data sizes or storage details of real and imaginary channels during processing. The asynchronous pipeline scheme provides other substantial advantages, including high flexibility, favorable processing speeds, choice of both all-in-memory and disk-bound processing, easy adaptation to different data formats, simpler software development and maintenance, and the ability to distribute processing tasks on multi-CPU computers and computer networks." 1263 authoraddress = "Laboratory of Chemical Physics, National Institute of Diabetes and Digestive and Kidney Diseases, National Institutes of Health, Bethesda, MD 20892, USA." 1264 keywords = "Magnetic Resonance Spectroscopy/*instrumentation ; *Software" 1265 language = "eng" 1266 doi = "10.1007/BF00197809" 1267 pubmed_id = 8520220 1268 status = "published" 1269 year = 1995
1270 1271 1272
1273 -class GoddardKneller(Ref):
1274 """Bibliography container.""" 1275 1276 author = "Goddard, T.D. and Kneller, D.G." 1277 author2 = [["Tom", "Goddard", "T.", "D."], ["Donald", "Kneller", "D.", "G."]] 1278 journal = "University of California, San Francisco." 1279 title = "Sparky 3." 1280 status = "unpublished" 1281 type = "internet"
1282 1283 1284
1285 -class LipariSzabo82a(Ref):
1286 """Bibliography container.""" 1287 1288 type = "journal" 1289 author = "Lipari, G. and Szabo, A." 1290 title = "Model-free approach to the interpretation of nuclear magnetic-resonance relaxation in macromolecules I. Theory and range of validity" 1291 journal = "J. Am. Chem. Soc." 1292 journal_full = "Journal of the American Chemical Society" 1293 volume = "104" 1294 number = "17" 1295 pages = "4546-4559" 1296 authoraddress = "NIADDKD,Chem Phys Lab,Bethesda,MD 20205." 1297 sourceid = "ISI:A1982PC82900009" 1298 status = "published" 1299 year = 1982
1300 1301 1302
1303 -class LipariSzabo82b(Ref):
1304 """Bibliography container.""" 1305 1306 type = "journal" 1307 author = "Lipari, G. and Szabo, A." 1308 title = "Model-free approach to the interpretation of nuclear magnetic-resonance relaxation in macromolecules II. Analysis of experimental results" 1309 journal = "J. Am. Chem. Soc." 1310 journal_full = "Journal of the American Chemical Society" 1311 volume = "104" 1312 number = "17" 1313 pages = "4559-4570" 1314 abstract = "For pt.I see ibid., vol.104, p.4546 (1982). In the preceding paper it has been shown that the unique dynamic information on fast internal motions in an NMR relaxation experiment on macromolecules in solution is specified by a generalized order parameter, S , and an effective correlation time, tau /sub e/. The authors now deal with the extraction and interpretation of this information. The procedure used to obtain S /sup 2/ and tau /sub e/ from experimental data by using a least-squares method and, in certain favorable circumstances, by using an analytical formula is described. A variety of experiments are then analyzed to yield information on the time scale and spatial restriction of internal motions of isoleucines in myoglobin, methionines in dihydrofolate reductase and myoglobin, a number of aliphatic residues in basic pancreatic trypsin inhibitor, and ethyl isocyanide bound to myoglobin, hemoglobin, and aliphatic side chains in three random-coil polymers. The numerical values of S /sup 2/ and tau /sub e / can be readily interpreted within the framework of a variety of models." 1315 authoraddress = "NIADDKD,Chem Phys Lab,Bethesda,MD 20205." 1316 sourceid = "ISI:A1982PC82900010" 1317 status = "published" 1318 year = 1982
1319