CR2RE Pipeline Reference Manual 1.6.10
hdrl_spectrum1d_shift-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/*-----------------------------------------------------------------------------
25 Includes
26 -----------------------------------------------------------------------------*/
27
28#include "hdrl_spectrum_shift.h"
29
30#include <math.h>
31#include <cpl.h>
32
33/*----------------------------------------------------------------------------*/
38/*----------------------------------------------------------------------------*/
39
40double calc_gauss(double mean, double sigma, double x){
41
42 double exponent = - pow((x- mean), 2.0) / (2.0 * sigma * sigma);
43 double v = 1.0/(2.0 * CPL_MATH_PI * sigma * sigma) * exp(exponent);
44 return v;
45}
46
47hdrl_value gauss_func(hdrl_data_t lambda){
48
49 hdrl_data_t mean = 1500;
50 hdrl_data_t sigma = 250;
51
52 double v = calc_gauss(mean, sigma, lambda);
53
54 return (hdrl_value){v, 0.0};
55}
56
57hdrl_value absorption1_func(hdrl_data_t lambda){
58
59 hdrl_data_t mean = 1754;
60 hdrl_data_t sigma = .75;
61
62 double v = calc_gauss(mean, sigma, lambda);
63
64 return (hdrl_value){ exp(-v), 0.0};
65}
66
67hdrl_value absorption2_func(hdrl_data_t lambda){
68
69 hdrl_data_t mean = 1504;
70 hdrl_data_t sigma = .75;
71
72 double v = calc_gauss(mean, sigma, lambda);
73
74 return (hdrl_value){ exp(-v), 0.0};
75}
76
77cpl_array * get_wlengths(double start, double stop, double step){
78
79 cpl_size sz = (cpl_size)floor((stop - start) / step);
80 cpl_array * arr = cpl_array_new(sz, HDRL_TYPE_DATA);
81
82 for(cpl_size i = 0; i < sz; i++){
83 cpl_array_set(arr, i, start);
84 start += step;
85 }
86
87 return arr;
88}
89
90void test_on_slope(void){
91 cpl_array * wlenghts = get_wlengths(1e3, 2e3, 1.0);
92
93 hdrl_spectrum1D * gaussian =
94 hdrl_spectrum1D_create_analytic(gauss_func, wlenghts, hdrl_spectrum1D_wave_scale_linear);
95
96 hdrl_spectrum1D * absorption =
97 hdrl_spectrum1D_create_analytic(absorption1_func, wlenghts, hdrl_spectrum1D_wave_scale_linear);
98
99
100 hdrl_spectrum1D * gaussian_with_abs =
101 hdrl_spectrum1D_mul_spectrum_create(gaussian, absorption);
102
103 hdrl_parameter * par =
104 hdrl_spectrum1D_shift_fit_parameter_create(1750, 1730, 1770, 1740, 1760, 20);
105
106 hdrl_data_t offset = hdrl_spectrum1D_compute_shift_fit(gaussian_with_abs, par);
107
108 cpl_test_rel((1.0 + offset) * 1750., 1754., 1e-3);
109
110 hdrl_spectrum1D_delete(&gaussian);
111 hdrl_spectrum1D_delete(&absorption);
112 hdrl_spectrum1D_delete(&gaussian_with_abs);
113 cpl_array_delete(wlenghts);
115}
116
117void test_on_peak(void){
118
119 cpl_array * wlenghts = get_wlengths(1e3, 2e3, 1.0);
120
121 hdrl_spectrum1D * gaussian =
122 hdrl_spectrum1D_create_analytic(gauss_func, wlenghts, hdrl_spectrum1D_wave_scale_linear);
123
124 hdrl_spectrum1D * absorption =
125 hdrl_spectrum1D_create_analytic(absorption2_func, wlenghts, hdrl_spectrum1D_wave_scale_linear);
126
127
128 hdrl_spectrum1D * gaussian_with_abs =
129 hdrl_spectrum1D_mul_spectrum_create(gaussian, absorption);
130
131 hdrl_parameter * par =
132 hdrl_spectrum1D_shift_fit_parameter_create(1500, 1480, 1520, 1490, 1510, 20);
133
134 hdrl_data_t offset = hdrl_spectrum1D_compute_shift_fit(gaussian_with_abs, par);
135
136 cpl_test_rel((1.0 + offset) * 1500., 1504., 1e-3);
137
138 hdrl_spectrum1D_delete(&gaussian);
139 hdrl_spectrum1D_delete(&absorption);
140 hdrl_spectrum1D_delete(&gaussian_with_abs);
141 cpl_array_delete(wlenghts);
143}
144
145
146void test_compute_shift_xcorrelation(void)
147{
148 cpl_array * wlenghts = get_wlengths(1e3, 2e3, 1.0);
149
150 hdrl_spectrum1D * gaussian = hdrl_spectrum1D_create_analytic(
151 gauss_func, wlenghts, hdrl_spectrum1D_wave_scale_linear);
152
153 hdrl_spectrum1D * absorption = hdrl_spectrum1D_create_analytic(
154 absorption2_func, wlenghts, hdrl_spectrum1D_wave_scale_linear);
155
156 cpl_size half_win = 1;
157
158 /* Test nulls */
159
161 NULL, NULL, half_win, CPL_FALSE);
162 cpl_test_error(CPL_ERROR_NULL_INPUT);
163
165 NULL, absorption, half_win, CPL_FALSE);
166 cpl_test_error(CPL_ERROR_NULL_INPUT);
167
169 gaussian, NULL, half_win, CPL_FALSE);
170 cpl_test_error(CPL_ERROR_NULL_INPUT);
171
173 gaussian, absorption, half_win, CPL_FALSE);
174 cpl_test_error(CPL_ERROR_ILLEGAL_INPUT);
175
176
177 hdrl_spectrum1D_delete(&gaussian);
178 hdrl_spectrum1D_delete(&absorption);
179 cpl_array_delete(wlenghts);
180}
181
182/*----------------------------------------------------------------------------*/
186/*----------------------------------------------------------------------------*/
187int main(void)
188{
189 cpl_test_init(PACKAGE_BUGREPORT, CPL_MSG_WARNING);
190
191 test_on_slope();
192 test_on_peak();
193
194 test_compute_shift_xcorrelation();
195
196 return cpl_test_end(0);
197}
198
void hdrl_parameter_delete(hdrl_parameter *obj)
shallow delete of a parameter
hdrl_parameter * hdrl_spectrum1D_shift_fit_parameter_create(const hdrl_data_t wguess, const hdrl_data_t range_wmin, const hdrl_data_t range_wmax, const hdrl_data_t fit_wmin, const hdrl_data_t fit_wmax, const hdrl_data_t fit_half_win)
The function create a hdrl_spectrum1D_shift_parameter to be used in hdrl_spectrum1D_compute_shift_fit...
hdrl_data_t hdrl_spectrum1D_compute_shift_fit(const hdrl_spectrum1D *obs, const hdrl_parameter *par)
The function compute the shift due to radial velocity. If wguess is the reference line and wfound is ...
hdrl_spectrum1D * hdrl_spectrum1D_mul_spectrum_create(const hdrl_spectrum1D *f1, const hdrl_spectrum1D *f2)
multiply one spectrum by another spectrum
void hdrl_spectrum1D_delete(hdrl_spectrum1D **p_self)
hdrl_spectrum1D destructor
hdrl_xcorrelation_result * hdrl_spectrum1D_compute_shift_xcorrelation(const hdrl_spectrum1D *s1, const hdrl_spectrum1D *s2, cpl_size half_win, const cpl_boolean normalize)
The function computes the shift between the two spectra.
hdrl_spectrum1D * hdrl_spectrum1D_create_analytic(calculate_analytic_spectrum_point func, const cpl_array *wavelength, hdrl_spectrum1D_wave_scale scale)
hdrl_spectrum1D constructor in the case of a spectrum defined by an analytical function