38 #include "vircam_mods.h"
39 #include "vircam_tfits.h"
40 #include "vircam_wcsutils.h"
41 #include "vircam_utils.h"
42 #include "vircam_stats.h"
61 const char *apcorkeys[NAPCOR] = {
"APCOR1",
"APCOR2",
"APCOR3",
"APCOR4",
"APCOR5",
64 static int gettabinfo(cpl_propertylist *plist, tables *tab,
double *mjdobs);
65 static void tidytabs(tables maintab, tables *tabs);
109 cpl_frameset *input_confs, vir_tfits **outtab,
111 int retval,i,j,m,nrows,*conf_data,k,ix,iy,ind,k2,nc,mjd_day;
112 tables maintab,pawtabs[NPAWS*NEXTN];
113 double *x,*y,*x2,*y2,expon,*dspace,mjdobs;
114 cpl_array *colnames_array;
116 cpl_propertylist *plist;
118 float delta_mag,xmax,ymax,*mjds,*cnumb,*fspace,*fluxcor,*fluxes[NAPCOR+1];
119 float *fluxerrs[NAPCOR+1],work[NEXTN],confwt,scale,*xptr,*yptr,*data;
120 char **colnames,msg[81],sval[81];
121 const char *fluxcols[NAPCOR+1] = {
"Aper_flux_1",
"Aper_flux_2",
122 "Aper_flux_3",
"Aper_flux_4",
123 "Aper_flux_5",
"Aper_flux_6",
124 "Aper_flux_7",
"Peak_height"};
125 const char *errcols[NAPCOR+1] = {
"Aper_flux_1_err",
"Aper_flux_2_err",
126 "Aper_flux_3_err",
"Aper_flux_4_err",
127 "Aper_flux_5_err",
"Aper_flux_6_err",
128 "Aper_flux_7_err",
"Peak_height_err"};
133 if (*status != VIR_OK)
151 for (i = 0; i < NPAWS*NEXTN; i++)
152 pawtabs[i].wcs = NULL;
157 if (retval != VIR_OK) {
165 dspace = cpl_malloc(4*nrows*
sizeof(
double));
168 x2 = dspace + 2*nrows;
169 y2 = dspace + 3*nrows;
173 fspace = cpl_calloc((2+NAPCOR)*nrows,
sizeof(
float));
175 cnumb = fspace + nrows;
176 fluxcor = fspace + 2*nrows;
185 for (i = 0; i < nrows; i++) {
186 x[i] = (double)xptr[i];
187 y[i] = (double)yptr[i];
193 for (i = 0; i < NPAWS; i++) {
194 fr = cpl_frameset_get_frame(input_cats,i);
195 for (j = 0; j < NEXTN; j++) {
196 plist = cpl_propertylist_load(cpl_frame_get_filename(fr),j+1);
197 retval = gettabinfo(plist,&(pawtabs[m]),&mjdobs);
198 if (retval != VIR_OK) {
202 freepropertylist(plist);
205 if (i == 0 && j == 0)
206 mjd_day = (int)mjdobs;
207 pawtabs[m].mjdobs = (float)(1440.0*(mjdobs - (
double)mjd_day));
215 for (i = 0; i < NPAWS; i++) {
216 fr = cpl_frameset_get_frame(input_confs,i);
217 for (j = 0; j < NEXTN; j++) {
221 delta_mag = maintab.magzpt - pawtabs[m].magzpt;
232 xmax = (float)pawtabs[m].nxout - 0.5;
233 ymax = (float)pawtabs[m].nyout;
234 for (k = 0; k < nrows; k++) {
235 if (x2[k] >= 0.5 && x2[k] < xmax &&
236 y2[k] >= 0.5 && y2[k] < ymax) {
237 ix = (int)(x2[k] + 0.5) - 1;
238 iy = (int)(y2[k] + 0.5) - 1;
239 ind = iy*pawtabs[m].nxout + ix;
240 confwt = (float)max(1.0,conf_data[ind]);
241 mjds[k] += confwt*pawtabs[m].mjdobs;
243 for (k2 = 0; k2 < NAPCOR; k2++) {
244 expon = 0.4*(double)(pawtabs[m].apcors[k2] -
245 maintab.apcors[k2] + delta_mag);
246 fluxcor[k2*nrows+k] += confwt*pow(10.0,expon);
256 for (i = 0; i < NAPCOR+1; i++) {
265 for (k = 0; k < nrows; k++) {
266 for (k2 = 0; k2 < NAPCOR; k2++) {
268 scale = fluxcor[k2*nrows+k]/cnumb[k];
271 fluxes[k2][k] *= scale;
272 fluxerrs[k2][k] *= scale;
274 fluxes[NAPCOR][k] *= scale;
275 fluxerrs[NAPCOR][k] *= scale;
287 colnames = cpl_array_get_data_string(colnames_array);
288 nc = cpl_array_get_size(colnames_array);
290 while (i < nc && strncmp(colnames[i],
"Blank",5))
299 memmove(data,mjds,nrows*
sizeof(
float));
301 cpl_array_delete(colnames_array);
306 cpl_propertylist_append_bool(plist,
"ESO DRS GROUTED",1);
307 cpl_propertylist_set_comment(plist,
"ESO DRS GROUTED",
308 "Table has been grouted");
309 cpl_propertylist_append_float(plist,
"MJD_DAY",mjd_day);
310 cpl_propertylist_set_comment(plist,
"MJD_DAY",
"MJD day");
316 for (i = 0; i < NPAWS; i++) {
317 for (j = 0; j < NEXTN; j++)
318 work[j] = pawtabs[m++].magzpt;
320 (void)sprintf(sval,
"%0.3f ",delta_mag);
321 (void)strcat(msg,sval);
323 cpl_propertylist_append_string(plist,
"ESO DRS PAWMAGZP",msg);
324 cpl_propertylist_set_comment(plist,
"ESO DRS PAWMAGZP",
325 "Mag Zpt of input pawprints");
331 for (i = 0; i < NPAWS; i++) {
332 for (j = 0; j < NEXTN; j++)
333 work[j] = pawtabs[m++].ellipt;
335 (void)sprintf(sval,
"%0.3f ",delta_mag);
336 (void)strcat(msg,sval);
338 cpl_propertylist_append_string(plist,
"ESO DRS PAWELLPT",msg);
339 cpl_propertylist_set_comment(plist,
"ESO DRS PAWELLPT",
340 "Median paw ELLIPTIC");
346 for (i = 0; i < NPAWS; i++) {
347 for (j = 0; j < NEXTN; j++)
348 work[j] = pawtabs[m++].
seeing;
350 (void)sprintf(sval,
"%0.3f ",delta_mag);
351 (void)strcat(msg,sval);
353 cpl_propertylist_append_string(plist,
"ESO DRS PAWSEENG",msg);
354 cpl_propertylist_set_comment(plist,
"ESO DRS PAWSEENG",
355 "[arcsec] Median paw SEEING");
361 tidytabs(maintab,pawtabs);
370 static int gettabinfo(cpl_propertylist *plist, tables *tab,
double *mjdobs) {
375 tab->wcs = cpl_wcs_new_from_propertylist(plist);
379 for (i = 0; i < NAPCOR; i++)
380 tab->apcors[i] = cpl_propertylist_get_float(plist,apcorkeys[i]);
384 tab->magzpt = cpl_propertylist_get_float(plist,
"ESO QC MAGZPT");
388 tab->seeing = cpl_propertylist_get_float(plist,
"ESO DRS SEEING");
392 tab->ellipt = cpl_propertylist_get_float(plist,
"ESO QC ELLIPTICITY");
396 *mjdobs = cpl_propertylist_get_float(plist,
"MJD_MEAN");
400 tab->nxout = cpl_propertylist_get_int(plist,
"ESO DRS NXOUT");
401 tab->nyout = cpl_propertylist_get_int(plist,
"ESO DRS NYOUT");
405 static void tidytabs(tables maintab, tables *tabs) {
408 freewcs(maintab.wcs);
409 for (i = 0; i < NEXTN*NPAWS; i++)
410 freewcs(tabs[i].wcs);
cpl_table * vircam_tfits_get_table(vir_tfits *p)
void vircam_xytoxy_list(cpl_wcs *wcs1, cpl_wcs *wcs2, int nc, double *x_1, double *y_1, double *x_2, double *y_2)
int vircam_grout(vir_tfits *intab, cpl_frameset *input_cats, cpl_frameset *input_confs, vir_tfits **outtab, int *status)
Correct input tile catalogues.
cpl_propertylist * vircam_tfits_get_ehu(vir_tfits *p)
vir_tfits * vircam_tfits_duplicate(vir_tfits *in)
cpl_image * vircam_fits_get_image(vir_fits *p)
float vircam_med(float *data, unsigned char *bpm, long npts)
void seeing(ap_t *ap, int nrows, float *ellipt, float *pkht, float **areal, float *work, float *fwhm)
Work out the median seeing.
vir_fits * vircam_fits_load(cpl_frame *frame, cpl_type type, int nexten)