20#include "hdrl_cat_phopt.h"
22#include "hdrl_cat_utils.h"
60 ap_t *ap,
double parm[IMNUM][NPAR], cpl_size nbit, cpl_size naper,
61 double apertures[],
double cflux[],
double badpix[], cpl_size nrcore,
double avconf[])
64 double *map = ap->indata;
65 double *conf = ap->confdata;
66 unsigned char *mflag = ap->mflag;
67 cpl_size nx = ap->lsiz;
68 cpl_size ny = ap->csiz;
71 double aa[IMNUM+1][IMNUM+1];
74 for (cpl_size iaper = 0; iaper < naper; iaper++) {
76 double rcirc = apertures[iaper];
77 double parrad = rcirc + 0.5;
80 double cn = 1. / (CPL_MATH_PI * rcirc * rcirc);
81 double cnsq = cn * cn;
84 for (cpl_size i = 0; i < nbit; i++) {
91 double xi = parm[i][1];
92 double yi = parm[i][2];
94 for (cpl_size j = i + 1; j < nbit; j++) {
96 double d = sqrt( (xi - parm[j][1]) * (xi - parm[j][1])
97 + (yi - parm[j][2]) * (yi - parm[j][2]));
99 if (d >= 2. * rcirc) {
102 double arg = d / (2. * rcirc);
103 aa[j][i] = cnsq * 2. * rcirc * rcirc * (acos(arg)
104 - arg * (sqrt(1. - arg * arg)));
113 for (cpl_size i = 0; i < nbit; i++) {
118 double xmin = DBL_MAX;
119 double xmax = DBL_MIN;
120 double ymin = DBL_MAX;
121 double ymax = DBL_MIN;
123 for (cpl_size i = 0; i < nbit; i++) {
125 double xi = parm[i][1];
126 double yi = parm[i][2];
128 xmin = CPL_MIN(xmin, xi);
129 xmax = CPL_MAX(xmax, xi);
130 ymin = CPL_MIN(ymin, yi);
131 ymax = CPL_MAX(ymax, yi);
134 double ix1 = CPL_MAX( 0, (cpl_size)(xmin - parrad) - 1);
135 double ix2 = CPL_MIN(nx - 1, (cpl_size)(xmax + parrad) );
137 double iy1 = CPL_MAX( 0, (cpl_size)(ymin - parrad) - 1);
138 double iy2 = CPL_MIN(ny - 1, (cpl_size)(ymax + parrad) );
141 for (cpl_size ii = iy1; ii <= iy2; ii++) {
143 cpl_size kk = ii * nx;
145 for (cpl_size i = ix1; i <= ix2; i++) {
147 unsigned char mf = mflag[kk+i];
149 if (mf == MF_ZEROCONF || mf == MF_STUPID_VALUE) {
151 for (cpl_size j = 0; j < nbit; j++) {
153 double xj = i - parm[j][1] + 1.;
154 double yj = ii - parm[j][2] + 1.;
155 double tj =
fraction(xj, yj, rcirc);
157 aa[j][j] -= tj * tj * cnsq;
159 for (cpl_size k = j + 1; k < nbit; k++) {
160 double tk =
fraction( i - parm[k][1] + 1., ii - parm[k][2] + 1., rcirc);
161 aa[k][j] -= tk * tj * cnsq;
165 if (iaper == nrcore) badpix[j] += tj;
168 }
else if (mf == MF_CLEANPIX || mf == MF_OBJPIX || mf == MF_SATURATED) {
170 double t = map[kk+i];
172 for (cpl_size j = 0; j < nbit; j++) {
174 double xj = i - parm[j][1] + 1.;
175 double yj = ii - parm[j][2] + 1.;
177 double ff =
fraction(xj, yj, rcirc);
181 if (iaper == nrcore) {
182 avconf[j] += ff * conf[kk + i];
192 cflux[iaper] = bb[0];
197 for (cpl_size i = 0; i < nbit; i++) {
198 aa[i][i] = CPL_MAX(aa[i][i], cnsq);
204 for (cpl_size i = 0; i < nbit; i++) {
205 cflux[i * naper + iaper] = cn * bb[i];
210 return CPL_ERROR_NONE;
cpl_error_code hdrl_phopt(ap_t *ap, double parm[IMNUM][NPAR], cpl_size nbit, cpl_size naper, double apertures[], double cflux[], double badpix[], cpl_size nrcore, double avconf[])
Does multiple profile fitting to determine intensities.
double fraction(double x, double y, double r_out)
Fraction of pixel bounded.
void dchole(double a[IMNUM+1][IMNUM+1], double b[IMNUM+1], cpl_size n)
Cholesky decomposition of definite symmetric matrix to solve Ax = b.