Source code for pySAXS.tools.fileimage

"""
project : pySAXS
description : functions for opening detectors data file
authors : Olivier Tache
Last changes :
    08-03-2007 OT : port to pySAXS library
    lsqkjdqlskdjlqksd

"""
from numpy import *
from pySAXS.LS import rap
from pySAXS.tools.filetools import *


# FICHIERS D'IMAGE DETECTEUR-------------------------------------------------------------------#
[docs]def OpenFileMP(fname,progressbar=None): """ open gas detector MP file FASTCOM format """ begin=clock() print "Open MPA File : "+fname f=open(fname,"rb") #Trouve la taille de l'entete #recherche le 2eme octet 26 tailleHeader=0 n_octet_temps=0 octet_date_debut=0 octet_date_fin=0 octet_temps_debut=0 octet_temps_fin=0 trouve=0 octet=0 while trouve<2: #lecture tailleHeader=tailleHeader+1 f.seek(tailleHeader) octet=f.read(1) #print str(tailleHeader)+" : "+str(octet)+ " -> "+str(ord(octet))+ " -> "+str(hex(ord(octet))) if ord(octet)==10: if n_octet_temps==3: octet_date_debut=tailleHeader if n_octet_temps==4: octet_date_fin=tailleHeader f.seek(octet_date_debut+1) temps=f.read(octet_date_fin-octet_date_debut-2) print "DATE = "+str(temps) if n_octet_temps==10: octet_temps_debut=tailleHeader if n_octet_temps==11: octet_temps_fin=tailleHeader f.seek(octet_temps_debut+1) temps=f.read(octet_temps_fin-octet_temps_debut-2) print "TEMPS = "+str(temps) n_octet_temps=n_octet_temps+1 if ord(octet)==26: trouve=trouve+1 #print "Taille Header = "+str(tailleHeader) # fin lecture entete #f.close() #utilisation d'un tableau image=zeros([512,512]) Image_Size=range(0,512) Image_test=range(0,512) max=0 Taille_Ligne=512 Char_TypeLong='L' Taille_TypeLong=4 Header=tailleHeader+1 #for y in Image_Size: if progressbar<>None: progressbar.initialize(512) for x in Image_Size: if progressbar<>None: progressbar.progress(x) f.seek(Header+x*Taille_TypeLong*Taille_Ligne) ligne_hexa=f.read(Taille_TypeLong*Taille_Ligne) ligne=unpack(Char_TypeLong*Taille_Ligne,ligne_hexa) ligne_tab=asarray(ligne) image[x]=ligne_tab if progressbar<>None: progressbar.progress(512) #image=asarray(image) f.close print "readed in %s s" % (clock()-begin) return image #------------------ FIN -------------------
[docs]def OpenFileMPA3_DAT(fname,progressbar=None): """ open gas detector MP3 file Binary datas FASTCOM format """ begin=clock() print "Open MPA-3 DAT binary File : "+fname f=open(fname,"rb") #Trouve la taille de l'entete #la taille de l'image doit etre 512x512 #utilisation d'un tableau image=zeros([512,512]) Image_Size=range(0,512) Image_test=range(0,512) max=0 Taille_Ligne=512 Char_TypeLong='L' Taille_TypeLong=4 Header=0 #for y in Image_Size: if progressbar<>None: progressbar.initialize(512) for x in Image_Size: if progressbar<>None: progressbar.progress(x) f.seek(Header+x*Taille_TypeLong*Taille_Ligne) ligne_hexa=f.read(Taille_TypeLong*Taille_Ligne) ligne=unpack(Char_TypeLong*Taille_Ligne,ligne_hexa) ligne_tab=asarray(ligne) image[x]=ligne_tab if progressbar<>None: progressbar.progress(512) #image=asarray(image) f.close print "readed in %s s" % (clock()-begin) return image #------------------ FIN -------------------
[docs]def OpenFileMPA3(fname,progressbar=None): """ open gas detector MP3 file ascii files FASTCOM format """ begin=clock() print "Open MPA-3 File : "+fname f=open(fname,"r") #Trouve la taille de l'entete #recherche le 2eme octet 26 tailleHeader=0 n_octet_temps=0 octet_date_debut=0 octet_date_fin=0 octet_temps_debut=0 octet_temps_fin=0 trouve=0 octet=0 while trouve<2: #lecture tailleHeader=tailleHeader+1 ligne=f.readline() #print ligne #print str(tailleHeader)+" : "+str(octet)+ " -> "+str(ord(octet))+ " -> "+str(hex(ord(octet))) #if ligne.find("ltpreset")<>-1: # print ligne if ligne.find("[CDAT0")<>-1: print ligne trouve=2 #print "Taille Header = "+str(tailleHeader) # fin lecture entete #f.close() #utilisation d'un tableau image=zeros([512,512]) Image_Size=range(0,512) #Image_test=range(0,512) #max=0 #Taille_Ligne=512 #Char_TypeLong='L' #Taille_TypeLong=4 #Header=tailleHeader+1 # if progressbar<>None: progressbar.initialize(512) for x in Image_Size: if progressbar<>None: progressbar.progress(x) for y in Image_Size: pixel=f.readline() image[x,y]=int(pixel) #f.seek(Header+x*Taille_TypeLong*Taille_Ligne) #ligne_hexa=f.read(Taille_TypeLong*Taille_Ligne) #ligne=unpack(Char_TypeLong*Taille_Ligne,ligne_hexa) # ligne_tab=asarray(ligne) # image[x]=ligne_tab #if progressbar<>None: # progressbar.progress(512) #image=asarray(image) f.close print "readed in %s s" % (clock()-begin) return image #------------------ FIN -------------------
[docs]def OpenFileSPE(fname,progressbar=None): """ open SPE Winview data file Ropper Scientific """ begin=clock() print "Open SPE File : "+fname f=open(fname,"rb") # HEADER -> INFOS SUR LES TAILLES # x_dim f.seek(42) temp=f.read(2) temp=unpack('h',temp) x_dim=temp[0] print "taille x :",x_dim # y_dim f.seek(656) temp=f.read(2) temp=unpack('h',temp) y_dim=temp[0] print "taille y :",y_dim # datatype f.seek(108) temp=f.read(2) temp=unpack('h',temp) Datatype=temp[0] #0 = FLOATING POINT #1 = LONG INTEGER #2 = INTEGER #3 = UNSIGNED INTEGER if Datatype==0: # float Char_Datatype="f" Taille_Datatype=4 elif Datatype==1: # long Char_Datatype="L" Taille_Datatype=4 elif Datatype==2: # integer Char_Datatype="h" Taille_Datatype=2 elif Datatype==3: # unsigned int Char_Datatype="H" Taille_Datatype=2 else: print "Data type error !" return print "DataType=",Datatype #print "Number of frames : ",ReadAndPrint(f,'l',1446) #print "Header version :",ReadAndPrint(f,'f',1992) #print "Winview :",ReadAndPrint(f,'L',2996) #print "Number of accum : ",ReadAndPrint(f,'l',668) #print "Number of of scans (Early WinX):",ReadAndPrint(f,'l',664) imge=array(zeros([y_dim,x_dim]),typecode=Float) #print "taille imge : %s x %s",%(shape(imge)[0],shape(imge)[1]) X_Size=range(0,y_dim) #Taille_Ligne=512 Header=4100 if progressbar<>None: progressbar.initialize(y_dim) for i in X_Size: if progressbar<>None: progressbar.progress(i) f.seek(Header+i*Taille_Datatype*x_dim) ligne_hexa=f.read(Taille_Datatype*x_dim) ligne=unpack(Char_Datatype*x_dim,ligne_hexa) ligne_tab=asarray(ligne) #print "taille ligne_tab :",ligne_tab.getshape() imge[i]=asarray(ligne) if progressbar<>None: progressbar.progress=y_dim #image=asarray(image) f.close print "\nreaded in %s s" % (clock()-begin) return imge #------------------ FIN -------------------
[docs]def WriteFileSPE(fname,data,progressbar=None): """ write SPE Winview data file Ropper Scientific """ begin=clock() print "Write SPE File : "+fname f=open(fname,"w+b") # HEADER -> INFOS SUR LES TAILLES data=transpose(data) x_dim=shape(data)[1] y_dim=shape(data)[0] vide=pack('b',0) #caractere vide f.write(vide*42) f.write(pack('h',x_dim))#42 x-dim f.write(vide*(108-44))#pos 44 #-> pos 108 f.write(pack('h',0))#108 0 = FLOATING POINT f.write(vide*(656-110)) f.write(pack('h',y_dim))#656 y dimension of raw data. f.write(vide*(664-658)) f.write(pack('l',-1))#664 Number of scans (Early WinX) f.write(pack('l',0))#668 Number of Accumulations f.write(vide*(1446-672)) f.write(pack('L',1))#1446 num frames f.write(vide*(1992-1450)) f.write(pack('f',2.1))#1992 HEADER VERSION f.write(vide*(2996-1996)) f.write(pack('L',19088743))#2996 == 0x01234567L if file created by WinX f.write(vide*(4100-3000)) #The data follows the header beginning at offset 4100 if progressbar<>None: progressbar.initialize(x_dim) for x in range(x_dim): if progressbar<>None: progressbar.progress(x) chaine="" for y in range(y_dim): chaine+=pack('f',data[y,x]) #chaine=pack('f'*y_dim,data[x]) f.write(chaine) f.close if progressbar<>None: progressbar.progress(x_dim) print "saved in %s s" % (clock()-begin) #------------------ FIN -------------------
[docs]def OpenFile(filename,progressbar=None): """ ouvre le fichier image filename et retourne un tableau """ #est-ce que le fichier existe ? print filename if not(FileReadOK(filename)): #le fichier n'existe pas ou pas lisible print "File not found" return else: #quelle est l'extension ? ext=extension(filename) if ext=="dat": return OpenFileMPA3_DAT(filename,progressbar) elif ext=="spe": return OpenFileSPE(filename,progressbar) elif ext=="gel": return OpenFileGEL(filename,progressbar) elif ext=="mpa": return OpenFileMPA3(filename,progressbar) else: print "not yet implemented" return
[docs]def OpenFileGEL(fname,progressbar=None): """ open GEL ImageQuant data file Molecular Dynamics """ class TifTag: def __init__(self): self.id=0#integer self.type=0#integer self.count=0# As Long self.offset=0# As Long def ReadEntry(self,f): #temp=f.read(calcsize,'i') self.id=unpack('h',f.read(calcsize('h')))[0]#integer self.type=unpack('h',f.read(calcsize('h')))[0]#integer self.count=unpack('i',f.read(calcsize('i')))[0]#integer self.offset=unpack('i',f.read(calcsize('i')))[0]#integer GelFrac=1./21025. #4.75624256837E-05 '(1/21025) #print "GelFrac %s"%(GelFrac) begin=clock() print "Open GEL File : "+fname f=open(fname,"rb") endian=unpack('H',f.read(calcsize('H')))[0]#integer #print endian if endian == 18761: codage = 'LITTLE' elif endian == 19789: codage = 'BIG' else: print "Erreur, sans doute pas TIFF " #sortie #identifiant TIFF*/ temp=unpack('h',f.read(calcsize('h')))[0]#short 'fread(&temp,sizeof(short),(size_t)1,gel); #print "identifiant tiff :",temp #/*----------- position de l'entete*/ #Get #f, , offset 'fread(&offset,sizeof(long),(size_t)1,gel); offset=unpack('L',f.read(calcsize('L')))[0] #print "offset=",offset #'/*on se place au debut de l'entete*/ f.seek(offset)# 'Seek #f, 'fseek(gel,offset,SEEK_SET); NBentry=unpack('H',f.read(calcsize('H')))[0]#short NBentry 'fread(&nbentry,sizeof(short),1,gel); #print "nombre d'entree : " ,NBentry for i in range(NBentry): tag=TifTag() tag.ReadEntry(f) #print tag.id if tag.id==256: x_size = tag.offset print "largeur de l'image : ",x_size elif tag.id==257: y_size = tag.offset print "hauteur de l'image : " ,y_size elif tag.id==273: data_offset = tag.offset print "data offset : ",data_offset #'----------------------------------------------- #'fin de la lecture de l'entete imge=array(zeros([y_size,x_size]),typecode=Float) f.seek(data_offset) if progressbar<>None: progressbar.initialize(y_size) for i in range(y_size): if progressbar<>None: progressbar.progress(i) #f.seek(Header+i*Taille_Datatype*x_dim) #les donnees sont sur 2 octets type="h" #short ? ligne_hexa=f.read(calcsize(type)*x_size) ligne=unpack(type*x_size,ligne_hexa) ligne_tab=asarray(ligne) imge[i]=(ligne_tab**2)*GelFrac if progressbar<>None: progressbar.progress(y_size) #imge*= #imge=(imge**2)*GelFrac #imge*=GelFrac #imge=transpose(imge) print "\nreaded in %s s" % (clock()-begin) return imge #data(X, y) = (data(X, y) ^ 2) * GelFrac #--------------fin
[docs]def ConvertToSpe(filenameIn,filenameOut,progressbar=None): """ convert a data file into SPE file """ ext=extension(filenameIn) if (ext=="dat") or (ext=="mpa"): img=OpenFile(filenameIn,progressbar) WriteFileSPE(filenameOut,img,progressbar) elif ext=="gel": img=OpenFile(filenameIn,progressbar) img=transpose(img) #transpose ! WriteFileSPE(filenameOut,img,progressbar) else: print "not yet implemented"
[docs]def OpenFileTIF(fname,progressbar=None): """ open tiff data file """ class TifTag: def __init__(self): self.id=0#integer self.type=0#integer self.count=0# As Long self.offset=0# As Long def ReadEntry(self,f): #temp=f.read(calcsize,'i') self.id=unpack('h',f.read(calcsize('h')))[0]#integer self.type=unpack('h',f.read(calcsize('h')))[0]#integer self.count=unpack('i',f.read(calcsize('i')))[0]#integer self.offset=unpack('i',f.read(calcsize('i')))[0]#integer GelFrac=1./21025. #4.75624256837E-05 '(1/21025) #print "GelFrac %s"%(GelFrac) begin=clock() print "Open GEL File : "+fname f=open(fname,"rb") endian=unpack('H',f.read(calcsize('H')))[0]#integer #print endian if endian == 18761: codage = 'LITTLE' elif endian == 19789: codage = 'BIG' else: print "Erreur, sans doute pas TIFF " #sortie #identifiant TIFF*/ temp=unpack('h',f.read(calcsize('h')))[0]#short 'fread(&temp,sizeof(short),(size_t)1,gel); #print "identifiant tiff :",temp #/*----------- position de l'entete*/ #Get #f, , offset 'fread(&offset,sizeof(long),(size_t)1,gel); offset=unpack('L',f.read(calcsize('L')))[0] #print "offset=",offset #'/*on se place au debut de l'entete*/ f.seek(offset)# 'Seek #f, 'fseek(gel,offset,SEEK_SET); NBentry=unpack('H',f.read(calcsize('H')))[0]#short NBentry 'fread(&nbentry,sizeof(short),1,gel); #print "nombre d'entree : " ,NBentry for i in range(NBentry): tag=TifTag() tag.ReadEntry(f) #print tag.id if tag.id==256: x_size = tag.offset print "largeur de l'image : ",x_size elif tag.id==257: y_size = tag.offset print "hauteur de l'image : " ,y_size elif tag.id==273: data_offset = tag.offset print "data offset : ",data_offset elif tag.id==258: bbp=tag.offset print "bit par pixel : ",bbp elif tag.id==259: if tag.offset!=1: print "erreur : image comprime\n" #'----------------------------------------------- #'fin de la lecture de l'entete imge=array(zeros([y_size,x_size]),typecode=Float) f.seek(data_offset) if progressbar<>None: progressbar.initialize(y_size) for i in range(y_size): if progressbar<>None: progressbar.progress(i) #f.seek(Header+i*Taille_Datatype*x_dim) #les donnees sont sur 2 octets type="s" #short ? #ligne_hexa=f.read(calcsize(type)*x_size) ligne_hexa=f.read(bbp*x_size) print "ligne hexa : "+str(len(ligne_hexa)) print "longueur :" +str(len(type*len(ligne_hexa))) ligne=unpack(s,ligne_hexa[0]) ligne_tab=asarray(ligne) imge[i]=ligne_tab if progressbar<>None: progressbar.progress(y_size) #imge*= #imge=(imge**2)*GelFrac #imge*=GelFrac #imge=transpose(imge) print "\nreaded in %s s" % (clock()-begin) return imge #data(X, y) = (data(X, y) ^ 2) * GelFrac #--------------fin
[docs]def importFit2D(filename=""): """ import Fit2D Chi file after radial averaging create a rgr file for excel (ascii format) """ p=rap.RAP() p.K=151000 p.detector_to_sample=120.25 p.pixel_size=0.005 if filename=="" : filename=raw_input("Fit2d filename ?") data=importArray(filename,5,' ') n=ones((len(data[0]))) filenameoutput=filename+".rgr" rap.Rad_Save(p,data[0],n,data[1],filenameoutput) #the end