#!/usr/bin/python # -*- coding: iso-8859-1 -*- # Un utilitaire pour transformer les données CCD PICARD en images fits # Frédéric Meynadier / Service d'Aéronomie, Mai 2008 VERSION='2.0' import pyfits import Tkinter from Tkconstants import END import numpy from optparse import OptionParser import datetime import time def raw2fits(InputFilename,headers,comments): OutputFilename = InputFilename.replace('.dat','.fits') print "Converting %s to %s" % (InputFilename, OutputFilename) NX = 2160 NY = 2053 # Ouverture de l'image en mode lecture binaire (windows) try: f= open(InputFilename,'rb') except IOError : print "Impossible d'ouvrir l'image" exit (1) # Creation de l'array d'entiers non signés + byteswap a = numpy.fromfile(file=f, dtype=numpy.uint16, count=-1) a.byteswap(True) f.close() # dispatch des parties du binaire + conversion en signed int gauche = numpy.cast[numpy.int16](a[NX*NY/2:NX*NY]-32768) droite = numpy.cast[numpy.int16](a[:NX*NY/2]-32768) observables = numpy.cast[numpy.int16](a[-5:-1]-32768) # Construction de l'image (flip de la partie droite) b=numpy.empty(NX,dtype=numpy.int16) gauche.resize(NY,NX/2) droite.resize(NY,NX/2) b = numpy.hstack((gauche,numpy.fliplr(droite))) # Creation de l'objet fits hdu = pyfits.PrimaryHDU(b) hdulist = pyfits.HDUList([hdu]) prihdr = hdulist[0].header prihdr.update('BSCALE',1,'scale') prihdr.update('BZERO',32768,'origin of the scale') prihdr.update('OBS1',observables[0],'Observable 1') prihdr.update('OBS2',observables[1],'Observable 2') prihdr.update('OBS3',observables[2],'Observable 3') prihdr.update('OBS4',observables[3],'Observable 4') prihdr.update('Conv','pyraw2fits','Logiciel de conversion utilise') prihdr.update('ConvVer',VERSION,'Version de raw2fits') for item in headers: prihdr.update(item['key'],item['value'],item['comment']) for item in comments: prihdr.add_comment(item) of = OutputFilename hdu.writeto(of,clobber=True) class simpleapp_tk(Tkinter.Tk): def __init__(self,parent): Tkinter.Tk.__init__(self,parent) self.parent = parent self.initialize() def initialize(self): self.grid() self.labelexptimeVariable = Tkinter.StringVar() self.labelexptimeVariable.set("Temps de pose (s) :") labelexptime = Tkinter.Label(self,textvariable=self.labelexptimeVariable, anchor="w") labelexptime.grid(column=0,columnspan=2,row=1) self.exptimeVariable = Tkinter.StringVar() self.exptime = Tkinter.Entry(self,textvariable=self.exptimeVariable) self.exptime.grid(column=0,columnspan=2,row=2,sticky='EW') self.exptimeVariable.set(u"") self.labelrf1Variable = Tkinter.StringVar() self.labelrf1Variable.set("RF1 :") labelrf1 = Tkinter.Label(self,textvariable=self.labelrf1Variable, anchor="w") labelrf1.grid(column=0,row=3) self.rf1 = Tkinter.Listbox(self,height=5,width=8,exportselection=0) self.rf1.pack() for item in ['trou', '535', '607', '215', '782']: self.rf1.insert(END,item) self.rf1.grid(column=0,row=4) self.labelrf2Variable = Tkinter.StringVar() self.labelrf2Variable.set("RF2 :") labelrf2 = Tkinter.Label(self,textvariable=self.labelrf2Variable, anchor="w") labelrf2.grid(column=1,row=3) self.rf2 = Tkinter.Listbox(self,height=5,width=8,exportselection=0) self.rf2.pack() for item in ['535h', 'trou', 'dioptre', 'lentille', '393']: self.rf2.insert(END,item) self.rf2.grid(column=1,row=4) self.labelcommentVariable = Tkinter.StringVar() self.labelcommentVariable.set("commentaire :") labelcomment = Tkinter.Label(self,textvariable=self.labelcommentVariable, anchor="w") labelcomment.grid(column=0,columnspan=2,row=5) self.commentVariable = Tkinter.StringVar() self.comment = Tkinter.Entry(self,textvariable=self.commentVariable) self.comment.grid(column=0,columnspan=2,row=6,sticky='EW') self.commentVariable.set(u"") self.labelnameVariable = Tkinter.StringVar() self.labelnameVariable.set("Nom du fichier :") label = Tkinter.Label(self,textvariable=self.labelnameVariable, anchor="w") label.grid(column=0,row=7,columnspan=2,sticky='EW') self.entryVariable = Tkinter.StringVar() self.entry = Tkinter.Entry(self,textvariable=self.entryVariable) self.entry.grid(column=0,columnspan=2,row=8,sticky='EW') self.entry.bind("", self.OnPressEnter) self.entryVariable.set(u"") button = Tkinter.Button(self, text="Convertir en fits", command=self.OnButtonClick) button.grid(column=0,columnspan=2,row=9) self.labelVariable = Tkinter.StringVar() label = Tkinter.Label(self,textvariable=self.labelVariable, anchor="w",fg="white",bg="blue") label.grid(column=0,row=10,columnspan=2,sticky='EW') self.labelVariable.set(u"") self.grid_columnconfigure(0,weight=1) self.resizable(True,False) self.update() self.geometry(self.geometry()) self.entry.focus_set() self.entry.selection_range(0, Tkinter.END) def CommonAction(self): rf1setting = self.rf1.get(self.rf1.curselection()[0]) rf2setting = self.rf2.get(self.rf2.curselection()[0]) exptime = self.exptimeVariable.get() if (exptime == ''): exptime = 0. InputFilename = self.entryVariable.get() print InputFilename OutputFilename = InputFilename.replace(".dat",".fits") self.labelVariable.set("Ecriture de " + OutputFilename) headers=[] headers.append({'key':'EXPTIME', 'value':float(exptime), 'comment':'Temps de pose'}) headers.append({'key':'RF1FILT', 'value':rf1setting, 'comment':'filtre roue 1'}) headers.append({'key':'RF2FILT', 'value':rf2setting, 'comment':'filtre roue 2'}) headers.append({'key':'CNVDATE', 'value':datetime.date.today().isoformat(), 'comment':'Date de la conversion fits'}) headers.append({'key':'CNVTIME', 'value':time.strftime("%H:%M:%S"), 'comment':'Heure de la conversion fits'}) comments=[] commentaire = self.commentVariable.get() if (commentaire != '') : comments.append(commentaire) raw2fits(InputFilename,headers,comments) def OnButtonClick(self): self.CommonAction() self.entry.focus_set() self.entry.selection_range(0, Tkinter.END) def OnPressEnter(self,event): self.CommonAction() self.entry.focus_set() self.entry.selection_range(0, Tkinter.END) if __name__ == "__main__": parser = OptionParser() parser.add_option("-n","--nogui",action="store_true", dest="nogui", default=False, help="command line only, no gui") (options, args) = parser.parse_args () if options.nogui: InputFilename=args[0] headers=[] comments=[] raw2fits(InputFilename,headers,comments) else: app = simpleapp_tk(None) app.title('raw2fits') app.mainloop()