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

Source Code for Module info

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