1   
  2   
  3   
  4   
  5   
  6   
  7   
  8   
  9   
 10   
 11   
 12   
 13   
 14   
 15   
 16   
 17   
 18   
 19   
 20   
 21   
 22   
 23  from copy import deepcopy 
 24  from tempfile import mktemp 
 25   
 26   
 27  from data_store import Relax_data_store; ds = Relax_data_store() 
 28  from test_suite.system_tests.base_classes import SystemTestCase 
 29   
 30   
 32      """Class for testing various aspects specific to the alignment tensors.""" 
 33   
 35          """Function for initialising a few alignment tensors.""" 
 36   
 37           
 38          self.interpreter.pipe.create('test', 'N-state') 
 39   
 40           
 41          ds.tmpfile = mktemp() 
 42   
 43           
 44          align_id = 'test' 
 45   
 46           
 47          self.full_list = ['0 full', '1 full', '2 full', '3 full', '4 full'] 
 48          self.red_list = ['0 red', '1 red', '2 red', '3 red', '4 red'] 
 49   
 50           
 51          error = 1.47411211147e-05 
 52   
 53           
 54          self.tensors_full = [ 
 55                  (0.00014221982216882766, -0.00014454300156652134, -0.00070779621164871397, -0.00060161949408277324, 0.00020200800707295083), 
 56                  (-0.00014307694949297205, -0.00039671919293883539, -0.00024724524395487659, 0.00031948292975139144, 0.00018868359624777637), 
 57                  (-0.00022967898444150887, -0.00027171643813494106, -0.00021961563147411279, 0.00010337393266477703, 0.00029030226175831515), 
 58                  (0.00043690692358615301, -0.00034379559287467062, -0.00019359695171683388, 0.00030194133983804048, -6.314162250164486e-05), 
 59                  (-0.00026249527958822807, 0.00073561736796410628, 6.3975419225898133e-05, 6.2788017118057252e-05, 0.00020119758245770023) 
 60          ] 
 61          self.tensors_red = [ 
 62                  (-0.0004037026160192775, 0.00023172423501111316, -0.00020915186581478394, -0.00028817367472760139, -8.7172337025481604e-05), 
 63                  (0.0003767999506688964, -0.00021492227011444111, 0.00019620694392616774, 0.00027163215478635274, 8.147201253457049e-05), 
 64                  (0.00025970120925482461, -0.00014782823602910519, 0.00013565269563569894, 0.00018741173517420359, 5.6252903270026344e-05), 
 65                  (0.00014574884684542708, -8.3162940224598374e-05, 7.4927100277784987e-05, 0.00010508245294401461, 3.1156238348722986e-05), 
 66                  (-0.00011267453337899962, 6.412308037476237e-05, -5.7897942333203444e-05, -8.1865863377039068e-05, -2.5273427585025123e-05) 
 67          ] 
 68   
 69           
 70          self.interpreter.domain(id='full') 
 71          self.interpreter.domain(id='red') 
 72   
 73           
 74          for i in range(5): 
 75               
 76              self.interpreter.align_tensor.init(tensor=self.full_list[i], align_id=align_id, params=self.tensors_full[i], param_types=0) 
 77              self.interpreter.align_tensor.init(tensor=self.red_list[i], align_id=align_id, params=self.tensors_red[i], param_types=0) 
 78   
 79               
 80              self.interpreter.align_tensor.init(tensor=self.full_list[i], align_id=align_id, params=(error, error, error, error, error), param_types=0, errors=True) 
 81              self.interpreter.align_tensor.init(tensor=self.red_list[i], align_id=align_id, params=(error, error, error, error, error), param_types=0, errors=True) 
 82   
 83               
 84              self.interpreter.align_tensor.set_domain(tensor=self.full_list[i], domain='full') 
 85              self.interpreter.align_tensor.set_domain(tensor=self.red_list[i], domain='red') 
 86   
 87               
 88              self.interpreter.align_tensor.reduction(full_tensor=self.full_list[i], red_tensor=self.red_list[i]) 
 89   
 90           
 91          cdp.align_tensors[2].set(param='Axx', value=1) 
  92   
 93   
 95          """Test the operation of the align_tensor.matrix_angles user function for different basis sets. 
 96   
 97          This originates from the script in test_suite/shared_data/align_data/basis_sets/. 
 98          """ 
 99   
