1   
  2   
  3   
  4   
  5   
  6   
  7   
  8   
  9   
 10   
 11   
 12   
 13   
 14   
 15   
 16   
 17   
 18   
 19   
 20   
 21   
 22   
 23   
 24  from math import pi 
 25  from os import sep 
 26  from tempfile import mkdtemp 
 27   
 28   
 29  from data_store import Relax_data_store; ds = Relax_data_store() 
 30  import dep_check 
 31  from pipe_control import pipes 
 32  from pipe_control.mol_res_spin import return_spin 
 33  from lib.errors import RelaxError 
 34  from lib.io import test_binary 
 35  from status import Status; status = Status() 
 36  from test_suite.system_tests.base_classes import SystemTestCase 
 37   
 38   
 40      """Class for testing various aspects specific to model-free analysis using the program 'Modelfree4'.""" 
 41   
 42 -    def __init__(self, methodName='runTest'): 
  43          """Skip the tests if the subprocess module is not available (Python 2.3 and earlier). 
 44   
 45          @keyword methodName:    The name of the test. 
 46          @type methodName:       str 
 47          """ 
 48   
 49           
 50          super(Palmer, self).__init__(methodName) 
 51   
 52           
 53          if not dep_check.subprocess_module: 
 54               
 55              status.skipped_tests.append([methodName, 'subprocess', self._skip_type]) 
 56   
 57           
 58          try: 
 59              test_binary('modelfree4') 
 60          except: 
 61              status.skipped_tests.append([methodName, "Art Palmer's Modelfree4 software", self._skip_type]) 
  62   
 63   
 65          """Set up for all the functional tests.""" 
 66   
 67           
 68          ds.tmpdir = mkdtemp() 
  69   
 70   
 72          """Test a complete model-free analysis using the program 'Modelfree4'.""" 
 73   
 74           
 75          self.script_exec(status.install_path + sep+'test_suite'+sep+'system_tests'+sep+'scripts'+sep+'palmer.py') 
 76   
 77           
 78          spin = return_spin(':0@N', pipe='m2') 
 79          if spin.te == 1.951*1e-12: 
 80              binary = 'linux-i386-gcc'    
 81          else: 
 82              binary = 'linux-i386-pgf'    
 83          spin = return_spin(':-2@N', pipe='m1') 
 84          if spin.chi2 == 36.62: 
 85              binary = 'mac-i386'          
 86          if not binary: 
 87              raise RelaxError("The Modelfree4 binary cannot be identified, therefore the parameters cannot be meaningfully checked.") 
 88          print("\nDetected the '%s' Modelfree4 binary." % binary) 
 89   
 90           
 91          models = ['m1', 'm2', 'm3'] 
 92          params = [['s2'], ['s2', 'te'], ['s2', 'rex']] 
 93          spin_names = [':-2@N', ':-1@N', ':0@N'] 
 94          s2 = [[0.869, 0.732, None], [0.869, 0.730, None], [0.715, 0.643, None]] 
 95          if binary == 'linux-i386-gcc': 
 96              te = [[None, None, None], [0.0, 1.951, None], [None, None, None]] 
 97          else: 
 98              te = [[None, None, None], [0.0, 1.952, None], [None, None, None]] 
 99          rex = [[None, None, None], [None, None, None], [4.308, 4.278, None]] 
