20#include "hdrl_cat_radii.h"
22#include "hdrl_cat_utils.h"
54double hdrl_halflight(
double rcores[],
double cflux[],
double halflight,
double peak, cpl_size naper)
61 for (i = 0; i < naper; i++) {
62 if (cflux[i] > halflight) {
68 if (gotone == 0) i = naper - 1;
74 double delr = (cflux[i] - halflight) / CPL_MAX(1., cflux[i] - peak);
76 halfrad = rcores[0] * (1. - delr) + delr * sqrt(1. / CPL_MATH_PI);
80 double delr = (cflux[i] - halflight) / CPL_MAX(1., (cflux[i] - cflux[i - 1]));
82 halfrad = rcores[i - 1] * delr + rcores[i] * (1. - delr);
105double hdrl_exprad(
double thresh,
double peak,
double areal0,
double rcores[], cpl_size naper)
107 double pk = CPL_MAX(1.5 * thresh, peak);
109 double r_t = sqrt(areal0 / CPL_MATH_PI);
111 double rad = CPL_MAX(r_t, CPL_MIN(5. * r_t, CPL_MIN(5. * r_t / log(pk / thresh), rcores[naper - 1])));
132double hdrl_kronrad(
double areal0,
double rcores[],
double cflux[], cpl_size naper)
134 double r_t = sqrt(areal0 / CPL_MATH_PI);
135 double rad = 0.5 * rcores[0] * cflux[0];
136 double sum = cflux[0];
138 cpl_size imax = CPL_MIN(naper, 7);
139 for (cpl_size i = 1; i < imax; i++) {
141 double wt = CPL_MAX(0., cflux[i] - cflux[i - 1]);
143 rad += 0.5 * (rcores[i] + rcores[i - 1]) * wt;
148 rad = CPL_MAX(r_t, CPL_MIN(5. * r_t, CPL_MIN(2. * rad, rcores[naper - 1])));
169double hdrl_petrad(
double areal0,
double rcores[],
double cflux[], cpl_size naper)
171 double r_t = sqrt(areal0 / CPL_MATH_PI);
177 while (eta > 0.2 && j < naper) {
181 double r1 = rcores[j] * rcores[j] / (rcores[j - 1] * rcores[j - 1]) - 1.;
182 double r2 = cflux[j] / cflux[j - 1] - 1.;
189 double r_petr = rcores[naper - 1];
192 double r1 = rcores[j] * rcores[j];
193 double r2 = rcores[j - 1] * rcores[j - 1];
194 double r3 = rcores[j - 2] * rcores[j - 2];
195 double r4 = (etaold - 0.2) / (etaold - eta);
196 double r5 = (0.2 - eta) / (etaold - eta);
198 r_petr = r4 * sqrt(0.5 * (r1 + r2)) + r5 * sqrt(0.5 * (r2 + r3));
201 r_petr = CPL_MAX(r_t, CPL_MIN(5. * r_t, CPL_MIN(2. * r_petr, rcores[naper-1])));
225void hdrl_flux(ap_t *ap,
double parm[IMNUM][NPAR], cpl_size nbit,
double apers[],
226 double fluxes[], cpl_size nr,
double rcores[],
double rfluxes[])
229 double *map = ap->indata;
230 unsigned char *mflag = ap->mflag;
232 cpl_size nx = ap->lsiz;
233 cpl_size ny = ap->csiz;
240 double xmin = parm[0][1] - apers[0] - 0.5;
241 double xmax = parm[0][1] + apers[0] + 0.5;
242 double ymin = parm[0][2] - apers[0] - 0.5;
243 double ymax = parm[0][2] + apers[0] + 0.5;
245 cpl_size ix1 = CPL_MAX( 0, (cpl_size)xmin - 1);
246 cpl_size ix2 = CPL_MIN(nx - 1, (cpl_size)xmax );
247 cpl_size iy1 = CPL_MAX( 0, (cpl_size)ymin - 1);
248 cpl_size iy2 = CPL_MIN(ny - 1, (cpl_size)ymax );
252 for (cpl_size j = iy1; j <= iy2; j++) {
254 cpl_size kk = j * nx;
256 for (cpl_size i = ix1; i <= ix2; i++) {
258 unsigned char mf = mflag[kk + i];
260 if (mf == MF_CLEANPIX || mf == MF_OBJPIX || mf == MF_SATURATED) {
262 double t = map[kk+i];
263 double xj = (double)i - parm[0][1] + 1.;
264 double yj = (double)j - parm[0][2] + 1.;
265 fluxes[0] +=
fraction(xj, yj, apers[0]) * t;
270 if (fluxes[0] <= 0) fluxes[0] = parm[0][0];
278 for (cpl_size j = 0; j < nbit; j++) {
280 sumiso += parm[j][0];
283 while (n < nr - 1 && rcores[n] < apers[j]) n++;
285 double delr = (rcores[n] - apers[j]) / (rcores[n] - rcores[n - 1]);
287 fluxes[j] = rfluxes[j * nr + n]*(1. - delr) + rfluxes[j * nr + n - 1] * delr;
293 for (cpl_size j = 0; j < nbit; j++) {
295 fluxes[j] = sumcf * parm[j][0] / CPL_MAX(1., sumiso);
297 if (fluxes[j] < 0.) fluxes[j] = parm[j][0];
void hdrl_flux(ap_t *ap, double parm[IMNUM][NPAR], cpl_size nbit, double apers[], double fluxes[], cpl_size nr, double rcores[], double rfluxes[])
Work out the fluxes for special radii.
double hdrl_exprad(double thresh, double peak, double areal0, double rcores[], cpl_size naper)
Work out the exponential radius for an object.
double hdrl_petrad(double areal0, double rcores[], double cflux[], cpl_size naper)
Work out the Petrosian radius for an object.
double hdrl_kronrad(double areal0, double rcores[], double cflux[], cpl_size naper)
Work out the Kron radius for an object.
double hdrl_halflight(double rcores[], double cflux[], double halflight, double peak, cpl_size naper)
Work out the half-light radius for an object.
double fraction(double x, double y, double r_out)
Fraction of pixel bounded.