Source code for PyMca5.PyMcaIO.TextImageStack

#/*##########################################################################
#
# The PyMca X-Ray Fluorescence Toolkit
#
# Copyright (c) 2004-2014 European Synchrotron Radiation Facility
#
# This file is part of the PyMca X-ray Fluorescence Toolkit developed at
# the ESRF by the Software group.
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in
# all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
# THE SOFTWARE.
#
#############################################################################*/
__author__ = "V.A. Sole - ESRF Data Analysis"
__contact__ = "sole@esrf.fr"
__license__ = "MIT"
__copyright__ = "European Synchrotron Radiation Facility, Grenoble, France"
import numpy
import sys
import os
from PyMca5 import DataObject

SOURCE_TYPE = "EdfFileStack"
DEBUG = 0

[docs]class TextImageStack(DataObject.DataObject): def __init__(self, filelist = None, imagestack=None, dtype=None): DataObject.DataObject.__init__(self) self.incrProgressBar=0 self.__keyList = [] if imagestack is None: self.__imageStack = True else: self.__imageStack = imagestack self.__dtype = dtype if filelist is not None: if type(filelist) != type([]): filelist = [filelist] if len(filelist) == 1: self.loadIndexedStack(filelist) else: self.loadFileList(filelist)
[docs] 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.__nFiles=len(filelist) #read first file arrRet = numpy.loadtxt(filelist[0]) if self.__dtype is None: self.__dtype = arrRet.dtype self.__nImagesPerFile = 1 #try to allocate the memory shape = self.__nFiles, arrRet.shape[0], arrRet.shape[1] samplingStep = 1 try: self.data = numpy.zeros(shape, self.__dtype) except (MemoryError, ValueError): 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((self.__nFiles, s1, s2), self.__dtype) samplingStep = i except (MemoryError, ValueError): i += 1 #fill the array self.onBegin(self.__nFiles) self.__imageStack = True self.incrProgressBar=0 if samplingStep == 1: for tempFileName in filelist: self.data[self.incrProgressBar]=numpy.loadtxt(tempFileName, dtype=self.__dtype) self.incrProgressBar += 1 self.onProgress(self.incrProgressBar) else: for tempFileName in filelist: pieceOfStack=numpy.loadtxt(tempFileName, dtype=self.__dtype) self.data[self.incrProgressBar] = pieceOfStack[::samplingStep, ::samplingStep] self.incrProgressBar += 1 self.onProgress(self.incrProgressBar) self.onEnd() if self.__imageStack: self.info["McaIndex"] = 0 self.info["FileIndex"] = 1 else: self.info["McaIndex"] = 2 self.info["FileIndex"] = 0 self.info["SourceType"] = SOURCE_TYPE self.info["SourceName"] = self.sourceName self.info["NumberOfFiles"] = self.__nFiles * 1 self.info["Size"] = self.__nFiles * self.__nImagesPerFile
[docs] def onBegin(self, n): pass
[docs] def onProgress(self, n): pass
[docs] def onEnd(self): pass
[docs] def loadIndexedStack(self,filename,begin=None,end=None, skip = None, fileindex=0):
#if begin is None: begin = 0 if type(filename) == type([]): filename = filename[0] if not os.path.exists(filename): raise IOError("File %s does not exists" % filename) name = os.path.basename(filename) n = len(name) i = 1 numbers = ['0', '1', '2', '3', '4', '5', '6', '7', '8','9'] while (i <= n): c = name[n-i:n-i+1] if c in ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']: break i += 1 suffix = name[n-i+1:] if len(name) == len(suffix): #just one file, one should use standard widget #and not this one. self.loadFileList(filename, fileindex=fileindex) else: nchain = [] while (i<=n): c = name[n-i:n-i+1] if c not in ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']: break else: nchain.append(c) i += 1 number = "" nchain.reverse() for c in nchain: number += c fformat = "%" + "0%dd" % len(number) if (len(number) + len(suffix)) == len(name): prefix = "" else: prefix = name[0:n-i+1] prefix = os.path.join(os.path.dirname(filename),prefix) if not os.path.exists(prefix + number + suffix): print("Internal error in EDFStack") print("file should exist: %s " % (prefix + number + suffix)) return i = 0 if begin is None: begin = 0 testname = prefix+fformat % begin+suffix while not os.path.exists(prefix+fformat % begin+suffix): begin += 1 testname = prefix+fformat % begin+suffix if len(testname) > len(filename):break i = begin else: i = begin if not os.path.exists(prefix+fformat % i+suffix): raise ValueError("Invalid start index file = %s" % \ (prefix+fformat % i+suffix)) f = prefix+fformat % i+suffix filelist = [] while os.path.exists(f): filelist.append(f) i += 1 if end is not None: if i > end: break f = prefix+fformat % i+suffix self.loadFileList(filelist, fileindex=fileindex)
[docs] def getSourceInfo(self): sourceInfo = {} sourceInfo["SourceType"]=SOURCE_TYPE if self.__keyList == []: for i in range(1, self.__nFiles + 1): for j in range(1, self.__nImages + 1): self.__keyList.append("%d.%d" % (i,j)) sourceInfo["KeyList"]= self.__keyList
[docs] def getKeyInfo(self, key): print("Not implemented") return {}
[docs] def isIndexedStack(self): return self.__indexedStack
[docs] def getZSelectionArray(self,z=0): return (self.data[:,:,z]).astype(numpy.float)
[docs] def getXYSelectionArray(self,coord=(0,0)): x,y=coord return (self.data[y,x,:]).astype(numpy.float)