Newer
Older
*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Emmanuel Bertin
committed
* Copyright: (C) 1998-2012 Emmanuel Bertin -- IAP/CNRS/UPMC
*
* 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 <http://www.gnu.org/licenses/>.
*
* Last modified: 12/07/2012
*
*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "define.h"
#include "globals.h"
#include "prefs.h"
#include "fits/fitscat.h"
#include "check.h"
#include "filter.h"
#include "image.h"
#include "psf.h"
/*------------------------------- variables ---------------------------------*/
extern keystruct objkey[];
extern objstruct outobj;
/********************************* psf_init **********************************/
/*
Allocate memory and stuff for the PSF-fitting.
*/
void psf_init(void)
QMALLOC(thepsfit->x, double, prefs.psf_npsfmax);
QMALLOC(thepsfit->y, double, prefs.psf_npsfmax);
QMALLOC(thepsfit->flux, float, prefs.psf_npsfmax);
QMALLOC(thepsfit->fluxerr, float, prefs.psf_npsfmax);
if (prefs.dpsf_flag)
{
QMALLOC(thedpsfit, psfitstruct, 1);
QMALLOC(thedpsfit->x, double, prefs.psf_npsfmax);
QMALLOC(thedpsfit->y, double, prefs.psf_npsfmax);
QMALLOC(thedpsfit->flux, float, prefs.psf_npsfmax);
QMALLOC(thedpsfit->fluxerr, float, prefs.psf_npsfmax);
}
return;
}
/********************************* psf_end ***********************************/
/*
Free memory occupied by the PSF-fitting stuff.
*/
void psf_end(psfstruct *psf, psfitstruct *psfit)
{
int d, ndim;
if (psf->pc)
pc_end(psf->pc);
ndim = psf->poly->ndim;
for (d=0; d<ndim; d++)
free(psf->contextname[d]);
free(psf->context);
free(psf->contextname);
free(psf->contextoffset);
free(psf->contextscale);
free(psf->contexttyp);
poly_end(psf->poly);
free(psf->maskcomp);
free(psf->maskloc);
free(psf->masksize);
free(psf);
if (psfit)
{
free(psfit->x);
free(psfit->y);
free(psfit->flux);
return;
}
/********************************* psf_load *********************************/
/*
Read the PSF data from a FITS file.
*/
Emmanuel Bertin
committed
psfstruct *psf_load(char *filename, int ext)
{
static objstruct saveobj;
static obj2struct saveobj2;
psfstruct *psf;
catstruct *cat;
tabstruct *tab;
keystruct *key;
char *head, *ci,*co;
int deg[POLY_MAXDIM], group[POLY_MAXDIM], ndim, ngroup,
Emmanuel Bertin
committed
e,i,k;
Emmanuel Bertin
committed
/* Open the cat (well it is not a "cat", but simply a FITS file */
if (!(cat = read_cat(filename)))
error(EXIT_FAILURE, "*Error*: PSF file not found: ", filename);
/* OK, we now allocate memory for the PSF structure itself */
QCALLOC(psf, psfstruct, 1);
/* Store a short copy of the PSF filename */
if ((ci=strrchr(filename, '/')))
strcpy(psf->name, ci+1);
else
strcpy(psf->name, filename);
Emmanuel Bertin
committed
tab = cat->tab;
for (i=cat->ntab, e=ext?ext-1 : 0;
i-- && (strcmp("PSF_DATA",tab->extname) || e--);
Emmanuel Bertin
committed
tab = tab->nexttab);
if (i<0)
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
error(EXIT_FAILURE, "*Error*: PSF_DATA table not found in catalog ",
filename);
head = tab->headbuf;
/*-- Dimension of the polynomial */
if (fitsread(head, "POLNAXIS", &ndim, H_INT,T_LONG) == RETURN_OK
&& ndim)
{
/*-- So we have a polynomial description of the PSF variations */
if (ndim > POLY_MAXDIM)
{
sprintf(gstr, "*Error*: The POLNAXIS parameter in %s exceeds %d",
psf->name, POLY_MAXDIM);
error(EXIT_FAILURE, gstr, "");
}
QMALLOC(psf->contextname, char *, ndim);
QMALLOC(psf->context, double *, ndim);
QMALLOC(psf->contexttyp, t_type, ndim);
QMALLOC(psf->contextoffset, double, ndim);
QMALLOC(psf->contextscale, double, ndim);
/*-- We will have to use the outobj structs, so we first save their content */
saveobj = outobj;
saveobj2 = outobj2;
/*-- outobj's are used as FLAG arrays, so we initialize them to 0 */
memset(&outobj, 0, sizeof(outobj));
memset(&outobj2, 0, sizeof(outobj2));
for (i=0; i<ndim; i++)
{
/*---- Polynomial groups */
sprintf(gstr, "POLGRP%1d", i+1);
if (fitsread(head, gstr, &group[i], H_INT,T_LONG) != RETURN_OK)
goto headerror;
/*---- Contexts */
QMALLOC(psf->contextname[i], char, 80);
sprintf(gstr, "POLNAME%1d", i+1);
if (fitsread(head,gstr,psf->contextname[i],H_STRING,T_STRING)!=RETURN_OK)
goto headerror;
if (*psf->contextname[i]==(char)':')
/*------ It seems we're facing a FITS header parameter */
psf->context[i] = NULL; /* This is to tell we'll have to load */
/* a FITS header context later on */
else
/*------ The context element is a dynamic object parameter */
{
if ((k = findkey(psf->contextname[i], (char *)objkey,
sizeof(keystruct)))==RETURN_ERROR)
{
sprintf(gstr, "*Error*: %s CONTEXT parameter in %s unknown",
Loading
Loading full blame…