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 search, 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 repo_revision, repo_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-2015 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, repo_revision)
287 text2 = "%s" % (repo_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
528
529
531 """Return a string for the processor name.
532
533 @return: The processor name, in much more detail than platform.processor().
534 @rtype: str
535 """
536
537
538 if Popen == None:
539 return ""
540
541
542 if not dep_check.subprocess_module:
543 return ""
544
545
546 system = platform.system()
547
548
549 if system == 'Linux':
550
551 cmd = "cat /proc/cpuinfo"
552
553
554 pipe = Popen(cmd, shell=True, stdout=PIPE, close_fds=False)
555 waitpid(pipe.pid, 0)
556
557
558 data = pipe.stdout.readlines()
559
560
561 for line in data:
562
563 if hasattr(line, 'decode'):
564 line = line.decode()
565
566
567 if search("model name", line):
568
569 name = sub(".*model name.*:", "", line, 1)
570 name = name.strip()
571
572
573 return name
574
575
576 if system == 'Windows' or system == 'Microsoft':
577 return platform.processor()
578
579
580 if system == 'Darwin':
581
582 environ['PATH'] += pathsep + '/usr/sbin'
583
584
585 cmd = "sysctl -n machdep.cpu.brand_string"
586
587
588 try:
589
590 pipe = Popen(cmd, shell=True, stdout=PIPE, close_fds=False)
591 waitpid(pipe.pid, 0)
592
593
594 data = pipe.stdout.readlines()
595
596
597 string = data[0]
598 if hasattr(string, 'decode'):
599 string = string.decode()
600
601
602
603 return string.strip()
604
605
606 except:
607 return ""
608
609
610 return ""
611
612
613 - def ram_info(self, format=" %-25s%s\n"):
614 """Return a string for printing to STDOUT with info from the Python packages used by relax.
615
616 @keyword format: The formatting string.
617 @type format: str
618 @return: The info string.
619 @rtype: str
620 """
621
622
623 if Popen == None:
624 return ''
625
626
627 text = ''
628
629
630 system = platform.system()
631
632
633 if system == 'Linux':
634 pipe = Popen('free -m', shell=True, stdin=PIPE, stdout=PIPE, stderr=PIPE, close_fds=False)
635 free_lines = pipe.stdout.readlines()
636 if free_lines:
637
638 for line in free_lines:
639
640 row = line.split()
641
642
643 if row[0] == 'Mem:':
644 text += format % ("Total RAM size: ", row[1], "Mb")
645
646
647 if row[0] == 'Swap:':
648 text += format % ("Total swap size: ", row[1], "Mb")
649
650
651 if system == 'Windows' or system == 'Microsoft':
652
653 mem = MemoryStatusEx()
654
655
656 text += format % ("Total RAM size: ", mem.ullTotalPhys / 1024.**2, "Mb")
657
658
659 text += format % ("Total swap size: ", mem.ullTotalVirtual / 1024.**2, "Mb")
660
661
662 if system == 'Darwin':
663
664 environ['PATH'] += pathsep + '/usr/sbin'
665
666
667 cmd = "sysctl -n hw.physmem"
668 cmd2 = "sysctl -n hw.memsize"
669
670
671 try:
672
673 pipe = Popen(cmd, shell=True, stdout=PIPE, close_fds=False)
674 waitpid(pipe.pid, 0)
675
676
677 data = pipe.stdout.readlines()
678
679
680 pipe = Popen(cmd2, shell=True, stdout=PIPE, close_fds=False)
681 waitpid(pipe.pid, 0)
682
683
684 data2 = pipe.stdout.readlines()
685
686
687 ram = int(data[0].strip())
688 total = int(data2[0].strip())
689 swap = total - ram
690
691
692 text += format % ("Total RAM size: ", ram / 1024.**2, "Mb")
693
694
695 text += format % ("Total swap size: ", swap / 1024.**2, "Mb")
696
697
698 except:
699 pass
700
701
702 if not text:
703 text += format % ("Total RAM size: ", "?", "Mb")
704 text += format % ("Total swap size: ", "?", "Mb")
705
706
707 return text
708
709
759
760
762 """Return a string for printing to STDOUT with info about the current relax instance.
763
764 @return: The info string.
765 @rtype: str
766 """
767
768
769 text = ''
770
771
772 format = " %-25s%s\n"
773 format2 = " %-25s%s %s\n"
774
775
776 text = text + ("\nHardware information:\n")
777 if hasattr(platform, 'machine'):
778 text = text + (format % ("Machine: ", platform.machine()))
779 if hasattr(platform, 'processor'):
780 text = text + (format % ("Processor: ", platform.processor()))
781 text = text + (format % ("Processor name: ", self.processor_name()))
782 text = text + (format % ("Endianness: ", sys.byteorder))
783 text = text + self.ram_info(format=format2)
784
785
786 text = text + ("\nOperating system information:\n")
787 if hasattr(platform, 'system'):
788 text = text + (format % ("System: ", platform.system()))
789 if hasattr(platform, 'release'):
790 text = text + (format % ("Release: ", platform.release()))
791 if hasattr(platform, 'version'):
792 text = text + (format % ("Version: ", platform.version()))
793 if hasattr(platform, 'win32_ver') and platform.win32_ver()[0]:
794 text = text + (format % ("Win32 version: ", (platform.win32_ver()[0] + " " + platform.win32_ver()[1] + " " + platform.win32_ver()[2] + " " + platform.win32_ver()[3])))
795 if hasattr(platform, 'linux_distribution') and platform.linux_distribution()[0]:
796 text = text + (format % ("GNU/Linux version: ", (platform.linux_distribution()[0] + " " + platform.linux_distribution()[1] + " " + platform.linux_distribution()[2])))
797 if hasattr(platform, 'mac_ver') and platform.mac_ver()[0]:
798 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])))
799 if hasattr(platform, 'dist'):
800 text = text + (format % ("Distribution: ", (platform.dist()[0] + " " + platform.dist()[1] + " " + platform.dist()[2])))
801 if hasattr(platform, 'platform'):
802 text = text + (format % ("Full platform string: ", (platform.platform())))
803 if hasattr(ctypes, 'windll'):
804 text = text + (format % ("Windows architecture: ", (self.win_arch())))
805
806
807 text = text + ("\nPython information:\n")
808 if hasattr(platform, 'architecture'):
809 text = text + (format % ("Architecture: ", (platform.architecture()[0] + " " + platform.architecture()[1])))
810 if hasattr(platform, 'python_version'):
811 text = text + (format % ("Python version: ", platform.python_version()))
812 if hasattr(platform, 'python_branch'):
813 text = text + (format % ("Python branch: ", platform.python_branch()))
814 if hasattr(platform, 'python_build'):
815 text = text + ((format[:-1]+', %s\n') % ("Python build: ", platform.python_build()[0], platform.python_build()[1]))
816 if hasattr(platform, 'python_compiler'):
817 text = text + (format % ("Python compiler: ", platform.python_compiler()))
818 if hasattr(platform, 'libc_ver'):
819 text = text + (format % ("Libc version: ", (platform.libc_ver()[0] + " " + platform.libc_ver()[1])))
820 if hasattr(platform, 'python_implementation'):
821 text = text + (format % ("Python implementation: ", platform.python_implementation()))
822 if hasattr(platform, 'python_revision'):
823 text = text + (format % ("Python revision: ", platform.python_revision()))
824 if sys.executable:
825 text = text + (format % ("Python executable: ", sys.executable))
826 if hasattr(sys, 'flags'):
827 text = text + (format % ("Python flags: ", sys.flags))
828 if hasattr(sys, 'float_info'):
829 text = text + (format % ("Python float info: ", sys.float_info))
830 text = text + (format % ("Python module path: ", sys.path))
831
832
833 text = text + self.package_info()
834
835
836 text = text + "\nrelax information:\n"
837 text = text + (format % ("Version: ", version_full()))
838 if hasattr(self, "multi_processor_string"):
839 text += format % ("Processor fabric: ", self.multi_processor_string)
840
841
842 text = text + self.relax_module_info()
843
844
845 text = text + ("\n")
846
847
848 return text
849
850
852 """Determine the MS Windows architecture.
853
854 @return: The architecture string.
855 @rtype: str
856 """
857
858
859 if 'PROCESSOR_ARCHITEW6432' in environ:
860 arch = environ['PROCESSOR_ARCHITEW6432']
861
862
863 else:
864 arch = environ['PROCESSOR_ARCHITECTURE']
865
866
867 return arch
868
869
870
872 """Special object for obtaining hardware info in MS Windows."""
873
874 if hasattr(ctypes, 'windll'):
875 _fields_ = [
876 ('dwLength', ctypes.wintypes.DWORD),
877 ('dwMemoryLoad', ctypes.wintypes.DWORD),
878 ('ullTotalPhys', ctypes.c_ulonglong),
879 ('ullAvailPhys', ctypes.c_ulonglong),
880 ('ullTotalPageFile', ctypes.c_ulonglong),
881 ('ullAvailPageFile', ctypes.c_ulonglong),
882 ('ullTotalVirtual', ctypes.c_ulonglong),
883 ('ullAvailVirtual', ctypes.c_ulonglong),
884 ('ullExtendedVirtual', ctypes.c_ulonglong),
885 ]
886
888 """Set up the information and handle non MS Windows systems."""
889
890
891 if hasattr(ctypes, 'windll'):
892 self.dwLength = ctypes.sizeof(self)
893 ctypes.windll.kernel32.GlobalMemoryStatusEx(ctypes.byref(self))
894
895
896
898 """Reference base class."""
899
900
901 type = None
902 author = None
903 author2 = None
904 title = None
905 status = None
906 journal = None
907 journal_full = None
908 volume = None
909 number = None
910 doi = None
911 pubmed_id = None
912 url = None
913 pages = None
914 year = None
915
916
918 """Generate some variables on the fly.
919
920 This is only called for objects not found in the class.
921
922 @param name: The name of the object.
923 @type name: str
924 @raises AttributeError: If the object cannot be created.
925 @returns: The generated object.
926 @rtype: anything
927 """
928
929
930 if name in ['page_first', 'page_last']:
931
932 if not self.pages:
933 return None
934
935
936 vals = self.pages.split('-')
937
938
939 if len(vals) == 1:
940 return vals[0]
941
942
943 if name == 'page_first':
944 return vals[0]
945
946
947 if name == 'page_last':
948 return vals[1]
949
950 raise AttributeError(name)
951
952
953 - def cite_short(self, author=True, title=True, journal=True, volume=True, number=True, pages=True, year=True, doi=True, url=True, status=True):
954 """Compile a short citation.
955
956 The returned text will have the form of:
957
958 - 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.
959
960
961 @keyword author: The author flag.
962 @type author: bool
963 @keyword title: The title flag.
964 @type title: bool
965 @keyword journal: The journal flag.
966 @type journal: bool
967 @keyword volume: The volume flag.
968 @type volume: bool
969 @keyword number: The number flag.
970 @type number: bool
971 @keyword pages: The pages flag.
972 @type pages: bool
973 @keyword year: The year flag.
974 @type year: bool
975 @keyword doi: The doi flag.
976 @type doi: bool
977 @keyword url: The url flag.
978 @type url: bool
979 @keyword status: The status flag. This will only be shown if not 'published'.
980 @type status: bool
981 @return: The full citation.
982 @rtype: str
983 """
984
985
986 cite = ''
987 if author and self.author and hasattr(self, 'author'):
988 cite = cite + self.author
989 if year and self.year and hasattr(self, 'year'):
990 cite = cite + ' (' + repr(self.year) + ').'
991 if title and self.title and hasattr(self, 'title'):
992 cite = cite + ' ' + self.title
993 if journal and self.journal and hasattr(self, 'journal'):
994 cite = cite + ' ' + self.journal + ','
995 if volume and self.volume and hasattr(self, 'volume'):
996 cite = cite + ' ' + self.volume
997 if number and self.number and hasattr(self, 'number'):
998 cite = cite + '(' + self.number + '),'
999 if pages and self.pages and hasattr(self, 'pages'):
1000 cite = cite + ' ' + self.pages
1001 if doi and self.doi and hasattr(self, 'doi'):
1002 cite = cite + ' (http://dx.doi.org/'+self.doi + ')'
1003 if url and self.url and hasattr(self, 'url'):
1004 cite = cite + ' (' + self.url + ')'
1005 if status and hasattr(self, 'status') and self.status != 'published':
1006 cite = cite + ' (' + self.status + ')'
1007
1008
1009 if cite[-1] != '.':
1010 cite = cite + '.'
1011
1012
1013 return cite
1014
1015
1016 - def cite_html(self, author=True, title=True, journal=True, volume=True, number=True, pages=True, year=True, doi=True, url=True, status=True):
1017 """Compile a citation for HTML display.
1018
1019 @keyword author: The author flag.
1020 @type author: bool
1021 @keyword title: The title flag.
1022 @type title: bool
1023 @keyword journal: The journal flag.
1024 @type journal: bool
1025 @keyword volume: The volume flag.
1026 @type volume: bool
1027 @keyword number: The number flag.
1028 @type number: bool
1029 @keyword pages: The pages flag.
1030 @type pages: bool
1031 @keyword year: The year flag.
1032 @type year: bool
1033 @keyword doi: The doi flag.
1034 @type doi: bool
1035 @keyword url: The url flag.
1036 @type url: bool
1037 @keyword status: The status flag. This will only be shown if not 'published'.
1038 @type status: bool
1039 @return: The full citation.
1040 @rtype: str
1041 """
1042
1043
1044 cite = ''
1045 if author and hasattr(self, 'author') and self.author:
1046 cite = cite + self.author
1047 if year and hasattr(self, 'year') and self.year:
1048 cite = cite + ' (' + repr(self.year) + ').'
1049 if title and hasattr(self, 'title') and self.title:
1050 cite = cite + ' ' + self.title
1051 if journal and hasattr(self, 'journal') and self.journal:
1052 cite = cite + ' <em>' + self.journal + '</em>,'
1053 if volume and hasattr(self, 'volume') and self.volume:
1054 cite = cite + ' <strong>' + self.volume + '</strong>'
1055 if number and hasattr(self, 'number') and self.number:
1056 cite = cite + '(' + self.number + '),'
1057 if pages and hasattr(self, 'pages') and self.pages:
1058 cite = cite + ' ' + self.pages
1059 if doi and hasattr(self, 'doi') and self.doi:
1060 cite = cite + ' (<a href="http://dx.doi.org/%s">abstract</a>)' % self.doi
1061 if url and hasattr(self, 'url') and self.url:
1062 cite = cite + ' (<a href="%s">url</a>)' % self.url
1063 if status and hasattr(self, 'status') and self.status != 'published':
1064 cite = cite + ' (<i>%s</i>)' % self.status
1065
1066
1067 if cite[-1] != '.':
1068 cite = cite + '.'
1069
1070
1071 return cite
1072
1073
1074
1076 """Bibliography container."""
1077
1078 type = "journal"
1079 author = "Bieri, M., d'Auvergne, E. J. and Gooley, P. R."
1080 author2 = [["Michael", "Bieri", "M.", ""], ["Edward", "d'Auvergne", "E.", "J."], ["Paul", "Gooley", "P.", "R."]]
1081 title = "relaxGUI: a new software for fast and simple NMR relaxation data analysis and calculation of ps-ns and micro-s motion of proteins"
1082 journal = "J. Biomol. NMR"
1083 journal_full = "Journal of Biomolecular NMR"
1084 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."
1085 authoraddress = "Department of Biochemistry and Molecular Biology, University of Melbourne, Melbourne, Victoria 3010, Australia."
1086 doi = "10.1007/s10858-011-9509-1"
1087 pubmed_id = 21618018
1088 status = "published"
1089 year = 2011
1090
1091
1092
1094 """Bibliography container."""
1095
1096 type = "journal"
1097 author = "Clore, G. M. and Szabo, A. and Bax, A. and Kay, L. E. and Driscoll, P. C. and Gronenborn, A. M."
1098 title = "Deviations from the simple 2-parameter model-free approach to the interpretation of N-15 nuclear magnetic-relaxation of proteins"
1099 journal = "J. Am. Chem. Soc."
1100 journal_full = "Journal of the American Chemical Society"
1101 volume = "112"
1102 number = "12"
1103 pages = "4989-4991"
1104 address = "1155 16th St, NW, Washington, DC 20036"
1105 sourceid = "ISI:A1990DH27700070"
1106 status = "published"
1107 year = 1990
1108
1109
1110
1112 """Bibliography container."""
1113
1114 type = "thesis"
1115 author = "d'Auvergne, E. J."
1116 author2 = [["Edward", "d'Auvergne", "E.", "J."]]
1117 title = "Protein dynamics: a study of the model-free analysis of NMR relaxation data."
1118 school = "Biochemistry and Molecular Biology, University of Melbourne."
1119 url = "http://eprints.infodiv.unimelb.edu.au/archive/00002799/"
1120 status = "published"
1121 year = 2006
1122
1123
1124
1126 """Bibliography container."""
1127
1128 type = "journal"
1129 author = "d'Auvergne, E. J. and Gooley, P. R."
1130 author2 = [["Edward", "d'Auvergne", "E.", "J."], ["Paul", "Gooley", "P.", "R."]]
1131 title = "The use of model selection in the model-free analysis of protein dynamics."
1132 journal = "J. Biomol. NMR"
1133 journal_full = "Journal of Biomolecular NMR"
1134 volume = "25"
1135 number = "1"
1136 pages = "25-39"
1137 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."
1138 authoraddress = "Department of Biochemistry and Molecular Biology, University of Melbourne, Melbourne, Victoria 3010, Australia."
1139 keywords = "Amines ; Diffusion ; *Models, Molecular ; Motion ; Nuclear Magnetic Resonance, Biomolecular/*methods ; Proteins/*chemistry ; Research Support, Non-U.S. Gov't ; Rotation"
1140 doi = "10.1023/A:1021902006114"
1141 pubmed_id = 12566997
1142 status = "published"
1143 year = 2003
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 = "Model-free model elimination: A new step in the model-free dynamic analysis of NMR relaxation data."
1154 journal = "J. Biomol. NMR"
1155 journal_full = "Journal of Biomolecular NMR"
1156 volume = "35"
1157 number = "2"
1158 pages = "117-135"
1159 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."
1160 authoraddress = "Department of Biochemistry and Molecular Biology, Bio21 Institute of Biotechnology and Molecular Science, University of Melbourne, Parkville, Victoria, 3010, Australia"
1161 doi = "10.1007/s10858-006-9007-z"
1162 pubmed_id = 16791734
1163 status = "published"
1164 year = 2006
1165
1166
1167
1169 """Bibliography container."""
1170
1171 type = "journal"
1172 author = "d'Auvergne, E. J. and Gooley, P. R."
1173 author2 = [["Edward", "d'Auvergne", "E.", "J."], ["Paul", "Gooley", "P.", "R."]]
1174 title = "Set theory formulation of the model-free problem and the diffusion seeded model-free paradigm."
1175 journal = "Mol. Biosys."
1176 journal_full = "Molecular BioSystems"
1177 volume = "3"
1178 number = "7"
1179 pages = "483-494"
1180 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."
1181 authoraddress = "Department of Biochemistry and Molecular Biology, Bio21 Institute of Biotechnology and Molecular Science, University of Melbourne, Parkville, Melbourne, Victoria 3010, Australia."
1182 keywords = "Magnetic Resonance Spectroscopy/*methods ; *Models, Theoretical ; Proteins/chemistry ; Thermodynamics"
1183 doi = "10.1039/b702202f"
1184 pubmed_id = 17579774
1185 status = "published"
1186 year = 2007
1187
1188
1189
1191 """Bibliography container."""
1192
1193 type = "journal"
1194 author = "d'Auvergne, E. J. and Gooley, P. R."
1195 author2 = [["Edward", "d'Auvergne", "E.", "J."], ["Paul", "Gooley", "P.", "R."]]
1196 title = "Optimisation of NMR dynamic models I. Minimisation algorithms and their performance within the model-free and Brownian rotational diffusion spaces."
1197 journal = "J. Biomol. NMR"
1198 journal_full = "Journal of Biomolecular NMR"
1199 volume = "40"
1200 number = "2"
1201 pages = "107-119"
1202 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."
1203 authoraddress = "Department of NMR-based Structural Biology, Max Planck Institute for Biophysical Chemistry, Am Fassberg 11, D-37077, Goettingen, Germany"
1204 keywords = "*Algorithms ; Cytochromes c2/chemistry ; Diffusion ; *Models, Molecular ; Nuclear Magnetic Resonance, Biomolecular/*methods ; Rhodobacter capsulatus/chemistry ; *Rotation"
1205 doi = "10.1007/s10858-007-9214-2"
1206 pubmed_id = 18085410
1207 status = "published"
1208 year = 2008
1209
1210
1211
1213 """Bibliography container."""
1214
1215 type = "journal"
1216 author = "d'Auvergne, E. J. and Gooley, P. R."
1217 author2 = [["Edward", "d'Auvergne", "E.", "J."], ["Paul", "Gooley", "P.", "R."]]
1218 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."
1219 journal = "J. Biomol. NMR"
1220 journal_full = "Journal of Biomolecular NMR"
1221 volume = "40"
1222 number = "2"
1223 pages = "121-133"
1224 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."
1225 authoraddress = "Department of NMR-based Structural Biology, Max Planck Institute for Biophysical Chemistry, Am Fassberg 11, Goettingen, D-37077, Germany"
1226 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"
1227 language = "eng"
1228 doi = "10.1007/s10858-007-9213-3"
1229 pubmed_id = 18085411
1230 status = "published"
1231 year = 2008
1232
1233
1234
1236 """Bibliography container."""
1237
1238 type = "journal"
1239 author = "Delaglio, F., Grzesiek, S., Vuister, G.W., Zhu, G., Pfeifer, J. and Bax, A."
1240 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]]
1241 title = "NMRPipe: a multidimensional spectral processing system based on UNIX pipes."
1242 journal = "J. Biomol. NMR"
1243 journal_full = "Journal of Biomolecular NMR"
1244 volume = "6"
1245 number = "3"
1246 pages = "277-293"
1247 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."
1248 authoraddress = "Laboratory of Chemical Physics, National Institute of Diabetes and Digestive and Kidney Diseases, National Institutes of Health, Bethesda, MD 20892, USA."
1249 keywords = "Magnetic Resonance Spectroscopy/*instrumentation ; *Software"
1250 language = "eng"
1251 doi = "10.1007/BF00197809"
1252 pubmed_id = 8520220
1253 status = "published"
1254 year = 1995
1255
1256
1257
1259 """Bibliography container."""
1260
1261 author = "Goddard, T.D. and Kneller, D.G."
1262 author2 = [["Tom", "Goddard", "T.", "D."], ["Donald", "Kneller", "D.", "G."]]
1263 journal = "University of California, San Francisco."
1264 title = "Sparky 3."
1265 status = "unpublished"
1266 type = "internet"
1267
1268
1269
1271 """Bibliography container."""
1272
1273 type = "journal"
1274 author = "Lipari, G. and Szabo, A."
1275 title = "Model-free approach to the interpretation of nuclear magnetic-resonance relaxation in macromolecules I. Theory and range of validity"
1276 journal = "J. Am. Chem. Soc."
1277 journal_full = "Journal of the American Chemical Society"
1278 volume = "104"
1279 number = "17"
1280 pages = "4546-4559"
1281 authoraddress = "NIADDKD,Chem Phys Lab,Bethesda,MD 20205."
1282 sourceid = "ISI:A1982PC82900009"
1283 status = "published"
1284 year = 1982
1285
1286
1287
1289 """Bibliography container."""
1290
1291 type = "journal"
1292 author = "Lipari, G. and Szabo, A."
1293 title = "Model-free approach to the interpretation of nuclear magnetic-resonance relaxation in macromolecules II. Analysis of experimental results"
1294 journal = "J. Am. Chem. Soc."
1295 journal_full = "Journal of the American Chemical Society"
1296 volume = "104"
1297 number = "17"
1298 pages = "4559-4570"
1299 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."
1300 authoraddress = "NIADDKD,Chem Phys Lab,Bethesda,MD 20205."
1301 sourceid = "ISI:A1982PC82900010"
1302 status = "published"
1303 year = 1982
1304