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