#include #include #include #include #include #include struct image { int nx,ny; char timestamp[64]; unsigned char *c; }; struct fourframe { int nx,ny,nt,nlayer; char timestamp[64],observer[64]; double mjd; float *z,*dt; int cospar,type; }; int fgetline(FILE *file,char *s,int lim); void write_fits(char *filename,struct fourframe ff); struct image read_pgm(char *filename,int *status); double nfd2mjd(char *date); double date2mjd(int year,int month,double day); void write_pgm(char *filename,struct fourframe ff); void mjd2date(double mjd,char *date); void usage(void) { printf("pgm2fits p:w:h:s:n:Dd:x:y:c:o:gm:t:r:I\n\n"); printf("-p image prefix\n"); printf("-w image width in pixels\n"); printf("-h image height in pixels\n"); printf("-s number of first image to process\n"); printf("-n number of images to process\n"); printf("-D toggle for creating dark frame\n"); printf("-d toggle for creating dark frame\n"); printf("-d filename of dark frame to substract\n"); printf("-m filename of mask frame to apply\n"); printf("-x tracking rate in x (pix/s)\n"); printf("-y tracking rate in y (pix/s)\n"); printf("-c COSPAR [default 4553]\n"); printf("-o observer [default \"Cees Bassa\"]\n"); printf("-g toggle for guiding??\n"); printf("-t time stamp of first image [YYYY-MM-DDTHH:MM:SS.SSS]\n"); printf("-r frame rate (frames/s)\n"); printf("-I integer output\n"); exit(0); } int main(int argc,char *argv[]) { int i,j,k,l,m,k0=1,status,nt,darkout=0,darkin=0,track=0,maskin=0; int n,n0,di,dj,npix; struct image *img,drk,msk; struct fourframe ff; char filename[128],nfd[64]; float s1,s2,z; float avg,std,max,cnt,*trk; int *wt; int arg=0; char *path,*darkfile,*maskfile; double mjd,mjd0=0.0; float dxdn=0.0,dydn=0.0,dx,dy; int guide=0,timereset=0; float framerate=25.0; char *env; // Set defaults env=getenv("ST_COSPAR"); ff.cospar=atoi(env); strcpy(ff.observer,"Cees Bassa"); ff.type=0; // Decode options if (argc>1) { while ((arg=getopt(argc,argv,"p:w:h:s:n:Dd:x:y:c:o:gm:t:r:I"))!=-1) { switch(arg) { case 'p': path=optarg; break; case 'g': guide=1; break; case 'w': ff.nx=atoi(optarg); break; case 'h': ff.ny=atoi(optarg); break; case 'I': ff.type=1; break; case 'c': ff.cospar=atoi(optarg); break; case 'o': strcpy(ff.observer,optarg); break; case 's': k0=atoi(optarg); break; case 'n': nt=atoi(optarg); break; case 'D': darkout=1; break; case 'd': darkin=1; darkfile=optarg; break; case 'm': maskin=1; maskfile=optarg; break; case 'x': dxdn=atof(optarg); track=1; break; case 'y': dydn=atof(optarg); track=1; break; case 't': strcpy(nfd,optarg); mjd0=nfd2mjd(nfd); timereset=1; break; case 'r': framerate=atof(optarg); timereset=1; break; default: usage(); } } } else { usage(); } // Add layer if (track==1) ff.nlayer=5; else ff.nlayer=4; // Allocate ff.z=(float *) malloc(ff.nlayer*sizeof(float)*ff.nx*ff.ny); ff.dt=(float *) malloc(sizeof(float)*nt); trk=(float *) malloc(sizeof(float)*ff.nx*ff.ny); wt=(int *) malloc(sizeof(float)*ff.nx*ff.ny); img=(struct image *) malloc(sizeof(struct image)*nt); // Read dark file if (darkin==1) drk=read_pgm(darkfile,&status); // Read mask file if (maskin==1) msk=read_pgm(maskfile,&status); // Loop over files for (k=0,l=0;kmax) { max=z; cnt=(float) k; } } s1-=max; s2-=max*max; avg=s1/(float) (ff.nt-1); std=sqrt((s2-s1*avg)/(float) (ff.nt-2)); // Reset masked pixels if (maskin==1 && msk.c[n]==0.0) { avg=0.0; std=0.0; max=0.0; cnt=128.0; } for (m=0;m0 && i+di0 && j+dj0) ff.z[l]=trk[k]/(float) wt[k]; else ff.z[l]=trk[k]; } } } // Write fits if (ff.timestamp!=NULL) sprintf(filename,"%s.fits",ff.timestamp); else strcpy(filename,"test.fits"); write_fits(filename,ff); // Write dark frame if (darkout==1) write_pgm("dark.pgm",ff); // Free for (k=0;k0 && (c=fgetc(file))!=EOF && c!='\n') s[i++]=c; // if (c=='\n') // s[i++]=c; s[i]='\0'; return i; } // Write fits file void write_fits(char *filename,struct fourframe ff) { int i,j,k,l; float *fbuf; int *ibuf; qfitsdumper qd; qfits_header *qh; char key[FITS_LINESZ+1] ; char val[FITS_LINESZ+1] ; char com[FITS_LINESZ+1] ; char lin[FITS_LINESZ+1] ; FILE *file; // Create FITS header qh=qfits_header_default(); // Add stuff if (ff.type==1) qfits_header_add(qh,"BITPIX","8"," ",NULL); else qfits_header_add(qh,"BITPIX","-32"," ",NULL); qfits_header_add(qh,"NAXIS","3"," ",NULL); sprintf(val,"%i",ff.nx); qfits_header_add(qh,"NAXIS1",val," ",NULL); sprintf(val,"%i",ff.ny); qfits_header_add(qh,"NAXIS2",val," ",NULL); sprintf(val,"%i",ff.nlayer); qfits_header_add(qh,"NAXIS3",val," ",NULL); qfits_header_add(qh,"BSCALE","1.0"," ",NULL); qfits_header_add(qh,"BZERO","0.0"," ",NULL); qfits_header_add(qh,"DATAMAX","255.0"," ",NULL); qfits_header_add(qh,"DATAMIN","0.0"," ",NULL); sprintf(val,"%s",ff.timestamp); qfits_header_add(qh,"DATE-OBS",val," ",NULL); // MJD-OBS sprintf(val,"%lf",ff.mjd); qfits_header_add(qh,"MJD-OBS",val," ",NULL); sprintf(val,"%f",ff.dt[ff.nt-1]-ff.dt[0]); qfits_header_add(qh,"EXPTIME",val," ",NULL); sprintf(val,"%d",ff.nt); qfits_header_add(qh,"NFRAMES",val," ",NULL); // Astrometry keywors sprintf(val,"%f",ff.nx/2.0); qfits_header_add(qh,"CRPIX1",val," ",NULL); sprintf(val,"%f",ff.ny/2.0); qfits_header_add(qh,"CRPIX2",val," ",NULL); qfits_header_add(qh,"CRVAL1","0.0"," ",NULL); qfits_header_add(qh,"CRVAL2","0.0"," ",NULL); qfits_header_add(qh,"CD1_1","0.0"," ",NULL); qfits_header_add(qh,"CD1_2","0.0"," ",NULL); qfits_header_add(qh,"CD2_1","0.0"," ",NULL); qfits_header_add(qh,"CD2_2","0.0"," ",NULL); qfits_header_add(qh,"CTYPE1","'RA---TAN'"," ",NULL); qfits_header_add(qh,"CTYPE2","'DEC--TAN'"," ",NULL); qfits_header_add(qh,"CUNIT1","'deg'"," ",NULL); qfits_header_add(qh,"CUNIT2","'deg'"," ",NULL); qfits_header_add(qh,"CRRES1","0.0"," ",NULL); qfits_header_add(qh,"CRRES2","0.0"," ",NULL); qfits_header_add(qh,"EQUINOX","2000.0"," ",NULL); qfits_header_add(qh,"RADECSYS","ICRS"," ",NULL); sprintf(val,"%d",ff.cospar); qfits_header_add(qh,"COSPAR",val," ",NULL); sprintf(val,"'%s'",ff.observer); qfits_header_add(qh,"OBSERVER",val," ",NULL); // Add timestamps for (k=0;k=0;j--) { for (k=0;k2) year=c-4716; else year=c-4715; day=(int) floor(dday); x=24.0*(dday-day); x=3600.*fabs(x); sec=fmod(x,60.); x=(x-sec)/60.; min=fmod(x,60.); x=(x-min)/60.; hour=x; sprintf(date,"%04d-%02d-%02dT%02d:%02d:%06.3f",year,month,day,hour,min,sec); return; }