100           
101          tensor1 = [5.4839183673166663e-05, 3.692459844061351e-05, 1.994164790083226e-05, 4.5945264935308495e-05, 1.0090119622465559e-05] 
102          tensor2 = [1.5832157768761617e-05, -4.9797877146095514e-05, -3.6007226809999e-05, -3.8175058915299295e-05, 5.3131759988544946e-05] 
103          tensor3 = [3.892445496049645e-05, -1.7165585393754253e-05, 7.803231512226243e-05, -3.057296854986567e-05, 9.31348723610886e-05] 
104          tensor4 = [4.6720247808382186e-05, -9.140580842599e-05, -3.415945182796103e-05, -1.7753928806205142e-05, 5.20457038882803e-05] 
105   
106           
107          self.interpreter.pipe.create('basis set comparison', 'N-state') 
108   
109           
110          self.interpreter.align_tensor.init(tensor='t1', align_id='t1', params=tuple(tensor1)) 
111          self.interpreter.align_tensor.init(tensor='t2', align_id='t2', params=tuple(tensor2)) 
112          self.interpreter.align_tensor.init(tensor='t3', align_id='t3', params=tuple(tensor3)) 
113          self.interpreter.align_tensor.init(tensor='t4', align_id='t4', params=tuple(tensor4)) 
114   
115           
116          self.interpreter.align_tensor.display() 
117   
118           
119          self.interpreter.align_tensor.matrix_angles(basis_set='matrix') 
120          self.assertAlmostEqual(cdp.align_tensors.angles[0, 0], 0.000000000000000) 
121          self.assertAlmostEqual(cdp.align_tensors.angles[0, 1], 2.075565413247085) 
122          self.assertAlmostEqual(cdp.align_tensors.angles[0, 2], 1.338099052806276) 
123          self.assertAlmostEqual(cdp.align_tensors.angles[0, 3], 1.931864731843497) 
124          self.assertAlmostEqual(cdp.align_tensors.angles[1, 0], 2.075565413247085) 
125          self.assertAlmostEqual(cdp.align_tensors.angles[1, 1], 0.000000000000000) 
126          self.assertAlmostEqual(cdp.align_tensors.angles[1, 2], 1.238391416802885) 
127          self.assertAlmostEqual(cdp.align_tensors.angles[1, 3], 0.425283739619488) 
128          self.assertAlmostEqual(cdp.align_tensors.angles[2, 0], 1.338099052806276) 
129          self.assertAlmostEqual(cdp.align_tensors.angles[2, 1], 1.238391416802885) 
130          self.assertAlmostEqual(cdp.align_tensors.angles[2, 2], 0.000000000000000) 
131          self.assertAlmostEqual(cdp.align_tensors.angles[2, 3], 1.269973710252322) 
132          self.assertAlmostEqual(cdp.align_tensors.angles[3, 0], 1.931864731843497) 
133          self.assertAlmostEqual(cdp.align_tensors.angles[3, 1], 0.425283739619488) 
134          self.assertAlmostEqual(cdp.align_tensors.angles[3, 2], 1.269973710252322) 
135          self.assertAlmostEqual(cdp.align_tensors.angles[3, 3], 0.000000014901161) 
136   
137           
138          self.interpreter.align_tensor.matrix_angles(basis_set='irreducible 5D') 
139          self.assertAlmostEqual(cdp.align_tensors.angles[0, 0], 0.000000000000000) 
140          self.assertAlmostEqual(cdp.align_tensors.angles[0, 1], 2.075565413247085) 
141          self.assertAlmostEqual(cdp.align_tensors.angles[0, 2], 1.338099052806276) 
142          self.assertAlmostEqual(cdp.align_tensors.angles[0, 3], 1.931864731843497) 
143          self.assertAlmostEqual(cdp.align_tensors.angles[1, 0], 2.075565413247085) 
144          self.assertAlmostEqual(cdp.align_tensors.angles[1, 1], 0.000000000000000) 
145          self.assertAlmostEqual(cdp.align_tensors.angles[1, 2], 1.238391416802885) 
146          self.assertAlmostEqual(cdp.align_tensors.angles[1, 3], 0.425283739619488) 
147          self.assertAlmostEqual(cdp.align_tensors.angles[2, 0], 1.338099052806276) 
148          self.assertAlmostEqual(cdp.align_tensors.angles[2, 1], 1.238391416802885) 
149          self.assertAlmostEqual(cdp.align_tensors.angles[2, 2], 0.000000021073424) 
150          self.assertAlmostEqual(cdp.align_tensors.angles[2, 3], 1.269973710252322) 
151          self.assertAlmostEqual(cdp.align_tensors.angles[3, 0], 1.931864731843497) 
152          self.assertAlmostEqual(cdp.align_tensors.angles[3, 1], 0.425283739619488) 
153          self.assertAlmostEqual(cdp.align_tensors.angles[3, 2], 1.269973710252322) 
154          self.assertAlmostEqual(cdp.align_tensors.angles[3, 3], 0.000000021073424) 
155   
156           
157          self.interpreter.align_tensor.matrix_angles(basis_set='unitary 9D') 
158          self.assertAlmostEqual(cdp.align_tensors.angles[0, 0], 0.000000000000000) 
159          self.assertAlmostEqual(cdp.align_tensors.angles[0, 1], 2.075565413247085) 
160          self.assertAlmostEqual(cdp.align_tensors.angles[0, 2], 1.338099052806276) 
161          self.assertAlmostEqual(cdp.align_tensors.angles[0, 3], 1.931864731843497) 
162          self.assertAlmostEqual(cdp.align_tensors.angles[1, 0], 2.075565413247085) 
163          self.assertAlmostEqual(cdp.align_tensors.angles[1, 1], 0.000000014901161) 
164          self.assertAlmostEqual(cdp.align_tensors.angles[1, 2], 1.238391416802885) 
165          self.assertAlmostEqual(cdp.align_tensors.angles[1, 3], 0.425283739619488) 
166          self.assertAlmostEqual(cdp.align_tensors.angles[2, 0], 1.338099052806276) 
167          self.assertAlmostEqual(cdp.align_tensors.angles[2, 1], 1.238391416802885) 
168          self.assertAlmostEqual(cdp.align_tensors.angles[2, 2], 0.000000000000000) 
169          self.assertAlmostEqual(cdp.align_tensors.angles[2, 3], 1.269973710252322) 
170          self.assertAlmostEqual(cdp.align_tensors.angles[3, 0], 1.931864731843497) 
171          self.assertAlmostEqual(cdp.align_tensors.angles[3, 1], 0.425283739619488) 
172          self.assertAlmostEqual(cdp.align_tensors.angles[3, 2], 1.269973710252322) 
173          self.assertAlmostEqual(cdp.align_tensors.angles[3, 3], 0.000000014901161) 
174   
175           
176          self.interpreter.align_tensor.matrix_angles(basis_set='unitary 5D') 
177          self.assertAlmostEqual(cdp.align_tensors.angles[0, 0], 0.000000000000000) 
178          self.assertAlmostEqual(cdp.align_tensors.angles[0, 1], 1.962377927826435) 
179          self.assertAlmostEqual(cdp.align_tensors.angles[0, 2], 1.334149185082829) 
180          self.assertAlmostEqual(cdp.align_tensors.angles[0, 3], 1.747728360218234) 
181          self.assertAlmostEqual(cdp.align_tensors.angles[1, 0], 1.962377927826435) 
182          self.assertAlmostEqual(cdp.align_tensors.angles[1, 1], 0.000000000000000) 
183          self.assertAlmostEqual(cdp.align_tensors.angles[1, 2], 1.163535022090889) 
184          self.assertAlmostEqual(cdp.align_tensors.angles[1, 3], 0.449110033170688) 
185          self.assertAlmostEqual(cdp.align_tensors.angles[2, 0], 1.334149185082829) 
186          self.assertAlmostEqual(cdp.align_tensors.angles[2, 1], 1.163535022090889) 
187          self.assertAlmostEqual(cdp.align_tensors.angles[2, 2], 0.000000000000000) 
188          self.assertAlmostEqual(cdp.align_tensors.angles[2, 3], 1.180324869602255) 
189          self.assertAlmostEqual(cdp.align_tensors.angles[3, 0], 1.747728360218234) 
190          self.assertAlmostEqual(cdp.align_tensors.angles[3, 1], 0.449110033170688) 
191          self.assertAlmostEqual(cdp.align_tensors.angles[3, 2], 1.180324869602255) 
192          self.assertAlmostEqual(cdp.align_tensors.angles[3, 3], 0.000000000000000) 
193   
194           
195          self.interpreter.align_tensor.matrix_angles(basis_set='geometric 5D') 
196          self.assertAlmostEqual(cdp.align_tensors.angles[0, 0], 0.000000000000000) 
197          self.assertAlmostEqual(cdp.align_tensors.angles[0, 1], 1.924475705542377) 
198          self.assertAlmostEqual(cdp.align_tensors.angles[0, 2], 1.290778333130633) 
199          self.assertAlmostEqual(cdp.align_tensors.angles[0, 3], 1.724794814547786) 
200          self.assertAlmostEqual(cdp.align_tensors.angles[1, 0], 1.924475705542377) 
201          self.assertAlmostEqual(cdp.align_tensors.angles[1, 1], 0.000000021073424) 
202          self.assertAlmostEqual(cdp.align_tensors.angles[1, 2], 1.128650397698967) 
203          self.assertAlmostEqual(cdp.align_tensors.angles[1, 3], 0.418891267835127) 
204          self.assertAlmostEqual(cdp.align_tensors.angles[2, 0], 1.290778333130633) 
205          self.assertAlmostEqual(cdp.align_tensors.angles[2, 1], 1.128650397698967) 
206          self.assertAlmostEqual(cdp.align_tensors.angles[2, 2], 0.000000000000000) 
207          self.assertAlmostEqual(cdp.align_tensors.angles[2, 3], 1.126308408980378) 
208          self.assertAlmostEqual(cdp.align_tensors.angles[3, 0], 1.724794814547786) 
209          self.assertAlmostEqual(cdp.align_tensors.angles[3, 1], 0.418891267835127) 
210          self.assertAlmostEqual(cdp.align_tensors.angles[3, 2], 1.126308408980378) 
211          self.assertAlmostEqual(cdp.align_tensors.angles[3, 3], 0.000000014901161) 
 212   
