The following piece of code parses .fio files. The graphics is produced in a widget (9.6) or a png file.
#!/usr/bin/env python
”'
this module reads and plots fio files. It can be invoked from
- the command line, blocking mode
$ fioPlotter.py -f fileName.fio
- the command line, to create png files
$ fioPlotter.py -p -f fileName.fio
- ipython and python scripts, non-blocking mode
import fioPlotter as fp
a = fp.fioPlotter("<fileName>")
a.plot()
”'
from optparse import OptionParser
import math, sys
import matplotlib
flagStandalone = False
class fioPlotter:
def __init__(self, fileName, flagPng):
self.comments = []
self.user_comments = []
self.parameters = []
self.dataSets = []
self.fileName = fileName
self.flagPng = flagPng
self._read( fileName)
#
# /home/p12user/dirName/gen_00001.fio -> gen_00001
#
self.scanName = fileName.split("/")[-1].split(".")[0]
#
# enable the desired display mode: avoid show()
# but update the plot only at the end
#
if not flagStandalone:
plt.ion()
self.fig = plt.figure( 1, figsize = (11.6, 8.2))
self.fig.canvas.flush_events()
#plt.pause( 1.0)
#plt.draw()
else:
self.fig = plt.figure( 1, figsize = (11.6, 8.2))
return
def clear( self):
”'
clears the figure widget
”'
self.fig.clear()
self.fig.canvas.flush_events()
#plt.pause( 1.0)
#plt.draw()
def plot( self):
”'
plots the contents of a fio file
”'
length = len(self.dataSets)
col = math.ceil(math.sqrt(length))
row = math.ceil( length/col)
plt.figtext( 0.5, 0.95, self.scanName, va='center', ha = 'center')
for i in range( 0, length):
plt.subplot( col, row, i + 1)
plt.title( self.dataSets[i].deviceName, fontsize = 10,
x = 0.95, y = 0.85, ha='right', va='top')
plt.plot( self.dataSets[i].x, self.dataSets[i].y, "b", linewidth = 1)
#
# we want the blocking mode, if the script is called from the command line
#
if self.flagPng:
self.fig.savefig( self.scanName + '.png')
elif flagStandalone:
plt.show()
else:
self.fig.canvas.flush_events()
#plt.pause( 1.0)
#plt.draw()
def _read( self, name):
”'
!
! user comments
!
%c
comments
%p
parameterName = parameterValue
%d
Col 1 AU_ALO_14_0001 FLOAT
Col 2 AU_ALO_14_0001 FLOAT
Col 3 AU_ALO_14_0001_RING FLOAT
data data data etc.
”'
print( "reading", name)
try:
inp = open( name, 'r')
except IOError as e:
print( "Failed to open {0}, {1}".format( name, e.strerror) )
sys.exit(255)
lines = inp.readlines()
inp.close()
flagComment = 0
flagParameter = 0
flagData = 0
for line in lines:
line = line.strip()
if line.find( "!") == 0:
self.user_comments.append( line)
flagComment = False
flagParameter = False
flagData = False
elif line.find( "%c") == 0:
flagComment = True
flagParameter = False
flagData = False
continue
elif line.find( "%p") == 0:
flagComment = False
flagParameter = True
flagData = False
continue
elif line.find( "%d") == 0:
flagComment = False
flagParameter = False
flagData = True
continue
#
if flagComment:
self.comments.append( line)
#
# parName = parValue
#
if flagParameter:
lst = line.split( "=")
self.parameters.append( {lst[0]: lst[1]})
if not flagData:
continue
lst = line.split()
if lst[0] == "Col":
#
# the 'Col 1 ...' description does not create a
# new FIO_dataset because it contains the x-axis for all
#
if lst[1] == "1":
pass
else:
self.dataSets.append( fioDataset( lst[2]))
else:
for i in range(1, len( self.dataSets)):
self.dataSets[i-1].x.append( lst[0])
self.dataSets[i-1].y.append( lst[i])
class fioDataset:
”'
the class represents a column of a FIO file. The first column is the
x-axis which is used by all columns, name_in, e.g. test_00001_C1
”'
def __init__(self, name_in):
self.name = name_in
lst = self.name.split('_')
if len(lst) > 1:
self.deviceName = lst[-1]
if self.deviceName.find( "0") == 0:
self.deviceName = "ScanName"
else:
self.deviceName = "n.n."
self.x = []
self.y = []
return
if __name__ == '__main__':
flagStandalone = True
usage = "usage: %prog <-p> fileName.fio "
parser = OptionParser(usage=usage)
parser.add_option( "-f", action="store", type="string",
dest="fileName", help="name of the .fio file")
parser.add_option( "-p", action="store_true", dest="flagPng",
default = False, help="create png file")
(options, args) = parser.parse_args()
if options.fileName is None:
parser.print_help()
sys.exit(255)
if options.flagPng:
matplotlib.use( 'TkAgg')
import matplotlib.pyplot as plt
a = fioPlotter( options.fileName, options.flagPng)
a.plot()
else:
import matplotlib.pyplot as plt