def testSingleArrayExport(self): from PyMca5.PyMcaCore import StackBase from PyMca5.PyMcaCore import McaStackExport tmpDir = tempfile.gettempdir() self._h5File = os.path.join(tmpDir, "Array.h5") data = numpy.arange(3 * 1024).reshape(3, 1024) McaStackExport.exportStackList([data], self._h5File) # read back the stack from PyMca5.PyMcaIO import HDF5Stack1D stackRead = HDF5Stack1D.HDF5Stack1D([self._h5File], {"y": "/measurement/detector_00"}) # let's play sb = StackBase.StackBase() sb.setStack(stackRead) # check the data self.assertTrue(numpy.allclose(data, stackRead.data), "Incorrect data readout")
def testStackBaseStack1DDataHandling(self): from PyMca5.PyMcaCore import StackBase nrows = 50 ncolumns = 100 nchannels = 500 a = numpy.ones((nrows, ncolumns), numpy.float) referenceData = numpy.zeros((nrows, ncolumns, nchannels), numpy.float) for i in range(nchannels): referenceData[:, :, i] = a * i a = None mask = numpy.zeros((nrows, ncolumns), numpy.uint8) mask[20:30, 15:50] = 1 dummyArray = DummyArray(referenceData) defaultMca = referenceData.sum(axis=0, dtype=numpy.float64).sum(axis=0) maskedMca = referenceData[mask > 0, :].sum(axis=0) for fileindex in [0, 1]: #usually only one file index case is used but #we test both to have a better coverage j = 0 for data in [referenceData, dummyArray]: if j == 0: dynamic = "" j = 1 else: dynamic = "dynamic " stackBase = StackBase.StackBase() stackBase.setStack(data, mcaindex=2, fileindex=fileindex) channels, counts = stackBase.getActiveCurve()[0:2] self.assertTrue(numpy.allclose(defaultMca, counts), "Incorrect %sdefault mca" % dynamic) # set mask stackBase.setSelectionMask(mask) self.assertTrue( numpy.allclose(stackBase.getSelectionMask(), mask), "Incorrect mask set and get") # get mca from mask mcaDataObject = stackBase.calculateMcaDataObject() self.assertTrue( numpy.allclose(mcaDataObject.y[0], maskedMca), "Incorrect %smca from mask calculation" % dynamic) #get image from roi i0 = 100 imiddle = 200 i1 = 400 # calculate imageDict = stackBase.calculateROIImages(i0, i1, imiddle=imiddle) self.assertTrue( numpy.allclose(imageDict['ROI'], data[:, :, i0:i1].sum(axis=-1)), "Incorrect ROI image from %sROI calculation" % dynamic) self.assertTrue( numpy.allclose(imageDict['Left'], data[:, :, i0]), "Incorrect Left image from %sROI calculation" % dynamic) self.assertTrue( numpy.allclose(imageDict['Right'], data[:, :, i1 - 1]), "Incorrect Right image from %sROI calculation" % dynamic) self.assertTrue( numpy.allclose(imageDict['Middle'], data[:, :, imiddle]), "Incorrect Middle image from %sROI calculation" % dynamic) stackBase = None data = None dummyArray = None referenceData = None
def testStackBaseAverageAndSum(self): from PyMca5.PyMcaIO import specfilewrapper as specfile from PyMca5.PyMcaIO import ConfigDict from PyMca5.PyMcaCore import DataObject from PyMca5.PyMcaCore import StackBase from PyMca5.PyMcaPhysics.xrf import FastXRFLinearFit spe = os.path.join(self.dataDir, "Steel.spe") cfg = os.path.join(self.dataDir, "Steel.cfg") sf = specfile.Specfile(spe) self.assertTrue(len(sf) == 1, "File %s cannot be read" % spe) self.assertTrue(sf[0].nbmca() == 1, "Spe file should contain MCA data") y = counts = sf[0].mca(1) x = channels = numpy.arange(y.size).astype(numpy.float) sf = None configuration = ConfigDict.ConfigDict() configuration.read(cfg) calibration = configuration["detector"]["zero"], \ configuration["detector"]["gain"], 0.0 initialTime = configuration["concentrations"]["time"] # create the data nRows = 5 nColumns = 10 nTimes = 3 data = numpy.zeros((nRows, nColumns, counts.size), dtype=numpy.float) live_time = numpy.zeros((nRows * nColumns), dtype=numpy.float) mcaIndex = 0 for i in range(nRows): for j in range(nColumns): data[i, j] = counts live_time[i * nColumns + j] = initialTime * \ (1 + mcaIndex % nTimes) mcaIndex += 1 # create the stack data object stack = DataObject.DataObject() stack.data = data stack.info = {} stack.info["McaCalib"] = calibration stack.info["McaLiveTime"] = live_time stack.x = [channels] # let's play sb = StackBase.StackBase() sb.setStack(stack) x, y, legend, info = sb.getStackOriginalCurve() readCalib = info["McaCalib"] readLiveTime = info["McaLiveTime"] self.assertTrue(abs(readCalib[0] - calibration[0]) < 1.0e-10, "Calibration zero. Expected %f got %f" % \ (calibration[0], readCalib[0])) self.assertTrue(abs(readCalib[1] - calibration[1]) < 1.0e-10, "Calibration gain. Expected %f got %f" % \ (calibration[1], readCalib[0])) self.assertTrue(abs(readCalib[2] - calibration[2]) < 1.0e-10, "Calibration 2nd order. Expected %f got %f" % \ (calibration[2], readCalib[2])) self.assertTrue( abs(live_time.sum() - readLiveTime) < 1.0e-5, "Incorrect sum of live time data") mask = sb.getSelectionMask() if mask is None: mask = numpy.zeros((nRows, nColumns), dtype=numpy.uint8) mask[2, :] = 1 mask[0, 0:2] = 1 live_time.shape = mask.shape sb.setSelectionMask(mask) mcaObject = sb.calculateMcaDataObject(normalize=False) live_time.shape = mask.shape readLiveTime = mcaObject.info["McaLiveTime"] self.assertTrue( abs(live_time[mask > 0].sum() - readLiveTime) < 1.0e-5, "Incorrect sum of masked live time data") mcaObject = sb.calculateMcaDataObject(normalize=True) live_time.shape = mask.shape tmpBuffer = numpy.zeros(mask.shape, dtype=numpy.int32) tmpBuffer[mask > 0] = 1 nSelectedPixels = float(tmpBuffer.sum()) readLiveTime = mcaObject.info["McaLiveTime"] self.assertTrue( \ abs((live_time[mask > 0].sum() / nSelectedPixels) - readLiveTime) < 1.0e-5, "Incorrect average of masked live time data")
def testSingleStackExport(self): from PyMca5 import PyMcaDataDir from PyMca5.PyMcaIO import specfilewrapper as specfile from PyMca5.PyMcaIO import ConfigDict from PyMca5.PyMcaCore import DataObject from PyMca5.PyMcaCore import StackBase from PyMca5.PyMcaCore import McaStackExport spe = os.path.join(self.dataDir, "Steel.spe") cfg = os.path.join(self.dataDir, "Steel.cfg") sf = specfile.Specfile(spe) self.assertTrue(len(sf) == 1, "File %s cannot be read" % spe) self.assertTrue(sf[0].nbmca() == 1, "Spe file should contain MCA data") y = counts = sf[0].mca(1) x = channels = numpy.arange(y.size).astype(numpy.float) sf = None configuration = ConfigDict.ConfigDict() configuration.read(cfg) calibration = configuration["detector"]["zero"], \ configuration["detector"]["gain"], 0.0 initialTime = configuration["concentrations"]["time"] # create the data nRows = 5 nColumns = 10 nTimes = 3 data = numpy.zeros((nRows, nColumns, counts.size), dtype=numpy.float) live_time = numpy.zeros((nRows * nColumns), dtype=numpy.float) xpos = 10 + numpy.zeros((nRows * nColumns), dtype=numpy.float) ypos = 100 + numpy.zeros((nRows * nColumns), dtype=numpy.float) mcaIndex = 0 for i in range(nRows): for j in range(nColumns): data[i, j] = counts live_time[i * nColumns + j] = initialTime * \ (1 + mcaIndex % nTimes) xpos[mcaIndex] += j ypos[mcaIndex] += i mcaIndex += 1 # create the stack data object stack = DataObject.DataObject() stack.data = data stack.info = {} stack.info["McaCalib"] = calibration stack.info["McaLiveTime"] = live_time stack.x = [channels] stack.info["positioners"] = {"x": xpos, "y": ypos} tmpDir = tempfile.gettempdir() self._h5File = os.path.join(tmpDir, "SteelStack.h5") if os.path.exists(self._h5File): os.remove(self._h5File) McaStackExport.exportStackList(stack, self._h5File) # read back the stack from PyMca5.PyMcaIO import HDF5Stack1D stackRead = HDF5Stack1D.HDF5Stack1D([self._h5File], {"y": "/measurement/detector_00"}) # let's play sb = StackBase.StackBase() sb.setStack(stackRead) # positioners data = stackRead.info["positioners"]["x"] self.assertTrue(numpy.allclose(data, xpos), "Incorrect readout of x positions") data = stackRead.info["positioners"]["y"] self.assertTrue(numpy.allclose(data, ypos), "Incorrect readout of y positions") # calibration and live time x, y, legend, info = sb.getStackOriginalCurve() readCalib = info["McaCalib"] readLiveTime = info["McaLiveTime"] self.assertTrue(abs(readCalib[0] - calibration[0]) < 1.0e-10, "Calibration zero. Expected %f got %f" % \ (calibration[0], readCalib[0])) self.assertTrue(abs(readCalib[1] - calibration[1]) < 1.0e-10, "Calibration gain. Expected %f got %f" % \ (calibration[1], readCalib[0])) self.assertTrue(abs(readCalib[2] - calibration[2]) < 1.0e-10, "Calibration 2nd order. Expected %f got %f" % \ (calibration[2], readCalib[2])) self.assertTrue( abs(live_time.sum() - readLiveTime) < 1.0e-5, "Incorrect sum of live time data")