213   
215          """Test the operation of the align_tensor.svd user function for different basis sets. 
216   
217          This originates from the script in test_suite/shared_data/align_data/basis_sets/. 
218          """ 
219   
220           
221          tensor1 = [5.4839183673166663e-05, 3.692459844061351e-05, 1.994164790083226e-05, 4.5945264935308495e-05, 1.0090119622465559e-05] 
222          tensor2 = [1.5832157768761617e-05, -4.9797877146095514e-05, -3.6007226809999e-05, -3.8175058915299295e-05, 5.3131759988544946e-05] 
223          tensor3 = [3.892445496049645e-05, -1.7165585393754253e-05, 7.803231512226243e-05, -3.057296854986567e-05, 9.31348723610886e-05] 
224          tensor4 = [4.6720247808382186e-05, -9.140580842599e-05, -3.415945182796103e-05, -1.7753928806205142e-05, 5.20457038882803e-05] 
225   
226           
227          self.interpreter.pipe.create('basis set comparison', 'N-state') 
228   
229           
230          self.interpreter.align_tensor.init(tensor='t1', align_id='t1', params=tuple(tensor1)) 
231          self.interpreter.align_tensor.init(tensor='t2', align_id='t2', params=tuple(tensor2)) 
232          self.interpreter.align_tensor.init(tensor='t3', align_id='t3', params=tuple(tensor3)) 
233          self.interpreter.align_tensor.init(tensor='t4', align_id='t4', params=tuple(tensor4)) 
234   
235           
236          self.interpreter.align_tensor.display() 
237   
238           
239          self.interpreter.align_tensor.svd(basis_set='irreducible 5D') 
240          self.assertAlmostEqual(cdp.align_tensors.cond_num, 6.131054731740254) 
241          self.assertAlmostEqual(cdp.align_tensors.singular_vals[0], 0.000413550754079) 
242          self.assertAlmostEqual(cdp.align_tensors.singular_vals[1], 0.000346772331066) 
243          self.assertAlmostEqual(cdp.align_tensors.singular_vals[2], 0.000185983409775) 
244          self.assertAlmostEqual(cdp.align_tensors.singular_vals[3], 0.000067451812481) 
245   
246           
247          self.interpreter.align_tensor.svd(basis_set='unitary 9D') 
248          self.assertAlmostEqual(cdp.align_tensors.cond_num, 6.131054731740256) 
249          self.assertAlmostEqual(cdp.align_tensors.singular_vals[0], 0.000319487975056) 
250          self.assertAlmostEqual(cdp.align_tensors.singular_vals[1], 0.000267898410932) 
251          self.assertAlmostEqual(cdp.align_tensors.singular_vals[2], 0.000143681186401) 
252          self.assertAlmostEqual(cdp.align_tensors.singular_vals[3], 0.000052109790083) 
253   
254           
255          self.interpreter.align_tensor.svd(basis_set='unitary 5D') 
256          self.assertAlmostEqual(cdp.align_tensors.cond_num, 6.503663323975970) 
257          self.assertAlmostEqual(cdp.align_tensors.singular_vals[0], 0.000250394766677) 
258          self.assertAlmostEqual(cdp.align_tensors.singular_vals[1], 0.000177094839440) 
259          self.assertAlmostEqual(cdp.align_tensors.singular_vals[2], 0.000106716235329) 
260          self.assertAlmostEqual(cdp.align_tensors.singular_vals[3], 0.000038500573324) 
261   
262           
263          self.interpreter.align_tensor.svd(basis_set='geometric 5D') 
264          self.assertAlmostEqual(cdp.align_tensors.cond_num, 6.982475764795178) 
265          self.assertAlmostEqual(cdp.align_tensors.singular_vals[0], 0.000304033216708) 
266          self.assertAlmostEqual(cdp.align_tensors.singular_vals[1], 0.000201547771250) 
267          self.assertAlmostEqual(cdp.align_tensors.singular_vals[2], 0.000125447137629) 
268          self.assertAlmostEqual(cdp.align_tensors.singular_vals[3], 0.000043542323232) 
 269   
