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

Source Code for Module info

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