Skip to content

Commit 25dcbbe

Browse files
committed
Compare with legacy McaTheory (WIP)
1 parent dd4abb0 commit 25dcbbe

1 file changed

Lines changed: 119 additions & 49 deletions

File tree

PyMca5/tests/XrfTest.py

Lines changed: 119 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -267,10 +267,8 @@ def testTrainingDataFilePresence(self):
267267
self.assertTrue(os.path.isfile(trainingDataFile),
268268
"File %s is not an actual file" % trainingDataFile)
269269

270-
def testTrainingDataFit(self):
270+
def _readTrainingData(self):
271271
from PyMca5.PyMcaIO import specfilewrapper as specfile
272-
from PyMca5.PyMcaPhysics.xrf import LegacyMcaTheory
273-
from PyMca5.PyMcaPhysics.xrf import ConcentrationsTool
274272
from PyMca5.PyMcaIO import ConfigDict
275273
trainingDataFile = os.path.join(self.dataDir, "XRFSpectrum.mca")
276274
self.assertTrue(os.path.isfile(trainingDataFile),
@@ -285,18 +283,52 @@ def testTrainingDataFit(self):
285283
"Training data 1st scan should contain no MCAs")
286284
y = mcaData = sf[1].mca(1)
287285
sf = None
286+
x = numpy.arange(y.size).astype(numpy.float64)
288287

289288
# perform the actual XRF analysis
290289
configuration = ConfigDict.ConfigDict()
291290
configuration.readfp(StringIO(cfg))
291+
292+
return x, y, configuration
293+
294+
def _readStainlessSteelData(self):
295+
from PyMca5.PyMcaIO import specfilewrapper as specfile
296+
from PyMca5.PyMcaIO import ConfigDict
297+
298+
# read the data
299+
dataFile = os.path.join(self.dataDir, "Steel.spe")
300+
self.assertTrue(os.path.isfile(dataFile),
301+
"File %s is not an actual file" % dataFile)
302+
sf = specfile.Specfile(dataFile)
303+
self.assertTrue(len(sf) == 1, "File %s cannot be read" % dataFile)
304+
self.assertTrue(sf[0].nbmca() == 1,
305+
"Spe file should contain MCA data")
306+
y = counts = sf[0].mca(1)
307+
x = channels = numpy.arange(y.size).astype(numpy.float64)
308+
sf = None
309+
310+
# read the fit configuration
311+
configFile = os.path.join(self.dataDir, "Steel.cfg")
312+
self.assertTrue(os.path.isfile(configFile),
313+
"File %s is not an actual file" % configFile)
314+
configuration = ConfigDict.ConfigDict()
315+
configuration.read(configFile)
316+
# configure the fit
317+
# make sure no secondary excitations are used
318+
configuration["concentrations"]["usemultilayersecondary"] = 0
319+
320+
return x, y, configuration
321+
322+
def testTrainingDataFit(self):
323+
from PyMca5.PyMcaIO import specfilewrapper as specfile
324+
from PyMca5.PyMcaPhysics.xrf import LegacyMcaTheory
325+
from PyMca5.PyMcaPhysics.xrf import ConcentrationsTool
326+
327+
x, y, configuration = self._readTrainingData()
328+
329+
# perform the actual XRF analysis
292330
mcaFit = LegacyMcaTheory.LegacyMcaTheory()
293-
configuration=mcaFit.configure(configuration)
294-
x = numpy.arange(y.size).astype(numpy.float64)
295-
mcaFit.setData(x, y,
296-
xmin=configuration["fit"]["xmin"],
297-
xmax=configuration["fit"]["xmax"])
298-
mcaFit.estimate()
299-
fitResult, result = mcaFit.startFit(digest=1)
331+
fitResult, result = self._configAndFit(x, y, configuration, mcaFit)
300332

