Source code for pySAXS.LS.SAXSparametersOLD

"""
project : pySAXS
description : class for radial average parameters
authors : Olivier Tache
Last changes :
Replaced by SAXSparameterXML
08-03-2007 OT : port to pySAXS library

"""
from numpy import *

[docs]class SAXSparametersOLD: """ - Radial Average Parameters - wave_length=1.542 detector_to_sample=1 pixel_size=1 q_by_pixel=-1 exposition_time=1 backgd_by_s=0 #par seconde backgd_by_pix=0 #par pixel comment="" transmission=-1 thickness=-1 K=1 monitor=1 """ def __init__(self,printout=None): self.paramDesc={}#list containing description, order for form, function if calculated by others values, type if special (files) self.parameters={} self.parameters['filename']="param.par" self.paramDesc['filename']=["Filename",1,None,'file'] self.parameters['wavelength']=1.542 self.paramDesc['wavelength']=["Wavelength (A)",2,None,None] self.parameters['D']=1.0 self.paramDesc['D']=["Detector to sample distance (cm)",3,None,None] self.parameters['pixel size']=1.0 self.paramDesc['pixel size']=["Pixel size (cm)",4,None,None] self.parameters['q by pixel']=-1.0 self.paramDesc['q by pixel']=["q by pixel (-1 if not used)",5,None,None] self.parameters['time']=1.0 self.paramDesc['time']=["Exposition time (s)",6,None,None] self.parameters['backgd by s']=0.0 #par seconde self.paramDesc['backgd by s']=["Background by second",7,None,None] self.parameters['backgd by pix']=0.0 #par pixel self.paramDesc['backgd by pix']=["Background by pixel",8,None,None] self.parameters['backgd']=0.0 #par pixel self.paramDesc['backgd']=["Total background (B by pixel + B by s * time)",9,self.calculBack,None] self.parameters['comment']="comment" self.paramDesc['comment']=["Comment",10,None,None] self.parameters['Incident Flux']=-1.0 self.paramDesc['Incident Flux']=["Incident Flux",11,None,None] self.parameters['Transmitted Flux']=-1.0 self.paramDesc['Transmitted Flux']=["Transmitted Flux",12,None,None] self.parameters['transmission']=-1.0 self.paramDesc['transmission']=["Transmission",13,self.calculTransm,None] self.parameters['thickness']=-1.0 self.paramDesc['thickness']=["Thickness",14,None,None] self.parameters['DeltaOmega']=1.0 self.paramDesc['DeltaOmega']=["Delta Omega", 15,self.calculDeltaOmega,None] self.parameters['K']=1.0 self.paramDesc['K']=["K constant",16,None,None] self.parameters['flux']=1.0 self.paramDesc['flux']=["Total Flux = Incident Flux * K (ph/s)",17,self.calculTotalFlux,None] self.printout=printout #self.parameters['monitor']=1 def __repr__(self): chaine="" for var in self.parameters: chaine+=str(var)+" = "+str(self.parameters[var])+"\n" return chaine
[docs] def printTXT(self,txt="",par=""): if self.printout==None: print(str(txt)+str(par)) else: self.printout(txt,par)
[docs] def order(self): ''' return a list with dictionnary key ordered ''' l={} for name in self.parameters: l[self.paramDesc[name][1]]=name list_ordered=[] for ord in l: list_ordered.append(l[ord]) return list_ordered
[docs] def calculate_All(self): ''' calculate all the function defined in paramsDesc ''' for name in self.paramDesc: if self.paramDesc[name][2]<>None: val=self.paramDesc[name][2]()
[docs] def save_printable(self,file_name): #enregistre dans un fichier f=open(file_name,mode='w') f.write(self.__repr__()) f.close() print file_name," saved"
[docs] def save(self,file_name): import pickle f=open(file_name,mode='w') pickle.dump(self.parameters,f) f.close()
[docs] def load(self,file_name): import pickle f=open(file_name,mode='r') par=pickle.load(f) for name in par: if self.parameters.has_key(name): self.parameters[name]=type(self.parameters[name])(par[name]) else: self.parameters[name]=par[name] f.close()
[docs] def calculate_q_by_pix(self): """ calculate q by pix in A-1 from parameters (RAP) """ self.parameters['q by pixel']=calculate_q(1,self)
[docs] def calculate_q(self,n): """ calculate q in A-1 from parameters n : pixel number ---------------------------------- q=(4*pi/lambda)*sin(theta/2) with tan(theta)=d/D D : sample detector distance d : pixel number (n) * pixel size """ if self.parameters['q by pixel']<=0: self.printTXT('q=(4*pi/lambda)*sin(theta/2) with tan(theta)=d/D D : sample detector distance d : pixel number (n) * pixel size') return ((4*pi)/float(self.parameters['wavelength']))*sin(arctan((float(self.parameters['pixel size'])*n)/float(self.parameters['D']))/2) else: return n*float(self.parameters['q by pixel'])
[docs] def calculTransm(self): ''' calculate Transmission ''' self.parameters['transmission']=self.parameters['Transmitted Flux']/self.parameters['Incident Flux'] return self.parameters['transmission']
[docs] def calculDeltaOmega(self): ''' calculate DeltaOmega ''' #--deltaomega #print "DeltaOmega=(pixel size / distance sample detector)^2" self.parameters['DeltaOmega']=(float(self.parameters['pixel size']) / float(self.parameters['D']))**2 return self.parameters['DeltaOmega']
[docs] def calculTotalFlux(self): ''' calculate Flux ''' self.parameters['flux'] = float(self.parameters['Incident Flux'])*float(self.parameters['K']) return self.parameters['flux']
[docs] def calculBack(self): ''' calculate background ''' self.parameters['backgd']=float(self.parameters['backgd by pix'])+float(self.parameters['backgd by s'])*float(self.parameters['time']) return self.parameters['backgd']
[docs] def calculate_i(self,n,b=None,deviation=None,bdeviation=None): """ Calculate i in cm-1 from parameters n : raw intensity b : empty cell to substract deviation : absolute deviation for i bdeviation : absolute deviation for background ----------------------------------- DeltaOmega=(pixel size / distance sample detector)^2 Flux = (monitor/transmission)*K Intensity=(n-background)/(time * DeltaOmega * Transmission * Thickness * Flux) if empty cell (b) then Final Intensity=( Intensity(with Thickness=1) - empty cell)/thickness """ self.printTXT("---- setting absolute scale ----") #--deltaomega self.printTXT("DeltaOmega=(pixel size / distance sample detector)^2") self.printTXT('Delta Omega is : ',self.parameters['DeltaOmega']) #-- flux self.printTXT( "Flux is : (cps/s) ", self.parameters['flux']) #-- background self.printTXT( "background is", self.parameters['backgd']) if deviation!=None: newdeviation=deviation #-- I if b==None: self.printTXT( "Intensity=(n-background)/(time * DeltaOmega * Transmission * Thickness * Flux)") i=(n-self.parameters['backgd'])/(float(self.parameters['time'])*self.parameters['DeltaOmega']*float(self.parameters['transmission'])*float(self.parameters['thickness'])*float(self.parameters['flux'])) if deviation!=None: self.printTXT( "Calculating deviation") newdeviation=deviation/(float(self.parameters['time'])*self.parameters['DeltaOmega']*float(self.parameters['transmission'])*float(self.parameters['thickness'])*float(self.parameters['flux'])) else: self.printTXT( "Intensity=(n-background)/(time * DeltaOmega * Transmission * Flux)") i=(n-self.parameters['backgd'])/(float(self.parameters['time'])*self.parameters['DeltaOmega']*float(self.parameters['transmission'])*float(self.parameters['flux'])) self.printTXT( "Final Intensity=( Intensity - empty cell)/thickness") i=(i-b)/float(self.parameters['thickness']) if (bdeviation!=None) and (deviation!=None): newdeviation=deviation/(float(self.parameters['time'])*self.parameters['DeltaOmega']*float(self.parameters['transmission'])*float(self.parameters['thickness'])*float(self.parameters['flux'])) newdeviation=(newdeviation-bdeviation)/float(self.parameters['thickness']) else: self.printTXT( "background deviation is not specified, impossible to manage deviation ") deviation=None self.printTXT( "---- intensity scaled for "+str(len(n))," datas ----") if deviation!=None: return i,newdeviation else: return i