@@ -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+
549619def getSuite (auto = True ):
550620 testSuite = unittest .TestSuite ()
551621 if auto :
0 commit comments