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