Source code for PyMca5.PyMcaCore.PyMcaBatchBuildOutput

#!/usr/bin/env python
#/*##########################################################################
#
# 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 os
import numpy
from PyMca5.PyMcaIO import EdfFile

DEBUG = 0

[docs]class PyMcaBatchBuildOutput(object): def __init__(self, inputdir=None, outputdir=None): self.inputDir = inputdir self.outputDir = outputdir
[docs] def buildOutput(self, inputdir=None, outputdir=None, delete=None): if inputdir is None:inputdir = self.inputDir if inputdir is None:inputdir = os.getcwd() if outputdir is None: outputdir = self.outputDir if outputdir is None: outputdir = inputdir if delete is None: if outputdir == inputdir: delete = True if DEBUG: print("delete option = ", delete) allfiles = os.listdir(inputdir) partialedflist = [] partialdatlist = [] partialconlist = [] for filename in allfiles: if filename.endswith('000000_partial.edf'):partialedflist.append(filename) elif filename.endswith('000000_partial.dat'):partialdatlist.append(filename) elif filename.endswith('000000_partial_concentrations.txt'):partialconlist.append(filename) #IMAGES edfoutlist = [] for filename in partialedflist: if DEBUG: print("Dealing with filename %s" % filename) edflist = self.getIndexedFileList(os.path.join(inputdir, filename)) i = 0 for edfname in edflist: edf = EdfFile.EdfFile(edfname, access='rb', fastedf = 0) nImages = edf.GetNumImages() #get always the last image data0 = edf.GetData(nImages-1) data0[data0<0] = 0 if i == 0: header = edf.GetHeader(0) data = data0.copy() else: data += data0 del edf i += 1 edfname = filename.replace('_000000_partial.edf',".edf") edfoutname = os.path.join(outputdir, edfname) if DEBUG: print("Dealing with output filename %s" % edfoutname) if os.path.exists(edfoutname): if DEBUG: print("Output file already exists, trying to delete it") os.remove(edfoutname) edfout = EdfFile.EdfFile(edfoutname, access="wb") edfout.WriteImage (header , data, Append=0) del edfout edfoutlist.append(edfoutname) if delete: for filename in edflist: try: os.remove(filename) except: print("Cannot delete file %s" % filename) #DAT IMAGES datoutlist = [] for filename in partialdatlist: edflist = self.getIndexedFileList(os.path.join(inputdir, filename)) first = True for edfname in edflist: f = open(edfname) lines = f.readlines() f.close() j = 1 while (not len( lines[-j].replace("\n",""))): j += 1 if first: first = False labels = lines[0].replace("\n","").split(" ") nlabels = len(labels) nrows = len(lines) - j data = numpy.zeros((nrows, nlabels), numpy.double) inputdata = numpy.zeros((nrows, nlabels), numpy.double) chisqIndex = labels.index('chisq') for i in range(nrows): inputdata[i, :] = [float(x) for x in lines[i+1].split()] if inputdata[i, chisqIndex] < 0.0: inputdata[i, chisqIndex] = 0.0 data += inputdata outfilename = os.path.join(outputdir, filename.replace("_000000_partial","")) if os.path.exists(outfilename): os.remove(outfilename) outfile=open(outfilename,'w+') outfile.write('%s' % lines[0]) line="" for row in range(nrows): #line = "%d" % inputdata[row, 0] for col in range(nlabels): if col == 0 : line += "%d" % inputdata[row, col] elif col == 1 : line += " %d" % inputdata[row, col] else: line += " %g" % data[row, col] line += "\n" outfile.write("%s" % line) line ="" outfile.write("\n") outfile.close() datoutlist.append(outfilename) if delete: for filename in edflist: os.remove(filename) #CONCENTRATIONS outconlist = [] for filename in partialconlist: edflist = self.getIndexedFileList(os.path.join(inputdir, filename)) i = 0 for edfname in edflist: edf = open(edfname, 'rb') if i == 0: outfilename = os.path.join(outputdir, filename.replace("_000000_partial","")) if os.path.exists(outfilename): os.remove(outfilename) outfile = open(outfilename,'wb') lines = edf.readlines() for line in lines: outfile.write(line) edf.close() i += 1 outfile.close() outconlist.append(outfilename) if delete: for filename in edflist: os.remove(filename) return edfoutlist, datoutlist, outconlist
[docs] def getIndexedFileList(self, filename, begin=None,end=None, skip = None, fileindex=0): 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 return filelist
if __name__ == "__main__": import sys if len(sys.argv) < 2: print("Usage:") print("python PyMcaBatchBuildOutput.py directory") sys.exit(0) directory = sys.argv[1] w = PyMcaBatchBuildOutput(directory) w.buildOutput() """ allfiles = os.listdir(directory) edflist = [] datlist = [] for filename in allfiles: if filename.endswith('000000_partial.edf'):edflist.append(filename) elif filename.endswith('000000_partial.dat'):datlist.append(filename) for filename in edflist: print w.getIndexedFileList(os.path.join(directory, filename)) """