int main(int argc, char * argv[]) { int i; char keyword[FITS_LINESZ+1]; char *value; // Usage if (argc<3) { printf("Usage: %s <filename> [ext] <key1> <key2> etc.\n", argv[0]); return 1 ; } // Check this is indeed a FITS file if (is_fits_file(argv[1])!=1) { printf("%s is not a FITS file\n", argv[1]); return -1 ; } // Extension header? if (atoi(argv[2])==0) { for (i=2;i<argc;i++) printf("%s ",qfits_query_hdr(argv[1], argv[i])); } else { for (i=3;i<argc;i++) printf("%s ",qfits_query_ext(argv[1], argv[i],atoi(argv[2]))); } printf("\n"); return 0 ; }
// 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.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")); img.mjd=0.0; return img; }
// Get reference transformation struct transformation reference(char *filename) { struct transformation t; t.mjd=atof(qfits_query_hdr(filename,"MJD-OBS")); t.ra0=atof(qfits_query_hdr(filename,"CRVAL1")); t.de0=atof(qfits_query_hdr(filename,"CRVAL2")); t.x0=atof(qfits_query_hdr(filename,"CRPIX1")); t.y0=atof(qfits_query_hdr(filename,"CRPIX2")); t.a[0]=0.0; t.a[1]=3600.0*atof(qfits_query_hdr(filename,"CD1_1")); t.a[2]=3600.0*atof(qfits_query_hdr(filename,"CD1_2")); t.b[0]=0.0; t.b[1]=3600.0*atof(qfits_query_hdr(filename,"CD2_1")); t.b[2]=3600.0*atof(qfits_query_hdr(filename,"CD2_2")); return t; }
/* ------------------------------------------------------------------------------------------------------ getCleanedHeaderValue: read FITS header and return striped CFStringRef value. ------------------------------------------------------------------------------------------------------ */ CFStringRef getCleanedHeaderValue(const char* filename, char* keyword) { char *headerValue = NULL; headerValue = qfits_query_hdr((const char*)filename, keyword); // printf("For keyword %s, headerValue is: %s\n", keyword, headerValue); if (headerValue != NULL) { CFStringRef cfvalue = CFStringCreateWithCString(kCFAllocatorDefault, headerValue, kCFStringEncodingUTF8); CFIndex length = CFStringGetLength(cfvalue); CFMutableStringRef cfmvalue = CFStringCreateMutable(kCFAllocatorDefault, length); CFStringAppend(cfmvalue, cfvalue); CFRelease(cfvalue); CFStringTrim(cfmvalue, CFSTR("'")); CFStringTrimWhitespace(cfmvalue); return cfmvalue; } else { return NULL; } }
// 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; }