1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 """Module containing the introductory text container."""
24
25
26 import dep_check
27
28
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
49 from status import Status; status = Status()
50 from version import revision, url, version, version_full
51
52
61
62
63
65 """A container storing information about relax."""
66
67
68 instance = None
69
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
83 self.title = "relax"
84 self.version = version
85
86
87 self.website = "http://www.nmr-relax.com"
88
89
90 self.desc = "Molecular dynamics by NMR data analysis"
91
92
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
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
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
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
109 self._setup_references()
110
111
112 - def __new__(self, *args, **kargs):
113 """Replacement function for implementing the singleton design pattern."""
114
115
116 if self.instance is None:
117 self.instance = object.__new__(self, *args, **kargs)
118
119
120 return self.instance
121
122
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
156 spaces = int((width - len(string)) / 2)
157
158
159 string = spaces * ' ' + string
160
161
162 return string
163
164
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
175 if Popen == None:
176 return ''
177
178
179 if hasattr(ctypes, 'windll'):
180 return ''
181
182
183 cmd = "file -b '%s'" % path
184
185
186 pipe = Popen(cmd, shell=True, stdout=PIPE, close_fds=False)
187 waitpid(pipe.pid, 0)
188
189
190 data = pipe.stdout.readlines()
191
192
193 if data[0][:-1] == 'Mach-O universal binary with 3 architectures':
194
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
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
214 elif data[0][:-1] == 'Mach-O universal binary with 2 architectures':
215
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
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
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
243 return file_type
244
245
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
282 intro_string = '\n\n\n'
283
284
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
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
296 intro_string = intro_string + self.centre(self.desc, status.text_width) + '\n\n'
297
298
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
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
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
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
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
324 return intro_string
325
326
518
519
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
528 if Popen == None:
529 return ""
530
531
532 if not dep_check.subprocess_module:
533 return ""
534
535
536 system = platform.system()
537
538
539 if system == 'Linux':
540
541 cmd = "cat /proc/cpuinfo"
542
543
544 pipe = Popen(cmd, shell=True, stdout=PIPE, close_fds=False)
545 waitpid(pipe.pid, 0)
546
547
548 data = pipe.stdout.readlines()
549
550
551 for line in data:
552 if "model name" in line:
553
554 name = sub(".*model name.*:", "", line, 1)
555 name = name.strip()
556
557
558 return name
559
560
561 if system == 'Windows' or system == 'Microsoft':
562 return platform.processor()
563
564
565 if system == 'Darwin':
566
567 environ['PATH'] += pathsep + '/usr/sbin'
568
569
570 cmd = "sysctl -n machdep.cpu.brand_string"
571
572
573 try:
574
575 pipe = Popen(cmd, shell=True, stdout=PIPE, close_fds=False)
576 waitpid(pipe.pid, 0)
577
578
579 data = pipe.stdout.readlines()
580
581
582 return data[0].strip()
583
584
585 except:
586 return ""
587
588
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
602 if Popen == None:
603 return ''
604
605
606 text = ''
607
608
609 system = platform.system()
610
611
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
617 for line in free_lines:
618
619 row = line.split()
620
621
622 if row[0] == 'Mem:':
623 text += format % ("Total RAM size: ", row[1], "Mb")
624
625
626 if row[0] == 'Swap:':
627 text += format % ("Total swap size: ", row[1], "Mb")
628
629
630 if system == 'Windows' or system == 'Microsoft':
631
632 mem = MemoryStatusEx()
633
634
635 text += format % ("Total RAM size: ", mem.ullTotalPhys / 1024.**2, "Mb")
636
637
638 text += format % ("Total swap size: ", mem.ullTotalVirtual / 1024.**2, "Mb")
639
640
641 if system == 'Darwin':
642
643 environ['PATH'] += pathsep + '/usr/sbin'
644
645
646 cmd = "sysctl -n hw.physmem"
647 cmd2 = "sysctl -n hw.memsize"
648
649
650 try:
651
652 pipe = Popen(cmd, shell=True, stdout=PIPE, close_fds=False)
653 waitpid(pipe.pid, 0)
654
655
656 data = pipe.stdout.readlines()
657
658
659 pipe = Popen(cmd2, shell=True, stdout=PIPE, close_fds=False)
660 waitpid(pipe.pid, 0)
661
662
663 data2 = pipe.stdout.readlines()
664
665
666 ram = int(data[0].strip())
667 total = int(data2[0].strip())
668 swap = total - ram
669
670
671 text += format % ("Total RAM size: ", ram / 1024.**2, "Mb")
672
673
674 text += format % ("Total swap size: ", swap / 1024.**2, "Mb")
675
676
677 except:
678 pass
679
680
681 if not text:
682 text += format % ("Total RAM size: ", "?", "Mb")
683 text += format % ("Total swap size: ", "?", "Mb")
684
685
686 return text
687
688
738
739
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
748 text = ''
749
750
751 format = " %-25s%s\n"
752 format2 = " %-25s%s %s\n"
753
754
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
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
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
812 text = text + self.package_info()
813
814
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
821 text = text + self.relax_module_info()
822
823
824 text = text + ("\n")
825
826
827 return text
828
829
831 """Determine the MS Windows architecture.
832
833 @return: The architecture string.
834 @rtype: str
835 """
836
837
838 if 'PROCESSOR_ARCHITEW6432' in environ:
839 arch = environ['PROCESSOR_ARCHITEW6432']
840
841
842 else:
843 arch = environ['PROCESSOR_ARCHITECTURE']
844
845
846 return arch
847
848
849
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
867 """Set up the information and handle non MS Windows systems."""
868
869
870 if hasattr(ctypes, 'windll'):
871 self.dwLength = ctypes.sizeof(self)
872 ctypes.windll.kernel32.GlobalMemoryStatusEx(ctypes.byref(self))
873
874
875
877 """Reference base class."""
878
879
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
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
909 if name in ['page_first', 'page_last']:
910
911 if not self.pages:
912 return None
913
914
915 vals = self.pages.split('-')
916
917
918 if len(vals) == 1:
919 return vals[0]
920
921
922 if name == 'page_first':
923 return vals[0]
924
925
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
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
988 if cite[-1] != '.':
989 cite = cite + '.'
990
991
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
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
1046 if cite[-1] != '.':
1047 cite = cite + '.'
1048
1049
1050 return cite
1051
1052
1053
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
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
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
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
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
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
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
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
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
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
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
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