22#include "hdrl_cat_extend.h"
24#include "hdrl_cat_statistics.h"
25#include "hdrl_cat_polynm.h"
68 ap_t *ap,
double xniso,
double xbar,
double ybar,
69 double sxx,
double sxy,
double syy,
double areal0,
double tmax,
double *ttotal)
72 double *map = ap->indata;
73 cpl_size nx = ap->lsiz;
74 cpl_size ny = ap->csiz;
75 double skysig = ap->sigma;
76 double thresh = ap->thresh;
77 unsigned char *mflag = ap->mflag;
81 double srr = CPL_MAX(0.5, sxx + syy);
82 double ecc = CPL_MIN(0.9, sqrt((syy - sxx) * (syy - sxx) + 4. * sxy * sxy) / srr);
83 double xx = 0.5 * (1. + ecc) * srr - sxx;
88 }
else if (xx == 0.) {
89 theta = CPL_MATH_PI_2;
91 theta = atan(sxy / xx);
94 double ctheta = cos(theta);
95 double stheta = sin(theta);
98 ecc = CPL_MIN(0.9, sqrt( CPL_MAX( (syy - sxx) * (syy - sxx)
99 - 16. * CPL_MATH_PI * skysig * srr * srr * srr / (xniso * xniso)
104 double a = sqrt(srr * (1. + ecc));
105 double b = sqrt(srr * (1. - ecc));
106 double stretch = sqrt(areal0 / (CPL_MATH_PI * a * b));
109 double rad = CPL_MAX(1.1, (tmax - skysig) / thresh);
110 double sfac = CPL_MIN(5., CPL_MAX(2., 3. / sqrt(log(rad))));
117 memset(accum, 0, NACC *
sizeof(
double));
120 double climsq = CPL_MAX(1., (a * ctheta) * (a * ctheta) + (b * stheta) * (b * stheta));
121 double clim = sqrt(climsq);
123 double pt1 = sin(2. * theta) * (b * b - a * a);
124 double pt2 = (b * ctheta) * (b * ctheta) + (a * stheta) * (a * stheta);
125 double pt3 = (a * b) * (a * b);
127 cpl_size jmin = CPL_MAX( 1, (cpl_size)(ybar - clim));
128 cpl_size jmax = CPL_MIN(ny, (cpl_size)(ybar + clim + 1.));
129 for (cpl_size jj = jmin; jj <= jmax; jj++) {
132 cpl_size kk = (jj-1)*nx;
134 double c = (double)jj - ybar;
138 double pc = pt2 * c * c - pt3;
140 double arg1 = sqrt(CPL_MAX(0., pb * pb - 4. * pa * pc));
142 double xliml = (-pb - arg1) / (2. * pa);
143 double xlimu = (-pb + arg1) / (2. * pa);
145 cpl_size imin = CPL_MAX( 1, (cpl_size)(xbar + xliml ));
146 cpl_size imax = CPL_MIN(nx, (cpl_size)(xbar + xlimu + 1.));
150 for (cpl_size ii = imin; ii <= imax; ii++) {
152 if ( mflag[kk + ii - 1] == MF_CLEANPIX
153 || mflag[kk + ii - 1] == MF_OBJPIX
154 || mflag[kk + ii - 1] == MF_SATURATED)
156 double t = map[kk + ii - 1];
157 double x = (double)ii - xbar;
160 double xnew = x * ctheta - y * stheta;
161 double ynew = x * stheta + y * ctheta;
163 double ellrad = 2. * sqrt( (ynew / a) * (ynew / a)
164 + (xnew / b) * (xnew / b));
166 cpl_size iupd = CPL_MIN(NACC, CPL_MAX(1, (cpl_size)((2. - ellrad) * (
double)NACC) + 1));
168 for (cpl_size idx = 1; idx <= iupd; idx++) {
169 accum[NACC - idx] += t;
177 for (cpl_size i = 0; i < NACC; i++) {
178 accum[i] = -accum[i];
190 for (cpl_size i = 0; i < NACC; i++) {
192 xmax = CPL_MAX(xmax, accum[i]);
196 double polycf[NCOEF];
199 double pa = polycf[1];
200 double pb = polycf[2] * 2.;
201 double pc = polycf[3] * 3.;
203 double arg1 = sqrt(CPL_MAX(0., pb * pb - 4. * pa * pc));
207 double rt1 = (-pb + arg1) / (2. * pc);
208 double rt2 = (-pb - arg1) / (2. * pc);
210 if (rt1 < (
double)NACC && rt1 > 1.) {
212 cpl_size ir = (cpl_size)rt1;
213 double t1 = rt1 - (double)ir;
215 xlim1 = (1. - t1) * accum[ir - 1] + t1 * accum[ir];
218 if (rt2 < (
double)NACC && rt2 > 1.) {
220 cpl_size ir = (cpl_size)rt2;
221 double t1 = rt2 - ir;
223 xlim2 = (1. - t1) * accum[ir - 1] + t1 * accum[ir];
227 double xlimit = CPL_MAX(xlim1, xlim2);
238 return CPL_ERROR_NONE;
cpl_error_code hdrl_extend(ap_t *ap, double xniso, double xbar, double ybar, double sxx, double sxy, double syy, double areal0, double tmax, double *ttotal)
Do aperture integration.
cpl_error_code hdrl_polynm(double xdat[], double xcor[], cpl_size n, double polycf[], cpl_size m, cpl_size ilim)
Work out the median seeing.
cpl_error_code hdrl_median(double xbuf[], cpl_size npt, cpl_size nfilt)
compute median