270   
272          """Test the copying of alignment tensors (to catch U{bug #20338<https://web.archive.org/web/https://gna.org/bugs/?20338>}.""" 
273   
274           
275          self.interpreter.reset() 
276   
277           
278          self.interpreter.pipe.create('copy test', 'N-state') 
279   
280           
281          self.interpreter.align_tensor.init(tensor='orig', align_id='test', params=self.tensors_full[0], param_types=0) 
282   
283           
284          self.interpreter.align_tensor.copy(tensor_from='orig', tensor_to='new') 
285   
286           
287          self.assertEqual(len(cdp.align_tensors), 2) 
288          self.assertEqual(cdp.align_tensors[0].name, 'orig') 
289          self.assertEqual(cdp.align_tensors[1].name, 'new') 
 290   
291   
312   
313   
315          """Test the copying of alignment tensor Monte Carlo simulations between data pipes.""" 
316   
317           
318          self.interpreter.reset() 
319   
320           
321          self.interpreter.pipe.create('target', 'N-state') 
322          self.interpreter.pipe.create('source', 'N-state') 
323   
324           
325          self.interpreter.align_tensor.init(tensor='orig', align_id='test', params=self.tensors_full[0], param_types=0) 
326   
327           
328          sim_number = 10 
329          cdp.align_tensors[0].set_sim_num(sim_number) 
330   
331           
332          for object_name in ['Axx', 'Ayy', 'Axy', 'Axz', 'Ayz']: 
333              for i in range(sim_number): 
334                  cdp.align_tensors[0].set(param=object_name, value=deepcopy(getattr(cdp.align_tensors[0], object_name)), category='sim', sim_index=i) 
335   
336           
337          self.interpreter.align_tensor.copy(pipe_from='source', pipe_to='target') 
338   
339           
340          self.interpreter.pipe.switch('target') 
341          self.assertEqual(len(cdp.align_tensors), 1) 
342          self.assertEqual(cdp.align_tensors[0].name, 'orig') 
 343   
