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

Source Code for Module info

   1  ############################################################################### 
   2  #                                                                             # 
   3  # Copyright (C) 2003-2014 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-2014 the relax development team") 99 100 # Program licence and help. 101 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." 102 103 # ImportErrors, if any. 104 self.errors = [] 105 if not dep_check.C_module_exp_fn: 106 self.errors.append(dep_check.C_module_exp_fn_mesg) 107 108 # References. 109 self._setup_references()
110 111
112 - def __new__(self, *args, **kargs):
113 """Replacement function for implementing the singleton design pattern.""" 114 115 # First initialisation. 116 if self.instance is None: 117 self.instance = object.__new__(self, *args, **kargs) 118 119 # Already initialised, so return the instance. 120 return self.instance
121 122
123 - def _setup_references(self):
124 """Build a dictionary of all references useful for relax.""" 125 126 # Initialise the dictionary. 127 self.bib = {} 128 129 # Place the containers into the dictionary. 130 self.bib['Bieri11'] = Bieri11() 131 self.bib['Clore90'] = Clore90() 132 self.bib['dAuvergne06'] = dAuvergne06() 133 self.bib['dAuvergneGooley03'] = dAuvergneGooley03() 134 self.bib['dAuvergneGooley06'] = dAuvergneGooley06() 135 self.bib['dAuvergneGooley07'] = dAuvergneGooley07() 136 self.bib['dAuvergneGooley08a'] = dAuvergneGooley08a() 137 self.bib['dAuvergneGooley08b'] = dAuvergneGooley08b() 138 self.bib['Delaglio95'] = Delaglio95() 139 self.bib['GoddardKneller'] = GoddardKneller() 140 self.bib['LipariSzabo82a'] = LipariSzabo82a() 141 self.bib['LipariSzabo82b'] = LipariSzabo82b()
142 143
144 - def centre(self, string, width=100):
145 """Format the string to be centred to a certain number of spaces. 146 147 @param string: The string to centre. 148 @type string: str 149 @keyword width: The number of characters to centre to. 150 @type width: int 151 @return: The centred string with leading whitespace added. 152 @rtype: str 153 """ 154 155 # Calculate the number of spaces needed. 156 spaces = int((width - len(string)) / 2) 157 158 # The new string. 159 string = spaces * ' ' + string 160 161 # Return the new string. 162 return string
163 164
165 - def file_type(self, path):
166 """Return a string representation of the file type. 167 168 @param path: The full path of the file to return information about. 169 @type path: str 170 @return: The single line file type information string. 171 @rtype: str 172 """ 173 174 # Python 2.3 and earlier. 175 if Popen == None: 176 return '' 177 178 # MS Windows (has no 'file' command or libmagic, so return nothing). 179 if hasattr(ctypes, 'windll'): 180 return '' 181 182 # The command. 183 cmd = "file -b '%s'" % path 184 185 # Execute. 186 pipe = Popen(cmd, shell=True, stdout=PIPE, close_fds=False) 187 waitpid(pipe.pid, 0) 188 189 # The STDOUT data. 190 data = pipe.stdout.readlines() 191 192 # Mac OS X 3-way binary. 193 if data[0][:-1] == 'Mach-O universal binary with 3 architectures': 194 # Arch. 195 arch = [None, None, None] 196 for i in range(3): 197 row = data[i+1].split('\t') 198 arch[i] = row[1][:-1] 199 arch.sort() 200 201 # The full file type printout. 202 if arch == ['Mach-O 64-bit executable x86_64', 'Mach-O executable i386', 'Mach-O executable ppc']: 203 file_type = '3-way exec (i386, ppc, x86_64)' 204 elif arch == ['Mach-O 64-bit bundle x86_64', 'Mach-O bundle i386', 'Mach-O bundle ppc']: 205 file_type = '3-way bundle (i386, ppc, x86_64)' 206 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']: 207 file_type = '3-way lib (i386, ppc, x86_64)' 208 elif arch == ['Mach-O 64-bit object x86_64', 'Mach-O object i386', 'Mach-O object ppc']: 209 file_type = '3-way obj (i386, ppc, x86_64)' 210 else: 211 file_type = '3-way %s' % arch 212 213 # Mac OS X 2-way binary. 214 elif data[0][:-1] == 'Mach-O universal binary with 2 architectures': 215 # Arch. 216 arch = [None, None] 217 for i in range(2): 218 row = data[i+1].split('\t') 219 arch[i] = row[1][:-1] 220 arch.sort() 221 222 # The full file type printout. 223 if arch == ['Mach-O executable i386', 'Mach-O executable ppc']: 224 file_type = '2-way exec (i386, ppc)' 225 elif arch == ['Mach-O bundle i386', 'Mach-O bundle ppc']: 226 file_type = '2-way bundle (i386, ppc)' 227 elif arch == ['Mach-O dynamically linked shared library i386', 'Mach-O dynamically linked shared library ppc']: 228 file_type = '2-way lib (i386, ppc)' 229 elif arch == ['Mach-O object i386', 'Mach-O object ppc']: 230 file_type = '2-way obj (i386, ppc)' 231 else: 232 file_type = '2-way %s' % arch 233 234 # Default to all info. 235 else: 236 file_type = data[0][:-1] 237 for i in range(1, len(data)): 238 row = data[i].split('\t') 239 arch[i] = row[1][:-1] 240 file_type += " %s" % arch 241 242 # Return the string. 243 return file_type
244 245
246 - def format_max_width(self, data):
247 """Return the text formatting width for the given data. 248 249 @param data: The list of things to print out. 250 @type data: list 251 @return: The maximum width of the elements in the list. 252 @rtype: int 253 """ 254 255 # Init. 256 width = 0 257 258 # Loop over the data. 259 for i in range(len(data)): 260 # The string representation size. 261 size = len(repr(data[i])) 262 263 # Find the max size. 264 if size > width: 265 width = size 266 267 # Return the max width. 268 return width
269 270
271 - def intro_text(self):
272 """Create the introductory string for STDOUT printing. 273 274 This text is word-wrapped to a fixed width of 100 characters (or 80 on MS Windows). 275 276 277 @return: The introductory string. 278 @rtype: str 279 """ 280 281 # Some new lines. 282 intro_string = '\n\n\n' 283 284 # Program name and version - subversion code. 285 if version == 'repository checkout': 286 text = "%s %s r%s" % (self.title, self.version, repo_revision) 287 text2 = "%s" % (repo_url) 288 intro_string = intro_string + self.centre(text, status.text_width) + '\n' + self.centre(text2, status.text_width) + '\n\n' 289 290 # Program name and version - official releases. 291 else: 292 text = "%s %s" % (self.title, self.version) 293 intro_string = intro_string + self.centre(text, status.text_width) + '\n\n' 294 295 # Program description. 296 intro_string = intro_string + self.centre(self.desc, status.text_width) + '\n\n' 297 298 # Copyright printout. 299 for i in range(len(self.copyright)): 300 intro_string = intro_string + self.centre(self.copyright[i], status.text_width) + '\n' 301 intro_string = intro_string + '\n' 302 303 # Program licence and help (wrapped). 304 for line in wrap(self.licence, status.text_width): 305 intro_string = intro_string + line + '\n' 306 intro_string = intro_string + '\n' 307 308 # Help message. 309 help = "Assistance in using the relax prompt and scripting interface can be accessed by typing 'help' within the prompt." 310 for line in wrap(help, status.text_width): 311 intro_string = intro_string + line + '\n' 312 313 # ImportErrors, if any. 314 for i in range(len(self.errors)): 315 intro_string = intro_string + '\n' + self.errors[i] + '\n' 316 intro_string = intro_string + '\n' 317 318 # The multi-processor message, if it exists. 319 if hasattr(self, 'multi_processor_string'): 320 for line in wrap('Processor fabric: %s\n' % self.multi_processor_string, status.text_width): 321 intro_string = intro_string + line + '\n' 322 323 # Return the formatted text. 324 return intro_string
325 326
327 - def package_info(self):
328 """Return a string for printing to STDOUT with info from the Python packages used by relax. 329 330 @return: The info string. 331 @rtype: str 332 """ 333 334 # Init. 335 text = '' 336 package = [] 337 status = [] 338 version = [] 339 path = [] 340 341 # Intro. 342 text = text + ("\nPython packages and modules (most are optional):\n\n") 343 344 # Header. 345 package.append("Name") 346 status.append("Installed") 347 version.append("Version") 348 path.append("Path") 349 350 # minfx. 351 package.append('minfx') 352 status.append(True) 353 if hasattr(dep_check.minfx, '__version__'): 354 version.append(dep_check.minfx.__version__) 355 else: 356 version.append('Unknown') 357 path.append(dep_check.minfx.__path__[0]) 358 359 # bmrblib. 360 package.append('bmrblib') 361 status.append(dep_check.bmrblib_module) 362 try: 363 if hasattr(dep_check.bmrblib, '__version__'): 364 version.append(dep_check.bmrblib.__version__) 365 else: 366 version.append('Unknown') 367 except: 368 version.append('') 369 try: 370 path.append(dep_check.bmrblib.__path__[0]) 371 except: 372 path.append('') 373 374 # numpy. 375 package.append('numpy') 376 status.append(True) 377 try: 378 version.append(dep_check.numpy.version.version) 379 path.append(dep_check.numpy.__path__[0]) 380 except: 381 version.append('') 382 path.append('') 383 384 # scipy. 385 package.append('scipy') 386 status.append(dep_check.scipy_module) 387 try: 388 version.append(dep_check.scipy.version.version) 389 path.append(dep_check.scipy.__path__[0]) 390 except: 391 version.append('') 392 path.append('') 393 394 # wxPython. 395 package.append('wxPython') 396 status.append(dep_check.wx_module) 397 try: 398 version.append(dep_check.wx.version()) 399 path.append(dep_check.wx.__path__[0]) 400 except: 401 version.append('') 402 path.append('') 403 404 # matplotlib. 405 package.append('matplotlib') 406 status.append(dep_check.matplotlib_module) 407 try: 408 version.append(dep_check.matplotlib.__version__) 409 path.append(dep_check.matplotlib.__path__[0]) 410 except: 411 version.append('') 412 path.append('') 413 414 # mpi4py. 415 package.append('mpi4py') 416 status.append(dep_check.mpi4py_module) 417 try: 418 version.append(dep_check.mpi4py.__version__) 419 path.append(dep_check.mpi4py.__path__[0]) 420 except: 421 version.append('') 422 path.append('') 423 424 # epydoc. 425 package.append('epydoc') 426 status.append(dep_check.epydoc_module) 427 try: 428 version.append(dep_check.epydoc.__version__) 429 path.append(dep_check.epydoc.__path__[0]) 430 except: 431 version.append('') 432 path.append('') 433 434 # optparse. 435 package.append('optparse') 436 status.append(True) 437 try: 438 version.append(dep_check.optparse.__version__) 439 path.append(dep_check.optparse.__file__) 440 except: 441 version.append('') 442 path.append('') 443 444 # readline. 445 package.append('readline') 446 status.append(dep_check.readline_module) 447 version.append('') 448 try: 449 path.append(dep_check.readline.__file__) 450 except: 451 path.append('') 452 453 # profile. 454 package.append('profile') 455 status.append(dep_check.profile_module) 456 version.append('') 457 try: 458 path.append(dep_check.profile.__file__) 459 except: 460 path.append('') 461 462 # BZ2. 463 package.append('bz2') 464 status.append(dep_check.bz2_module) 465 version.append('') 466 try: 467 path.append(dep_check.bz2.__file__) 468 except: 469 path.append('') 470 471 # gzip. 472 package.append('gzip') 473 status.append(dep_check.gzip_module) 474 version.append('') 475 try: 476 path.append(dep_check.gzip.__file__) 477 except: 478 path.append('') 479 480 # IO. 481 package.append('io') 482 status.append(dep_check.io_module) 483 version.append('') 484 try: 485 path.append(dep_check.io.__file__) 486 except: 487 path.append('') 488 489 # XML. 490 package.append('xml') 491 status.append(dep_check.xml_module) 492 if dep_check.xml_module: 493 version.append("%s (%s)" % (dep_check.xml_version, dep_check.xml_type)) 494 path.append(dep_check.xml.__file__) 495 else: 496 version.append('') 497 path.append('') 498 499 # XML minidom. 500 package.append('xml.dom.minidom') 501 version.append('') 502 try: 503 import xml.dom.minidom 504 status.append(True) 505 except: 506 status.append(False) 507 try: 508 path.append(xml.dom.minidom.__file__) 509 except: 510 path.append('') 511 512 # Format the data. 513 fmt_package = "%%-%ss" % (self.format_max_width(package) + 2) 514 fmt_status = "%%-%ss" % (self.format_max_width(status) + 2) 515 fmt_version = "%%-%ss" % (self.format_max_width(version) + 2) 516 fmt_path = "%%-%ss" % (self.format_max_width(path) + 2) 517 518 # Add the text. 519 for i in range(len(package)): 520 text += fmt_package % package[i] 521 text += fmt_status % status[i] 522 text += fmt_version % version[i] 523 text += fmt_path % path[i] 524 text += '\n' 525 526 # Return the info string. 527 return text
528 529
530 - def processor_name(self):
531 """Return a string for the processor name. 532 533 @return: The processor name, in much more detail than platform.processor(). 534 @rtype: str 535 """ 536 537 # Python 2.3 and earlier. 538 if Popen == None: 539 return "" 540 541 # No subprocess module. 542 if not dep_check.subprocess_module: 543 return "" 544 545 # The system. 546 system = platform.system() 547 548 # Linux systems. 549 if system == 'Linux': 550 # The command to run. 551 cmd = "cat /proc/cpuinfo" 552 553 # Execute the command. 554 pipe = Popen(cmd, shell=True, stdout=PIPE, close_fds=False) 555 waitpid(pipe.pid, 0) 556 557 # Get the STDOUT data. 558 data = pipe.stdout.readlines() 559 560 # Loop over the lines, returning the first model name with the leading "model name :" text stripped. 561 for line in data: 562 # Decode Python 3 byte arrays. 563 if hasattr(line, 'decode'): 564 line = line.decode() 565 566 # Find the processor name. 567 if search("model name", line): 568 # Convert the text. 569 name = sub(".*model name.*:", "", line, 1) 570 name = name.strip() 571 572 # Return the name. 573 return name 574 575 # Windows systems. 576 if system == 'Windows' or system == 'Microsoft': 577 return platform.processor() 578 579 # Mac OS X systems. 580 if system == 'Darwin': 581 # Add the 'sysctl' path to the environment (if needed). 582 environ['PATH'] += pathsep + '/usr/sbin' 583 584 # The command to run. 585 cmd = "sysctl -n machdep.cpu.brand_string" 586 587 # Execute the command in a fail safe way, return the result or nothing. 588 try: 589 # Execute. 590 pipe = Popen(cmd, shell=True, stdout=PIPE, close_fds=False) 591 waitpid(pipe.pid, 0) 592 593 # Get the STDOUT data. 594 data = pipe.stdout.readlines() 595 596 # Decode Python 3 byte arrays. 597 string = data[0] 598 if hasattr(string, 'decode'): 599 string = string.decode() 600 601 # Find the processor name. 602 # Return the string. 603 return string.strip() 604 605 # Nothing. 606 except: 607 return "" 608 609 # Unknown. 610 return ""
611 612
613 - def ram_info(self, format=" %-25s%s\n"):
614 """Return a string for printing to STDOUT with info from the Python packages used by relax. 615 616 @keyword format: The formatting string. 617 @type format: str 618 @return: The info string. 619 @rtype: str 620 """ 621 622 # Python 2.3 and earlier. 623 if Popen == None: 624 return '' 625 626 # Init. 627 text = '' 628 629 # The system. 630 system = platform.system() 631 632 # Unix and GNU/Linux systems. 633 if system == 'Linux': 634 pipe = Popen('free -m', shell=True, stdin=PIPE, stdout=PIPE, stderr=PIPE, close_fds=False) 635 free_lines = pipe.stdout.readlines() 636 if free_lines: 637 # Extract the info. 638 for line in free_lines: 639 # Split up the line. 640 row = line.split() 641 642 # The RAM size. 643 if row[0] == 'Mem:': 644 text += format % ("Total RAM size: ", row[1], "Mb") 645 646 # The swap size. 647 if row[0] == 'Swap:': 648 text += format % ("Total swap size: ", row[1], "Mb") 649 650 # Windows systems (supported by ctypes.windll). 651 if system == 'Windows' or system == 'Microsoft': 652 # Initialise the memory info class. 653 mem = MemoryStatusEx() 654 655 # The RAM size. 656 text += format % ("Total RAM size: ", mem.ullTotalPhys / 1024.**2, "Mb") 657 658 # The swap size. 659 text += format % ("Total swap size: ", mem.ullTotalVirtual / 1024.**2, "Mb") 660 661 # Mac OS X systems. 662 if system == 'Darwin': 663 # Add the 'sysctl' path to the environment (if needed). 664 environ['PATH'] += pathsep + '/usr/sbin' 665 666 # The commands to run. 667 cmd = "sysctl -n hw.physmem" 668 cmd2 = "sysctl -n hw.memsize" 669 670 # Execute the command in a fail safe way, return the result or nothing. 671 try: 672 # Execute. 673 pipe = Popen(cmd, shell=True, stdout=PIPE, close_fds=False) 674 waitpid(pipe.pid, 0) 675 676 # Get the STDOUT data. 677 data = pipe.stdout.readlines() 678 679 # Execute. 680 pipe = Popen(cmd2, shell=True, stdout=PIPE, close_fds=False) 681 waitpid(pipe.pid, 0) 682 683 # Get the STDOUT data. 684 data2 = pipe.stdout.readlines() 685 686 # Convert the values. 687 ram = int(data[0].strip()) 688 total = int(data2[0].strip()) 689 swap = total - ram 690 691 # The RAM size. 692 text += format % ("Total RAM size: ", ram / 1024.**2, "Mb") 693 694 # The swap size. 695 text += format % ("Total swap size: ", swap / 1024.**2, "Mb") 696 697 # Nothing. 698 except: 699 pass 700 701 # Unknown. 702 if not text: 703 text += format % ("Total RAM size: ", "?", "Mb") 704 text += format % ("Total swap size: ", "?", "Mb") 705 706 # Return the info string. 707 return text
708 709
710 - def relax_module_info(self):
711 """Return a string with info about the relax modules. 712 713 @return: The info string. 714 @rtype: str 715 """ 716 717 # Init. 718 text = '' 719 name = [] 720 status = [] 721 file_type = [] 722 path = [] 723 724 # Intro. 725 text = text + ("\nrelax C modules:\n\n") 726 727 # Header. 728 name.append("Module") 729 status.append("Compiled") 730 file_type.append("File type") 731 path.append("Path") 732 733 # relaxation curve-fitting. 734 name.append('target_functions.relax_fit') 735 status.append(dep_check.C_module_exp_fn) 736 if hasattr(dep_check, 'relax_fit'): 737 file_type.append(self.file_type(dep_check.relax_fit.__file__)) 738 path.append(dep_check.relax_fit.__file__) 739 else: 740 file_type.append('') 741 path.append('') 742 743 # Format the data. 744 fmt_name = "%%-%ss" % (self.format_max_width(name) + 2) 745 fmt_status = "%%-%ss" % (self.format_max_width(status) + 2) 746 fmt_file_type = "%%-%ss" % (self.format_max_width(file_type) + 2) 747 fmt_path = "%%-%ss" % (self.format_max_width(path) + 2) 748 749 # Add the text. 750 for i in range(len(name)): 751 text += fmt_name % name[i] 752 text += fmt_status % status[i] 753 text += fmt_file_type % file_type[i] 754 text += fmt_path % path[i] 755 text += '\n' 756 757 # Return the info string. 758 return text
759 760
761 - def sys_info(self):
762 """Return a string for printing to STDOUT with info about the current relax instance. 763 764 @return: The info string. 765 @rtype: str 766 """ 767 768 # Init. 769 text = '' 770 771 # Formatting string. 772 format = " %-25s%s\n" 773 format2 = " %-25s%s %s\n" 774 775 # Hardware info. 776 text = text + ("\nHardware information:\n") 777 if hasattr(platform, 'machine'): 778 text = text + (format % ("Machine: ", platform.machine())) 779 if hasattr(platform, 'processor'): 780 text = text + (format % ("Processor: ", platform.processor())) 781 text = text + (format % ("Processor name: ", self.processor_name())) 782 text = text + (format % ("Endianness: ", sys.byteorder)) 783 text = text + self.ram_info(format=format2) 784 785 # OS info. 786 text = text + ("\nOperating system information:\n") 787 if hasattr(platform, 'system'): 788 text = text + (format % ("System: ", platform.system())) 789 if hasattr(platform, 'release'): 790 text = text + (format % ("Release: ", platform.release())) 791 if hasattr(platform, 'version'): 792 text = text + (format % ("Version: ", platform.version())) 793 if hasattr(platform, 'win32_ver') and platform.win32_ver()[0]: 794 text = text + (format % ("Win32 version: ", (platform.win32_ver()[0] + " " + platform.win32_ver()[1] + " " + platform.win32_ver()[2] + " " + platform.win32_ver()[3]))) 795 if hasattr(platform, 'linux_distribution') and platform.linux_distribution()[0]: 796 text = text + (format % ("GNU/Linux version: ", (platform.linux_distribution()[0] + " " + platform.linux_distribution()[1] + " " + platform.linux_distribution()[2]))) 797 if hasattr(platform, 'mac_ver') and platform.mac_ver()[0]: 798 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]))) 799 if hasattr(platform, 'dist'): 800 text = text + (format % ("Distribution: ", (platform.dist()[0] + " " + platform.dist()[1] + " " + platform.dist()[2]))) 801 if hasattr(platform, 'platform'): 802 text = text + (format % ("Full platform string: ", (platform.platform()))) 803 if hasattr(ctypes, 'windll'): 804 text = text + (format % ("Windows architecture: ", (self.win_arch()))) 805 806 # Python info. 807 text = text + ("\nPython information:\n") 808 if hasattr(platform, 'architecture'): 809 text = text + (format % ("Architecture: ", (platform.architecture()[0] + " " + platform.architecture()[1]))) 810 if hasattr(platform, 'python_version'): 811 text = text + (format % ("Python version: ", platform.python_version())) 812 if hasattr(platform, 'python_branch'): 813 text = text + (format % ("Python branch: ", platform.python_branch())) 814 if hasattr(platform, 'python_build'): 815 text = text + ((format[:-1]+', %s\n') % ("Python build: ", platform.python_build()[0], platform.python_build()[1])) 816 if hasattr(platform, 'python_compiler'): 817 text = text + (format % ("Python compiler: ", platform.python_compiler())) 818 if hasattr(platform, 'libc_ver'): 819 text = text + (format % ("Libc version: ", (platform.libc_ver()[0] + " " + platform.libc_ver()[1]))) 820 if hasattr(platform, 'python_implementation'): 821 text = text + (format % ("Python implementation: ", platform.python_implementation())) 822 if hasattr(platform, 'python_revision'): 823 text = text + (format % ("Python revision: ", platform.python_revision())) 824 if sys.executable: 825 text = text + (format % ("Python executable: ", sys.executable)) 826 if hasattr(sys, 'flags'): 827 text = text + (format % ("Python flags: ", sys.flags)) 828 if hasattr(sys, 'float_info'): 829 text = text + (format % ("Python float info: ", sys.float_info)) 830 text = text + (format % ("Python module path: ", sys.path)) 831 832 # Python packages. 833 text = text + self.package_info() 834 835 # relax info: 836 text = text + "\nrelax information:\n" 837 text = text + (format % ("Version: ", version_full())) 838 if hasattr(self, "multi_processor_string"): 839 text += format % ("Processor fabric: ", self.multi_processor_string) 840 841 # relax modules. 842 text = text + self.relax_module_info() 843 844 # End with an empty newline. 845 text = text + ("\n") 846 847 # Return the text. 848 return text
849 850
851 - def win_arch(self):
852 """Determine the MS Windows architecture. 853 854 @return: The architecture string. 855 @rtype: str 856 """ 857 858 # 64-bit versions. 859 if 'PROCESSOR_ARCHITEW6432' in environ: 860 arch = environ['PROCESSOR_ARCHITEW6432'] 861 862 # Default 32-bit. 863 else: 864 arch = environ['PROCESSOR_ARCHITECTURE'] 865 866 # Return the architecture. 867 return arch
868 869 870
871 -class MemoryStatusEx(Structure):
872 """Special object for obtaining hardware info in MS Windows.""" 873 874 if hasattr(ctypes, 'windll'): 875 _fields_ = [ 876 ('dwLength', ctypes.wintypes.DWORD), 877 ('dwMemoryLoad', ctypes.wintypes.DWORD), 878 ('ullTotalPhys', ctypes.c_ulonglong), 879 ('ullAvailPhys', ctypes.c_ulonglong), 880 ('ullTotalPageFile', ctypes.c_ulonglong), 881 ('ullAvailPageFile', ctypes.c_ulonglong), 882 ('ullTotalVirtual', ctypes.c_ulonglong), 883 ('ullAvailVirtual', ctypes.c_ulonglong), 884 ('ullExtendedVirtual', ctypes.c_ulonglong), 885 ] 886
887 - def __init__(self):
888 """Set up the information and handle non MS Windows systems.""" 889 890 # Get the required info (for MS Windows only). 891 if hasattr(ctypes, 'windll'): 892 self.dwLength = ctypes.sizeof(self) 893 ctypes.windll.kernel32.GlobalMemoryStatusEx(ctypes.byref(self))
894 895 896
897 -class Ref:
898 """Reference base class.""" 899 900 # Initialise all class variables to None. 901 type = None 902 author = None 903 author2 = None 904 title = None 905 status = None 906 journal = None 907 journal_full = None 908 volume = None 909 number = None 910 doi = None 911 pubmed_id = None 912 url = None 913 pages = None 914 year = None 915 916
917 - def __getattr__(self, name):
918 """Generate some variables on the fly. 919 920 This is only called for objects not found in the class. 921 922 @param name: The name of the object. 923 @type name: str 924 @raises AttributeError: If the object cannot be created. 925 @returns: The generated object. 926 @rtype: anything 927 """ 928 929 # Page numbers. 930 if name in ['page_first', 'page_last']: 931 # No page info. 932 if not self.pages: 933 return None 934 935 # First split the page range. 936 vals = self.pages.split('-') 937 938 # Single page. 939 if len(vals) == 1: 940 return vals[0] 941 942 # First page. 943 if name == 'page_first': 944 return vals[0] 945 946 # Last page. 947 if name == 'page_last': 948 return vals[1] 949 950 raise AttributeError(name)
951 952
953 - def cite_short(self, author=True, title=True, journal=True, volume=True, number=True, pages=True, year=True, doi=True, url=True, status=True):
954 """Compile a short citation. 955 956 The returned text will have the form of: 957 958 - 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. 959 960 961 @keyword author: The author flag. 962 @type author: bool 963 @keyword title: The title flag. 964 @type title: bool 965 @keyword journal: The journal flag. 966 @type journal: bool 967 @keyword volume: The volume flag. 968 @type volume: bool 969 @keyword number: The number flag. 970 @type number: bool 971 @keyword pages: The pages flag. 972 @type pages: bool 973 @keyword year: The year flag. 974 @type year: bool 975 @keyword doi: The doi flag. 976 @type doi: bool 977 @keyword url: The url flag. 978 @type url: bool 979 @keyword status: The status flag. This will only be shown if not 'published'. 980 @type status: bool 981 @return: The full citation. 982 @rtype: str 983 """ 984 985 # Build the citation. 986 cite = '' 987 if author and self.author and hasattr(self, 'author'): 988 cite = cite + self.author 989 if year and self.year and hasattr(self, 'year'): 990 cite = cite + ' (' + repr(self.year) + ').' 991 if title and self.title and hasattr(self, 'title'): 992 cite = cite + ' ' + self.title 993 if journal and self.journal and hasattr(self, 'journal'): 994 cite = cite + ' ' + self.journal + ',' 995 if volume and self.volume and hasattr(self, 'volume'): 996 cite = cite + ' ' + self.volume 997 if number and self.number and hasattr(self, 'number'): 998 cite = cite + '(' + self.number + '),' 999 if pages and self.pages and hasattr(self, 'pages'): 1000 cite = cite + ' ' + self.pages 1001 if doi and self.doi and hasattr(self, 'doi'): 1002 cite = cite + ' (http://dx.doi.org/'+self.doi + ')' 1003 if url and self.url and hasattr(self, 'url'): 1004 cite = cite + ' (' + self.url + ')' 1005 if status and hasattr(self, 'status') and self.status != 'published': 1006 cite = cite + ' (' + self.status + ')' 1007 1008 # End. 1009 if cite[-1] != '.': 1010 cite = cite + '.' 1011 1012 # Return the citation. 1013 return cite
1014 1015
1016 - def cite_html(self, author=True, title=True, journal=True, volume=True, number=True, pages=True, year=True, doi=True, url=True, status=True):
1017 """Compile a citation for HTML display. 1018 1019 @keyword author: The author flag. 1020 @type author: bool 1021 @keyword title: The title flag. 1022 @type title: bool 1023 @keyword journal: The journal flag. 1024 @type journal: bool 1025 @keyword volume: The volume flag. 1026 @type volume: bool 1027 @keyword number: The number flag. 1028 @type number: bool 1029 @keyword pages: The pages flag. 1030 @type pages: bool 1031 @keyword year: The year flag. 1032 @type year: bool 1033 @keyword doi: The doi flag. 1034 @type doi: bool 1035 @keyword url: The url flag. 1036 @type url: bool 1037 @keyword status: The status flag. This will only be shown if not 'published'. 1038 @type status: bool 1039 @return: The full citation. 1040 @rtype: str 1041 """ 1042 1043 # Build the citation. 1044 cite = '' 1045 if author and hasattr(self, 'author') and self.author: 1046 cite = cite + self.author 1047 if year and hasattr(self, 'year') and self.year: 1048 cite = cite + ' (' + repr(self.year) + ').' 1049 if title and hasattr(self, 'title') and self.title: 1050 cite = cite + ' ' + self.title 1051 if journal and hasattr(self, 'journal') and self.journal: 1052 cite = cite + ' <em>' + self.journal + '</em>,' 1053 if volume and hasattr(self, 'volume') and self.volume: 1054 cite = cite + ' <strong>' + self.volume + '</strong>' 1055 if number and hasattr(self, 'number') and self.number: 1056 cite = cite + '(' + self.number + '),' 1057 if pages and hasattr(self, 'pages') and self.pages: 1058 cite = cite + ' ' + self.pages 1059 if doi and hasattr(self, 'doi') and self.doi: 1060 cite = cite + ' (<a href="http://dx.doi.org/%s">abstract</a>)' % self.doi 1061 if url and hasattr(self, 'url') and self.url: 1062 cite = cite + ' (<a href="%s">url</a>)' % self.url 1063 if status and hasattr(self, 'status') and self.status != 'published': 1064 cite = cite + ' (<i>%s</i>)' % self.status 1065 1066 # End. 1067 if cite[-1] != '.': 1068 cite = cite + '.' 1069 1070 # Return the citation. 1071 return cite
1072 1073 1074
1075 -class Bieri11(Ref):
1076 """Bibliography container.""" 1077 1078 type = "journal" 1079 author = "Bieri, M., d'Auvergne, E. J. and Gooley, P. R." 1080 author2 = [["Michael", "Bieri", "M.", ""], ["Edward", "d'Auvergne", "E.", "J."], ["Paul", "Gooley", "P.", "R."]] 1081 title = "relaxGUI: a new software for fast and simple NMR relaxation data analysis and calculation of ps-ns and micro-s motion of proteins" 1082 journal = "J. Biomol. NMR" 1083 journal_full = "Journal of Biomolecular NMR" 1084 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." 1085 authoraddress = "Department of Biochemistry and Molecular Biology, University of Melbourne, Melbourne, Victoria 3010, Australia." 1086 doi = "10.1007/s10858-011-9509-1" 1087 pubmed_id = 21618018 1088 status = "published" 1089 year = 2011
1090 1091 1092
1093 -class Clore90(Ref):
1094 """Bibliography container.""" 1095 1096 type = "journal" 1097 author = "Clore, G. M. and Szabo, A. and Bax, A. and Kay, L. E. and Driscoll, P. C. and Gronenborn, A. M." 1098 title = "Deviations from the simple 2-parameter model-free approach to the interpretation of N-15 nuclear magnetic-relaxation of proteins" 1099 journal = "J. Am. Chem. Soc." 1100 journal_full = "Journal of the American Chemical Society" 1101 volume = "112" 1102 number = "12" 1103 pages = "4989-4991" 1104 address = "1155 16th St, NW, Washington, DC 20036" 1105 sourceid = "ISI:A1990DH27700070" 1106 status = "published" 1107 year = 1990
1108 1109 1110
1111 -class dAuvergne06(Ref):
1112 """Bibliography container.""" 1113 1114 type = "thesis" 1115 author = "d'Auvergne, E. J." 1116 author2 = [["Edward", "d'Auvergne", "E.", "J."]] 1117 title = "Protein dynamics: a study of the model-free analysis of NMR relaxation data." 1118 school = "Biochemistry and Molecular Biology, University of Melbourne." 1119 url = "http://eprints.infodiv.unimelb.edu.au/archive/00002799/" 1120 status = "published" 1121 year = 2006
1122 1123 1124
1125 -class dAuvergneGooley03(Ref):
1126 """Bibliography container.""" 1127 1128 type = "journal" 1129 author = "d'Auvergne, E. J. and Gooley, P. R." 1130 author2 = [["Edward", "d'Auvergne", "E.", "J."], ["Paul", "Gooley", "P.", "R."]] 1131 title = "The use of model selection in the model-free analysis of protein dynamics." 1132 journal = "J. Biomol. NMR" 1133 journal_full = "Journal of Biomolecular NMR" 1134 volume = "25" 1135 number = "1" 1136 pages = "25-39" 1137 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." 1138 authoraddress = "Department of Biochemistry and Molecular Biology, University of Melbourne, Melbourne, Victoria 3010, Australia." 1139 keywords = "Amines ; Diffusion ; *Models, Molecular ; Motion ; Nuclear Magnetic Resonance, Biomolecular/*methods ; Proteins/*chemistry ; Research Support, Non-U.S. Gov't ; Rotation" 1140 doi = "10.1023/A:1021902006114" 1141 pubmed_id = 12566997 1142 status = "published" 1143 year = 2003
1144 1145 1146
1147 -class dAuvergneGooley06(Ref):
1148 """Bibliography container.""" 1149 1150 type = "journal" 1151 author = "d'Auvergne, E. J. and Gooley, P. R." 1152 author2 = [["Edward", "d'Auvergne", "E.", "J."], ["Paul", "Gooley", "P.", "R."]] 1153 title = "Model-free model elimination: A new step in the model-free dynamic analysis of NMR relaxation data." 1154 journal = "J. Biomol. NMR" 1155 journal_full = "Journal of Biomolecular NMR" 1156 volume = "35" 1157 number = "2" 1158 pages = "117-135" 1159 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." 1160 authoraddress = "Department of Biochemistry and Molecular Biology, Bio21 Institute of Biotechnology and Molecular Science, University of Melbourne, Parkville, Victoria, 3010, Australia" 1161 doi = "10.1007/s10858-006-9007-z" 1162 pubmed_id = 16791734 1163 status = "published" 1164 year = 2006
1165 1166 1167
1168 -class dAuvergneGooley07(Ref):
1169 """Bibliography container.""" 1170 1171 type = "journal" 1172 author = "d'Auvergne, E. J. and Gooley, P. R." 1173 author2 = [["Edward", "d'Auvergne", "E.", "J."], ["Paul", "Gooley", "P.", "R."]] 1174 title = "Set theory formulation of the model-free problem and the diffusion seeded model-free paradigm." 1175 journal = "Mol. Biosys." 1176 journal_full = "Molecular BioSystems" 1177 volume = "3" 1178 number = "7" 1179 pages = "483-494" 1180 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." 1181 authoraddress = "Department of Biochemistry and Molecular Biology, Bio21 Institute of Biotechnology and Molecular Science, University of Melbourne, Parkville, Melbourne, Victoria 3010, Australia." 1182 keywords = "Magnetic Resonance Spectroscopy/*methods ; *Models, Theoretical ; Proteins/chemistry ; Thermodynamics" 1183 doi = "10.1039/b702202f" 1184 pubmed_id = 17579774 1185 status = "published" 1186 year = 2007
1187 1188 1189
1190 -class dAuvergneGooley08a(Ref):
1191 """Bibliography container.""" 1192 1193 type = "journal" 1194 author = "d'Auvergne, E. J. and Gooley, P. R." 1195 author2 = [["Edward", "d'Auvergne", "E.", "J."], ["Paul", "Gooley", "P.", "R."]] 1196 title = "Optimisation of NMR dynamic models I. Minimisation algorithms and their performance within the model-free and Brownian rotational diffusion spaces." 1197 journal = "J. Biomol. NMR" 1198 journal_full = "Journal of Biomolecular NMR" 1199 volume = "40" 1200 number = "2" 1201 pages = "107-119" 1202 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." 1203 authoraddress = "Department of NMR-based Structural Biology, Max Planck Institute for Biophysical Chemistry, Am Fassberg 11, D-37077, Goettingen, Germany" 1204 keywords = "*Algorithms ; Cytochromes c2/chemistry ; Diffusion ; *Models, Molecular ; Nuclear Magnetic Resonance, Biomolecular/*methods ; Rhodobacter capsulatus/chemistry ; *Rotation" 1205 doi = "10.1007/s10858-007-9214-2" 1206 pubmed_id = 18085410 1207 status = "published" 1208 year = 2008
1209 1210 1211
1212 -class dAuvergneGooley08b(Ref):
1213 """Bibliography container.""" 1214 1215 type = "journal" 1216 author = "d'Auvergne, E. J. and Gooley, P. R." 1217 author2 = [["Edward", "d'Auvergne", "E.", "J."], ["Paul", "Gooley", "P.", "R."]] 1218 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." 1219 journal = "J. Biomol. NMR" 1220 journal_full = "Journal of Biomolecular NMR" 1221 volume = "40" 1222 number = "2" 1223 pages = "121-133" 1224 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." 1225 authoraddress = "Department of NMR-based Structural Biology, Max Planck Institute for Biophysical Chemistry, Am Fassberg 11, Goettingen, D-37077, Germany" 1226 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" 1227 language = "eng" 1228 doi = "10.1007/s10858-007-9213-3" 1229 pubmed_id = 18085411 1230 status = "published" 1231 year = 2008
1232 1233 1234
1235 -class Delaglio95(Ref):
1236 """Bibliography container.""" 1237 1238 type = "journal" 1239 author = "Delaglio, F., Grzesiek, S., Vuister, G.W., Zhu, G., Pfeifer, J. and Bax, A." 1240 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]] 1241 title = "NMRPipe: a multidimensional spectral processing system based on UNIX pipes." 1242 journal = "J. Biomol. NMR" 1243 journal_full = "Journal of Biomolecular NMR" 1244 volume = "6" 1245 number = "3" 1246 pages = "277-293" 1247 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." 1248 authoraddress = "Laboratory of Chemical Physics, National Institute of Diabetes and Digestive and Kidney Diseases, National Institutes of Health, Bethesda, MD 20892, USA." 1249 keywords = "Magnetic Resonance Spectroscopy/*instrumentation ; *Software" 1250 language = "eng" 1251 doi = "10.1007/BF00197809" 1252 pubmed_id = 8520220 1253 status = "published" 1254 year = 1995
1255 1256 1257
1258 -class GoddardKneller(Ref):
1259 """Bibliography container.""" 1260 1261 author = "Goddard, T.D. and Kneller, D.G." 1262 author2 = [["Tom", "Goddard", "T.", "D."], ["Donald", "Kneller", "D.", "G."]] 1263 journal = "University of California, San Francisco." 1264 title = "Sparky 3." 1265 status = "unpublished" 1266 type = "internet"
1267 1268 1269
1270 -class LipariSzabo82a(Ref):
1271 """Bibliography container.""" 1272 1273 type = "journal" 1274 author = "Lipari, G. and Szabo, A." 1275 title = "Model-free approach to the interpretation of nuclear magnetic-resonance relaxation in macromolecules I. Theory and range of validity" 1276 journal = "J. Am. Chem. Soc." 1277 journal_full = "Journal of the American Chemical Society" 1278 volume = "104" 1279 number = "17" 1280 pages = "4546-4559" 1281 authoraddress = "NIADDKD,Chem Phys Lab,Bethesda,MD 20205." 1282 sourceid = "ISI:A1982PC82900009" 1283 status = "published" 1284 year = 1982
1285 1286 1287
1288 -class LipariSzabo82b(Ref):
1289 """Bibliography container.""" 1290 1291 type = "journal" 1292 author = "Lipari, G. and Szabo, A." 1293 title = "Model-free approach to the interpretation of nuclear magnetic-resonance relaxation in macromolecules II. Analysis of experimental results" 1294 journal = "J. Am. Chem. Soc." 1295 journal_full = "Journal of the American Chemical Society" 1296 volume = "104" 1297 number = "17" 1298 pages = "4559-4570" 1299 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." 1300 authoraddress = "NIADDKD,Chem Phys Lab,Bethesda,MD 20205." 1301 sourceid = "ISI:A1982PC82900010" 1302 status = "published" 1303 year = 1982
1304