/*
* weight.c
*
* Handle external weight maps.
*
*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
*
* This file part of: SExtractor
*
* Copyright: (C) 1998-2010 IAP/CNRS/UPMC
* (C) 1997 ESO
*
* Author: Emmanuel Bertin (IAP)
*
* 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: 11/10/2010
*
*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include
#include
#include
#include
#include "define.h"
#include "globals.h"
#include "field.h"
#include "plist.h"
#include "weight.h"
/******************************* newweight **********************************/
/*
Load a weight map and initialize relevant parameters.
*/
picstruct *newweight(char *filename, picstruct *reffield,
weightenum wtype, int nok)
{
picstruct *wfield;
switch(wtype)
{
case WEIGHT_FROMINTERP:
wfield = inheritfield(reffield, INTERP_FIELD);
break;
case WEIGHT_FROMBACK:
wfield = inheritfield(reffield, BACKRMS_FIELD);
break;
case WEIGHT_FROMRMSMAP:
wfield = newfield(filename, RMS_FIELD, nok);
if ((wfield->width!=reffield->width)||(wfield->height!=reffield->height))
error(EXIT_FAILURE,
"*Error*: measured frame and weight map have different sizes","");
wfield->sigfac = 1.0;
break;
case WEIGHT_FROMVARMAP:
wfield = newfield(filename, VAR_FIELD, nok);
if ((wfield->width!=reffield->width)||(wfield->height!=reffield->height))
error(EXIT_FAILURE,
"*Error*: measured frame and weight map have different sizes","");
break;
case WEIGHT_FROMWEIGHTMAP:
wfield = newfield(filename, WEIGHT_FIELD, nok);
if ((wfield->width!=reffield->width)||(wfield->height!=reffield->height))
error(EXIT_FAILURE,
"*Error*: measured frame and weight map have different sizes","");
break;
default:
wfield = NULL; /* To avoid gcc -Wall warnings */
error(EXIT_FAILURE,
"*Internal Error*: Unknown weight-map type in ", "makeit()");
break;
}
/* Default normalization factor (will be changed if necessary later) */
wfield->sigfac = 1.0;
return wfield;
}
/******************************* weight_to_var *******************************/
/*
Transform an array of possibily unnormalized weights into a calibrated
variance map.
*/
void weight_to_var(picstruct *wfield, PIXTYPE *data, int npix)
{
float sigfac2;
int i;
switch(wfield->flags&(BACKRMS_FIELD|RMS_FIELD|VAR_FIELD|WEIGHT_FIELD))
{
case BACKRMS_FIELD:
case RMS_FIELD:
for (i=npix; i--; data++)
if (*datasigfac*wfield->sigfac;
for (i=npix; i--;)
*(data++) *= sigfac2;
break;
case WEIGHT_FIELD:
sigfac2 = wfield->sigfac*wfield->sigfac;
for (i=npix; i--; data++)
if (*data > 0.0)
*data = sigfac2/(*data);
else
*data = BIG;
break;
default:
error(EXIT_FAILURE,
"*Internal Error*: Unknown weight-map type in ", "weight_to_var()");
break;
}
return;
}
/******************************** weight_count *******************************
PROTO void weight_count(objstruct *obj, pliststruct *pixel)
PURPOSE Count pixels with zero weights.
INPUT Objstruct pointer,
pixel list pointer.
OUTPUT -.
NOTES -.
AUTHOR E. Bertin (IAP)
VERSION 01/10/2009
***/
void weight_count(objstruct *obj, pliststruct *pixel)
{
pliststruct *pixt;
int i, nw,ndw, wflag;
nw = ndw = wflag = 0;
for (i=obj->firstpix; i!=-1; i=PLIST(pixt,nextpix))
{
pixt = pixel+i;
if (PLISTFLAG(pixt, wflag) & OBJ_LOWWEIGHT)
nw++;
if (PLISTFLAG(pixt, wflag) & OBJ_LOWDWEIGHT)
ndw++;
}
obj->nzwpix = nw;
obj->nzdwpix = ndw;
obj->wflag = nw? OBJ_LOWWEIGHT : 0;
if (ndw)
obj->wflag |= OBJ_LOWDWEIGHT;
return;
}