100          chi2 = [[36.6223, 20.3954, None], [36.6223, 20.3299, None], [1.9763, 0.6307, None]] 
101          if binary == 'mac-i386': 
102              chi2 = [[36.62, 20.40, None], [36.62, 20.33, None], [1.976, 0.6307, None]] 
103          for model_index in range(3): 
104              print("Model " + repr(models[model_index])) 
105              for spin_index in range(3): 
106                  print("Spin " + repr(spin_names[spin_index])) 
107   
108                   
109                  spin = return_spin(spin_names[spin_index], pipe=models[model_index]) 
110   
111                   
112                  if te[model_index][spin_index]: 
113                      te[model_index][spin_index] = te[model_index][spin_index] * 1e-12 
114                  if rex[model_index][spin_index]: 
115                      rex[model_index][spin_index] = rex[model_index][spin_index] / (2.0 * pi * cdp.spectrometer_frq[cdp.ri_ids[0]])**2 
116   
117                   
118                  self.assertEqual(spin.model, models[model_index]) 
119                  self.assertEqual(spin.params, params[model_index]) 
120                  self.assertEqual(spin.s2, s2[model_index][spin_index]) 
121                  self.assertEqual(spin.s2f, None) 
122                  self.assertEqual(spin.s2s, None) 
123                  if te[model_index][spin_index] == None: 
124                      self.assertEqual(spin.te, te[model_index][spin_index]) 
125                  else: 
126                      self.assertAlmostEqual(spin.te, te[model_index][spin_index]) 
127                  self.assertEqual(spin.tf, None) 
128                  self.assertEqual(spin.ts, None) 
129                  self.assertEqual(spin.rex, rex[model_index][spin_index]) 
130                  self.assertEqual(spin.chi2, chi2[model_index][spin_index]) 
131   
132           
133          models = ['m3', 'm3'] 
134          params = [['s2', 'rex'], ['s2', 'rex']] 
135          s2 = [0.844, 0.760] 
136          te = [None, None] 
137          rex = [0.005, 0.404] 
138          chi2 = [1.7966, 0.7389] 
139          if binary == 'mac-i386': 
140              chi2 = [1.796, 0.7392] 
141          for spin_index in range(3): 
142               
143              spin = return_spin(spin_names[spin_index], pipe='aic') 
144   
145               
146              if not spin.select: 
147                  continue 
148   
149               
150              if te[spin_index]: 
151                  te[spin_index] = te[spin_index] * 1e-12 
152              if rex[spin_index]: 
153                  rex[spin_index] = rex[spin_index] / (2.0 * pi * cdp.spectrometer_frq[cdp.ri_ids[0]])**2 
154   
155               
156              self.assertEqual(spin.model, models[spin_index]) 
157              self.assertEqual(spin.params, params[spin_index]) 
158              self.assertAlmostEqual(spin.s2, s2[spin_index]) 
159              self.assertEqual(spin.s2f, None) 
160              self.assertEqual(spin.s2s, None) 
161              if te[spin_index]: 
162                  self.assertAlmostEqual(spin.te, te[spin_index]) 
163              else: 
164                  self.assertEqual(spin.te, None) 
165              self.assertEqual(spin.tf, None) 
166              self.assertEqual(spin.ts, None) 
167              self.assertAlmostEqual(spin.rex, rex[spin_index]) 
168              self.assertEqual(spin.chi2, chi2[spin_index]) 
169   
170           
171          final_pipe = pipes.get_pipe('aic') 
172          if binary == 'mac-i386': 
173              self.assertAlmostEqual(final_pipe.chi2, 2.5355) 
174              self.assertAlmostEqual(final_pipe.diff_tensor.tm, 12.051) 
175          else: 
176              self.assertAlmostEqual(final_pipe.chi2, 2.5356) 
177              self.assertAlmostEqual(final_pipe.diff_tensor.tm, 12.045) 
 178   
