88 double *plane_med = NULL;
90 cpl_image *gain = NULL;
92 cpl_image *intercept = NULL;
93 double *pintercept = NULL;
94 cpl_image *sq_err = NULL;
95 double *psq_err = NULL;
96 double *timeline = NULL;
97 float *raw_im_data = NULL;
98 cpl_imagelist *result = NULL;
99 const int nx = cpl_image_get_size_x(cpl_imagelist_get(raw, 0));
100 const int ny = cpl_image_get_size_y(cpl_imagelist_get(raw, 0));
101 const int ni = cpl_imagelist_get_size(raw);
107 if ((mode != 0) && (mode != 1))
109 if (cpl_image_get_type(cpl_imagelist_get(raw, 0)) != CPL_TYPE_FLOAT)
111 if (cpl_imagelist_get_size(raw) <= 1)
115 plane_med = cpl_malloc(ni *
sizeof(
double));
116 for (i = 0; i < ni; i++)
117 plane_med[i] = cpl_image_get_median(cpl_imagelist_get(raw, i));
120 gain = cpl_image_new(nx, ny, CPL_TYPE_DOUBLE);
121 pgain = cpl_image_get_data_double(gain);
123 intercept = cpl_image_new(nx, ny, CPL_TYPE_DOUBLE);
124 pintercept = cpl_image_get_data_double(intercept);
126 sq_err = cpl_image_new(nx, ny, CPL_TYPE_DOUBLE);
127 psq_err = cpl_image_get_data_double(sq_err);
128 timeline = cpl_malloc(ni *
sizeof(
double));
131 cpl_msg_info(cpl_func,
"Computing gains for all positions (long)...");
132 for (i = 0; i < nx * ny; i++) {
134 for (j = 0; j < ni; j++) {
135 raw_im_data = cpl_image_get_data_float(cpl_imagelist_get(raw, j));
136 timeline[j] = (double)raw_im_data[i];
141 pintercept[i] = slope[0];
143 psq_err[i] = slope[2];
147 slope = irplib_flat_fit_proportional(plane_med, timeline, ni);
150 psq_err[i] = slope[1];
158 result = cpl_imagelist_new();
160 cpl_imagelist_set(result, gain, 0);
161 cpl_imagelist_set(result, intercept, 1);
162 cpl_imagelist_set(result, sq_err, 2);
165 cpl_imagelist_set(result, gain, 0);
166 cpl_imagelist_set(result, sq_err, 1);
197 double aa, bb, bcomp, b1, b2, del, abdevt, f1, f2, sigb, d, sum;
198 double sx, sy, sxy, sxx, chisq;
206 if (x == NULL || y == NULL)
209 c = cpl_malloc(3 *
sizeof(
double));
211 sx = sy = sxx = sxy = 0.00;
212 for (i = 0; i < np; i++) {
219 del = np * sxx - sx * sx;
220 aa_ls = aa = (sxx * sy - sx * sxy) / del;
221 bb_ls = bb = (np * sxy - sx * sy) / del;
224 for (i = 0; i < np; i++) {
225 double temp = y[i] - (aa + bb * x[i]);
230 arr = cpl_vector_new(np);
231 parr = cpl_vector_get_data(arr);
232 sigb = sqrt(chisq / del);
237 for (i = 0; i < np; i++) {
238 parr[i] = y[i] - bcomp * x[i];
240 aa = cpl_vector_get_median(arr);
242 for (i = 0; i < np; i++) {
243 d = y[i] - (bcomp * x[i] + aa);
245 if (fabs(y[i]) > 1e-7)
248 sum += (d >= 0.0 ? x[i] : -x[i]);
251 b2 = bb + SIGN(3.0 * sigb, f1);
254 for (i = 0; i < np; i++)
255 parr[i] = y[i] - bcomp * x[i];
256 aa = cpl_vector_get_median(arr);
258 for (i = 0; i < np; i++) {
259 d = y[i] - (bcomp * x[i] + aa);
261 if (fabs(y[i]) > 1e-7)
264 sum += (d >= 0.0 ? x[i] : -x[i]);
268 if (fabs(b2 - b1) < 1e-7) {
271 c[2] = abdevt / (double)np;
272 cpl_vector_delete(arr);
277 while (f1 * f2 > 0.0) {
285 for (i = 0; i < np; i++)
286 parr[i] = y[i] - bcomp * x[i];
287 aa = cpl_vector_get_median(arr);
289 for (i = 0; i < np; i++) {
290 d = y[i] - (bcomp * x[i] + aa);
292 if (fabs(y[i]) > 1e-7)
295 sum += (d >= 0.0 ? x[i] : -x[i]);
299 if (iter >= MAX_ITERATE)
302 if (iter >= MAX_ITERATE) {
306 cpl_vector_delete(arr);
311 while (fabs(b2 - b1) > sigb) {
313 bb = 0.5 * (b1 + b2);
314 if ((fabs(bb - b1) < 1e-7) || (fabs(bb - b2) < 1e-7))
318 for (i = 0; i < np; i++)
319 parr[i] = y[i] - bcomp * x[i];
320 aa = cpl_vector_get_median(arr);
322 for (i = 0; i < np; i++) {
323 d = y[i] - (bcomp * x[i] + aa);
325 if (fabs(y[i]) > 1e-7)
328 sum += (d >= 0.0 ? x[i] : -x[i]);
341 cpl_vector_delete(arr);