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

Source Code for Module info

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