1
2
3 """Unit tests for PdfFit.py
4 """
5
6
7 import unittest
8
9 from diffpy.pdffit2 import PdfFit
10 from diffpy.pdffit2 import pdffit2
11 from pdffit2testutils import datafile
12
13
15
16 places = 6
17
19 self.P = PdfFit()
20 return
21
25
26
27
28
29
30
32 """check PdfFit.add_structure()
33 """
34
35 try:
36 from diffpy.Structure import Structure
37 except ImportError:
38 return
39 ni = Structure(filename=datafile('Ni.stru'))
40 self.P.add_structure(ni)
41 self.assertEqual(4, self.P.num_atoms())
42 return
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
80 """check PdfFit.alloc()
81 """
82
83 self.P.alloc('X', 25, 0.0, 0.01, 10, 1000)
84
85 self.P.calc()
86 Gzero = self.P.getpdf_fit()
87 self.assertEqual(1000*[0.0], Gzero)
88 self.P.read_struct(datafile('Ni.stru'))
89 self.P.calc()
90
91 r = self.P.getR()
92 self.assertEqual(1000, len(r))
93 for i in range(1000):
94 self.assertAlmostEqual(0.01*(i + 1), r[i], self.places)
95 Gfit_alloc_read = self.P.getpdf_fit()
96
97 self.P.reset()
98 self.P.read_struct(datafile('Ni.stru'))
99 self.P.alloc('X', 25, 0.0, 0.01, 10, 1000)
100 self.P.calc()
101 Gfit_read_alloc = self.P.getpdf_fit()
102
103 self.assertEqual(Gfit_read_alloc, Gfit_alloc_read)
104 return
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
152 """check PdfFit.get_structure()
153 """
154 self.P.read_struct(datafile('Ni.stru'))
155 self.P.read_struct(datafile('PbScW25TiO3.stru'))
156 stru1 = self.P.get_structure(1)
157 self.assertEqual(4, len(stru1))
158 self.assertEqual('Ni', stru1[0].element)
159 stru2 = self.P.get_structure(2)
160 self.assertEqual(56, len(stru2))
161 self.assertEqual('Ti', stru2[-1].element)
162 return
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
225 """check PdfFit.get_atoms()
226 """
227 self.P.read_struct(datafile('Ni.stru'))
228 self.P.read_struct(datafile('PbScW25TiO3.stru'))
229 self.P.setphase(1)
230 a1 = self.P.get_atoms()
231 a2 = self.P.get_atoms(2)
232 self.assertEqual(4*['NI'], a1)
233 self.assertEqual(8*['PB']+24*['O']+8*['SC']+8*['W']+8*['TI'], a2)
234 return
235
247
259
261 """check PdfFit.num_datasets()
262 """
263 self.assertEqual(0, self.P.num_datasets())
264 self.P.read_data(datafile('Ni.dat'), 'X', 25.0, 0.5)
265 self.assertEqual(1, self.P.num_datasets())
266
267 try:
268 self.P.read_data(datafile('badNi.dat'))
269 except:
270 pass
271 self.assertEqual(1, self.P.num_datasets())
272
273
274 self.P.read_struct(datafile('Ni.stru'))
275 self.P.alloc('X', 30.0, 0.05, 2, 10, 100)
276 self.assertEqual(2, self.P.num_datasets())
277 self.P.reset()
278 self.assertEqual(0, self.P.num_datasets())
279 return
280
282 """check PdfFit.getcrw()
283 """
284 import numpy
285 self.assertEqual(0, self.P.num_datasets())
286
287
288 self.P.read_data(datafile('Ni.dat'), 'X', 0.0, 0.0)
289
290 self.assertEqual([], self.P.getcrw())
291 self.P.read_struct(datafile('Ni.stru'))
292 self.P.pdfrange(1, 2, 19)
293 self.P.refine()
294 crw19 = numpy.array(self.P.getcrw())
295 self.failUnless(numpy.all(crw19 >= 0.0))
296
297 self.failUnless(numpy.all(numpy.diff(crw19) >= 0.0))
298
299 rw19 = crw19[-1]
300 self.assertAlmostEqual(self.P.getrw(), rw19, self.places)
301
302 Gobs19 = numpy.array(self.P.getpdf_obs())
303 Gnorm19 = numpy.sqrt(numpy.sum(Gobs19**2))
304 r = numpy.array(self.P.getR())
305 idx = numpy.nonzero(r <= 15)[0]
306 Gnorm15 = numpy.sqrt(numpy.sum(Gobs19[idx]**2))
307 i15 = idx[-1]
308 rw15 = crw19[i15] * Gnorm19 / Gnorm15
309 self.P.pdfrange(1, 2, r[i15] + 1e-5)
310 self.P.refine()
311 self.assertAlmostEqual(self.P.getrw(), rw15, self.places)
312 return
313
315 """check that getcrw() and getrw() are consistent for two datasets.
316 """
317 self.P.read_data(datafile('Ni.dat'), 'X', 25.0, 0.0)
318 self.P.pdfrange(1, 2, 8)
319 self.P.read_data(datafile('300K.gr'), 'N', 32.0, 0.0)
320 self.P.pdfrange(2, 1, 11)
321 self.P.read_struct(datafile('Ni.stru'))
322
323 self.P.setvar('lat(1)', 3)
324 self.P.setvar('lat(2)', 3)
325 self.P.setvar('lat(3)', 3)
326 self.P.refine()
327 rwtot = self.P.getrw()
328 self.failUnless(rwtot > 0.0)
329 self.P.setdata(1)
330 rw1 = self.P.getcrw()[-1]
331 self.P.setdata(2)
332 rw2 = self.P.getcrw()[-1]
333 self.assertAlmostEqual(rwtot**2, rw1**2 + rw2**2, self.places)
334 return
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
362 """check PdfFit.psel()
363 """
364 def doalloc():
365 self.P.alloc('X', 30.0, 0.05, 2, 10, 100)
366 return
367 self.assertRaises(pdffit2.unassignedError, self.P.psel, 0)
368 self.assertRaises(pdffit2.unassignedError, self.P.psel, 1)
369 self.P.read_struct(datafile('Ni.stru'))
370 doalloc()
371 self.P.calc()
372 G1 = self.P.getpdf_fit()
373 self.P.reset()
374 self.P.read_struct(datafile('PbScW25TiO3.stru'))
375 doalloc()
376 self.P.calc()
377 G2 = self.P.getpdf_fit()
378 self.P.reset()
379 self.P.read_struct(datafile('Ni.stru'))
380 self.P.read_struct(datafile('PbScW25TiO3.stru'))
381 doalloc()
382 self.P.pdesel('ALL')
383 self.P.psel(1)
384 self.P.calc()
385 self.assertEqual(G1, self.P.getpdf_fit())
386 self.P.pdesel('ALL')
387 self.P.psel(2)
388 self.P.calc()
389 self.assertEqual(G2, self.P.getpdf_fit())
390 self.P.psel('ALL')
391 self.P.calc()
392 Gall = self.P.getpdf_fit()
393 dGmax = max([abs(g1 + g2 - gall)
394 for g1, g2, gall in zip(G1, G2, Gall)])
395 self.assertAlmostEqual(0, dGmax, self.places)
396 self.assertRaises(pdffit2.unassignedError, self.P.psel, 10)
397 self.assertRaises(pdffit2.unassignedError, self.P.psel, 0)
398 self.assertRaises(pdffit2.unassignedError, self.P.psel, -100)
399 return
400
402 """check PdfFit.pdesel()
403 """
404 def doalloc():
405 self.P.alloc('X', 30.0, 0.05, 2, 10, 100)
406 return
407 self.assertRaises(pdffit2.unassignedError, self.P.pdesel, 0)
408 self.assertRaises(pdffit2.unassignedError, self.P.pdesel, 1)
409 self.P.read_struct(datafile('Ni.stru'))
410 doalloc()
411 self.P.calc()
412 G1 = self.P.getpdf_fit()
413 self.P.reset()
414 self.P.read_struct(datafile('PbScW25TiO3.stru'))
415 doalloc()
416 self.P.calc()
417 G2 = self.P.getpdf_fit()
418 self.P.reset()
419 self.P.read_struct(datafile('Ni.stru'))
420 self.P.read_struct(datafile('PbScW25TiO3.stru'))
421 doalloc()
422 self.P.psel('ALL')
423 self.P.pdesel(2)
424 self.P.calc()
425 self.assertEqual(G1, self.P.getpdf_fit())
426 self.P.psel('ALL')
427 self.P.pdesel(1)
428 self.P.calc()
429 self.assertEqual(G2, self.P.getpdf_fit())
430 self.P.pdesel('ALL')
431 self.P.calc()
432 G0 = self.P.getpdf_fit()
433 self.assertEqual([0.0]*len(G0), G0)
434 self.assertRaises(pdffit2.unassignedError, self.P.pdesel, 10)
435 self.assertRaises(pdffit2.unassignedError, self.P.pdesel, 0)
436 self.assertRaises(pdffit2.unassignedError, self.P.pdesel, -100)
437 return
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
460 """check PdfFit.bond_angle()
461 """
462 self.P.read_struct(datafile('Ni.stru'))
463 a, e = self.P.bond_angle(1, 2, 3)
464 self.assertAlmostEqual(60.0, a, self.places)
465 self.assertRaises(ValueError, self.P.bond_angle, 0, 1, 2)
466 self.assertRaises(ValueError, self.P.bond_angle, 1, 2, 7)
467 return
468
479
481 """check PdfFit.bond_length_types()
482 """
483 self.P.read_struct(datafile('Ni.stru'))
484 self.P.read_struct(datafile('PbScW25TiO3.stru'))
485 dPbO = self.P.bond_length_types('Pb', 'O', 0.1, 3.0)
486
487 self.failUnless('dij' in dPbO)
488 self.failUnless('ddij' in dPbO)
489 self.failUnless('ij0' in dPbO)
490 self.failUnless('ij1' in dPbO)
491
492 npts = len(dPbO['dij'])
493 self.assertEqual(npts, len(dPbO['ddij']))
494 self.assertEqual(npts, len(dPbO['ij0']))
495 self.assertEqual(npts, len(dPbO['ij1']))
496
497 self.assertEqual(8*12, len(dPbO['dij']))
498 self.P.setphase(1)
499 dfcc = self.P.bond_length_types('ALL', 'ALL', 0.1, 2.6)
500
501 self.assertEqual(4*12, len(dfcc['dij']))
502
503 self.assertRaises(ValueError, self.P.bond_length_types, 'Ni', 'Nix', 0.1, 5.0)
504
505 allij0 = sum(dfcc['ij0'], tuple())
506 self.assertEqual(0, min(allij0))
507 self.assertEqual(3, max(allij0))
508
509 allij1 = sum(dfcc['ij1'], tuple())
510 self.assertEqual(1, min(allij1))
511 self.assertEqual(4, max(allij1))
512
513 ij0check = [(i1 - 1, j1 - 1) for i1, j1 in dfcc['ij1']]
514 self.assertEqual(ij0check, dfcc['ij0'])
515
516 dnone = self.P.bond_length_types('Ni', 'Au', 0.1, 5.0)
517 self.assertEqual(0, len(dnone['dij']))
518 self.assertEqual(0, len(dnone['ddij']))
519 self.assertEqual(0, len(dnone['ij0']))
520 self.assertEqual(0, len(dnone['ij1']))
521 return
522
523
524
525
526
527
528
529
530
531
532
534 """check PdfFit.get_scat()
535 """
536
537 fPb = self.P.get_scat('X', 'Pb')
538 self.assertEqual(82.0, fPb)
539 fTi = self.P.get_scat('X', 'tI')
540 self.assertEqual(22.0, fTi)
541
542 bPb = self.P.get_scat('N', 'PB')
543 self.assertAlmostEqual(9.401, bPb, 3)
544 bTi = self.P.get_scat('N', 'ti')
545 self.assertAlmostEqual(-3.370, bTi, 3)
546
547 self.assertRaises(ValueError, self.P.get_scat, 'N', 'zz')
548 self.assertRaises(ValueError, self.P.get_scat, 'Z', 'Ti')
549 return
550
552 """check PdfFit.set_scat()
553 """
554
555 self.assertRaises(pdffit2.unassignedError,
556 self.P.set_scat, 'N', 'Ti', -11)
557
558 fPb = self.P.get_scat('X', 'Pb')
559 bPb = self.P.get_scat('N', 'Pb')
560 self.P.read_struct(datafile('PbScW25TiO3.stru'))
561 self.P.set_scat('X', 'Pb', 142)
562 self.assertEqual(142, self.P.get_scat('X', 'Pb'))
563 self.assertEqual(bPb, self.P.get_scat('N', 'Pb'))
564 self.P.read_struct(datafile('PbScW25TiO3.stru'))
565 self.assertEqual(fPb, self.P.get_scat('X', 'Pb'))
566 self.P.setphase(1)
567 self.assertEqual(142, self.P.get_scat('X', 'Pb'))
568 self.P.setphase(2)
569 self.assertEqual(fPb, self.P.get_scat('X', 'Pb'))
570
571 self.assertRaises(ValueError, self.P.set_scat, 'Z', 'C', 123)
572 self.assertRaises(ValueError, self.P.set_scat, 'X', 'ZZ', 123)
573 return
574
576 """check PdfFit.reset_scat()
577 """
578
579 self.assertRaises(pdffit2.unassignedError, self.P.reset_scat, 'Ti')
580
581 fPb = self.P.get_scat('X', 'Pb')
582 bPb = self.P.get_scat('N', 'Pb')
583 self.P.read_struct(datafile('PbScW25TiO3.stru'))
584 self.P.set_scat('X', 'Pb', 142)
585 self.P.read_struct(datafile('PbScW25TiO3.stru'))
586 self.P.set_scat('N', 'Pb', -17)
587 self.P.setphase(1)
588 self.assertNotEqual(fPb, self.P.get_scat('X', 'Pb'))
589 self.P.reset_scat('Pb')
590 self.assertEqual(fPb, self.P.get_scat('X', 'Pb'))
591 self.P.setphase(2)
592 self.assertNotEqual(bPb, self.P.get_scat('N', 'Pb'))
593 self.P.reset_scat('Pb')
594 self.assertEqual(bPb, self.P.get_scat('N', 'Pb'))
595
596 self.assertRaises(ValueError, self.P.reset_scat, 'Zz')
597 return
598
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724 if __name__ == '__main__':
725 unittest.main()
726
727
728