int test_qfitsdata_load(char * filename) { qfitsloader ql ; int i ; int err ; float diff ; err=0 ; say("-----> Data loading test"); ql.filename = filename ; ql.xtnum = 0 ; ql.pnum = 0 ; ql.ptype = PTYPE_FLOAT ; ql.map = 1 ; say("Initializing loader"); if (qfitsloader_init(&ql)!=0) { fail("cannot initialize loader on test file"); return 1 ; } if (ql.lx != 11) { fail("wrong size in X"); err++ ; } if (ql.ly != 10) { fail("wrong size in Y"); err++ ; } say("Loading pixel buffer"); if (qfits_loadpix(&ql)!=0) { fail("cannot load data from test file"); return 1 ; } for (i=0 ; i<(11*10) ; i++) { diff = ql.fbuf[i] - (float)i * 0.2 ; if (diff>1e-4) { fail("diff in pix value"); err++ ; } } qfits_free(ql.fbuf); return err ; }
// Read fits image struct image read_fits(char *filename) { int i,j,k,l,m; qfitsloader ql; char key[FITS_LINESZ+1]; char val[FITS_LINESZ+1]; struct image img; // Copy filename strcpy(img.filename,filename); // Image size img.naxis1=atoi(qfits_query_hdr(filename,"NAXIS1")); img.naxis2=atoi(qfits_query_hdr(filename,"NAXIS2")); img.naxis3=atoi(qfits_query_hdr(filename,"NAXIS3")); // MJD img.mjd=(double) atof(qfits_query_hdr(filename,"MJD-OBS")); strcpy(img.nfd,qfits_query_hdr(filename,"DATE-OBS")); // COSPAR ID img.cospar=atoi(qfits_query_hdr(filename,"COSPAR")); // Transformation img.mjd=atof(qfits_query_hdr(filename,"MJD-OBS")); img.ra0=atof(qfits_query_hdr(filename,"CRVAL1")); img.de0=atof(qfits_query_hdr(filename,"CRVAL2")); img.x0=atof(qfits_query_hdr(filename,"CRPIX1")); img.y0=atof(qfits_query_hdr(filename,"CRPIX2")); img.a[0]=0.0; img.a[1]=3600.0*atof(qfits_query_hdr(filename,"CD1_1")); img.a[2]=3600.0*atof(qfits_query_hdr(filename,"CD1_2")); img.b[0]=0.0; img.b[1]=3600.0*atof(qfits_query_hdr(filename,"CD2_1")); img.b[2]=3600.0*atof(qfits_query_hdr(filename,"CD2_2")); img.xrms=3600.0*atof(qfits_query_hdr(filename,"CRRES1")); img.yrms=3600.0*atof(qfits_query_hdr(filename,"CRRES2")); img.exptime=atof(qfits_query_hdr(filename,"EXPTIME")); img.nframes=atoi(qfits_query_hdr(filename,"NFRAMES")); // Timestamps img.dt=(float *) malloc(sizeof(float)*img.nframes); for (i=0;i<img.nframes;i++) { sprintf(key,"DT%04d",i); strcpy(val,qfits_query_hdr(filename,key)); sscanf(val+1,"%f",&img.dt[i]); // img.dt[i]=atof(qfits_query_hdr(filename,key)); } // Allocate image memory img.zavg=(float *) malloc(sizeof(float)*img.naxis1*img.naxis2); img.zstd=(float *) malloc(sizeof(float)*img.naxis1*img.naxis2); img.zmax=(float *) malloc(sizeof(float)*img.naxis1*img.naxis2); img.znum=(float *) malloc(sizeof(float)*img.naxis1*img.naxis2); if (img.naxis3==5) img.ztrk=(float *) malloc(sizeof(float)*img.naxis1*img.naxis2); // Set parameters ql.xtnum=0; ql.ptype=PTYPE_FLOAT; ql.filename=filename; // Loop over planes for (k=0;k<img.naxis3;k++) { ql.pnum=k; // Initialize load if (qfitsloader_init(&ql) != 0) printf("Error initializing data loading\n"); // Test load if (qfits_loadpix(&ql) != 0) printf("Error loading actual data\n"); // Fill z array for (i=0,l=0;i<img.naxis1;i++) { for (j=0;j<img.naxis2;j++) { if (k==1) img.zstd[l]=ql.fbuf[l]; if (k==2) img.zmax[l]=ql.fbuf[l]; if (k==3) img.znum[l]=ql.fbuf[l]; if (img.naxis3==5) { if (k==0) img.ztrk[l]=ql.fbuf[l]; if (k==4) img.zavg[l]=ql.fbuf[l]; } else { if (k==0) img.zavg[l]=ql.fbuf[l]; } l++; } } } return img; }
// Add FITS keywords void add_fits_keywords(struct transformation t,char *filename) { int i,j,k,l,m; int naxis1,naxis2,naxis3; qfits_header *qh; qfitsdumper qd; qfitsloader ql; char key[FITS_LINESZ+1]; char val[FITS_LINESZ+1]; char com[FITS_LINESZ+1]; char lin[FITS_LINESZ+1]; FILE *file; float *fbuf; naxis1=atoi(qfits_query_hdr(filename,"NAXIS1")); naxis2=atoi(qfits_query_hdr(filename,"NAXIS2")); naxis3=atoi(qfits_query_hdr(filename,"NAXIS3")); fbuf=malloc(sizeof(float)*naxis1*naxis2*naxis3); // Read header qh=qfits_header_read(filename); ql.xtnum=0; ql.ptype=PTYPE_FLOAT; ql.filename=filename; for (k=0,l=0;k<naxis3;k++) { ql.pnum=k; // Initialize load if (qfitsloader_init(&ql) != 0) printf("Error initializing data loading\n"); // Test load if (qfits_loadpix(&ql) != 0) printf("Error loading actual data\n"); for (i=0,m=0;i<naxis1;i++) { for (j=0;j<naxis2;j++) { fbuf[l]=ql.fbuf[m]; l++; m++; } } } qfits_header_add_after(qh,"MJD-OBS","CUNIT2","'deg'"," ",NULL); qfits_header_add_after(qh,"MJD-OBS","CUNIT1","'deg'"," ",NULL); qfits_header_add_after(qh,"MJD-OBS","CTYPE2","'DEC--TAN'"," ",NULL); qfits_header_add_after(qh,"MJD-OBS","CTYPE1","'RA---TAN'"," ",NULL); sprintf(val,"%e",t.b[2]/3600.0); qfits_header_add_after(qh,"MJD-OBS","CD2_2",val," ",NULL); sprintf(val,"%e",t.b[1]/3600.0); qfits_header_add_after(qh,"MJD-OBS","CD2_1",val," ",NULL); sprintf(val,"%e",t.a[2]/3600.0); qfits_header_add_after(qh,"MJD-OBS","CD1_2",val," ",NULL); sprintf(val,"%e",t.a[1]/3600.0); qfits_header_add_after(qh,"MJD-OBS","CD1_1",val," ",NULL); sprintf(val,"%f",t.de0); qfits_header_add_after(qh,"MJD-OBS","CRVAL2",val," ",NULL); sprintf(val,"%f",t.ra0); qfits_header_add_after(qh,"MJD-OBS","CRVAL1",val," ",NULL); sprintf(val,"%f",t.y0); qfits_header_add_after(qh,"MJD-OBS","CRPIX2",val," ",NULL); sprintf(val,"%f",t.x0); qfits_header_add_after(qh,"MJD-OBS","CRPIX1",val," ",NULL); file=fopen(filename,"w"); qfits_header_dump(qh,file); fclose(file); qfits_header_destroy(qh); qd.filename=filename; qd.npix=naxis1*naxis2*naxis3; qd.ptype=PTYPE_FLOAT; qd.fbuf=fbuf; qd.out_ptype=-32; qfits_pixdump(&qd); free(fbuf); return; }
// Read fits image struct image read_fits(char *filename) { int i,j,k,l,m; qfitsloader ql; char key[FITS_LINESZ+1]; char val[FITS_LINESZ+1]; struct image img; // Image size img.naxis=atoi(qfits_query_hdr(filename,"NAXIS")); img.naxis1=atoi(qfits_query_hdr(filename,"NAXIS1")); img.naxis2=atoi(qfits_query_hdr(filename,"NAXIS2")); // MJD img.mjd=(double) atof(qfits_query_hdr(filename,"MJD-OBS")); // Set parameters ql.xtnum=0; ql.ptype=PTYPE_FLOAT; ql.filename=filename; if (img.naxis==3) { // Number of frames img.nframes=atoi(qfits_query_hdr(filename,"NFRAMES")); // Timestamps img.dt=(float *) malloc(sizeof(float)*img.nframes); for (i=0;i<img.nframes;i++) { sprintf(key,"DT%04d",i); strcpy(val,qfits_query_hdr(filename,key)); sscanf(val+1,"%f",&img.dt[i]); // img.dt[i]=atof(qfits_query_hdr(filename,key)); } // Allocate image memory img.zavg=(float *) malloc(sizeof(float)*img.naxis1*img.naxis2); img.zstd=(float *) malloc(sizeof(float)*img.naxis1*img.naxis2); img.zmax=(float *) malloc(sizeof(float)*img.naxis1*img.naxis2); img.znum=(float *) malloc(sizeof(float)*img.naxis1*img.naxis2); // Loop over planes for (k=0;k<4;k++) { ql.pnum=k;; // Initialize load if (qfitsloader_init(&ql) != 0) printf("Error initializing data loading\n"); // Test load if (qfits_loadpix(&ql) != 0) printf("Error loading actual data\n"); // Fill z array for (i=0,l=0;i<img.naxis1;i++) { for (j=0;j<img.naxis2;j++) { if (k==0) img.zavg[l]=ql.fbuf[l]; if (k==1) img.zstd[l]=ql.fbuf[l]; if (k==2) img.zmax[l]=ql.fbuf[l]; if (k==3) img.znum[l]=ql.fbuf[l]; l++; } } } } else { // Allocate image memory img.zavg=(float *) malloc(sizeof(float)*img.naxis1*img.naxis2); ql.pnum=0; // Initialize load if (qfitsloader_init(&ql) != 0) printf("Error initializing data loading\n"); // Test load if (qfits_loadpix(&ql) != 0) printf("Error loading actual data\n"); // Fill z array for (i=0,l=0;i<img.naxis1;i++) { for (j=0;j<img.naxis2;j++) { img.zavg[l]=ql.fbuf[l]; l++; } } } return img; }