344   
360   
361   
363          """Test the conversion to and from XML.""" 
364   
365           
366          self.interpreter.results.write(ds.tmpfile, dir=None, compress_type=0) 
367   
368           
369          self.interpreter.pipe.create('new', 'N-state') 
370   
371           
372          self.interpreter.results.read(ds.tmpfile, dir=None) 
373   
374           
375          self.assertEqual(len(cdp.align_tensors), 10) 
376          self.assert_(hasattr(cdp.align_tensors, 'reduction')) 
377          for i in range(5): 
378               
379              if i == 1: 
380                  self.assertAlmostEqual(cdp.align_tensors[i*2].Axx, 1.0) 
381              else: 
382                  self.assertAlmostEqual(cdp.align_tensors[i*2].Sxx, self.tensors_full[i][0]) 
383              self.assertAlmostEqual(cdp.align_tensors[i*2].Syy, self.tensors_full[i][1]) 
384              self.assertAlmostEqual(cdp.align_tensors[i*2].Sxy, self.tensors_full[i][2]) 
385              self.assertAlmostEqual(cdp.align_tensors[i*2].Sxz, self.tensors_full[i][3]) 
386              self.assertAlmostEqual(cdp.align_tensors[i*2].Syz, self.tensors_full[i][4]) 
387              self.assertEqual(cdp.align_tensors[i*2].name, self.full_list[i]) 
388   
389               
390              self.assertAlmostEqual(cdp.align_tensors[i*2+1].Sxx, self.tensors_red[i][0]) 
391              self.assertAlmostEqual(cdp.align_tensors[i*2+1].Syy, self.tensors_red[i][1]) 
392              self.assertAlmostEqual(cdp.align_tensors[i*2+1].Sxy, self.tensors_red[i][2]) 
393              self.assertAlmostEqual(cdp.align_tensors[i*2+1].Sxz, self.tensors_red[i][3]) 
394              self.assertAlmostEqual(cdp.align_tensors[i*2+1].Syz, self.tensors_red[i][4]) 
395              self.assertEqual(cdp.align_tensors[i*2+1].name, self.red_list[i]) 
396   
397               
398              self.assertEqual(cdp.align_tensors.reduction[i], [i*2, i*2+1]) 
  399