#/*##########################################################################
#
# 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 sys
import os
import numpy
from PyMca5.PyMcaIO import SpecFileAbstractClass
DEBUG = 0
[docs]class BufferedFile(object):
def __init__(self, filename):
f = open(filename, 'r')
self.__buffer = f.read()
f.close()
self.__buffer = self.__buffer.replace("\r", "\n")
self.__buffer = self.__buffer.replace("\n\n", "\n")
self.__buffer = self.__buffer.split("\n")
self.__currentLine = 0
[docs] def readline(self):
if self.__currentLine >= len(self.__buffer):
return ""
line = self.__buffer[self.__currentLine]
self.__currentLine += 1
return line
[docs] def close(self):
self.__buffer = [""]
self.__currentLine = 0
return
[docs]class BAXSCSVFileParser(object):
def __init__(self, filename):
if not os.path.exists(filename):
raise IOError("File %s does not exists" % filename)
_fileObject = BufferedFile(filename)
#Only one measurement per file
header = []
ddict = {}
line = _fileObject.readline()
if not (line.startswith("Bruker AXS") or \
(("KTI" in line) and ("Spectrum" in line))):
raise IOError("This does look as a Bruker AXS Handheld CSV file")
while not line.startswith("Channel#"):
header.append(line)
line = _fileObject.readline()
header.append(line)
line = _fileObject.readline()
line = line.replace('"',"")
splitLine = line.split(",")
data = []
while(len(splitLine)):
if len(splitLine[0]):
try:
data.append([float(x) for x in splitLine if len(x) > 0])
except ValueError:
break
else:
break
line = _fileObject.readline()
line = line.replace('"',"")
splitLine = line.split(",")
_fileObject.close()
dataColumnNames = [x for x in header[-1].split(",") if len(x) > 0]
data = numpy.array(data, dtype=numpy.float)
#print(header)
#print(data)
labels=[]
#create an abstract scan object
self._scan = [BAXSCSVScan(data,
scantype='MCA',
scanheader=header,
#labels=labels,
#motor_values=self.motorValues,
point=False)]
def __getitem__(self, item):
return self._scan[item]
[docs] def scanno(self):
"""
Gives back the number of scans in the file
"""
return len(self_scan)
[docs] def list(self):
return "1:1"
[docs] def select(self, key):
"""
key is of the from s.o
scan number, scan order
"""
n = key.split(".")
return self.__getitem__(int(n[0])-1)
[docs] def allmotors(self):
if DEBUG:
print("BAXCSVFileParser allmotors called")
return []
[docs]class BAXSCSVScan(SpecFileAbstractClass.SpecFileAbstractScan):
def __init__(self, data, scantype='MCA',
identification="1.1", scanheader=None, labels=None,
motor_values=None, point=False):
SpecFileAbstractClass.SpecFileAbstractScan.__init__(self,
data, scantype=scantype, identification=identification,
scanheader=scanheader, labels=labels, point=point)
self._data = data
[docs] def nbmca(self):
return 1
# it gives the last column (some files have three columns)
# corresponding to channels, counts and (probably) corrected counts
# this seems to be confirmed by the fact the Live Time is 0.0 in those
# files
if number <= 0:
raise IndexError("Mca numbering starts at 1")
elif number > self.nbmca():
raise IndexError("Only %d MCA's" % number)
return self._data[:, -1]
[docs]def isBAXSCSVFile(filename):
f = open(filename, 'r')
try:
line = f.readline()
except:
f.close()
return False
try:
if filename.lower().endswith(".csv"):
if line.startswith("Bruker AXS") or \
(("KTI" in line) and ("Spectrum" in line)):
return True
except:
pass
return False
[docs]def test(filename):
if isBAXSCSVFile(filename):
sf=BAXSCSVFileParser(filename)
else:
print("Not a Bruker AXS File")
print(sf[0].header('S'))
print(sf[0].header('D'))
print(sf[0].alllabels())
#print(sf[0].allmotorsvalues())
print(sf[0].nbmca())
print(sf[0].mca(1))
if __name__ == "__main__":
test(sys.argv[1])