CR2RE Pipeline Reference Manual 1.7.0
hdrl_cat_radii-test.c
1/*
2 * This file is part of the HDRL
3 * Copyright (C) 2017 European Southern Observatory
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
18 */
19
20#ifdef HAVE_CONFIG_H
21#include "config.h"
22#endif
23
24#include <cpl_test.h>
25
26#include "../hdrl_cat_apio.h"
27#include "../hdrl_cat_areals.h"
28#include "../hdrl_cat_moments.h"
29#include "../hdrl_cat_radii.h"
30
31#define NT 117
32#define SIZE_IMG 64
33
34
35static double radii[] = {2.5,3.53553,5.0,7.07107,10,14,20,25,30,35,40,50,60};
36
37static double fluxes[] = {13670.3, 19834.4, 23923.2, 25124.0, 25332.3, 25488.9,
38 25648.7, 25842.8, 25950.9, 25893.9, 25982,1, 25297.6, 24919.1};
39
40
41void flux_test(cpl_boolean execute_test)
42{
43 cpl_size x[] = {398,399,400,397,398,399,400,401,402,403,396,397,398,399,400,
44 401,402,403,404,395,396,397,398,399,400,401,402,403,404,405,
45 395,396,397,398,399,400,401,402,403,404,405,395,396,397,398,
46 399,400,401,402,403,404,405,395,396,397,398,399,400,401,402,
47 403,404,405,406,395,396,397,398,399,400,401,402,403,404,405,
48 395,396,397,398,399,400,401,402,403,404,405,395,396,397,398,
49 399,400,401,402,403,404,405,396,397,398,399,400,401,402,403,
50 404,397,398,399,400,401,402,403,398,399,400,401};
51
52 cpl_size y[] = {394,394,394,395,395,395,395,395,395,395,396,396,396,396,396,
53 396,396,396,396,397,397,397,397,397,397,397,397,397,397,397,
54 398,398,398,398,398,398,398,398,398,398,398,399,399,399,399,
55 399,399,399,399,399,399,399,400,400,400,400,400,400,400,400,
56 400,400,400,400,401,401,401,401,401,401,401,401,401,401,401,
57 402,402,402,402,402,402,402,402,402,402,402,403,403,403,403,
58 403,403,403,403,403,403,403,404,404,404,404,404,404,404,404,
59 404,405,405,405,405,405,405,405,406,406,406,406};
60
61 double z[] = {8.87152,12.515,7.69699,10.8527,22.2509,21.7368,13.0388,
62 12.1853,17.1976,7.43948,15.2245,29.1964,37.9117,57.9371,
63 71.5542,57.1288,34.7726,15.5934,11.5374,15.995,21.3606,
64 60.4006,103.46,147.55,168.274,147.476,98.9157,51.7186,20.188,
65 3.04248,5.77832,49.3103,98.2057,187.557,268.353,310.638,
66 274.295,183.969,94.6933,47.9889,20.245,26.3758,59.1781,
67 152.389,275.916,395.107,450.251,397.53,272.322,147.053,54.767,
68 11.8971,13.3888,73.3689,165.899,298.455,449.707,493.25,441.585,
69 299.31,157.474,70.1224,15.5313,8.76074,20.7188,54.5798,141.249,
70 264.87,382.736,435.452,393.871,268.175,138.485,65.9307,28.7812,
71 19.379,36.6449,93.5458,186.823,270.95,305.093,260.879,183.683,
72 100.676,32.6281,16.6497,5.94965,17.8105,57.256,106.32,145.264,
73 164.271,137.093,88.9384,60.7841,31.8582,10.0435,4.69162,
74 15.2187,32.5385,61.0381,74.5399,67.3727,43.3964,25.0956,
75 16.7595,-0.37323,21.3832,19.2497,18.5883,9.37448,19.6048,
76 11.5006,13.0159,14.5852,13.66,-1.04889};
77
78
79 /* Set up apm structure */
80 ap_t ap;
81 ap.lsiz = SIZE_IMG;
82 ap.csiz = SIZE_IMG;
83 ap.thresh = 11.0936;
84 ap.inframe = cpl_image_new(SIZE_IMG, SIZE_IMG, CPL_TYPE_DOUBLE);
85 ap.conframe = cpl_image_new(SIZE_IMG, SIZE_IMG, CPL_TYPE_DOUBLE);
86
87 /* Initialize */
88 hdrl_apinit(&ap);
89
90 ap.npl_pix = NT;
91 ap.plarray = cpl_realloc(ap.plarray, NT * sizeof(plstruct));
92 for (cpl_size i = 0; i < NT; i++) {
93 ap.plarray[i].x = x[i];
94 ap.plarray[i].y = y[i];
95 ap.plarray[i].z = z[i];
96 ap.plarray[i].zsm = z[i];
97 }
98
99 ap.xintmin = 0.;
100 ap.areal_offset = 3.47165;
101 ap.thresh = 11.0936;
102 ap.fconst = 1.4427;
103
104 /* Run the test */
105 cpl_size iareal[NAREAL];
106 hdrl_areals(&ap, iareal);
107
108 ap.indata = cpl_image_get_data_double(ap.inframe);
109 ap.confdata = cpl_image_get_data_double(ap.conframe);
110 ap.mflag = cpl_calloc(SIZE_IMG * SIZE_IMG, sizeof(*ap.mflag));
111
112 /* Create a background */
113 cpl_image_fill_noise_uniform(ap.inframe, -10., 10.);
114 cpl_image_add_scalar( ap.inframe, 5000.);
115 cpl_image_fill_noise_uniform(ap.conframe, 99, 101);
116
117 /* Do a basic moments analysis and work out the areal profiles*/
118 double momresults[8];
119 hdrl_moments(&ap, momresults);
120
121 /* Try and deblend the images if it is requested and justified */
122 double parmall[IMNUM][NPAR];
123 cpl_size nbit = 10;
124 for (cpl_size i = 0; i < IMNUM; i++) {
125 for (cpl_size j = 0; j < NPAR; j++) {
126 parmall[i][j] = 0.;
127 }
128 }
129
130 /* Get Kron radius for all images and get the flux */
131 double areal;
132 double kron_rad[IMNUM];
133 for (cpl_size k = 0; k < nbit; k++) {
134 areal = parmall[k][8];
135 kron_rad[k] = hdrl_kronrad(areal, radii, fluxes, NRADS);
136 }
137 if (execute_test) {
138 double kron_flux[IMNUM];
139 hdrl_flux(&ap, parmall, nbit, kron_rad, kron_flux, NRADS, radii, fluxes);
140 }
141
142 /* Get Petrosian radius for all images and get the flux */
143 double petr_rad[IMNUM];
144 for (cpl_size k = 0; k < nbit; k++) {
145 areal = parmall[k][8];
146 petr_rad[k] = hdrl_petrad(areal, radii, fluxes, NRADS);
147 }
148 if (execute_test) {
149 double petr_flux[IMNUM];
150 hdrl_flux(&ap, parmall, nbit, petr_rad, petr_flux, NRADS, radii, fluxes);
151 }
152
153 /* Clean up */
154 hdrl_apclose(&ap);
155 cpl_free(ap.mflag);
156 cpl_image_delete(ap.inframe);
157 cpl_image_delete(ap.conframe);
158}
159
160int main(void) {
161
162 /* Initialize */
163 cpl_test_init(PACKAGE_BUGREPORT, CPL_MSG_WARNING);
164
165 double halfrad = 2.35;
166 double exprad = 6.18;
167 double kronrad = 6.18;
168 double petrrad = 12.45;
169 double peak = 1007.07;
170 double areal = 120.;
171
172 double halflight;
173 double thresh;
174 double rad;
175
176
177 /* Test halflight */
178 halflight = fluxes[4] / 2.;
179 rad = hdrl_halflight(radii, fluxes, halflight, peak, NRADS);
180 cpl_test_rel(rad, halfrad, 0.01);
181
182 /* Test exprad */
183 thresh = 4.;
184 rad = hdrl_exprad(thresh, peak, areal, radii, NRADS);
185 cpl_test_rel(rad, exprad, 0.01);
186
187 /* Test Kron */
188 rad = hdrl_kronrad(areal, radii, fluxes, NRADS);
189 cpl_test_rel(rad, kronrad, 0.01);
190
191 /* Test Petrosian */
192 rad = hdrl_petrad(areal, radii, fluxes, NRADS);
193 cpl_test_rel(rad, petrrad, 0.01);
194
195 /* Flux_test. TODO: Fail in Debian 6.0 [debug - i686] and Debian 7.0 [debug x86_64]
196 * Maybe for optiomization in the debug compiler mode for this machine.
197 * Activate the test when this will be solve */
198 flux_test(CPL_FALSE);
199
200 return cpl_test_end(0);
201}
void hdrl_apinit(ap_t *ap)
Initialize the ap structure.
void hdrl_apclose(ap_t *ap)
Close ap structure.
void hdrl_areals(ap_t *ap, cpl_size iareal[NAREAL])
Work out the areal profiles for an object.
void hdrl_moments(ap_t *ap, double results[])
Do moments analysis on an object in a Plessey array.
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.