Source code for pySAXS.LS.rap

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

"""
from numpy import *

[docs]class RAP: """ - Radial Average Parameters - beam_x : x beam position beam_y : y beam position roi_xmin, roi_ymin, roi_xmax, roi_ymax : #les points a masquer masks_list=[] : un tableau de roi geom_corr_x , geom_corr_y :correction geometrique 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): self.beam_x=1 self.beam_y=1 self.roi_xmin=1 self.roi_ymin=1 self.roi_xmax=1 self.roi_ymax=1 #les points a masquer # un tableau de roi self.masks_list=[] #correction geometrique self.geom_corr_x=1 self.geom_corr_y=1 self.wave_length=1.542 self.detector_to_sample=1 self.pixel_size=1 self.q_by_pixel=-1 self.exposition_time=1 self.backgd_by_s=0 #par seconde self.backgd_by_pix=0 #par pixel self.comment="" self.transmission=-1 self.thickness=-1 self.K=1 self.monitor=1 def __repr__(self): chaine="" t=[] for var,value in self.__dict__.items(): t.append(var) t.sort() for i in range(len(t)): chaine+=str(t[i])+" = "+str(self.__dict__[t[i]])+"\n" return chaine
[docs] def mask_add(self,polygon): "ajoute un masque dans la liste des masques" #mask=[xmin,ymin,xmax,ymax] self.masks_list.append(polygon)
[docs] def mask_remove(self,i): "retire de la liste des masques l'element i" self.masks_list.pop(i)
[docs] def mask_delete_all(self): "efface la liste des masques" self.masks_list=[]
[docs] def Set_BeamXY(self,x,y): self.beam_x=x self.beam_y=y
[docs] def Set_ROI(self,xmin,ymin,xmax,ymax): self.roi_xmin=xmin self.roi_ymin=ymin self.roi_xmax=xmax self.roi_ymax=ymax
[docs] def save_printable(self,file_name): #enregistre dans un fichier f=open(file_name,mode='w') chaine="" t=[] for var,value in self.__dict__.items(): t.append(var) t.sort() for i in range(len(t)): #chaine+=str(t[i])+" = "+str(self.__dict__[t[i]])+"\n" f.write(str(t[i])+" = "+str(self.__dict__[t[i]])+"\n") f.close() print file_name," saved"
[docs] def save(self,file_name): import pickle f=open(file_name,mode='w') pickle.dump(self,f)
[docs] def load(self,file_name): import pickle p=RAP() f=open(file_name,mode='r') p=pickle.load(f) return p
[docs] def calculate_q_by_pix(self): """ calculate q by pix in A-1 from parameters (RAP) """ self.q_by_pixel=calculate_q(1,self)
[docs]def calculate_q(q,par): """ calculate q in A-1 from parameters (RAP) """ return ((4*pi)/par.wave_length)*sin(arctan((par.pixel_size*q)/par.detector_to_sample)/2)
[docs]def Rad_Save(p,q,n,iq,filename): """ Save the averaged data in a rgr file wich can be opened by MS excel """ f=open(filename,'w') f.write("# fichier = \t%s\n" %(filename)) f.write("# zone regroupement : xmin=\t%s\t xmax=\t%s ymin=\t%s ymax=%s\n" % (p.roi_xmin,p.roi_xmax,p.roi_ymin,p.roi_ymax)) f.write("# centre regroupement : x=\t%s\t y=%s \t masques :%s\n" % (p.beam_x,p.beam_y,p.masks_list)) if p.backgd_by_s<>0: f.write("# taille pixel = \t%s \t Bruit fond= \t=$B$8*$G$4\t (par pixel) \t par seconde=\t%s\n" % (p.pixel_size,p.backgd_by_s)) else: f.write("# taille pixel =\t %s \t Bruit fond= \t%s \t (par pixel)\n" % (p.pixel_size,p.backgd_by_pix)) f.write("# distance ech detecteur =\t %s\n" % (p.detector_to_sample)) f.write("# lambda=\t %s\n" % (p.wave_length)) p.q_by_pixel=calculate_q(1,p) f.write("# q by pix =\t %s \t valeur excel : \t=((4*PI())/$B$6)*SIN(ATAN($B$4/$B$5)/2)\n" % (p.q_by_pixel)) f.write("# temps= \t%s\n" %(p.exposition_time)) delta_omega=(p.pixel_size/p.detector_to_sample)**2 f.write("# delta omega=\t=($B$4/$B$5)^2\t valeur calculee :\t%s\n"% (delta_omega)) f.write("# transmission= \t%s\n" % (p.transmission)) f.write("# epaisseur= \t %s\n" % (p.thickness)) f.write("# moniteur= \t %s \n" % (p.monitor)) flux=(p.monitor/p.transmission)*p.K f.write("# K = \t %s \t ->Flux \t=($B$12/$B$10)*$B$13 \t ph/s\t valeur calculee :\t%s\n" %(p.K,flux)) f.write("# qraw\t q \tq calc \t nombre de points \t I raw \t I (cm-1)\t I (cm-1)Excel\n") q=calculate_q(q,p) ligne = -1 for i in range(len(q)): if n[i] > 0: ligne = ligne + 1 icm=(iq[i]-p.backgd_by_pix)/(delta_omega*p.exposition_time*p.transmission*p.thickness*flux) f.write("%s\t%s\t=A%s*$D$7 \t %s \t %s \t %s \t=(E%s-$D$4)/$B$9/$B$8/$B$10/$B$11/$D$13\n"% (i,q[i],ligne+15,n[i],iq[i],icm,ligne + 15)) f.close()
[docs]def Rad_Read(filename): """ Open the averaged data from a rgr file return qraw,q,iraw,i,n """ f=open(filename,'r') lignes=f.readlines() #lecture de tout le fichier en une fois f.close qraw=[] q=[] iraw=[] i=[] n=[] for j in range(len(lignes)): if lignes[j][0]<>'#': datas=lignes[j].split('\t') qraw.append(int(datas[0])) q.append(float(datas[1])) n.append(float(datas[3])) iraw.append(float(datas[4])) i.append(float(datas[5])) #print qraw,q,iraw,i,n return qraw,q,n,iraw,i