def SetSource (self,source_name=None,source_obj=None): """ Sets a new source for data retrieving, an specfile. If the file exists, self.Source will be the Specfile object associated to this file. Parameters: source_name: name of the specfile """ if source_name==self.SourceName: return 1 if source_name is not None: if source_obj is not None: self.Source= source_obj else: try: self.Source= specfile.Specfile(source_name) except: self.Source= None else: self.Source= None self.SourceInfo= None if self.Source is None: self.SourceName= None return 0 else: self.SourceName= source_name return 1
def refresh(self): self._sourceObjectList=[] self.__fileHeaderList = [] for name in self.__sourceNameList: if not os.path.exists(name): raise ValueError("File %s does not exists" % name) for name in self.__sourceNameList: self._sourceObjectList.append(specfile.Specfile(name)) self.__fileHeaderList.append(False) self.__lastKeyInfo = {}
def __init__(self, filename): DataObject.DataObject.__init__(self) sf = specfile.Specfile(filename) scan = sf[1] data = scan.data() nMca, nchannels = data.shape nMca = nMca - 1 xValues = data[0, :] * 1 xValues.shape = -1 if 0: self.data = numpy.zeros((nMca, nchannels), numpy.float32) self.data[:, :] = data[1:, :] self.data.shape = 1, nMca, nchannels else: self.data = data[1:, :] self.data.shape = 1, nMca, nchannels data = None #perform a least squares adjustment to a line x = numpy.arange(nchannels).astype(numpy.float32) Sxy = numpy.dot(x, xValues.T) Sxx = numpy.dot(x, x.T) Sx = x.sum() Sy = xValues.sum() d = nchannels * Sxx - Sx * Sx zero = (Sxx * Sy - Sx * Sxy) / d gain = (nchannels * Sxy - Sx * Sy) / d #and fill the requested information to be identified as a stack self.info['SourceName'] = [filename] self.info["SourceType"] = "SpecFileStack" self.info["Size"] = 1, nMca, nchannels self.info["NumberOfFiles"] = 1 self.info["FileIndex"] = 0 self.info["McaCalib"] = [zero, gain, 0.0] self.info["Channel0"] = 0.0
def get_scan(self, scannumber): spec = specfilewrapper.Specfile(self.config.specfile) return spec.select('{0}.1'.format(scannumber))
print("VICTOREEN") plot(energy, spectrum, 'o') plot(xPre, pre_edge_function(prePol, xPre), 'r') plot(xPost, post_edge_function(postPol, xPost)+pre_edge_function(prePol, xPost), 'y') show() return energy, normalizedSpectrum, edge SUPPORTED_ALGORITHMS = {"polynomial":XASPolynomialNormalization, "victoreen": XASVictoreenNormalization} if __name__ == "__main__": import sys from PyMca import specfilewrapper as specfile import time sf = specfile.Specfile(sys.argv[1]) scan = sf[0] data = scan.data() energy = data[0, :] spectrum = data[1, :] n = 100 t0 = time.time() for i in range(n): edge = estimateXANESEdge(spectrum+i, energy=energy) print("EDGE ELAPSED = ", (time.time() - t0)/float(n)) print("EDGE = %f" % edge) if DEBUG: n = 1 else: n = 100 t0 = time.time()
def loadFileList(self, filelist, fileindex=0, shape=None): if type(filelist) == type(''): filelist = [filelist] self.__keyList = [] self.sourceName = filelist self.__indexedStack = True self.sourceType = SOURCE_TYPE self.info = {} self.nbFiles = len(filelist) #read first file #get information tempInstance = SpecFileDataSource.SpecFileDataSource(filelist[0]) keylist = tempInstance.getSourceInfo()['KeyList'] nscans = len(keylist) #that is the number of scans nmca = 0 numberofdetectors = 0 for key in keylist: info = tempInstance.getKeyInfo(key) numberofmca = info['NbMca'] if numberofmca > 0: numberofdetectors = info['NbMcaDet'] scantype = info["ScanType"] if numberofmca: nmca += numberofmca if numberofdetectors == 0: raise ValueError("No MCA found in file %s" % filelist[0]) if (nscans > 1) and ((nmca / numberofdetectors) == nscans): SLOW_METHOD = True else: SLOW_METHOD = False #get last mca of first point key = "%s.1.%s" % (keylist[-1], numberofmca) dataObject = tempInstance._getMcaData(key) self.info.update(dataObject.info) arrRet = dataObject.data self.onBegin(self.nbFiles * nmca / numberofdetectors) self.incrProgressBar = 0 if info['NbMcaDet'] > 1: #Should I generate a map for each mca and not just for the last one as I am doing? iterlist = range(info['NbMcaDet'], info['NbMca'] + 1, info['NbMcaDet']) else: iterlist = [1] if SLOW_METHOD and shape is None: self.data = numpy.zeros( (self.nbFiles, nmca / numberofdetectors, arrRet.shape[0]), arrRet.dtype.char) filecounter = 0 for tempFileName in filelist: tempInstance = SpecFileDataSource.SpecFileDataSource( tempFileName) mca_number = -1 for keyindex in keylist: info = tempInstance.getKeyInfo(keyindex) numberofmca = info['NbMca'] if numberofmca <= 0: continue key = "%s.1.%s" % (keyindex, numberofmca) dataObject = tempInstance._getMcaData(key) arrRet = dataObject.data mca_number += 1 for i in iterlist: #mcadata = scan_obj.mca(i) self.data[filecounter, mca_number, :] = arrRet[:] self.incrProgressBar += 1 self.onProgress(self.incrProgressBar) filecounter += 1 elif shape is None and (self.nbFiles == 1) and (iterlist == [1]): #it can only be here if there is one file #it can only be here if there is only one scan #it can only be here if there is only one detector self.data = numpy.zeros((1, numberofmca, arrRet.shape[0]), arrRet.dtype.char) for tempFileName in filelist: tempInstance = specfile.Specfile(tempFileName) #it can only be here if there is one scan per file #prevent problems if the scan number is different #scan = tempInstance.select(keylist[-1]) scan = tempInstance[-1] iterationList = range(scan.nbmca()) for i in iterationList: #mcadata = scan_obj.mca(i) self.data[0, i, :] = scan.mca(i + 1)[:] self.incrProgressBar += 1 self.onProgress(self.incrProgressBar) filecounter = 1 elif shape is None: #it can only be here if there is one scan per file try: self.data = numpy.zeros( (self.nbFiles, numberofmca / numberofdetectors, arrRet.shape[0]), arrRet.dtype.char) filecounter = 0 for tempFileName in filelist: tempInstance = specfile.Specfile(tempFileName) #it can only be here if there is one scan per file #prevent problems if the scan number is different #scan = tempInstance.select(keylist[-1]) scan = tempInstance[-1] for i in iterlist: #mcadata = scan_obj.mca(i) self.data[filecounter, 0, :] = scan.mca(i)[:] self.incrProgressBar += 1 self.onProgress(self.incrProgressBar) filecounter += 1 except MemoryError: qtflag = False if ('PyQt4.QtCore' in sys.modules) or\ ('PyMcaQt' in sys.modules) or\ ('PyMca.PyMcaQt' in sys.modules): qtflag = True hdf5done = False if HDF5 and qtflag: import PyMcaQt as qt import ArraySave msg = qt.QMessageBox.information( None, "Memory error\n", "Do you want to convert your data to HDF5?\n", qt.QMessageBox.Yes, qt.QMessageBox.No) if msg != qt.QMessageBox.No: hdf5file = qt.QFileDialog.getSaveFileName( None, "Please select output file name", os.path.dirname(filelist[0]), "HDF5 files *.h5") if not len(hdf5file): raise IOError("Invalid output file") hdf5file = qt.safe_str(hdf5file) if not hdf5file.endswith(".h5"): hdf5file += ".h5" #get the final shape from PyMca.RGBCorrelatorWidget import ImageShapeDialog stackImageShape = self.nbFiles,\ int(numberofmca/numberofdetectors) dialog = ImageShapeDialog(None, shape=stackImageShape) dialog.setModal(True) ret = dialog.exec_() if ret: stackImageShape = dialog.getImageShape() dialog.close() del dialog hdf, self.data = ArraySave.getHDF5FileInstanceAndBuffer( hdf5file, (stackImageShape[0], stackImageShape[1], arrRet.shape[0]), compression=None, interpretation="spectrum") nRow = 0 nCol = 0 for tempFileName in filelist: tempInstance = specfile.Specfile(tempFileName) #it can only be here if there is one scan per file #prevent problems if the scan number is different #scan = tempInstance.select(keylist[-1]) scan = tempInstance[-1] nRow = int(self.incrProgressBar / stackImageShape[1]) nCol = self.incrProgressBar % stackImageShape[1] for i in iterlist: #mcadata = scan_obj.mca(i) self.data[nRow, nCol, :] = scan.mca(i)[:] self.incrProgressBar += 1 self.onProgress(self.incrProgressBar) hdf5done = True hdf.flush() self.onEnd() self.info["SourceType"] = "HDF5Stack1D" self.info["McaIndex"] = 2 self.info["FileIndex"] = 0 self.info["SourceName"] = [hdf5file] self.info["NumberOfFiles"] = 1 self.info["Size"] = 1 return else: raise else: sampling_order = 1 s0 = shape[0] s1 = shape[1] MEMORY_ERROR = False try: self.data = numpy.zeros((shape[0], shape[1], arrRet.shape[0]), arrRet.dtype.char) except MemoryError: try: self.data = numpy.zeros( (shape[0], shape[1], arrRet.shape[0]), numpy.float32) except MemoryError: MEMORY_ERROR = True while MEMORY_ERROR: try: for i in range(5): print("\7") sampling_order += 1 print("**************************************************") print(" Memory error!, attempting %dx%d sub-sampling " %\ (sampling_order, sampling_order)) print("**************************************************") s0 = int(shape[0] / sampling_order) s1 = int(shape[1] / sampling_order) #if shape[0] % sampling_order: # s0 = s0 + 1 #if shape[1] % sampling_order: # s1 = s1 + 1 self.data = numpy.zeros((s0, s1, arrRet.shape[0]), numpy.float32) MEMORY_ERROR = False except MemoryError: pass filecounter = 0 for j in range(s0): filecounter = (j * sampling_order) * shape[1] for k in range(s1): tempFileName = filelist[filecounter] tempInstance = specfile.Specfile(tempFileName) if tempInstance is None: if not os.path.exists(tempFileName): print("File %s does not exists" % tempFileName) raise IOError(\ "File %s does not exists" % tempFileName) scan = tempInstance.select(keylist[-1]) for i in iterlist: #sum the present mcas self.data[j, k, :] += scan.mca(i)[:] self.incrProgressBar += 1 self.onProgress(self.incrProgressBar) filecounter += sampling_order self.nbFiles = s0 * s1 self.onEnd() """ # Scan types # ---------- #SF_EMPTY = 0 # empty scan #SF_SCAN = 1 # non-empty scan #SF_MESH = 2 # mesh scan #SF_MCA = 4 # single mca #SF_NMCA = 8 # multi mca (more than 1 mca per acq) case = None if scantype == (SpecFileDataSource.SF_MESH + \ SpecFileDataSource.SF_MCA): # SINGLE MESH + SINGLE MCA # nfiles = 1 # nscans = 1 # nmca = 1 # there is a danger if it can be considered an indexed file ... pass elif scantype == (SpecFileDataSource.SF_MESH + \ SpecFileDataSource.SF_NMCA): # SINGLE MESH + MULTIPLE MCA # nfiles = 1 # nscans = 1 # nmca > 1 # there is a danger if it can be considered an indexed file ... #for the time being I take last mca pass elif scantype == (SpecFileDataSource.SF_SCAN+ \ SpecFileDataSource.SF_MCA): #Assumed scans containing always 1 detector pass elif scantype == (SpecFileDataSource.SF_MCA): #Assumed scans containing always 1 detector pass elif scantype == (SpecFileDataSource.SF_SCAN+ \ SpecFileDataSource.SF_NMCA): #Assumed scans containing the same number of detectors #for the time being I take last mca pass elif scantype == (SpecFileDataSource.SF_NMCA): #Assumed scans containing the same number of detectors #for the time being I take last mca pass else: raise ValueError, "Unhandled scan type = %s" % scantype """ self.__nFiles = self.nbFiles self.__nImagesPerFile = 1 shape = self.data.shape for i in range(len(shape)): key = 'Dim_%d' % (i + 1, ) self.info[key] = shape[i] self.info["SourceType"] = SOURCE_TYPE self.info["SourceName"] = self.sourceName self.info["Size"] = self.__nFiles * self.__nImagesPerFile self.info["NumberOfFiles"] = self.__nFiles * 1 self.info["FileIndex"] = fileindex