text += "<tr>" text += '<td align="left" bgcolor="%s">' % finalcolor text += "<b><font size=3>%s </font></b>" % shell text += "</td>" text += '<td align="right" bgcolor="%s">' % finalcolor text += "<b><font size=3>%.5f </font></b>" % Elements.Element[ ele]['binding'][shell] text += "</td>" text += "</tr>" text += "</table>" return text if __name__ == "__main__": import sys from PyMca5 import PyMcaQt as qt app = qt.QApplication(sys.argv) if len(sys.argv) > 1: ele = sys.argv[1] else: ele = "Fe" w = qt.QWidget() l = qt.QVBoxLayout(w) html = ElementHtml() text = qt.QTextEdit(w) text.insertHtml(html.gethtml(ele)) text.setReadOnly(1) l.addWidget(text) w.show() app.exec_()
def loadFileList(self, filelist, fileindex=0): 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 edf file #get information tempEdf = EdfFileDataSource.EdfFileDataSource(filelist[0]) keylist = tempEdf.getSourceInfo()['KeyList'] nImages = len(keylist) dataObject = tempEdf.getDataObject(keylist[0]) self.info.update(dataObject.info) if len(dataObject.data.shape) == 3: #this is already a stack self.data = dataObject.data self.__nFiles = 1 self.__nImagesPerFile = nImages 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"] = filelist[0] self.info["Size"] = 1 self.info["NumberOfFiles"] = 1 self.info["FileIndex"] = fileindex return arrRet = dataObject.data if self.__dtype is None: self.__dtype = arrRet.dtype self.onBegin(self.nbFiles) singleImageShape = arrRet.shape actualImageStack = False if (fileindex == 2) or (self.__imageStack): self.__imageStack = True if len(singleImageShape) == 1: #single line #be ready for specfile stack? self.onEnd() raise IOError("Not implemented yet") self.data = numpy.zeros( (arrRet.shape[0], nImages, self.nbFiles), self.__dtype) self.incrProgressBar = 0 for tempEdfFileName in filelist: tempEdf = EdfFile.EdfFile(tempEdfFileName, 'rb') for i in range(nImages): pieceOfStack = tempEdf.GetData(i) self.data[:, i, self.incrProgressBar] = pieceOfStack[:] self.incrProgressBar += 1 self.onProgress(self.incrProgressBar) self.onEnd() else: if nImages > 1: #this is not the common case #should I try to convert it to a standard one #using a 3D matrix or keep as 4D matrix? if self.nbFiles > 1: raise IOError(\ "Multiple files with multiple images implemented yet") self.data = numpy.zeros((arrRet.shape[0], arrRet.shape[1], nImages * self.nbFiles), self.__dtype) self.incrProgressBar = 0 for tempEdfFileName in filelist: tempEdf = EdfFile.EdfFile(tempEdfFileName, 'rb') for i in range(nImages): pieceOfStack = tempEdf.GetData(i) self.data[:,:, nImages*self.incrProgressBar+i] = \ pieceOfStack[:,:] self.incrProgressBar += 1 else: #this is the common case try: # calculate needed megabytes if self.__dtype == numpy.float: bytefactor = 8 else: bytefactor = 4 needed_ = self.nbFiles * \ arrRet.shape[0] *\ arrRet.shape[1] * bytefactor physicalMemory = PhysicalMemory.getPhysicalMemoryOrNone( ) if physicalMemory is not None: # spare 5% or memory if physicalMemory < (1.05 * needed_): raise MemoryError( "Not enough physical memory available") if self.__imageStack: self.data = numpy.zeros( (self.nbFiles, arrRet.shape[0], arrRet.shape[1]), self.__dtype) self.incrProgressBar = 0 for tempEdfFileName in filelist: tempEdf = EdfFile.EdfFile( tempEdfFileName, 'rb') pieceOfStack = tempEdf.GetData(0) self.data[self.incrProgressBar] = pieceOfStack self.incrProgressBar += 1 self.onProgress(self.incrProgressBar) actualImageStack = True else: self.data = numpy.zeros( (arrRet.shape[0], arrRet.shape[1], self.nbFiles), self.__dtype) self.incrProgressBar = 0 for tempEdfFileName in filelist: tempEdf = EdfFile.EdfFile( tempEdfFileName, 'rb') pieceOfStack = tempEdf.GetData(0) self.data[:, :, self.incrProgressBar] = pieceOfStack self.incrProgressBar += 1 self.onProgress(self.incrProgressBar) except (MemoryError, ValueError): hdf5done = False if HDF5 and (('PyMcaQt' in sys.modules) or\ ('PyMca.PyMcaQt' in sys.modules)): from PyMca5 import PyMcaQt as qt from PyMca5 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" hdf, self.data = ArraySave.getHDF5FileInstanceAndBuffer( hdf5file, (self.nbFiles, arrRet.shape[0], arrRet.shape[1])) self.incrProgressBar = 0 for tempEdfFileName in filelist: tempEdf = EdfFile.EdfFile( tempEdfFileName, 'rb') pieceOfStack = tempEdf.GetData(0) self.data[ self. incrProgressBar, :, :] = pieceOfStack[:, :] hdf.flush() self.incrProgressBar += 1 self.onProgress(self.incrProgressBar) hdf5done = True if not hdf5done: for i in range(3): print("\7") samplingStep = None i = 2 while samplingStep is None: print( "**************************************************" ) print( " Memory error!, attempting %dx%d sampling reduction " ) % (i, i) print( "**************************************************" ) s1, s2 = arrRet[::i, ::i].shape try: self.data = numpy.zeros( (s1, s2, self.nbFiles), self.__dtype) samplingStep = i except: i += 1 self.incrProgressBar = 0 for tempEdfFileName in filelist: tempEdf = EdfFile.EdfFile( tempEdfFileName, 'rb') pieceOfStack = tempEdf.GetData(0) self.data[:, :, self. incrProgressBar] = pieceOfStack[:: samplingStep, :: samplingStep] self.incrProgressBar += 1 self.onProgress(self.incrProgressBar) self.onEnd() else: self.__imageStack = False if len(singleImageShape) == 1: #single line #be ready for specfile stack? raise IOError("Not implemented yet") self.data = numpy.zeros( (self.nbFiles, arrRet.shape[0], nImages), self.__dtype) self.incrProgressBar = 0 for tempEdfFileName in filelist: tempEdf = EdfFile.EdfFile(tempEdfFileName, 'rb') for i in range(nImages): pieceOfStack = tempEdf.GetData(i) self.data[self.incrProgressBar, :, i] = pieceOfStack[:] self.incrProgressBar += 1 self.onProgress(self.incrProgressBar) self.onEnd() else: if nImages > 1: #this is not the common case #should I try to convert it to a standard one #using a 3D matrix or kepp as 4D matrix? if self.nbFiles > 1: if (arrRet.shape[0] > 1) and\ (arrRet.shape[1] > 1): raise IOError(\ "Multiple files with multiple images not implemented yet") elif arrRet.shape[0] == 1: self.data = numpy.zeros( (self.nbFiles, arrRet.shape[0] * nImages, arrRet.shape[1]), self.__dtype) self.incrProgressBar = 0 for tempEdfFileName in filelist: tempEdf = EdfFile.EdfFile( tempEdfFileName, 'rb') for i in range(nImages): pieceOfStack = tempEdf.GetData(i) self.data[self.incrProgressBar, i,:] = \ pieceOfStack[:,:] self.incrProgressBar += 1 self.onProgress(self.incrProgressBar) elif arrRet.shape[1] == 1: self.data = numpy.zeros( (self.nbFiles, arrRet.shape[1] * nImages, arrRet.shape[0]), self.__dtype) self.incrProgressBar = 0 for tempEdfFileName in filelist: tempEdf = EdfFile.EdfFile( tempEdfFileName, 'rb') for i in range(nImages): pieceOfStack = tempEdf.GetData(i) self.data[self.incrProgressBar, i,:] = \ pieceOfStack[:,:] self.incrProgressBar += 1 self.onProgress(self.incrProgressBar) else: self.data = numpy.zeros( (nImages * self.nbFiles, arrRet.shape[0], arrRet.shape[1]), self.__dtype) self.incrProgressBar = 0 for tempEdfFileName in filelist: tempEdf = EdfFile.EdfFile(tempEdfFileName, 'rb') for i in range(nImages): pieceOfStack = tempEdf.GetData(i) self.data[nImages * self.incrProgressBar + i, :, :] = pieceOfStack[:, :] self.incrProgressBar += 1 self.onProgress(self.incrProgressBar) self.onEnd() else: if fileindex == 1: try: self.data = numpy.zeros( (arrRet.shape[0], self.nbFiles, arrRet.shape[1]), self.__dtype) except: try: self.data = numpy.zeros( (arrRet.shape[0], self.nbFiles, arrRet.shape[1]), numpy.float32) except: self.data = numpy.zeros( (arrRet.shape[0], self.nbFiles, arrRet.shape[1]), numpy.int16) else: try: # calculate needed megabytes if self.__dtype == numpy.float: bytefactor = 8 else: bytefactor = 4 needed_ = self.nbFiles * \ arrRet.shape[0] *\ arrRet.shape[1] * 4 physicalMemory = PhysicalMemory.getPhysicalMemoryOrNone( ) if physicalMemory is not None: # spare 5% of memory if physicalMemory < (1.05 * needed_): raise MemoryError( "Not enough physical memory available") self.data = numpy.zeros( (self.nbFiles, arrRet.shape[0], arrRet.shape[1]), self.__dtype) except: try: needed_ = self.nbFiles * \ arrRet.shape[0] *\ arrRet.shape[1] * 4 physicalMemory = PhysicalMemory.getPhysicalMemoryOrNone( ) if physicalMemory is not None: # spare 5 % of memory if physicalMemory < (1.05 * needed_): raise MemoryError( "Not enough physical memory available" ) self.data = numpy.zeros( (self.nbFiles, arrRet.shape[0], arrRet.shape[1]), numpy.float32) except (MemoryError, ValueError): text = "Memory Error: Attempt subsampling or convert to HDF5" if HDF5 and (('PyMcaQt' in sys.modules) or\ ('PyMca.PyMcaQt' in sys.modules)): from PyMca5 import PyMcaQt as qt from PyMca5 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: raise MemoryError(text) 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" hdf, self.data = ArraySave.getHDF5FileInstanceAndBuffer( hdf5file, (self.nbFiles, arrRet.shape[0], arrRet.shape[1])) else: raise MemoryError("Memory Error") self.incrProgressBar = 0 if fileindex == 1: for tempEdfFileName in filelist: tempEdf = EdfFile.EdfFile(tempEdfFileName, 'rb') pieceOfStack = tempEdf.GetData(0) self.data[:, self. incrProgressBar, :] = pieceOfStack[:, :] self.incrProgressBar += 1 self.onProgress(self.incrProgressBar) else: # test for ID24 map ID24 = False if "_sample_" in filelist[0]: bckFile = filelist[0].replace( "_sample_", "_samplebk_") if os.path.exists(bckFile): bckData = EdfFile.EdfFile(bckFile).GetData(0) else: bckData = 0 i0StartFile = filelist[0].replace( "_sample_", "_I0start_") if os.path.exists(i0StartFile): ID24 = True id24idx = 0 i0Start = EdfFile.EdfFile( i0StartFile, 'rb').GetData(0).astype(numpy.float) i0Start -= bckData i0EndFile = filelist[0].replace( "_sample_", "_I0end_") i0Slope = 0.0 if os.path.exists(i0EndFile): i0End = EdfFile.EdfFile( i0EndFile, 'rb').GetData(0) - bckData i0Slope = (i0End - i0Start) / len(filelist) positionersFile = filelist[0].replace( "_sample_", "_positioners_") if os.path.exists(positionersFile): positionersEdf = EdfFile.EdfFile( positionersFile, 'rb') self.info["positioners"] = {} for i in range(positionersEdf.GetNumImages()): motorName = positionersEdf.GetHeader( i).get("Title", "Motor_%02d" % i) motorValue = positionersEdf.GetData(i) self.info["positioners"][ motorName] = motorValue for tempEdfFileName in filelist: tempEdf = EdfFile.EdfFile(tempEdfFileName, 'rb') if ID24: pieceOfStack = -numpy.log( (tempEdf.GetData(0) - bckData) / (i0Start[0, :] + id24idx * i0Slope)) pieceOfStack[numpy.isfinite(pieceOfStack) == False] = 1 id24idx += 1 else: pieceOfStack = tempEdf.GetData(0) try: self.data[ self. incrProgressBar, :, :] = pieceOfStack[:, :] except: if pieceOfStack.shape[1] != arrRet.shape[1]: print(" ERROR on file %s" % tempEdfFileName) print( " DIM 1 error Assuming missing data were at the end!!!" ) if pieceOfStack.shape[0] != arrRet.shape[0]: print(" ERROR on file %s" % tempEdfFileName) print( " DIM 0 error Assuming missing data were at the end!!!" ) self.data[self.incrProgressBar,\ :pieceOfStack.shape[0],\ :pieceOfStack.shape[1]] = pieceOfStack[:,:] self.incrProgressBar += 1 self.onProgress(self.incrProgressBar) self.onEnd() self.__nFiles = self.incrProgressBar self.__nImagesPerFile = nImages shape = self.data.shape for i in range(len(shape)): key = 'Dim_%d' % (i + 1, ) self.info[key] = shape[i] if not isinstance(self.data, numpy.ndarray): hdf.flush() self.info["SourceType"] = "HDF5Stack1D" if self.__imageStack: self.info["McaIndex"] = 0 self.info["FileIndex"] = 1 else: self.info["McaIndex"] = 2 self.info["FileIndex"] = 0 self.info["SourceName"] = [hdf5file] self.info["NumberOfFiles"] = 1 self.info["Size"] = 1 elif actualImageStack: self.info["SourceType"] = SOURCE_TYPE self.info["McaIndex"] = 0 self.info["FileIndex"] = 1 self.info["SourceName"] = self.sourceName self.info["NumberOfFiles"] = self.__nFiles * 1 self.info["Size"] = self.__nFiles * self.__nImagesPerFile else: self.info["SourceType"] = SOURCE_TYPE self.info["FileIndex"] = fileindex self.info["SourceName"] = self.sourceName self.info["NumberOfFiles"] = self.__nFiles * 1 self.info["Size"] = self.__nFiles * self.__nImagesPerFile # try to use positioners to compute the scales (ID24 specific) xPositionerName = None yPositionerName = None if "positioners" in self.info and len(self.info["positioners"]) == 2: for k, v in self.info["positioners"].items(): if isinstance(v, numpy.ndarray) and v.ndim == 2: deltaDim1 = v[:, 1:] - v[:, :-1] deltaDim0 = v[1:, :] - v[:-1, :] if numpy.any(deltaDim1) and not numpy.any(deltaDim0): # positioner varying only along dim1 xPositionerName = k # should we check that all delta values are equal? deltaX = numpy.mean(deltaDim1) originX = v[0, 0] elif numpy.any(deltaDim0) and not numpy.any(deltaDim1): # positioner varying only along dim0 yPositionerName = k deltaY = numpy.mean(deltaDim0) originY = v[0, 0] if xPositionerName is not None and yPositionerName is not None: self.info["xScale"] = (originX, deltaX) self.info["yScale"] = (originY, deltaY)
def loadFileList(self, filelist, fileindex=0): 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 edf file #get information tempEdf=EdfFileDataSource.EdfFileDataSource(filelist[0]) keylist = tempEdf.getSourceInfo()['KeyList'] nImages = len(keylist) dataObject = tempEdf.getDataObject(keylist[0]) self.info.update(dataObject.info) if len(dataObject.data.shape) == 3: #this is already a stack self.data = dataObject.data self.__nFiles = 1 self.__nImagesPerFile = nImages 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"] = filelist[0] self.info["Size"] = 1 self.info["NumberOfFiles"] = 1 self.info["FileIndex"] = fileindex return arrRet = dataObject.data if self.__dtype is None: self.__dtype = arrRet.dtype self.onBegin(self.nbFiles) singleImageShape = arrRet.shape actualImageStack = False if (fileindex == 2) or (self.__imageStack): self.__imageStack = True if len(singleImageShape) == 1: #single line #be ready for specfile stack? self.onEnd() raise IOError("Not implemented yet") self.data = numpy.zeros((arrRet.shape[0], nImages, self.nbFiles), self.__dtype) self.incrProgressBar=0 for tempEdfFileName in filelist: tempEdf=EdfFile.EdfFile(tempEdfFileName, 'rb') for i in range(nImages): pieceOfStack=tempEdf.GetData(i) self.data[:,i, self.incrProgressBar] = pieceOfStack[:] self.incrProgressBar += 1 self.onProgress(self.incrProgressBar) self.onEnd() else: if nImages > 1: #this is not the common case #should I try to convert it to a standard one #using a 3D matrix or keep as 4D matrix? if self.nbFiles > 1: raise IOError(\ "Multiple files with multiple images implemented yet") self.data = numpy.zeros((arrRet.shape[0], arrRet.shape[1], nImages * self.nbFiles), self.__dtype) self.incrProgressBar=0 for tempEdfFileName in filelist: tempEdf=EdfFile.EdfFile(tempEdfFileName, 'rb') for i in range(nImages): pieceOfStack=tempEdf.GetData(i) self.data[:,:, nImages*self.incrProgressBar+i] = \ pieceOfStack[:,:] self.incrProgressBar += 1 else: #this is the common case try: # calculate needed megabytes if self.__dtype == numpy.float: bytefactor = 8 else: bytefactor = 4 needed_ = self.nbFiles * \ arrRet.shape[0] *\ arrRet.shape[1] * bytefactor physicalMemory = PhysicalMemory.getPhysicalMemoryOrNone() if physicalMemory is not None: # spare 5% or memory if physicalMemory < (1.05 * needed_): raise MemoryError("Not enough physical memory available") if self.__imageStack: self.data = numpy.zeros((self.nbFiles, arrRet.shape[0], arrRet.shape[1]), self.__dtype) self.incrProgressBar=0 for tempEdfFileName in filelist: tempEdf=EdfFile.EdfFile(tempEdfFileName, 'rb') pieceOfStack=tempEdf.GetData(0) self.data[self.incrProgressBar] = pieceOfStack self.incrProgressBar += 1 self.onProgress(self.incrProgressBar) actualImageStack = True else: self.data = numpy.zeros((arrRet.shape[0], arrRet.shape[1], self.nbFiles), self.__dtype) self.incrProgressBar=0 for tempEdfFileName in filelist: tempEdf=EdfFile.EdfFile(tempEdfFileName, 'rb') pieceOfStack=tempEdf.GetData(0) self.data[:,:, self.incrProgressBar] = pieceOfStack self.incrProgressBar += 1 self.onProgress(self.incrProgressBar) except (MemoryError, ValueError): hdf5done = False if HDF5 and (('PyMcaQt' in sys.modules) or\ ('PyMca.PyMcaQt' in sys.modules)): from PyMca5 import PyMcaQt as qt from PyMca5 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" hdf, self.data = ArraySave.getHDF5FileInstanceAndBuffer(hdf5file, (self.nbFiles, arrRet.shape[0], arrRet.shape[1])) self.incrProgressBar=0 for tempEdfFileName in filelist: tempEdf=EdfFile.EdfFile(tempEdfFileName, 'rb') pieceOfStack=tempEdf.GetData(0) self.data[self.incrProgressBar,:,:] = pieceOfStack[:,:] hdf.flush() self.incrProgressBar += 1 self.onProgress(self.incrProgressBar) hdf5done = True if not hdf5done: for i in range(3): print("\7") samplingStep = None i = 2 while samplingStep is None: print("**************************************************") print(" Memory error!, attempting %dx%d sampling reduction ") % (i,i) print("**************************************************") s1, s2 = arrRet[::i, ::i].shape try: self.data = numpy.zeros((s1, s2, self.nbFiles), self.__dtype) samplingStep = i except: i += 1 self.incrProgressBar=0 for tempEdfFileName in filelist: tempEdf=EdfFile.EdfFile(tempEdfFileName, 'rb') pieceOfStack=tempEdf.GetData(0) self.data[:,:, self.incrProgressBar] = pieceOfStack[ ::samplingStep,::samplingStep] self.incrProgressBar += 1 self.onProgress(self.incrProgressBar) self.onEnd() else: self.__imageStack = False if len(singleImageShape) == 1: #single line #be ready for specfile stack? raise IOError("Not implemented yet") self.data = numpy.zeros((self.nbFiles, arrRet.shape[0], nImages), self.__dtype) self.incrProgressBar=0 for tempEdfFileName in filelist: tempEdf=EdfFile.EdfFile(tempEdfFileName, 'rb') for i in range(nImages): pieceOfStack=tempEdf.GetData(i) self.data[self.incrProgressBar, :,i] = pieceOfStack[:] self.incrProgressBar += 1 self.onProgress(self.incrProgressBar) self.onEnd() else: if nImages > 1: #this is not the common case #should I try to convert it to a standard one #using a 3D matrix or kepp as 4D matrix? if self.nbFiles > 1: if (arrRet.shape[0] > 1) and\ (arrRet.shape[1] > 1): raise IOError(\ "Multiple files with multiple images not implemented yet") elif arrRet.shape[0] == 1: self.data = numpy.zeros((self.nbFiles, arrRet.shape[0] * nImages, arrRet.shape[1]), self.__dtype) self.incrProgressBar=0 for tempEdfFileName in filelist: tempEdf=EdfFile.EdfFile(tempEdfFileName, 'rb') for i in range(nImages): pieceOfStack=tempEdf.GetData(i) self.data[self.incrProgressBar, i,:] = \ pieceOfStack[:,:] self.incrProgressBar += 1 self.onProgress(self.incrProgressBar) elif arrRet.shape[1] == 1: self.data = numpy.zeros((self.nbFiles, arrRet.shape[1] * nImages, arrRet.shape[0]), self.__dtype) self.incrProgressBar=0 for tempEdfFileName in filelist: tempEdf=EdfFile.EdfFile(tempEdfFileName, 'rb') for i in range(nImages): pieceOfStack=tempEdf.GetData(i) self.data[self.incrProgressBar, i,:] = \ pieceOfStack[:,:] self.incrProgressBar += 1 self.onProgress(self.incrProgressBar) else: self.data = numpy.zeros((nImages * self.nbFiles, arrRet.shape[0], arrRet.shape[1]), self.__dtype) self.incrProgressBar=0 for tempEdfFileName in filelist: tempEdf=EdfFile.EdfFile(tempEdfFileName, 'rb') for i in range(nImages): pieceOfStack=tempEdf.GetData(i) self.data[nImages*self.incrProgressBar+i, :,:] = pieceOfStack[:,:] self.incrProgressBar += 1 self.onProgress(self.incrProgressBar) self.onEnd() else: if fileindex == 1: try: self.data = numpy.zeros((arrRet.shape[0], self.nbFiles, arrRet.shape[1]), self.__dtype) except: try: self.data = numpy.zeros((arrRet.shape[0], self.nbFiles, arrRet.shape[1]), numpy.float32) except: self.data = numpy.zeros((arrRet.shape[0], self.nbFiles, arrRet.shape[1]), numpy.int16) else: try: # calculate needed megabytes if self.__dtype == numpy.float: bytefactor = 8 else: bytefactor = 4 needed_ = self.nbFiles * \ arrRet.shape[0] *\ arrRet.shape[1] * 4 physicalMemory = PhysicalMemory.getPhysicalMemoryOrNone() if physicalMemory is not None: # spare 5% of memory if physicalMemory < (1.05 * needed_): raise MemoryError("Not enough physical memory available") self.data = numpy.zeros((self.nbFiles, arrRet.shape[0], arrRet.shape[1]), self.__dtype) except: try: needed_ = self.nbFiles * \ arrRet.shape[0] *\ arrRet.shape[1] * 4 physicalMemory = PhysicalMemory.getPhysicalMemoryOrNone() if physicalMemory is not None: # spare 5 % of memory if physicalMemory < (1.05 * needed_): raise MemoryError("Not enough physical memory available") self.data = numpy.zeros((self.nbFiles, arrRet.shape[0], arrRet.shape[1]), numpy.float32) except (MemoryError, ValueError): text = "Memory Error: Attempt subsampling or convert to HDF5" if HDF5 and (('PyMcaQt' in sys.modules) or\ ('PyMca.PyMcaQt' in sys.modules)): from PyMca5 import PyMcaQt as qt from PyMca5 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: raise MemoryError(text) 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" hdf, self.data = ArraySave.getHDF5FileInstanceAndBuffer(hdf5file, (self.nbFiles, arrRet.shape[0], arrRet.shape[1])) else: raise MemoryError("Memory Error") self.incrProgressBar=0 if fileindex == 1: for tempEdfFileName in filelist: tempEdf=EdfFile.EdfFile(tempEdfFileName, 'rb') pieceOfStack=tempEdf.GetData(0) self.data[:,self.incrProgressBar,:] = pieceOfStack[:,:] self.incrProgressBar += 1 self.onProgress(self.incrProgressBar) else: # test for ID24 map ID24 = False if "_sample_" in filelist[0]: i0StartFile = filelist[0].replace("_sample_", "_I0start_") if os.path.exists(i0StartFile): ID24 = True id24idx = 0 i0Start = EdfFile.EdfFile(i0StartFile, 'rb').GetData(0).astype(numpy.float) i0EndFile = filelist[0].replace("_sample_", "_I0end_") i0Slope = 0.0 if os.path.exists(i0EndFile): i0End = EdfFile.EdfFile(i0EndFile, 'rb').GetData(0) i0Slope = (i0End-i0Start)/len(filelist) for tempEdfFileName in filelist: tempEdf=EdfFile.EdfFile(tempEdfFileName, 'rb') if ID24: pieceOfStack=-numpy.log(tempEdf.GetData(0)/(i0Start[0,:] + id24idx * i0Slope)) pieceOfStack[numpy.isfinite(pieceOfStack) == False] = 1 id24idx += 1 else: pieceOfStack=tempEdf.GetData(0) try: self.data[self.incrProgressBar, :,:] = pieceOfStack[:,:] except: if pieceOfStack.shape[1] != arrRet.shape[1]: print(" ERROR on file %s" % tempEdfFileName) print(" DIM 1 error Assuming missing data were at the end!!!") if pieceOfStack.shape[0] != arrRet.shape[0]: print(" ERROR on file %s" % tempEdfFileName) print(" DIM 0 error Assuming missing data were at the end!!!") self.data[self.incrProgressBar,\ :pieceOfStack.shape[0],\ :pieceOfStack.shape[1]] = pieceOfStack[:,:] self.incrProgressBar += 1 self.onProgress(self.incrProgressBar) self.onEnd() self.__nFiles = self.incrProgressBar self.__nImagesPerFile = nImages shape = self.data.shape for i in range(len(shape)): key = 'Dim_%d' % (i+1,) self.info[key] = shape[i] if not isinstance(self.data, numpy.ndarray): hdf.flush() self.info["SourceType"] = "HDF5Stack1D" if self.__imageStack: self.info["McaIndex"] = 0 self.info["FileIndex"] = 1 else: self.info["McaIndex"] = 2 self.info["FileIndex"] = 0 self.info["SourceName"] = [hdf5file] self.info["NumberOfFiles"] = 1 self.info["Size"] = 1 elif actualImageStack: self.info["SourceType"] = SOURCE_TYPE self.info["McaIndex"] = 0 self.info["FileIndex"] = 1 self.info["SourceName"] = self.sourceName self.info["NumberOfFiles"] = self.__nFiles * 1 self.info["Size"] = self.__nFiles * self.__nImagesPerFile else: self.info["SourceType"] = SOURCE_TYPE self.info["FileIndex"] = fileindex self.info["SourceName"] = self.sourceName self.info["NumberOfFiles"] = self.__nFiles * 1 self.info["Size"] = self.__nFiles * self.__nImagesPerFile