int test_qfits_filecreate_ext(char * filename) { qfits_header* qh ; qfitsdumper qd ; FILE * out ; const char * sig ; say("-----> File with multiple extensions"); /* Create minimal FITS header for main */ say("Creating default header"); qh = qfits_header_default() ; if (qh==NULL) { fail("cannot create default header"); return 1 ; } qfits_header_add(qh, "BITPIX", "8", "no data in main section", NULL); qfits_header_add(qh, "NAXIS", "0", "no data in main section", NULL); qfits_header_add(qh, "EXTEND", "T", "Extensions are present", NULL); say("Dumping header to test file"); out = fopen(filename, "w"); if (out==NULL) { fail("cannot create test file"); qfits_header_destroy(qh); return 1 ; } qfits_header_dump(qh, out); fclose(out); qfits_header_destroy(qh); say("Creating first extension with float pixels"); qh = qfits_header_new(); if (qh==NULL) { fail("cannot create extension header 1"); return 1 ; } qfits_header_append(qh, "XTENSION", "T", "Ext 1", NULL); qfits_header_append(qh, "BITPIX", "-32", "bpp", NULL); qfits_header_append(qh, "NAXIS", "2", "axes", NULL); qfits_header_append(qh, "NAXIS1", "6", "size in x", NULL); qfits_header_append(qh, "NAXIS2", "2", "size in y", NULL); qfits_header_append(qh, "END", NULL, NULL, NULL); say("Dumping ext header 1 to test file"); out = fopen(filename, "a"); if (out==NULL) { fail("cannot append to test file"); qfits_header_destroy(qh); return 1 ; } qfits_header_dump(qh, out); fclose(out); qfits_header_destroy(qh); say("Dumping float array"); qd.filename = filename ; qd.npix = 12 ; qd.ptype = PTYPE_FLOAT ; qd.out_ptype = -32 ; qd.fbuf = float_array_orig ; if (qfits_pixdump(&qd)!=0) { fail("cannot save data to test file"); qfits_free(qd.fbuf); return 1 ; } /* Zero-pad the output file */ qfits_zeropad(filename); say("Creating second extension with int pixels"); qh = qfits_header_new(); if (qh==NULL) { fail("cannot create extension header 1"); return 1 ; } qfits_header_append(qh, "XTENSION", "T", "Ext 1", NULL); qfits_header_append(qh, "BITPIX", "32", "bpp", NULL); qfits_header_append(qh, "NAXIS", "2", "axes", NULL); qfits_header_append(qh, "NAXIS1", "6", "size in x", NULL); qfits_header_append(qh, "NAXIS2", "2", "size in y", NULL); qfits_header_append(qh, "END", NULL, NULL, NULL); say("Dumping ext header 2 to test file"); out = fopen(filename, "a"); if (out==NULL) { fail("cannot append to test file"); qfits_header_destroy(qh); return 1 ; } qfits_header_dump(qh, out); fclose(out); qfits_header_destroy(qh); say("Dumping int array"); qd.filename = filename ; qd.npix = 12 ; qd.ptype = PTYPE_INT ; qd.out_ptype = 32 ; qd.ibuf = int_array_orig ; if (qfits_pixdump(&qd)!=0) { fail("cannot save data to test file"); qfits_free(qd.fbuf); return 1 ; } /* Zero-pad the output file */ qfits_zeropad(filename); say("Creating third extension with double pixels"); qh = qfits_header_new(); if (qh==NULL) { fail("cannot create extension header 3"); return 1 ; } qfits_header_append(qh, "XTENSION", "T", "Ext 1", NULL); qfits_header_append(qh, "BITPIX", "-64", "bpp", NULL); qfits_header_append(qh, "NAXIS", "2", "axes", NULL); qfits_header_append(qh, "NAXIS1", "6", "size in x", NULL); qfits_header_append(qh, "NAXIS2", "2", "size in y", NULL); qfits_header_append(qh, "END", NULL, NULL, NULL); say("Dumping ext header 3 to test file"); out = fopen(filename, "a"); if (out==NULL) { fail("cannot append to test file"); qfits_header_destroy(qh); return 1 ; } qfits_header_dump(qh, out); fclose(out); qfits_header_destroy(qh); say("Dumping double array"); qd.filename = filename ; qd.npix = 12 ; qd.ptype = PTYPE_DOUBLE ; qd.out_ptype = -64 ; qd.dbuf = double_array_orig ; if (qfits_pixdump(&qd)!=0) { fail("cannot save data to test file"); qfits_free(qd.fbuf); return 1 ; } /* Zero-pad the output file */ qfits_zeropad(filename); /* Get MD5 for the test file */ sig = qfits_datamd5(filename); if (strcmp(sig, REFSIG)) { fail("test file signature does not match"); return 1 ; } say("File DATAMD5 signature is Ok"); return 0 ; }
// 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; }
int test_qfits_filecreate(char * filename) { qfits_header * qh ; FILE * out ; qfitsdumper qd ; int i ; say("-----> Header creation"); say("Creating blank header"); qh = qfits_header_new(); if (qh==NULL) { fail("qfits_header_new() failed"); return 1 ; } say("Destroying blank header"); /* Destroy header now */ qfits_header_destroy(qh); /* Create minimal header (SIMPLE/END) */ say("Creating minimal header"); qh = qfits_header_default(); if (qh==NULL) { fail("qfits_header_default() failed"); return 1 ; } say("Inserting primary keywords"); /* Insert XTENSION marker */ qfits_header_add(qh, "EXTEND", "T", "xtension might be present", NULL); /* Insert a string */ qfits_header_add(qh, "KEY01", "value01", "comment 01", NULL); /* Insert an int */ qfits_header_add(qh, "KEY02", "2", "comment 02", NULL); /* Insert a double */ qfits_header_add(qh, "KEY03", "3.0", "comment 03", NULL); /* Insert a complex */ qfits_header_add(qh, "KEY04", "4.0 4.2", "comment 04", NULL); /* Insert a boolean */ qfits_header_add(qh, "KEY05", "T", "comment 05", NULL); say("Inserting history keywords"); /* Insert HISTORY keys */ qfits_header_add(qh, "HISTORY", "1 history field", NULL, NULL); qfits_header_add(qh, "HISTORY", "2 history field", NULL, NULL); qfits_header_add(qh, "HISTORY", "3 history field", NULL, NULL); qfits_header_add(qh, "HISTORY", "4 history field", NULL, NULL); say("Inserting comment keywords"); /* Insert COMMENT keys */ qfits_header_add(qh, "COMMENT", "1 comment field", NULL, NULL); qfits_header_add(qh, "COMMENT", "2 comment field", NULL, NULL); qfits_header_add(qh, "COMMENT", "3 comment field", NULL, NULL); qfits_header_add(qh, "COMMENT", "4 comment field", NULL, NULL); say("Inserting hierarch keywords"); /* Insert HIERARCH ESO keys in reverse DICB order */ qfits_header_add(qh, "HIERARCH ESO NULL A", "0.0", "not DICB", NULL); qfits_header_add(qh, "HIERARCH ESO NULL B", "0.0", "not DICB", NULL); qfits_header_add(qh, "HIERARCH ESO NULL C", "0.0", "not DICB", NULL); qfits_header_add(qh, "PRO.A", "0.0", "DICB compliant", NULL); qfits_header_add(qh, "PRO.B", "0.0", "DICB compliant", NULL); qfits_header_add(qh, "PRO.C", "0.0", "DICB compliant", NULL); qfits_header_add(qh, "HIERARCH ESO LOG A", "0.0", "DICB compliant", NULL); qfits_header_add(qh, "HIERARCH ESO LOG B", "0.0", "DICB compliant", NULL); qfits_header_add(qh, "HIERARCH ESO LOG C", "0.0", "DICB compliant", NULL); qfits_header_add(qh, "INS.A", "0.0", "DICB compliant", NULL); qfits_header_add(qh, "INS.B", "0.0", "DICB compliant", NULL); qfits_header_add(qh, "INS.C", "0.0", "DICB compliant", NULL); qfits_header_add(qh, "HIERARCH ESO TEL A", "0.0", "DICB compliant", NULL); qfits_header_add(qh, "HIERARCH ESO TEL B", "0.0", "DICB compliant", NULL); qfits_header_add(qh, "HIERARCH ESO TEL C", "0.0", "DICB compliant", NULL); qfits_header_add(qh, "GEN.A", "0.0", "DICB compliant", NULL); qfits_header_add(qh, "GEN.B", "0.0", "DICB compliant", NULL); qfits_header_add(qh, "GEN.C", "0.0", "DICB compliant", NULL); qfits_header_add(qh, "HIERARCH ESO TPL A", "0.0", "DICB compliant", NULL); qfits_header_add(qh, "HIERARCH ESO TPL B", "0.0", "DICB compliant", NULL); qfits_header_add(qh, "HIERARCH ESO TPL C", "0.0", "DICB compliant", NULL); qfits_header_add(qh, "OBS.A", "0.0", "DICB compliant", NULL); qfits_header_add(qh, "OBS.B", "0.0", "DICB compliant", NULL); qfits_header_add(qh, "OBS.C", "0.0", "DICB compliant", NULL); say("Inserting mandatory keywords"); /* Insert mandatory keys in reverse order */ qfits_header_add(qh, "NAXIS2", "10", "NAXIS2 comment", NULL); qfits_header_add(qh, "NAXIS1", "11", "NAXIS1 comment", NULL); qfits_header_add(qh, "NAXIS", "2", "NAXIS comment", NULL); qfits_header_add(qh, "BITPIX", "-32", "BITPIX comment", NULL); /* Dump header to file */ say("Opening file for output"); out = fopen(filename, "w"); if (out==NULL) { fail("cannot create test file"); qfits_header_destroy(qh); return 1 ; } say("Dumping header to file"); if (qfits_header_dump(qh, out)!=0) { fail("cannot dump header"); qfits_header_destroy(qh); return 1 ; } say("Destroying built header"); qfits_header_destroy(qh); fclose(out); say("-----> Dumping pixels"); /* Allocate data segment and save it to FITS file */ qd.fbuf = qfits_malloc(11 * 10 * sizeof(float)); for (i=0 ; i<(11*10) ; i++) { qd.fbuf[i]=i*0.2 ; } qd.filename = filename ; qd.npix = 11 * 10 ; qd.ptype = PTYPE_FLOAT ; qd.out_ptype = -32 ; if (qfits_pixdump(&qd)!=0) { fail("cannot save data to test file"); qfits_free(qd.fbuf); return 1 ; } qfits_free(qd.fbuf); /* Zero-pad the output file */ qfits_zeropad(filename); return 0 ; }