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

Source Code for Module info

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