/***************************************************************************** * Johns Hopkins University * Center For Astrophysical Sciences * FUSE ***************************************************************************** * * Usage: * idf_cut [-hm] [-v level] idf_file RefTime Period Nout * Arguments: * RefTime : Reference Time in seconds since EXPSTART * Period : Period in seconds * Nout : Number of output files. * Options: * -m : interprets RefTime as MJD * -h : this help message * -v : verbosity level (=1; 0 is silent) * * Description: * * Cuts the IDF file into several smaller IDF files, sorting the * events according to their phase. The GTIs table and timeline get * also cut. * From the input IDF file, idf_cut generates Nout IDF files named * {input_idf_filename}.p{X}.fit with X=0..Nout-1. An event in the * input file is sorted in output file X if it happens in the interval * [RefTime+(k+X/Nout)*Period,RefTime+(k+(X+1)/Nout)*Period[ * with k an integer. * * History: 10/08/04 bjg v1.0 * 10/26/04 bjg v1.1 Now updates the GTIs table * Fixed EXPNIGHT computation * Added -m switch. * + some cosmetic changes * 12/01/04 bjg v1.2 Free allocated memory in the * subroutines * 12/02/04 bjg v1.3 Fixed bug in make_gtitab * 06/03/05 wvd v1.4 Change nevents and nseconds to longs. * 01/18/06 wvd v1.5 Read arrays with cf_read_col. * ****************************************************************************/ #include #include #include #include #include #include #include "calfuse.h" #define _MIN(a,b) (((a)<(b))?(a):(b)) typedef char filename[FLEN_CARD]; struct key { char keyword[FLEN_KEYWORD]; float value; }; static char CF_PRGM_ID[]= "idf_cut"; static char CF_VER_NUM[]= "1.1"; static int _isinphase(double t, double RefTime, double Period, double vinf, double vsup){ float v; v=fmod(t-RefTime,Period); if (v<0) v+=Period; return ((v>=vinf)&&(vvinf) return t-v+vinf+Period; else return t-v+vinf; } static double _getphasenextstop(double t, double RefTime, double Period, double vinf, double vsup){ float v; v=fmod(t-RefTime,Period); if (v<0) v+=Period; if (v>vsup) return t-v+vsup+Period; else return t-v+vsup; } struct _gti{ double start; double stop; struct _gti *next; }; typedef struct{ struct _gti * gtilist; long N; } _tempgtis; static void _pushgti(double a, double b, _tempgtis * tempgtis){ struct _gti *aux; aux=tempgtis->gtilist; tempgtis->gtilist=malloc(sizeof(struct _gti)); tempgtis->N++; tempgtis->gtilist->start=a; tempgtis->gtilist->stop=b; tempgtis->gtilist->next=aux; } static void _popgti(double * a, double * b, _tempgtis * tempgtis){ struct _gti *aux; *a=tempgtis->gtilist->start; *b=tempgtis->gtilist->stop; aux=tempgtis->gtilist; tempgtis->gtilist=tempgtis->gtilist->next; free(aux); tempgtis->N--; } static _tempgtis * _makegtis(){ _tempgtis * tempgtis; tempgtis=malloc(sizeof(_tempgtis)); tempgtis->gtilist=NULL; tempgtis->N=0; return tempgtis; } static void _deletegtis(_tempgtis * tempgtis){ double a,b; while (tempgtis->gtilist!=NULL) _popgti(&a,&b,tempgtis); free(tempgtis); tempgtis=NULL; } static long _ngtis(_tempgtis * tempgtis){ return tempgtis->N; } /****************************************************************************/ long make_evlist(fitsfile *infits,fitsfile *outfits, double RefTime,double Period, long Nout, long phase,char * daynight, long * nbadevnt,long * nbadpha){ int status=0; char pha; char loc_flgs; char timeflgs; char time_test; char keyword[FLEN_CARD],card[FLEN_CARD]; char fmt_byte[FLEN_CARD],fmt_float[FLEN_CARD],fmt_short[FLEN_CARD]; int tfields=14; char extname[]="TTAG DATA"; /* Name of this extension */ char *ttype[]={"TIME", "XRAW", "YRAW", "PHA", "WEIGHT", "XFARF", "YFARF", "X", "Y", "CHANNEL", "TIMEFLGS", "LOC_FLGS", "LAMBDA", "ERGCM2" }; char *tform[14]; /* We'll assign values when we know the number of elements in the data set. */ char *tunit[]={"SECONDS", "PIXELS", "PIXELS", "UNITLESS", "UNITLESS", "PIXELS", "PIXELS", "PIXELS", "PIXELS", "UNITLESS", "UNITLESS", "UNITLESS", "ANGSTROMS", "ERG CM^-2"}; struct key tscal[] = {{"TSCAL6", 0.25}, {"TSCAL7", 0.1}, {"TSCAL8", 0.25}, {"TSCAL9", 0.1}}; struct key tzero[] = {{"TZERO6", 8192.}, {"TZERO7", 0.}, {"TZERO8", 8192.}, {"TZERO9", 0.}}; float *i_time; short *i_xraw; short *i_yraw; char *i_pha; float *i_weight; float *i_xfarf; float *i_yfarf; float *i_x; float *i_y; char *i_channel; char *i_timeflgs; char *i_loc_flgs; float *i_lambda; float *i_ergcm2; float *o_time; short *o_xraw; short *o_yraw; char *o_pha; float *o_weight; float *o_xfarf; float *o_yfarf; float *o_x; float *o_y; char *o_channel; char *o_timeflgs; char *o_loc_flgs; float *o_lambda; float *o_ergcm2; long npts; long i; float vinf,vsup; long nevents=0; *nbadevnt=0; *nbadpha=0; npts = cf_read_col(infits, TFLOAT, "TIME", (void **) &i_time); npts = cf_read_col(infits, TSHORT, "XRAW", (void **) &i_xraw); npts = cf_read_col(infits, TSHORT, "YRAW", (void **) &i_yraw); npts = cf_read_col(infits, TBYTE, "PHA", (void **) &i_pha); npts = cf_read_col(infits, TFLOAT, "WEIGHT", (void **) &i_weight); npts = cf_read_col(infits, TFLOAT, "XFARF", (void **) &i_xfarf); npts = cf_read_col(infits, TFLOAT, "YFARF", (void **) &i_yfarf); npts = cf_read_col(infits, TFLOAT, "X", (void **) &i_x); npts = cf_read_col(infits, TFLOAT, "Y", (void **) &i_y); npts = cf_read_col(infits, TBYTE, "CHANNEL", (void **) &i_channel); npts = cf_read_col(infits, TBYTE, "TIMEFLGS", (void **) &i_timeflgs); npts = cf_read_col(infits, TBYTE, "LOC_FLGS", (void **) &i_loc_flgs); npts = cf_read_col(infits, TFLOAT, "LAMBDA", (void **) &i_lambda); npts = cf_read_col(infits, TFLOAT, "ERGCM2", (void **) &i_ergcm2); o_time = (float *) malloc(npts*sizeof(float)); o_xraw = (short *) malloc(npts*sizeof(short)); o_yraw = (short *) malloc(npts*sizeof(short)); o_pha = (char *) malloc(npts*sizeof(char)); o_weight = (float *) malloc(npts*sizeof(float)); o_xfarf = (float *) malloc(npts*sizeof(float)); o_yfarf = (float *) malloc(npts*sizeof(float)); o_x = (float *) malloc(npts*sizeof(float)); o_y = (float *) malloc(npts*sizeof(float)); o_channel = (char *) malloc(npts*sizeof(char)); o_timeflgs = (char *) malloc(npts*sizeof(char)); o_loc_flgs = (char *) malloc(npts*sizeof(char)); o_lambda = (float *) malloc(npts*sizeof(float)); o_ergcm2 = (float *) malloc(npts*sizeof(float)); vinf=(phase*Period)/((float)Nout); vsup=((phase+1)*Period)/((float)Nout); for (i=0;i 0) { FITS_write_col(outfits, TFLOAT, 1, 1, 1, nevents, o_time, &status); FITS_write_col(outfits, TSHORT, 2, 1, 1, nevents, o_xraw, &status); FITS_write_col(outfits, TSHORT, 3, 1, 1, nevents, o_yraw, &status); FITS_write_col(outfits, TBYTE , 4, 1, 1, nevents, o_pha, &status); FITS_write_col(outfits, TFLOAT, 5, 1, 1, nevents, o_weight, &status); FITS_write_col(outfits, TFLOAT, 6, 1, 1, nevents, o_xfarf, &status); FITS_write_col(outfits, TFLOAT, 7, 1, 1, nevents, o_yfarf, &status); FITS_write_col(outfits, TFLOAT, 8, 1, 1, nevents, o_x, &status); FITS_write_col(outfits, TFLOAT, 9, 1, 1, nevents, o_y, &status); FITS_write_col(outfits, TBYTE , 10, 1, 1, nevents, o_channel, &status); FITS_write_col(outfits, TBYTE , 11, 1, 1, nevents, o_timeflgs, &status); FITS_write_col(outfits, TBYTE , 12, 1, 1, nevents, o_loc_flgs, &status); FITS_write_col(outfits, TFLOAT, 13, 1, 1, nevents, o_lambda, &status); FITS_write_col(outfits, TFLOAT, 14, 1, 1, nevents, o_ergcm2, &status); } free(o_time); free(o_xraw ); free(o_yraw); free(o_pha); free(o_weight); free(o_xfarf); free(o_yfarf); free(o_x); free(o_y); free(o_channel); free(o_timeflgs); free(o_loc_flgs); free(o_lambda); free(o_ergcm2); free(i_time); free(i_xraw ); free(i_yraw); free(i_pha); free(i_weight); free(i_xfarf); free(i_yfarf); free(i_x); free(i_y); free(i_channel); free(i_timeflgs); free(i_loc_flgs); free(i_lambda); free(i_ergcm2); return nevents; } /****************************************************************************/ long make_gtitab(fitsfile * infits, fitsfile * outfits, double RefTime, double Period, long Nout, long phase){ int status=0; int tfields=2; char extname[]="GTI"; /* Name of this extension */ char *ttype[]={"START", "STOP" }; char *tform[2]={"1D", "1D" }; char *tunit[]={"seconds", "seconds"}; double *i_start; double *i_stop; double *o_start; double *o_stop; _tempgtis * tempgtis; long npts=0; long ngtis=0; long i; float vinf,vsup; double a,b; double _start, _stop; npts = cf_read_col(infits, TDOUBLE, "START", (void **) &i_start); npts = cf_read_col(infits, TDOUBLE, "STOP", (void **) &i_stop); vinf=(phase*Period)/((float)Nout); vsup=((phase+1)*Period)/((float)Nout); tempgtis=_makegtis(); for (i=0;i=0;i--){ _popgti(&o_start[i],&o_stop[i],tempgtis); } _deletegtis(tempgtis); /* Append a new empty binary table to the output file */ FITS_create_tbl(outfits, BINARY_TBL, ngtis, tfields, ttype, tform, tunit, extname, &status); if (ngtis>0){ FITS_write_col(outfits, TDOUBLE, 1, 1, 1, ngtis, o_start, &status); FITS_write_col(outfits, TDOUBLE, 2, 1, 1, ngtis, o_stop, &status); } return ngtis; } /****************************************************************************/ long make_timeline(fitsfile *infits, fitsfile *outfits, double RefTime, double Period, long Nout, long phase, char *daynight, double *exptime, double *exp_bad, double *exp_brst, double *exp_hv, double *exp_jitr, double *exp_lim, double *exp_saa, double *expnight){ char timeflgs; char time_test; int status=0; int bigtime=1; int big_vel=1; char keyword[FLEN_CARD],card[FLEN_CARD]; char fmt_byte[FLEN_CARD],fmt_float[FLEN_CARD],fmt_short[FLEN_CARD]; struct key tscal[16]; struct key tzero[16]; char extname[]="TIMELINE"; int tfields=16; /* output table will have 16 columns */ char *ttype[]={"TIME", "STATUS_FLAGS", "TIME_SUNRISE", "TIME_SUNSET", "LIMB_ANGLE", "LONGITUDE", "LATITUDE", "ORBITAL_VEL", "HIGH_VOLTAGE", "LIF_CNT_RATE", "SIC_CNT_RATE", "FEC_CNT_RATE", "AIC_CNT_RATE", "BKGD_CNT_RATE", "YCENT_LIF","YCENT_SIC"}; char *tform[16]; /* we will define tform later, when the number of photons is known */ char *tunit[]={"seconds", "unitless", "seconds", "seconds", "degrees", "degrees", "degrees", "km/s", "unitless", "counts/sec", "counts/sec", "counts/sec", "counts/sec", "counts/sec", "pixels","pixels" }; float *i_time; char *i_status_flags; float *i_time_sunrise; float *i_time_sunset; float *i_limb_angle; float *i_longitude; float *i_latitude; float *i_orbital_vel; short *i_high_voltage; short *i_lif_cnt_rate; short *i_sic_cnt_rate; short *i_fec_cnt_rate; short *i_aic_cnt_rate; short *i_bkgd_cnt_rate; float *i_ycent_lif; float *i_ycent_sic; float *o_time; char *o_status_flags; float *o_time_sunrise; float *o_time_sunset; float *o_limb_angle; float *o_longitude; float *o_latitude; float *o_orbital_vel; short *o_high_voltage; short *o_lif_cnt_rate; short *o_sic_cnt_rate; short *o_fec_cnt_rate; short *o_aic_cnt_rate; short *o_bkgd_cnt_rate; float *o_ycent_lif; float *o_ycent_sic; long npts; long i; float vinf,vsup; long nseconds=0; *exptime=0; *expnight=0; *exp_bad=0; *exp_brst=0; *exp_hv=0; *exp_jitr=0; *exp_lim=0; *exp_saa=0; *expnight=0; npts = cf_read_col(infits, TFLOAT, "TIME" , (void **) &i_time); npts = cf_read_col(infits, TBYTE , "STATUS_FLAGS" , (void **) &i_status_flags); npts = cf_read_col(infits, TFLOAT, "TIME_SUNRISE" , (void **) &i_time_sunrise); npts = cf_read_col(infits, TFLOAT, "TIME_SUNSET" , (void **) &i_time_sunset); npts = cf_read_col(infits, TFLOAT, "LIMB_ANGLE" , (void **) &i_limb_angle); npts = cf_read_col(infits, TFLOAT, "LONGITUDE" , (void **) &i_longitude); npts = cf_read_col(infits, TFLOAT, "LATITUDE" , (void **) &i_latitude); npts = cf_read_col(infits, TFLOAT, "ORBITAL_VEL" , (void **) &i_orbital_vel); npts = cf_read_col(infits, TSHORT, "HIGH_VOLTAGE" , (void **) &i_high_voltage); npts = cf_read_col(infits, TSHORT, "LIF_CNT_RATE" , (void **) &i_lif_cnt_rate); npts = cf_read_col(infits, TSHORT, "SIC_CNT_RATE" , (void **) &i_sic_cnt_rate); npts = cf_read_col(infits, TSHORT, "FEC_CNT_RATE" , (void **) &i_fec_cnt_rate); npts = cf_read_col(infits, TSHORT, "AIC_CNT_RATE" , (void **) &i_aic_cnt_rate); npts = cf_read_col(infits, TSHORT, "BKGD_CNT_RATE" , (void **) &i_bkgd_cnt_rate); npts = cf_read_col(infits, TFLOAT, "YCENT_LIF" , (void **) &i_ycent_lif); npts = cf_read_col(infits, TFLOAT, "YCENT_SIC" , (void **) &i_ycent_sic); o_time = (float *) malloc(npts*sizeof(float)); o_status_flags = (char *) malloc(npts*sizeof(char)); o_time_sunrise = (float *) malloc(npts*sizeof(float)); o_time_sunset = (float *) malloc(npts*sizeof(float)); o_limb_angle = (float *) malloc(npts*sizeof(float)); o_longitude = (float *) malloc(npts*sizeof(float)); o_latitude = (float *) malloc(npts*sizeof(float)); o_orbital_vel = (float *) malloc(npts*sizeof(float)); o_high_voltage = (short *) malloc(npts*sizeof(short)); o_lif_cnt_rate = (short *) malloc(npts*sizeof(short)); o_sic_cnt_rate = (short *) malloc(npts*sizeof(short)); o_fec_cnt_rate = (short *) malloc(npts*sizeof(short)); o_aic_cnt_rate = (short *) malloc(npts*sizeof(short)); o_bkgd_cnt_rate = (short *) malloc(npts*sizeof(short)); o_ycent_lif = (float *) malloc(npts*sizeof(float)); o_ycent_sic = (float *) malloc(npts*sizeof(float)); vinf=(phase*Period)/((float)Nout); vsup=((phase+1)*Period)/((float)Nout); for (i=0;i 0) { FITS_write_col(outfits, TFLOAT, 1, 1, 1, nseconds, o_time , &status); FITS_write_col(outfits, TBYTE , 2, 1, 1, nseconds, o_status_flags , &status); FITS_write_col(outfits, TFLOAT, 3, 1, 1, nseconds, o_time_sunrise , &status); FITS_write_col(outfits, TFLOAT, 4, 1, 1, nseconds, o_time_sunset , &status); FITS_write_col(outfits, TFLOAT, 5, 1, 1, nseconds, o_limb_angle , &status); FITS_write_col(outfits, TFLOAT, 6, 1, 1, nseconds, o_longitude , &status); FITS_write_col(outfits, TFLOAT, 7, 1, 1, nseconds, o_latitude , &status); FITS_write_col(outfits, TFLOAT, 8, 1, 1, nseconds, o_orbital_vel , &status); FITS_write_col(outfits, TSHORT, 9, 1, 1, nseconds, o_high_voltage , &status); FITS_write_col(outfits, TSHORT, 10, 1, 1, nseconds, o_lif_cnt_rate , &status); FITS_write_col(outfits, TSHORT, 11, 1, 1, nseconds, o_sic_cnt_rate , &status); FITS_write_col(outfits, TSHORT, 12, 1, 1, nseconds, o_fec_cnt_rate , &status); FITS_write_col(outfits, TSHORT, 13, 1, 1, nseconds, o_aic_cnt_rate , &status); FITS_write_col(outfits, TSHORT, 14, 1, 1, nseconds, o_bkgd_cnt_rate , &status); FITS_write_col(outfits, TFLOAT, 15, 1, 1, nseconds, o_ycent_lif , &status); FITS_write_col(outfits, TFLOAT, 16, 1, 1, nseconds, o_ycent_sic , &status); } free(o_time); free(o_status_flags); free(o_time_sunrise); free(o_time_sunset); free(o_limb_angle); free(o_longitude); free(o_latitude); free(o_orbital_vel); free(o_high_voltage); free(o_lif_cnt_rate); free(o_sic_cnt_rate); free(o_fec_cnt_rate); free(o_aic_cnt_rate); free(o_bkgd_cnt_rate); free(o_ycent_lif); free(o_ycent_sic); free(i_time); free(i_status_flags); free(i_time_sunrise); free(i_time_sunset); free(i_limb_angle); free(i_longitude); free(i_latitude); free(i_orbital_vel); free(i_high_voltage); free(i_lif_cnt_rate); free(i_sic_cnt_rate); free(i_fec_cnt_rate); free(i_aic_cnt_rate); free(i_bkgd_cnt_rate); free(i_ycent_lif); free(i_ycent_sic); return nseconds; } /****************************************************************************/ int main(int argc,char *argv[]){ time_t vtime; char stime[FLEN_CARD]; fitsfile * infits; fitsfile * outfits; filename input_filename,output_filename, ifname; char string0[FLEN_CARD], daynight[FLEN_CARD]; long nevents; long nseconds; long ngtis; long nbadevnt; long nbadpha; double exptime; double exp_bad; double exp_brst; double exp_hv; double exp_jitr; double exp_lim; double exp_saa; double expnight; double RefTime; double Period; long Nout; double expstart; long i; int optc; char opts[] = "hmv:"; char usage[] = "Usage:\n" " idf_cut [-hm] [-v level] idf_file RefTime Period Nout\n"; char argument[] = "Arguments:\n" " RefTime : Reference Time in seconds since EXPSTART\n" " Period : Period in seconds\n" " Nout : Number of output files.\n"; char option[] = "Options:\n" " -m: interprets RefTime as MJD\n" " -h: this help message\n" " -v: verbosity level (=1; 0 is silent)\n"; int hdutype=0; int status=0; int rtime_mjd=0; verbose_level = 1; /* Check number of options and arguments */ while ((optc = getopt(argc, argv, opts)) != -1) { switch(optc) { case 'h': printf("%s\n%s\n%s", usage, argument, option); return 0; case 'v': verbose_level = atoi(optarg); break; case 'm': rtime_mjd=1; break; } } cf_error_init(CF_PRGM_ID, CF_VER_NUM, stderr); if (argc != optind+4) { printf("%s", usage); cf_if_error("Incorrect number of arguments"); } cf_timestamp(CF_PRGM_ID, CF_VER_NUM, "Started execution."); /* get and display time */ vtime = time(NULL) ; strcpy(stime,ctime(&vtime)); strcpy(input_filename,argv[optind]); sscanf(argv[optind+1],"%lf",&RefTime); sscanf(argv[optind+2],"%lf",&Period); sscanf(argv[optind+3],"%ld",&Nout); FITS_open_file(&infits,input_filename,READONLY,&status); FITS_read_key(infits,TSTRING,"DAYNIGHT",daynight,NULL,&status); FITS_read_key(infits,TSTRING,"FILENAME",ifname,NULL,&status); if (rtime_mjd){ FITS_read_key(infits,TDOUBLE,"EXPSTART",&expstart,NULL,&status); RefTime=(RefTime-expstart)*3600.0*24.0; } for (i=0;i