/*
* catout.c
*
* Functions related to catalogue output.
*
*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
*
* This file part of: SExtractor
*
* Copyright: (C) 1993-2023 CFHT/IAP/CNRS/SorbonneU
*
* License: GNU General Public License
*
* SExtractor is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
* SExtractor is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
* You should have received a copy of the GNU General Public License
* along with SExtractor. If not, see .
*
* Last modified: 26/02/2023
*
*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include
#include
#include
#include
#include "define.h"
#include "globals.h"
#include "prefs.h"
#include "fits/fitscat.h"
#include "param.h"
#include "sexhead.h"
#include "sexhead1.h"
#include "sexheadsc.h"
#include "xml.h"
objstruct outobj, flagobj;
obj2struct outobj2, flagobj2;
catstruct *fitscat;
tabstruct *objtab = NULL;
FILE *ascfile;
char *buf;
int catopen_flag = 0;
double ddummy;
int idummy;
/******************************* readcatparams *******************************/
/*
Read the catalog config file
*/
void readcatparams(char *filename)
{
keystruct *key;
FILE *infile;
char str[MAXCHAR], *keyword, *sstr;
int i, size;
/* Prepare the OBJECTS tables*/
objtab = new_tab("OBJECTS");
if ((infile = fopen(filename,"r")) == NULL)
error(EXIT_FAILURE, "*ERROR*: can't read ", filename);
/* Scan the catalog config file*/
thecat.nparam = 0;
while (fgets(str, MAXCHAR, infile))
{
sstr = str + strspn(str," \t");
if (*sstr!=(char)'#' && *sstr!=(char)'\n')
{
keyword = strtok(sstr, " \t{[(\n\r");
if (keyword &&
(i = findkey(keyword,(char *)objkey,sizeof(keystruct)))!=RETURN_ERROR)
{
key = objkey+i;
if (add_key(key, objtab, 0) != RETURN_ERROR)
thecat.nparam++;
*((char *)key->ptr) = (char)'\1';
if (key->naxis)
{
for (i=0; inaxis; i++)
key->naxisn[i] = 1;
size=t_size[key->ttype];
for (i=0; (sstr = strtok(NULL, " \t,;.)]}\r")) && *sstr!=(char)'#'
&& *sstr!=(char)'\n'; i++)
{
if (i>=key->naxis)
error(EXIT_FAILURE, "*Error*: too many dimensions for keyword ",
keyword);
if (!(size*=(key->naxisn[i]=atoi(sstr))))
error(EXIT_FAILURE, "*Error*: wrong array syntax for keyword ",
keyword);
}
key->nbytes = size;
}
}
else
warning(keyword, " catalog parameter unknown");
}
}
fclose(infile);
/* Now we copy the flags to the proper structures */
flagobj = outobj;
flagobj2 = outobj2;
/* Differentiate between outobj and outobj2 vectors */
memset(&outobj2, 0, sizeof(outobj2));
updateparamflags();
return;
}
/******************************* alloccatparams ******************************/
/*
Allocate memory for parameter arrays
*/
void alloccatparams(void)
{
keystruct *key;
int i;
/* Go back to multi-dimensional arrays for memory allocation */
if (thecat.nparam)
for (i=objtab->nkey, key=objtab->key; i--; key = key->nextkey)
if (key->naxis)
{
/*------ Only outobj2 vectors are dynamic */
if (!*((char **)key->ptr))
{
QMALLOC(*((char **)key->ptr), char, key->nbytes);
key->ptr = *((char **)key->ptr);
key->allocflag = 1;
}
}
return;
}
/*************************** changecatparamarrays ****************************/
/*
Change parameter array dimensions
*/
void changecatparamarrays(char *keyword, int *axisn, int naxis)
{
keystruct *key;
int d,i, size;
if (thecat.nparam)
for (i=objtab->nkey, key=objtab->key; i--; key = key->nextkey)
if (key->naxis && !strcmp(keyword, key->name))
{
size = t_size[key->ttype];
if (key->naxis != naxis)
key->naxis = naxis;
for (d=0; dnaxisn[d]=axisn[d]);
key->nbytes = size;
break;
}
return;
}
/***************************** updateparamflags ******************************/
/*
Update parameter flags according to their mutual dependencies.
*/
void updateparamflags()
{
int i;
/*----------------------------- Model-fitting -----------------------------*/
prefs.pattern_flag |= FLAG(obj2.prof_disk_patternvector)
| FLAG(obj2.prof_disk_patternmodvector)
| FLAG(obj2.prof_disk_patternargvector)
| FLAG(obj2.prof_disk_patternspiral);
FLAG(obj2.prof_disk_scale) |= prefs.pattern_flag;
FLAG(obj2.prof_concentration) |= FLAG(obj2.prof_concentrationerr);
FLAG(obj2.fluxcorerr_prof) |= FLAG(obj2.magcorerr_prof);
FLAG(obj2.fluxcor_prof) |= FLAG(obj2.magcor_prof)
| FLAG(obj2.fluxcorerr_prof);
FLAG(obj2.poserraw_prof) |= FLAG(obj2.poserrbw_prof);
FLAG(obj2.poserrcxxw_prof) |= FLAG(obj2.poserrcyyw_prof)
| FLAG(obj2.poserrcxyw_prof);
FLAG(obj2.poserrthetas_prof) |= FLAG(obj2.poserrtheta1950_prof)
| FLAG(obj2.poserrtheta2000_prof);
FLAG(obj2.poserrthetaw_prof) |= FLAG(obj2.poserrthetas_prof);
FLAG(obj2.poserrmx2w_prof) |= FLAG(obj2.poserrmy2w_prof)
| FLAG(obj2.poserrmxyw_prof)
| FLAG(obj2.poserrthetaw_prof)|FLAG(obj2.poserraw_prof)
| FLAG(obj2.poserrcxxw_prof);
FLAG(obj2.poserra_prof) |= FLAG(obj2.poserrb_prof)
| FLAG(obj2.poserrtheta_prof)
| FLAG(obj2.poserraw_prof);
FLAG(obj2.poserrcxx_prof) |= FLAG(obj2.poserrcyy_prof)
| FLAG(obj2.poserrcxy_prof);
FLAG(obj2.poserrmx2_prof) |= FLAG(obj2.poserrmy2_prof)
| FLAG(obj2.poserrmxy_prof)
| FLAG(obj2.poserrmx2w_prof);
FLAG(obj2.alpha1950_prof) |= FLAG(obj2.delta1950_prof)
| FLAG(obj2.poserrtheta1950_prof);
FLAG(obj2.alpha2000_prof) |= FLAG(obj2.delta2000_prof)
| FLAG(obj2.alpha1950_prof)
| FLAG(obj2.poserrtheta2000_prof);
FLAG(obj2.alphas_prof) |= FLAG(obj2.deltas_prof)
| FLAG(obj2.alpha2000_prof);
FLAG(obj2.xw_prof) |= FLAG(obj2.yw_prof)
| FLAG(obj2.alphas_prof);
FLAG(obj2.xf_prof) |= FLAG(obj2.yf_prof);
FLAG(obj2.x_prof) |= FLAG(obj2.y_prof)
| FLAG(obj2.xw_prof)
| FLAG(obj2.xf_prof)
| FLAG(obj2.poserra_prof)
| FLAG(obj2.poserrcxx_prof)
| FLAG(obj2.poserrmx2_prof)
| FLAG(obj2.prof_concentration)
| FLAG(obj2.prof_class_star)
| FLAG(obj2.fluxcor_prof);
FLAG(obj2.prof_dirac_fluxratio) |= FLAG(obj2.prof_dirac_fluxratioerr);
FLAG(obj2.prof_dirac_mag) |= FLAG(obj2.prof_dirac_magerr);
FLAG(obj2.prof_spheroid_fluxratio) |= FLAG(obj2.prof_spheroid_fluxratioerr);
FLAG(obj2.prof_spheroid_mag) |= FLAG(obj2.prof_spheroid_magerr);
FLAG(obj2.prof_spheroid_reff) |= FLAG(obj2.prof_spheroid_refferr);
FLAG(obj2.prof_spheroid_aspect) |= FLAG(obj2.prof_spheroid_aspecterr);
FLAG(obj2.prof_spheroid_theta) |= FLAG(obj2.prof_spheroid_thetaerr);
FLAG(obj2.prof_spheroid_sersicn) |= FLAG(obj2.prof_spheroid_sersicnerr);
FLAG(obj2.prof_disk_fluxratio) |= FLAG(obj2.prof_disk_fluxratioerr);
FLAG(obj2.prof_disk_mag) |= FLAG(obj2.prof_disk_magerr);
FLAG(obj2.prof_disk_scale) |= FLAG(obj2.prof_disk_scaleerr);
FLAG(obj2.prof_disk_aspect) |= FLAG(obj2.prof_disk_aspecterr);
FLAG(obj2.prof_disk_inclination) |= FLAG(obj2.prof_disk_inclinationerr);
FLAG(obj2.prof_disk_theta) |= FLAG(obj2.prof_disk_thetaerr);
FLAG(obj2.prof_bar_fluxratio) |= FLAG(obj2.prof_bar_fluxratioerr);
FLAG(obj2.prof_bar_mag) |= FLAG(obj2.prof_bar_magerr);
FLAG(obj2.prof_bar_length) |= FLAG(obj2.prof_bar_lengtherr);
FLAG(obj2.prof_bar_aspect) |= FLAG(obj2.prof_bar_aspecterr);
FLAG(obj2.prof_bar_theta) |= FLAG(obj2.prof_bar_thetaerr);
FLAG(obj2.prof_arms_fluxratio) |= FLAG(obj2.prof_arms_fluxratioerr);
FLAG(obj2.prof_arms_mag) |= FLAG(obj2.prof_arms_magerr);
FLAG(obj2.prof_e1errw) |= FLAG(obj2.prof_e2errw) | FLAG(obj2.prof_e12corrw);
FLAG(obj2.prof_e1w) |= FLAG(obj2.prof_e2w) | FLAG(obj2.prof_e1errw);
FLAG(obj2.prof_pol1errw) |= FLAG(obj2.prof_pol2errw)
| FLAG(obj2.prof_pol12corrw);
FLAG(obj2.prof_pol1w) |= FLAG(obj2.prof_pol2w) | FLAG(obj2.prof_pol1errw);
FLAG(obj2.prof_aw) |= FLAG(obj2.prof_bw);
FLAG(obj2.prof_cxxw) |= FLAG(obj2.prof_cyyw) | FLAG(obj2.prof_cxyw);
FLAG(obj2.prof_thetas) |= FLAG(obj2.prof_theta1950)
| FLAG(obj2.prof_theta2000);
FLAG(obj2.prof_thetaw) |= FLAG(obj2.prof_thetas);
FLAG(obj2.prof_mx2w) |= FLAG(obj2.prof_my2w)
| FLAG(obj2.prof_mxyw)
| FLAG(obj2.prof_thetaw) | FLAG(obj2.prof_aw)
| FLAG(obj2.prof_cxxw)
| FLAG(obj2.prof_e1w) | FLAG(obj2.prof_pol1w);
FLAG(obj2.dtheta1950) |= FLAG(obj2.prof_theta1950)
| FLAG(obj2.prof_spheroid_theta1950)
| FLAG(obj2.prof_disk_theta1950)
// | FLAG(obj2.prof_arms_theta1950)
| FLAG(obj2.prof_bar_theta1950)
| FLAG(obj2.poserrtheta1950_psf)
| FLAG(obj2.win_theta1950)
| FLAG(obj2.winposerr_theta1950)
| FLAG(obj2.poserr_theta1950)
| FLAG(obj2.theta1950)
| FLAG(obj2.poserrtheta1950_prof);
FLAG(obj2.dtheta2000) |= FLAG(obj2.prof_theta2000)
| FLAG(obj2.prof_spheroid_theta2000)
| FLAG(obj2.prof_disk_theta2000)
// | FLAG(obj2.prof_arms_theta2000)
| FLAG(obj2.prof_bar_theta2000)
| FLAG(obj2.poserrtheta2000_psf)
| FLAG(obj2.win_theta2000)
| FLAG(obj2.winposerr_theta2000)
| FLAG(obj2.poserr_theta2000)
| FLAG(obj2.theta2000)
| FLAG(obj2.poserrtheta2000_prof);
FLAG(obj2.prof_spheroid_thetas) |= FLAG(obj2.prof_spheroid_theta2000)
| FLAG(obj2.prof_spheroid_theta1950);
FLAG(obj2.prof_spheroid_thetaw) |= FLAG(obj2.prof_spheroid_thetas);
FLAG(obj2.prof_disk_thetas) |= FLAG(obj2.prof_disk_theta2000)
| FLAG(obj2.prof_disk_theta1950);
FLAG(obj2.prof_disk_thetaw) |= FLAG(obj2.prof_disk_thetas);
FLAG(obj2.prof_bar_thetas) |= FLAG(obj2.prof_bar_theta2000)
| FLAG(obj2.prof_bar_theta1950);
FLAG(obj2.prof_bar_thetaw) |= FLAG(obj2.prof_bar_thetas);
/*
FLAG(obj2.prof_arms_thetaw) |= FLAG(obj2.prof_arms_thetas)
| FLAG(obj2.prof_arms_theta2000)
| FLAG(obj2.prof_arms_theta1950);
*/
FLAG(obj2.prof_arms_scalew) |= FLAG(obj2.prof_arms_startw)
| FLAG(obj2.prof_arms_scaleerrw)
| FLAG(obj2.prof_arms_starterrw);
FLAG(obj2.prof_bar_lengthw) |= FLAG(obj2.prof_bar_aspectw)
| FLAG(obj2.prof_bar_thetaw)
| FLAG(obj2.prof_bar_lengtherrw)
| FLAG(obj2.prof_bar_aspecterrw)
| FLAG(obj2.prof_bar_thetaerrw);
FLAG(obj2.prof_disk_scalew) |= FLAG(obj2.prof_disk_aspectw)
| FLAG(obj2.prof_disk_thetaw)
| FLAG(obj2.prof_disk_scaleerrw)
| FLAG(obj2.prof_disk_aspecterrw)
| FLAG(obj2.prof_disk_thetaerrw)
| FLAG(obj2.prof_arms_scalew);
FLAG(obj2.prof_disk_fluxmean) |= FLAG(obj2.prof_disk_mumean);
FLAG(obj2.prof_disk_fluxeff) |= FLAG(obj2.prof_disk_mueff);
FLAG(obj2.prof_disk_peak) |= FLAG(obj2.prof_disk_mumax)
| FLAG(obj2.prof_disk_fluxeff)
| FLAG(obj2.prof_disk_fluxmean);
FLAG(obj2.prof_spheroid_reffw) |= FLAG(obj2.prof_spheroid_aspectw)
| FLAG(obj2.prof_spheroid_thetaw)
| FLAG(obj2.prof_spheroid_refferrw)
| FLAG(obj2.prof_spheroid_aspecterrw)
| FLAG(obj2.prof_spheroid_thetaerrw);
FLAG(obj2.prof_spheroid_fluxmean) |= FLAG(obj2.prof_spheroid_mumean);
FLAG(obj2.prof_spheroid_fluxeff) |= FLAG(obj2.prof_spheroid_mueff);
FLAG(obj2.prof_spheroid_peak) |= FLAG(obj2.prof_spheroid_mumax)
| FLAG(obj2.prof_spheroid_fluxeff)
| FLAG(obj2.prof_spheroid_fluxmean);
FLAG(obj2.prof_flagw) |= FLAG(obj2.prof_spheroid_reffw)
| FLAG(obj2.prof_disk_scalew)
| FLAG(obj2.prof_bar_lengthw)
| FLAG(obj2.prof_arms_scalew)
| FLAG(obj2.prof_mx2w);
FLAG(obj2.prof_e1err) |= FLAG(obj2.prof_e2err) | FLAG(obj2.prof_e12corr)
| FLAG(obj2.prof_e1errw);
FLAG(obj2.prof_e1) |= FLAG(obj2.prof_e2)
| FLAG(obj2.prof_e1err) | FLAG(obj2.prof_e1w);
FLAG(obj2.prof_pol1err) |= FLAG(obj2.prof_pol2err)
| FLAG(obj2.prof_pol12corr) | FLAG(obj2.prof_pol1errw);
FLAG(obj2.prof_pol1) |= FLAG(obj2.prof_pol2)
| FLAG(obj2.prof_pol1err) | FLAG(obj2.prof_pol1w);
FLAG(obj2.prof_a) |= FLAG(obj2.prof_b) | FLAG(obj2.prof_theta)
| FLAG(obj2.prof_aw);
FLAG(obj2.prof_cxx) |= FLAG(obj2.prof_cyy)
| FLAG(obj2.prof_cxy) | FLAG(obj2.prof_cxxw);
FLAG(obj2.prof_mx2) |= FLAG(obj2.prof_my2) | FLAG(obj2.prof_mxy)
| FLAG(obj2.prof_e1) | FLAG(obj2.prof_pol1)
| FLAG(obj2.prof_a) | FLAG(obj2.prof_cxx)
| FLAG(obj2.prof_mx2w);
FLAG(obj2.prof_conva) |= FLAG(obj2.prof_convb) | FLAG(obj2.prof_convtheta);
FLAG(obj2.prof_convcxx) |= FLAG(obj2.prof_convcyy)
/*| FLAG(obj2.fluxcor_prof) */;
FLAG(obj2.prof_convmx2) |= FLAG(obj2.prof_convcxx) | FLAG(obj2.prof_conva);
FLAG(obj2.fluxmean_prof) |= FLAG(obj2.mumean_prof);
FLAG(obj2.peak_prof) |= FLAG(obj2.mumax_prof);
FLAG(obj2.fluxeff_prof) |= FLAG(obj2.mueff_prof)
| FLAG(obj2.fluxmean_prof) | FLAG(obj2.peak_prof);
FLAG(obj2.prof_arms_flux) |= FLAG(obj2.prof_arms_fluxerr)
| FLAG(obj2.prof_arms_mag)
| FLAG(obj2.prof_arms_fluxratio)
| FLAG(obj2.prof_arms_scalew)
| FLAG(obj2.prof_arms_scale)
| FLAG(obj2.prof_arms_posang)
| FLAG(obj2.prof_arms_pitch)
| FLAG(obj2.prof_arms_start)
| FLAG(obj2.prof_arms_quadfrac);
FLAG(obj2.prof_bar_theta) |= FLAG(obj2.prof_bar_lengthw);
FLAG(obj2.prof_bar_flux) |= FLAG(obj2.prof_bar_fluxerr)
| FLAG(obj2.prof_bar_mag)
| FLAG(obj2.prof_bar_fluxratio)
| FLAG(obj2.prof_bar_lengthw)
| FLAG(obj2.prof_bar_length)
| FLAG(obj2.prof_bar_aspect)
| FLAG(obj2.prof_bar_posang)
| FLAG(obj2.prof_bar_theta)
| FLAG(obj2.prof_arms_flux);
FLAG(obj2.prof_disk_flux) |= FLAG(obj2.prof_disk_fluxerr)
| FLAG(obj2.prof_disk_mag)
| FLAG(obj2.prof_disk_fluxratio)
| FLAG(obj2.prof_disk_scalew)
| FLAG(obj2.prof_disk_scale)
| FLAG(obj2.prof_disk_aspect)
| FLAG(obj2.prof_disk_inclination)
| FLAG(obj2.prof_disk_theta)
| FLAG(obj2.prof_disk_peak)
| FLAG(obj2.prof_bar_flux);
FLAG(obj2.prof_spheroid_flux) |= FLAG(obj2.prof_spheroid_fluxerr)
| FLAG(obj2.prof_spheroid_mag)
| FLAG(obj2.prof_spheroid_fluxratio)
| FLAG(obj2.prof_spheroid_reffw)
| FLAG(obj2.prof_spheroid_reff)
| FLAG(obj2.prof_spheroid_aspect)
| FLAG(obj2.prof_spheroid_theta)
| FLAG(obj2.prof_spheroid_sersicn)
| FLAG(obj2.prof_spheroid_peak);
FLAG(obj2.prof_dirac_flux) |= FLAG(obj2.prof_dirac_fluxerr)
| FLAG(obj2.prof_dirac_mag)
| FLAG(obj2.prof_dirac_fluxratio);
FLAG(obj2.prof_offset_flux) |= FLAG(obj2.prof_offset_fluxerr);
FLAG(obj2.fluxerr_dprof) |= FLAG(obj2.magerr_dprof);
FLAG(obj2.flux_dprof) |= FLAG(obj2.mag_dprof)
| FLAG(obj2.fluxerr_dprof);
prefs.dprof_flag |= FLAG(obj2.dprof_chi2)
| FLAG(obj2.dprof_flag)
| FLAG(obj2.dprof_niter)
| FLAG(obj2.flux_dprof);
FLAG(obj2.fluxerr_prof) |= FLAG(obj2.magerr_prof)
| FLAG(obj2.prof_concentrationerr)
| FLAG(obj2.fluxcorerr_prof)
| FLAG(obj2.prof_arms_fluxratio)
| FLAG(obj2.prof_bar_fluxratio)
| FLAG(obj2.prof_disk_fluxratio)
| FLAG(obj2.prof_spheroid_fluxratio)
| FLAG(obj2.prof_dirac_fluxratio);
FLAG(obj2.flux_prof) |= FLAG(obj2.mag_prof)
| FLAG(obj2.fluxerr_prof)
| FLAG(obj2.fluxcor_prof);
prefs.prof_flag |= FLAG(obj2.prof_chi2) | FLAG(obj2.prof_niter)
| FLAG(obj2.prof_vector) | FLAG(obj2.prof_errvector)
| FLAG(obj2.prof_errmatrix)
| FLAG(obj2.x_prof) | FLAG(obj2.y_prof)
| FLAG(obj2.prof_flag)
| FLAG(obj2.flux_prof)
| FLAG(obj2.prof_mx2)
| FLAG(obj2.fluxeff_prof)
| FLAG(obj2.prof_disk_flux)
| FLAG(obj2.prof_spheroid_flux)
| FLAG(obj2.prof_dirac_flux)
| FLAG(obj2.prof_offset_flux)
| prefs.dprof_flag;
/* If only global parameters are requested, fit a Sersic model */
if (prefs.prof_flag && !(FLAG(obj2.prof_spheroid_flux)
| FLAG(obj2.prof_disk_flux)
| FLAG(obj2.prof_dirac_flux)
| FLAG(obj2.prof_offset_flux)))
{
FLAG(obj2.prof_spheroid_flux) |= prefs.prof_flag;
FLAG(obj2.prof_spheroid_sersicn) |= prefs.prof_flag;
}
/*------------------------------ Astrometry ---------------------------------*/
FLAG(obj2.win_aw) |= FLAG(obj2.win_bw) | FLAG(obj2.win_polarw);
FLAG(obj2.win_cxxw) |= FLAG(obj2.win_cyyw) | FLAG(obj2.win_cxyw);
FLAG(obj2.win_thetas) |= FLAG(obj2.win_theta1950)
| FLAG(obj2.win_theta2000);
FLAG(obj2.win_thetaw) |= FLAG(obj2.win_thetas);
FLAG(obj2.win_mx2w) |= FLAG(obj2.win_my2w)
| FLAG(obj2.win_mxyw)
| FLAG(obj2.win_thetaw) | FLAG(obj2.win_aw)
| FLAG(obj2.win_cxxw);
FLAG(obj2.win_a) |= FLAG(obj2.win_b) | FLAG(obj2.win_theta)
| FLAG(obj2.win_polar) | FLAG(obj2.win_aw);
FLAG(obj2.win_cxx) |= FLAG(obj2.win_cyy)
| FLAG(obj2.win_cxy) | FLAG(obj2.win_cxxw);
FLAG(obj2.win_mx2) |= FLAG(obj2.win_my2)
| FLAG(obj2.win_mxy)
| FLAG(obj2.win_a) | FLAG(obj2.win_cxx)
| FLAG(obj2.win_mx2w);
FLAG(obj2.winposerr_aw) |= FLAG(obj2.winposerr_bw);
FLAG(obj2.winposerr_cxxw) |= FLAG(obj2.winposerr_cyyw)
| FLAG(obj2.winposerr_cxyw);
FLAG(obj2.winposerr_thetas) |= FLAG(obj2.winposerr_theta1950)
| FLAG(obj2.winposerr_theta2000);
FLAG(obj2.winposerr_thetaw) |= FLAG(obj2.winposerr_thetas);
FLAG(obj2.winposerr_mx2w) |= FLAG(obj2.winposerr_my2w)
| FLAG(obj2.winposerr_mxyw)
| FLAG(obj2.winposerr_thetaw) | FLAG(obj2.winposerr_aw)
| FLAG(obj2.winposerr_cxxw);
FLAG(obj2.winposerr_a) |= FLAG(obj2.winposerr_b) | FLAG(obj2.winposerr_theta);
FLAG(obj2.winposerr_cxx) |= FLAG(obj2.winposerr_cyy)
| FLAG(obj2.winposerr_cxy);
FLAG(obj2.winposerr_mx2) |= FLAG(obj2.winposerr_my2)
| FLAG(obj2.winposerr_mxy)
| FLAG(obj2.winposerr_a) | FLAG(obj2.winposerr_cxx)
| FLAG(obj2.winposerr_mx2w);
FLAG(obj2.winpos_alpha1950) |= FLAG(obj2.winpos_delta1950)
| FLAG(obj2.win_theta1950)
| FLAG(obj2.winposerr_theta1950);
FLAG(obj2.winpos_alpha2000) |= FLAG(obj2.winpos_delta2000)
| FLAG(obj2.winpos_alpha1950)
| FLAG(obj2.win_theta2000)
| FLAG(obj2.winposerr_theta2000);
FLAG(obj2.winpos_alphas) |= FLAG(obj2.winpos_deltas)
| FLAG(obj2.winpos_alpha2000);
FLAG(obj2.winpos_xf) |= FLAG(obj2.winpos_yf);
FLAG(obj2.winpos_xw) |= FLAG(obj2.winpos_yw)
| FLAG(obj2.winpos_alphas);
FLAG(obj2.poserr_aw) |= FLAG(obj2.poserr_bw);
FLAG(obj2.poserr_cxxw) |= FLAG(obj2.poserr_cyyw) | FLAG(obj2.poserr_cxyw);
FLAG(obj2.poserr_thetas) |= FLAG(obj2.poserr_theta1950)
| FLAG(obj2.poserr_theta2000);
FLAG(obj2.poserr_thetaw) |= FLAG(obj2.poserr_thetas);
FLAG(obj2.poserr_mx2w) |= FLAG(obj2.poserr_my2w) | FLAG(obj2.poserr_mxyw)
| FLAG(obj2.poserr_thetaw) | FLAG(obj2.poserr_aw)
| FLAG(obj2.poserr_cxxw);
FLAG(obj2.poserr_a) |= FLAG(obj2.poserr_b) | FLAG(obj2.poserr_theta)
| FLAG(obj2.winposerr_a);
FLAG(obj2.poserr_cxx) |= FLAG(obj2.poserr_cyy) | FLAG(obj2.poserr_cxy);
FLAG(obj.poserr_mx2) |= FLAG(obj.poserr_my2) | FLAG(obj.poserr_mxy)
| FLAG(obj2.poserr_a) | FLAG(obj2.poserr_cxx)
| FLAG(obj2.poserr_mx2w) | FLAG(obj2.winposerr_mx2);
FLAG(obj2.peakalpha1950) |= FLAG(obj2.peakdelta1950);
FLAG(obj2.alpha1950) |= FLAG(obj2.delta1950) | FLAG(obj2.theta1950)
| FLAG(obj2.poserr_theta1950) | FLAG(obj2.dtheta1950);
;
FLAG(obj2.peakalpha2000) |= FLAG(obj2.peakdelta2000)
| FLAG(obj2.peakalpha1950);
FLAG(obj2.alpha2000) |= FLAG(obj2.delta2000) | FLAG(obj2.alpha1950)
| FLAG(obj2.dtheta2000);
FLAG(obj2.peakalphas) |= FLAG(obj2.peakdeltas) | FLAG(obj2.peakalpha2000);
FLAG(obj2.alphas) |= FLAG(obj2.deltas) | FLAG(obj2.alpha2000);
FLAG(obj2.thetas) |= FLAG(obj2.theta1950) | FLAG(obj2.theta2000);
FLAG(obj2.thetaw) |= FLAG(obj2.thetas);
FLAG(obj2.aw) |= FLAG(obj2.bw) | FLAG(obj2.polarw);
FLAG(obj2.cxxw) |= FLAG(obj2.cyyw) | FLAG(obj2.cxyw);
FLAG(obj2.mx2w) |= FLAG(obj2.my2w) | FLAG(obj2.mxyw)
| FLAG(obj2.thetaw) | FLAG(obj2.aw) | FLAG(obj2.cxxw);
FLAG(obj2.peakxw) |= FLAG(obj2.peakyf);
FLAG(obj2.peakxw) |= FLAG(obj2.peakyw) | FLAG(obj2.peakalphas);
FLAG(obj.peakx) |= FLAG(obj.peaky) | FLAG(obj2.peakxw) | FLAG(obj2.peakxf);
FLAG(obj2.mxf) |= FLAG(obj2.myf);
FLAG(obj2.mxw) |= FLAG(obj2.myw) | FLAG(obj2.mx2w) | FLAG(obj2.alphas)
| FLAG(obj2.poserr_mx2w)
| ((FLAG(obj2.assoc) | FLAG(obj2.assoc_number))
&& (prefs.assoccoord_type==ASSOCCOORD_WORLD));
FLAG(obj2.mamaposx) |= FLAG(obj2.mamaposy);
FLAG(obj2.fluxerr_win) |= FLAG(obj2.snr_win);
FLAG(obj2.flux_win) |= FLAG(obj2.mag_win)|FLAG(obj2.magerr_win)
| FLAG(obj2.flux_win) | FLAG(obj2.fluxerr_win);
FLAG(obj2.winpos_dgeox) |= FLAG(obj2.winpos_dgeoy);
FLAG(obj2.winpos_x) |= FLAG(obj2.winpos_y) | FLAG(obj2.winpos_dgeox)
| FLAG(obj2.winposerr_mx2) | FLAG(obj2.win_mx2)
| FLAG(obj2.winpos_xw) | FLAG(obj2.winpos_xf)
| FLAG(obj2.win_flag)
| FLAG(obj2.flux_win) |FLAG(obj2.winpos_niter);
FLAG(obj2.area_flagw) |= FLAG(obj2.npixw) | FLAG(obj2.fdnpixw)
| FLAG(obj2.fwhmw)
| FLAG(obj2.maxmu) | FLAG(obj2.threshmu)
| FLAG(obj2.prof_spheroid_mumax)
| FLAG(obj2.prof_disk_mumax)
| FLAG(obj2.mumax_prof);
/*------------------------------ Photometry ---------------------------------*/
FLAG(obj2.fluxerr_best) |= FLAG(obj2.magerr_best);
FLAG(obj2.flux_best) |= FLAG(obj2.mag_best) | FLAG(obj2.fluxerr_best);
FLAG(obj2.hl_radius) |= FLAG(obj2.winpos_x) | prefs.prof_flag;
FLAG(obj2.flux_auto) |= FLAG(obj2.mag_auto) | FLAG(obj2.magerr_auto)
| FLAG(obj2.fluxerr_auto)
| FLAG(obj2.kronfactor)
| FLAG(obj2.flux_best)
| FLAG(obj2.flux_radius)
| FLAG(obj2.hl_radius)
| FLAG(obj2.fluxcor_prof);
FLAG(obj2.flux_petro) |= FLAG(obj2.mag_petro) | FLAG(obj2.magerr_petro)
| FLAG(obj2.fluxerr_petro)
| FLAG(obj2.petrofactor);
FLAG(obj2.fluxerr_isocor) |= FLAG(obj2.magerr_isocor)
| FLAG(obj2.fluxerr_best);
FLAG(obj2.flux_isocor) |= FLAG(obj2.mag_isocor) | FLAG(obj2.fluxerr_isocor)
| FLAG(obj2.flux_best);
FLAG(obj2.flux_aper) |= FLAG(obj2.mag_aper)|FLAG(obj2.magerr_aper)
| FLAG(obj2.fluxerr_aper);
FLAG(obj2.flux_galfit) |= FLAG(obj2.mag_galfit) | FLAG(obj2.magerr_galfit)
| FLAG(obj2.fluxerr_galfit);
/*---------------------------- External flags -------------------------------*/
VECFLAG(obj.imaflag) |= VECFLAG(obj.imanflag);
/*------------------------------ PSF-fitting --------------------------------*/
FLAG(obj2.fwhm_psf) |= FLAG(obj2.fwhmw_psf);
FLAG(obj2.poserraw_psf) |= FLAG(obj2.poserrbw_psf);
FLAG(obj2.poserrcxxw_psf) |= FLAG(obj2.poserrcyyw_psf)
| FLAG(obj2.poserrcxyw_psf);
FLAG(obj2.poserrthetas_psf) |= FLAG(obj2.poserrtheta1950_psf)
| FLAG(obj2.poserrtheta2000_psf);
FLAG(obj2.poserrthetaw_psf) |= FLAG(obj2.poserrthetas_psf);
FLAG(obj2.poserrmx2w_psf) |= FLAG(obj2.poserrmy2w_psf)
| FLAG(obj2.poserrmxyw_psf)
| FLAG(obj2.poserrthetaw_psf) | FLAG(obj2.poserraw_psf)
| FLAG(obj2.poserrcxxw_psf);
FLAG(obj2.poserra_psf) |= FLAG(obj2.poserrb_psf)
| FLAG(obj2.poserrtheta_psf);
FLAG(obj2.poserrcxx_psf) |= FLAG(obj2.poserrcyy_psf)
| FLAG(obj2.poserrcxy_psf);
FLAG(obj2.poserrmx2_psf) |= FLAG(obj2.poserrmy2_psf)
| FLAG(obj2.poserrmxy_psf)
| FLAG(obj2.poserra_psf) | FLAG(obj2.poserrcxx_psf)
| FLAG(obj2.poserrmx2w_psf);
FLAG(obj2.alpha1950_psf) |= FLAG(obj2.delta1950_psf)
| FLAG(obj2.poserrtheta1950_psf);
FLAG(obj2.alpha2000_psf) |= FLAG(obj2.delta2000_psf)
| FLAG(obj2.alpha1950_psf)
| FLAG(obj2.poserrtheta2000_psf);
FLAG(obj2.alphas_psf) |= FLAG(obj2.deltas_psf) | FLAG(obj2.alpha2000_psf);
FLAG(obj2.xw_psf) |= FLAG(obj2.yw_psf) | FLAG(obj2.poserrmx2w_psf)
| FLAG(obj2.alphas_psf);
FLAG(obj2.fluxerr_psf) |= FLAG(obj2.poserrmx2_psf) | FLAG(obj2.magerr_psf);
FLAG(obj2.mx2_pc) |= FLAG(obj2.my2_pc) | FLAG(obj2.mxy_pc)
| FLAG(obj2.a_pc) | FLAG(obj2.b_pc)
| FLAG(obj2.theta_pc) | FLAG(obj2.vector_pc)
| FLAG(obj2.gdposang) | FLAG(obj2.gdscale)
| FLAG(obj2.gdaspect) | FLAG(obj2.flux_galfit)
| FLAG(obj2.gde1) | FLAG(obj2.gde2)
| FLAG(obj2.gbposang) | FLAG(obj2.gbscale)
| FLAG(obj2.gbaspect) | FLAG(obj2.gbratio);
FLAG(obj2.flux_psf) |= FLAG(obj2.mag_psf) | FLAG(obj2.x_psf)
| FLAG(obj2.y_psf) | FLAG(obj2.xw_psf)
| FLAG(obj2.fluxerr_psf)
| FLAG(obj2.niter_psf)
| FLAG(obj2.chi2_psf)
| FLAG(obj2.mx2_pc);
/*-------------------------------- Others -----------------------------------*/
FLAG(obj.fwhm) |= FLAG(obj2.fwhmw);
FLAG(obj.iso[0]) |= FLAG(obj2.sprob);
for (i=0; ikey))
for (i=0,n=1; i++nkey; key=key->nextkey)
{
if (*key->unit)
fprintf(ascfile, "# %3d %-22.22s %-58.58s [%s]\n",
n, key->name,key->comment, key->unit);
else
fprintf(ascfile, "# %3d %-22.22s %-58.58s\n",
n, key->name,key->comment);
n += key->nbytes/t_size[key->ttype];
}
else if (prefs.cat_type == ASCII_SKYCAT && (key = objtab->key))
{
if (objtab->nkey<3)
error(EXIT_FAILURE,"The SkyCat format requires at least 4 parameters:",
" Id Ra Dec Mag");
/*--- We add a tab between rows, as required by Skycat */
fprintf(ascfile, skycathead, 8.0);
for (i=1,key=key->nextkey; i++nkey; key=key->nextkey)
{
if (i>4)
fprintf(ascfile, "\t%s", key->name);
sprintf(gstr, "\t%s", key->printf);
strcpy(key->printf, gstr);
}
fprintf(ascfile, "\n------------------\n");
}
else if (prefs.cat_type == ASCII_VO && objtab->key)
{
write_xml_header(ascfile);
write_vo_fields(ascfile);
fprintf(ascfile, " \n");
}
}
else
{
fitscat = new_cat(1);
init_cat(fitscat);
strcpy(fitscat->filename, prefs.cat_name);
if (open_cat(fitscat, WRITE_ONLY) != RETURN_OK)
error(EXIT_FAILURE,"*Error*: cannot open for writing ",prefs.cat_name);
switch(prefs.cat_type)
{
case FITS_LDAC:
case FITS_TPX:
/*------ Save a "pure" primary HDU */
save_tab(fitscat, fitscat->tab);
break;
case FITS_10:
/*------ Add to the primary HDU extraction parameters */
key = headkey1;
while (*key->name)
addkeyto_head(fitscat->tab, key++);
save_tab(fitscat, fitscat->tab);
break;
default:
error (EXIT_FAILURE, "*Internal Error*: Unknown FITS type in ",
"initcat()");
}
}
catopen_flag = 1;
return;
}
/****** write_vo_fields *******************************************************
PROTO int write_vo_fields(FILE *file)
PURPOSE Write the list of columns to an XML-VOTable file or stream
INPUT Pointer to the output file (or stream).
OUTPUT -.
NOTES -.
AUTHOR E. Bertin (IAP)
VERSION 14/07/2006
***/
void write_vo_fields(FILE *file)
{
keystruct *key;
char datatype[40], arraysize[40], str[40];
int i, d;
if (!objtab || !objtab->key)
return;
key=objtab->key;
for (i=0; i++nkey; key=key->nextkey)
{
/*--- indicate datatype, arraysize, width and precision attributes */
/*--- Handle multidimensional arrays */
arraysize[0] = '\0';
if (key->naxis>1)
{
for (d=0; dnaxis; d++)
{
sprintf(str, "%s%d", d?"x":" arraysize=\"", key->naxisn[d]);
strcat(arraysize, str);
}
strcat(arraysize, "\"");
}
switch(key->ttype)
{
case T_BYTE: strcpy(datatype, "unsignedByte"); break;
case T_SHORT: strcpy(datatype, "short"); break;
case T_LONG: strcpy(datatype, "int"); break;
case T_FLOAT: strcpy(datatype, "float"); break;
case T_DOUBLE: strcpy(datatype, "double"); break;
default: error(EXIT_FAILURE,
"*Internal Error*: Unknown datatype in ",
"initcat()");
}
fprintf(file,
" \n",
key->name, key->voucd, datatype,key->vounit, arraysize);
fprintf(file, " %s\n", key->comment);
fprintf(file, " \n");
}
return;
}
/********************************* reinitcat *********************************/
/*
Initialize the catalog header
*/
void reinitcat(picstruct *field)
{
tabstruct *tab, *asctab;
keystruct *key;
if (prefs.cat_type == CAT_NONE)
return;
if (prefs.cat_type != ASCII_HEAD && prefs.cat_type != ASCII &&
prefs.cat_type != ASCII_SKYCAT && prefs.cat_type != ASCII_VO)
{
update_tab(objtab);
switch(prefs.cat_type)
{
case FITS_LDAC:
/*------ We create a dummy table (only used through its header) */
QCALLOC(asctab, tabstruct, 1);
asctab->headnblock = field->tab->headnblock;
QMEMCPY(field->tab->headbuf, asctab->headbuf, char,
asctab->headnblock*FBSIZE);
key = headkey;
while (*key->name)
addkeyto_head(asctab, key++);
tab = new_tab("LDAC_IMHEAD");
add_tab(tab, fitscat, 0);
key = new_key("Field Header Card");
key->ptr = asctab->headbuf;
asctab->headbuf = NULL;
free_tab(asctab);
key->htype = H_STRING;
key->ttype = T_STRING;
key->nobj = 1;
key->nbytes = 80*(fitsfind(key->ptr, "END ")+1);
key->naxis = 2;
QMALLOC(key->naxisn, int, key->naxis);
key->naxisn[0] = 80;
key->naxisn[1] = key->nbytes/80;
add_key(key, tab, 0);
save_tab(fitscat, tab);
strcpy(objtab->extname, "LDAC_OBJECTS");
break;
case FITS_TPX:
/*------ We create a dummy table (only used through its header) */
QCALLOC(asctab, tabstruct, 1);
asctab->headnblock = field->tab->headnblock;
QMEMCPY(field->tab->headbuf, asctab->headbuf, char,
asctab->headnblock*FBSIZE);
key = headkey;
while (*key->name)
addkeyto_head(asctab, key++);
tab = new_tab("TPX_IMHEAD");
add_tab(tab, fitscat, 0);
key = new_key("Field Header Card");
key->ptr = asctab->headbuf;
asctab->headbuf = NULL;
free_tab(asctab);
key->htype = H_STRING;
key->ttype = T_STRING;
key->nobj = fitsfind(key->ptr, "END ")+1;
key->nbytes = 80;
key->naxis = 1;
QMALLOC(key->naxisn, int, key->naxis);
key->naxisn[0] = 80;
add_key(key, tab, 0);
save_tab(fitscat, tab);
strcpy(objtab->extname, "TPX_OBJECTS");
break;
case FITS_10:
/*------ Add to the primary HDU extraction parameters */
/*
key = headkey1;
while (*key->name)
addkeyto_head(fitscat->tab, key++);
save_tab(fitscat, fitscat->tab);
*/
break;
default:
error (EXIT_FAILURE, "*Internal Error*: Unknown FITS type in ",
"reinitcat()");
}
objtab->cat = fitscat;
init_writeobj(fitscat, objtab, &buf);
}
zerocat();
return;
}
/********************************* writecat **********************************/
/*
Write out in the catalog each one object.
*/
void writecat(int n, objliststruct *objlist)
{
outobj = objlist->obj[n];
switch(prefs.cat_type)
{
case FITS_10:
case FITS_LDAC:
case FITS_TPX:
write_obj(objtab, buf);
break;
case ASCII:
case ASCII_HEAD:
case ASCII_SKYCAT:
print_obj(ascfile, objtab);
break;
case ASCII_VO:
voprint_obj(ascfile, objtab);
break;
case CAT_NONE:
break;
default:
error (EXIT_FAILURE, "*Internal Error*: Unknown catalog type", "");
}
return;
}
/********************************** endcat ***********************************/
/*
Terminate the catalog output.
*/
void endcat(char *error)
{
keystruct *key;
int i;
if (!catopen_flag)
{
if (prefs.cat_type == ASCII_VO)
write_xmlerror(prefs.cat_name, error);
return;
}
switch(prefs.cat_type)
{
case ASCII:
case ASCII_HEAD:
if (!prefs.pipe_flag)
fclose(ascfile);
break;
case ASCII_SKYCAT:
fprintf(ascfile, skycattail);
if (!prefs.pipe_flag)
fclose(ascfile);
break;
case ASCII_VO:
fprintf(ascfile, " \n");
fprintf(ascfile, " \n");
/*---- Add configuration file meta-data */
write_xml_meta(ascfile, error);
fprintf(ascfile, "\n");
fprintf(ascfile, "\n");
if (!prefs.pipe_flag)
fclose(ascfile);
break;
case FITS_LDAC:
case FITS_TPX:
case FITS_10:
free_cat(&fitscat,1);
break;
case CAT_NONE:
break;
default:
break;
}
/* Free allocated memory for arrays */
key = objtab->key;
for (i=objtab->nkey; i--; key=key->nextkey)
if (key->naxis && key->allocflag)
free(key->ptr);
objtab->key = NULL;
objtab->nkey = 0;
free_tab(objtab);
objtab = NULL;
return;
}
/******************************** reendcat ***********************************/
/*
Terminate the catalog output.
*/
void reendcat()
{
keystruct *key;
tabstruct *tab;
OFF_T2 pos;
char *head;
switch(prefs.cat_type)
{
case ASCII:
case ASCII_HEAD:
case ASCII_SKYCAT:
case ASCII_VO:
break;
case FITS_LDAC:
case FITS_TPX:
end_writeobj(fitscat, objtab, buf);
key = NULL;
if (!(tab=fitscat->tab->prevtab)
|| !(key=name_to_key(tab, "Field Header Card")))
error(EXIT_FAILURE,"*Error*: cannot update table ", "ASCFIELD");
head = key->ptr;
fitswrite(head, "SEXNDET ", &thecat.ndetect,H_INT,T_LONG);
fitswrite(head, "SEXNFIN ", &thecat.ntotal, H_INT,T_LONG);
fitswrite(head, "SEXDATE ", thecat.ext_date, H_STRING, T_STRING);
fitswrite(head, "SEXTIME ", thecat.ext_time, H_STRING, T_STRING);
fitswrite(head, "SEXELAPS", &thecat.ext_elapsed, H_FLOAT, T_DOUBLE);
QFTELL(fitscat->file, pos, fitscat->filename);
QFSEEK(fitscat->file, tab->headpos, SEEK_SET, fitscat->filename);
save_tab(fitscat, tab);
remove_tab(fitscat, "LDAC_IMHEAD", 0);
QFSEEK(fitscat->file, pos, SEEK_SET, fitscat->filename);
break;
case FITS_10:
end_writeobj(fitscat, objtab, buf);
fitswrite(fitscat->tab->headbuf,"SEXNDET ",&thecat.ndetect,H_INT,T_LONG);
fitswrite(fitscat->tab->headbuf,"SEXNFIN ",&thecat.ntotal, H_INT,T_LONG);
QFTELL(fitscat->file, pos, fitscat->filename);
QFSEEK(fitscat->file, fitscat->tab->headpos, SEEK_SET,fitscat->filename);
save_tab(fitscat, fitscat->tab);
QFSEEK(fitscat->file, pos, SEEK_SET, fitscat->filename);
break;
case CAT_NONE:
break;
default:
break;
}
return;
}
/********************************** zerocat **********************************/
/*
Reset to 0 all measurements in the current catalog.
*/
void zerocat(void)
{
keystruct *key;
int i;
key = objtab->key;
for (i=objtab->nkey; i--; key=key->nextkey)
memset(key->ptr, 0, key->nbytes);
return;
}