def test_fromStructure_CdSe(self): """check SFAverage.fromStructure() for CdSe """ cdse = loadDiffPyStructure('CdSe_cadmoselite.cif') sfavg = SFAverage.fromStructure(cdse, self.sftx) fcd = self.sftx.lookup('Cd') fse = self.sftx.lookup('Se') self.assertTrue(isinstance(sfavg.f1sum, float)) self.assertAlmostEqual(0.5 * (fcd + fse), sfavg.f1avg) self.assertAlmostEqual(0.5 * (fcd**2 + fse**2), sfavg.f2avg) self.assertEqual(4, sfavg.count) self.assertEqual(cdse.composition, sfavg.composition) qa = numpy.arange(0, 25, 0.1) sfavg2 = SFAverage.fromStructure(cdse, self.sftx, qa) self.assertTrue(isinstance(sfavg2.f1sum, numpy.ndarray)) self.assertNotEqual(sfavg2.f1sum[0], sfavg2.f1sum[-1]) self.assertEqual(sfavg.f1sum, sfavg2.f1sum[0]) self.assertEqual(sfavg.f2sum, sfavg2.f2sum[0]) sfavg3 = SFAverage.fromStructure(cdse, self.sftn, qa) self.assertEqual(sfavg3.f1sum[0], sfavg3.f1sum[-1]) sfavg4 = SFAverage.fromStructure(cdse, 'N', qa) self.assertTrue(numpy.array_equal(sfavg3.f1sum, sfavg4.f1sum)) self.assertTrue(numpy.array_equal(sfavg3.f2sum, sfavg4.f2sum)) sfavg5 = SFAverage.fromStructure(cdse, 'EN', qa) self.assertFalse(numpy.array_equal(sfavg3.f1sum, sfavg5.f1sum)) self.assertRaises(TypeError, SFAverage.fromStructure, 'notastructure', self.sftx) self.assertRaises(ValueError, SFAverage.fromStructure, cdse, 'invalid') return
def test_fromComposition(self): """check SFAverage.fromComposition() """ sfavg1 = SFAverage.fromComposition({'Na' : 1, 'Cl' : 1}, self.sftx) fm = ['Na', 0.25, 'Cl', 0.75, 'Cl', 0.25, 'Na', 0.5, 'Na', 0.25] smblcnts = zip(fm[0::2], fm[1::2]) sfavg2 = SFAverage.fromComposition(smblcnts, self.sftx) self.assertEqual(sfavg1.f1sum, sfavg2.f1sum) self.assertEqual(sfavg1.f2sum, sfavg2.f2sum) self.assertEqual(sfavg1.count, sfavg2.count) sfempty = SFAverage.fromComposition([], self.sftx) self.assertEqual(0, sfempty.f1avg) self.assertEqual(0, sfempty.f2avg) self.assertEqual(0, sfempty.count) return
def calc_fs_from_stru_files(*stru_files: str, qa=0) -> List[float]: """Calculate the compositional average scattering factor from the structure file.""" fs = [] for stru_file in stru_files: stru = loadStructure(stru_file) f = SFAverage.fromStructure(stru, XTB, qa).f1avg fs.append(f) return fs
def test_from_rutile(self): """check SFAverage.fromStructure for pyobjcryst Crystal of rutile. """ rutile = loadObjCrystCrystal('rutile.cif') qa = numpy.arange(0, 25, 0.1) sfavg = SFAverage.fromStructure(rutile, self.sftx, qa) fti = self.sftx.lookup('Ti', qa) fo = self.sftx.lookup('O', qa) self.assertTrue(numpy.allclose((fti + 2 * fo) / 3.0, sfavg.f1avg)) fti2, fo2 = fti**2, fo**2 self.assertTrue(numpy.allclose((fti2 + 2 * fo2) / 3.0, sfavg.f2avg)) self.assertEqual(6, sfavg.count)
def calc_fs_from_comps(*comps: Formula, qa=0) -> List[float]: """Calculate the compositional average scattering factor from the compositions.""" def to_dict(f: Formula): dct = {} c = f.composition() for tup in c: dct[tup[0]] = tup[1] return dct return [ SFAverage.fromComposition(to_dict(comp), XTB, qa).f1avg for comp in comps ]
def calc_fs_from_comps(*comps: Dict[str, int], qa=0) -> List[float]: """Calculate the compositional average scattering factor from the compositions.""" return [SFAverage.fromComposition(comp, XTB, qa).f1avg for comp in comps]