Below is a Python class that will read in a Varian FDF file, or a Varian “.img” directory (which contains the FDF files). I have used this in the past, but can’t make any claims about it. I offer it up in hopes it is useful to someone.
[cc lang="python"]
import os
import re
from numpy import *
import struct
class Varian:
def __init__(self):
pass
def read( self, filename ):
if filename.endswith(‘.fdf’):
data = self.readFDF( filename )
elif filename.endswith(‘.img’):
data = self.readIMG( filename )
else:
print “Unknown filename %s ” % (filename)
return data
def readFDF(self, filename ):
fp = open( filename, ‘rb’ )
xsize = -1
ysize = -1
zsize = 1
bigendian = -1
done = False
while not done :
line = fp.readline()
if( len( line ) >= 1 and line[0] == chr(12) ):
break
if( len( line ) >= 1 and line[0] != chr(12) ):
if( line.find(‘bigendian’) > 0 ):
endian = line.split(‘=’)[-1].rstrip(‘\n; ‘).strip(‘ ‘)
if( line.find(‘echos’) > 0 ):
nechoes = line.split(‘=’)[-1].rstrip(‘\n; ‘).strip(‘ ‘)
if( line.find(‘echo_no’) > 0 ):
echo_no = line.split(‘=’)[-1].rstrip(‘\n; ‘).strip(‘ ‘)
if( line.find(‘nslices’) > 0 ):
nslices = line.split(‘=’)[-1].rstrip(‘\n; ‘).strip(‘ ‘)
if( line.find(‘slice_no’) > 0 ):
sl = line.split(‘=’)[-1].rstrip(‘\n; ‘).strip(‘ ‘)
if( line.find(‘matrix’) > 0 ):
m = re.findall(‘(\d+)’, line.rstrip())
if len(m) == 2:
xsize, ysize = int(m[0]), int(m[1])
elif len(m) == 3:
xsize, ysize, zsize = int(m[0]), int(m[1]), int(m[2])
fp.seek(-xsize*ysize*zsize*4,2)
if bigendian == 1:
fmt = “>%df” % (xsize*ysize*zsize)
else:
fmt = “<%df” % (xsize*ysize*zsize)
data = struct.unpack(fmt, fp.read(xsize*ysize*zsize*4))
data = array( data ).reshape( [xsize, ysize, zsize ] ).squeeze()
fp.close()
return data
def readIMG(self, directory):
# Get a list of all the FDF files in the directory
try:
files = os.listdir(directory)
except:
print “Could not find the directory %s” % directory
return
files = [ file for file in files if file.endswith('.fdf') ]
data = []
for file in files:
data.append( self.readFDF( directory+’/'+file ) )
data = transpose( array( data ), (1,2,0) )
return data
[/cc]