301333
# fit is already done, calculate the concentrations
302334
concentrationsConfiguration = configuration["concentrations"]
@@ -350,39 +382,14 @@ def testTrainingDataFit(self):
350382
"Error for <%s> concentration %g != %g" % (key, internal, fp))
351383

352384
def testStainlessSteelDataFit(self):
353-
from PyMca5.PyMcaIO import specfilewrapper as specfile
354385
from PyMca5.PyMcaPhysics.xrf import LegacyMcaTheory
355386
from PyMca5.PyMcaPhysics.xrf import ConcentrationsTool
356-
from PyMca5.PyMcaIO import ConfigDict
357387

358-
# read the data
359-
dataFile = os.path.join(self.dataDir, "Steel.spe")
360-
self.assertTrue(os.path.isfile(dataFile),
361-
"File %s is not an actual file" % dataFile)
362-
sf = specfile.Specfile(dataFile)
363-
self.assertTrue(len(sf) == 1, "File %s cannot be read" % dataFile)
364-
self.assertTrue(sf[0].nbmca() == 1,
365-
"Spe file should contain MCA data")
366-
y = counts = sf[0].mca(1)
367-
x = channels = numpy.arange(y.size).astype(numpy.float64)
368-
sf = None
388+
x, y, configuration = self._readStainlessSteelData()
369389

370-
# read the fit configuration
371-
configFile = os.path.join(self.dataDir, "Steel.cfg")
372-
self.assertTrue(os.path.isfile(configFile),
373-
"File %s is not an actual file" % configFile)
374-
configuration = ConfigDict.ConfigDict()
375-
configuration.read(configFile)
376390
# configure the fit
377-
# make sure no secondary excitations are used
378-
configuration["concentrations"]["usemultilayersecondary"] = 0
379391
mcaFit = LegacyMcaTheory.LegacyMcaTheory()
380-
configuration=mcaFit.configure(configuration)
381-
mcaFit.setData(x, y,
382-
xmin=configuration["fit"]["xmin"],
383-
xmax=configuration["fit"]["xmax"])
384-
mcaFit.estimate()
385-
fitResult, result = mcaFit.startFit(digest=1)
392+
fitResult, result = self._configAndFit(x, y, configuration, mcaFit)
386393

387394
# concentrations
388395
# fit is already done, calculate the concentrations
@@ -456,12 +463,7 @@ def testStainlessSteelDataFit(self):
456463
# in order to get the good fundamental parameters
457464
configuration["concentrations"]['usematrix'] = 1
458465
configuration["concentrations"]["usemultilayersecondary"] = 2
459-
mcaFit.setConfiguration(configuration)
460-
mcaFit.setData(x, y,
461-
xmin=configuration["fit"]["xmin"],
462-
xmax=configuration["fit"]["xmax"])
463-
mcaFit.estimate()
464-
fitResult, result = mcaFit.startFit(digest=1)
466+
fitResult, result = self._configAndFit(x, y, configuration, mcaFit)
465467

466468
# concentrations
467469
# fit is already done, calculate the concentrations
@@ -511,12 +513,7 @@ def testStainlessSteelDataFit(self):
511513
"Ni", "-", "-",
512514
"-","-","-"]
513515
mcaFit = LegacyMcaTheory.LegacyMcaTheory()
514-
configuration=mcaFit.configure(configuration)
515-
mcaFit.setData(x, y,
516-
xmin=configuration["fit"]["xmin"],
517-
xmax=configuration["fit"]["xmax"])
518-
mcaFit.estimate()
519-
fitResult, result = mcaFit.startFit(digest=1)
516+
fitResult, result = self._configAndFit(x, y, configuration, mcaFit)
520517

521518
# concentrations
522519
# fit is already done, calculate the concentrations
@@ -546,6 +543,79 @@ def testStainlessSteelDataFit(self):
546543
"Strategy: Element %s discrepancy too large %.1f %%" % \
547544
(element.split()[0], delta))
548545

