Source code for jldesmear.jl_api.fileio_inp

#!/usr/bin/env python

'''fileio support for .inp file: traditional command-line input format'''

import os
import sys
import extrapolation
import fileio
import info
import toolbox


[docs]class CommandInput(fileio.FileIO): ''' command input file format This file format was created to pipe the inputs directly to the interactive command-line FORTRAN program. There were two benefits: #. desmearing parameters were documented in a file #. the answer to each question was automatically provided contents:: SMR_filename (absolute path or relative to directory of .inp file) DSM_filename slitlength extrapolation_method sFinal number_iterations feedback_method .. index:: QRS The file names (SMR and DSM) are given as either absolute or relative to the directory of the *.inp* file. The data are stored in three-column ASCII, with whitespace separators with the columns *Q I dI*. Individual data points may be commented out by placing a ``#`` character at the start of that line of text. This format is known to some as *QRS*. The *slitlength* and *sFinal* are given as floating point numbers in the same units as :math:`q`. It is expected that ``sFinal < qMax`` by at least a few data points. Example ``test1.inp`` file:: test1.smr test1.dsm 0.08 linear 0.08 20 fast ''' description = 'command input' extensions = ['*.inp', ]
[docs] def read(self, filename): ''' read desmearing parameters from a command input file :param str filename: full path to the command input file :returns: instance of :class:`jldesmear.api.info.Info` ''' def get_buf_item(key, item=0): return buf[key].split()[item] ext = '.inp' if not filename.endswith(ext): return None if not os.path.exists(filename): return None self.info = info.Info() # read a .inp file self.info.parameterfile = filename path = os.path.dirname(filename) owd = os.getcwd() os.chdir(path) buf = open(os.path.abspath(filename), 'r').readlines() if len(buf) < 7: msg = "not enough information in command input file: " + filename raise RuntimeError, msg functions = extrapolation.discover_extrapolations() self.info.fileio_class = self self.info.filename = filename self.info.quiet = True self.info.callback = None self.info.infile = os.path.abspath(os.path.join(path, get_buf_item(0))) self.info.outfile = os.path.abspath(os.path.join(path, get_buf_item(1))) self.info.slitlength = float(get_buf_item(2)) self.info.extrapname = get_buf_item(3) self.info.sFinal = float(get_buf_item(4)) self.info.NumItr = int(get_buf_item(5)) self.info.LakeWeighting = get_buf_item(6) self.info.extrap = functions[self.info.extrapname] os.chdir(owd) return self.info
[docs] def save(self, filename): ''' write desmearing parameters to a command input file ''' path = os.path.abspath(os.path.dirname(filename)) owd = os.getcwd() os.chdir(path) f = open(filename, 'w') if path == os.path.dirname(self.info.infile): fn = os.path.split(self.info.infile)[1] else: fn = self.info.infile f.write(fn + '\n') if path == os.path.dirname(self.info.outfile): fn = os.path.split(self.info.outfile)[1] else: fn = self.info.outfile f.write(fn + '\n') f.write(str(self.info.slitlength) + '\n') f.write(self.info.extrapname + '\n') f.write(str(self.info.sFinal) + '\n') f.write(str(self.info.NumItr) + '\n') f.write(self.info.LakeWeighting + '\n') f.close() os.chdir(owd)
[docs] def read_SMR(self, filename = None): '''Open a file with 3-column smeared SAS data''' #path = os.path.abspath(os.path.dirname(filename)) #owd = os.getcwd() #os.chdir(path) filename = filename or self.info.infile if not os.path.exists(filename): return #os.chdir(owd) q, E, dE = toolbox.GetDat(filename) if (len(q) == 0): raise Exception, "no data points!" if (self.info.sFinal > q[-1]): raise RuntimeWarning, "Fit range out of data range" return q, E, dE
[docs] def save_DSM(self, filename, dsm): '''Save the desmeared data to a 3-column ASCII file''' toolbox.SavDat(filename, dsm.q, dsm.C, dsm.dC)
# class AnyFile(FileIO): # # description = 'any file' # extensions = ['*.*', ] # # # TODO: this should not read any files # # Rather, files read by this class should be checked # # to see if they can be read by another support. def main(): ext = '.inp' fn = toolbox.GetTest1DataFilename(ext) cmdInp = CommandInput() parms = cmdInp.read(fn) print str(parms) cmdInp.save('junk.inp') q, E, dE = cmdInp.read_SMR() print q.size, q.min(), q.max() if __name__ == "__main__": main()