int GetSwitch (Hdr *phdr, char *calswitch, int *flag) { /* arguments: Hdr *phdr i: primary header char *calswitch i: name of keyword (e.g. FLATCORR) int *flag o: value of switch: PERFORM, OMIT, or COMPLETE */ extern int status; FitsKw key; /* keyword location in header */ char *word; /* scratch space for header keyword value */ int streq_ic (char *, char *); /* strings equal? (case insensitive) */ key = findKw (phdr, calswitch); if (key == NotFound) { *flag = OMIT; return (status); } if ((word = (char *) calloc (CHAR_FNAME_LENGTH+1, sizeof(char))) == NULL) return (status = OUT_OF_MEMORY); getStringKw (key, word, CHAR_FNAME_LENGTH); if (hstio_err()) { free (word); sprintf (MsgText, "Error getting keyword `%s'.", calswitch); trlerror (MsgText); return (status = HEADER_PROBLEM); } if (streq_ic (word, "perform")) { *flag = PERFORM; } else if (streq_ic (word, "complete")) { *flag = COMPLETE; } else if (streq_ic (word, "skipped")) { *flag = OMIT; } else if (streq_ic (word, "omit")) { *flag = OMIT; } else { *flag = OMIT; sprintf (MsgText, "Keyword %s = %s is invalid.", calswitch, word); trlerror (MsgText); free (word); return (status = HEADER_PROBLEM); } free (word); return (status); }
int CheckOptimal (StisInfo6 *sts) { if (streq_ic (sts->xtracalg, OPTIMAL)) { if ((sts->pftab.exists == EXISTS_NO) || (sts->pxtab.exists == EXISTS_NO)) { printf ( "ERROR Incomplete set of reference files for optimal extraction.\n"); return (CAL_FILE_MISSING); } } return (0); }
static int GetXDisp (char *name, ScatterFunctions *scf) { /* arguments char *name; i: name of CDSTAB reference file ScatterFunctions *scf; o: data structure with scattering functions */ IRAFPointer tp; IRAFPointer cp_optelem, cp_nelem, cp_cdscat; char opt_elem[STIS_CBUF]; int row, nrows, i; tp = c_tbtopn (name, IRAF_READ_ONLY, 0); if (c_iraferr()) { printf ("ERROR CDSTAB `%s' not found\n", name); return (OPEN_FAILED); } nrows = c_tbpsta (tp, TBL_NROWS); c_tbcfnd1 (tp, "OPT_ELEM", &cp_optelem); c_tbcfnd1 (tp, "NELEM", &cp_nelem); c_tbcfnd1 (tp, "CDSCAT", &cp_cdscat); if (cp_optelem == 0 || cp_nelem == 0 || cp_cdscat == 0) { printf( "ERROR Column not found in CDSTAB\n"); c_tbtclo (tp); return (COLUMN_NOT_FOUND); } for (row = 1; row <= nrows ; row++) { c_tbegtt (tp, cp_optelem, row, opt_elem, STIS_CBUF-1); if (streq_ic (opt_elem, scf->opt_elem)) { c_tbegti (tp, cp_nelem, row, &(scf->nxdisp)); scf->xdisp = (float *) calloc (scf->nxdisp, sizeof (float)); if (scf->xdisp == NULL ) return (OUT_OF_MEMORY); i = c_tbagtr (tp, cp_cdscat, row, scf->xdisp, 1, scf->nxdisp); if (c_iraferr()) return (TABLE_ERROR); c_tbtclo (tp); return (STIS_OK); } } printf( "ERROR Row with %s optical element not found in CDSTAB\n", opt_elem); c_tbtclo (tp); return (ROW_NOT_FOUND); }
int GetAsnTable (AsnInfo *asn) { /* Arguments: ** asn o: Association info structure */ extern int status; /* Local variables */ int i; /* loop index */ int nrows; /* number of rows in ASNTAB */ int col, row; /* loop indexes */ IRAFPointer tp; /* ASNTAB table pointer */ IRAFPointer colptr[NCOLS]; /* ASNTAB column pointers */ int numsp; /* number of sub-products in asn */ int posid; /* id of sub-product */ RowInfo *exp; /* Internal structure for table information */ int *spmems, *expmem; /* number of EXP for each sub-product */ int poslen; /* Length of memtype string minus POSID */ int prodid; /* id of product */ int expid; int defid; /* default position id for exposures */ int procprod; int maxspmems; /* max number of sub-product members */ char *word; Bool proddth; char spname_ext[SZ_CBUF+1]; /* Extension for sub-product */ char spname_ext_cte[SZ_CBUF+1]; /* Extension for sub-product */ char memtype[SZ_COLNAME+1]; char memsubtype[SZ_COLNAME+1]; /* ASNTAB column names */ char colname[NCOLS][SZ_COLNAME+1] = { "MEMNAME", "MEMTYPE", "MEMPRSNT" }; /* Function definitions */ void freeAsnInfo (AsnInfo *); int allocAsnInfo (AsnInfo *, int, int *); void trlopenerr (char *); void trlwarn (char *); char *lowcase (char *, char *); int MkName (char *, char *, char *, char *, char *, int); void initRowInfo (RowInfo *); int streq_ic (char *, char *); /* strings equal? (case insensitive) */ if (asn->debug) { sprintf (MsgText, "GetAsnTable: ASN_TABLE is %s",asn->asn_table); trlmessage (MsgText); } /* Open the ASN table */ tp = c_tbtopn (asn->asn_table, IRAF_READ_ONLY, 0); if (c_iraferr()) { trlopenerr (asn->asn_table); return (status = TABLE_ERROR); } /* Get pointers to columns in ASNTAB */ for (col=0; col < NCOLS; col++) { c_tbcfnd1 (tp, colname[col], &(colptr[col])); if (c_iraferr() || colptr[col] == 0) { sprintf (MsgText, "Can't find column %s in %s", colname[col], asn->asn_table); trlerror (MsgText); c_tbtclo (tp); return (status = COLUMN_NOT_FOUND); } } /* Find out how many rows are in ASNTAB */ nrows = 0; nrows = c_tbpsta (tp, TBL_NROWS); if (nrows <= 0) { sprintf (MsgText, "Invalid number of rows in %s", asn->asn_table); trlerror (MsgText); c_tbtclo (tp); return (status = TABLE_ERROR); } /* Initialize total number of members based on number of ** rows in table */ asn->numasn = nrows; poslen = 0; /* Allocate space for internal variables */ exp = NULL; exp = (RowInfo *)calloc(nrows, sizeof(RowInfo)); for (row = 0; row < nrows; row++) initRowInfo (&(exp[row])); /* Read each row of ASNTAB into a local structure */ for (row = 0; row < nrows; row++) { /* Get the MEMBER NAME in this row */ c_tbegtt (tp, colptr[0], row+1, exp[row].memname, SZ_CBUF); if (c_iraferr()) { sprintf (MsgText, "Can't read %s in row %d in %s", colname[0], row+1, asn->asn_table); trlerror (MsgText); c_tbtclo (tp); free (exp); return (status = ELEMENT_NOT_FOUND); } /* Convert to lowercase for use as a file name */ for (i = 0; i < strlen(exp[row].memname); i++) exp[row].memname[i] = tolower(exp[row].memname[i]); /* Get the TYPE in this row */ c_tbegtt (tp, colptr[1], row+1, exp[row].mtype, SZ_CBUF); if (c_iraferr()) { sprintf (MsgText, "Can't read %s in row %d in %s", colname[1], row+1, asn->asn_table); trlerror (MsgText); c_tbtclo (tp); free (exp); return (status = ELEMENT_NOT_FOUND); } /* Convert to lowercase for use later in routine. ** Also, if a value of MEMTYPE contains a UNDERLINE, then ** record conversion to DASH in trailer file and warn ** user to correct the value. */ lowcase (exp[row].type, exp[row].mtype); for (i = 0; i < strlen(exp[row].type); i++) { if (exp[row].type[i] == UNDERLINE_CHAR) { exp[row].type[i] = DASH_CHAR; sprintf(MsgText, "MEMTYPE %s in row %d was INVALID and needs to be corrected.", exp[row].mtype, row+1); trlwarn(MsgText); } } /* Get the STATUS in this row */ c_tbegtb (tp, colptr[2], row+1, &(exp[row].prsnt)); if (c_iraferr()) { sprintf (MsgText, "Can't read %s in row %d in %s", colname[2], row+1, asn->asn_table); trlerror (MsgText); c_tbtclo (tp); free (exp); return (status = ELEMENT_NOT_FOUND); } if (asn->debug) { sprintf (MsgText, "GetAsnTable: Read in row %d from ASN table", row); trlmessage (MsgText); } } /* ** Determine whether CRCORR or RPTOBS processing will be required ** by searching for MEMTYPE of EXP_CR* or EXP_RPT*, respectively. ** Once it is determined, go on to next step... */ for (row = 0; row < nrows; row++) { /* Check to see if we need to do CR-SPLIT combination ... */ if (strstr (exp[row].type, "-cr") != NULL) { asn->crcorr = PERFORM; asn->rptcorr = OMIT; poslen = CRLEN; break; /* ... or REPEAT-OBS combination ... */ } else if (strstr (exp[row].type, "-rp") != NULL) { asn->rptcorr = PERFORM; asn->crcorr = OMIT; poslen = RPTLEN; break; /* ... or neither at all */ } else { asn->rptcorr = OMIT; asn->crcorr = OMIT; poslen = DTHLEN; } } /* Default to always perform DRIZCORR step */ asn->dthcorr = PERFORM; if (asn->debug) { sprintf (MsgText, "GetAsnTable: CRCORR = %d, RPTCORR = %d", asn->crcorr,asn->rptcorr); trlmessage (MsgText); } /* Sort through the list figuring out which are input vs. output ** files, and see if any input files are missing. */ /* Initialize local variables */ numsp = 0; posid = 0; prodid = 0; proddth = False; defid = 1; /* Find out how many products/sub-products are in the association ** and determine the posid for each member. */ for (row = 0; row < nrows; row++) { memtype[0] = '\0'; memsubtype[0] = '\0'; /* As long as this is not the final product, ** count number of members in each product/sub-product...*/ if (strstr(exp[row].type,"prod-dth") != NULL) { exp[row].posid = 0; posid = 0; /* If we have a dither product listed, we want to eventually ** perform dither combining step... */ prodid++; proddth = True; /* We always want to produce a product, but if ** not set to PERFORM, then create an empty product... */ if (asn->dthcorr == OMIT) asn->dthcorr = DUMMY; } else { strcpy(memtype,exp[row].type); /* Let's start by breaking up the MEMTYPE string */ word = strtok(memtype,"-"); strcpy(memsubtype,word); /* The end of this second part of MEMTYPE has the POSID */ word = strtok(NULL,"\n"); /* If the last character of the memtype is a number or letter, ** convert to an integer value... */ if (streq_ic(word,"crj") || streq_ic(word,"rpt") || streq_ic(word,"crc") ) { posid = 1; } else { if (exp[row].prsnt || streq_ic(memsubtype,"prod")) { if (isalnum(word[poslen])) { /* Interpret the POSID from the second part ** of MEMTYPE */ posid=(int)strtol(&word[poslen],(char **)NULL,10); } else { /* Otherwise, assume it is a different pointing ** and assign an incremented position ID. After ** all, it is NOT a CR-SPLIT or RPT-OBS exposure.*/ posid = defid; defid++; } } } /* Keep track of how many sub-products there are based on ** POSID from MEMTYPE values */ if (posid > numsp) { if ((exp[row].prsnt && (strstr(memtype,"exp") != NULL)) || strstr(memtype,"prod") != NULL) { numsp++; } } exp[row].posid = posid; } if (asn->debug) { sprintf (MsgText, "GetAsnTable: Posid = %d for row %d",posid, row); trlmessage (MsgText); } /* If the member is missing, give a warning */ /* This implies that MEMPRSNT must be set to YES for EXP_* ** This is not fatal for WF3. Simply decrement tmembers. */ if (!exp[row].prsnt && strncmp(exp[row].type, "prod-",5) != 0) { sprintf (MsgText, "Member \"%s\" is not present", exp[row].memname); trlwarn (MsgText); asn->numasn--; /* Now flag row as being absent so it doesn't get passed ** along for further processing... */ exp[row].posid = MEMABSENT; } } if (asn->debug) { sprintf (MsgText, "GetAsnTable: NUMSP = %d, PRODID = %d",numsp, prodid); trlmessage (MsgText); } /* Check for existence of enough data to process */ if (asn->numasn < 1) { trlerror ("No data available for given assoc. table"); freeAsnInfo (asn); return (status = ERROR_RETURN); } /* Record the number of products found in association */ if (proddth) { asn->numprod = prodid; } else { /* If there are no PROD-DTH entries in ASN table, set ** numprod to 1 */ asn->numprod = prodid + 1; } /* Determine what elements should be processed based on ** initial input, either FULL or PARTIAL processing. */ procprod = 0; if (asn->process != FULL) { for (row=0; row < nrows; row++){ /* Look for entry with same name as input */ if (streq_ic(exp[row].memname, asn->rootname)) { /* We only want to process this product */ procprod = exp[row].posid; numsp = 1; } } } /* Allocate space to count number of exposures per sub-product ** with spmems[0] being reserved for final output product ** since POSID starts indexing at 1. */ spmems = (int *)calloc(numsp+1,sizeof(int)); expmem = (int *)calloc(numsp+1,sizeof(int)); /* Initialize arrays */ for (i=0; i <= numsp; i++) { spmems[i] = 0; expmem[i] = 0; } /* For each sub-product, ** identify each EXP that belongs to that posid and ** is present to be processed. */ for (row=0; row < nrows; row++) { if (strstr(exp[row].type, "exp-") && exp[row].posid > MEMABSENT) { if ((asn->process != FULL && exp[row].posid == procprod) || asn->process == FULL) { spmems[exp[row].posid]++; /* Exposure IDs will start at 1 to be consistent ** with POSID numbering. Initialize here, count later. */ expmem[exp[row].posid] = 1; } } } /* Allocate slots for all members in ASN info structure */ if (allocAsnInfo (asn, numsp, spmems)) { return (status = TABLE_ERROR); } asn->product[prodid].prodid = prodid; /* Reset prodid for filling ASN table */ prodid = 0; /* Copy summary information about ASN relationships to ASN structure. */ maxspmems = 0; asn->numsp = numsp; for (i=0; i <= numsp; i++) { asn->spmems[i] = spmems[i]; if (spmems[i] > maxspmems) maxspmems = spmems[i]; } /* If there aren't any sub-products with more than 1 member, then ** omit crcorr/rptcorr processing */ if ((maxspmems < 2) && asn->crcorr == PERFORM) { sprintf (MsgText, "No sub-product with more than 1 member; CRCORR will be skipped"); trlwarn (MsgText); asn->crcorr = DUMMY; } else if ((maxspmems < 2) && asn->rptcorr == PERFORM) { sprintf (MsgText, "No sub-product with more than 1 member; RPTCORR will be skipped"); trlwarn (MsgText); asn->rptcorr = DUMMY; } /* Copy information read-in into ASN structure now... */ for (row = 0; row < nrows; row++) { if (exp[row].posid != MEMABSENT) { if ((asn->process != FULL && exp[row].posid == procprod) || asn->process == FULL) { posid = exp[row].posid; /* Is this row the final product entry? */ if (strstr(exp[row].type, "prod-dth") != NULL) { strcpy (asn->product[prodid].name, exp[row].memname); strcpy (asn->product[prodid].mtype, exp[row].type); asn->product[prodid].prsnt = exp[row].prsnt; asn->product[prodid].numsp = numsp; asn->product[prodid].asnrow = row+1; /* Create full file name for this image */ if (MkName (exp[row].memname, "_raw", "_drz", "", asn->product[prodid].prodname, SZ_LINE)){ strcpy(asn->product[prodid].prodname, exp[row].memname); strcat (asn->product[prodid].prodname, "_drz.fits"); } /* Create full file name for this CTE image */ if (MkName (exp[row].memname, "_rac_tmp", "_drc", "", asn->product[prodid].prodname_cte, SZ_LINE)){ strcpy(asn->product[prodid].prodname_cte, exp[row].memname); strcat (asn->product[prodid].prodname_cte, "_drc.fits"); } /* Or, is this row an input exposure? */ } else if (strstr(exp[row].type, "exp-") != NULL) { if (exp[row].posid > MEMABSENT) { /* Internal counter for which exposure we want for ** a position */ expid = expmem[posid]; strcpy(asn->product[prodid].subprod[posid].exp[expid].name, exp[row].memname); strcpy(asn->product[prodid].subprod[posid].exp[expid].mtype, exp[row].type); asn->product[prodid].subprod[posid].exp[expid].prsnt = exp[row].prsnt; asn->product[prodid].subprod[posid].exp[expid].asnrow= row+1; /* Create full file name for this image */ if (MkName (exp[row].memname, "_raw", "_raw", "", asn->product[prodid].subprod[posid].exp[expid].expname, SZ_LINE)) { strcpy(asn->product[prodid].subprod[posid].exp[expid].expname, exp[row].memname); strcat(asn->product[prodid].subprod[posid].exp[expid].expname, "_raw.fits"); } /* Fill-in sub-product information for EXP-DTH ** exposures which don't create sub-products */ if (strstr(exp[row].type, "exp-dth") != NULL) { if (!MkName (exp[row].memname, "_raw", "_flt", "", asn->product[prodid].subprod[posid].spname, SZ_LINE) ) { strcpy(asn->product[prodid].subprod[posid].name, exp[row].memname); strcpy(asn->product[prodid].subprod[posid].mtype, exp[row].type); asn->product[prodid].subprod[posid].posid = exp[row].posid; } } /* Increment that counter for next exposure's id ** for this posid */ expmem[posid]++; } /* If neither, it must be a sub-product */ } else { if (spmems[posid] > 0) { strcpy(asn->product[prodid].subprod[posid].name, exp[row].memname); strcpy(asn->product[prodid].subprod[posid].mtype, exp[row].type); asn->product[prodid].subprod[posid].prsnt = exp[row].prsnt; asn->product[prodid].subprod[posid].asnrow = row+1; /* Create full file name for this image for ** DTHCORR input */ spname_ext[0] = '\0'; spname_ext_cte[0] = '\0'; if (asn->crcorr || asn->rptcorr) { strcpy (spname_ext, "_crj"); strcpy (spname_ext_cte,"_crc"); } else { strcpy (spname_ext, "_sfl"); strcpy (spname_ext_cte, "_sfl"); } if (MkName (exp[row].memname, "_raw", spname_ext, "", asn->product[prodid].subprod[posid].spname, SZ_LINE)) { strcpy(asn->product[prodid].subprod[posid].spname, exp[row].memname); strcat(asn->product[prodid].subprod[posid].spname, spname_ext); strcat(asn->product[prodid].subprod[posid].spname, ".fits"); } if (MkName (exp[row].memname, "_raw", spname_ext_cte, "", asn->product[prodid].subprod[posid].spname_cte, SZ_LINE)) { strcpy(asn->product[prodid].subprod[posid].spname_cte, exp[row].memname); strcat(asn->product[prodid].subprod[posid].spname_cte, spname_ext_cte); strcat(asn->product[prodid].subprod[posid].spname_cte, ".fits"); } asn->product[prodid].subprod[posid].numexp = spmems[posid]; asn->product[prodid].subprod[posid].posid = posid; } } } } /* Process only those exposures where MEMPRSNT == YES */ } /* Close the ASN table. We are done reading it in. */ c_tbtclo (tp); /* Clean up memory usage as well. */ free (spmems); free (expmem); free (exp); if (asn->debug) { trlmessage ("GetAsnTable: Info from ASN read into memory."); } /* Successful return */ return (status); }
static int GetPSF (char *name, Hdr *phdr, double xsize, double ysize, ScatterFunctions *scf, Image *psf1, Image *psf2, Image *psf3) { /* char *name; i: name of TELTAB reference file Hdr *phdr i: primary header double xsize, ysize; i: aperture size in arcsec ScatterFunctions *scf; o: data structure with scattering functions Image *psf1,2,3; o: PSF images, previously initialized */ IRAFPointer tp; IRAFPointer cp_refwave, cp_pscale, cp_psfdim, cp_telepsf; int row, nrows, psfdim; double rw, psfscale; Image ospsf; Image imtemp, psf; char keyword[STIS_CBUF]; double xplate, yplate; double sbox, lbox; double rstart, rstop; double frac1, frac2; float fhold; double sum; int i, j, k, kk, ms, ml, ns, nl, s, l; int ns2, nl2, s1, s2, l1, l2; int istart, istop; int status; int Alloc1DImage (Image *, int); int Alloc2DImage (Image *, int, int); void InitImage (Image *); void FreeImage (Image *); /* Define plate scale. */ if (streq_ic (scf->opt_elem, "E140M")) xplate = 0.036; else if (streq_ic (scf->opt_elem, "E140H")) xplate = 0.0466; else if (streq_ic (scf->opt_elem, "E230M")) xplate = 0.033; else if (streq_ic (scf->opt_elem, "E230H")) xplate = 0.0466; else { printf ("Non supported grating.\n"); return (ERROR_RETURN); } yplate = 0.029; /* Truncate the aperture size if it extends beyond the borders of an image. */ /* See if uniformly illuminated aperture was used. */ if ((status = Get_KeyS (phdr, "SCLAMP", 0, "", keyword, STIS_CBUF))) return (status); if (!streq_ic (keyword, "NONE")) { ml = (int)floor (ysize / yplate); if (ml % 2) { status = Alloc1DImage (psf1, ml+1); status |= Alloc1DImage (psf2, ml+1); status |= Alloc1DImage (psf3, ml+1); if (status) return (status); for (i = 1; i < ml; i++) { psf1->pix[i] = 1.0 / ml; psf2->pix[i] = 1.0 / ml; psf3->pix[i] = 1.0 / ml; } psf1->pix[0] = 0.5 / ml; psf1->pix[ml] = 0.5 / ml; psf2->pix[0] = 0.5 / ml; psf2->pix[ml] = 0.5 / ml; psf3->pix[0] = 0.5 / ml; psf3->pix[ml] = 0.5 / ml; } else { status = Alloc1DImage (psf1, ml); status |= Alloc1DImage (psf2, ml); status |= Alloc1DImage (psf3, ml); if (status) return (status); for (i = 0; i < ml; i++) { psf1->pix[i] = 1.0 / ml; psf2->pix[i] = 1.0 / ml; psf3->pix[i] = 1.0 / ml; } } return (STIS_OK); } /* Scan reference file and process each PSF. */ tp = c_tbtopn (name, IRAF_READ_ONLY, 0); if (c_iraferr()) { printf ("ERROR TELTAB `%s' not found\n", name); return (OPEN_FAILED); } nrows = c_tbpsta (tp, TBL_NROWS); c_tbcfnd1 (tp, "PSFWAVE", &cp_refwave); c_tbcfnd1 (tp, "PSCALE", &cp_pscale); c_tbcfnd1 (tp, "PSFDIM", &cp_psfdim); c_tbcfnd1 (tp, "TELEPSF", &cp_telepsf); if (cp_refwave == 0 || cp_psfdim == 0 || cp_pscale == 0 || cp_telepsf == 0) { printf( "ERROR Column not found in TELTAB\n"); c_tbtclo (tp); return (COLUMN_NOT_FOUND); } kk = 0; for (row = 1; row <= nrows ; row++) { c_tbegtd (tp, cp_refwave, row, &rw); if (c_iraferr()) return (TABLE_ERROR); /* Matching reference wavelenghts. */ if (rw == scf->psfw[kk]) { /* Read PSF image and associated data. */ c_tbegtd (tp, cp_pscale, row, &psfscale); c_tbegti (tp, cp_psfdim, row, &psfdim); InitImage (&imtemp); if ((status = Alloc2DImage (&imtemp, psfdim, psfdim))) return (status); i = c_tbagtr (tp, cp_telepsf, row, imtemp.pix, 1, imtemp.npix); if (c_iraferr()) return (TABLE_ERROR); /* Find peak. */ ns = imtemp.nx; nl = imtemp.ny; fhold = -FLT_MAX; for (i = 0; i < ns; i++) { for (j = 0; j < nl; j++) { if (PIX (imtemp, i, j) > fhold) { s = i; l = j; fhold = PIX (imtemp, i, j); } } } /* Determine portion of PSF that made it through aperture. */ ns2 = ((int)NINT (xsize / psfscale)) / 2; nl2 = ((int)NINT (ysize / psfscale)) / 2; s1 = ((s - ns2) >= 0) ? (s - ns2) : 0; s2 = ((s + ns2) <= (ns - 1)) ? (s + ns2) : (ns - 1); l1 = ((l - nl2) >= 0) ? (l - nl2) : 0; l2 = ((l + nl2) <= (nl - 1)) ? (l + nl2) : (nl - 1); /* Extract sub-image. */ InitImage (&ospsf); if ((status = Alloc2DImage (&ospsf, s2 - s1 + 1, l2 - l1 + 1))) return (status); k = 0; /* location of braces looks like a typo, but harmless */ for (j = l1; j <= l2; j++) for (i = s1; i <= s2; i++) { ospsf.pix[k++] = PIX (imtemp, i, j); } FreeImage (&imtemp); ns = ospsf.nx; nl = ospsf.ny; /* # of STIS pixels (ms*ml) illuminated by aperture. */ /* modified on 2013 Nov 13 by PEH xplate / psfscale and yplate / psfscale are the factors by which the PSF in the _tel.fits file are oversampled. */ ms = (NINT (ns / (xplate / psfscale))) / 2; ml = (NINT (nl / (yplate / psfscale))) / 2; ms = 2 * ms + 1; ml = 2 * ml + 1; /* Bin oversampled PSF to STIS pixel scale. */ /* Bin columns. */ if ((status = Alloc2DImage (&imtemp, ms, nl))) return (status); sbox = ns / (double)ms; for (i = 0; i < ms; i++) { rstart = i * sbox; rstop = (i+1) * sbox; istart = (int) floor (rstart); istop = (int) floor (rstop); istop = (istop < ns) ? istop : ns-1; frac1 = rstart - istart; frac2 = 1.0 - (rstop - istop); for (j = 0; j < nl; j++) { for (k = istart+1; k < istop; PIX (imtemp, i, j) += PIX (ospsf, k++, j)); PIX (imtemp, i, j) += PIX (ospsf, istart, j) * (1.0 - frac1); PIX (imtemp, i, j) += PIX (ospsf, istop, j) * (1.0 - frac2); } } FreeImage (&ospsf); /* Bin rows. */ InitImage (&psf); if ((status = Alloc2DImage (&psf, ms, ml))) return (status); lbox = nl / (double)ml; for (j = 0; j < ml; j++) { rstart = j * lbox; rstop = (j+1) * lbox; istart = (int) floor (rstart); istop = (int) floor (rstop); istop = (istop < nl) ? istop : nl-1; frac1 = rstart - istart; frac2 = 1.0 - (rstop - istop); for (i = 0; i < ms; i++) { for (k = istart+1; k < istop; PIX (psf, i, j) += PIX (imtemp, i, k++)); PIX (psf, i, j) += PIX (imtemp, i, istart) * (1.0 - frac1); PIX (psf, i, j) += PIX (imtemp, i, istop) * (1.0 - frac2); } } FreeImage (&imtemp); /* Normalize PSF to unit area. */ sum = 0.0; for (i = 0; i < psf.npix; sum += psf.pix[i++]); for (i = 0; i < psf.npix; psf.pix[i++] /= sum); /* This awful code is a consequence of the change in reference file format that took place after the original code was completed. */ switch (kk) { case 0: if ((status = Alloc2DImage (psf1, psf.nx, psf.ny))) return (status); for (i= 0 ; i < psf1->npix; i++) psf1->pix[i] = psf.pix[i]; break; case 1: if ((status = Alloc2DImage (psf2, psf.nx, psf.ny))) return (status); for (i= 0 ; i < psf2->npix; i++) psf2->pix[i] = psf.pix[i]; break; case 2: if ((status = Alloc2DImage (psf3, psf.nx, psf.ny))) return (status); for (i= 0 ; i < psf3->npix; i++) psf3->pix[i] = psf.pix[i]; break; default: break; } FreeImage (&psf); kk++; } } if (kk == 0) { printf ("ERROR No matching rows in TELTAB `%s'\n", name); return (TABLE_ERROR); } c_tbtclo (tp); return (STIS_OK); }
static int GetHalo (char *name, ScatterFunctions *scf, Image *halo1, Image *halo2, Image *halo3) { /* char *name; i: name of HALOTAB reference file ScatterFunctions *scf; o: data structure with scattering functions Image *halo1,2,3; o: halo images, previously initialized */ IRAFPointer tp; IRAFPointer cp_optelem, cp_refwave, cp_haldim, cp_halo; char opt_elem[STIS_CBUF]; int row, nrows, i, status, k, haldim; double rw; int Alloc2DImage (Image *, int, int); tp = c_tbtopn (name, IRAF_READ_ONLY, 0); if (c_iraferr()) { printf ("ERROR HALOTAB `%s' not found\n", name); return (OPEN_FAILED); } nrows = c_tbpsta (tp, TBL_NROWS); c_tbcfnd1 (tp, "OPT_ELEM", &cp_optelem); c_tbcfnd1 (tp, "HALOWAVE", &cp_refwave); c_tbcfnd1 (tp, "HALDIM", &cp_haldim); c_tbcfnd1 (tp, "HALO", &cp_halo); if (cp_optelem == 0 || cp_refwave == 0 || cp_haldim == 0 || cp_halo == 0) { printf( "ERROR Column not found in HALOTAB\n"); c_tbtclo (tp); return (COLUMN_NOT_FOUND); } k = 0; for (row = 1; row <= nrows ; row++) { c_tbegtt (tp, cp_optelem, row, opt_elem, STIS_CBUF-1); c_tbegtd (tp, cp_refwave, row, &rw); if (c_iraferr()) return (TABLE_ERROR); if ((rw == scf->kernw[k]) && (streq_ic (opt_elem, scf->opt_elem))) { c_tbegti (tp, cp_haldim, row, &haldim); /* This awful code is a consequence of the change in reference file format that took place after the original code was completed. */ switch (k) { case 0: if ((status = Alloc2DImage (halo1, haldim, haldim))) return (status); i = c_tbagtr (tp, cp_halo, row, halo1->pix, 1, halo1->npix); if (c_iraferr()) return (TABLE_ERROR); break; case 1: if ((status = Alloc2DImage (halo2, haldim, haldim))) return (status); i = c_tbagtr (tp, cp_halo, row, halo2->pix, 1, halo2->npix); if (c_iraferr()) return (TABLE_ERROR); break; case 2: if ((status = Alloc2DImage (halo3, haldim, haldim))) return (status); i = c_tbagtr (tp, cp_halo, row, halo3->pix, 1, halo3->npix); if (c_iraferr()) return (TABLE_ERROR); break; default: break; } k++; } } if (k == 0) { printf ("ERROR No matching rows in HALOTAB `%s'\n", name); return (TABLE_ERROR); } c_tbtclo (tp); return (STIS_OK); }
static int GetRipple (Hdr *phdr, char *name, ScatterFunctions *scf) { /* arguments Hdr *phdr i: primary header char *name; i: name of RIPTAB reference file ScatterFunctions *scf; o: data structure with ripple functions */ IRAFPointer tp; IRAFPointer cp_optelem, cp_cenwave, cp_sporder, cp_wave, cp_nelem, cp_ripple; char opt_elem[STIS_CBUF]; int row, nrows, i, k, cenwave, status; /* get reference CENWAVE. */ if ((status = Get_KeyI (phdr, "CENWAVE", 0, 0, &cenwave))) return (status); /* Open table and get column pointers. */ tp = c_tbtopn (name, IRAF_READ_ONLY, 0); if (c_iraferr()) { printf ("ERROR RIPTAB `%s' not found\n", name); return (OPEN_FAILED); } c_tbcfnd1 (tp, "OPT_ELEM", &cp_optelem); c_tbcfnd1 (tp, "CENWAVE", &cp_cenwave); c_tbcfnd1 (tp, "SPORDER", &cp_sporder); c_tbcfnd1 (tp, "NELEM", &cp_nelem); c_tbcfnd1 (tp, "WAVELENGTH", &cp_wave); c_tbcfnd1 (tp, "RIPPLE", &cp_ripple); if (cp_cenwave == 0 || cp_sporder == 0 || cp_wave == 0 || cp_ripple == 0 || cp_nelem == 0 || cp_optelem == 0) { printf( "ERROR Column not found in RIPTAB\n"); c_tbtclo (tp); return (COLUMN_NOT_FOUND); } /* Get # of matching rows. */ nrows = c_tbpsta (tp, TBL_NROWS); scf->nrp = 0; for (row = 1; row <= nrows; row++) { c_tbegti (tp, cp_cenwave, row, &i); c_tbegtt (tp, cp_optelem, row, opt_elem, STIS_CBUF-1); if (c_iraferr()) return (TABLE_ERROR); if ((i == cenwave) && (streq_ic (opt_elem, scf->opt_elem))) (scf->nrp)++; } if (scf->nrp == 0) { printf ("ERROR No matching rows in RIPTAB `%s'\n", name); return (TABLE_ERROR); } /* Alloc memory. */ scf->rpfunc = (RippleFunc *) calloc (scf->nrp, sizeof (RippleFunc)); if (scf->rpfunc == NULL) return (OUT_OF_MEMORY); /* Ingest data from matching rows. */ k = 0; for (row = 1; row <= nrows ; row++) { c_tbegti (tp, cp_cenwave, row, &i); c_tbegtt (tp, cp_optelem, row, opt_elem, STIS_CBUF-1); if (c_iraferr()) return (TABLE_ERROR); if ((i == cenwave) && (streq_ic (opt_elem, scf->opt_elem))) { c_tbegti (tp, cp_sporder, row, &(scf->rpfunc[k].sporder)); if (c_iraferr()) return (TABLE_ERROR); scf->rpfunc[k].nelem = c_tbcigi (cp_ripple, TBL_COL_LENDATA); scf->rpfunc[k].wavelengths = (double *) calloc ( scf->rpfunc[k].nelem, sizeof (double)); if (scf->rpfunc[k].wavelengths == NULL) return (OUT_OF_MEMORY); scf->rpfunc[k].values = (double *) calloc ( scf->rpfunc[k].nelem, sizeof (double)); if (scf->rpfunc[k].values == NULL) return (OUT_OF_MEMORY); i = c_tbagtd (tp, cp_wave, row, scf->rpfunc[k].wavelengths, 1, scf->rpfunc[k].nelem); if (c_iraferr()) return (TABLE_ERROR); i = c_tbagtd (tp, cp_ripple, row, scf->rpfunc[k].values, 1, scf->rpfunc[k].nelem); if (c_iraferr()) return (TABLE_ERROR); k++; } } c_tbtclo (tp); return (STIS_OK); }
static int GetRefWave (Hdr *phdr, char *name, ScatterFunctions *scf) { /* arguments Hdr *phdr i: primary header char *name; i: name of SRWTAB reference file ScatterFunctions *scf; o: data structure with reference wavelengths */ IRAFPointer tp; IRAFPointer cp_optelem, cp_cenwave, cp_nrw, cp_hrwlist, cp_prwlist; char opt_elem[STIS_CBUF]; int row, nrows, i, cenwave, status; double holdh[10], holdp[10]; /* holds a maximum of 10 wavelengths */ /* This is necessary to avoid rui warnings from the debugger. */ for (i = 0; i < 10; i++) { holdh[i] = 0.0; holdp[i] = 0.0; } for (i = 0; i <= NREFWAVE; i++) { scf->kernw[i] = 0.0; scf->psfw[i] = 0.0; } /* get reference CENWAVE. */ if ((status = Get_KeyI (phdr, "CENWAVE", 0, 0, &cenwave))) return (status); tp = c_tbtopn (name, IRAF_READ_ONLY, 0); if (c_iraferr()) { printf ("ERROR SRWTAB `%s' not found\n", name); return (OPEN_FAILED); } nrows = c_tbpsta (tp, TBL_NROWS); c_tbcfnd1 (tp, "OPT_ELEM", &cp_optelem); c_tbcfnd1 (tp, "CENWAVE", &cp_cenwave); c_tbcfnd1 (tp, "NRW", &cp_nrw); c_tbcfnd1 (tp, "HALOWAVES", &cp_hrwlist); c_tbcfnd1 (tp, "PSFWAVES", &cp_prwlist); if (cp_optelem == 0 || cp_cenwave == 0 || cp_nrw == 0 || cp_hrwlist == 0 || cp_prwlist == 0) { printf( "ERROR Column not found in SRWTAB\n"); c_tbtclo (tp); return (COLUMN_NOT_FOUND); } scf->nwave = 0; for (row = 1; row <= nrows ; row++) { c_tbegti (tp, cp_cenwave, row, &i); c_tbegtt (tp, cp_optelem, row, opt_elem, STIS_CBUF-1); if (c_iraferr()) return (TABLE_ERROR); if ((i == cenwave) && (streq_ic (opt_elem, scf->opt_elem))) { c_tbegti (tp, cp_nrw, row, &(scf->nwave)); if (c_iraferr()) return (TABLE_ERROR); i = c_tbagtd (tp, cp_hrwlist, row, holdh, 1, scf->nwave); if (c_iraferr()) return (TABLE_ERROR); i = c_tbagtd (tp, cp_prwlist, row, holdp, 1, scf->nwave); if (c_iraferr()) return (TABLE_ERROR); c_tbtclo (tp); scf->kernw[0] = holdh[0]; scf->psfw[0] = holdp[0]; if (scf->nwave > 1) { scf->kernw[1] = holdh[1]; scf->psfw[1] = holdp[1]; } if (scf->nwave > 2) { scf->kernw[2] = holdh[2]; scf->psfw[2] = holdp[2]; } return (STIS_OK); } } printf( "ERROR Row not found in SRWTAB\n"); c_tbtclo (tp); return (ROW_NOT_FOUND); }
static int GetScatter (char *name, ScatterFunctions *scf) { /* arguments char *name; i: name of ECHSCTAB reference file ScatterFunctions *scf; o: data structure with scattering functions */ IRAFPointer tp; IRAFPointer cp_optelem, cp_sporder, cp_nelem, cp_scat; char opt_elem[STIS_CBUF]; int row, nrows, i; tp = c_tbtopn (name, IRAF_READ_ONLY, 0); if (c_iraferr()) { printf ("ERROR ECHSCTAB `%s' not found\n", name); return (OPEN_FAILED); } nrows = c_tbpsta (tp, TBL_NROWS); c_tbcfnd1 (tp, "OPT_ELEM", &cp_optelem); c_tbcfnd1 (tp, "NELEM", &cp_nelem); c_tbcfnd1 (tp, "SPORDER", &cp_sporder); c_tbcfnd1 (tp, "ECHSCAT", &cp_scat); if (cp_optelem == 0 || cp_nelem == 0 || cp_sporder == 0 || cp_scat == 0) { printf( "ERROR Column not found in ECHSCTAB\n"); c_tbtclo (tp); return (COLUMN_NOT_FOUND); } /* This creates some small amount of unused memory but the cost is negligible. */ scf->scfunc = (ScFunc *) calloc (nrows , sizeof (ScFunc)); scf->nsc = 0; for (row = 1; row <= nrows ; row++) { c_tbegtt (tp, cp_optelem, row, opt_elem, STIS_CBUF-1); if (streq_ic (opt_elem, scf->opt_elem)) { c_tbegti (tp, cp_sporder, row, &(scf->scfunc[(scf->nsc)].sporder)); if (c_iraferr()) return (TABLE_ERROR); c_tbegti (tp, cp_nelem, row, &(scf->scfunc[(scf->nsc)].nelem)); if (c_iraferr()) return (TABLE_ERROR); scf->scfunc[(scf->nsc)].values = (double *) calloc ( scf->scfunc[(scf->nsc)].nelem, sizeof (double)); i = c_tbagtd (tp, cp_scat, row, scf->scfunc[(scf->nsc)].values, 1, scf->scfunc[(scf->nsc)].nelem); if (c_iraferr()) return (TABLE_ERROR); (scf->nsc)++; } } c_tbtclo (tp); if (scf->nsc == 0) { printf( "ERROR Row not found in ECHSCTAB\n"); return (ROW_NOT_FOUND); } return (STIS_OK); }