MOONS Pipeline Reference Manual 0.13.2
moons_science_xswitch.c
1/*
2 * This file is part of the MOONS Pipeline
3 * Copyright (C) 2002-2016 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 Street, 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 "moo_utils.h"
29#include "moo_pfits.h"
30#include "moo_dfs.h"
31#include "moo_params.h"
32#include "moo_drl.h"
33#include "moo_badpix.h"
34#include "moo_extlist.h"
35#include "moo_subtract_nod.h"
36#include "moo_combine_pair.h"
37#include "moo_products.h"
38#include <cpl.h>
39
40#include <string.h>
41
42/*-----------------------------------------------------------------------------
43 Plugin registration
44 -----------------------------------------------------------------------------*/
45
46int cpl_plugin_get_info(cpl_pluginlist *list);
47
48/*-----------------------------------------------------------------------------
49 Private function prototypes
50 -----------------------------------------------------------------------------*/
51
52static int _moons_science_xswitch_create(cpl_plugin *plugin);
53static int _moons_science_xswitch_exec(cpl_plugin *plugin);
54static int _moons_science_xswitch_destroy(cpl_plugin *plugin);
55static int _moons_science_xswitch(cpl_frameset *frameset,
56 const cpl_parameterlist *parlist);
57
58/*-----------------------------------------------------------------------------
59 Static variables
60 -----------------------------------------------------------------------------*/
61static const char *const _moons_science_xswitch_description =
62 "From an observation sequence in XSwitch mode, this recipe removes "
63 "the instrumental signature and provides calibrated science products. "
64 "During the sequence, the telescope nods from one position on the sky "
65 "(labeled as A in Fig. 5-11) to another (B). In the sequence, different "
66 "slit"
67 " offset positions can be used: as represented in Fig. 5-11, the "
68 "combination "
69 "is done with 1D wavelength calibrated sky subtracted spectra. Using "
70 "different"
71 " slit offset positions implies that different sets of calibration "
72 "(FF, wave maps) are given as inputs.\n"
73 "INPUT FRAMES\n"
74 " * science exposure frames n>=1 file(s) (RAW) with tag "
75 "OBJECT_XSWITCH : "
76 "science frame in xswitch mode file\n"
77 " * [OPTIONAL] ReferenceBadPixMask 1 file (QUA) with tag "
78 "BP_MAP_RP : "
79 "cosmetic bad pixel map\n"
80 " * [OPTIONAL] NonLinearityBadPixMask 1 file (QUA) with tag "
81 "BP_MAP_NL : "
82 "cosmetic bad pixel map coming from linearity recipe\n"
83 " * MasterBias 1 file (DET) with tag "
84 "MASTER_BIAS : "
85 "master bias file\n"
86 " * MasterDarkNir 1 file (DET) with tag "
87 "MASTER_DARK_NIR : "
88 "master dark nir for object\n"
89 " * [OPTIONAL] MasterDarkNir 1 file (DET) with tag "
90 "MASTER_DARK_NIR : "
91 "master dark nir file for sky (if exposure time is different from object)\n"
92 " * [OPTIONAL] MasterDarkVis 1 file (DET) with tag "
93 "MASTER_DARK_VIS : "
94 "master dark vis file\n"
95 " * [OPTIONAL] CoeffsCube 1 or 2 file(s) one by offset (3D) with tag "
96 "LINEARITY_COEFF_CUBE : "
97 "coefficients to correct pixels detector linearity\n"
98 " * [OPTIONAL] P2pMap 1 file (DET) with tag "
99 "P2P_MAP : "
100 "pixel to pixel map\n"
101 " * Fftrace 1 or 2 file(s) one by offset (LOC) with tag "
102 "FF_TRACE :"
103 "the localisation table\n"
104 " * [OPTIONAL] MasterFlat 1 or 2 file(s) one by offset (PSF) with tag "
105 "MASTER_FLAT : "
106 "the master flat used for optimal extraction\n"
107 " * Ffext 1 or 2 file(s) one by offset (EXT) with tag "
108 "FF_EXTSPECTRA : "
109 "the extracted flat field\n"
110 " * F2f [OPTIONAL] 1 or 2 file(s) one by offset (F2F) with tag "
111 "F2F_TABLE :"
112 "the fibre-to-fibre relative response\n"
113 " * SFormat 1 file (FMT) with tag "
114 "SPECTRAL_FORMAT : "
115 "the spectral format table\n"
116 " * WaveMap 1 or 2 file(s) one by offset (WMAP) with tag "
117 "WAVE_MAP : "
118 "the wavelength map\n"
119 " * SkyLines 1 file (CAT) with tag "
120 "SKY_LINE_LIST : "
121 "the sky lines list table\n"
122 " * [OPTIONAL] response 1 file (RESPONSE) with "
123 "tag RESPONSE : "
124 "the response spectra in the extracted pixel space\n"
125 " * [OPTIONAL] atmosExt 1 file (ATMO) with tag "
126 "ATMOS_EXT : "
127 "the atmospheric extinction table\n"
128 "PRODUCTS\n"
129 " * SCIENCE_XSWITCH_RBNSPECTRA_OFFSET[offset]_[insmode]_i.fits (RBN) with "
130 "tag "
131 "xswitch_RBNSPECTRA : "
132 "Science product individual calibrated frames\n"
133 " * SCIENCE_XSWITCH_SKSSPECTRA_OFFSET[offset]_[insmode]_i.fits (SCI) with "
134 "tag "
135 "xswitch_SKSSPECTRA : "
136 "Science product individual sky subtracted frames\n"
137 " * SCIENCE_XSWITCH_SKSSPECTRA_[insmode].fits (SCI) with "
138 "tag "
139 "xswitch_SKSSPECTRA : "
140 "Science product coadd calibrated frame\n"
141 " * [OPTIONAL] SCIENCE_XSWITCH_FLXSPECTRA_[insmode].fits (SCI) with "
142 "tag "
143 "xswitch_FLXSPECTRA : "
144 "Science product flux calibrated frame\n"
145 "\n";
146
147/*-----------------------------------------------------------------------------
148 Function code
149 -----------------------------------------------------------------------------*/
150
151/*----------------------------------------------------------------------------*/
161/*----------------------------------------------------------------------------*/
162
163int
164cpl_plugin_get_info(cpl_pluginlist *list)
165{
166 cpl_recipe *recipe = cpl_calloc(1, sizeof *recipe);
167 cpl_plugin *plugin = &recipe->interface;
168
169 if (cpl_plugin_init(plugin, CPL_PLUGIN_API, MOONS_BINARY_VERSION,
170 CPL_PLUGIN_TYPE_RECIPE, "moons_science_xswitch",
171 "Reduces science exposure in xswitch mode",
172 _moons_science_xswitch_description, "Regis Haigron",
173 PACKAGE_BUGREPORT, moo_get_license(),
174 _moons_science_xswitch_create,
175 _moons_science_xswitch_exec,
176 _moons_science_xswitch_destroy)) {
177 cpl_msg_error(cpl_func, "Plugin initialization failed");
178 (void)cpl_error_set_where(cpl_func);
179 return 1;
180 }
181
182 if (cpl_pluginlist_append(list, plugin)) {
183 cpl_msg_error(cpl_func, "Error adding plugin to list");
184 (void)cpl_error_set_where(cpl_func);
185 return 1;
186 }
187
188 return 0;
189}
190
191
192/*----------------------------------------------------------------------------*/
200/*----------------------------------------------------------------------------*/
201
202static int
203_moons_science_xswitch_create(cpl_plugin *plugin)
204{
205 cpl_recipe *recipe;
206
207 /* Do not create the recipe if an error code is already set */
208 if (cpl_error_get_code() != CPL_ERROR_NONE) {
209 cpl_msg_error(cpl_func, "%s():%d: An error is already set: %s",
210 cpl_func, __LINE__, cpl_error_get_where());
211 return (int)cpl_error_get_code();
212 }
213
214 if (plugin == NULL) {
215 cpl_msg_error(cpl_func, "Null plugin");
216 cpl_ensure_code(0, (int)CPL_ERROR_NULL_INPUT);
217 }
218
219 /* Verify plugin type */
220 if (cpl_plugin_get_type(plugin) != CPL_PLUGIN_TYPE_RECIPE) {
221 cpl_msg_error(cpl_func, "Plugin is not a recipe");
222 cpl_ensure_code(0, (int)CPL_ERROR_TYPE_MISMATCH);
223 }
224
225 /* Get the recipe */
226 recipe = (cpl_recipe *)plugin;
227
228 /* Create the parameters list in the cpl_recipe object */
229 recipe->parameters = cpl_parameterlist_new();
230 if (recipe->parameters == NULL) {
231 cpl_msg_error(cpl_func, "Parameter list allocation failed");
232 cpl_ensure_code(0, (int)CPL_ERROR_ILLEGAL_OUTPUT);
233 }
234
235 moo_params *params = moo_params_new("moons", "moons_science_xswitch");
236
237 /* Fill the parameters list */
238 moo_params_add_keep_temp(params, recipe->parameters);
239 moo_params_add_prepare(params, recipe->parameters);
240 moo_params_add_correct_bias(params, recipe->parameters,
241 MOO_CORRECT_BIAS_METHOD_MASTER);
242 moo_params_add_extract(params, recipe->parameters);
243 moo_params_add_science_wavesol(params, recipe->parameters);
244 moo_params_add_rebin(params, recipe->parameters);
245 moo_params_add_target_table(params, recipe->parameters, CPL_FALSE);
246 moo_params_add_combine_pair(params, recipe->parameters, CPL_TRUE);
247 moo_params_add_sub_sky_stare(params, recipe->parameters);
248 moo_params_add_coadd(params, recipe->parameters);
249 moo_params_add_create_s1d(params, recipe->parameters);
250 moo_params_delete(params);
251
252 return 0;
253}
254
255
256/*----------------------------------------------------------------------------*/
262/*----------------------------------------------------------------------------*/
263
264static int
265_moons_science_xswitch_exec(cpl_plugin *plugin)
266{
267 cpl_recipe *recipe;
268 int recipe_status;
269 cpl_errorstate initial_errorstate = cpl_errorstate_get();
270
271 /* Return immediately if an error code is already set */
272 if (cpl_error_get_code() != CPL_ERROR_NONE) {
273 cpl_msg_error(cpl_func, "%s():%d: An error is already set: %s",
274 cpl_func, __LINE__, cpl_error_get_where());
275 return (int)cpl_error_get_code();
276 }
277
278 if (plugin == NULL) {
279 cpl_msg_error(cpl_func, "Null plugin");
280 cpl_ensure_code(0, (int)CPL_ERROR_NULL_INPUT);
281 }
282
283 /* Verify plugin type */
284 if (cpl_plugin_get_type(plugin) != CPL_PLUGIN_TYPE_RECIPE) {
285 cpl_msg_error(cpl_func, "Plugin is not a recipe");
286 cpl_ensure_code(0, (int)CPL_ERROR_TYPE_MISMATCH);
287 }
288
289 /* Get the recipe */
290 recipe = (cpl_recipe *)plugin;
291
292 /* Verify parameter and frame lists */
293 if (recipe->parameters == NULL) {
294 cpl_msg_error(cpl_func, "Recipe invoked with NULL parameter list");
295 cpl_ensure_code(0, (int)CPL_ERROR_NULL_INPUT);
296 }
297 if (recipe->frames == NULL) {
298 cpl_msg_error(cpl_func, "Recipe invoked with NULL frame set");
299 cpl_ensure_code(0, (int)CPL_ERROR_NULL_INPUT);
300 }
301
302 /* Invoke the recipe */
303 recipe_status = _moons_science_xswitch(recipe->frames, recipe->parameters);
304
305 /* Ensure DFS-compliance of the products */
306 if (cpl_dfs_update_product_header(recipe->frames)) {
307 if (!recipe_status)
308 recipe_status = (int)cpl_error_get_code();
309 }
310
311 if (!cpl_errorstate_is_equal(initial_errorstate)) {
312 /* Dump the error history since recipe execution start.
313 At this point the recipe cannot recover from the error */
314 cpl_errorstate_dump(initial_errorstate, CPL_FALSE, NULL);
315 }
316
317 return recipe_status;
318}
319
320
321/*----------------------------------------------------------------------------*/
327/*----------------------------------------------------------------------------*/
328
329static int
330_moons_science_xswitch_destroy(cpl_plugin *plugin)
331{
332 cpl_recipe *recipe;
333
334 if (plugin == NULL) {
335 cpl_msg_error(cpl_func, "Null plugin");
336 cpl_ensure_code(0, (int)CPL_ERROR_NULL_INPUT);
337 }
338
339 /* Verify plugin type */
340 if (cpl_plugin_get_type(plugin) != CPL_PLUGIN_TYPE_RECIPE) {
341 cpl_msg_error(cpl_func, "Plugin is not a recipe");
342 cpl_ensure_code(0, (int)CPL_ERROR_TYPE_MISMATCH);
343 }
344
345 /* Get the recipe */
346 recipe = (cpl_recipe *)plugin;
347
348 cpl_parameterlist_delete(recipe->parameters);
349
350 return 0;
351}
352
353static cpl_error_code
354_moons_science_xswitch_check_sof(cpl_frameset *frameset,
355 cpl_frameset *offset_frameset,
356 const char **bpmap_rp_name,
357 const char **bpmap_nl_name,
358 const cpl_frame **masterbias,
359 const cpl_frame **masterdark_vis,
360 cpl_frameset *masterdark_nir,
361 const cpl_frame **p2pmap,
362 const cpl_frame **sformat,
363 const cpl_frame **sky_lines,
364 const cpl_frame **atmo,
365 const cpl_frame **resp,
366 const cpl_frame **airglow_group,
367 const cpl_frame **airglow_var,
368 const cpl_frame **solflux,
369 const moo_sub_sky_stare_params *subsky_params)
370{
371 cpl_ensure_code(moo_dfs_set_groups(frameset) == CPL_ERROR_NONE,
372 cpl_error_get_code());
373 int i;
374
375 for (i = 0; i < cpl_frameset_get_size(frameset); ++i) {
376 cpl_frame *current_frame = cpl_frameset_get_position(frameset, i);
377 if (!strcmp(cpl_frame_get_tag(current_frame),
378 MOONS_TAG_OBJECT_XSWITCH)) {
379 cpl_frameset_insert(offset_frameset,
380 cpl_frame_duplicate(current_frame));
381 }
382 else if (!strcmp(cpl_frame_get_tag(current_frame),
383 MOONS_TAG_BP_MAP_RP)) {
384 *bpmap_rp_name = cpl_frame_get_filename(current_frame);
385 }
386 else if (!strcmp(cpl_frame_get_tag(current_frame),
387 MOONS_TAG_BP_MAP_NL)) {
388 *bpmap_nl_name = cpl_frame_get_filename(current_frame);
389 }
390 else if (!strcmp(cpl_frame_get_tag(current_frame),
391 MOONS_TAG_MASTER_BIAS)) {
392 *masterbias = current_frame;
393 }
394 else if (!strcmp(cpl_frame_get_tag(current_frame),
395 MOONS_TAG_MASTER_DARK_VIS)) {
396 *masterdark_vis = current_frame;
397 }
398 else if (!strcmp(cpl_frame_get_tag(current_frame),
399 MOONS_TAG_MASTER_DARK_NIR)) {
400 cpl_frameset_insert(masterdark_nir,
401 cpl_frame_duplicate(current_frame));
402 }
403 else if (!strcmp(cpl_frame_get_tag(current_frame),
404 MOONS_TAG_MASTER_FLAT)) {
405 cpl_frameset_insert(offset_frameset,
406 cpl_frame_duplicate(current_frame));
407 }
408 else if (!strcmp(cpl_frame_get_tag(current_frame), MOONS_TAG_P2P_MAP)) {
409 *p2pmap = current_frame;
410 }
411 else if (!strcmp(cpl_frame_get_tag(current_frame),
412 MOONS_TAG_FF_TRACE)) {
413 cpl_frameset_insert(offset_frameset,
414 cpl_frame_duplicate(current_frame));
415 }
416 else if (!strcmp(cpl_frame_get_tag(current_frame),
417 MOONS_TAG_LINEARITY_COEFF_CUBE)) {
418 cpl_frameset_insert(offset_frameset,
419 cpl_frame_duplicate(current_frame));
420 }
421 else if (!strcmp(cpl_frame_get_tag(current_frame),
422 MOONS_TAG_SPECTRAL_FORMAT)) {
423 *sformat = current_frame;
424 }
425 else if (!strcmp(cpl_frame_get_tag(current_frame), MOONS_TAG_WAVEMAP)) {
426 cpl_frameset_insert(offset_frameset,
427 cpl_frame_duplicate(current_frame));
428 }
429 else if (!strcmp(cpl_frame_get_tag(current_frame),
430 MOONS_TAG_SKY_LINE_LIST)) {
431 *sky_lines = current_frame;
432 }
433 else if (!strcmp(cpl_frame_get_tag(current_frame),
434 MOONS_TAG_FF_EXTSPECTRA)) {
435 cpl_frameset_insert(offset_frameset,
436 cpl_frame_duplicate(current_frame));
437 }
438 else if (!strcmp(cpl_frame_get_tag(current_frame),
439 MOONS_TAG_F2F_TABLE)) {
440 cpl_frameset_insert(offset_frameset,
441 cpl_frame_duplicate(current_frame));
442 }
443 else if (!strcmp(cpl_frame_get_tag(current_frame),
444 MOONS_TAG_ATMOS_EXT)) {
445 *atmo = current_frame;
446 }
447 else if (!strcmp(cpl_frame_get_tag(current_frame),
448 MOONS_TAG_RESPONSE)) {
449 *resp = current_frame;
450 }
451 else if (!strcmp(cpl_frame_get_tag(current_frame),
452 MOONS_TAG_AIRGLOW_GROUP)) {
453 *airglow_group = current_frame;
454 }
455 else if (!strcmp(cpl_frame_get_tag(current_frame),
456 MOONS_TAG_AIRGLOW_VAR)) {
457 *airglow_var = current_frame;
458 }
459 else if (!strcmp(cpl_frame_get_tag(current_frame), MOONS_TAG_SOLFLUX)) {
460 *solflux = current_frame;
461 }
462 }
463
464 if (*sformat == NULL) {
465 return (int)cpl_error_set_message(cpl_func, CPL_ERROR_DATA_NOT_FOUND,
466 "SOF does not have any file tagged "
467 "with %s",
468 MOONS_TAG_SPECTRAL_FORMAT);
469 }
470
471 if (*sky_lines == NULL) {
472 return (int)cpl_error_set_message(cpl_func, CPL_ERROR_DATA_NOT_FOUND,
473 "SOF does not have any file tagged "
474 "with %s",
475 MOONS_TAG_SKY_LINE_LIST);
476 }
477
478 if (*airglow_group == NULL &&
479 strcmp(subsky_params->method, MOO_SUB_SKY_STARE_METHOD_SKYCORR) == 0) {
480 return (int)cpl_error_set_message(cpl_func, CPL_ERROR_DATA_NOT_FOUND,
481 "SOF does not have any file tagged "
482 "with %s",
483 MOONS_TAG_AIRGLOW_GROUP);
484 }
485 if (*airglow_var == NULL &&
486 strcmp(subsky_params->method, MOO_SUB_SKY_STARE_METHOD_SKYCORR) == 0) {
487 return (int)cpl_error_set_message(cpl_func, CPL_ERROR_DATA_NOT_FOUND,
488 "SOF does not have any file tagged "
489 "with %s",
490 MOONS_TAG_AIRGLOW_VAR);
491 }
492 if (*solflux == NULL &&
493 strcmp(subsky_params->method, MOO_SUB_SKY_STARE_METHOD_SKYCORR) == 0) {
494 return (int)cpl_error_set_message(cpl_func, CPL_ERROR_DATA_NOT_FOUND,
495 "SOF does not have any file tagged "
496 "with %s",
497 MOONS_TAG_SOLFLUX);
498 }
499 return CPL_ERROR_NONE;
500}
501
502static cpl_error_code
503_moons_science_xswitch_check_sof_byoffset(cpl_frameset *frameset,
504 cpl_frameset *node_frameset,
505 const cpl_frame **master_flat,
506 const cpl_frame **fftrace,
507 const cpl_frame **coeffs_cube,
508 const cpl_frame **wmap,
509 const cpl_frame **flat,
510 const cpl_frame **f2f,
511 moo_extract_params *ext_params)
512{
513 cpl_ensure_code(moo_dfs_set_groups(frameset) == CPL_ERROR_NONE,
514 cpl_error_get_code());
515 int nb_object = 0;
516 int i;
517
518 for (i = 0; i < cpl_frameset_get_size(frameset); ++i) {
519 cpl_frame *current_frame = cpl_frameset_get_position(frameset, i);
520 if (!strcmp(cpl_frame_get_tag(current_frame),
521 MOONS_TAG_OBJECT_XSWITCH)) {
522 cpl_frameset_insert(node_frameset,
523 cpl_frame_duplicate(current_frame));
524 nb_object++;
525 }
526 else if (!strcmp(cpl_frame_get_tag(current_frame),
527 MOONS_TAG_MASTER_FLAT)) {
528 *master_flat = current_frame;
529 }
530
531 else if (!strcmp(cpl_frame_get_tag(current_frame),
532 MOONS_TAG_FF_TRACE)) {
533 *fftrace = current_frame;
534 }
535 else if (!strcmp(cpl_frame_get_tag(current_frame),
536 MOONS_TAG_LINEARITY_COEFF_CUBE)) {
537 *coeffs_cube = current_frame;
538 }
539 else if (!strcmp(cpl_frame_get_tag(current_frame), MOONS_TAG_WAVEMAP)) {
540 *wmap = current_frame;
541 }
542 else if (!strcmp(cpl_frame_get_tag(current_frame),
543 MOONS_TAG_FF_EXTSPECTRA)) {
544 *flat = current_frame;
545 }
546 else if (!strcmp(cpl_frame_get_tag(current_frame),
547 MOONS_TAG_F2F_TABLE)) {
548 *f2f = current_frame;
549 }
550 }
551
552
553 if (nb_object <= 0) {
554 return (int)cpl_error_set_message(cpl_func, CPL_ERROR_DATA_NOT_FOUND,
555 "SOF does not have any file tagged "
556 "with %s",
557 MOONS_TAG_OBJECT_XSWITCH);
558 }
559
560 if (*fftrace == NULL) {
561 return (int)cpl_error_set_message(cpl_func, CPL_ERROR_DATA_NOT_FOUND,
562 "SOF does not have any file tagged "
563 "with %s",
564 MOONS_TAG_FF_TRACE);
565 }
566
567 if (*wmap == NULL) {
568 return (int)cpl_error_set_message(cpl_func, CPL_ERROR_DATA_NOT_FOUND,
569 "SOF does not have any file tagged "
570 "with %s",
571 MOONS_TAG_WAVEMAP);
572 }
573 if (*flat == NULL) {
574 return (int)cpl_error_set_message(cpl_func, CPL_ERROR_DATA_NOT_FOUND,
575 "SOF does not have any file tagged "
576 "with %s",
577 MOONS_TAG_FF_EXTSPECTRA);
578 }
579 if (*master_flat == NULL &&
580 strcmp(ext_params->method, MOO_EXTRACT_METHOD_OPTIMAL) == 0) {
581 return (int)cpl_error_set_message(cpl_func, CPL_ERROR_DATA_NOT_FOUND,
582 "SOF does not have any file tagged "
583 "with %s",
584 MOONS_TAG_MASTER_FLAT);
585 }
586 return CPL_ERROR_NONE;
587}
588
589
590static cpl_error_code
591_moons_p2pmap(moo_det *arc, const cpl_frame *p2pmap)
592{
593 cpl_error_code status = CPL_ERROR_NONE;
594 moo_det *p2p = NULL;
595
596 if (p2pmap != NULL) {
597 moo_try_check(p2p = moo_det_create(p2pmap), " ");
598 moo_try_check(moo_apply_p2p(arc, p2p), " ");
599 }
600moo_try_cleanup:
601 moo_det_delete(p2p);
602 return status;
603}
604
605static cpl_error_code
606_moons_apply_flat(moo_ext *ext,
607 const cpl_frame *flat_frame,
608 const cpl_frame *f2f_frame)
609{
610 cpl_error_code status = CPL_ERROR_NONE;
611 moo_ext *flat = NULL;
612 moo_f2f *f2f = NULL;
613
614 moo_try_check(flat = moo_ext_create(flat_frame), " ");
615 if (f2f_frame != NULL) {
616 f2f = moo_f2f_load(f2f_frame);
617 }
618 moo_try_check(moo_apply_flat(ext, flat, f2f), " ");
619
620moo_try_cleanup:
621 moo_ext_delete(flat);
622 moo_f2f_delete(f2f);
623 return status;
624}
625
626static moo_sci *
627_moons_combine_pair(moo_rbn *rbn,
628 moo_rbn *sky_rbn,
629 moo_rbn *obj_rbn,
630 moo_target_table *target_table,
631 const cpl_frame *f2f_frame,
632 const cpl_frame *solflux_frame,
633 const cpl_frame *airglow_group_frame,
634 const cpl_frame *airglow_var_frame,
635 moo_combine_pair_params *combine_pair_params,
636 moo_sub_sky_stare_params *sky_params,
637 const char *sci_filename,
638 moo_products *products,
639 const cpl_frame *ref_frame)
640{
641 moo_sci *result = NULL;
642
643 moo_f2f *f2f = NULL;
644
645 if (f2f_frame != NULL) {
646 f2f = moo_f2f_load(f2f_frame);
647 }
648 moo_try_check(result =
649 moo_combine_pair(rbn, sky_rbn, obj_rbn, target_table, f2f,
650 solflux_frame, airglow_group_frame,
651 airglow_var_frame, combine_pair_params,
652 sky_params, sci_filename, products,
653 ref_frame),
654 " ");
655
656moo_try_cleanup:
657 moo_f2f_delete(f2f);
658 return result;
659}
660
661
662static cpl_frame *
663_moons_science_xswitch_frame(int inum,
664 const char *mode,
665 int offset,
666 moo_ext *objA_ext,
667 moo_ext *objB_ext,
668 moo_ext *nod_ext,
669 const cpl_frame *objA_ref_frame,
670 const cpl_frame *objB_ref_frame,
671 moo_spectral_format *sformat,
672 moo_sky_lines_list *sky_lines,
673 moo_map *wmap,
674 const cpl_frame *f2f_frame,
675 const cpl_frame *airglow_group_frame,
676 const cpl_frame *airglow_var_frame,
677 const cpl_frame *solflux_frame,
678 const cpl_frame *atmo_frame,
679 const cpl_frame *resp_frame,
680 moo_rebin_params *rbn_params,
681 moo_target_table_params *target_table_params,
682 moo_combine_pair_params *combine_pair_params,
683 moo_sub_sky_stare_params *sky_params,
684 moo_products *products)
685{
686 cpl_frame *sci_frame = NULL;
687 moo_rbn *nod_rbn = NULL;
688 moo_rbn *objB_rbn = NULL;
689 moo_rbn *objA_rbn = NULL;
690 moo_atm *atm = NULL;
691 moo_resp *resp = NULL;
692
693 moo_target_table *target_table = NULL;
694 moo_sci *sci = NULL;
695
696 char *nod_rbn_filename = NULL;
697 char *objB_rbn_filename = NULL;
698 char *objA_rbn_filename = NULL;
699 char *nod_calibflux_filename = NULL;
700 char *objB_calibflux_filename = NULL;
701 char *objA_calibflux_filename = NULL;
702
703 char *ttable_filename = NULL;
704 char *sci_filename = NULL;
705
706 cpl_ensure(nod_ext != NULL, CPL_ERROR_NULL_INPUT, NULL);
707 cpl_ensure(objA_ext != NULL, CPL_ERROR_NULL_INPUT, NULL);
708 cpl_ensure(objB_ext != NULL, CPL_ERROR_NULL_INPUT, NULL);
709
710 nod_rbn_filename =
711 cpl_sprintf("%s_NOD_OFFSET%d_%s_%d.fits",
712 MOONS_TAG_SCIENCE_XSWITCH_RBNSPECTRA, offset, mode, inum);
713 moo_try_check(nod_rbn = moo_rebin(nod_ext, wmap, sformat, rbn_params,
714 nod_rbn_filename),
715 " ");
716 moo_try_check(moo_rbn_compute_snr(nod_rbn, sky_lines), " ");
717 moo_try_check(moo_products_add_rbn(products, nod_rbn, CPL_FRAME_LEVEL_FINAL,
718 MOONS_TAG_SCIENCE_XSWITCH_RBNSPECTRA,
719 nod_rbn_filename, objA_ref_frame),
720 " ");
721
722 objB_rbn_filename =
723 cpl_sprintf("%s_B_OFFSET%d_%s_%d.fits",
724 MOONS_TAG_SCIENCE_XSWITCH_RBNSPECTRA, offset, mode, inum);
725 moo_try_check(objB_rbn = moo_rebin(objB_ext, wmap, sformat, rbn_params,
726 objB_rbn_filename),
727 " ");
728 moo_try_check(moo_rbn_compute_snr(objB_rbn, sky_lines), " ");
729 moo_try_check(moo_products_add_rbn(products, objB_rbn,
730 CPL_FRAME_LEVEL_INTERMEDIATE,
731 MOONS_TAG_SCIENCE_XSWITCH_RBNSPECTRA,
732 objB_rbn_filename, objB_ref_frame),
733 " ");
734 objA_rbn_filename =
735 cpl_sprintf("%s_A_OFFSET%d_%s_%d.fits",
736 MOONS_TAG_SCIENCE_XSWITCH_RBNSPECTRA, offset, mode, inum);
737 moo_try_check(objA_rbn = moo_rebin(objA_ext, wmap, sformat, rbn_params,
738 objA_rbn_filename),
739 " ");
740 moo_try_check(moo_rbn_compute_snr(objA_rbn, sky_lines), " ");
741 moo_try_check(moo_products_add_rbn(products, objA_rbn,
742 CPL_FRAME_LEVEL_INTERMEDIATE,
743 MOONS_TAG_SCIENCE_XSWITCH_RBNSPECTRA,
744 objA_rbn_filename, objA_ref_frame),
745 " ");
746
747 if (atmo_frame != NULL && resp_frame != NULL) {
748 moo_try_check(atm = moo_atm_load(atmo_frame), " ");
749 moo_try_check(resp = moo_resp_load(resp_frame), " ");
750
751 nod_calibflux_filename =
752 cpl_sprintf("%s_NOD_OFFSET%d_%s_%d.fits",
753 MOONS_TAG_SCIENCE_XSWITCH_RBNFLXSPECTRA, offset, mode,
754 inum);
755 moo_try_check(moo_calib_flux(nod_rbn, atm, resp), " ");
756 moo_try_check(
757 moo_products_add_rbn(products, nod_rbn, CPL_FRAME_LEVEL_FINAL,
758 MOONS_TAG_SCIENCE_XSWITCH_RBNFLXSPECTRA,
759 nod_calibflux_filename, objA_ref_frame),
760 " ");
761
762 objA_calibflux_filename =
763 cpl_sprintf("%s_A_OFFSET%d_%s_%d.fits",
764 MOONS_TAG_SCIENCE_XSWITCH_RBNFLXSPECTRA, offset, mode,
765 inum);
766 moo_try_check(moo_calib_flux(objA_rbn, atm, resp), " ");
767 moo_try_check(moo_products_add_rbn(
768 products, objA_rbn, CPL_FRAME_LEVEL_INTERMEDIATE,
769 MOONS_TAG_SCIENCE_XSWITCH_RBNFLXSPECTRA,
770 objA_calibflux_filename, objA_ref_frame),
771 " ");
772
773 objB_calibflux_filename =
774 cpl_sprintf("%s_B_OFFSET%d_%s_%d.fits",
775 MOONS_TAG_SCIENCE_XSWITCH_RBNFLXSPECTRA, offset, mode,
776 inum);
777 moo_try_check(moo_calib_flux(objB_rbn, atm, resp), " ");
778 moo_try_check(moo_products_add_rbn(
779 products, objB_rbn, CPL_FRAME_LEVEL_INTERMEDIATE,
780 MOONS_TAG_SCIENCE_XSWITCH_RBNFLXSPECTRA,
781 objB_calibflux_filename, objB_ref_frame),
782 " ");
783 }
784 else {
785 cpl_msg_info(__func__, "No flux calibration");
786 }
787 moo_try_check(target_table = moo_create_target_table(objA_rbn, objB_rbn,
788 MOO_MODE_XSWITCH,
789 target_table_params),
790 " ");
791 ttable_filename =
792 cpl_sprintf("%s_OFFSET%d_%s_%d.fits", MOONS_TAG_XSWITCH_TARGET_TABLE,
793 offset, mode, inum);
794 moo_try_check(moo_products_add_target_table(products, target_table,
795 CPL_FRAME_LEVEL_INTERMEDIATE,
796 MOONS_TAG_XSWITCH_TARGET_TABLE,
797 ttable_filename,
798 objA_ref_frame),
799 " ");
800
801 sci_filename =
802 cpl_sprintf("%s_OFFSET%d_%s_%d.fits",
803 MOONS_TAG_SCIENCE_XSWITCH_SKSSPECTRA, offset, mode, inum);
804
805 moo_try_check(sci = _moons_combine_pair(nod_rbn, objB_rbn, objA_rbn,
806 target_table, f2f_frame,
807 solflux_frame, airglow_group_frame,
808 airglow_var_frame,
809 combine_pair_params, sky_params,
810 sci_filename, products,
811 objA_ref_frame),
812 " ");
813
814 moo_try_check(moo_sci_compute_snr(sci, sky_lines), " ");
815
816 moo_try_check(sci_frame = cpl_frame_duplicate(
817 moo_products_add_sci(products, sci, CPL_FRAME_LEVEL_FINAL,
818 MOONS_TAG_SCIENCE_XSWITCH_SKSSPECTRA,
819 sci_filename, objA_ref_frame)),
820 " ");
821
822moo_try_cleanup:
823 cpl_free(objB_calibflux_filename);
824 cpl_free(nod_calibflux_filename);
825 cpl_free(objA_calibflux_filename);
826 cpl_free(objB_rbn_filename);
827 cpl_free(nod_rbn_filename);
828 cpl_free(objA_rbn_filename);
829 cpl_free(ttable_filename);
830 cpl_free(sci_filename);
831
832 moo_atm_delete(atm);
833 moo_resp_delete(resp);
834 moo_target_table_delete(target_table);
835 moo_sci_delete(sci);
836 moo_rbn_delete(nod_rbn);
837 moo_rbn_delete(objB_rbn);
838 moo_rbn_delete(objA_rbn);
839
840 return sci_frame;
841}
842
843static const cpl_frame *
844find_masterdark_nir(moo_det *det, cpl_frameset *set)
845{
846 const cpl_frame *result = NULL;
847 double dit = 0.0;
848 int ndit = 0;
849 double exptime = 0.0;
850 int num;
851 int type;
852 int find = 0;
853 moo_det *current_det = NULL;
854
855 cpl_ensure(det != NULL, CPL_ERROR_NULL_INPUT, NULL);
856
857 for (num = 1; num <= 2; num++) {
858 for (type = 1; type <= 2; type++) {
859 moo_single *single = moo_det_get_single(det, type, num);
860 if (single != NULL) {
861 moo_try_check(ndit = moo_pfits_get_ndit(single->header), " ");
862 moo_try_check(dit = moo_pfits_get_dit(single->header), " ");
863 exptime = dit * ndit;
864 find = 1;
865 break;
866 }
867 }
868 if (find) {
869 break;
870 }
871 }
872
873 if (find && set != NULL) {
874 int size = cpl_frameset_get_size(set);
875 for (int i = 0; i < size; i++) {
876 const cpl_frame *current = cpl_frameset_get_position_const(set, i);
877 current_det = moo_det_create(current);
878 moo_single *current_single =
879 moo_det_get_single(current_det, type, num);
880 moo_try_check(ndit = moo_pfits_get_ndit(current_single->header),
881 " ");
882 moo_try_check(dit = moo_pfits_get_dit(current_single->header), " ");
883 double current_exptime = dit * ndit;
884 if (fabs(exptime - current_exptime) <= 1E-9) {
885 result = current;
886 break;
887 }
888 moo_det_delete(current_det);
889 current_det = NULL;
890 }
891 }
892moo_try_cleanup:
893 moo_det_delete(current_det);
894 return result;
895}
896static cpl_error_code
897_moons_xswitch_extract(int inum,
898 const char *mode,
899 int offset,
900 const cpl_frame *objectA_frame,
901 const cpl_frame *objectB_frame,
902 const char *bpmap_rp_name,
903 const char *bpmap_nl_name,
904 const cpl_frame *masterbias,
905 const cpl_frame *masterdark_vis,
906 cpl_frameset *masterdark_nir_frameset,
907 const cpl_frame *master_flat,
908 const cpl_frame *p2pmap,
909 moo_loc *loc,
910 moo_map *wmap,
911 moo_spectral_format *sformat,
912 moo_sky_lines_list *skylines,
913 const cpl_frame *coeffs_cube,
914 const cpl_frame *flat_frame,
915 const cpl_frame *f2f_frame,
916 moo_extract_params *extract_params,
917 moo_prepare_params *prepare_params,
918 moo_correct_bias_params *cbias_params,
919 moo_products *products,
920 cpl_frameset *objA_ext_frameset,
921 cpl_frameset *objB_ext_frameset,
922 cpl_frameset *nod_ext_frameset)
923{
924 cpl_frame *nod_ext_frame = NULL;
925 cpl_frame *objB_ext_frame = NULL;
926 cpl_frame *objA_ext_frame = NULL;
927 const cpl_frame *masterdark_nir = NULL;
928 moo_det *objA_det = NULL;
929 moo_det *objB_det = NULL;
930 moo_det *nod_det = NULL;
931 moo_psf *psf = NULL;
932 moo_ext *nod_ext = NULL;
933 moo_ext *objB_ext = NULL;
934 moo_ext *objA_ext = NULL;
935
936 char *nod_det_filename = NULL;
937 char *nod_det_p2p_filename = NULL;
938 char *nod_ext_filename = NULL;
939
940 char *objA_det_filename = NULL;
941 char *objA_det_p2p_filename = NULL;
942 char *objA_ext_filename = NULL;
943
944 char *objB_det_filename = NULL;
945 char *objB_det_p2p_filename = NULL;
946 char *objB_ext_filename = NULL;
947
948 cpl_errorstate prestate = cpl_errorstate_get();
949 cpl_ensure_code(objectA_frame != NULL, CPL_ERROR_NULL_INPUT);
950 cpl_ensure_code(objectB_frame != NULL, CPL_ERROR_NULL_INPUT);
951
952 moo_try_check(objA_det =
953 moo_prepare(objectA_frame, bpmap_rp_name, bpmap_nl_name,
954 masterbias, coeffs_cube, prepare_params),
955 " ");
956 moo_try_check(moo_correct_bias(objA_det, masterbias, cbias_params), " ");
957 masterdark_nir = find_masterdark_nir(objA_det, masterdark_nir_frameset);
958 moo_try_check(moo_correct_dark(objA_det, NULL, masterdark_vis,
959 masterdark_nir),
960 " ");
961 objA_det_filename =
962 cpl_sprintf("%s_A_OFFSET%d_%s_%d.fits", MOONS_TAG_XSWITCH_CORRECTDARK,
963 offset, mode, inum);
964 moo_try_check(moo_products_add(products, objA_det,
965 CPL_FRAME_LEVEL_INTERMEDIATE,
966 MOONS_TAG_XSWITCH_CORRECTDARK,
967 objA_det_filename, objectA_frame),
968 " ");
969
970 moo_try_check(objB_det =
971 moo_prepare(objectB_frame, bpmap_rp_name, bpmap_nl_name,
972 masterbias, coeffs_cube, prepare_params),
973 " ");
974 moo_try_check(moo_correct_bias(objB_det, masterbias, cbias_params), " ");
975 masterdark_nir = find_masterdark_nir(objB_det, masterdark_nir_frameset);
976 moo_try_check(moo_correct_dark(objB_det, NULL, masterdark_vis,
977 masterdark_nir),
978 " ");
979
980 objB_det_filename =
981 cpl_sprintf("%s_B_OFFSET%d_%s_%d.fits", MOONS_TAG_XSWITCH_CORRECTDARK,
982 offset, mode, inum);
983 moo_try_check(moo_products_add(products, objB_det,
984 CPL_FRAME_LEVEL_INTERMEDIATE,
985 MOONS_TAG_XSWITCH_CORRECTDARK,
986 objB_det_filename, objectB_frame),
987 " ");
988
989 nod_det_filename =
990 cpl_sprintf("%s_OFFSET%d_%s_%d.fits", MOONS_TAG_XSWITCH_SUBTRACTNOD,
991 offset, mode, inum);
992
993 moo_try_check(nod_det =
994 moo_subtract_nod(objA_det, objB_det, nod_det_filename),
995 " ");
996 moo_try_check(moo_products_add(products, nod_det,
997 CPL_FRAME_LEVEL_INTERMEDIATE,
998 MOONS_TAG_XSWITCH_SUBTRACTNOD,
999 nod_det_filename, objectA_frame),
1000 " ");
1001
1002 moo_try_check(_moons_p2pmap(nod_det, p2pmap), " ");
1003 nod_det_p2p_filename =
1004 cpl_sprintf("%s_NOD_OFFSET%d_%s_%d.fits", MOONS_TAG_XSWITCH_APPLYP2P,
1005 offset, mode, inum);
1006 moo_try_check(moo_products_add(products, nod_det,
1007 CPL_FRAME_LEVEL_INTERMEDIATE,
1008 MOONS_TAG_XSWITCH_APPLYP2P,
1009 nod_det_p2p_filename, objectA_frame),
1010 " ");
1011 nod_ext_filename =
1012 cpl_sprintf("%s_NOD_OFFSET%d_%s_%d.fits",
1013 MOONS_TAG_SCIENCE_XSWITCH_EXTSPECTRA, offset, mode, inum);
1014 if (master_flat != NULL) {
1015 psf = moo_psf_load(master_flat);
1016 }
1017 moo_try_check(nod_ext = moo_extract(nod_det, loc, psf, extract_params,
1018 nod_ext_filename),
1019 " ");
1020 moo_try_check(_moons_apply_flat(nod_ext, flat_frame, f2f_frame), " ");
1021 moo_try_check(moo_ext_compute_snr(nod_ext, wmap, sformat, skylines), " ");
1022 moo_try_check(nod_ext_frame = cpl_frame_duplicate(
1023 moo_products_add_ext(products, nod_ext,
1024 CPL_FRAME_LEVEL_INTERMEDIATE,
1025 MOONS_TAG_SCIENCE_XSWITCH_EXTSPECTRA,
1026 nod_ext_filename, objectA_frame)),
1027 " ");
1028
1029 objA_ext_filename =
1030 cpl_sprintf("%s_A_OFFSET%d_%s_%d.fits",
1031 MOONS_TAG_SCIENCE_XSWITCH_EXTSPECTRA, offset, mode, inum);
1032 moo_try_check(_moons_p2pmap(objA_det, p2pmap), " ");
1033 objA_det_p2p_filename =
1034 cpl_sprintf("%s_A_OFFSET%d_%s_%d.fits", MOONS_TAG_XSWITCH_APPLYP2P,
1035 offset, mode, inum);
1036 moo_try_check(moo_products_add(products, objA_det,
1037 CPL_FRAME_LEVEL_INTERMEDIATE,
1038 MOONS_TAG_XSWITCH_APPLYP2P,
1039 objA_det_p2p_filename, objectA_frame),
1040 " ");
1041 moo_try_check(objA_ext = moo_extract(objA_det, loc, psf, extract_params,
1042 objA_ext_filename),
1043 " ");
1044 moo_try_check(_moons_apply_flat(objA_ext, flat_frame, f2f_frame), " ");
1045 moo_try_check(moo_ext_compute_snr(objA_ext, wmap, sformat, skylines), " ");
1046 moo_try_check(objA_ext_frame = cpl_frame_duplicate(
1047 moo_products_add_ext(products, objA_ext,
1048 CPL_FRAME_LEVEL_INTERMEDIATE,
1049 MOONS_TAG_SCIENCE_XSWITCH_EXTSPECTRA,
1050 objA_ext_filename, objectA_frame)),
1051 " ");
1052
1053 objB_ext_filename =
1054 cpl_sprintf("%s_B_OFFSET%d_%s_%d.fits",
1055 MOONS_TAG_SCIENCE_XSWITCH_EXTSPECTRA, offset, mode, inum);
1056 moo_try_check(_moons_p2pmap(objB_det, p2pmap), " ");
1057 objB_det_p2p_filename =
1058 cpl_sprintf("%s_B_OFFSET%d_%s_%d.fits", MOONS_TAG_XSWITCH_APPLYP2P,
1059 offset, mode, inum);
1060 moo_try_check(moo_products_add(products, objB_det,
1061 CPL_FRAME_LEVEL_INTERMEDIATE,
1062 MOONS_TAG_XSWITCH_APPLYP2P,
1063 objB_det_p2p_filename, objectB_frame),
1064 " ");
1065 moo_try_check(objB_ext = moo_extract(objB_det, loc, psf, extract_params,
1066 objB_ext_filename),
1067 " ");
1068 moo_try_check(_moons_apply_flat(objB_ext, flat_frame, f2f_frame), " ");
1069 moo_try_check(moo_ext_compute_snr(objB_ext, wmap, sformat, skylines), " ");
1070 moo_try_check(objB_ext_frame = cpl_frame_duplicate(
1071 moo_products_add_ext(products, objB_ext,
1072 CPL_FRAME_LEVEL_INTERMEDIATE,
1073 MOONS_TAG_SCIENCE_XSWITCH_EXTSPECTRA,
1074 objB_ext_filename, objectB_frame)),
1075 " ");
1076moo_try_cleanup:
1077 cpl_free(nod_det_filename);
1078 cpl_free(nod_det_p2p_filename);
1079 cpl_free(nod_ext_filename);
1080
1081 cpl_free(objA_det_filename);
1082 cpl_free(objA_det_p2p_filename);
1083 cpl_free(objA_ext_filename);
1084
1085 cpl_free(objB_det_filename);
1086 cpl_free(objB_det_p2p_filename);
1087 cpl_free(objB_ext_filename);
1088 moo_ext_delete(nod_ext);
1089 moo_ext_delete(objB_ext);
1090 moo_ext_delete(objA_ext);
1091 moo_psf_delete(psf);
1092 moo_det_delete(nod_det);
1093 moo_det_delete(objB_det);
1094 moo_det_delete(objA_det);
1095 if (!cpl_errorstate_is_equal(prestate)) {
1096 cpl_frame_delete(nod_ext_frame);
1097 cpl_frame_delete(objB_ext_frame);
1098 cpl_frame_delete(objA_ext_frame);
1099 }
1100 else {
1101 cpl_frameset_insert(nod_ext_frameset, nod_ext_frame);
1102 cpl_frameset_insert(objB_ext_frameset, objB_ext_frame);
1103 cpl_frameset_insert(objA_ext_frameset, objA_ext_frame);
1104 }
1105 return CPL_ERROR_NONE;
1106}
1107
1108static int
1109_moons_sort_mjdobs(const cpl_frame *a, const cpl_frame *b)
1110{
1111 int res = 0;
1112
1113 const char *filenameA = cpl_frame_get_filename(a);
1114 const char *filenameB = cpl_frame_get_filename(b);
1115
1116 cpl_propertylist *lista = cpl_propertylist_load(filenameA, 0);
1117 cpl_propertylist *listb = cpl_propertylist_load(filenameB, 0);
1118
1119 if (cpl_propertylist_has(lista, MOO_PFITS_MJDOBS) &&
1120 cpl_propertylist_has(listb, MOO_PFITS_MJDOBS)) {
1121 double mjdA = moo_pfits_get_mjdobs(lista);
1122 double mjdB = moo_pfits_get_mjdobs(listb);
1123 if (mjdA < mjdB) {
1124 res = -1;
1125 }
1126 else if (mjdA > mjdB) {
1127 res = 1;
1128 }
1129 else {
1130 res = 0;
1131 }
1132 }
1133 cpl_propertylist_delete(listb);
1134 cpl_propertylist_delete(lista);
1135 return res;
1136}
1137
1138static int
1139_moons_compare_offset(const cpl_frame *a, const cpl_frame *b)
1140{
1141 int res = 0;
1142 const char *filenameA = cpl_frame_get_filename(a);
1143 cpl_propertylist *lista = cpl_propertylist_load(filenameA, 0);
1144
1145 double oA = moo_pfits_get_slit_offset(lista);
1146 const char *filenameB = cpl_frame_get_filename(b);
1147 cpl_propertylist *listb = cpl_propertylist_load(filenameB, 0);
1148
1149 double oB = moo_pfits_get_slit_offset(listb);
1150 if (fabs(oA - oB) < 1E-12) {
1151 res = 1;
1152 }
1153
1154 cpl_propertylist_delete(lista);
1155 cpl_propertylist_delete(listb);
1156 return res;
1157}
1158
1159static int
1160_moons_science_xswitch_byoffset(cpl_frameset *frameset,
1161 cpl_frameset *sci_set,
1162 cpl_frameset *objA_ref_frameset,
1163 const char *bpmap_rp_name,
1164 const char *bpmap_nl_name,
1165 const cpl_frame *masterbias,
1166 const cpl_frame *masterdark_vis,
1167 cpl_frameset *masterdark_nir,
1168 const cpl_frame *p2pmap,
1169 const cpl_frame *sformat_frame,
1170 moo_sky_lines_list *sky_lines,
1171 const cpl_frame *airglow_group_frame,
1172 const cpl_frame *solflux_frame,
1173 const cpl_frame *airglow_var_frame,
1174 const cpl_frame *atmo_frame,
1175 const cpl_frame *resp_frame,
1176 moo_prepare_params *prepare_params,
1177 moo_correct_bias_params *correct_bias_params,
1178 moo_extract_params *extract_params,
1179 moo_wavesol_params *wavesol_params,
1180 moo_rebin_params *rbn_params,
1181 moo_target_table_params *target_table_params,
1182 moo_combine_pair_params *combine_pair_params,
1183 moo_sub_sky_stare_params *sky_params,
1184 moo_products *products)
1185{
1186 /* parameters */
1187 moo_loc *loc = NULL;
1188 moo_spectral_format *sformat = NULL;
1189 moo_map *wmap = NULL;
1190 moo_map *wmap_tuned = NULL;
1191 moo_extlist *objA_extlist = NULL;
1192 moo_extlist *objB_extlist = NULL;
1193 moo_extlist *nod_extlist = NULL;
1194 moo_extlist *wavemap_extlist = NULL;
1195 moo_ext *sum_ext = NULL;
1196
1197 cpl_frameset *node_frameset = NULL;
1198 cpl_frameset *nod_ext_frameset = NULL;
1199 cpl_frameset *objB_ext_frameset = NULL;
1200 cpl_frameset *objA_ext_frameset = NULL;
1201 cpl_frameset *objB_ref_frameset = NULL;
1202
1203 const cpl_frame *master_flat = NULL;
1204 const cpl_frame *fftrace = NULL;
1205 const cpl_frame *coeffs_cube = NULL;
1206 const cpl_frame *wmap_frame = NULL;
1207 const cpl_frame *flat_frame = NULL;
1208 const cpl_frame *f2f_frame = NULL;
1209
1210 char *sum_ext_filename = NULL;
1211 const char *ref_filename = NULL;
1212 cpl_propertylist *ref_header = NULL;
1213
1214 moo_mode_type mode;
1215 const char *mode_name = NULL;
1216 int offset;
1217 char *wmap_tuned_filename = NULL;
1218
1219 cpl_errorstate prestate = cpl_errorstate_get();
1220
1221 node_frameset = cpl_frameset_new();
1222 nod_ext_frameset = cpl_frameset_new();
1223 objB_ext_frameset = cpl_frameset_new();
1224 objA_ext_frameset = cpl_frameset_new();
1225 objB_ref_frameset = cpl_frameset_new();
1226
1227 moo_try_check(_moons_science_xswitch_check_sof_byoffset(
1228 frameset, node_frameset, &master_flat, &fftrace,
1229 &coeffs_cube, &wmap_frame, &flat_frame, &f2f_frame,
1230 extract_params),
1231 " ");
1232 int nb_nod = cpl_frameset_get_size(node_frameset);
1233 cpl_frame *frame = cpl_frameset_get_position(node_frameset, 0);
1234 ref_filename = cpl_frame_get_filename(frame);
1235 moo_try_check(mode = moo_mode_get(frame), " ");
1236 mode_name = moo_mode_get_name(mode);
1237 moo_try_check(ref_header = cpl_propertylist_load(ref_filename, 0), " ");
1238 moo_try_check(offset = moo_pfits_get_slit_offset(ref_header), " ");
1239 cpl_propertylist_delete(ref_header);
1240 ref_header = NULL;
1241 cpl_msg_info(__func__, "Do offset %d use mode %s", offset, mode_name);
1242 moo_try_check(sformat = moo_spectral_format_load(sformat_frame, mode), " ");
1243 moo_try_check(wmap = moo_map_load(wmap_frame), " ");
1244 moo_try_check(loc = moo_loc_load(fftrace), " ");
1245
1246 for (int i = 0; i < nb_nod; i += 2) {
1247 cpl_frame *objectA_frame = NULL;
1248 cpl_frame *objectB_frame = NULL;
1249
1250 moo_try_check(objectA_frame =
1251 cpl_frameset_get_position(node_frameset, i),
1252 " ");
1253 moo_try_check(objectB_frame =
1254 cpl_frameset_get_position(node_frameset, i + 1),
1255 " ");
1256
1257 cpl_frameset_insert(objA_ref_frameset,
1258 cpl_frame_duplicate(objectA_frame));
1259 cpl_frameset_insert(objB_ref_frameset,
1260 cpl_frame_duplicate(objectB_frame));
1261
1262 moo_try_check(_moons_xswitch_extract(
1263 i / 2, mode_name, offset, objectA_frame,
1264 objectB_frame, bpmap_rp_name, bpmap_nl_name,
1265 masterbias, masterdark_vis, masterdark_nir,
1266 master_flat, p2pmap, loc, wmap, sformat, sky_lines,
1267 coeffs_cube, flat_frame, f2f_frame, extract_params,
1268 prepare_params, correct_bias_params, products,
1269 objA_ext_frameset, objB_ext_frameset,
1270 nod_ext_frameset),
1271 " ");
1272 }
1273
1274 objB_extlist = moo_extlist_create(objB_ext_frameset);
1275 objA_extlist = moo_extlist_create(objA_ext_frameset);
1276 nod_extlist = moo_extlist_create(nod_ext_frameset);
1277 wavemap_extlist = moo_extlist_new();
1278
1279 nb_nod = moo_extlist_get_size(nod_extlist);
1280 for (int i = 0; i < nb_nod; i++) {
1281 int k = i * 2;
1282 moo_ext *objB_ext = moo_extlist_get(objB_extlist, i);
1283 moo_ext *objA_ext = moo_extlist_get(objA_extlist, i);
1284 moo_extlist_set(wavemap_extlist, objA_ext, k);
1285 moo_extlist_set(wavemap_extlist, objB_ext, k + 1);
1286 }
1287
1288 sum_ext_filename =
1289 cpl_sprintf("XSWITCH_EXT_SUM_OFFSET%d_%s.fits", offset, mode_name);
1290 sum_ext = moo_extlist_sum(wavemap_extlist, sum_ext_filename);
1291 cpl_frame *ref_frame = cpl_frameset_get_position(objA_ref_frameset, 0);
1292 moo_try_check(moo_products_add_ext(products, sum_ext,
1293 CPL_FRAME_LEVEL_TEMPORARY,
1294 MOONS_TAG_SCIENCE_XSWITCH_EXTSPECTRA,
1295 sum_ext_filename, ref_frame),
1296 " ");
1297 moo_map *used_wmap = NULL;
1298 const char *wavesol_control = wavesol_params->control;
1299 if ((strcmp(wavesol_control, MOO_WAVESOL_CONTROL_CHECK) == 0) ||
1300 (strcmp(wavesol_control, MOO_WAVESOL_CONTROL_UPDATE) == 0)) {
1301 const char *sky_lines_name = sky_lines->filename;
1302
1303 moo_try_check(wmap_tuned = moo_wavesol(sum_ext, sky_lines_name, sformat,
1304 loc, wmap, wavesol_params),
1305 " ");
1306 if (strcmp(wavesol_control, MOO_WAVESOL_CONTROL_UPDATE) == 0) {
1307 used_wmap = wmap_tuned;
1308 wmap_tuned_filename =
1309 cpl_sprintf("XSWITCH_WMAP_TUNED_OFFSET%d_%s.fits", offset,
1310 mode_name);
1311 moo_map_save(wmap_tuned, wmap_tuned_filename);
1312 }
1313 else {
1314 used_wmap = wmap;
1315 }
1316 }
1317 else {
1318 used_wmap = wmap;
1319 }
1320
1321 for (int i = 0; i < nb_nod; i++) {
1322 moo_ext *nod_ext = moo_extlist_get(nod_extlist, i);
1323 moo_ext *objB_ext = moo_extlist_get(objB_extlist, i);
1324 moo_ext *objA_ext = moo_extlist_get(objA_extlist, i);
1325 cpl_frame *sci_frame = NULL;
1326 cpl_frame *objA_ref_frame =
1327 cpl_frameset_get_position(objA_ref_frameset, i);
1328 cpl_frame *objB_ref_frame =
1329 cpl_frameset_get_position(objB_ref_frameset, i);
1330
1331 moo_try_check(sci_frame = _moons_science_xswitch_frame(
1332 i, mode_name, offset, objA_ext, objB_ext, nod_ext,
1333 objA_ref_frame, objB_ref_frame, sformat, sky_lines,
1334 used_wmap, f2f_frame, airglow_group_frame,
1335 airglow_var_frame, solflux_frame, atmo_frame,
1336 resp_frame, rbn_params, target_table_params,
1337 combine_pair_params, sky_params, products),
1338 " ");
1339 cpl_frameset_insert(sci_set, sci_frame);
1340 }
1341
1342moo_try_cleanup:
1343 if (!cpl_errorstate_is_equal(prestate)) {
1344 cpl_propertylist_delete(ref_header);
1345 }
1346 moo_extlist_delete(objA_extlist);
1347 moo_extlist_delete(objB_extlist);
1348 moo_extlist_delete(nod_extlist);
1349 if (wavemap_extlist != NULL) {
1350 for (int i = 0; i < nb_nod * 2; i++) {
1351 moo_extlist_unset(wavemap_extlist, 0);
1352 }
1353 }
1354 moo_extlist_delete(wavemap_extlist);
1355 moo_ext_delete(sum_ext);
1356 moo_loc_delete(loc);
1357 moo_map_delete(wmap);
1358 moo_map_delete(wmap_tuned);
1359 cpl_free(sum_ext_filename);
1360 cpl_free(wmap_tuned_filename);
1362
1363 cpl_frameset_delete(node_frameset);
1364 cpl_frameset_delete(nod_ext_frameset);
1365 cpl_frameset_delete(objB_ext_frameset);
1366 cpl_frameset_delete(objA_ext_frameset);
1367 cpl_frameset_delete(objB_ref_frameset);
1368
1369 return (int)cpl_error_get_code();
1370}
1371
1372static int
1373_moons_science_xswitch(cpl_frameset *frameset, const cpl_parameterlist *parlist)
1374{
1375 /* parameters */
1376 moo_prepare_params *prepare_params = NULL;
1377 moo_correct_bias_params *correct_bias_params = NULL;
1378 moo_extract_params *extract_params = NULL;
1379 moo_wavesol_params *wavesol_params = NULL;
1380 moo_rebin_params *rbn_params = NULL;
1381 moo_target_table_params *target_table_params = NULL;
1382 moo_combine_pair_params *combine_pair_params = NULL;
1383 moo_sub_sky_stare_params *sky_params = NULL;
1384 moo_coadd_params *coadd_params = NULL;
1385 moo_create_s1d_params *s1d_params = NULL;
1386
1387 moo_scilist *sci_list = NULL;
1388 moo_sci *sci_coadd = NULL;
1389
1390 cpl_frameset *offset_frameset = NULL;
1391 cpl_frameset *set = NULL;
1392 cpl_frameset *sci_set = NULL;
1393 cpl_frameset *ref_frameset = NULL;
1394
1395 const char *bpmap_rp_name = NULL;
1396 const char *bpmap_nl_name = NULL;
1397 const cpl_frame *masterbias = NULL;
1398 const cpl_frame *masterdark_vis = NULL;
1399 cpl_frameset *masterdark_nir = NULL;
1400 const cpl_frame *p2pmap = NULL;
1401 const cpl_frame *sformat_frame = NULL;
1402 const cpl_frame *sky_lines_frame = NULL;
1403 const cpl_frame *atmo_frame = NULL;
1404 const cpl_frame *resp_frame = NULL;
1405 const cpl_frame *airglow_group_frame = NULL;
1406 const cpl_frame *solflux_frame = NULL;
1407 const cpl_frame *airglow_var_frame = NULL;
1408 const cpl_frame *ref_frame = NULL;
1409 cpl_size nsel = 0;
1410 cpl_size *selection = NULL;
1411 moo_sky_lines_list *skylines = NULL;
1412 char *coadd_filename = NULL;
1413 char *calibflux_filename = NULL;
1414
1415 cpl_errorstate prestate = cpl_errorstate_get();
1416
1417 moo_products *products =
1418 moo_products_new(frameset, parlist, "moons_science_xswitch",
1419 PACKAGE "/" PACKAGE_VERSION);
1420 const moo_params *params = moo_products_get_params(products);
1421 moo_try_check(prepare_params = moo_params_get_prepare(params, parlist),
1422 " ");
1423 moo_try_check(correct_bias_params =
1424 moo_params_get_correct_bias(params, parlist),
1425 " ");
1426 moo_try_check(extract_params = moo_params_get_extract(params, parlist),
1427 " ");
1428 moo_try_check(rbn_params = moo_params_get_rebin(params, parlist), " ");
1429 moo_try_check(target_table_params =
1430 moo_params_get_target_table(params, parlist),
1431 " ");
1432 moo_try_check(combine_pair_params =
1433 moo_params_get_combine_pair(params, parlist),
1434 " ");
1435 moo_try_check(sky_params = moo_params_get_sub_sky_stare(params, parlist),
1436 " ");
1437 moo_try_check(coadd_params = moo_params_get_coadd(params, parlist), " ");
1438 moo_try_check(wavesol_params =
1439 moo_params_get_science_wavesol(params, parlist),
1440 " ");
1441 moo_try_check(s1d_params = moo_params_get_create_s1d(params, parlist), " ");
1442 /* SOF file */
1443 offset_frameset = cpl_frameset_new();
1444 sci_set = cpl_frameset_new();
1445 ref_frameset = cpl_frameset_new();
1446 masterdark_nir = cpl_frameset_new();
1447
1448 moo_try_check(_moons_science_xswitch_check_sof(
1449 frameset, offset_frameset, &bpmap_rp_name, &bpmap_nl_name,
1450 &masterbias, &masterdark_vis, masterdark_nir, &p2pmap,
1451 &sformat_frame, &sky_lines_frame, &atmo_frame,
1452 &resp_frame, &airglow_group_frame, &airglow_var_frame,
1453 &solflux_frame, sky_params),
1454 " ");
1455
1456 //cpl_frameset_sort(offset_frameset,_moons_sort_mjdobs);
1457
1458 moo_try_check(selection =
1459 cpl_frameset_labelise(offset_frameset,
1460 &_moons_compare_offset, &nsel),
1461 " ");
1462
1463 moo_try_check(skylines = moo_sky_lines_list_load(sky_lines_frame), " ");
1464
1465 for (int i = 0; i < nsel; i++) {
1466 moo_try_check(set = cpl_frameset_extract(offset_frameset, selection, i),
1467 " ");
1468 moo_try_check(_moons_science_xswitch_byoffset(
1469 set, sci_set, ref_frameset, bpmap_rp_name,
1470 bpmap_nl_name, masterbias, masterdark_vis,
1471 masterdark_nir, p2pmap, sformat_frame, skylines,
1472 airglow_group_frame, solflux_frame, airglow_var_frame,
1473 atmo_frame, resp_frame, prepare_params,
1474 correct_bias_params, extract_params, wavesol_params,
1475 rbn_params, target_table_params, combine_pair_params,
1476 sky_params, products),
1477 " ");
1478 cpl_frameset_delete(set);
1479 set = NULL;
1480 }
1481
1482 moo_try_check(ref_frame = cpl_frameset_get_position_const(ref_frameset, 0),
1483 " ");
1484 moo_mode_type mode = moo_mode_get(ref_frame);
1485
1486 sci_list = moo_scilist_create(sci_set);
1487 coadd_filename =
1488 cpl_sprintf("%s_%s.fits", MOONS_TAG_XSWITCH_COMBINED_SPECTRA,
1489 moo_mode_get_name(mode));
1490
1491 sci_coadd = moo_coadd(sci_list, coadd_params, coadd_filename);
1492
1493 moo_try_check(moo_sci_compute_snr(sci_coadd, skylines), " ");
1494 cpl_frame *sci_final = NULL;
1495 moo_try_check(sci_final =
1496 moo_products_add_sci(products, sci_coadd,
1497 CPL_FRAME_LEVEL_FINAL,
1498 MOONS_TAG_XSWITCH_COMBINED_SPECTRA,
1499 coadd_filename, ref_frame),
1500 " ");
1501 moo_create_s1d(sci_final, s1d_params, MOONS_TAG_SCIENCE_XSWITCH_1DSPECTRUM,
1502 products);
1503
1504moo_try_cleanup:
1505 if (!cpl_errorstate_is_equal(prestate)) {
1506 cpl_frameset_delete(set);
1507 }
1508 cpl_free(coadd_filename);
1509 cpl_free(calibflux_filename);
1510 cpl_free(selection);
1511 moo_sci_delete(sci_coadd);
1512 moo_scilist_delete(sci_list);
1513 moo_sky_lines_list_delete(skylines);
1514
1515 cpl_frameset_delete(sci_set);
1516 cpl_frameset_delete(ref_frameset);
1517 cpl_frameset_delete(offset_frameset);
1518 cpl_frameset_delete(masterdark_nir);
1519
1520 moo_extract_params_delete(extract_params);
1521 moo_wavesol_params_delete(wavesol_params);
1522 moo_rebin_params_delete(rbn_params);
1523 moo_target_table_params_delete(target_table_params);
1524
1525 moo_combine_pair_params_delete(combine_pair_params);
1526 moo_sub_sky_stare_params_delete(sky_params);
1527 moo_coadd_params_delete(coadd_params);
1528 moo_correct_bias_params_delete(correct_bias_params);
1529 moo_prepare_params_delete(prepare_params);
1530 moo_create_s1d_params_delete(s1d_params);
1531 moo_products_delete(products);
1532 return (int)cpl_error_get_code();
1533}
moo_atm * moo_atm_load(const cpl_frame *frame)
Load a ATM frame and create a moo_atm.
Definition: moo_atm.c:83
void moo_atm_delete(moo_atm *self)
Delete a moo_atm.
Definition: moo_atm.c:154
moo_det * moo_det_create(const cpl_frame *frame)
Create a new moo_det from the given DET frame.
Definition: moo_det.c:91
void moo_det_delete(moo_det *self)
Delete a moo_det.
Definition: moo_det.c:472
moo_single * moo_det_get_single(moo_det *self, moo_detector_type type, int num)
Get the type part in DET and return it.
Definition: moo_det.c:359
moo_mode_type moo_mode_get(const cpl_frame *frame)
Get the name of a mode from a frame.
Definition: moo_detector.c:224
const char * moo_mode_get_name(moo_mode_type type)
Get the name of a mode.
Definition: moo_detector.c:204
moo_ext * moo_ext_create(const cpl_frame *frame)
Create a new empty EXT filename.
Definition: moo_ext.c:86
void moo_ext_delete(moo_ext *self)
Delete a moo_ext.
Definition: moo_ext.c:370
cpl_error_code moo_ext_compute_snr(moo_ext *self, moo_map *wmap, moo_spectral_format *sformat, moo_sky_lines_list *skylines)
Compute SNR for all fibres EXT.
Definition: moo_ext.c:553
moo_ext * moo_extlist_get(moo_extlist *self, int i)
Get the DET at the position i in the list.
Definition: moo_extlist.c:197
cpl_error_code moo_extlist_set(moo_extlist *self, moo_ext *ext, cpl_size pos)
Insert a DET into an moo_extlist.
Definition: moo_extlist.c:376
moo_ext * moo_extlist_unset(moo_extlist *self, cpl_size pos)
Remove a DET from a DET list.
Definition: moo_extlist.c:467
moo_ext * moo_extlist_sum(moo_extlist *self, const char *filename)
Sum EXT element from the list and save result in filename.
Definition: moo_extlist.c:581
void moo_extlist_delete(moo_extlist *self)
Free all memory used by a moo_extlist object including the DET.
Definition: moo_extlist.c:561
moo_extlist * moo_extlist_create(cpl_frameset *frameset)
Create a new moo_extlist from the given DET frameset.
Definition: moo_extlist.c:72
cpl_size moo_extlist_get_size(const moo_extlist *self)
Get the number of DET in the extlist.
Definition: moo_extlist.c:174
moo_extlist * moo_extlist_new(void)
Create a new moo_extlist.
Definition: moo_extlist.c:57
void moo_f2f_delete(moo_f2f *self)
Delete a moo_f2f.
Definition: moo_f2f.c:413
moo_f2f * moo_f2f_load(const cpl_frame *f2f_frame)
Load a F2F table from a fits file.
Definition: moo_f2f.c:139
moo_loc * moo_loc_load(const cpl_frame *locframe)
Load a LOC frame and create a moo_loc.
Definition: moo_loc.c:109
void moo_loc_delete(moo_loc *self)
Delete a moo_loc.
Definition: moo_loc.c:332
void moo_map_save(moo_map *self, const char *filename)
Save a moo_map to a FITS file.
Definition: moo_map.c:275
void moo_map_delete(moo_map *self)
Delete a moo_map.
Definition: moo_map.c:236
moo_coadd_params * moo_params_get_coadd(const moo_params *self, const cpl_parameterlist *list)
Get coadd parameters from moons parameters list.
Definition: moo_params.c:3147
cpl_error_code moo_params_add_create_s1d(moo_params *self, cpl_parameterlist *list)
Add default parameters for create_s1d.
Definition: moo_params.c:2437
void moo_create_s1d_params_delete(moo_create_s1d_params *self)
Delete a moo_create_s1d_params.
Definition: moo_params.c:2353
cpl_error_code moo_params_add_extract(moo_params *self, cpl_parameterlist *list)
Add default parameters for extraction.
Definition: moo_params.c:902
cpl_error_code moo_params_add_sub_sky_stare(moo_params *self, cpl_parameterlist *list)
Add default parameters for moo_sub_sky_stare.
Definition: moo_params.c:2179
moo_create_s1d_params * moo_params_get_create_s1d(const moo_params *self, const cpl_parameterlist *list)
Get create s1d parameters from moons parameters list.
Definition: moo_params.c:1614
moo_prepare_params * moo_params_get_prepare(const moo_params *self, const cpl_parameterlist *list)
Get remove prepare parameters from moons parameters list.
Definition: moo_params.c:1073
moo_sub_sky_stare_params * moo_params_get_sub_sky_stare(const moo_params *self, const cpl_parameterlist *list)
Get sub sky stare parameters from moons parameters list.
Definition: moo_params.c:2909
moo_combine_pair_params * moo_params_get_combine_pair(const moo_params *self, const cpl_parameterlist *list)
Get combine_pair parameters from moons parameters list.
Definition: moo_params.c:3035
cpl_error_code moo_params_add_target_table(moo_params *self, cpl_parameterlist *list, int value)
Add default parameters for moo_create_target_table.
Definition: moo_params.c:2616
cpl_error_code moo_params_add_combine_pair(moo_params *self, cpl_parameterlist *list, int value)
Add default parameters for moo_combine_pair.
Definition: moo_params.c:2591
moo_target_table_params * moo_params_get_target_table(const moo_params *self, const cpl_parameterlist *list)
Get target_table parameters from moons parameters list.
Definition: moo_params.c:3063
cpl_error_code moo_params_add_science_wavesol(moo_params *self, cpl_parameterlist *list)
Add default science parameters for moo_wavesol.
Definition: moo_params.c:2091
moo_correct_bias_params * moo_params_get_correct_bias(const moo_params *self, const cpl_parameterlist *list)
Get correct_bias parameters from moons parameters list.
Definition: moo_params.c:1167
moo_extract_params * moo_params_get_extract(const moo_params *self, const cpl_parameterlist *list)
Get extraction parameters from moons parameters list.
Definition: moo_params.c:1197
moo_wavesol_params * moo_params_get_science_wavesol(const moo_params *self, const cpl_parameterlist *list)
Get science_wavesol parameters from moons parameters list.
Definition: moo_params.c:2790
void moo_params_delete(moo_params *self)
Delete a moo_params.
Definition: moo_params.c:85
cpl_error_code moo_params_add_correct_bias(moo_params *self, cpl_parameterlist *list, const char *method)
Add default parameters for correct_bias.
Definition: moo_params.c:860
cpl_error_code moo_params_add_keep_temp(moo_params *self, cpl_parameterlist *list)
Add default parameters for keep-temp.
Definition: moo_params.c:932
cpl_error_code moo_params_add_prepare(moo_params *self, cpl_parameterlist *list)
Add default parameters for prepare.
Definition: moo_params.c:667
moo_rebin_params * moo_params_get_rebin(const moo_params *self, const cpl_parameterlist *list)
Get rebin parameters from moons parameters list.
Definition: moo_params.c:2866
cpl_error_code moo_params_add_coadd(moo_params *self, cpl_parameterlist *list)
Add default parameters for moo_coadd.
Definition: moo_params.c:2687
moo_params * moo_params_new(const char *pid, const char *recipe_id)
Create a new moo_params.
Definition: moo_params.c:62
cpl_error_code moo_params_add_rebin(moo_params *self, cpl_parameterlist *list)
Add default parameters for moo_rebin.
Definition: moo_params.c:2152
void moo_psf_delete(moo_psf *self)
Delete a moo_psf.
Definition: moo_psf.c:264
moo_psf * moo_psf_load(const cpl_frame *psfframe)
Load a PSF frame and create a moo_psf.
Definition: moo_psf.c:109
void moo_rbn_delete(moo_rbn *self)
Delete a moo_rbn.
Definition: moo_rbn.c:120
cpl_error_code moo_rbn_compute_snr(moo_rbn *self, moo_sky_lines_list *skylines)
Compute SNR for targets in RBN.
Definition: moo_rbn.c:421
void moo_resp_delete(moo_resp *self)
Delete a moo_resp.
Definition: moo_resp.c:320
moo_resp * moo_resp_load(const cpl_frame *frame)
Load a RESP frame and create a moo_resp.
Definition: moo_resp.c:401
void moo_sci_delete(moo_sci *self)
Delete a moo_sci.
Definition: moo_sci.c:84
cpl_error_code moo_sci_compute_snr(moo_sci *self, moo_sky_lines_list *skylines)
Compute SNR for all targets in SCI.
Definition: moo_sci.c:415
void moo_scilist_delete(moo_scilist *self)
Free all memory used by a moo_scilist object including the SCI.
Definition: moo_scilist.c:176
moo_scilist * moo_scilist_create(cpl_frameset *frameset)
Create a new moo_scilist from the given SCI frameset.
Definition: moo_scilist.c:321
moo_sky_lines_list * moo_sky_lines_list_load(const cpl_frame *frame)
Load a SKY_LINES_LIST frame and create a moo_sky_lines_list.
void moo_sky_lines_list_delete(moo_sky_lines_list *self)
Delete a moo_sky_lines_list.
void moo_spectral_format_delete(moo_spectral_format *self)
Delete a moo_spectral_format.
moo_spectral_format * moo_spectral_format_load(const cpl_frame *frame, moo_mode_type m)
Load a SPECTRAL FORMAT frame and create a moo_spectral_format.
void moo_target_table_delete(moo_target_table *self)
Delete a moo_target_table.
moo_target_table * moo_create_target_table(moo_rbn *rbnA, moo_rbn *rbnB, moo_target_table_mode mode, moo_target_table_params *params)
Prepare target table for SCI frames using their attached fibre.
cpl_error_code moo_dfs_set_groups(cpl_frameset *set)
Set the group as RAW or CALIB in a frameset.
Definition: moo_dfs.c:206
moo_ext * moo_extract(moo_det *det, moo_loc *loc, moo_psf *master_flat, moo_extract_params *params, const char *filename)
extract the 1D spectrum of fibres
Definition: moo_extract.c:523
moo_sci * moo_coadd(moo_scilist *scilist, moo_coadd_params *params, const char *filename)
Co-add reduced science frames in SCI format.
Definition: moo_coadd.c:134
moo_map * moo_wavesol(moo_ext *arc_ext, const char *lineCatname, moo_spectral_format *sformat, moo_loc *loc, moo_map *wmap, moo_wavesol_params *params)
Computes the wavelength solution from 1D extracted arc spectra.
Definition: moo_wavesol.c:2728
cpl_error_code moo_apply_p2p(moo_det *flat, moo_det *p2pmap)
Divide DET by the pixel-to-pixel variation map.
cpl_error_code moo_create_s1d(cpl_frame *sci_frame, moo_create_s1d_params *params, const char *tag, moo_products *products)
Apply the telluric correction to SCI.
moo_rbn * moo_rebin(moo_ext *ext, moo_map *wmap, moo_spectral_format *sformat, moo_rebin_params *params, const char *filename)
Rebin an EXT spectra in RBN format.
Definition: moo_rebin.c:783
moo_det * moo_prepare(const cpl_frame *rawframe, const char *const badpixmask_rp, const char *const badpixmask_nl, const cpl_frame *masterbias, const cpl_frame *cube_frame, moo_prepare_params *params)
This function transforms RAW frames in DET frames attaching the default bad pixel map and an error im...
Definition: moo_prepare.c:324
moo_sci * moo_combine_pair(moo_rbn *nod_rbn, moo_rbn *sky_rbn, moo_rbn *obj_rbn, moo_target_table *target_table, moo_f2f *f2f, const cpl_frame *solflux_frame, const cpl_frame *airglow_group_frame, const cpl_frame *airglow_var_frame, moo_combine_pair_params *combine_pair_params, moo_sub_sky_stare_params *sky_params, const char *filename, moo_products *products, const cpl_frame *ref_frame)
Combine the extracted spectra from a same objec.
cpl_error_code moo_calib_flux(moo_rbn *rbn, moo_atm *atm, moo_resp *resp)
Apply the relative flux calibration to 1D rebinned spectra.
cpl_error_code moo_apply_flat(moo_ext *ext, moo_ext *flat, moo_f2f *f2f)
Divide spectra by 1D flat-field.
cpl_error_code moo_correct_bias(moo_det *det, const cpl_frame *masterbias_frame, moo_correct_bias_params *params)
Subtracts the Master Bias frame from a DET frame.
Definition: moo_drl.c:86
moo_det * moo_subtract_nod(moo_det *object, moo_det *sky, const char *filename)
Sky from object subtraction.
cpl_error_code moo_correct_dark(moo_det *det, moo_det *detoff, const cpl_frame *masterDarkVis, const cpl_frame *masterDarkNir)
Subtracts the master dark frame from a frame after scaling for exposure time (RI)....
Definition: moo_drl.c:250
int moo_pfits_get_ndit(const cpl_propertylist *plist)
find out the ESO DET NDIT value
Definition: moo_pfits.c:382
double moo_pfits_get_dit(const cpl_propertylist *plist)
find out the DIT value
Definition: moo_pfits.c:362
double moo_pfits_get_mjdobs(const cpl_propertylist *plist)
find out the MJD-OBS
Definition: moo_pfits.c:328
int moo_pfits_get_slit_offset(const cpl_propertylist *plist)
find out the INS SLIT OFFSET value
Definition: moo_pfits.c:1110
moo_products * moo_products_new(cpl_frameset *framelist, const cpl_parameterlist *parlist, const char *recid, const char *pipeline_id)
create a moo_product object for a recipe
Definition: moo_products.c:53
cpl_frame * moo_products_add_sci(moo_products *self, moo_sci *sci, cpl_frame_level level, const char *tag, const char *filename, const cpl_frame *inherit_frame)
create a product from a SCI object
Definition: moo_products.c:420
cpl_frame * moo_products_add_rbn(moo_products *self, moo_rbn *rbn, cpl_frame_level level, const char *tag, const char *filename, const cpl_frame *inherit_frame)
create a product from a RBN object
Definition: moo_products.c:376
cpl_frame * moo_products_add_ext(moo_products *self, moo_ext *ext, cpl_frame_level level, const char *tag, const char *filename, const cpl_frame *inherit_frame)
create a product from a EXT object
Definition: moo_products.c:333
cpl_frame * moo_products_add_target_table(moo_products *self, moo_target_table *ttable, cpl_frame_level level, const char *tag, const char *filename, const cpl_frame *inherit_frame)
create a product from a TARGET_TABLE object
Definition: moo_products.c:774
cpl_frame * moo_products_add(moo_products *self, moo_det *det, cpl_frame_level level, const char *tag, const char *filename, const cpl_frame *inherit_frame)
create a product from a DET object
Definition: moo_products.c:203
const moo_params * moo_products_get_params(const moo_products *self)
get the moo_params object
Definition: moo_products.c:87
const char * moo_get_license(void)
Get the pipeline copyright and license.
Definition: moo_utils.c:81
the different type of detectors