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

Source Code for Module info

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