//---------------------------------------------------------- int check_for_file_roll(etfits_t *etf) { //---------------------------------------------------------- // checks if we need to roll over to a new file int * status_p = &(etf->status); struct stat st; fits_flush_file(etf->fptr, status_p); // flush to get true size if(stat(etf->filename_working, &st) == -1) { hashpipe_error(__FUNCTION__, "Error getting etfits file size"); } else { //fprintf(stderr, "size of %s is %ld\n", etf->filename, st.st_size); if(st.st_size >= etf->max_file_size) { etf->file_num++; etf->new_file = 1; } } return *status_p; }
int sdfits_write_subint(struct sdfits *sf) { int row, *status; int nchan, nivals, nsubband; struct hdrinfo *hdr; struct sdfits_data_columns *dcols; char* temp_str; double temp_dbl; hdr = &(sf->hdr); // dereference the ptr to the header struct dcols = &(sf->data_columns); // dereference the ptr to the subint struct status = &(sf->status); // dereference the ptr to the CFITSIO status nchan = hdr->nchan; nsubband = hdr->nsubband; nivals = nchan * nsubband * 4; // 4 stokes parameters // Create the initial file or change to a new one if needed. if (sf->new_file || (sf->multifile==1 && sf->rownum > sf->rows_per_file)) { if (!sf->new_file) { printf("Closing file '%s'\n", sf->filename); fits_close_file(sf->fptr, status); } sdfits_create(sf); } row = sf->rownum; temp_str = dcols->object; temp_dbl = 0.0; dcols->centre_freq_idx++; fits_write_col(sf->fptr, TDOUBLE, 1, row, 1, 1, &(dcols->time), status); fits_write_col(sf->fptr, TINT, 2, row, 1, 1, &(dcols->time_counter), status); fits_write_col(sf->fptr, TINT, 3, row, 1, 1, &(dcols->integ_num), status); fits_write_col(sf->fptr, TFLOAT, 4, row, 1, 1, &(dcols->exposure), status); fits_write_col(sf->fptr, TSTRING, 5, row, 1, 1, &temp_str, status); fits_write_col(sf->fptr, TFLOAT, 6, row, 1, 1, &(dcols->azimuth), status); fits_write_col(sf->fptr, TFLOAT, 7, row, 1, 1, &(dcols->elevation), status); fits_write_col(sf->fptr, TFLOAT, 8, row, 1, 1, &(dcols->bmaj), status); fits_write_col(sf->fptr, TFLOAT, 9, row, 1, 1, &(dcols->bmin), status); fits_write_col(sf->fptr, TFLOAT, 10, row, 1, 1, &(dcols->bpa), status); fits_write_col(sf->fptr, TINT, 11, row, 1, 1, &(dcols->accumid), status); fits_write_col(sf->fptr, TINT, 12, row, 1, 1, &(dcols->sttspec), status); fits_write_col(sf->fptr, TINT, 13, row, 1, 1, &(dcols->stpspec), status); fits_write_col(sf->fptr, TDOUBLE, 14, row, 1, nsubband, dcols->centre_freq, status); fits_write_col(sf->fptr, TFLOAT, 15, row, 1, 1, &(dcols->centre_freq_idx), status); fits_write_col(sf->fptr, TDOUBLE, 16, row, 1, 1, &temp_dbl, status); fits_write_col(sf->fptr, TDOUBLE, 17, row, 1, 1, &(sf->hdr.chan_bw), status); fits_write_col(sf->fptr, TDOUBLE, 18, row, 1, 1, &(dcols->ra), status); fits_write_col(sf->fptr, TDOUBLE, 19, row, 1, 1, &(dcols->dec), status); fits_write_col(sf->fptr, TFLOAT, 20, row, 1, nivals, dcols->data, status); // Flush the buffers if not finished with the file // Note: this use is not entirely in keeping with the CFITSIO // documentation recommendations. However, manually // correcting NAXIS2 and using fits_flush_buffer() // caused occasional hangs (and extrememly large // files due to some infinite loop). fits_flush_file(sf->fptr, status); // Print status if bad if (*status) { fprintf(stderr, "Error writing subint %d:\n", sf->rownum); fits_report_error(stderr, *status); fflush(stderr); } // Now update some key values if no CFITSIO errors if (!(*status)) { sf->rownum++; sf->tot_rows++; sf->N += 1; sf->T += dcols->exposure; } return *status; }
int sdfits_create(struct sdfits *sf) { int itmp, *status; char ctmp[40]; struct hdrinfo *hdr; hdr = &(sf->hdr); // dereference the ptr to the header struct status = &(sf->status); // dereference the ptr to the CFITSIO status // Initialize the key variables if needed if (sf->new_file == 1) { // first time writing to the file sf->status = 0; sf->tot_rows = 0; sf->N = 0L; sf->T = 0.0; sf->mode = 'w'; // Create the output directory if needed char datadir[1024]; strncpy(datadir, sf->basefilename, 1023); char *last_slash = strrchr(datadir, '/'); if (last_slash!=NULL && last_slash!=datadir) { *last_slash = '\0'; printf("Using directory '%s' for output.\n", datadir); char cmd[1024]; sprintf(cmd, "mkdir -m 1777 -p %s", datadir); system(cmd); } sf->new_file = 0; } sf->filenum++; sf->rownum = 1; sprintf(sf->filename, "%s_%04d.fits", sf->basefilename, sf->filenum); // Create basic FITS file from our template char *vegas_dir = getenv("VEGAS_DIR"); char template_file[1024]; if (vegas_dir==NULL) { fprintf(stderr, "Error: VEGAS_DIR environment variable not set, exiting.\n"); exit(1); } printf("Opening file '%s'\n", sf->filename); sprintf(template_file, "%s/%s", vegas_dir, SDFITS_TEMPLATE); fits_create_template(&(sf->fptr), sf->filename, template_file, status); // Check to see if file was successfully created if (*status) { fprintf(stderr, "Error creating sdfits file from template.\n"); fits_report_error(stderr, *status); exit(1); } // Go to the primary HDU fits_movabs_hdu(sf->fptr, 1, NULL, status); // Update the keywords that need it fits_get_system_time(ctmp, &itmp, status); // date the file was written fits_update_key(sf->fptr, TSTRING, "DATE", ctmp, NULL, status); // Go to the SINGLE DISH HDU fits_movnam_hdu(sf->fptr, BINARY_TBL, "SINGLE DISH", 0, status); // Update the keywords that need it fits_update_key(sf->fptr, TSTRING, "TELESCOP", hdr->telescope,NULL, status); fits_update_key(sf->fptr, TDOUBLE, "BANDWID", &(hdr->bandwidth), NULL, status); fits_update_key(sf->fptr, TSTRING, "DATE-OBS", hdr->date_obs, NULL, status); fits_update_key(sf->fptr, TDOUBLE, "TSYS", &(hdr->tsys), NULL, status); fits_update_key(sf->fptr, TSTRING, "PROJID", hdr->projid, NULL, status); fits_update_key(sf->fptr, TSTRING, "FRONTEND", hdr->frontend, NULL, status); fits_update_key(sf->fptr, TDOUBLE, "OBSFREQ", &(hdr->obsfreq), NULL, status); fits_update_key(sf->fptr, TDOUBLE, "SCAN", &(hdr->scan), NULL, status); fits_update_key(sf->fptr, TSTRING, "INSTRUME", hdr->instrument, NULL, status); fits_update_key(sf->fptr, TSTRING, "CAL_MODE", hdr->cal_mode, NULL, status); if (strcmp("OFF", hdr->cal_mode) != 0) { fits_update_key(sf->fptr, TDOUBLE, "CAL_FREQ", &(hdr->cal_freq), NULL, status); fits_update_key(sf->fptr, TDOUBLE, "CAL_DCYC", &(hdr->cal_dcyc), NULL, status); fits_update_key(sf->fptr, TDOUBLE, "CAL_PHS", &(hdr->cal_phs), NULL, status); } fits_update_key(sf->fptr, TINT, "NPOL", &(hdr->npol), NULL, status); fits_update_key(sf->fptr, TINT, "NCHAN", &(hdr->nchan), NULL, status); fits_update_key(sf->fptr, TDOUBLE, "CHAN_BW", &(hdr->chan_bw), NULL, status); fits_update_key(sf->fptr, TINT, "NSUBBAND", &(hdr->nsubband), NULL, status); fits_update_key(sf->fptr, TDOUBLE, "EFSAMPFR", &(hdr->efsampfr), NULL, status); fits_update_key(sf->fptr, TDOUBLE, "FPGACLK", &(hdr->fpgaclk), NULL, status); fits_update_key(sf->fptr, TDOUBLE, "HWEXPOSR", &(hdr->hwexposr), NULL, status); fits_update_key(sf->fptr, TDOUBLE, "FILTNEP", &(hdr->filtnep), NULL, status); fits_update_key(sf->fptr, TDOUBLE, "STTMJD", &(hdr->sttmjd), NULL, status); // Update the column sizes for the colums containing arrays itmp = hdr->nsubband * hdr->nchan * 4; //num elements, not bytes fits_modify_vector_len(sf->fptr, 20, itmp, status); // DATA fits_modify_vector_len(sf->fptr, 14, hdr->nsubband, status); // SUBFREQ // Update the TDIM field for the data column sprintf(ctmp, "(%d,%d,4,1,1)", hdr->nchan, hdr->nsubband); fits_update_key(sf->fptr, TSTRING, "TDIM20", ctmp, NULL, status); fits_flush_file(sf->fptr, status); return *status; }
int psrfits_write_polycos(struct psrfits *pf, struct polyco *pc, int npc) { // Usual setup int *status = &(pf->status); // If mode!=fold, exit? // Save current HDU, move to polyco table int hdu; fits_get_hdu_num(pf->fptr, &hdu); fits_movnam_hdu(pf->fptr, BINARY_TBL, "POLYCO", 0, status); int itmp; double dtmp; char datestr[32], ctmp[32]; char *cptr; fits_get_system_time(datestr, &itmp, status); int i, col, n_written=0; long row; fits_get_num_rows(pf->fptr, &row, status); // Start at end of table for (i=0; i<npc; i++) { // Only write polycos that were used if (!pc[i].used) continue; // Go to next row (1-based index) row++; cptr = datestr; fits_get_colnum(pf->fptr,CASEINSEN,"DATE_PRO",&col,status); fits_write_col(pf->fptr,TSTRING,col,row,1,1,&cptr,status); sprintf(ctmp, "11.005"); // Tempo version? cptr = ctmp; fits_get_colnum(pf->fptr,CASEINSEN,"POLYVER",&col,status); fits_write_col(pf->fptr,TSTRING,col,row,1,1,&cptr,status); fits_get_colnum(pf->fptr,CASEINSEN,"NSPAN",&col,status); fits_write_col(pf->fptr,TINT,col,row,1,1,&(pc[i].nmin),status); fits_get_colnum(pf->fptr,CASEINSEN,"NCOEF",&col,status); fits_write_col(pf->fptr,TINT,col,row,1,1,&(pc[i].nc),status); sprintf(ctmp,"%d", pc[i].nsite); // XXX convert to letter? cptr = ctmp; fits_get_colnum(pf->fptr,CASEINSEN,"NSITE",&col,status); fits_write_col(pf->fptr,TSTRING,col,row,1,1,&cptr,status); fits_get_colnum(pf->fptr,CASEINSEN,"REF_FREQ",&col,status); fits_write_col(pf->fptr,TFLOAT,col,row,1,1,&(pc[i].rf),status); // XXX needs to be accurate?? dtmp=0.0; fits_get_colnum(pf->fptr,CASEINSEN,"PRED_PHS",&col,status); fits_write_col(pf->fptr,TDOUBLE,col,row,1,1,&dtmp,status); dtmp = (double)pc[i].mjd + pc[i].fmjd; fits_get_colnum(pf->fptr,CASEINSEN,"REF_MJD",&col,status); fits_write_col(pf->fptr,TDOUBLE,col,row,1,1,&dtmp,status); fits_get_colnum(pf->fptr,CASEINSEN,"REF_PHS",&col,status); fits_write_col(pf->fptr,TDOUBLE,col,row,1,1,&(pc[i].rphase),status); fits_get_colnum(pf->fptr,CASEINSEN,"REF_F0",&col,status); fits_write_col(pf->fptr,TDOUBLE,col,row,1,1,&(pc[i].f0),status); // XXX don't parse this yet dtmp=-6.0; fits_get_colnum(pf->fptr,CASEINSEN,"LGFITERR",&col,status); fits_write_col(pf->fptr,TDOUBLE,col,row,1,1,&dtmp,status); fits_get_colnum(pf->fptr,CASEINSEN,"COEFF",&col,status); fits_write_col(pf->fptr,TDOUBLE,col,row,1,pc[i].nc,pc[i].c,status); n_written++; } // Update polyco block count, only if new info was added if (n_written) { itmp = row; fits_get_colnum(pf->fptr,CASEINSEN,"NPBLK",&col,status); for (i=1; i<=row; i++) fits_write_col(pf->fptr,TINT,col,i,1,1,&itmp,status); } // Flush buffers (so files are valid as they are created) fits_flush_file(pf->fptr, status); // Go back to orig HDU fits_movabs_hdu(pf->fptr, hdu, NULL, status); return *status; }
int psrfits_write_subint(struct psrfits *pf) { int row, *status, nchan, nivals, mode, out_nbytes; float ftmp; struct hdrinfo *hdr; struct subint *sub; hdr = &(pf->hdr); // dereference the ptr to the header struct sub = &(pf->sub); // dereference the ptr to the subint struct status = &(pf->status); // dereference the ptr to the CFITSIO status nchan = hdr->nchan / hdr->ds_freq_fact; if (hdr->onlyI) nivals = nchan; else nivals = nchan * hdr->npol; mode = psrfits_obs_mode(hdr->obs_mode); if (mode==fold) out_nbytes = sub->bytes_per_subint / hdr->ds_freq_fact; else { out_nbytes = sub->bytes_per_subint / (hdr->ds_freq_fact * hdr->ds_time_fact); if (hdr->onlyI) out_nbytes /= hdr->npol; } // Create the initial file or change to a new one if needed. // Stay with a single file for fold mode. if (pf->filenum==0 || ( (mode==search || pf->multifile==1) && pf->rownum > pf->rows_per_file)) { if (pf->filenum) { printf("Closing file '%s'\n", pf->filename); fits_close_file(pf->fptr, status); } psrfits_create(pf); } row = pf->rownum; fits_write_col(pf->fptr, TDOUBLE, 1, row, 1, 1, &(sub->tsubint), status); fits_write_col(pf->fptr, TDOUBLE, 2, row, 1, 1, &(sub->offs), status); fits_write_col(pf->fptr, TDOUBLE, 3, row, 1, 1, &(sub->lst), status); fits_write_col(pf->fptr, TDOUBLE, 4, row, 1, 1, &(sub->ra), status); fits_write_col(pf->fptr, TDOUBLE, 5, row, 1, 1, &(sub->dec), status); fits_write_col(pf->fptr, TDOUBLE, 6, row, 1, 1, &(sub->glon), status); fits_write_col(pf->fptr, TDOUBLE, 7, row, 1, 1, &(sub->glat), status); ftmp = (float) sub->feed_ang; fits_write_col(pf->fptr, TFLOAT, 8, row, 1, 1, &ftmp, status); ftmp = (float) sub->pos_ang; fits_write_col(pf->fptr, TFLOAT, 9, row, 1, 1, &ftmp, status); ftmp = (float) sub->par_ang; fits_write_col(pf->fptr, TFLOAT, 10, row, 1, 1, &ftmp, status); ftmp = (float) sub->tel_az; fits_write_col(pf->fptr, TFLOAT, 11, row, 1, 1, &ftmp, status); ftmp = (float) sub->tel_zen; fits_write_col(pf->fptr, TFLOAT, 12, row, 1, 1, &ftmp, status); fits_write_col(pf->fptr, TDOUBLE, 13, row, 1, nchan, sub->dat_freqs, status); fits_write_col(pf->fptr, TFLOAT, 14, row, 1, nchan, sub->dat_weights, status); fits_write_col(pf->fptr, TFLOAT, 15, row, 1, nivals, sub->dat_offsets, status); fits_write_col(pf->fptr, TFLOAT, 16, row, 1, nivals, sub->dat_scales, status); if (mode==search) { if (hdr->nbits==4) pf_8bit_to_4bit(pf); fits_write_col(pf->fptr, TBYTE, 17, row, 1, out_nbytes, sub->rawdata, status); } else if (mode==fold) { // Fold mode writes floats for now.. fits_write_col(pf->fptr, TFLOAT, 17, row, 1, out_nbytes/sizeof(float), sub->data, status); } // Flush the buffers if not finished with the file // Note: this use is not entirely in keeping with the CFITSIO // documentation recommendations. However, manually // correcting NAXIS2 and using fits_flush_buffer() // caused occasional hangs (and extrememly large // files due to some infinite loop). fits_flush_file(pf->fptr, status); // Print status if bad if (*status) { fprintf(stderr, "Error writing subint %d:\n", pf->rownum); fits_report_error(stderr, *status); fflush(stderr); } // Now update some key values if no CFITSIO errors if (!(*status)) { pf->rownum++; pf->tot_rows++; pf->N += hdr->nsblk / hdr->ds_time_fact; pf->T += sub->tsubint; // For fold mode, print info each subint written if (mode==fold && pf->quiet!=1) { printf("Wrote subint %d (total time %.1fs)\n", pf->rownum-1, pf->T); fflush(stdout); } } return *status; }
int psrfits_create(struct psrfits *pf) { int itmp, *status; long long lltmp; long double ldtmp; double dtmp; char ctmp[40]; struct hdrinfo *hdr; struct foldinfo *fld; hdr = &(pf->hdr); // dereference the ptr to the header struct status = &(pf->status); // dereference the ptr to the CFITSIO status fld = &(pf->fold); // ptr to foldinfo struct // Figure out what mode this is int mode=0; mode = psrfits_obs_mode(hdr->obs_mode); if (mode==fold) { if (hdr->onlyI) printf("Warning! In folding mode and ONLY_I is set!\n"); if (hdr->ds_time_fact > 1) printf("Warning! In folding mode and DS_TIME is > 1!\n"); if (hdr->ds_freq_fact > 1) printf("Warning! In folding mode and DS_FREQ is > 1!\n"); } // Initialize the key variables if needed if (pf->filenum == 0) { // first time writing to the file pf->status = 0; pf->tot_rows = 0; pf->N = 0L; pf->T = 0.0; hdr->offset_subint = 0; pf->mode = 'w'; // Create the output directory if needed char datadir[1024]; strncpy(datadir, pf->basefilename, 1023); char *last_slash = strrchr(datadir, '/'); if (last_slash!=NULL && last_slash!=datadir) { *last_slash = '\0'; printf("Using directory '%s' for output.\n", datadir); char cmd[1024]; sprintf(cmd, "mkdir -m 1777 -p %s", datadir); system(cmd); } } pf->filenum++; pf->rownum = 1; hdr->offset_subint = pf->tot_rows; // Update the filename - don't include filenum for fold mode // TODO : use rf/cf extensions for psr/cals? if (mode==fold && pf->multifile!=1) sprintf(pf->filename, "%s.fits", pf->basefilename); else sprintf(pf->filename, "%s_%04d.fits", pf->basefilename, pf->filenum); // Create basic FITS file from our template // Fold mode template has additional tables (polyco, ephem) char template_dir[1024]; char template_file[1024]; #ifdef PSRFITS_TEMPLATE_DIR sprintf(template_dir, "%s", PSRFITS_TEMPLATE_DIR); #else char *guppi_dir = getenv("GUPPI_DIR"); if (guppi_dir==NULL) { fprintf(stderr, "Error: GUPPI_DIR environment variable not set, exiting.\n"); exit(1); } sprintf(template_dir, "%s/src", guppi_dir); #endif printf("Opening file '%s' ", pf->filename); if (mode==search) { printf("in search mode.\n"); sprintf(template_file, "%s/%s", template_dir, PSRFITS_SEARCH_TEMPLATE); } else if (mode==fold) { printf("in fold mode.\n"); sprintf(template_file, "%s/%s", template_dir, PSRFITS_FOLD_TEMPLATE); } fits_create_template(&(pf->fptr), pf->filename, template_file, status); // Check to see if file was successfully created if (*status) { fprintf(stderr, "Error creating psrfits file from template.\n"); fits_report_error(stderr, *status); exit(1); } // Go to the primary HDU fits_movabs_hdu(pf->fptr, 1, NULL, status); // Update the keywords that need it fits_get_system_time(ctmp, &itmp, status); // Note: this is the date the file was _written_, not the obs start date fits_update_key(pf->fptr, TSTRING, "DATE", ctmp, NULL, status); fits_update_key(pf->fptr, TSTRING, "TELESCOP", hdr->telescope,NULL, status); fits_update_key(pf->fptr, TSTRING, "OBSERVER", hdr->observer, NULL, status); fits_update_key(pf->fptr, TSTRING, "PROJID", hdr->project_id, NULL, status); fits_update_key(pf->fptr, TSTRING, "FRONTEND", hdr->frontend, NULL, status); fits_update_key(pf->fptr, TSTRING, "BACKEND", hdr->backend, NULL, status); if (hdr->onlyI || hdr->summed_polns) { if (!hdr->onlyI && hdr->npol > 1) { printf("Warning!: Can't have %d polarizations _and_ be summed!\n", hdr->npol); } itmp = 2; fits_update_key(pf->fptr, TINT, "NRCVR", &itmp, NULL, status); } else { if (hdr->npol > 2) { // Can't have more than 2 real polns (i.e. NRCVR) itmp = 2; fits_update_key(pf->fptr, TINT, "NRCVR", &itmp, NULL, status); } else { fits_update_key(pf->fptr, TINT, "NRCVR", &(hdr->npol), NULL, status); } } fits_update_key(pf->fptr, TSTRING, "FD_POLN", hdr->poln_type, NULL, status); fits_update_key(pf->fptr, TINT, "FD_HAND", &(hdr->fd_hand), NULL, status); fits_update_key(pf->fptr, TDOUBLE, "FD_SANG", &(hdr->fd_sang), NULL, status); fits_update_key(pf->fptr, TDOUBLE, "FD_XYPH", &(hdr->fd_xyph), NULL, status); fits_update_key(pf->fptr, TINT, "BE_PHASE", &(hdr->be_phase), NULL, status); fits_update_key(pf->fptr, TSTRING, "DATE-OBS", hdr->date_obs, NULL, status); if (mode==fold && !strcmp("CAL",hdr->obs_mode)) fits_update_key(pf->fptr, TSTRING, "OBS_MODE", hdr->obs_mode, NULL, status); fits_update_key(pf->fptr, TDOUBLE, "OBSFREQ", &(hdr->fctr), NULL, status); fits_update_key(pf->fptr, TDOUBLE, "OBSBW", &(hdr->BW), NULL, status); fits_update_key(pf->fptr, TINT, "OBSNCHAN", &(hdr->orig_nchan), NULL, status); fits_update_key(pf->fptr, TDOUBLE, "CHAN_DM", &(hdr->chan_dm), NULL, status); fits_update_key(pf->fptr, TSTRING, "SRC_NAME", hdr->source, NULL, status); if (!strcmp("UNKNOWN", hdr->track_mode)) { printf("Warning!: Unknown telescope tracking mode!\n"); } fits_update_key(pf->fptr, TSTRING, "TRK_MODE", hdr->track_mode, NULL, status); // TODO: will need to change the following if we aren't tracking! fits_update_key(pf->fptr, TSTRING, "RA", hdr->ra_str, NULL, status); fits_update_key(pf->fptr, TSTRING, "DEC", hdr->dec_str, NULL, status); fits_update_key(pf->fptr, TSTRING, "STT_CRD1", hdr->ra_str, NULL, status); fits_update_key(pf->fptr, TSTRING, "STP_CRD1", hdr->ra_str, NULL, status); // TODO: update these at the end of the file or obs fits_update_key(pf->fptr, TSTRING, "STT_CRD2", hdr->dec_str, NULL, status); fits_update_key(pf->fptr, TSTRING, "STP_CRD2", hdr->dec_str, NULL, status); fits_update_key(pf->fptr, TDOUBLE, "BMAJ", &(hdr->beam_FWHM), NULL, status); fits_update_key(pf->fptr, TDOUBLE, "BMIN", &(hdr->beam_FWHM), NULL, status); if (strcmp("OFF", hdr->cal_mode)) { fits_update_key(pf->fptr, TDOUBLE, "CAL_FREQ", &(hdr->cal_freq), NULL, status); fits_update_key(pf->fptr, TDOUBLE, "CAL_DCYC", &(hdr->cal_dcyc), NULL, status); fits_update_key(pf->fptr, TDOUBLE, "CAL_PHS", &(hdr->cal_phs), NULL, status); } fits_update_key(pf->fptr, TDOUBLE, "SCANLEN", &(hdr->scanlen), NULL, status); itmp = (int) hdr->MJD_epoch; fits_update_key(pf->fptr, TINT, "STT_IMJD", &itmp, NULL, status); ldtmp = (hdr->MJD_epoch - (long double) itmp) * 86400.0L; // in sec itmp = (int) ldtmp; fits_update_key(pf->fptr, TINT, "STT_SMJD", &itmp, NULL, status); ldtmp -= (long double) itmp; dtmp = (double) ldtmp; fits_update_key(pf->fptr, TDOUBLE, "STT_OFFS", &dtmp, NULL, status); fits_update_key(pf->fptr, TDOUBLE, "STT_LST", &(hdr->start_lst), NULL, status); // If fold mode, copy the parfile into the PSRFITS EPHEM table if (mode==fold) { if (strcmp("CAL",hdr->obs_mode)==0) { // CAL mode has no par file, or no par file given psrfits_remove_ephem(pf); } else if (fld->parfile[0]=='\0') { // No par file given fprintf(stderr, "psrfits_create warning: " "Fold mode selected, but no parfile given - " "EPHEM table will be removed.\n" ); psrfits_remove_ephem(pf); } else { FILE *parfile = fopen(fld->parfile, "r"); if (parfile==NULL) { fprintf(stderr, "psrfits_create warning: " "Error opening parfile %s - " "EPHEM table will be removed.\n", fld->parfile ); psrfits_remove_ephem(pf); } else { psrfits_write_ephem(pf, parfile); fclose(parfile); } } } // Go to the SUBINT HDU fits_movnam_hdu(pf->fptr, BINARY_TBL, "SUBINT", 0, status); // Update the keywords that need it if (hdr->onlyI) { itmp = 1; fits_update_key(pf->fptr, TINT, "NPOL", &itmp, NULL, status); } else { fits_update_key(pf->fptr, TINT, "NPOL", &(hdr->npol), NULL, status); } if (!hdr->onlyI && !hdr->summed_polns) { // TODO: These need to be updated for the real machine. if (hdr->npol==1) strcpy(ctmp, "AA"); else if (hdr->npol==2) strcpy(ctmp, "AABB"); else if (hdr->npol==4) { if (strncmp(hdr->poln_order, "AABBCRCI", 8)==0) strcpy(ctmp, hdr->poln_order); else strcpy(ctmp, "IQUV"); } fits_update_key(pf->fptr, TSTRING, "POL_TYPE", ctmp, NULL, status); } else { fits_update_key(pf->fptr, TSTRING, "POL_TYPE", "AA+BB", NULL, status); } // TODO what does TBIN mean in fold mode? dtmp = hdr->dt * hdr->ds_time_fact; fits_update_key(pf->fptr, TDOUBLE, "TBIN", &dtmp, NULL, status); fits_update_key(pf->fptr, TINT, "NSUBOFFS", &(hdr->offset_subint), NULL, status); itmp = hdr->nchan / hdr->ds_freq_fact; fits_update_key(pf->fptr, TINT, "NCHAN", &itmp, NULL, status); dtmp = hdr->df * hdr->ds_freq_fact; fits_update_key(pf->fptr, TDOUBLE, "CHAN_BW", &dtmp, NULL, status); if (mode==search) { int out_nsblk = hdr->nsblk / hdr->ds_time_fact; itmp = 1; fits_update_key(pf->fptr, TINT, "NSBLK", &out_nsblk, NULL, status); fits_update_key(pf->fptr, TINT, "NBITS", &(hdr->nbits), NULL, status); fits_update_key(pf->fptr, TINT, "NBIN", &itmp, NULL, status); } else if (mode==fold) { itmp = 1; fits_update_key(pf->fptr, TINT, "NSBLK", &itmp, NULL, status); fits_update_key(pf->fptr, TINT, "NBITS", &itmp, NULL, status); fits_update_key(pf->fptr, TINT, "NBIN", &(hdr->nbin), NULL, status); fits_update_key(pf->fptr, TSTRING, "EPOCHS", "MIDTIME", NULL, status); } // Update the column sizes for the colums containing arrays { int out_npol = hdr->npol; int out_nchan = hdr->nchan / hdr->ds_freq_fact; if (hdr->onlyI) out_npol = 1; int out_nsblk = hdr->nsblk / hdr->ds_time_fact; fits_modify_vector_len(pf->fptr, 13, out_nchan, status); // DAT_FREQ fits_modify_vector_len(pf->fptr, 14, out_nchan, status); // DAT_WTS itmp = out_nchan * out_npol; fits_modify_vector_len(pf->fptr, 15, itmp, status); // DAT_OFFS fits_modify_vector_len(pf->fptr, 16, itmp, status); // DAT_SCL if (mode==search) { lltmp = out_nsblk; lltmp = (lltmp * hdr->nbits * out_nchan * out_npol) / 8L; } else if (mode==fold) lltmp = (hdr->nbin * out_nchan * out_npol); fits_modify_vector_len(pf->fptr, 17, lltmp, status); // DATA // Update the TDIM field for the data column if (mode==search) sprintf(ctmp, "(1,%d,%d,%d)", out_nchan, out_npol, out_nsblk); else if (mode==fold) sprintf(ctmp, "(%d,%d,%d,1)", hdr->nbin, out_nchan, out_npol); fits_update_key(pf->fptr, TSTRING, "TDIM17", ctmp, NULL, status); } fits_flush_file(pf->fptr, status); return *status; }
int CDfits_write_subint( int num_cycles, int num_bins, int num_chans, int num_pols ) { int status; int j, k; int nscl, ndata; float x; double dx, dy, dz, ds, dc; int nrows, ncols, col; char *ttype[19], *tform[19], *tunit[19]; long naxes[3]; char Cstr16[16], Estr16[16], Istr16[16]; #define ASTR_LEN 32 char astr[ ASTR_LEN ]; /* BEGIN */ nscl = num_chans * num_pols; ndata = num_bins * nscl; status = 0; /* Increment SUBINT counter and if first SUBINT, write header */ if( ++subint_cnt == 1 ) { /* Add START TIME to primary HDU */ /* Move to primary HDU */ fits_movabs_hdu( cfitsptr, 1, NULL, &status ); if( bat_to_ut_str( astr, ASTR_LEN, newcycle.WBpsr_timer_start_bat ) < 0 ) { return( -9999 ); } astr[10] = '\0'; fits_update_key( cfitsptr, TSTRING, "STT_DATE", astr, "Start UT date (YYYY-MM-DD)", &status); fits_update_key( cfitsptr, TSTRING, "STT_TIME", &astr[11], "Start UT (hh:mm:ss)", &status); bat_to_mjd( &dx, newcycle.WBpsr_timer_start_bat ); dz = modf( dx, &dy ); /* dz = fractional day, dy = days */ j = (int) floor( ( dy + 0.1 ) ); /* Add 0.1d to make sure we get the correct one */ fits_update_key( cfitsptr, TINT, "STT_IMJD", &j, "Start MJD (UTC days) (J)", &status); dy = dz * 86400.0; /* This should be an exact second - timer starts on 1pps */ k = (int) floor( ( dy + 0.1 ) ); /* Add 0.1s to make sure we get the correct one */ fits_update_key( cfitsptr, TINT, "STT_SMJD", &k, "[s] Start time (sec past UTC 00h) (J)", &status); /* Add in offset = 1 - start phase - one bin !!!!!!!!!!! */ /* 9 Jun 2004 - remove one bin offset - wrong !! */ /* Was: dz = 1.0 - modf( newcycle.WBpsr_start_psr_phase, &dx ) - 1.0 / (double) num_bins; dz *= (*c_c).pulsar_period; Now: the offset time is available directly */ dz = newcycle.WBpsr_timer_start_offset_secs; /* Quantise to 128MHz clock cycles */ dz *= 128.0E06; dx = floor( dz ); dx /= 128.0E06; fits_update_key( cfitsptr, TDOUBLE, "STT_OFFS", &dx, "[s] Start time offset (D)", &status); /* LST provided corresponds to integ. start time, i.e. oldcycle.bat */ bat_to_ut_secs( &dy, oldcycle.bat ); dy += dx; dx = scan_start_time_secs - dy; if( dx < -43200.0 ) dx += 86400.0; if( dx > 43200.0 ) dx -= 86400.0; dy = ( ( oldcycle.lst * 86400.0 ) / TwoPi ) + ( dx * 1.002737909350795 ); if( dy < 0.0 ) dy += 86400.0; if( dy > 86400.0 ) dy -= 86400.0; fits_update_key( cfitsptr, TDOUBLE, "STT_LST ", &dy, "[s] Start LST (D)", &status); /* Finished with primary HDU */ /* Move to last created HDU in scan header */ fits_movabs_hdu( cfitsptr, last_scanhdr_hdu, NULL, &status ); /* Create SUBINT BINTABLE */ nrows = 0; /* naxis2 - Let CFITSIO sort this out */ ncols = 19; /* tfields */ ttype[0] = "ISUBINT "; /* Subint number. If NAXIS=-1, 0 indicates EOD. */ tform[0] = "1J "; tunit[0] = ""; ttype[1] = "INDEXVAL"; /* Optionally used if INT_TYPE != TIME */ tform[1] = "1D "; tunit[1] = ""; ttype[2] = "TSUBINT "; /* [s] Length of subintegration */ tform[2] = "1D "; tunit[2] = ""; ttype[3] = "OFFS_SUB"; /* [s] Offset from Start UTC of subint centre */ tform[3] = "1D "; tunit[3] = ""; ttype[4] = "LST_SUB "; /* [s] LST at subint centre */ tform[4] = "1D "; tunit[4] = ""; ttype[5] = "RA_SUB "; /* [turns] RA (J2000) at subint centre */ tform[5] = "1D "; tunit[5] = ""; ttype[6] = "DEC_SUB "; /* [turns] Dec (J2000) at subint centre */ tform[6] = "1D "; tunit[6] = ""; ttype[7] = "GLON_SUB"; /* [deg] Gal longitude at subint centre */ tform[7] = "1D "; tunit[7] = ""; ttype[8] = "GLAT_SUB"; /* [deg] Gal latitude at subint centre */ tform[8] = "1D "; tunit[8] = ""; ttype[9] = "FD_ANG "; /* [deg] Feed angle at subint centre */ tform[9] = "1E "; tunit[9] = ""; ttype[10] = "POS_ANG "; /* [deg] Position angle of feed at subint centre */ tform[10] = "1E "; tunit[10] = ""; ttype[11] = "PAR_ANG "; /* [deg] Parallactic angle at subint centre */ tform[11] = "1E "; tunit[11] = ""; ttype[12] = "TEL_AZ "; /* [deg] Telescope azimuth at subint centre */ tform[12] = "1E "; tunit[12] = ""; ttype[13] = "TEL_ZEN "; /* [deg] Telescope zenith angle at subint centre */ tform[13] = "1E "; tunit[13] = ""; sprintf( Cstr16, "%dE", num_chans ); ttype[14] = "DAT_FREQ"; tform[14] = Cstr16; tunit[14] = ""; ttype[15] = "DAT_WTS "; tform[15] = Cstr16; tunit[15] = ""; sprintf( Estr16, "%dE", nscl ); ttype[16] = "DAT_OFFS"; tform[16] = Estr16; tunit[16] = ""; ttype[17] = "DAT_SCL "; tform[17] = Estr16; tunit[17] = ""; sprintf( Istr16, "%dI", ndata ); ttype[18] = "DATA "; tform[18] = Istr16; tunit[18] = "Jy "; fits_create_tbl( cfitsptr, BINARY_TBL, nrows, ncols, ttype, tform, tunit, "SUBINT ", &status); /* Add dimensions of column 'ncols' = SUBINT Data */ naxes[0] = num_bins; naxes[1] = num_chans; naxes[2] = num_pols; fits_write_tdim( cfitsptr, ncols, 3, naxes, &status ); /* Add keywords */ fits_update_key( cfitsptr, TSTRING, "INT_TYPE", "TIME", "Time axis (TIME, BINPHSPERI, BINLNGASC, etc)", &status); fits_update_key( cfitsptr, TSTRING, "INT_UNIT", "SEC", "Unit of time axis (SEC, PHS (0-1), DEG)", &status); fits_update_key( cfitsptr, TINT, "NCH_FILE", &num_chans, "Number of channels/sub-bands in this file (I)", &status); j = 0; fits_update_key( cfitsptr, TINT, "NCH_STRT", &j, "Start channel/sub-band number (0 to NCHAN-1) (I)", &status); /* Store subint hdu number */ fits_get_hdu_num( cfitsptr, &subint_hdu ); } /* Write SUBINT BINTABLE columns */ /* Fill in columns of table */ col = 1; /* Subint number. If NAXIS=-1, 0 indicates EOD. */ fits_write_col( cfitsptr, TINT, col, subint_cnt, 1, 1, &subint_cnt, &status ); col++; /* INDEXVAL - Optionally used if INT_TYPE != TIME */ dx = 0.0; fits_write_col( cfitsptr, TDOUBLE, col, subint_cnt, 1, 1, &dx, &status ); col++; /* [s] Length of subint */ fits_write_col( cfitsptr, TDOUBLE, col, subint_cnt, 1, 1, &sum_subint_len_secs, &status ); col++; /* [s] Offset from Start UTC of subint centre */ dx = sum_subint_mid_pt / sum_subint_len_secs; fits_write_col( cfitsptr, TDOUBLE, col, subint_cnt, 1, 1, &dx, &status ); col++; /* [s] LST at subint centre */ ds = sum_subint_lst_sin / sum_subint_len_secs; dc = sum_subint_lst_cos / sum_subint_len_secs; if( ( dx = ( atan2( ds, dc ) / TwoPi ) ) < 0.0 ) dx += 1.0; dx *= 86400.0; fits_write_col( cfitsptr, TDOUBLE, col, subint_cnt, 1, 1, &dx, &status ); col++; /* [turns] RA (J2000) at subint centre */ ds = sum_subint_ra_sin / sum_subint_len_secs; dc = sum_subint_ra_cos / sum_subint_len_secs; if( ( dx = ( atan2( ds, dc ) / TwoPi ) ) < 0.0 ) dx += 1.0; fits_write_col( cfitsptr, TDOUBLE, col, subint_cnt, 1, 1, &dx, &status ); col++; /* [turns] Dec (J2000) at subint centre */ ds = sum_subint_dec_sin / sum_subint_len_secs; dc = sum_subint_dec_cos / sum_subint_len_secs; dx = atan2( ds, dc ) / TwoPi; fits_write_col( cfitsptr, TDOUBLE, col, subint_cnt, 1, 1, &dx, &status ); col++; /* [deg] Gal longitude at subint centre */ ds = sum_subint_Glon_sin / sum_subint_len_secs; dc = sum_subint_Glon_cos / sum_subint_len_secs; if( ( dx = ( atan2( ds, dc ) / TwoPi ) ) < 0.0 ) dx += 1.0; dx *= 360.0; fits_write_col( cfitsptr, TDOUBLE, col, subint_cnt, 1, 1, &dx, &status ); col++; /* [deg] Gal latitude at subint centre */ ds = sum_subint_Glat_sin / sum_subint_len_secs; dc = sum_subint_Glat_cos / sum_subint_len_secs; dx = atan2( ds, dc ) * 360.0 / TwoPi; fits_write_col( cfitsptr, TDOUBLE, col, subint_cnt, 1, 1, &dx, &status ); col++; /* [deg] Feed angle at subint centre */ ds = sum_subint_fa_sin / sum_subint_len_secs; dc = sum_subint_fa_cos / sum_subint_len_secs; dx = atan2( ds, dc ) * 360.0 / TwoPi; x = (float) dx; fits_write_col( cfitsptr, TFLOAT, col, subint_cnt, 1, 1, &x, &status ); col++; /* [deg] Parallactic angle at subint centre */ ds = sum_subint_pa_sin / sum_subint_len_secs; dc = sum_subint_pa_cos / sum_subint_len_secs; dy = atan2( ds, dc ) * 360.0 / TwoPi; /* [deg] Position angle of feed at subint centre */ dx = dx + dy; if( dx > 180.0 ) dx -= 360.0; if( dx < 180.0 ) dx += 360.0; x = (float) dx; fits_write_col( cfitsptr, TFLOAT, col, subint_cnt, 1, 1, &x, &status ); col++; /* [deg] Parallactic angle at subint centre */ x = (float) dy; fits_write_col( cfitsptr, TFLOAT, col, subint_cnt, 1, 1, &x, &status ); col++; /* [deg] Telescope azimuth at subint centre */ ds = sum_subint_az_sin / sum_subint_len_secs; dc = sum_subint_az_cos / sum_subint_len_secs; if( ( dx = ( atan2( ds, dc ) / TwoPi ) ) < 0.0 ) dx += 1.0; dx *= 360.0; x = (float) dx; fits_write_col( cfitsptr, TFLOAT, col, subint_cnt, 1, 1, &x, &status ); col++; /* [deg] Telescope zenith angle at subint centre */ ds = sum_subint_el_sin / sum_subint_len_secs; dc = sum_subint_el_cos / sum_subint_len_secs; dx = 90.0 - ( atan2( ds, dc ) * 360.0 / TwoPi ); x = (float) dx; fits_write_col( cfitsptr, TFLOAT, col, subint_cnt, 1, 1, &x, &status ); col++; /* Centre freq. for each channel - NCHAN floats */ fits_write_col( cfitsptr, TFLOAT, col, subint_cnt, 1, num_chans, binned_freq, &status ); col++; /* Weights for each channel - NCHAN floats */ fits_write_col( cfitsptr, TFLOAT, col, subint_cnt, 1, num_chans, binned_weight, &status ); col++; /* Data offset for each channel - NCHAN*NPOL floats */ fits_write_col( cfitsptr, TFLOAT, col, subint_cnt, 1, nscl, binned_offset, &status ); col++; /* Data scale factor for each channel - NCHAN*NPOL floats */ fits_write_col( cfitsptr, TFLOAT, col, subint_cnt, 1, nscl, binned_scale, &status ); col++; /* Subint data table - Dimensions of data table = (NBIN,NCHAN,NPOL) */ fits_write_col( cfitsptr, TSHORT, col, subint_cnt, 1, ndata, binned_data, &status ); col++; /* Finished SUBINT */ #define STEP_BACK #ifdef STEP_BACK /* Move to digitiser statistics */ fits_movabs_hdu( cfitsptr, dig_stats_hdu, NULL, &status ); if( subint_cnt == 1 ) { /* Now we know whether samplers are in fixed or auto mode - Add DIGLEV key */ if( (*c_c).wb_ifsam.freq[0].ant[0].pol[0].sam_status & WBSAM_FIXED ) strcpy( astr, "FIX" ); else strcpy( astr, "AUTO" ); fits_update_key( cfitsptr, TSTRING, "DIGLEV", astr, "Digitiser level-setting mode (AUTO, FIX)", &status); } /* Add data for this subint */ fits_write_col( cfitsptr, TFLOAT, 1, subint_cnt, 1, num_wbsam_stats, wbsam_stats, &status ); /* Move to bandpass */ fits_movabs_hdu( cfitsptr, bpass_hdu, NULL, &status ); /* Overwrite row 1 with latest data */ /* Data offset for each receiver channel - NRCVR floats */ fits_write_col( cfitsptr, TFLOAT, 1, 1, 1, nrcvr, bpass_offset, &status ); /* Data scale factor for each receiver channel - NRCVR floats */ fits_write_col( cfitsptr, TFLOAT, 2, 1, 1, nrcvr, bpass_scale, &status ); /* Bandpass data table - Dimensions of data table = (NCHAN_orig,NRCVR) */ ndata = nchan_orig * nrcvr; fits_write_col( cfitsptr, TSHORT, 3, 1, 1, ndata, bpass_data, &status ); /* Move back to subint HDU for next subint */ fits_movabs_hdu( cfitsptr, subint_hdu, NULL, &status ); #endif /* STEP_BACK */ /* Now FLUSH any internal buffers to the file */ fits_flush_file( cfitsptr, &status ); return( status ); }
int psrfits_write_subint(struct psrfits *pf) { int row, *status, nchan, nivals, mode, out_nbytes, nstat, dummy; float ftmp; struct hdrinfo *hdr; struct subint *sub; hdr = &(pf->hdr); // dereference the ptr to the header struct sub = &(pf->sub); // dereference the ptr to the subint struct status = &(pf->status); // dereference the ptr to the CFITSIO status nchan = hdr->nchan / hdr->ds_freq_fact; nstat = sub->statbytes_per_subint / 2; //stat array is shorts if (hdr->onlyI) nivals = nchan; else nivals = nchan * hdr->npol; mode = psrfits_obs_mode(hdr->obs_mode); if (mode == fold) out_nbytes = sub->bytes_per_subint / hdr->ds_freq_fact; else { out_nbytes = sub->bytes_per_subint / (hdr->ds_freq_fact * hdr->ds_time_fact); if (hdr->onlyI) out_nbytes /= hdr->npol; } // Create the initial file or change to a new one if needed. // Stay with a single file for fold mode. //fprintf(stderr,"In psrfits write, pf->filenum: %d pf->multifile: %d\n",pf->filenum,pf->multifile); //fprintf(stderr,"In psrfits write, pf->rownum %d pf->rows_per_file: %d\n",pf->rownum,pf->rows_per_file); /* if (pf->filenum==0 || ( (mode==search || pf->multifile==1) && pf->rownum > pf->rows_per_file)) { if (pf->filenum) { printf("Closing file '%s'\n", pf->filename); fits_close_file(pf->fptr, status); return *status; } psrfits_create(pf); } */ row = pf->rownum; //fprintf(stderr,"In psrfits write, row: %d\n",row); //fits_read_key(pf->fptr, TINT, "NAXIS2", &dummy, NULL, status); //fprintf(stderr,"In psrfits write, before col writing, NAXIS2: %d status; %d\n",dummy,*status); fprintf(stderr, "tsubint: %f offs_sub: %f\n", sub->tsubint, sub->offs); fits_write_col(pf->fptr, TDOUBLE, 1, row, 1, 1, &(sub->tsubint), status); fits_write_col(pf->fptr, TDOUBLE, 2, row, 1, 1, &(sub->offs), status); fits_write_col(pf->fptr, TDOUBLE, 3, row, 1, 1, &(sub->lst), status); fits_write_col(pf->fptr, TDOUBLE, 4, row, 1, 1, &(sub->ra), status); fits_write_col(pf->fptr, TDOUBLE, 5, row, 1, 1, &(sub->dec), status); fits_write_col(pf->fptr, TDOUBLE, 6, row, 1, 1, &(sub->glon), status); fits_write_col(pf->fptr, TDOUBLE, 7, row, 1, 1, &(sub->glat), status); ftmp = (float) sub->feed_ang; fits_write_col(pf->fptr, TFLOAT, 8, row, 1, 1, &ftmp, status); ftmp = (float) sub->pos_ang; fits_write_col(pf->fptr, TFLOAT, 9, row, 1, 1, &ftmp, status); ftmp = (float) sub->par_ang; fits_write_col(pf->fptr, TFLOAT, 10, row, 1, 1, &ftmp, status); ftmp = (float) sub->tel_az; fits_write_col(pf->fptr, TFLOAT, 11, row, 1, 1, &ftmp, status); ftmp = (float) sub->tel_zen; fits_write_col(pf->fptr, TFLOAT, 12, row, 1, 1, &ftmp, status); fits_write_col(pf->fptr, TFLOAT, 13, row, 1, nchan, sub->dat_freqs, status); fits_write_col(pf->fptr, TFLOAT, 14, row, 1, nchan, sub->dat_weights, status); fits_write_col(pf->fptr, TFLOAT, 15, row, 1, nivals, sub->dat_offsets, status); fits_write_col(pf->fptr, TFLOAT, 16, row, 1, nivals, sub->dat_scales, status); if (mode == search) { // Need to change this for other data types... //fprintf(stderr,"In psrfits write, out_nbytes (data bytes per subint): %d\n",out_nbytes); fits_write_col(pf->fptr, TBYTE, 17, row, 1, out_nbytes, sub->data, status); } else if (mode == fold) { // Fold mode writes floats for now.. fits_write_col(pf->fptr, TFLOAT, 17, row, 1, out_nbytes / sizeof(float), sub->data, status); } /* fprintf(stderr,"In psrfits write, out_nbytes: %d, nchan: %d nivals: %d nstat: %d status: %d\n",out_nbytes,nchan,nivals,nstat,*status); fits_flush_file(pf->fptr, status); fits_read_key(pf->fptr, TINT, "NAXIS2", &dummy, NULL, status); fprintf(stderr,"In psrfits write after 17 column, NAXIS2: %d status; %d\n",dummy,*status); */ fits_write_col(pf->fptr, TSHORT, 18, row, 1, nstat, sub->stat, status); // Flush the buffers if not finished with the file // Note: this use is not entirely in keeping with the CFITSIO // documentation recommendations. However, manually // correcting NAXIS2 and using fits_flush_buffer() // caused occasional hangs (and extrememly large // files due to some infinite loop). fits_flush_file(pf->fptr, status); //NOTE: using flush_file resulted in an extra row for some reason //fits_flush_buffer(pf->fptr,0,status); //fits_read_key(pf->fptr, TINT, "NAXIS2", &dummy, NULL, status); //fprintf(stderr,"In psrfits write, after fits flush, NAXIS2: %d status; %d\n",dummy,*status); // Print status if bad if (*status) { fprintf(stderr, "Error writing subint %d:\n", pf->rownum); fits_report_error(stderr, *status); fflush(stderr); } // Now update some key values if no CFITSIO errors if (!(*status)) { pf->rownum++; pf->tot_rows++; pf->N += hdr->nsblk / hdr->ds_time_fact; pf->T += sub->tsubint; // For fold mode, print info each subint written if (mode == fold && pf->quiet != 1) { printf("Wrote subint %d (total time %.1fs)\n", pf->rownum - 1, pf->T); fflush(stdout); } } //fits_update_key(pf->fptr,TINT,"NAXIS2",&(pf->tot_rows),NULL,status); return *status; }