179   
181          """Test a complete model-free analysis using 'Modelfree4' with the OMP relaxation data, a PDB file, and a spheroid tensor.""" 
182   
183           
184          self.script_exec(status.install_path + sep+'test_suite'+sep+'system_tests'+sep+'scripts'+sep+'palmer_omp.py') 
185   
186           
187          spin = return_spin(':9@N', pipe='m2') 
188          if spin.s2 == 0.855: 
189              raise RelaxError("You are using an old, buggy Modelfree4 version!  You must upgrade to version 4.20 or later.") 
190   
191           
192          spin = return_spin(':9@N', pipe='aic') 
193          binary = None 
194          if spin.te * 1e12 == 52.195: 
195              binary = 'linux-i386-gcc'    
196          elif spin.te * 1e12 == 52.197: 
197              binary = 'linux-i386-pgf'    
198          elif spin.te * 1e12 == 52.194: 
199              binary = 'linux-x86_64-gcc'    
200          spin = return_spin(':9@N', pipe='m1') 
201          if binary == None and spin.chi2 == 143.7: 
202              binary = 'mac-i386'          
203          if not binary: 
204              raise RelaxError("The Modelfree4 binary cannot be identified, therefore the parameters cannot be meaningfully checked.") 
205          print("\nDetected the '%s' Modelfree4 binary." % binary) 
206   
207           
208          models = ['m1', 'm2', 'm3'] 
209          params = [['s2'], ['s2', 'te'], ['s2', 'rex']] 
210          spin_names = [':9@N', ':10@N', ':11@N'] 
211          s2 = [[0.822, 0.799, 0.823], [0.788, 0.777, 0.812], [0.822, 0.799, 0.823]] 
212          te = [[None, None, None], [61.506, 36.087, 20.039], [None, None, None]] 
213          if binary in ['mac-i386', 'linux-x86_64-gcc']: 
214              te = [[None, None, None], [61.504, 36.087, 20.039], [None, None, None]] 
215          rex = [[None, None, None], [None, None, None], [0.0, 0.0, 0.0]] 
216          chi2 = [[143.6773, 105.1767, 61.6684], [40.9055, 57.1562, 48.4927], [143.6773, 105.1767, 61.6684]] 
217          if binary in ['mac-i386', 'linux-x86_64-gcc']: 
218              chi2 = [[143.7, 105.2, 61.67], [40.91, 57.16, 48.49], [143.7, 105.2, 61.67]] 
219   
220           
221          for model_index in range(3): 
222              print("Model " + repr(models[model_index])) 
223              for spin_index in range(3): 
224                  print("Spin " + repr(spin_names[spin_index])) 
225   
226                   
227                  spin = return_spin(spin_names[spin_index], pipe=models[model_index]) 
228   
229                   
230                  if rex[model_index][spin_index]: 
231                      rex[model_index][spin_index] = rex[model_index][spin_index] / (2.0 * pi * cdp.spectrometer_frq[cdp.ri_ids[0]])**2 
232   
233                   
234                  self.assertEqual(spin.model, models[model_index]) 
235                  self.assertEqual(spin.params, params[model_index]) 
236                  self.assertAlmostEqual(spin.s2, s2[model_index][spin_index]) 
237                  self.assertEqual(spin.s2f, None) 
238                  self.assertEqual(spin.s2s, None) 
239                  if te[model_index][spin_index]: 
240                      self.assertAlmostEqual(spin.te * 1e12, te[model_index][spin_index]) 
241                  self.assertEqual(spin.tf, None) 
242                  self.assertEqual(spin.ts, None) 
243                  self.assertEqual(spin.rex, rex[model_index][spin_index]) 
244                  self.assertEqual(spin.chi2, chi2[model_index][spin_index]) 
245   
246           
247          models = ['m2', 'm2', 'm2'] 
248          params = [['s2', 'te'], ['s2', 'te'], ['s2', 'te']] 
249          s2 = [0.755, 0.761, 0.787] 
250          if binary == 'linux-i386-gcc': 
251              te = [52.195, 29.356, 12.678] 
252          elif binary == 'linux-i386-pgf': 
253              te = [52.197, 29.361, 12.677] 
254          elif binary == 'mac-i386': 
255              te = [52.197, 29.357, 12.676] 
256          elif binary == 'linux-x86_64-gcc': 
257              te = [52.194, 29.359, 12.677] 
258          chi2 = [7.254, 8.0437, 0.5327] 
259          if binary in ['mac-i386', 'linux-x86_64-gcc']: 
260              chi2 = [7.254, 8.044, 0.5327] 
261   
262           
263          for spin_index in range(3): 
264               
265              spin = return_spin(spin_names[spin_index], pipe='aic') 
266   
267               
268              self.assertEqual(spin.model, models[spin_index]) 
269              self.assertEqual(spin.params, params[spin_index]) 
270              self.assertAlmostEqual(spin.s2, s2[spin_index]) 
271              self.assertEqual(spin.s2f, None) 
272              self.assertEqual(spin.s2s, None) 
273              if te[spin_index]: 
274                  self.assertAlmostEqual(spin.te * 1e12, te[spin_index]) 
275              self.assertEqual(spin.tf, None) 
276              self.assertEqual(spin.ts, None) 
277              self.assertEqual(spin.rex, None) 
278              self.assertAlmostEqual(spin.chi2, chi2[spin_index]) 
279   
280           
281          final_pipe = pipes.get_pipe('aic') 
282          self.assertEqual(final_pipe.chi2, 15.8304) 
283          if binary == 'linux-i386-gcc': 
284              self.assertAlmostEqual(final_pipe.diff_tensor.tm, 8.443) 
285              self.assertAlmostEqual(final_pipe.diff_tensor.Dratio, 1.053) 
286              self.assertAlmostEqual(final_pipe.diff_tensor.theta * 360 / 2.0 / pi, 68.592) 
287              self.assertAlmostEqual(final_pipe.diff_tensor.phi * 360 / 2.0 / pi, 73.756) 
288          elif binary == 'linux-i386-pgf': 
289              self.assertAlmostEqual(final_pipe.diff_tensor.tm, 8.443) 
290              self.assertAlmostEqual(final_pipe.diff_tensor.Dratio, 1.053) 
291              self.assertAlmostEqual(final_pipe.diff_tensor.theta * 360 / 2.0 / pi, 68.864) 
292              self.assertAlmostEqual(final_pipe.diff_tensor.phi * 360 / 2.0 / pi, 73.913) 
293          elif binary == 'mac-i386': 
294              self.assertAlmostEqual(final_pipe.diff_tensor.tm, 8.459) 
295              self.assertAlmostEqual(final_pipe.diff_tensor.Dratio, 1.049) 
296              self.assertAlmostEqual(final_pipe.diff_tensor.theta * 360 / 2.0 / pi, 64.611) 
297              self.assertAlmostEqual(final_pipe.diff_tensor.phi * 360 / 2.0 / pi, 79.281) 
298          elif binary == 'linux-x86_64-gcc': 
299              self.assertAlmostEqual(final_pipe.diff_tensor.tm, 8.445) 
300              self.assertAlmostEqual(final_pipe.diff_tensor.Dratio, 1.052) 
301              self.assertAlmostEqual(final_pipe.diff_tensor.theta * 360 / 2.0 / pi, 68.245) 
302              self.assertAlmostEqual(final_pipe.diff_tensor.phi * 360 / 2.0 / pi, 74.290) 
  303