546+
def testCompareLegacyMcaTheory(self):
547+
x, y, configuration = self._readTrainingData()
548+
self._testCompareLegacyMcaTheory(x, y, configuration)
549+
return
550+
x, y, configuration = self._readStainlessSteelData()
551+
self._testCompareLegacyMcaTheory(x, y, configuration)
552+
553+
def _testCompareLegacyMcaTheory(self, x, y, configuration):
554+
from PyMca5.PyMcaPhysics.xrf import LegacyMcaTheory
555+
from PyMca5.PyMcaPhysics.xrf import NewClassMcaTheory
556+
557+
mcaFitLegacy = LegacyMcaTheory.LegacyMcaTheory()
558+
mcaFit = NewClassMcaTheory.McaTheory()
559+
fitResult1, result1 = self._configAndFit(
560+
x, y, configuration, mcaFitLegacy, tmpflag=True)
561+
fitResult2, result2 = self._configAndFit(
562+
x, y, configuration, mcaFit, tmpflag=True)
563+
564+
# Compare internals
565+
self.assertEqual(mcaFitLegacy.config, mcaFit.config)
566+
567+
self.assertEqual(mcaFitLegacy._fluoRates, mcaFit._fluoRates)
568+
569+
# Compare line groups
570+
linegroups1 = mcaFitLegacy.PEAKS0
571+
linegroups2 = mcaFit._lineGroups
572+
linegroups1 = [[[line[1], line[0], name]
573+
for name, line in zip(names, lines)]
574+
for names, lines in zip(mcaFitLegacy.PEAKS0NAMES, linegroups1)]
575+
nsource = mcaFit._nSourceLines
576+
if nsource:
577+
linegroups2 = linegroups2[:-nsource]
578+
# self.assertEqual(linegroups1, linegroups2)
579+
self.assertEqual(len(linegroups1), len(linegroups2))
580+
for lg1, lg2 in zip(linegroups1, linegroups2):
581+
self.assertEqual(len(lg1), len(lg2))
582+
for line1, line2 in zip(lg1, lg2):
583+
self.assertEqual(line1[0], line2[0])
584+
numpy.testing.assert_allclose(line1[1], line2[1], rtol=1e-9)
585+
self.assertEqual(line1[2], line2[2])
586+
587+
# Compare escape line groups
588+
linegroups1 = mcaFitLegacy.PEAKS0ESCAPE
589+
linegroups2 = mcaFit._escapeLineGroups
590+
nsource = mcaFit._nSourceLines
591+
if nsource:
592+
linegroups2 = linegroups2[:-nsource]
593+
#self.assertEqual(linegroups1, linegroups2)
594+
self.assertEqual(len(linegroups1), len(linegroups2))
595+
for lg1, lg2 in zip(linegroups1, linegroups2):
596+
self.assertEqual(len(lg1), len(lg2))
597+
for elines1, elines2 in zip(lg1, lg2):
598+
self.assertEqual(len(elines1), len(elines2))
599+
for line1, line2 in zip(elines1, elines2):
600+
self.assertEqual(line1[0], line2[0])
601+
numpy.testing.assert_allclose(line1[1], line2[1], rtol=1e-9)
602+
self.assertEqual(line1[2], line2[2])
603+
604+
# Compare fit results
605+
self.assertEqual(fitResult1, fitResult2)
606+
self.assertEqual(result1, result2)
607+
608+
def _configAndFit(self, x, y, configuration, mcaFit, tmpflag=False):
609+
configuration = mcaFit.configure(configuration)
610+
if tmpflag:
611+
return None, None
612+
mcaFit.setData(x, y,
613+
xmin=configuration["fit"]["xmin"],
614+
xmax=configuration["fit"]["xmax"])
615+
mcaFit.estimate()
616+
return mcaFit.startFit(digest=1)
617+
618+
549619
def getSuite(auto=True):
550620
testSuite = unittest.TestSuite()
551621
if auto:

0 commit comments

Comments
 (0)