Source code for PyMca5.PyMcaIO.LuciaMap
#!/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.
#
#############################################################################*/
from __future__ import with_statement
__author__ = "V.A. Sole - ESRF Data Analysis"
__contact__ = "sole@esrf.fr"
__license__ = "MIT"
__copyright__ = "European Synchrotron Radiation Facility, Grenoble, France"
import os
import sys
import re
import numpy
from PyMca5.PyMcaCore import DataObject
SOURCE_TYPE = "EdfFileStack"
[docs]class LuciaMap(DataObject.DataObject):
def __init__(self, filename, infofile=None):
DataObject.DataObject.__init__(self)
with open(filename, 'r') as f:
data = f.read()
data.replace("\r\n", "\n")
self.sourceName = [filename]
firstByte = data.index("\n\n")
header = data[0:firstByte]
#get rid of the date
data = data[firstByte:]
#leave only the '----' as separator
data.replace("\r", "")
data.replace("\n", "")
sep = '-'
while sep in data:
sep = sep + '-'
sep = sep[1:]
data = data.split(sep)
if len(data[0]) != len(data[-1]):
if len(data[0]) > 1:
del data[-1]
else:
del data[0]
#get the number of channels
exp = re.compile('(-?[0-9]+\.?[0-9]*)')
spectrum = [float(x) for x in exp.findall(data[0])]
self.nChannels = len(spectrum)
self.nSpectra = len(data)
self.nRows = self.nSpectra
#try to get the information
if infofile is None:
infofile = ""
split = filename.split('_')
if len(split) > 1:
for i in range(len(split) - 1):
if i == 0:
infofile = split[i]
else:
infofile += "_" + split[i]
infofile = infofile + "_Infos_" +\
split[-1].replace('.mca', '.dat')
if os.path.exists(infofile):
info = self._getInfo(infofile)
if ('vwidth' in info) and ('vstep' in info):
vwidth = info['vwidth']
vstep = info['vstep']
if abs(vstep) > 0:
self.nRows = int((vwidth / vstep) + 1)
#fill the header
self.header = header
#arrange as an EDF Stack
self.info = {}
self.__nFiles = 1
self.__nImagesPerFile = 1
#self.nRows = 41
self.nCols = self.nSpectra / self.nRows
self.data = numpy.zeros((self.nRows,
self.nCols,
self.nChannels),
numpy.float32)
n = 0
for i in range(self.nRows):
for j in range(self.nCols):
s = data[n]
spectrum = numpy.array([float(x) for x in exp.findall(s)])
self.data[i, j, :] = spectrum[:]
n = n + 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"] = 0
self.info["McaCalib"] = [0.0, 1.0, 0.0]
self.info["Channel0"] = 0.0
def _getInfo(self, filename):
'''
This dictionnary is to be internally normalized for the time
being no I0 nor dead time
'''
exp = re.compile('(-?[0-9]+\.?[0-9]*)')
#read the file in one go to minimize access to disk
with open(filename) as f:
data = f.readlines()
ddict = {}
for line in data:
if line.startswith("# Horizontal center position"):
ddict['center'] = [float(x) for x in exp.findall(line)][0]
elif line.startswith("# Horizontal width"):
ddict['hwidth'] = [float(x) for x in exp.findall(line)][0]
elif line.startswith("# Horizontal step"):
ddict['hstep'] = [float(x) for x in exp.findall(line)][0]
elif line.startswith("# Vertical width"):
ddict['vwidth'] = [float(x) for x in exp.findall(line)][0]
elif line.startswith("# Vertical step"):
ddict['vstep'] = [float(x) for x in exp.findall(line)][0]
return ddict
[docs]def main():
filename = None
if len(sys.argv) > 1:
filename = sys.argv[1]
elif os.path.exists("S10S_6_01.mca"):
filename = "S10S_6_01.mca"
if filename is not None:
w = LuciaMap(filename)
print(w.info)
else:
print("Please supply input filename")
if __name__ == "__main__":
main()