219 const hdrl_value lambdaRef,
const cpl_vector *lambdaIn,
220 cpl_vector *xShift, cpl_vector *yShift, cpl_vector *xShiftErr, cpl_vector *yShiftErr)
223 cpl_error_ensure(params && lambdaIn && xShift && yShift != NULL, CPL_ERROR_NULL_INPUT,
224 return CPL_ERROR_NULL_INPUT,
"NULL Input Parameters");
227 if (hdrl_dar_parameter_verify(params) != CPL_ERROR_NONE) {
228 return CPL_ERROR_UNSPECIFIED;
231 cpl_error_ensure(lambdaRef.data >= 0, CPL_ERROR_ILLEGAL_INPUT,
232 return CPL_ERROR_ILLEGAL_INPUT,
"Reference wavelength must be >=0");
235 const hdrl_dar_parameter *p_loc = (
const hdrl_dar_parameter *)params;
236 hdrl_value airmass = p_loc->airmass;
237 hdrl_value parang = p_loc->parang;
238 hdrl_value posang = p_loc->posang;
239 hdrl_value temp = p_loc->temp;
240 hdrl_value rhum = p_loc->rhum;
241 hdrl_value pres = p_loc->pres;
242 cpl_wcs *wcs = p_loc->wcs;
245 cpl_ensure_code(airmass.data >= 1., cpl_error_get_code());
248 hdrl_value z = {acos(1. / airmass.data),
249 airmass.error * fabs( (-1. / pow(airmass.data, 2)) / sqrt(1. - pow(1. / airmass.data, 2)) )};
257 double temp_kel_data = temp.data + 273.15;
258 double temp_kel_err = (temp.error / fabs(temp.data)) * fabs(temp_kel_data);
259 hdrl_value temp_kel = {temp_kel_data, temp_kel_err};
266 double HDRL_PHYS_hPa_TO_mmHg = 0.75006158;
273 hdrl_value fp = {rhum.data *sp.data *HDRL_PHYS_hPa_TO_mmHg,
274 fabs(HDRL_PHYS_hPa_TO_mmHg * sp.data ) * rhum.error
275 + fabs(HDRL_PHYS_hPa_TO_mmHg * rhum.data) * sp.error};
278 pres.data *= HDRL_PHYS_hPa_TO_mmHg;
279 pres.error *= HDRL_PHYS_hPa_TO_mmHg;
282 hdrl_value lambdaRef_um = {lambdaRef.data * 1e-4,lambdaRef.error * 1e-4};
287 hdrl_value x_shift = {-sin( (parang.data + posang.data) * CPL_MATH_RAD_DEG),
288 parang.error * fabs(-CPL_MATH_RAD_DEG * cos(parang.data + posang.data))
289 + posang.error * fabs(-CPL_MATH_RAD_DEG * cos(parang.data + posang.data))};
291 hdrl_value y_shift = { cos( (parang.data + posang.data) * CPL_MATH_RAD_DEG),
292 parang.error * fabs(-CPL_MATH_RAD_DEG * sin(parang.data + posang.data))
293 + posang.error * fabs(-CPL_MATH_RAD_DEG * sin(parang.data + posang.data))};
296 double xscale, yscale;
297 hdrl_dar_wcs_get_scales(wcs, &xscale, &yscale);
299 x_shift.data /= xscale;
300 x_shift.error /= xscale;
302 y_shift.data /= yscale;
303 y_shift.error /= yscale;
307 hdrl_value dr0 = {tan(z.data) * CPL_MATH_DEG_RAD,
308 z.error * fabs( (1. + pow(tan(z.data), 2)) * CPL_MATH_DEG_RAD)};
316 cpl_size nmax = cpl_vector_get_size(lambdaIn);
318 HDRL_OMP(omp parallel
for \
320 shared( nmax, lambdaIn, \
321 xShift, yShift, xShiftErr, yShiftErr, \
322 lambdaRef_um, pres, temp, fp, dr0, nr0, \
324 for (i = 0; i < nmax; i++) {
326 double lambda = cpl_vector_get(lambdaIn, i);
327 if (isfinite(lambda) != 0) {
329 hdrl_value lambda_um = {lambda * 1e-4, lambdaRef_um.error};
332 hdrl_value dr = {dr0.data * (nr0.data - nr.data),
333 dr0.error * fabs(nr0.data - nr.data)
334 + nr0.error * fabs( dr0.data)
335 + nr.error * fabs(-dr0.data)};
337 hdrl_value shiftPlaneX = {x_shift.data * dr.data,
338 x_shift.error * fabs(dr.data)
339 + dr.error * fabs(x_shift.data)};
340 cpl_vector_set(xShift, i, shiftPlaneX.data );
341 cpl_vector_set(xShiftErr, i, shiftPlaneX.error);
343 hdrl_value shiftPlaneY = {y_shift.data * dr.data,
344 y_shift.error * fabs(dr.data)
345 + dr.error * fabs(y_shift.data)};
346 cpl_vector_set(yShift, i, shiftPlaneY.data );
347 cpl_vector_set(yShiftErr, i, shiftPlaneY.error);
351 cpl_vector_set(xShift, i, NAN);
352 cpl_vector_set(xShiftErr, i, NAN);
354 cpl_vector_set(yShift, i, NAN);
355 cpl_vector_set(yShiftErr, i, NAN);
359 return CPL_ERROR_NONE;
427 hdrl_value hvL, hdrl_value hvP, hdrl_value hvT, hdrl_value hvF)
434 double errorL = hvL.error,
440 double lisq = 1. / (l * l);
441 double errorLisq = errorL * fabs(-2. / pow(l, 3) );
444 double nl1 = 64.328 + 29498.1 / (146. - lisq) + 255.4 / (41. - lisq);
445 double errorNl1 = errorLisq * fabs( 29498.1 / pow(146. - lisq, 2) + 255.4 / pow(41. - lisq, 2) );
448 double factor = 1.e-6;
449 double nl2A = nl1 * ( P / 720.883 * (1. + (1.049 -0.0157 * T) * 1e-6 * P) / (1. + 0.003661 * T) );
450 double errorNl2A1 = errorNl1 * fabs( factor *(P / 720.883 * (1. + (1.049 - 0.0157 * T) * 1e-6 * P) / (1. + 0.003661 * T) ) );
451 double errorNl2A2 = errorP * fabs( factor *(nl1 / (720.883 * (1. + 0.003661 * T)) *( (1. + (1.049 - 0.0157 * T) * 1e-6 * P) + P * (1.049 - 0.0157 * T) * 1e-6) ) );
452 double errorNl2A3 = errorT * fabs( factor *(nl1 * P / 720.883 * ( ( -0.0157 * 1e-6 * P * (1. + 0.003661 * T) - 0.003661 * (1. + (1.049 - 0.0157 * T) * 1e-6 * P) )/pow(1. + 0.003661 * T, 2) ) ) );
453 double errorNl2A = errorNl2A1 + errorNl2A2 + errorNl2A3;
456 double nl2B = (0.0624 - 0.000680 * lisq) / (1. + 0.003661 * T) * f;
457 double errorNl2B1 = errorLisq * fabs( -0.000680 * f / (1. + 0.003661 * T) );
458 double errorNl2B2 = errorT * fabs( -0.003661 * (0.0624 - 0.000680 * lisq) * f / pow(1. + 0.003661 * T, 2) );
459 double errorNl2B3 = errorF * fabs( (0.0624 - 0.000680 * lisq) / (1. + 0.003661 * T) );
460 double errorNl2B = errorNl2B1 + errorNl2B2 + errorNl2B3;
463 double nl2 = nl2A - nl2B;
464 double errorNl2 = errorNl2A + errorNl2B;
467 double nl3 = nl2 * 1e-6 + 1.;
468 double errorNl3 = fabs(errorNl2 * 1e-6);
470 return (hdrl_value){nl3,errorNl3};