X-shooter Pipeline Reference Manual 3.8.15
xsh_parameters.c
Go to the documentation of this file.
1/* *
2 * This file is part of the ESO X-shooter Pipeline *
3 * Copyright (C) 2006 European Southern Observatory *
4 * *
5 * This library 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, 51 Franklin St, Fifth Floor, Boston, MA 02111-1307 USA *
18 * nod_step */
19/*
20 * $Author: amodigli $
21 * $Date: 2013-10-02 15:48:49 $
22 * $Revision: 1.269 $
23 * $Name: not supported by cvs2svn $
24 */
25
26#ifdef HAVE_CONFIG_H
27#include <config.h>
28#endif
29
30/*----------------------------------------------------------------------------
31 Includes
32 ----------------------------------------------------------------------------*/
33#include <xsh_parameters.h>
35#include <xsh_badpixelmap.h>
36#include <xsh_msg.h>
37#include <xsh_error.h>
38#include <xsh_drl.h>
39#include <strings.h>
40
46/*----------------------------------------------------------------------------
47 Prototypes
48 ---------------------------------------------------------------------------*/
49
50void xsh_parameters_new_int( cpl_parameterlist* list,
51 const char* recipe_id, const char* name,int value, const char* comment)
52{
53 char paramname[256];
54 char recipename[256];
55 cpl_parameter* p =NULL;
56
57
58 sprintf(recipename,"xsh.%s",recipe_id);
59 sprintf(paramname,"%s.%s",recipename,name);
60 if(strstr(recipe_id,"xsh_molecfit")){
61 sprintf(paramname,"%s",name);
62 }
63 assure(list != NULL,CPL_ERROR_NULL_INPUT,"parameters list is NULL");
64
65 check(p = cpl_parameter_new_value(paramname,CPL_TYPE_INT,comment,
66 recipename,value));
67 check(cpl_parameter_set_alias(p,CPL_PARAMETER_MODE_CLI,name));
68 check(cpl_parameterlist_append(list,p));
69
70 cleanup:
71 return;
72}
73
74
75void xsh_parameters_new_boolean( cpl_parameterlist* list,
76 const char* recipe_id, const char* name,int value, const char* comment)
77{
78 char paramname[256];
79 char recipename[256];
80 cpl_parameter* p =NULL;
81
82
83 sprintf(recipename,"xsh.%s",recipe_id);
84 sprintf(paramname,"%s.%s",recipename,name);
85 if(strstr(recipe_id,"xsh_molecfit")){
86 sprintf(paramname,"%s",name);
87 }
89 check(p = cpl_parameter_new_value(paramname,CPL_TYPE_BOOL,comment,
90 recipename,value));
91 check(cpl_parameter_set_alias(p,CPL_PARAMETER_MODE_CLI,name));
92 check(cpl_parameterlist_append(list,p));
93
94 cleanup:
95 return;
96}
97
98void xsh_parameters_new_string( cpl_parameterlist* list,
99 const char* recipe_id,
100 const char* name,
101 const char* value,
102 const char* comment)
103{
104 char * paramname = NULL ;
105 char * recipename = NULL ;
106 cpl_parameter* p =NULL;
107
108 recipename = xsh_stringcat_any( "xsh.", recipe_id, (void*)NULL );
109 paramname = xsh_stringcat_any( recipename, ".", name, (void*)NULL );
110 if(strstr(recipe_id,"xsh_molecfit")){
111 sprintf(paramname,"%s",name);
112 }
113
114 assure(list != NULL,CPL_ERROR_NULL_INPUT,"parameters list is NULL");
115
116 check(p = cpl_parameter_new_value(paramname,CPL_TYPE_STRING, comment,
117 recipename, value));
118 check(cpl_parameter_set_alias(p,CPL_PARAMETER_MODE_CLI,name));
119 check(cpl_parameterlist_append(list,p));
120
121 cleanup:
122 XSH_FREE(recipename);
123 XSH_FREE(paramname);
124 return;
125}
126
127void xsh_parameters_new_double( cpl_parameterlist* list,
128 const char* recipe_id,const char* name,double value, const char* comment)
129{
130 char paramname[256];
131 char recipename[256];
132 cpl_parameter* p =NULL;
133
134
135 sprintf(recipename,"xsh.%s",recipe_id);
136 sprintf(paramname,"%s.%s",recipename,name);
137 if(strstr(recipe_id,"xsh_molecfit")){
138 sprintf(paramname,"%s",name);
139 }
140 assure(list != NULL,CPL_ERROR_NULL_INPUT,"parameters list is NULL");
141
142 check(p = cpl_parameter_new_value(paramname,CPL_TYPE_DOUBLE,comment,
143 recipename,value));
144 check(cpl_parameter_set_alias(p,CPL_PARAMETER_MODE_CLI,name));
145 check(cpl_parameterlist_append(list,p));
146
147 cleanup:
148 return;
149}
150
151static void
152xsh_parameters_new_bool( cpl_parameterlist* list,
153 const char* recipe_id,const char* name,bool value, const char* comment)
154{
155 char paramname[256];
156 char recipename[256];
157 cpl_parameter* p =NULL;
158
159
160 sprintf(recipename,"xsh.%s",recipe_id);
161 sprintf(paramname,"%s.%s",recipename,name);
162 if(strstr(recipe_id,"xsh_molecfit")){
163 sprintf(paramname,"%s",name);
164 }
165 assure(list != NULL,CPL_ERROR_NULL_INPUT,"parameters list is NULL");
166
167 check(p = cpl_parameter_new_value(paramname,CPL_TYPE_BOOL,comment,
168 recipename,value));
169 check(cpl_parameter_set_alias(p,CPL_PARAMETER_MODE_CLI,name));
170 check(cpl_parameterlist_append(list,p));
171
172 cleanup:
173 return;
174}
175
176static void
177xsh_parameters_new_float( cpl_parameterlist* list,
178 const char* recipe_id,const char* name,float value, const char* comment)
179{
180 char paramname[256];
181 char recipename[256];
182 cpl_parameter* p =NULL;
183
184
185 sprintf(recipename,"xsh.%s",recipe_id);
186 sprintf(paramname,"%s.%s",recipename,name);
187 if(strstr(recipe_id,"xsh_molecfit")){
188 sprintf(paramname,"%s",name);
189 }
190 assure(list != NULL,CPL_ERROR_NULL_INPUT,"parameters list is NULL");
191
192 check(p = cpl_parameter_new_value(paramname,CPL_TYPE_FLOAT,comment,
193 recipename,value));
194 check(cpl_parameter_set_alias(p,CPL_PARAMETER_MODE_CLI,name));
195 check(cpl_parameterlist_append(list,p));
196
197 cleanup:
198 return;
199}
200
201static void xsh_parameters_new_range_int( cpl_parameterlist* list,
202 const char* recipe_id,
203 const char* name,
204 int def, int min, int max,
205 const char* comment)
206{
207 char paramname[256];
208 char recipename[256];
209 cpl_parameter* p =NULL;
210
211
212 sprintf(recipename,"xsh.%s",recipe_id);
213 sprintf(paramname,"%s.%s",recipename,name);
214 if(strstr(recipe_id,"xsh_molecfit")){
215 sprintf(paramname,"%s",name);
216 }
217 assure(list != NULL,CPL_ERROR_NULL_INPUT,"parameters list is NULL");
218
219 check(p = cpl_parameter_new_range( paramname,CPL_TYPE_INT, comment,
220 recipename, def, min, max ));
221 check(cpl_parameter_set_alias(p,CPL_PARAMETER_MODE_CLI,name));
222 check(cpl_parameterlist_append(list,p));
223
224 cleanup:
225 return;
226}
227static void xsh_parameters_new_range_double( cpl_parameterlist* list,
228 const char* recipe_id,
229 const char* name,
230 double def, double min, double max,
231 const char* comment)
232{
233 char paramname[256];
234 char recipename[256];
235 cpl_parameter* p =NULL;
236
237
238 sprintf(recipename,"xsh.%s",recipe_id);
239 sprintf(paramname,"%s.%s",recipename,name);
240 if(strstr(recipe_id,"xsh_molecfit")){
241 sprintf(paramname,"%s",name);
242 }
243 assure(list != NULL,CPL_ERROR_NULL_INPUT,"parameters list is NULL");
244
245 check(p = cpl_parameter_new_range( paramname,CPL_TYPE_DOUBLE, comment,
246 recipename, def, min, max ));
247 check(cpl_parameter_set_alias(p,CPL_PARAMETER_MODE_CLI,name));
248 check(cpl_parameterlist_append(list,p));
249
250 cleanup:
251 return;
252}
253
254
255
256char * xsh_parameters_get_string( const cpl_parameterlist* list,
257 const char* recipe_id, const char* name)
258{
259 char paramname[256];
260 cpl_parameter * p =NULL;
261 char * result = NULL ;
262
263 sprintf(paramname,"xsh.%s.%s",recipe_id, name);
264
265 p = cpl_parameterlist_find( (cpl_parameterlist *)list, paramname);
266 if ( p == NULL ) goto cleanup ;
267 result = (char *)cpl_parameter_get_string(p) ;
268
269 cleanup:
270 return result;
271}
272
273
274int xsh_parameters_get_boolean( const cpl_parameterlist * list,
275 const char* recipe_id, const char* name)
276{
277 char paramname[256];
278 char recipename[256];
279 cpl_parameter* p =NULL;
280 int result = 0;
281
282 sprintf(recipename,"xsh.%s",recipe_id);
283 sprintf(paramname,"%s.%s",recipename,name);
284
285 assure(list != NULL,CPL_ERROR_NULL_INPUT,"parameters list is NULL");
286
287 check(p = cpl_parameterlist_find( (cpl_parameterlist *)list,paramname));
288 check(result = cpl_parameter_get_bool( p));
289
290 cleanup:
291 return result;
292}
293
294
295int xsh_parameters_get_int(const cpl_parameterlist* list,
296 const char* recipe_id, const char* name)
297{
298 char paramname[256];
299 char recipename[256];
300 cpl_parameter* p =NULL;
301 int result = 0;
302 sprintf(recipename,"xsh.%s",recipe_id);
303 sprintf(paramname,"%s.%s",recipename,name);
304
305 assure(list != NULL,CPL_ERROR_NULL_INPUT,"parameters list is NULL");
306 check(p = cpl_parameterlist_find( (cpl_parameterlist *)list,paramname));
307 check(result = cpl_parameter_get_int(p));
308
309 cleanup:
310 return result;
311}
312
313double xsh_parameters_get_double(const cpl_parameterlist* list,
314 const char* recipe_id, const char* name)
315{
316 char paramname[256];
317 char recipename[256];
318 const cpl_parameter* p =NULL;
319 double result = 0.0;
320
321 sprintf(recipename,"xsh.%s",recipe_id);
322 sprintf(paramname,"%s.%s",recipename,name);
323
324 assure(list != NULL,CPL_ERROR_NULL_INPUT,"parameters list is NULL");
325
326 check(p = cpl_parameterlist_find_const(list,paramname));
327 check(result = cpl_parameter_get_double(p));
328
329 cleanup:
330 return result;
331}
332
336/*---------------------------------------------------------------------------*/
345/*---------------------------------------------------------------------------*/
346
347cpl_parameter* xsh_parameters_find( cpl_parameterlist* list,
348 const char* recipe_id, const char* name)
349{
350
351 char paramname[256];
352 cpl_parameter * result = NULL ;
353
354 sprintf(paramname,"xsh.%s.%s",recipe_id, name);
355 check(result = cpl_parameterlist_find( (cpl_parameterlist *)list, paramname));
356
357 cleanup:
358 return result;
359
360}
361
362
363void xsh_parameters_pre_overscan( const char *recipe_id,
364 cpl_parameterlist * plist )
365{
366 cpl_parameter* p=NULL;
367 char paramname[256];
368 char recipename[256];
369
370 XSH_ASSURE_NOT_NULL( recipe_id ) ;
371 XSH_ASSURE_NOT_NULL( plist ) ;
372
373
374 sprintf(recipename,"xsh.%s",recipe_id);
375 sprintf(paramname,"%s.%s",recipename,"pre-overscan-corr");
376
377 check(p = cpl_parameter_new_enum(paramname,CPL_TYPE_INT,
378 "pre-overscan correction. "
379 "0: no correction "
380 "1: mean overscan correction "
381 "2: mean prescan correction "
382 "3: (mean pre+mean overscan)/2 correction "
383 // "4: ima raw based on overscan"
384 // "5: ima raw based on prescan"
385 // "6: ima raw based on pre and overscan"
386 ,recipename,1,
387 4,0,1,2,3));
388
389 check(cpl_parameter_set_alias(p,CPL_PARAMETER_MODE_CLI,
390 "pre-overscan-corr"));
391 check(cpl_parameterlist_append(plist,p));
392
393 cleanup:
394 return ;
395}
396
397void xsh_parameters_generic( const char *recipe_id,
398 cpl_parameterlist * plist )
399{
400 XSH_ASSURE_NOT_NULL( recipe_id ) ;
401 XSH_ASSURE_NOT_NULL( plist ) ;
402
403 check( xsh_parameters_new_string( plist, recipe_id, "keep-temp", "no",
404 "If 'no', temporary files are deleted." ) ) ;
405 check( xsh_parameters_new_string( plist, recipe_id, "debug-level",
406 "none",
407 "Additional xshooter debug level. One of 'none', 'low', 'medium', 'high'"));
408 /*
409 check( xsh_parameters_new_string( plist, recipe_id, "test",
410 "none",
411 "Can be any string, usage depends on recipe. Used during development phases" ) ) ;
412 */
413 check( xsh_parameters_new_boolean(plist,recipe_id, "time-stamp",
414 FALSE,
415 "Add timestamp to product file name." )) ;
416
417 cleanup:
418 return ;
419}
420
421cpl_error_code
422xsh_parameters_decode_bp( const char *recipe_id,
423 cpl_parameterlist * plist,const int ival )
424{
425 XSH_ASSURE_NOT_NULL( recipe_id ) ;
426 XSH_ASSURE_NOT_NULL( plist ) ;
427 int mval=DECODE_BP_FLAG_MAX;
428 int val=0;
429 if(ival<0) {
431 } else {
432 val=ival;
433 }
434 check(xsh_parameters_new_range_int( plist, recipe_id,"decode-bp",
435 val, 0,mval,"Integer representation of the bits to be considered bad when decoding the bad pixel mask pixel values. \n\
436 Most frequent codes relevant for the user: \n\
437 0: good pixel, \n\
438 8: pick-up noise, \n\
439 16: cosmic-ray removed, \n\
440 32: cosmic-ray unremoved, \n\
441 128: calibration file defect, \n\
442 256: hot pixel, \n\
443 512: dark pixel, \n\
444 4096: A/D converted saturation, \n\
445 32768: non linear pixel, \n\
446 1048576: extrapolated flux in NIR, \n\
447 4194304: Interpolated flux during extraction."));
448 cleanup:
449 return cpl_error_get_code();
450}
451
452cpl_error_code
453xsh_parameters_decode_bp_set( const char *rec_id,cpl_parameterlist * parameters,const int ival)
454{
455
456 cpl_parameter* p = NULL;
457 const char* pname = "decode-bp";
458 p = xsh_parameters_find(parameters, rec_id, pname);
459 cpl_parameter_set_int(p, ival);
460
461 return cpl_error_get_code();
462}
463
464int xsh_parameters_get_temporary( const char * recipe_id,
465 const cpl_parameterlist * list )
466{
467 char * result = NULL ;
468
469 result = xsh_parameters_get_string( list, recipe_id,
470 "keep-temp" ) ;
471 if ( result == NULL ) {
472 xsh_msg( "Cant get parameter 'keep-temp'" ) ;
473 return 1 ;
474 }
475 else if ( strcasecmp( result, "yes" ) == 0 ) return 1 ;
476 else return 0 ;
477
478}
479
480int xsh_parameters_debug_level_get( const char * recipe_id,
481 const cpl_parameterlist * list )
482{
483 char * slevel = NULL ;
484 int level = XSH_DEBUG_LEVEL_NONE ;
485
486 slevel = xsh_parameters_get_string( list, recipe_id,
487 "debug-level" ) ;
488 if ( slevel == NULL ) {
489 xsh_msg( "Cant get parameter 'debug-level'" ) ;
490 }
491 else if ( strcmp( slevel, "low" ) == 0 ) level = XSH_DEBUG_LEVEL_LOW ;
492 else if ( strcmp( slevel, "medium" ) == 0 ) level = XSH_DEBUG_LEVEL_MEDIUM ;
493 else if ( strcmp( slevel, "high" ) == 0 ) level = XSH_DEBUG_LEVEL_HIGH ;
494 else level = XSH_DEBUG_LEVEL_NONE ;
495
496 xsh_debug_level_set( level ) ;
497 return level ;
498}
499
500char * xsh_parameters_test_mode_get( const char * recipe_id,
501 const cpl_parameterlist * list )
502{
503 char * stest = NULL ;
504
505 stest = xsh_parameters_get_string( list, recipe_id,
506 "test" ) ;
507 return stest ;
508}
509
510int xsh_parameters_time_stamp_get( const char * recipe_id,
511 const cpl_parameterlist * list )
512{
513 int ts = FALSE ;
514
515 ts = xsh_parameters_get_boolean( list, recipe_id, "time-stamp" ) ;
516
517 xsh_time_stamp_set( ts ) ;
518
519 return ts ;
520}
521
522int xsh_parameters_cut_uvb_spectrum_get( const char * recipe_id,
523 const cpl_parameterlist * list )
524{
525 int cut = FALSE ;
526
527 cut = xsh_parameters_get_boolean( list, recipe_id, "cut-uvb-spectrum" ) ;
528
529 return cut ;
530}
531/*---------------------------------------------------------------------------*/
539/*---------------------------------------------------------------------------*/
540void xsh_parameters_clipping_crh_create(const char* recipe_id,
541 cpl_parameterlist* list, xsh_clipping_param p)
542{
543 /* check parameters */
544 assure(list != NULL,CPL_ERROR_NULL_INPUT,"parameters list is NULL");
545
546 /* Fill the parameter list */
547 /* --crh-clip-kappa
548 check(xsh_parameters_new_double(list,recipe_id,"crh-clip-res-max", p.res_max,
549 "Maximum allowed residual (before kappa-sigma clipping)"));
550 */
551 check(xsh_parameters_new_double(list,recipe_id,"crh-clip-kappa", p.sigma,
552 "Kappa value in sigma clipping during CRH rejection using "\
553 "multiple frames"));
554 /* --crh-clip-niter */
555 check(xsh_parameters_new_int(list,recipe_id,"crh-clip-niter", p.niter,
556 "Number of iterations in sigma clipping during CRH rejection "\
557 "using multiple frames"));
558 /* --crh-clip-frac */
559 check(xsh_parameters_new_double(list,recipe_id,"crh-clip-frac", p.frac,
560 "Minimal ratio of points accepted / total in sigma clipping "\
561 "during CRH rejection using multiple frames"));
562
563 cleanup:
564 return;
565}
566
567
568
569/*---------------------------------------------------------------------------*/
577/*---------------------------------------------------------------------------*/
578void xsh_parameters_hot_cold_pix_create(const char* recipe_id,
579 cpl_parameterlist* list, xsh_hot_cold_pix_param p)
580{
581 /* check parameters */
582 assure(list != NULL,CPL_ERROR_NULL_INPUT,"parameters list is NULL");
583
584
585 check( xsh_parameters_new_boolean( list, recipe_id,
586 "hot-cold-pix-search",
588 "If true hot and cold pixels are searched"));
589
590 xsh_parameters_new_double(list,recipe_id,"cold-pix-kappa",p.cold_pix_kappa,
591 "Kappa sigma value to clip low intensity pixels");
592
593
594 check(xsh_parameters_new_range_int( list, recipe_id,"cold-pix-niter",
595 p.cold_pix_niter, 1, 999,
596 "Number of kappa-sigma clip iterations (cold pixels search)."));
597
598
599 xsh_parameters_new_double(list,recipe_id,"hot-pix-kappa",p.hot_pix_kappa,
600 "Kappa sigma value to clip high intensity pixels");
601
602 check(xsh_parameters_new_range_int( list, recipe_id,"hot-pix-niter",
603 p.hot_pix_niter, 1, 999,
604 "Number of kappa-sigma clip iterations (hot pixels search)."));
605
606 cleanup:
607 return;
608}
609
610/*---------------------------------------------------------------------------*/
618/*---------------------------------------------------------------------------*/
619void xsh_parameters_struct_create(const char* recipe_id,
620 cpl_parameterlist* list, xsh_struct_param p)
621{
622
623 xsh_parameters_new_int(list,recipe_id,"struct_refx",p.ref_x,
624 "Reference X value to compute structure");
625
626 xsh_parameters_new_int(list,recipe_id,"struct_refy",p.ref_y,
627 "Reference Y value to compute structure");
628}
629
630
631
632/*---------------------------------------------------------------------------*/
640/*---------------------------------------------------------------------------*/
641void xsh_parameters_ref1_create(const char* recipe_id,
642 cpl_parameterlist* list, xsh_ref_param p)
643{
644
645 xsh_parameters_new_int(list,recipe_id,"ref1_llx",p.ref_llx,
646 "Lower left X of reference region");
647
648 xsh_parameters_new_int(list,recipe_id,"ref1_lly",p.ref_lly,
649 "Lower left Y of reference region");
650
651 xsh_parameters_new_int(list,recipe_id,"ref1_urx",p.ref_urx,
652 "Upper right X of reference region");
653
654 xsh_parameters_new_int(list,recipe_id,"ref1_ury",p.ref_ury,
655 "Upper right Y of reference region");
656
657}
658
659
660/*---------------------------------------------------------------------------*/
668/*---------------------------------------------------------------------------*/
669void xsh_parameters_ref2_create(const char* recipe_id,
670 cpl_parameterlist* list, xsh_ref_param p)
671{
672
673 xsh_parameters_new_int(list,recipe_id,"ref2_llx",p.ref_llx,
674 "Lower left X of reference region");
675
676 xsh_parameters_new_int(list,recipe_id,"ref2_lly",p.ref_lly,
677 "Lower left Y of reference region");
678
679 xsh_parameters_new_int(list,recipe_id,"ref2_urx",p.ref_urx,
680 "Upper right X of reference region");
681
682 xsh_parameters_new_int(list,recipe_id,"ref2_ury",p.ref_ury,
683 "Upper right Y of reference region");
684
685}
686
687
688/*---------------------------------------------------------------------------*/
696/*---------------------------------------------------------------------------*/
697void xsh_parameters_ron_dark_create(const char* recipe_id,
698 cpl_parameterlist* list, xsh_ron_dark_param p)
699{
700
701 xsh_parameters_new_int(list,recipe_id,"ron_llx",p.ron_llx,
702 "Lower left X of reference region to measure RON");
703
704 xsh_parameters_new_int(list,recipe_id,"ron_lly",p.ron_lly,
705 "Lower left Y of reference region to measure RON");
706
707 xsh_parameters_new_int(list,recipe_id,"ron_urx",p.ron_urx,
708 "Upper right X of reference region to measure RON");
709
710 xsh_parameters_new_int(list,recipe_id,"ron_ury",p.ron_ury,
711 "Upper right Y of reference region to measure RON");
712
713 xsh_parameters_new_int(list,recipe_id,"ron_hsize",p.ron_hsize,
714 "Sampling area size");
715
716
717 xsh_parameters_new_int(list,recipe_id,"ron_nsamples",p.ron_nsamp,
718 "Number of random samples");
719
720
721
722}
723
724
725/*---------------------------------------------------------------------------*/
733/*---------------------------------------------------------------------------*/
734void
735xsh_parameters_stack_create(const char* recipe_id,
736 cpl_parameterlist* list, xsh_stack_param sp)
737{
738
739 char * paramname = NULL ;
740 char * recipename = NULL ;
741 const char* aliasname="stack-method";
742 cpl_parameter* p =NULL;
743
744 recipename = xsh_stringcat_any( "xsh.", recipe_id, (void*)NULL );
745 paramname = xsh_stringcat_any( recipename, ".", aliasname, (void*)NULL );
746
747 p = cpl_parameter_new_enum(paramname,CPL_TYPE_STRING,
748 "Method used to build master frame.",
749 recipe_id,"median",
750 2,"median","mean");
751
752 cpl_parameter_set_alias(p,CPL_PARAMETER_MODE_CLI,
753 aliasname);
754 cpl_parameterlist_append(list,p);
755
756 xsh_parameters_new_double(list,recipe_id,"klow",sp.klow,
757 "Kappa used to clip low level values, when method is set to 'mean'");
758
759 xsh_parameters_new_double(list,recipe_id,"khigh",sp.khigh,
760 "Kappa used to clip high level values, when method is set to 'mean'");
761
762 XSH_FREE(recipename);
763 XSH_FREE(paramname);
764
765}
766/*---------------------------------------------------------------------------*/
774/*---------------------------------------------------------------------------*/
775void xsh_parameters_ron_create(const char* recipe_id,
776 cpl_parameterlist* list, xsh_ron_param p)
777{
778
779
780 xsh_ref_param ref_params = {p.ron_ref_llx,p.ron_ref_lly,
782
783
784 xsh_parameters_new_string(list,recipe_id,"ron_method",p.ron_method,
785 "RON computation method");
786
787 xsh_parameters_new_int(list,recipe_id,"random_sizex",p.ron_random_sizex,
788 "Region X size for random computation");
789
790 xsh_parameters_new_int(list,recipe_id,"random_nsamples",p.ron_random_nsamples,
791 "Number of random samples");
792
793
794 xsh_parameters_ref1_create(recipe_id,list,ref_params);
795 xsh_parameters_ref2_create(recipe_id,list,ref_params);
796
797
798 xsh_parameters_new_int(list,recipe_id,"stacking_ks_low",p.stacking_ks_low,
799 "Lower value of kappa-sigma clip in stacking");
800
801 xsh_parameters_new_int(list,recipe_id,"stacking_ks_iter",p.stacking_ks_iter,
802 "Number of iterations in kappa-sigma clip in stacking");
803
804
805}
806
807/*---------------------------------------------------------------------------*/
815/*---------------------------------------------------------------------------*/
816void xsh_parameters_pd_noise_create(const char* recipe_id,
817 cpl_parameterlist* list, xsh_pd_noise_param p)
818{
819
820 xsh_parameters_new_bool(list, recipe_id, "pd_noise_compute", p.pd_compute,
821 "Determine Fixed Pattern Noise. "
822 "If TRUE the Fixed Pattern Noise power spectrum is determined.");
823
824 xsh_parameters_new_range_int(list,recipe_id,"pd_noise_dc_x",1,1,4096,
825 "x-size (pixel) of the mask starting at (x,y) = (1,1).");
826
827 xsh_parameters_new_range_int(list,recipe_id,"pd_noise_dc_y",1,1,4096,
828 "y-size (pixel) of the mask starting at (x,y) = (1,1).");
829
830}
831
832
833/*---------------------------------------------------------------------------*/
841/*---------------------------------------------------------------------------*/
842void xsh_parameters_fpn_create(const char* recipe_id,
843 cpl_parameterlist* list, xsh_fpn_param p)
844{
845
846 xsh_parameters_new_int(list,recipe_id,"fpn_llx",p.fpn_llx,
847 "Lower left reference area X coordinate for "
848 "Fixed Pattern Noise computation");
849
850 xsh_parameters_new_int(list,recipe_id,"fpn_lly",p.fpn_lly,
851 "Lower left reference area Y coordinate for "
852 "Fixed Pattern Noise computation");
853
854 xsh_parameters_new_int(list,recipe_id,"fpn_urx",p.fpn_urx,
855 "Upper right reference area X coordinate for "
856 "Fixed Pattern Noise computation");
857
858 xsh_parameters_new_int(list,recipe_id,"fpn_ury",p.fpn_ury,
859 "Upper right reference area Y coordinate for "
860 "Fixed Pattern Noise computation");
861
862 xsh_parameters_new_int(list,recipe_id,"fpn_hsize",p.fpn_hsize,
863 "Sample size for "
864 "Fixed Pattern Noise computation");
865
866
867 xsh_parameters_new_int(list,recipe_id,"fpn_nsamples",p.fpn_nsamples,
868 "Number of sampling points for "
869 "Fixed Pattern Noise computation");
870
871}
872
873/*---------------------------------------------------------------------------*/
881/*---------------------------------------------------------------------------*/
883 cpl_parameterlist* list)
884{
885 xsh_clipping_param* result = NULL;
886
887 /* check parameters */
888 assure(list != NULL,CPL_ERROR_NULL_INPUT,"parameters list is NULL");
889
890 /* allocate the structure */
891 check(result = (xsh_clipping_param*)(cpl_malloc(sizeof(xsh_clipping_param)))
892 );
893 assure (result != NULL, CPL_ERROR_ILLEGAL_OUTPUT,
894 "Memory allocation failed!");
895
896 /* Fill the structure */
897 /*
898 check(result->res_max = xsh_parameters_get_double(list,recipe_id,
899 "crh-clip-res-max"));
900 */
901 check(result->sigma = xsh_parameters_get_double(list,recipe_id,
902 "crh-clip-kappa"));
903 check(result->niter = xsh_parameters_get_int(list,recipe_id,
904 "crh-clip-niter"));
905 check(result->frac = xsh_parameters_get_double(list,recipe_id,
906 "crh-clip-frac"));
907
908 cleanup:
909 if(cpl_error_get_code() != CPL_ERROR_NONE){
910 cpl_free(result);
911 result = NULL;
912 }
913 return result;
914}
915/****************** detect continuum **************/
916/*---------------------------------------------------------------------------*/
924/*---------------------------------------------------------------------------*/
925void xsh_parameters_clipping_noise_create(const char* recipe_id,
926 cpl_parameterlist* list,
927 xsh_clipping_param noise_param)
928{
929 /* check parameters */
930 assure(list != NULL,CPL_ERROR_NULL_INPUT,"parameters list is NULL");
931
932 /* Fill the parameter list */
933 /* --noise-clip-kappa */
934 check(xsh_parameters_new_double(list,recipe_id,"noise-clip-kappa",
935 noise_param.sigma,
936 "Multiple of sigma in sigma clipping"));
937 /* --noise-clip-niter */
938 check(xsh_parameters_new_int(list,recipe_id,"noise-clip-niter",
939 noise_param.niter,
940 "Number of iterations in sigma clipping"));
941 /* --noise-clip-frac */
942 check(xsh_parameters_new_double(list,recipe_id,"noise-clip-frac",
943 noise_param.frac,
944 "Minimal fractions of bad pixel allowed"));
945 /* --noise-clip-diff */
946 check(xsh_parameters_new_double(list,recipe_id,"noise-clip-diff",
947 noise_param.diff,
948 "Minimum relative change in sigma for sigma clipping"));
949 cleanup:
950 return;
951}
952
953/*---------------------------------------------------------------------------*/
961/*---------------------------------------------------------------------------*/
963 cpl_parameterlist* list)
964{
965 xsh_clipping_param* result = NULL;
966
967 /* check parameters */
968 assure(list != NULL,CPL_ERROR_NULL_INPUT,"parameters list is NULL");
969
970 /* allocate the structure */
971 check(result = (xsh_clipping_param*)(cpl_malloc(sizeof(xsh_clipping_param)))
972 );
973 assure (result != NULL, CPL_ERROR_ILLEGAL_OUTPUT,
974 "Memory allocation failed!");
975
976 /* Fill the structure */
977 check(result->sigma = xsh_parameters_get_double(list,recipe_id,
978 "noise-clip-kappa"));
979 check(result->niter = xsh_parameters_get_int(list,recipe_id,
980 "noise-clip-niter"));
981 check(result->frac = xsh_parameters_get_double(list,recipe_id,
982 "noise-clip-frac"));
983 check(result->diff = xsh_parameters_get_double(list,recipe_id,
984 "noise-clip-diff"));
985 cleanup:
986 if(cpl_error_get_code() != CPL_ERROR_NONE){
987 cpl_free(result);
988 result = NULL;
989 }
990 return result;
991}
992
993/*---------------------------------------------------------------------------*/
1003/*---------------------------------------------------------------------------*/
1004
1005void xsh_parameters_detect_order_create(const char* recipe_id,
1006 cpl_parameterlist* list)
1007{
1008
1009 char paramname[256];
1010 char recipename[256];
1011 cpl_parameter* p =NULL;
1012
1013 /* check parameters */
1014 XSH_ASSURE_NOT_NULL( recipe_id);
1015 XSH_ASSURE_NOT_NULL( list);
1016
1017 /* Fill the parameter list */
1018 /* --detectorder-search-window-half-size */
1019 check( xsh_parameters_new_int( list, recipe_id,
1020 "detectorder-edges-search-win-hsize",
1021 50,
1022 "During extraction the local spatial profile (=cross-order) of the spectrum is determined by collapsing the 2-dimensional spectrum along the dispersion axis. This parameter defines the half size of the region across which the spectrum is collapsed. This parameter affects flagged pixels interpolation. In case of spectrum gaps the recommended optimal value is: (size_of_gap [nm]/(2*size_of_pixel [nm])+1)"));
1023
1024 /* --detectorder-edges-threshold-factor */
1025 check( xsh_parameters_new_double( list, recipe_id,
1026 "detectorder-edges-flux-thresh",
1027 0.4,
1028 "Threshold in relative flux (compared to the central flux) "\
1029 "below which the order edges are defined"));
1030 /* --detectorder-min-sn */
1031 check( xsh_parameters_new_double( list, recipe_id,
1032 "detectorder-min-sn",
1033 -1,
1034 "Minimum signal-to-noise ratio at the centroid of the orders (60 for SLIT-UVB,VIS,NIR, 20 for IFU-UVB,VIS, 4 for IFU-NIR"));
1035 /* --detectorder-min-order-size-x */
1036 check( xsh_parameters_new_int( list, recipe_id,
1037 "detectorder-min-order-size-x",
1038 -1,
1039 "Minimum order size in pixels along X direction [60 for UVB,VIS, 40 for NIR]"));
1040 check( xsh_parameters_new_int( list, recipe_id,
1041 "detectorder-chunk-half-size",
1042 1,
1043 "Half size in pixels of the chunks in Y direction"));
1044
1045 /* --detectorder-slitlet-low-factor */
1046 check( xsh_parameters_new_double( list, recipe_id,
1047 "detectorder-slitlet-low-factor",
1048 1.0,
1049 "Factor for slitlet on lower edge slitlet (IFU)"));
1050 /* --detectorder-slitlet-up-factor */
1051 check( xsh_parameters_new_double( list, recipe_id,
1052 "detectorder-slitlet-up-factor",
1053 1.0,
1054 "Factor for slitlet on upper edge (IFU)"));
1055 check( xsh_parameters_new_boolean( list, recipe_id,
1056 "detectorder-fixed-slice",
1057 CPL_TRUE,
1058 "If true the size of slitlet is fixed (IFU)"));
1059
1060
1061
1062 sprintf(recipename,"xsh.%s",recipe_id);
1063 sprintf(paramname,"%s.%s",recipename,"detectorder-slice-trace-method");
1064
1065 assure(list != NULL,CPL_ERROR_NULL_INPUT,"parameters list is NULL");
1066
1067 check(p = cpl_parameter_new_enum(paramname,CPL_TYPE_STRING,
1068 "method adopted for IFU slice tracing ('fixed' for SLIT and 'sobel' for IFU):",
1069 recipename,"auto",
1070 4,"auto","fixed","sobel","scharr"));
1071
1072 check(cpl_parameter_set_alias(p,CPL_PARAMETER_MODE_CLI,
1073 "detectorder-slice-trace-method"));
1074 check(cpl_parameterlist_append(list,p));
1075
1076 check( xsh_parameters_new_boolean( list, recipe_id,
1077 "detectorder-qc-mode",
1078 CPL_FALSE,
1079 "If true allows one to skip edge detection on orders below detectorder-min-sn (oly for QC mode, not to be set by normal users)"));
1080
1081 cleanup:
1082 return;
1083}
1084
1085/*---------------------------------------------------------------------------*/
1097/*---------------------------------------------------------------------------*/
1098
1100 cpl_parameterlist* list,cpl_parameterlist* drs)
1101{
1102 xsh_detect_order_param* result = NULL;
1103
1104 /* check parameters */
1105 XSH_ASSURE_NOT_NULL( list);
1106
1107 /* allocate the structure */
1109
1110 /* Fill the structure */
1111 check( result->search_window_hsize = xsh_parameters_get_int( list, recipe_id,
1112 "detectorder-edges-search-win-hsize"));
1113 check( result->flux_thresh = xsh_parameters_get_double( list, recipe_id,
1114 "detectorder-edges-flux-thresh"));
1115 check( result->min_sn = xsh_parameters_get_double( list, recipe_id,
1116 "detectorder-min-sn"));
1117 check( result->min_order_size_x = xsh_parameters_get_int( list, recipe_id,
1118 "detectorder-min-order-size-x"));
1119 check( result->chunk_hsize = xsh_parameters_get_int( list, recipe_id,
1120 "detectorder-chunk-half-size"));
1121 check( result->slitlet_low_factor = xsh_parameters_get_double( list,recipe_id,
1122 "detectorder-slitlet-low-factor"));
1123 check( result->slitlet_up_factor = xsh_parameters_get_double( list,recipe_id,
1124 "detectorder-slitlet-up-factor"));
1125 check( result->fixed_slice = xsh_parameters_get_boolean( list,recipe_id,
1126 "detectorder-fixed-slice"));
1127
1128 check( result->method = xsh_parameters_get_string( list,recipe_id,
1129 "detectorder-slice-trace-method"));
1130 if(drs==NULL) {
1131 result->qc_mode= false;
1132 } else {
1133 check( result->qc_mode = xsh_parameters_get_boolean( drs,recipe_id,
1134 "detectorder-qc-mode"));
1135 }
1136 cleanup:
1137 if(cpl_error_get_code() != CPL_ERROR_NONE){
1138 XSH_FREE( result);
1139 }
1140 return result;
1141}
1142/*---------------------------------------------------------------------------*/
1152/*---------------------------------------------------------------------------*/
1153
1154void xsh_parameters_d2_detect_order_create(const char* recipe_id,
1155 cpl_parameterlist* list)
1156{
1157 /* check parameters */
1158 XSH_ASSURE_NOT_NULL( recipe_id);
1159 XSH_ASSURE_NOT_NULL( list);
1160
1161 /* Fill the parameter list */
1162
1163 /* --detectorder-d2-min-sn */
1164 check( xsh_parameters_new_range_double( list, recipe_id,
1165 "detectorder-d2-min-sn",
1166 60.,0,150,
1167 "minimum signal noise ratio in D2 lamp frame in order"));
1168 cleanup:
1169 return;
1170}
1171
1172/*---------------------------------------------------------------------------*/
1184/*---------------------------------------------------------------------------*/
1185
1187 const char* recipe_id, cpl_parameterlist* list)
1188{
1189 xsh_d2_detect_order_param* result = NULL;
1190
1191 /* check parameters */
1192 XSH_ASSURE_NOT_NULL( list);
1193
1194 /* allocate the structure */
1196
1197 /* Fill the structure */
1198 check( result->min_sn = xsh_parameters_get_double( list, recipe_id,
1199 "detectorder-d2-min-sn"));
1200
1201 cleanup:
1202 if(cpl_error_get_code() != CPL_ERROR_NONE){
1203 XSH_FREE( result);
1204 }
1205 return result;
1206}
1207
1208/*---------------------------------------------------------------------------*/
1216/*---------------------------------------------------------------------------*/
1217void xsh_parameters_background_create( const char* recipe_id,
1218 cpl_parameterlist* list)
1219{
1220 /*
1221 char paramname[256];
1222 char recipename[256];
1223 cpl_parameter* p =NULL;
1224 */
1225 /* check parameters */
1226 XSH_ASSURE_NOT_NULL(list);
1227
1228
1229 /* Fill the parameter list */
1230 assure(list != NULL,CPL_ERROR_NULL_INPUT,"parameters list is NULL");
1231
1232 check( xsh_parameters_new_range_int( list, recipe_id,
1233 "background-edges-margin",
1234 1,0,15,
1235 "X margin to order edge to define background sampling points"));
1236
1237 check( xsh_parameters_new_range_int( list, recipe_id,
1238 "background-poly-deg-y",
1239 9,0,15,
1240 "Poly mode fit deg along Y."));
1241
1242 check( xsh_parameters_new_range_int( list, recipe_id,
1243 "background-poly-deg-x",
1244 9,0,15,
1245 "Poly mode fit deg along X."));
1246
1247 check( xsh_parameters_new_range_double( list, recipe_id,
1248 "background-poly-kappa",
1249 10.0,0,100,
1250 "Poly mode kappa value of kappa-sigma-clip outliers removal."));
1251
1252 /*
1253 check( xsh_parameters_new_boolean( list, recipe_id,
1254 "background-debug",
1255 CPL_TRUE,
1256 "Generate a table containing the background sampling grid points"));
1257 */
1258 cleanup:
1259 return;
1260}
1261/*---------------------------------------------------------------------------*/
1269/*---------------------------------------------------------------------------*/
1270
1272 cpl_parameterlist* list)
1273{
1274 xsh_background_param* result = NULL;
1275
1276 /* check parameters */
1277 XSH_ASSURE_NOT_NULL( list );
1278
1279 /* allocate the structure */
1280 XSH_MALLOC( result, xsh_background_param, 1);
1281 memset(result, 0x0, sizeof(*result));
1282
1283 /* Fill the structure */
1284 check(result->edges_margin = xsh_parameters_get_int(list,recipe_id,
1285 "background-edges-margin"));
1286
1287 check(result->poly_deg_x = xsh_parameters_get_int(list,recipe_id,
1288 "background-poly-deg-x"));
1289
1290 check(result->poly_deg_y = xsh_parameters_get_int(list,recipe_id,
1291 "background-poly-deg-y"));
1292
1293 check(result->poly_kappa = xsh_parameters_get_double(list,recipe_id,
1294 "background-poly-kappa"));
1295
1296 /*
1297 check(result->debug = xsh_parameters_get_boolean(list,recipe_id,
1298 "background-debug"));
1299 */
1300 result->debug=true;
1301
1302 cleanup:
1303 if(cpl_error_get_code() != CPL_ERROR_NONE){
1304 XSH_FREE( result);
1305 }
1306 return result;
1307}
1308
1309/*---------------------------------------------------------------------------*/
1318/*---------------------------------------------------------------------------*/
1319
1320void xsh_parameters_detect_arclines_create(const char* recipe_id,
1321 cpl_parameterlist* list, xsh_detect_arclines_param p)
1322{
1323 const char *method_string = NULL;
1324 /* check parameters */
1325 XSH_ASSURE_NOT_NULL(list);
1326
1327 /* --detectarclines-fit-win-hsize */
1328 check( xsh_parameters_new_int(list,recipe_id,
1329 "detectarclines-fit-win-hsize",
1331 "Half window size (HWS) in pixels for the line 2D fitting window"\
1332 " (total window size = 2*HWS+1)"));
1333 /* --detectarclines-search-win-hsize */
1334 check( xsh_parameters_new_int(list,recipe_id,
1335 "detectarclines-search-win-hsize",
1337 "Half window size (HWS) in pixels for the line search box around "\
1338 "the expected position (total window size = 2*HWS+1) [bin units]"));
1339 /* --detectarclines-running-median-hsize */
1340 check( xsh_parameters_new_int(list,recipe_id,
1341 "detectarclines-running-median-hsize",
1343 "Half window size in pixels (HWS) for the running median box"));
1344 /* --detectarclines-wavesol-deg-lambda*/
1345 check( xsh_parameters_new_int( list, recipe_id,
1346 "detectarclines-wavesol-deg-lambda",
1348 "Degree in lambda in the polynomial solution "\
1349 "X=f(lambda,order,slit) and Y=f(lambda,order,slit) (POLY mode)"));
1350 /* --detectarclines-wavesol-deg-order */
1351 check( xsh_parameters_new_int( list, recipe_id,
1352 "detectarclines-wavesol-deg-order",
1354 "Degree in order in the polynomial solution "\
1355 "X=f(lambda,order,slit) and Y=f(lambda,order,slit) (POLY mode)"));
1356 if( strcmp("xsh_2dmap",recipe_id) == 0 ) {
1357 /* --detectarclines-wavesol-deg-slit */
1358 check( xsh_parameters_new_int( list, recipe_id,
1359 "detectarclines-wavesol-deg-slit",
1361 "Degree in slit in the polynomial solution "\
1362 "X=f(lambda,order,slit) and Y=f(lambda,order,slit) (POLY mode)"));
1363
1364 }
1365
1366 /* --detectarclines-ordertab-deg-y */
1367 if (strcmp(recipe_id, "xsh_predict") == 0) {
1368 check(xsh_parameters_new_int(list, recipe_id,
1369 "detectarclines-ordertab-deg-y",
1371 "Degree in Y in the polynomial order tracing X=f(Y)"));
1372 }
1373 /* --detectarclines-min-sn */
1374 check( xsh_parameters_new_double( list, recipe_id,
1375 "detectarclines-min-sn",
1376 p.min_sn,
1377 "Minimum signal-to-noise ratio to filter lines [xsh_predict: UVB,VIS=5,NIR=4; xsh_2dmap: UVB=3, VIS=6, NIR=10]"));
1378 /* --detectarclines-find-lines-center */
1380 method_string= "gaussian";
1381 }
1382 else{
1383 method_string = "barycenter";
1384 }
1385 check( xsh_parameters_new_string( list, recipe_id,
1386 "detectarclines-find-lines-center", method_string,
1387 "Method used to find the center of the lines: gaussian, barycenter. Gaussian method applies a Gaussian fit to the line. Barycenter method computes the line centroid." ));
1388 /*
1389 check( xsh_parameters_new_boolean( list, recipe_id,
1390 "detectarclines-mode-iterative", p.mode_iterative,
1391 "If TRUE the recipe doesn't crash if it doesn't succceeded "\
1392 "in producing order table."));
1393 */
1394
1395 cleanup:
1396 return;
1397}
1398
1399
1400/*---------------------------------------------------------------------------*/
1408/*---------------------------------------------------------------------------*/
1410 const char* recipe_id, cpl_parameterlist* list)
1411{
1412 xsh_stack_param* result = NULL;
1413 //const char *method_string = NULL;
1414
1415 /* check parameters */
1416 XSH_ASSURE_NOT_NULL(list);
1417
1418 /* allocate the structure */
1419 XSH_MALLOC(result,xsh_stack_param,1);
1420
1421 /* Fill the structure */
1422 check( result->stack_method = xsh_parameters_get_string( list, recipe_id,
1423 "stack-method"));
1424
1425 check( result->klow = xsh_parameters_get_double( list, recipe_id,"klow"));
1426
1427 check( result->khigh = xsh_parameters_get_double( list, recipe_id,"khigh"));
1428
1429 cleanup:
1430 return result;
1431
1432}
1433
1434/*---------------------------------------------------------------------------*/
1442/*---------------------------------------------------------------------------*/
1444 const char* recipe_id, cpl_parameterlist* list)
1445{
1446 xsh_detect_arclines_param* result = NULL;
1447 const char *method_string = NULL;
1448
1449 /* check parameters */
1450 XSH_ASSURE_NOT_NULL(list);
1451
1452 /* allocate the structure */
1454
1455 /* Fill the structure */
1456 check( result->fit_window_hsize = xsh_parameters_get_int( list, recipe_id,
1457 "detectarclines-fit-win-hsize"));
1459 recipe_id, "detectarclines-search-win-hsize"));
1461 recipe_id, "detectarclines-running-median-hsize"));
1462 check( result->wavesol_deg_lambda = xsh_parameters_get_int( list, recipe_id,
1463 "detectarclines-wavesol-deg-lambda"));
1464 if (strcmp("xsh_2dmap", recipe_id) == 0) {
1465 check(
1466 result->wavesol_deg_slit = xsh_parameters_get_int( list, recipe_id, "detectarclines-wavesol-deg-slit"));
1467 } else {
1468
1469 result->wavesol_deg_slit=0;
1470 }
1471 check( result->wavesol_deg_order = xsh_parameters_get_int( list, recipe_id,
1472 "detectarclines-wavesol-deg-order"));
1473 if (strcmp("xsh_predict", recipe_id) == 0) {
1474 check( result->ordertab_deg_y = xsh_parameters_get_int( list, recipe_id,
1475 "detectarclines-ordertab-deg-y"));
1476 }
1477 check( result->min_sn = xsh_parameters_get_double( list, recipe_id,
1478 "detectarclines-min-sn"));
1479 check( method_string = xsh_parameters_get_string( list, recipe_id,
1480 "detectarclines-find-lines-center"));
1481 if ( strcmp( method_string, "gaussian") == 0){
1483 }
1484 else{
1486 }
1487 /*
1488 check( result->mode_iterative = xsh_parameters_get_boolean( list, recipe_id,
1489 "detectarclines-mode-iterative"));
1490 */
1491 result->mode_iterative=false;
1492 cleanup:
1493 if(cpl_error_get_code() != CPL_ERROR_NONE){
1494 XSH_FREE(result);
1495 }
1496 return result;
1497}
1498
1499/*---------------------------------------------------------------------------*/
1511/*---------------------------------------------------------------------------*/
1513 cpl_parameterlist* list, xsh_clipping_param p)
1514{
1515 /* check parameters */
1516 XSH_ASSURE_NOT_NULL(list);
1517
1518 /* Fill the parameter list */
1519 check(xsh_parameters_new_double( list, recipe_id,
1520 "detectarclines-clip-sigma",
1521 p.sigma,
1522 "Kappa value in sigma clipping during the polynomial solution "\
1523 "fit (POLY mode)"));
1524 check( xsh_parameters_new_int( list, recipe_id,
1525 "detectarclines-clip-niter",
1526 p.niter,
1527 "Number of iterations in sigma clipping during the polynomial "\
1528 "solution fit (POLY mode)"));
1529 check( xsh_parameters_new_double( list, recipe_id,
1530 "detectarclines-clip-frac",
1531 p.frac,
1532 "Minimal fractions of bad pixel allowed in sigma clipping during"\
1533 "the polynomial solution fit (POLY mode)"));
1534 cleanup:
1535 return;
1536}
1537
1538/*---------------------------------------------------------------------------*/
1550/*---------------------------------------------------------------------------*/
1552 const char* recipe_id, cpl_parameterlist* list)
1553{
1554 xsh_clipping_param* result = NULL;
1555
1556 /* check parameters */
1557 XSH_ASSURE_NOT_NULL(list);
1558
1559 /* allocate the structure */
1560 XSH_MALLOC(result, xsh_clipping_param, 1);
1561
1562 /* Fill the structure */
1563 check(result->sigma = xsh_parameters_get_double(list,recipe_id,
1564 "detectarclines-clip-sigma"));
1565 check(result->niter = xsh_parameters_get_int(list,recipe_id,
1566 "detectarclines-clip-niter"));
1567 check(result->frac = xsh_parameters_get_double(list,recipe_id,
1568 "detectarclines-clip-frac"));
1569
1570 cleanup:
1571 if(cpl_error_get_code() != CPL_ERROR_NONE){
1572 XSH_FREE(result);
1573 }
1574 return result;
1575}
1576
1577
1585/*---------------------------------------------------------------------------*/
1586void xsh_parameters_clipping_dcn_create(const char* recipe_id,
1587 cpl_parameterlist* list)
1588{
1589 /* check parameters */
1590 XSH_ASSURE_NOT_NULL( list);
1591
1592 /* Fill the parameter list */
1593 /* --dcn-clip-sigma */
1594 check( xsh_parameters_new_range_double(list,recipe_id,
1595 "detectcontinuum-clip-res-max", 0.5, -1., 2.,
1596 "Maximum allowed residual (before kappa-sigma clip)"));
1597
1598 /* --dcn-clip-sigma */
1599 check(xsh_parameters_new_double(list,recipe_id,
1600 "detectcontinuum-clip-sigma", 5,
1601 "Kappa value in sigma clipping during order trace polynomial fit"));
1602 /* --dcn-clip-niter */
1603 check(xsh_parameters_new_int(list,recipe_id,
1604 "detectcontinuum-clip-niter", 5,
1605 "Number of iterations in sigma clipping during order trace "\
1606 "polynomial fit"));
1607 /* --dcn-clip-frac */
1608 check(xsh_parameters_new_double(list,recipe_id,
1609 "detectcontinuum-clip-frac", 0.4,
1610 "Minimal fractions of points accepted / total in sigma clipping"\
1611 "during order trace polynomial fit"));
1612
1613 cleanup:
1614 return;
1615}
1616
1617/*---------------------------------------------------------------------------*/
1629/*---------------------------------------------------------------------------*/
1631 cpl_parameterlist* list)
1632{
1633 xsh_clipping_param* result = NULL;
1634
1635 /* check parameters */
1636 XSH_ASSURE_NOT_NULL(list);
1637
1638 /* allocate the structure */
1639 XSH_MALLOC(result, xsh_clipping_param, 1);
1640
1641 /* Fill the structure */
1642 check(result->res_max = xsh_parameters_get_double(list,recipe_id,
1643 "detectcontinuum-clip-res-max"));
1644 check(result->sigma = xsh_parameters_get_double(list,recipe_id,
1645 "detectcontinuum-clip-sigma"));
1646 check(result->niter = xsh_parameters_get_int(list,recipe_id,
1647 "detectcontinuum-clip-niter"));
1648 check(result->frac = xsh_parameters_get_double(list,recipe_id,
1649 "detectcontinuum-clip-frac"));
1650
1651 cleanup:
1652 if( cpl_error_get_code() != CPL_ERROR_NONE){
1653 cpl_free(result);
1654 result = NULL;
1655 }
1656 return result;
1657}
1658
1659
1667void xsh_parameters_detect_continuum_create( const char* recipe_id,
1668 cpl_parameterlist* list,
1670{
1671 /* check parameters */
1672 XSH_ASSURE_NOT_NULL( list);
1673
1674 /* Fill the parameter list */
1675 check( xsh_parameters_new_int( list, recipe_id,
1676 "detectcontinuum-search-win-hsize",
1677 par.search_window,
1678 "Half window size in pixels for the 1D box to search for the "\
1679 "maximum in the cross-dispersion profile"));
1680
1681 check( xsh_parameters_new_int( list, recipe_id,
1682 "detectcontinuum-running-win-hsize",
1683 par.running_window,
1684 "Half window size for the running median box during the "\
1685 "search for the maximum in the cross-dispersion profile"));
1686
1687 check( xsh_parameters_new_int( list, recipe_id,
1688 "detectcontinuum-fit-win-hsize",
1689 par.fit_window,
1690 "Half window size for the fit of the cross-dispersion profile"));
1691
1692 check( xsh_parameters_new_double( list, recipe_id,
1693 "detectcontinuum-center-thresh-fac",
1694 par.fit_threshold,
1695 "Threshold factor applied to check that the flux at the fitted peak is "
1696 "higher than error."));
1697
1698 check( xsh_parameters_new_int( list, recipe_id,
1699 "detectcontinuum-ordertab-step-y",
1700 par.poly_step,
1701 "Step in Y for order centroid detection"));
1702
1703 check( xsh_parameters_new_int( list, recipe_id,
1704 "detectcontinuum-ordertab-deg-y",
1705 par.poly_degree,
1706 "Degree in Y in the polynomial order tracing X=f(Y)")) ;
1707
1708/*
1709 check( xsh_parameters_new_int( list, recipe_id,
1710 "recoverformat-search-window-half-size",
1711 par.fmtchk_window,
1712 "Half size of window used to follow an order\
1713 (during creation of the order table)"));
1714
1715 check( xsh_parameters_new_int( list, recipe_id,
1716 "recoverformat-search-step-y",
1717 par.fmtchk_step,
1718 "Step in Y used to follow an order\
1719 (during creation of the order table)"));
1720
1721 check( xsh_parameters_new_double( list, recipe_id,
1722 "recoverformat-search-min-sn",
1723 par.fmtchk_search_sn,
1724 "Signal/Noise ratio used to find orders\
1725 (during creation of the order table)"));
1726
1727 check( xsh_parameters_new_double( list, recipe_id,
1728 "recoverformat-search-min-contrast",
1729 par.fmtchk_follow_sn,
1730 "Signal/Bckgrnd ratio used to follow orders\
1731 (during creation of the order table)"));
1732
1733 check( xsh_parameters_new_int( list, recipe_id,
1734 "recoverformat-search-dist-order",
1735 0,
1736 "Used to calculate the distance between orders\
1737 (during creation of the order table)"));
1738*/
1739 cleanup:
1740 return ;
1741}
1742
1755 const char* recipe_id, cpl_parameterlist* list)
1756{
1757 xsh_detect_continuum_param* result = NULL;
1758
1759 /* check parameters */
1760 XSH_ASSURE_NOT_NULL( list);
1761
1762 /* allocate the structure */
1764
1765 /* Fill the structure */
1766 check( result->search_window = xsh_parameters_get_int( list, recipe_id,
1767 "detectcontinuum-search-win-hsize"));
1768 check( result->fit_window = xsh_parameters_get_int( list, recipe_id,
1769 "detectcontinuum-fit-win-hsize"));
1770 check( result->fit_threshold = xsh_parameters_get_double( list, recipe_id,
1771 "detectcontinuum-center-thresh-fac"));
1772 check( result->running_window = xsh_parameters_get_int( list, recipe_id,
1773 "detectcontinuum-running-win-hsize"));
1774 check( result->poly_degree = xsh_parameters_get_int( list, recipe_id,
1775 "detectcontinuum-ordertab-deg-y"));
1776 check( result->poly_step = xsh_parameters_get_int( list, recipe_id,
1777 "detectcontinuum-ordertab-step-y"));
1778/*
1779 check( result->fmtchk_window = xsh_parameters_get_int( list, recipe_id,
1780 "recoverformat-search-window-half-size"));
1781 check( result->fmtchk_step = xsh_parameters_get_int( list, recipe_id,
1782 "recoverformat-search-step-y"));
1783 check( result->fmtchk_search_sn = xsh_parameters_get_double( list, recipe_id,
1784 "recoverformat-search-min-sn"));
1785 check( result->fmtchk_follow_sn = xsh_parameters_get_double( list, recipe_id,
1786 "recoverformat-search-min-contrast"));
1787 check( result->dist_order = xsh_parameters_get_int( list, recipe_id,
1788 "recoverformat-search-dist-order"));
1789*/
1790 cleanup:
1791 if(cpl_error_get_code() != CPL_ERROR_NONE){
1792 XSH_FREE(result);
1793 }
1794 return result;
1795}
1796
1805/*---------------------------------------------------------------------------*/
1806void xsh_parameters_clipping_tilt_create(const char* recipe_id,
1807 cpl_parameterlist* list)
1808{
1809 /* check parameters */
1810 XSH_ASSURE_NOT_NULL( list);
1811
1812 /* Fill the parameter list */
1813 check( xsh_parameters_new_double( list, recipe_id,
1814 "tilt-clip-kappa",
1815 2.5,
1816 "Multiple of sigma in sigma clipping for evaluate tilt"));
1817 check( xsh_parameters_new_int( list, recipe_id,
1818 "tilt-clip-niter",
1819 5,
1820 "Number of iterations in sigma clipping for evaluate tilt"));
1821 check( xsh_parameters_new_double( list, recipe_id,
1822 "tilt-clip-frac",
1823 0.7,
1824 "Minimal fractions of points accepted / total in sigma clipping for evaluate tilt"));
1825
1826 cleanup:
1827 return;
1828}
1829/*---------------------------------------------------------------------------*/
1837/*---------------------------------------------------------------------------*/
1839 cpl_parameterlist* list)
1840{
1841 xsh_clipping_param* result = NULL;
1842
1843 /* check parameters */
1844 assure(list != NULL,CPL_ERROR_NULL_INPUT,"parameters list is NULL");
1845
1846 /* allocate the structure */
1847 check(result = (xsh_clipping_param*)(cpl_malloc(sizeof(xsh_clipping_param)))
1848 );
1849 assure (result != NULL, CPL_ERROR_ILLEGAL_OUTPUT,
1850 "Memory allocation failed!");
1851
1852 /* Fill the structure */
1853 check(result->sigma = xsh_parameters_get_double(list,recipe_id,
1854 "tilt-clip-kappa"));
1855 check(result->niter = xsh_parameters_get_int(list,recipe_id,
1856 "tilt-clip-niter"));
1857 check(result->frac = xsh_parameters_get_double(list,recipe_id,
1858 "tilt-clip-frac"));
1859
1860 cleanup:
1861 if(cpl_error_get_code() != CPL_ERROR_NONE){
1862 cpl_free(result);
1863 result = NULL;
1864 }
1865 return result;
1866}
1867
1876/*---------------------------------------------------------------------------*/
1878 cpl_parameterlist* list)
1879{
1880 /* check parameters */
1881 XSH_ASSURE_NOT_NULL( list);
1882
1883 /* Fill the parameter list */
1884 check( xsh_parameters_new_double( list, recipe_id,
1885 "specres-clip-kappa",
1886 2.5,
1887 "Multiple of sigma in sigma clipping for evaluate spectral resolution"));
1888 check( xsh_parameters_new_int( list, recipe_id,
1889 "specres-clip-niter",
1890 5,
1891 "Number of iterations in sigma clipping for evaluate spectral resolution"));
1892 check( xsh_parameters_new_double( list, recipe_id,
1893 "specres-clip-frac",
1894 0.7,
1895 "Minimal fractions of points accepted / total in sigma clipping for evaluate spectral resolution"));
1896
1897 cleanup:
1898 return;
1899}
1900/*---------------------------------------------------------------------------*/
1908/*---------------------------------------------------------------------------*/
1910 cpl_parameterlist* list)
1911{
1912 xsh_clipping_param* result = NULL;
1913
1914 /* check parameters */
1915 assure(list != NULL,CPL_ERROR_NULL_INPUT,"parameters list is NULL");
1916
1917 /* allocate the structure */
1918 check(result = (xsh_clipping_param*)(cpl_malloc(sizeof(xsh_clipping_param)))
1919 );
1920 assure (result != NULL, CPL_ERROR_ILLEGAL_OUTPUT,
1921 "Memory allocation failed!");
1922
1923 /* Fill the structure */
1924 check(result->sigma = xsh_parameters_get_double(list,recipe_id,
1925 "specres-clip-kappa"));
1926 check(result->niter = xsh_parameters_get_int(list,recipe_id,
1927 "specres-clip-niter"));
1928 check(result->frac = xsh_parameters_get_double(list,recipe_id,
1929 "specres-clip-frac"));
1930
1931 cleanup:
1932 if(cpl_error_get_code() != CPL_ERROR_NONE){
1933 cpl_free(result);
1934 result = NULL;
1935 }
1936 return result;
1937}
1938
1939
1940void xsh_parameters_wavecal_range_create(const char* recipe_id,
1941 cpl_parameterlist* list)
1942{
1943 /* check parameters */
1944 assure(list != NULL,CPL_ERROR_NULL_INPUT,"parameters list is NULL");
1945
1946 /* Fill the parameter list */
1947 /* --arclines_thresh */
1948 check(xsh_parameters_new_range_int( list, recipe_id,
1949 "followarclines-search-window-half-size",
1950 WAVECAL_RANGE_DEFAULT, 1, 4096,
1951 "Half window size (HWS) in pixels (Y axis) of search window for each line."
1952 ));
1953
1954 cleanup:
1955 return;
1956}
1957
1958int xsh_parameters_wavecal_range_get( const char* recipe_id,
1959 cpl_parameterlist* list)
1960{
1961 int result = 0;
1962
1963 assure(list != NULL,CPL_ERROR_NULL_INPUT,"parameters list is NULL");
1964
1965 check( result = xsh_parameters_get_int( list, recipe_id,
1966 "followarclines-search-window-half-size"));
1967
1968 cleanup:
1969 return result ;
1970}
1971
1972void xsh_parameters_wavecal_margin_create(const char* recipe_id,
1973 cpl_parameterlist* list)
1974{
1975 /* check parameters */
1976 assure(list != NULL,CPL_ERROR_NULL_INPUT,"parameters list is NULL");
1977
1978 /* Fill the parameter list */
1979 /* --arclines_thresh */
1980 check(xsh_parameters_new_range_int( list, recipe_id,
1981 "followarclines-order-edges-mask",
1983 "Nb of pixels suppressed (X) from edges of search window."
1984 "" ));
1985
1986 cleanup:
1987 return;
1988}
1989
1990int xsh_parameters_wavecal_margin_get( const char* recipe_id,
1991 cpl_parameterlist* list)
1992{
1993 int result = 0;
1994
1995 assure(list != NULL,CPL_ERROR_NULL_INPUT,"parameters list is NULL");
1996
1997 check( result = xsh_parameters_get_int( list, recipe_id,
1998 "followarclines-order-edges-mask"));
1999
2000 cleanup:
2001 return result ;
2002}
2003
2004void xsh_parameters_wavecal_s_n_create(const char* recipe_id,
2005 cpl_parameterlist* list)
2006{
2007 /* check parameters */
2008 assure(list != NULL,CPL_ERROR_NULL_INPUT,"parameters list is NULL");
2009
2010 /* Fill the parameter list */
2011 /* --arclines_thresh */
2012 check(xsh_parameters_new_double( list, recipe_id,
2013 "followarclines-min-sn",
2014 -1.,
2015 "Minimum Signal over Noise ratio at center to keep the line (6 for IFU, 15 for SLIT)."
2016 ));
2017
2018 cleanup:
2019 return;
2020}
2021
2022double xsh_parameters_wavecal_s_n_get( const char* recipe_id,
2023 cpl_parameterlist* list)
2024{
2025 int result = 0;
2026
2027 assure(list != NULL,CPL_ERROR_NULL_INPUT,"parameters list is NULL");
2028
2029 check( result = xsh_parameters_get_double( list, recipe_id,
2030 "followarclines-min-sn"));
2031
2032 cleanup:
2033 return result ;
2034}
2035
2036/*---------------------------------------------------------------------------*/
2037
2038void xsh_parameters_use_model_create( const char * recipe_id,
2039 cpl_parameterlist * plist )
2040{
2041 XSH_ASSURE_NOT_NULL( recipe_id ) ;
2042 XSH_ASSURE_NOT_NULL( plist ) ;
2043
2044 check( xsh_parameters_new_string( plist, recipe_id, "use-model", "no",
2045 "If 'no', use wavecal solution, otherwise use model. Default is 'no'" ) ) ;
2046 cleanup:
2047 return ;
2048}
2049
2050/*---------------------------------------------------------------------------*/
2051
2052int xsh_parameters_use_model_get( const char * recipe_id,
2053 const cpl_parameterlist * plist )
2054{
2055 char * yesno = NULL ;
2056
2057 XSH_ASSURE_NOT_NULL( recipe_id ) ;
2058 XSH_ASSURE_NOT_NULL( plist ) ;
2059
2060 yesno = xsh_parameters_get_string( plist, recipe_id, "use-model" ) ;
2061
2062 if ( strcmp( yesno, "yes" ) == 0 ) return 1 ;
2063 else return 0 ;
2064
2065 cleanup:
2066 return 0 ;
2067}
2068
2069/*---------------------------------------------------------------------------*/
2070/*
2071 xsh_remove_crh_single parameters
2072*/
2073void xsh_parameters_remove_crh_single_create( const char * recipe_id,
2074 cpl_parameterlist * plist,
2076{
2077 XSH_ASSURE_NOT_NULL( recipe_id ) ;
2078 XSH_ASSURE_NOT_NULL( plist ) ;
2079
2080 /*
2081 check(xsh_parameters_new_double(plist,recipe_id,
2082 "removecrhsingle-frac-max",
2083 p.crh_frac_max,
2084 "Max fraction of bad pixels allowed"));
2085 */
2086 check(xsh_parameters_new_double(plist,recipe_id,
2087 "removecrhsingle-sigmalim",
2088 p.sigma_lim,
2089 "Poisson fluctuation threshold to flag CRHs (see van Dokkum, PASP,113,2001,p1420-27)"));
2090 check(xsh_parameters_new_double(plist,recipe_id,
2091 "removecrhsingle-flim",
2092 p.f_lim,
2093 "Minimum contrast between the Laplacian image and the fine structure image that a point must have to be flagged as CRH. (see van Dokkum, PASP,113,2001,p1420-27)"));
2094 check(xsh_parameters_new_int(plist,recipe_id,
2095 "removecrhsingle-niter",
2096 p.nb_iter,
2097 "Max number of iterations. If value < 0 given, will use default value of 0 for NIR, and 4 for VIS and UVB."));
2098
2099 cleanup:
2100 return ;
2101}
2102
2104 const char* recipe_id,
2105 cpl_parameterlist* list)
2106{
2107 xsh_remove_crh_single_param * result = NULL ;
2108
2109 /* check parameters */
2110 XSH_ASSURE_NOT_NULL(list);
2111
2112 /* allocate the structure */
2114
2115
2116 /* Fill the structure */
2117 /*
2118 check(result->crh_frac_max = xsh_parameters_get_double(list,recipe_id,
2119 "removecrhsingle-frac-max"));
2120 */
2121 check(result->sigma_lim = xsh_parameters_get_double(list,recipe_id,
2122 "removecrhsingle-sigmalim"));
2123 check(result->f_lim = xsh_parameters_get_double(list,recipe_id,
2124 "removecrhsingle-flim"));
2125 check(result->nb_iter = xsh_parameters_get_int(list,recipe_id,
2126 "removecrhsingle-niter"));
2127//
2128
2129 cleanup:
2130 if(cpl_error_get_code() != CPL_ERROR_NONE){
2131 cpl_free(result);
2132 result = NULL;
2133 }
2134 return result;
2135
2136}
2137
2138/*---------------------------------------------------------------------------*/
2139/*
2140 xsh_rectify parameters
2141*/
2142typedef struct {
2143 const char * name ;
2144 int type ;
2146
2148 {"tanh", CPL_KERNEL_TANH},
2149 {"sinc", CPL_KERNEL_SINC},
2150 {"sinc2", CPL_KERNEL_SINC2},
2151 {"lanczos", CPL_KERNEL_LANCZOS},
2152 {"hamming", CPL_KERNEL_HAMMING},
2153 {"hann", CPL_KERNEL_HANN},
2154 {NULL, 0}
2155} ;
2156
2158{
2159 const XSH_KERNEL_TYPE * pk = xsh_ker_type ;
2160
2161 for( ; pk->name != NULL ; pk++ )
2162 if ( strcasecmp( recpar->rectif_kernel, pk->name ) == 0 ) {
2163 recpar->kernel_type = pk->type ;
2164 return ;
2165 }
2166 recpar->kernel_type = CPL_KERNEL_DEFAULT ;
2167
2168 return ;
2169}
2170/*
2171static const char * get_ker_default( void )
2172{
2173 const XSH_KERNEL_TYPE * pk = xsh_ker_type ;
2174
2175 for( ; pk->name != NULL ; pk++ )
2176 if ( pk->type == CPL_KERNEL_DEFAULT ) {
2177 return pk->name ;
2178 }
2179 return "unknown" ;
2180
2181}
2182*/
2183
2184void xsh_parameters_rectify_create( const char * recipe_id,
2185 cpl_parameterlist * plist,
2187{
2188 char ker_comment[256];
2189
2190 XSH_ASSURE_NOT_NULL( recipe_id ) ;
2191 XSH_ASSURE_NOT_NULL( plist ) ;
2192
2193 sprintf( ker_comment,
2194 "Name of the Interpolation Kernel Used. Possible values are: "\
2195 " tanh, sinc, sinc2, lanczos, hamming, hann.");
2196
2197 check(xsh_parameters_new_string(plist,recipe_id,
2198 "rectify-kernel",
2199 p.rectif_kernel, ker_comment));
2200
2201 check(xsh_parameters_new_range_double( plist, recipe_id,
2202 "rectify-radius",
2203 p.rectif_radius, 0., 100.,
2204 "Rectify Interpolation radius [bin units]."
2205 "" ));
2206
2207 check(xsh_parameters_new_double(plist,recipe_id,
2208 "rectify-bin-lambda",
2210 "Wavelength step in the output spectrum [nm]"));
2211
2212 check(xsh_parameters_new_double(plist,recipe_id,
2213 "rectify-bin-slit",
2215 "Spatial step along the slit in the output spectrum [arcsec]"));
2216 /*
2217 check( xsh_parameters_new_boolean( plist, recipe_id,
2218 "rectify-full-slit",
2219 p.rectify_full_slit,
2220 "Use full slit if TRUE"));
2221
2222 check( xsh_parameters_new_boolean( plist, recipe_id,
2223 "rectify-conserve-flux", p.conserve_flux,
2224 "Use flux conservation if TRUE"));
2225 */
2226/*
2227 check( xsh_parameters_new_boolean( plist, recipe_id,
2228 "rectify-fast", TRUE,
2229 "Fast if TRUE (Rect[B-A] = -Rect[A-B])"));
2230
2231
2232 check(xsh_parameters_new_double(plist,recipe_id,
2233 "rectify-slit-offset",
2234 p.slit_offset,
2235 "Rectify Slit Offset"));
2236*/
2237
2238/*check( xsh_parameters_new_int( plist, recipe_id,
2239 "rectify-cut-edges", p.conserve_flux,
2240 "Cut edges in rectify bin pixel [pix]"));
2241*/
2242 cleanup:
2243 return ;
2244}
2245
2246int xsh_parameters_rectify_fast_get( const char* recipe_id,
2247 cpl_parameterlist* list)
2248{
2249 int result = 0 ;
2250
2251 /* check parameters */
2252 assure(list != NULL,CPL_ERROR_NULL_INPUT,"parameters list is NULL");
2253
2254 check( result = xsh_parameters_get_boolean( list,
2255 recipe_id, "rectify-fast"));
2256
2257 cleanup:
2258 return result ;
2259}
2260
2262 cpl_parameterlist* list)
2263{
2264 xsh_rectify_param * result = NULL ;
2265 char *p ;
2266
2267 /* check parameters */
2268 assure(list != NULL,CPL_ERROR_NULL_INPUT,"parameters list is NULL");
2269
2270 /* allocate the structure */
2271 check(result = (xsh_rectify_param *)(cpl_malloc(
2272 sizeof(xsh_rectify_param))) );
2273 assure (result != NULL, CPL_ERROR_ILLEGAL_OUTPUT,
2274 "Memory allocation failed!");
2275
2276 /* Fill the structure */
2277 check(p = xsh_parameters_get_string(list,recipe_id,
2278 "rectify-kernel"));
2279 strcpy( result->rectif_kernel, p ) ;
2280 check(result->rectif_radius = xsh_parameters_get_double(list,recipe_id,
2281 "rectify-radius"));
2282 check(result->rectif_bin_lambda = xsh_parameters_get_double(list,recipe_id,
2283 "rectify-bin-lambda"));
2284 check(result->rectif_bin_space = xsh_parameters_get_double(list,recipe_id,
2285 "rectify-bin-slit"));
2286 /*
2287 check( result->rectify_full_slit = xsh_parameters_get_boolean( list,
2288 recipe_id,
2289 "rectify-full-slit")) ;
2290 */
2291 result->rectify_full_slit=true;
2292/*
2293
2294 check( result->conserve_flux = xsh_parameters_get_boolean( list,
2295 recipe_id, "rectify-conserve-flux"));
2296 check(result->slit_offset = xsh_parameters_get_double(list,recipe_id,
2297 "rectify-slit-offset"));
2298*/
2299/* check( result->cut_edges = xsh_parameters_get_int( list,
2300 recipe_id, "rectify-cut-edges"));
2301*/
2302 /* Set the kernel type in CPL_KERNEL_XXXXX format */
2303 set_rectify_kernel_type( result ) ;
2304
2305 cleanup:
2306 if(cpl_error_get_code() != CPL_ERROR_NONE){
2307 cpl_free(result);
2308 result = NULL;
2309 }
2310 return result;
2311}
2312
2313void
2315 cpl_parameterlist * plist,
2317{
2318 /* check parameters */
2319 assure(plist != NULL,CPL_ERROR_NULL_INPUT,"parameters list is NULL");
2320
2321 check(xsh_parameters_new_double(plist,recipe_id,
2322 "compute-response-lambda-step",
2323 p.lambda_bin,
2324 "Compute Response Interpolation Lambda Step"));
2325
2326 cleanup:
2327 return ;
2328}
2329
2332 cpl_parameterlist * list)
2333{
2334 xsh_compute_response_param * result = NULL ;
2335
2336 assure(list != NULL,CPL_ERROR_NULL_INPUT,"parameters list is NULL");
2337
2338 /* allocate the structure */
2339 check(result = (xsh_compute_response_param *)(cpl_malloc(
2340 sizeof(xsh_compute_response_param))) );
2341 assure (result != NULL, CPL_ERROR_ILLEGAL_OUTPUT,
2342 "Memory allocation failed!");
2343
2344 /* Fill the structure */
2345 check(result->lambda_bin =
2346 xsh_parameters_get_double(list,recipe_id,
2347 "compute-response-lambda-step"));
2348
2349 cleanup:
2350 if(cpl_error_get_code() != CPL_ERROR_NONE){
2351 cpl_free(result);
2352 result = NULL;
2353 }
2354 return result;
2355
2356}
2357/*---------------------------------------------------------------------------*/
2358/*
2359 xsh_localize_obj parameters
2360*/
2361void xsh_parameters_localize_obj_create( const char * recipe_id,
2362 cpl_parameterlist * plist, xsh_localize_obj_param p)
2363{
2364 XSH_ASSURE_NOT_NULL( recipe_id);
2365 XSH_ASSURE_NOT_NULL( plist);
2366
2367 check( xsh_parameters_new_string( plist, recipe_id,
2368 "localize-method",
2370 "Localization method (MANUAL, MAXIMUM, GAUSSIAN) used to detect "\
2371 "the object centroid and height on the slit"));
2372
2373 check( xsh_parameters_new_int( plist, recipe_id,
2374 "localize-chunk-nb",
2375 p.loc_chunk_nb,
2376 "Number of chunks in the full spectrum to localize the object"));
2377 check( xsh_parameters_new_double( plist, recipe_id,
2378 "localize-thresh",
2379 p.loc_thresh,
2380 "Threshold relative to the peak intensity below which the edges "\
2381 "of the object are detected for MAXIMUM localization"));
2382 check( xsh_parameters_new_int( plist, recipe_id,
2383 "localize-deg-lambda",
2384 p.loc_deg_poly,
2385 "Degree in lambda in the localization polynomial expression "\
2386 "slit=f(lambda), used only for MAXIMUM and GAUSSIAN"));
2387
2388 if (strcmp(recipe_id,"xsh_scired_slit_nod")==0){
2389 check( xsh_parameters_new_double( plist, recipe_id,
2390 "localize-slit-position",
2391 p.slit_position,
2392 "Object position on the slit for MANUAL localization [arcsec]. It refers to the object position in the first frame of the nodding sequence"));
2393 }
2394 else {
2395 check( xsh_parameters_new_double( plist, recipe_id,
2396 "localize-slit-position",
2397 p.slit_position,
2398 "Object position on the slit for MANUAL localization [arcsec]"));
2399 }
2400 check( xsh_parameters_new_double( plist, recipe_id,
2401 "localize-slit-hheight",
2402 p.slit_hheight,
2403 "Object half height on the slit for MANUAL localization [arcsec]"));
2404 check( xsh_parameters_new_double( plist, recipe_id,
2405 "localize-kappa",
2406 p.kappa,
2407 "Kappa value for sigma clipping in the localization "\
2408 "polynomial fit"));
2409 check( xsh_parameters_new_int( plist, recipe_id,
2410 "localize-niter",
2411 p.niter,
2412 "Number of iterations for sigma clipping in the localization "\
2413 "polynomial fit"));
2414
2415 check(xsh_parameters_new_boolean( plist, recipe_id,
2416 "localize-use-skymask", p.use_skymask,
2417 "TRUE if we want to mask sky lines using SKY_LINE_LIST file."));
2418
2419 cleanup:
2420 return ;
2421}
2422
2424 const char* recipe_id, cpl_parameterlist* list)
2425{
2426 xsh_localize_obj_param * result = NULL ;
2427 const char* par_method = NULL;
2428
2429 /* check parameters */
2430 XSH_ASSURE_NOT_NULL(list);
2431
2432 /* allocate the structure */
2434
2435 /* Fill the structure */
2436 check( result->loc_chunk_nb = xsh_parameters_get_int( list,recipe_id,
2437 "localize-chunk-nb"));
2438 check( result->loc_thresh = xsh_parameters_get_double( list,recipe_id,
2439 "localize-thresh"));
2440 check( result->loc_deg_poly = xsh_parameters_get_int( list,recipe_id,
2441 "localize-deg-lambda"));
2442 check( par_method = xsh_parameters_get_string( list, recipe_id,
2443 "localize-method"));
2444 if ( strcmp( LOCALIZE_METHOD_PRINT(LOC_MANUAL_METHOD), par_method) == 0){
2445 result->method = LOC_MANUAL_METHOD;
2446 }
2447 else if (strcmp( LOCALIZE_METHOD_PRINT(LOC_MAXIMUM_METHOD), par_method) == 0){
2448 result->method = LOC_MAXIMUM_METHOD;
2449 }
2450 else if (strcmp( LOCALIZE_METHOD_PRINT(LOC_GAUSSIAN_METHOD), par_method) == 0){
2451 result->method = LOC_GAUSSIAN_METHOD;
2452 }
2453 else {
2454 xsh_error_msg("WRONG parameter localize-method %s",par_method);
2455 }
2456 check( result->slit_position = xsh_parameters_get_double( list, recipe_id,
2457 "localize-slit-position"));
2458 check( result->slit_hheight = xsh_parameters_get_double( list, recipe_id,
2459 "localize-slit-hheight"));
2460 check( result->kappa = xsh_parameters_get_double( list, recipe_id,
2461 "localize-kappa"));
2462 check( result->niter = xsh_parameters_get_int( list, recipe_id,
2463 "localize-niter"));
2464 check( result->use_skymask = xsh_parameters_get_boolean( list, recipe_id,
2465 "localize-use-skymask"));
2466
2467 cleanup:
2468 if(cpl_error_get_code() != CPL_ERROR_NONE){
2469 XSH_FREE( result);
2470 }
2471 return result;
2472
2473}
2474
2475/*---------------------------------------------------------------------------*/
2476/*
2477 xsh_localize_ifu parameters
2478*/
2479void xsh_parameters_localize_ifu_create( const char * recipe_id,
2480 cpl_parameterlist * plist, xsh_localize_ifu_param p)
2481{
2482 XSH_ASSURE_NOT_NULL( recipe_id);
2483 XSH_ASSURE_NOT_NULL( plist);
2484
2485 check( xsh_parameters_new_int( plist, recipe_id,
2486 "localizeifu-bckg-deg",
2487 p.bckg_deg,
2488 "Degree (<=2) of the polynomial component in the cross-dispersion profile fit"));
2489
2490 check( xsh_parameters_new_int( plist, recipe_id,
2491 "localizeifu-smooth-hsize",
2492 p.smooth_hsize,
2493 "Half-size of the median filter for smoothing the cross-dispersion profile prior to localization"));
2494
2495 check( xsh_parameters_new_int( plist, recipe_id,
2496 "localizeifu-wavelet-nscales",
2497 p.nscales,
2498 "Number of scales used for wavelet a trous algorithm"));
2499
2500 check( xsh_parameters_new_int( plist, recipe_id,
2501 "localizeifu-wavelet-hf-skip",
2502 p.HF_skip,
2503 "Number of high frequency scales skipped from the wavelet decomposition"));
2504
2505 check( xsh_parameters_new_double( plist, recipe_id,
2506 "localizeifu-sigma-low",
2507 p.cut_sigma_low,
2508 "Gaussian fits of the cross-dispersion profile whose FWHM is lower than this value are rejected"));
2509
2510 check( xsh_parameters_new_double( plist, recipe_id,
2511 "localizeifu-sigma-up",
2512 p.cut_sigma_up,
2513 "Gaussian fits of the cross-dispersion profile whose FWHM is larger than this value are rejected"));
2514
2515 check( xsh_parameters_new_double( plist, recipe_id,
2516 "localizeifu-snr-low",
2517 p.cut_snr_low,
2518 "Gaussian fits of the cross-dispersion profile whose SNR is lower than this value are rejected"));
2519
2520 check( xsh_parameters_new_double( plist, recipe_id,
2521 "localizeifu-snr-up",
2522 p.cut_snr_up,
2523 "Gaussian fits of the cross-dispersion profile whose SNR is larger than this value are rejected"));
2524
2525 check( xsh_parameters_new_double( plist, recipe_id,
2526 "localizeifu-slitlow-edges-mask",
2528 "in arsec"));
2529
2530 check( xsh_parameters_new_double( plist, recipe_id,
2531 "localizeifu-slitup-edges-mask",
2533 "in arsec"));
2534
2535 check(xsh_parameters_new_boolean( plist, recipe_id,
2536 "localizeifu-use-skymask", p.use_skymask,
2537 "TRUE if we want to mask sky lines using SKY_LINE_LIST file."));
2538
2539 check(xsh_parameters_new_int( plist, recipe_id,
2540 "localizeifu-chunk-hsize", p.box_hsize,
2541 "Half size of chunk [bin]"));
2542
2543 cleanup:
2544 return;
2545}
2547 const char* recipe_id, cpl_parameterlist* list)
2548{
2549 xsh_localize_ifu_param *result = NULL ;
2550
2551 /* check parameters */
2552 XSH_ASSURE_NOT_NULL(list);
2553
2554 /* allocate the structure */
2556
2557 check( result->bckg_deg = xsh_parameters_get_int( list, recipe_id,
2558 "localizeifu-bckg-deg"));
2559 check( result->smooth_hsize = xsh_parameters_get_int( list, recipe_id,
2560 "localizeifu-smooth-hsize"));
2561
2562 check( result->nscales = xsh_parameters_get_int( list, recipe_id,
2563 "localizeifu-wavelet-nscales"));
2564
2565 check( result->HF_skip = xsh_parameters_get_int( list, recipe_id,
2566 "localizeifu-wavelet-hf-skip"));
2567
2568 check( result->cut_sigma_low = xsh_parameters_get_double( list, recipe_id,
2569 "localizeifu-sigma-low"));
2570 check( result->cut_sigma_up = xsh_parameters_get_double( list, recipe_id,
2571 "localizeifu-sigma-up"));
2572
2573 check( result->cut_snr_low = xsh_parameters_get_double( list, recipe_id,
2574 "localizeifu-snr-low"));
2575 check( result->cut_snr_up = xsh_parameters_get_double( list, recipe_id,
2576 "localizeifu-snr-up"));
2577
2578 check( result->slitlow_edges_mask = xsh_parameters_get_double( list, recipe_id,
2579 "localizeifu-slitlow-edges-mask"));
2580 check( result->slitup_edges_mask = xsh_parameters_get_double( list, recipe_id,
2581 "localizeifu-slitup-edges-mask"));
2582
2583 check( result->use_skymask = xsh_parameters_get_boolean( list, recipe_id,
2584 "localizeifu-use-skymask"));
2585
2586 check( result->box_hsize = xsh_parameters_get_int( list, recipe_id,
2587 "localizeifu-chunk-hsize"));
2588
2589 cleanup:
2590 if(cpl_error_get_code() != CPL_ERROR_NONE){
2591 XSH_FREE( result);
2592 }
2593 return result;
2594}
2595/*---------------------------------------------------------------------------*/
2596
2597/*---------------------------------------------------------------------------*/
2598/*
2599 * xsh_extract parameters
2600*/
2601
2602void xsh_parameters_extract_create( const char * recipe_id,
2603 cpl_parameterlist * plist,
2606{
2607 XSH_ASSURE_NOT_NULL( recipe_id);
2608 XSH_ASSURE_NOT_NULL( plist);
2609
2610 check( xsh_parameters_new_string( plist, recipe_id,
2611 "extract-method", EXTRACT_METHOD_PRINT(method),
2612 "Method used for extraction (LOCALIZATION, NOD)"));
2613
2614 cleanup:
2615 return ;
2616}
2617
2618void xsh_parameters_interpolate_bp_create( const char * recipe_id,
2619 cpl_parameterlist * plist,
2621{
2622 XSH_ASSURE_NOT_NULL( recipe_id);
2623 XSH_ASSURE_NOT_NULL( plist);
2624
2625 check( xsh_parameters_new_int( plist, recipe_id,
2626 "stdextract-interp-hsize",
2627 p.mask_hsize,
2628 "Half size of mask used to define object cross order profile"));
2629
2630 cleanup:
2631 return ;
2632}
2633
2635 const char* recipe_id, cpl_parameterlist* list)
2636{
2637 xsh_extract_param *result = NULL ;
2638 const char *par_method = NULL;
2639
2640 /* check parameters */
2641 XSH_ASSURE_NOT_NULL( recipe_id);
2642 XSH_ASSURE_NOT_NULL( list);
2643
2644 /* allocate the structure */
2645 XSH_MALLOC( result, xsh_extract_param, 1);
2646
2647 /* Fill the structure */
2648 if(strstr(recipe_id,"offset")!= NULL) {
2649 result->method = LOCALIZATION_METHOD;
2650 } else {
2651 check( par_method = xsh_parameters_get_string( list, recipe_id,
2652 "extract-method"));
2653 if ( strcmp( EXTRACT_METHOD_PRINT(LOCALIZATION_METHOD), par_method) == 0){
2654 result->method = LOCALIZATION_METHOD;
2655 }
2656 else if (strcmp( EXTRACT_METHOD_PRINT(FULL_METHOD), par_method) == 0){
2657 result->method = FULL_METHOD;
2658 }
2659 else if (strcmp( EXTRACT_METHOD_PRINT(NOD_METHOD), par_method) == 0){
2660 result->method = NOD_METHOD;
2661 }
2662 else if (strcmp( EXTRACT_METHOD_PRINT(CLEAN_METHOD), par_method) == 0){
2663 result->method = CLEAN_METHOD;
2664 }
2665 else {
2666 xsh_error_msg("WRONG parameter extract-method %s",par_method);
2668 }
2669 }
2670 cleanup:
2671 if(cpl_error_get_code() != CPL_ERROR_NONE){
2672 cpl_free(result);
2673 result = NULL;
2674 }
2675 return result;
2676}
2677
2679 const char* recipe_id, cpl_parameterlist* list)
2680{
2681 xsh_interpolate_bp_param *result = NULL ;
2682
2683 /* check parameters */
2684 XSH_ASSURE_NOT_NULL( recipe_id);
2685 XSH_ASSURE_NOT_NULL( list);
2686
2687 /* allocate the structure */
2689
2690 /* Fill the structure */
2691
2692 check( result->mask_hsize = xsh_parameters_get_int( list, recipe_id,
2693 "stdextract-interp-hsize"));
2694
2695 cleanup:
2696 if(cpl_error_get_code() != CPL_ERROR_NONE){
2697 cpl_free(result);
2698 result = NULL;
2699 }
2700 return result;
2701}
2702
2703/*---------------------------------------------------------------------------*/
2704/*
2705 xsh_remove_sky_single parameters
2706*/
2708 cpl_parameterlist * plist,
2710{
2711 XSH_ASSURE_NOT_NULL( recipe_id);
2712 XSH_ASSURE_NOT_NULL( plist);
2713
2714 check(xsh_parameters_new_boolean( plist, recipe_id,
2715 "sky-subtract", TRUE,
2716 "TRUE to use subtract sky single."));
2717
2718 check( xsh_parameters_new_int( plist, recipe_id,
2719 "sky-bspline-nbkpts-first",
2720 p.nbkpts1,
2721 "Nb of break points for Bezier curve fitting (without localization)"));
2722 check( xsh_parameters_new_int( plist,recipe_id,
2723 "sky-bspline-nbkpts-second",
2724 p.nbkpts2,
2725 "Nb of break points for Bezier curve fitting (with localization)"));
2726
2727 check( xsh_parameters_new_int( plist, recipe_id,
2728 "sky-bspline-order",
2730 "Bezier spline order"));
2731
2732 check( xsh_parameters_new_int( plist, recipe_id,
2733 "sky-bspline-niter",
2734 p.niter,
2735 "Nb of iterations"));
2736
2737 check( xsh_parameters_new_double( plist, recipe_id,
2738 "sky-bspline-kappa",
2739 p.kappa,
2740 "Kappa value used to kappa-sigma-clip object"));
2741
2742 check( xsh_parameters_new_string( plist, recipe_id,
2743 "sky-method",
2744 SKY_METHOD_PRINT(p.method), "Sky subtract Method (BSPLINE, BSPLINE1, BSPLINE2 MEDIAN). BSPLINE is equivalent to BSPLINE1"));
2745
2746 check( xsh_parameters_new_string( plist, recipe_id,
2747 "bspline-sampling",
2748 BSPLINE_SAMPLING_PRINT(p.bspline_sampling), "BSPLINE sampling. UNIFORM-uses the user defined nbkpts value, corrected for binning, for all orders. FINE: multiplies the user defined nbkpts value, corrected for binning, by a hard coded coefficient optimized on each arm-order)"));
2749
2750 check(xsh_parameters_new_range_int( plist, recipe_id,
2751 "sky-median-hsize",
2752 p.median_hsize, 0, 2000,
2753 "Half size of the running median. If sky-method=MEDIAN ."
2754 ));
2755
2756
2757 check( xsh_parameters_new_double( plist, recipe_id,
2758 "sky-slit-edges-mask",
2760 "Size of edges mask in arcsec"));
2761
2762 check( xsh_parameters_new_double( plist, recipe_id,
2763 "sky-position1",
2764 p.pos1,
2765 "Central position of the sky window #1 [arcsec]"));
2766
2767 check( xsh_parameters_new_double( plist, recipe_id,
2768 "sky-hheight1",
2769 p.hheight1,
2770 "Half size of sky window #1 [arcsec]"));
2771
2772 check( xsh_parameters_new_double( plist, recipe_id,
2773 "sky-position2",
2774 p.pos2,
2775 "Central position of the sky window #2 [arcsec]"));
2776
2777 check( xsh_parameters_new_double( plist, recipe_id,
2778 "sky-hheight2",
2779 p.hheight2,
2780 "Half size of the sky window #2 [arcsec]"));
2781
2782 cleanup:
2783 return ;
2784}
2785
2787 const char* recipe_id, cpl_parameterlist* list)
2788{
2789 xsh_subtract_sky_single_param *result = NULL ;
2790 const char* par_method = NULL;
2791 const char* bspline_sampling = NULL;
2792
2793 /* check parameters */
2794 XSH_ASSURE_NOT_NULL( recipe_id);
2795 XSH_ASSURE_NOT_NULL( list);
2796
2797 /* allocate the structure */
2799
2800 /* Fill the structure */
2801 check( result->nbkpts1 = xsh_parameters_get_int( list, recipe_id,
2802 "sky-bspline-nbkpts-first"));
2803 check( result->nbkpts2 = xsh_parameters_get_int( list, recipe_id,
2804 "sky-bspline-nbkpts-second"));
2805 check( result->bezier_spline_order = xsh_parameters_get_int( list, recipe_id,
2806 "sky-bspline-order"));
2807 check( result->niter = xsh_parameters_get_int( list, recipe_id,
2808 "sky-bspline-niter"));
2809 check( result->kappa = xsh_parameters_get_double( list, recipe_id,
2810 "sky-bspline-kappa"));
2811
2812
2814 recipe_id,
2815 "sky-method")
2816 ));
2817
2818
2819 if ( strcmp( SKY_METHOD_PRINT(BSPLINE_METHOD), par_method) == 0){
2820 result->method = BSPLINE_METHOD;
2821 }
2822 else if (strcmp( SKY_METHOD_PRINT(BSPLINE_METHOD1), par_method) == 0){
2823 result->method = BSPLINE_METHOD1;
2824 }
2825 else if (strcmp( SKY_METHOD_PRINT(BSPLINE_METHOD2), par_method) == 0){
2826 result->method = BSPLINE_METHOD2;
2827 }
2828 else if (strcmp( SKY_METHOD_PRINT(BSPLINE_METHOD3), par_method) == 0){
2829 result->method = BSPLINE_METHOD3;
2830 }
2831 else if (strcmp( SKY_METHOD_PRINT(BSPLINE_METHOD4), par_method) == 0){
2832 result->method = BSPLINE_METHOD4;
2833 }
2834 else if (strcmp( SKY_METHOD_PRINT(BSPLINE_METHOD5), par_method) == 0){
2835 result->method = BSPLINE_METHOD5;
2836 }
2837 else if (strcmp( SKY_METHOD_PRINT(MEDIAN_METHOD), par_method) == 0){
2838 result->method = MEDIAN_METHOD;
2839 }
2840 else {
2841 xsh_error_msg("WRONG parameter sky_method %s",par_method);
2842 }
2843
2845 "bspline-sampling"));
2846 if ( strcmp( BSPLINE_SAMPLING_PRINT(UNIFORM), bspline_sampling) == 0){
2848 }
2849 else if (strcmp( BSPLINE_SAMPLING_PRINT(FINE), bspline_sampling) == 0){
2850 result->bspline_sampling = FINE;
2851 }
2852 else {
2853 xsh_error_msg("WRONG parameter bspline-sampling %s",bspline_sampling);
2854 }
2855
2856
2857
2858 check( result->median_hsize = xsh_parameters_get_int( list, recipe_id,
2859 "sky-median-hsize"));
2861 recipe_id,
2862 "sky-slit-edges-mask"));
2863
2864 check( result->pos1 = xsh_parameters_get_double( list,
2865 recipe_id,
2866 "sky-position1"));
2867 check( result->hheight1 = xsh_parameters_get_double( list,
2868 recipe_id,
2869 "sky-hheight1"));
2870 check( result->pos2 = xsh_parameters_get_double( list,
2871 recipe_id,
2872 "sky-position2"));
2873 check( result->hheight2 = xsh_parameters_get_double( list,
2874 recipe_id,
2875 "sky-hheight2"));
2876
2877 cleanup:
2878 if(cpl_error_get_code() != CPL_ERROR_NONE){
2879 cpl_free(result);
2880 result = NULL;
2881 }
2882 return result;
2883}
2884
2886 cpl_parameterlist* list)
2887{
2888 bool result = FALSE;
2889
2890 check( result = xsh_parameters_get_boolean( list, recipe_id,
2891 "sky-subtract"));
2892
2893 cleanup:
2894 return result ;
2895}
2896
2897
2898void xsh_parameters_dosky_domap_get( const char *recipe_id,
2899 cpl_parameterlist *list,
2900 cpl_frame* wavemap_frame,
2901 cpl_frame* slitmap_frame,
2902 int *dosky, int *domap)
2903{
2904 bool sub_sky=FALSE;
2905 bool computemap=FALSE;
2906
2907 XSH_ASSURE_NOT_NULL( dosky);
2908 XSH_ASSURE_NOT_NULL( domap);
2909
2911 list));
2912 check( computemap = xsh_parameters_get_boolean( list, recipe_id,
2913 "compute-map"));
2914
2915/* This check is made more robust as it may be useful for debugging purpose
2916 to switch off the wavemap generation if the wavemaps and slit maps are
2917 provided in input-assuming the user have provided proper values).
2918*/
2919 if ( (sub_sky && !computemap) &&
2920 (wavemap_frame == NULL || slitmap_frame == NULL)
2921 ){
2922 xsh_msg_warning( "Parameters sky-subtract and compute-map are not compatible, compute-map has been forced to TRUE");
2923 computemap = TRUE;
2924 }
2925
2926 *dosky = sub_sky;
2927 *domap = computemap;
2928
2929 cleanup:
2930 return;
2931}
2932
2933
2935 cpl_parameterlist* list)
2936{
2937 int result = 0 ;
2938
2939 /* check parameters */
2940 assure(list != NULL,CPL_ERROR_NULL_INPUT,"parameters list is NULL");
2941
2942 /* Fill the structure */
2943 check(result = xsh_parameters_get_int( list, recipe_id,
2944 "sky-bspline-nbkpts-first"));
2945
2946 cleanup:
2947 return result;
2948
2949}
2950
2952 cpl_parameterlist* list)
2953{
2954 int result = 0 ;
2955
2956 /* check parameters */
2957 XSH_ASSURE_NOT_NULL( list);
2958
2959 /* Fill the structure */
2960 check(result = xsh_parameters_get_int( list, recipe_id,
2961 "sky-bspline-nbkpts-second"));
2962
2963 cleanup:
2964 return result;
2965}
2966
2967
2969 cpl_parameterlist* list)
2970{
2971 int result = 0 ;
2972
2973 /* check parameters */
2974 XSH_ASSURE_NOT_NULL( list);
2975
2976 /* Fill the structure */
2977 check(result = xsh_parameters_get_int( list, recipe_id,
2978 "sky-bspline-niter"));
2979
2980 cleanup:
2981 return result;
2982}
2983
2984
2985
2987 cpl_parameterlist* list)
2988{
2989 double result = 0 ;
2990
2991 /* check parameters */
2992 XSH_ASSURE_NOT_NULL( list);
2993
2994 /* Fill the structure */
2995 check(result = xsh_parameters_get_double( list, recipe_id,
2996 "sky-bspline-kappa"));
2997
2998 cleanup:
2999 return result;
3000}
3001
3002/*---------------------------------------------------------------------------*/
3003/*
3004 xsh_merge_ord parameter
3005*/
3006void xsh_parameters_merge_ord_create( const char * recipe_id,
3007 cpl_parameterlist * plist,
3008 int p )
3009{
3010 /* check parameters */
3011 XSH_ASSURE_NOT_NULL( recipe_id);
3012 XSH_ASSURE_NOT_NULL( plist);
3013
3014 check(xsh_parameters_new_int( plist, recipe_id, "mergeord-method",
3015 p, "Method for combining overlapping orders "\
3016 "(0 = WEIGHTED with the errors, 1 = MEAN)"));
3017
3018 cleanup:
3019 return;
3020}
3021
3023 cpl_parameterlist* list)
3024{
3025 xsh_merge_param *result = NULL;
3026
3027 /* check parameters */
3028 XSH_ASSURE_NOT_NULL( recipe_id);
3029 XSH_ASSURE_NOT_NULL( list);
3030
3031 /* allocate the structure */
3032 XSH_MALLOC( result, xsh_merge_param, 1);
3033
3034 /* Fill the structure */
3035 check( result->method = xsh_parameters_get_int( list, recipe_id,
3036 "mergeord-method"));
3037
3038 cleanup:
3039 if(cpl_error_get_code() != CPL_ERROR_NONE){
3040 XSH_FREE( result);
3041 }
3042 return result;
3043}
3044
3045/*---------------------------------------------------------------------------*/
3046/*
3047 xsh_optimal_extract parameter
3048*/
3049void xsh_parameters_optimal_extract_create( const char * recipe_id,
3050 cpl_parameterlist * plist,
3051 int p )
3052{
3053 XSH_ASSURE_NOT_NULL( recipe_id ) ;
3054 XSH_ASSURE_NOT_NULL( plist ) ;
3055
3056 check(xsh_parameters_new_double(plist,recipe_id,
3057 "optimal_extract_kappa",
3058 p,
3059 "Pixels with values > kappa*RMS are ignored. If negative no rejection."));
3060
3061 cleanup:
3062 return ;
3063}
3064
3065double xsh_parameters_optimal_extract_get_kappa( const char* recipe_id,
3066 cpl_parameterlist* list)
3067{
3068 double result = 0 ;
3069
3070 /* check parameters */
3071 assure(list != NULL,CPL_ERROR_NULL_INPUT,"parameters list is NULL");
3072
3073 /* Fill the structure */
3074 check(result = xsh_parameters_get_double(list,recipe_id,
3075 "optimal_extract_kappa"));
3076
3077 cleanup:
3078 return result;
3079
3080}
3081
3082/*---------------------------------------------------------------------------*/
3093/*---------------------------------------------------------------------------*/
3094void xsh_parameters_dispersol_create(const char* recipe_id,
3095 cpl_parameterlist* list, xsh_dispersol_param p)
3096{
3097 /* check parameters */
3098 XSH_ASSURE_NOT_NULL(list);
3099
3100 /* Fill the parameter list */
3101 /* --wavemap_x_degree */
3102 check(xsh_parameters_new_int(list,recipe_id,"dispersol-deg-x",
3103 p.deg_x, "Degree in X in the polynomial dispersion solution "\
3104 "lambda=f(X,Y) and slit=f(X,Y)"));
3105 /* --wavemap_y_degree */
3106 check(xsh_parameters_new_int(list,recipe_id,"dispersol-deg-y",
3107 p.deg_y, "Degree in Y in the polynomial dispersion solution "\
3108 "lambda=f(X,Y) and slit=f(X,Y)"));
3109
3110 cleanup:
3111 return;
3112}
3113/*---------------------------------------------------------------------------*/
3114
3115/*---------------------------------------------------------------------------*/
3126/*---------------------------------------------------------------------------*/
3128 cpl_parameterlist* list)
3129{
3130 xsh_dispersol_param* result = NULL;
3131
3132 /* check parameters */
3133 XSH_ASSURE_NOT_NULL(list);
3134
3135 /* allocate the structure */
3136 XSH_MALLOC(result, xsh_dispersol_param, 1);
3137
3138 /* Fill the structure */
3139 check(result->deg_x = xsh_parameters_get_int(list, recipe_id,
3140 "dispersol-deg-x"));
3141 check(result->deg_y = xsh_parameters_get_int(list, recipe_id,
3142 "dispersol-deg-y"));
3143
3144 cleanup:
3145 if(cpl_error_get_code() != CPL_ERROR_NONE){
3146 XSH_FREE(result);
3147 }
3148 return result;
3149}
3150/*---------------------------------------------------------------------------*/
3151
3159/*---------------------------------------------------------------------------*/
3160void xsh_parameters_combine_nod_create(const char * recipe_id,
3161 cpl_parameterlist * list,
3163{
3164 /* check parameters */
3165 assure(list != NULL,CPL_ERROR_NULL_INPUT,"parameters list is NULL");
3166
3167 /* Fill the parameter list */
3168 if (strstr(recipe_id, "nod") != NULL) {
3169 /*
3170 check(
3171 xsh_parameters_new_int(list,recipe_id,"combinenod-min", p.nod_min, "minimum NS size of resulting frame in pixels"));
3172 check(xsh_parameters_new_boolean(list,recipe_id,"combinenod-clip",
3173 p.nod_clip,
3174 "TRUE if do sigma clipping"));
3175 // --nod-clip-sigma
3176 check(
3177 xsh_parameters_new_double(list,recipe_id,"combinenod-clip-sigma", p.nod_clip_sigma, "Kappa value in sigma clipping for combining nodded frames"));
3178 // --crh-clip-niter
3179 check(
3180 xsh_parameters_new_int(list,recipe_id,"combinenod-clip-niter", p.nod_clip_niter, "Number of iterations in sigma clipping for combining nodded frames"));
3181 // --crh-clip-frac
3182 check(
3183 xsh_parameters_new_double(list,recipe_id,"combinenod-clip-diff", p.nod_clip_diff, "Minimal change in sigma in sigma clipping for combining nodded frames"));
3184*/
3185 check(
3186 xsh_parameters_new_string( list, recipe_id, "combinenod-throwlist", p.throwname, "Name of ascii file containing the list of throw shifts with respect to the first exposure"));
3187 }
3188
3189 check( xsh_parameters_new_string( list, recipe_id,
3190 "combinenod-method", COMBINE_METHOD_PRINT( p.method),
3191 "Combination method for nodded frames (MEDIAN, MEAN)"));
3192
3193 cleanup:
3194 return;
3195}
3196
3197/*---------------------------------------------------------------------------*/
3205/*---------------------------------------------------------------------------*/
3207 cpl_parameterlist* list)
3208{
3209 xsh_combine_nod_param* result = NULL;
3210 const char *par_method = NULL;
3211
3212 /* check parameters */
3213 assure(list != NULL,CPL_ERROR_NULL_INPUT,"parameters list is NULL");
3214
3215 /* allocate the structure */
3216 check(result = (xsh_combine_nod_param *)(cpl_malloc(sizeof(xsh_combine_nod_param)))
3217 );
3218 assure (result != NULL, CPL_ERROR_ILLEGAL_OUTPUT,
3219 "Memory allocation failed!");
3220
3221 /* Fill the structure */
3222 if( strstr(recipe_id,"nod") != NULL) {
3223 /*
3224 check(result->nod_min = xsh_parameters_get_int(list,recipe_id,
3225 "combinenod-min"));
3226 check(result->nod_clip = xsh_parameters_get_boolean(list,recipe_id,
3227 "combinenod-clip"));
3228 check(result->nod_clip_sigma = xsh_parameters_get_double(list,recipe_id,
3229 "combinenod-clip-sigma"));
3230 check(result->nod_clip_niter = xsh_parameters_get_int(list,recipe_id,
3231 "combinenod-clip-niter"));
3232 check(result->nod_clip_diff = xsh_parameters_get_double(list,recipe_id,
3233 "combinenod-clip-diff"));
3234 */
3235 check(result->throwname = xsh_parameters_get_string(list,recipe_id,
3236 "combinenod-throwlist"));
3237 }
3238 check( par_method = xsh_parameters_get_string( list, recipe_id,
3239 "combinenod-method"));
3240 if ( strcmp( COMBINE_METHOD_PRINT( COMBINE_MEAN_METHOD), par_method) == 0){
3241 result->method = COMBINE_MEAN_METHOD;
3242 }
3243 else if (strcmp( COMBINE_METHOD_PRINT( COMBINE_MEDIAN_METHOD), par_method) == 0){
3244 result->method = COMBINE_MEDIAN_METHOD;
3245 }
3246 else {
3247 xsh_error_msg("WRONG parameter combinenod-method %s",par_method);
3248 }
3249
3250
3251 cleanup:
3252 if(cpl_error_get_code() != CPL_ERROR_NONE){
3253 cpl_free(result);
3254 result = NULL;
3255 }
3256 return result;
3257}
3258/*---------------------------------------------------------------------------*/
3269/*---------------------------------------------------------------------------*/
3270void xsh_parameters_opt_extract_create( const char * recipe_id,
3271 cpl_parameterlist* list, xsh_opt_extract_param p)
3272{
3273 /* Check input parameters */
3274 XSH_ASSURE_NOT_NULL( recipe_id);
3275 XSH_ASSURE_NOT_NULL( list);
3276
3277 /* Fill the parameter list */
3278 check( xsh_parameters_new_int( list, recipe_id,
3279 "optextract-oversample", p.oversample,
3280 "Oversample factor for the science image"));
3281 check( xsh_parameters_new_int( list, recipe_id,
3282 "optextract-box-half-size", p.box_hsize,
3283 "Extraction box [pixel]"));
3284 check( xsh_parameters_new_int( list, recipe_id,
3285 "optextract-chunk-size", p.chunk_size,
3286 "Chunk size [bin]"));
3287 check( xsh_parameters_new_double( list, recipe_id,
3288 "optextract-step-lambda", p.lambda_step,
3289 "Lambda step [nm]"));
3290 check( xsh_parameters_new_double( list, recipe_id,
3291 "optextract-clip-kappa", p.clip_kappa,
3292 "Kappa for cosmics ray hits rejection" ) ) ;
3293 check( xsh_parameters_new_double( list, recipe_id,
3294 "optextract-clip-frac", p.clip_frac,
3295 "Maximum bad pixels fraction for cosmics ray hits rejection"));
3296 check( xsh_parameters_new_int( list, recipe_id,
3297 "optextract-clip-niter", p.clip_niter,
3298 "Maximum number of iterations for cosmics ray hits rejection"));
3299 check( xsh_parameters_new_int( list, recipe_id,
3300 "optextract-niter", p.niter,
3301 "Number of iterations" ) ) ;
3302 check( xsh_parameters_new_string( list, recipe_id,
3303 "optextract-method", OPTEXTRACT_METHOD_PRINT(p.method),
3304 "Extraction method GAUSSIAN | GENERAL"));
3305
3306 cleanup:
3307 return;
3308}
3309
3310/*---------------------------------------------------------------------------*/
3321/*---------------------------------------------------------------------------*/
3323 cpl_parameterlist* list)
3324{
3325 xsh_opt_extract_param* result = NULL;
3326 const char *par_method = NULL;
3327
3328
3329 /* check parameters */
3330 XSH_ASSURE_NOT_NULL( recipe_id);
3331 XSH_ASSURE_NOT_NULL( list);
3332 /* Allocate structure */
3333 XSH_MALLOC( result, xsh_opt_extract_param, 1);
3334
3335 /* Fill the structure */
3336 check( result->oversample = xsh_parameters_get_int( list,recipe_id,
3337 "optextract-oversample"));
3338 check( result->box_hsize = xsh_parameters_get_int( list,recipe_id,
3339 "optextract-box-half-size"));
3340 check( result->chunk_size = xsh_parameters_get_int( list,recipe_id,
3341 "optextract-chunk-size"));
3342 check( result->lambda_step = xsh_parameters_get_double( list,recipe_id,
3343 "optextract-step-lambda"));
3344 check( result->clip_kappa = xsh_parameters_get_double( list, recipe_id,
3345 "optextract-clip-kappa"));
3346 check( result->clip_frac = xsh_parameters_get_double( list, recipe_id,
3347 "optextract-clip-frac"));
3348 check( result->clip_niter = xsh_parameters_get_int( list, recipe_id,
3349 "optextract-clip-niter"));
3350 check( result->niter = xsh_parameters_get_int( list, recipe_id,
3351 "optextract-niter"));
3352 check( par_method = xsh_parameters_get_string( list, recipe_id,
3353 "optextract-method"));
3354 if ( strcmp( OPTEXTRACT_METHOD_PRINT(GAUSS_METHOD), par_method) == 0){
3355 result->method = GAUSS_METHOD;
3356 }
3357 else if (strcmp( OPTEXTRACT_METHOD_PRINT(GENERAL_METHOD), par_method) == 0){
3358 result->method = GENERAL_METHOD;
3359 }
3360 else {
3361 xsh_error_msg("WRONG parameter optextract-method %s",par_method);
3362 }
3363
3364 cleanup:
3365 if(cpl_error_get_code() != CPL_ERROR_NONE){
3366 XSH_FREE( result);
3367 }
3368 return result;
3369}
3370
3371void xsh_parameters_slit_limit_create( const char* recipe_id,
3372 cpl_parameterlist* list,
3374{
3375 /* Check input parameters */
3376 XSH_ASSURE_NOT_NULL( recipe_id);
3377 XSH_ASSURE_NOT_NULL( list);
3378
3379 /* Fill the parameter list */
3380 check( xsh_parameters_new_double( list, recipe_id,
3381 "max-slit", p.max_slit,
3382 "Lower Slit Limit (localize and extract"));
3383 check( xsh_parameters_new_double( list, recipe_id,
3384 "min-slit", p.min_slit,
3385 "Upper Slit Limit (localize and extract"));
3386
3387 cleanup:
3388 return ;
3389}
3390
3392 cpl_parameterlist* list )
3393{
3394 xsh_slit_limit_param * result = NULL ;
3395
3396 /* check parameters */
3397 XSH_ASSURE_NOT_NULL( recipe_id);
3398 XSH_ASSURE_NOT_NULL( list);
3399 /* Allocate structure */
3400 XSH_MALLOC( result, xsh_slit_limit_param, 1);
3401
3402 /* Fill the structure */
3403 check( result->min_slit = xsh_parameters_get_double( list,recipe_id,
3404 "min-slit"));
3405 check( result->max_slit = xsh_parameters_get_double( list,recipe_id,
3406 "max-slit"));
3407 cleanup:
3408 if(cpl_error_get_code() != CPL_ERROR_NONE){
3409 XSH_FREE( result);
3410 }
3411 return result;
3412}
3413
3414void xsh_parameters_geom_ifu_mode_create( const char* recipe_id,
3415 cpl_parameterlist* list )
3416{
3417 /* Check input parameters */
3418 XSH_ASSURE_NOT_NULL( recipe_id);
3419 XSH_ASSURE_NOT_NULL( list);
3420
3421 check(xsh_parameters_new_boolean(list,recipe_id,
3422 "geom-ifu-localize-single",
3423 TRUE,
3424 "Use a concatenation of rectified to localize."));
3425 cleanup:
3426 return ;
3427}
3428
3429int xsh_parameters_geom_ifu_mode_get( const char * recipe_id,
3430 cpl_parameterlist* list)
3431{
3432 int ts = FALSE ;
3433
3434 /* Check input parameters */
3435 XSH_ASSURE_NOT_NULL( recipe_id);
3436 XSH_ASSURE_NOT_NULL( list);
3437 ts = xsh_parameters_get_boolean( list, recipe_id,
3438 "geom-ifu-localize-single" ) ;
3439
3440 cleanup:
3441 return ts ;
3442}
3443
3444
3445cpl_parameterlist*
3447{
3448
3449 cpl_parameterlist* result=NULL;
3450 int nrow=0;
3451 int i=0;
3452 const char* svalue=NULL;
3453 int ivalue=0;
3454 float fvalue=0;
3455 double dvalue=0;
3456 bool bvalue=0;
3457
3458 const char* rec_id=NULL;
3459 const char* pname=NULL;
3460 const char* ptype=NULL;
3461 const char* phelp=NULL;
3462
3463
3464 XSH_ASSURE_NOT_NULL_MSG(tab,"Null input DRS tab");
3465 nrow=cpl_table_get_nrow(tab);
3466 result=cpl_parameterlist_new();
3467 for(i=0;i<nrow;i++) {
3468 check(rec_id=cpl_table_get_string(tab,"recipe",i));
3469 check(pname=cpl_table_get_string(tab,"param_name",i));
3470 check(ptype=cpl_table_get_string(tab,"param_type",i));
3471 check(phelp=cpl_table_get_string(tab,"param_help",i));
3472 //xsh_msg("pname=%s ptype=%s",pname,ptype);
3473 if (strcmp(ptype,"int") == 0) {
3474 check(ivalue=atoi(cpl_table_get_string(tab,"param_value",i)));
3475 check(xsh_parameters_new_int(result,rec_id,pname,ivalue,phelp));
3476 }
3477 else if (strcmp(ptype,"float") == 0) {
3478 fvalue=atof(cpl_table_get_string(tab,"param_value",i));
3479 xsh_parameters_new_float(result,rec_id,pname,fvalue,phelp);
3480 }
3481 else if (strcmp(ptype,"double") == 0) {
3482 dvalue=atof(cpl_table_get_string(tab,"param_value",i));
3483 xsh_parameters_new_double(result,rec_id,pname,dvalue,phelp);
3484 }
3485 else if (strcmp(ptype,"string") == 0) {
3486 svalue=cpl_table_get_string(tab,"param_value",i);
3487 xsh_parameters_new_string(result,rec_id,pname,svalue,phelp);
3488 }
3489 else if (strcmp(ptype,"bool") == 0) {
3490 bvalue=atoi(cpl_table_get_string(tab,"param_value",i));
3491 xsh_parameters_new_bool(result,rec_id,pname,bvalue,phelp);
3492 }
3493 else {
3494 xsh_msg_error("DRS table parameter type %s not supported!",ptype);
3495 return NULL;
3496 }
3497 }
3498
3499 cleanup:
3500 return result;
3501}
3502
3503
3504
3505static cpl_error_code
3506xsh_params_overscan_nir_check(cpl_parameterlist * parameters,const char* rec_id)
3507{
3508
3509 cpl_parameter* p=NULL;
3510 const char* pname=NULL;
3511 pname="pre-overscan-corr";
3512 p=xsh_parameters_find(parameters,rec_id,pname);
3513 cpl_parameter_set_int(p,0);
3514
3515 return cpl_error_get_code();
3516
3517}
3518
3519
3520
3521static cpl_error_code
3522xsh_parameter_check_int(cpl_parameterlist* parameters,const char* rec_id,const char* pname,const int min,const int max,const int skip_val, const char* spec)
3523{
3524 int ival=0;
3525 int uval=0;
3526 cpl_parameter* p=NULL;
3527
3528
3529 check(uval=xsh_parameters_get_int(parameters,rec_id,pname));
3530 if(skip_val == -1) {
3531 if( (uval != skip_val && uval < min ) || uval > max ) {
3532 xsh_msg_warning("%s (%d) < %d or > %s (%d). Switch to defaults",
3533 pname,uval,min,spec,max);
3534 check(p=xsh_parameters_find(parameters,rec_id,pname));
3535 ival=cpl_parameter_get_default_int(p);
3536 cpl_parameter_set_int(p,ival);
3537 }
3538 } else {
3539 if( uval < min || uval > max ) {
3540 xsh_msg_warning("%s (%d) < %d or > %s (%d). Switch to defaults",
3541 pname,uval,min,spec,max);
3542 check(p=xsh_parameters_find(parameters,rec_id,pname));
3543 ival=cpl_parameter_get_default_int(p);
3544 cpl_parameter_set_int(p,ival);
3545 }
3546 }
3547
3548 cleanup:
3549 return cpl_error_get_code();
3550
3551}
3552
3553static cpl_error_code
3554xsh_parameter_check_double(cpl_parameterlist* parameters,const char* rec_id,const char* pname,const double min,const double max,const double skip_val, const char* spec)
3555{
3556 double dval=0;
3557 double uval=0;
3558 cpl_parameter* p=NULL;
3559
3560 check(uval=xsh_parameters_get_double(parameters,rec_id,pname));
3561 if(skip_val == -1) {
3562 if( (uval != skip_val && uval < min ) || uval > max ) {
3563 xsh_msg_warning("%s (%g) < %g or > %s (%g). Switch to defaults",
3564 pname,uval,min,spec,max);
3565 check(p=xsh_parameters_find(parameters,rec_id,pname));
3566 dval=cpl_parameter_get_default_double(p);
3567 cpl_parameter_set_double(p,dval);
3568 }
3569 } else {
3570 if( uval < min || uval > max ) {
3571 xsh_msg_warning("%s (%g) < %g or > %s (%g). Switch to defaults",
3572 pname,uval,min,spec,max);
3573 check(p=xsh_parameters_find(parameters,rec_id,pname));
3574 dval=cpl_parameter_get_default_double(p);
3575 cpl_parameter_set_double(p,dval);
3576 }
3577 }
3578
3579 cleanup:
3580 return cpl_error_get_code();
3581}
3582
3583
3584static cpl_error_code
3585xsh_params_crhclip_check(cpl_parameterlist * parameters, const char* rec_id)
3586{
3587
3588 const char* pname=NULL;
3589
3590 pname="crh-clip-frac";
3591 xsh_parameter_check_double(parameters,rec_id,pname,0,1,-9,"");
3592
3593 pname="crh-clip-kappa";
3594 xsh_parameter_check_double(parameters,rec_id,pname,0,20,-9,"");
3595
3596 pname="crh-clip-niter";
3597 xsh_parameter_check_int(parameters,rec_id,pname,0,100,-9,"");
3598
3599 return cpl_error_get_code();
3600
3601}
3602
3603static cpl_error_code
3604xsh_params_noise_clip_check(cpl_parameterlist * parameters, const char* rec_id)
3605{
3606
3607 const char* pname=NULL;
3608
3609 pname="noise-clip-kappa";
3610 xsh_parameter_check_double(parameters,rec_id,pname,0,20,-9,"");
3611
3612 pname="noise-clip-niter";
3613 xsh_parameter_check_int(parameters,rec_id,pname,1,100,-9,"");
3614
3615 pname="noise-clip-frac";
3616 xsh_parameter_check_double(parameters,rec_id,pname,0,1,-9,"");
3617
3618 pname="noise-clip-diff";
3619 xsh_parameter_check_double(parameters,rec_id,pname,0,1,-9,"");
3620
3621 pname="noise-lower-rejection";
3622 xsh_parameter_check_double(parameters,rec_id,pname,0,100,-9,"");
3623
3624 pname="noise-higher-rejection";
3625 xsh_parameter_check_double(parameters,rec_id,pname,0,100,-9,"");
3626
3627 return cpl_error_get_code();
3628
3629}
3630
3631
3632
3633static cpl_error_code
3634xsh_params_crhsingle_check(cpl_parameterlist * parameters, const char* rec_id)
3635{
3636
3637 const char* pname=NULL;
3638 /*
3639 pname="removecrhsingle-frac-max";
3640 xsh_parameter_check_double(parameters,rec_id,pname,0,1,-9,"");
3641 */
3642
3643 pname="removecrhsingle-sigmalim";
3644 xsh_parameter_check_double(parameters,rec_id,pname,0,200,-9,"");
3645
3646 pname="removecrhsingle-flim";
3647 xsh_parameter_check_double(parameters,rec_id,pname,0,20,-9,"");
3648
3649 pname="removecrhsingle-niter";
3650 xsh_parameter_check_int(parameters,rec_id,pname,-1,1000,-9,"");
3651
3652 return cpl_error_get_code();
3653
3654
3655}
3656
3657#if 0
3658static cpl_error_code
3659xsh_params_crhsingle_nod_check(cpl_parameterlist * parameters, const char* rec_id, XSH_ARM arm)
3660{
3661
3662 const char* pname=NULL;
3663 /*
3664 pname="removecrhsingle-frac-max";
3665 xsh_parameter_check_double(parameters,rec_id,pname,0,1,-9,"");
3666 */
3667
3668 double min_sigma_val=20;
3669 if (
3670 (strcmp(rec_id, "xsh_respon_slit_nod") == 0) &&
3671 (arm == XSH_ARM_NIR )
3672 ) {
3673 min_sigma_val=40;
3674 }
3675
3676 pname="removecrhsingle-sigmalim";
3677 cpl_parameter* p=xsh_parameters_find(parameters,rec_id,pname);
3678 double dval=cpl_parameter_get_default_double(p);
3679 if(dval< min_sigma_val) {
3680 cpl_parameter_set_default_double(p,min_sigma_val);
3681 }
3682 double uval=cpl_parameter_get_double(p);
3683 if(uval< min_sigma_val) {
3684 cpl_parameter_set_double(p,min_sigma_val);
3685 }
3686 xsh_params_crhsingle_check(parameters,rec_id);
3687
3688 return cpl_error_get_code();
3689
3690
3691}
3692#endif
3693/*
3694static cpl_error_code
3695xsh_params_combinenod_check(cpl_parameterlist * parameters,const char* rec_id)
3696{
3697
3698
3699 const char* pname=NULL;
3700 pname="combinenod-min";
3701 xsh_parameter_check_int(parameters,rec_id,pname,0,100,-9,"");
3702
3703 pname="combinenod-clip-sigma";
3704 xsh_parameter_check_double(parameters,rec_id,pname,0,100,-9,"");
3705
3706 pname="combinenod-clip-niter";
3707 xsh_parameter_check_int(parameters,rec_id,pname,1,100,-9,"");
3708
3709 pname="combinenod-clip-diff";
3710 xsh_parameter_check_double(parameters,rec_id,pname,0,100,-9,"");
3711
3712 return cpl_error_get_code();
3713
3714}
3715*/
3716static cpl_error_code
3717xsh_params_optextract_check(cpl_parameterlist * parameters,const char* rec_id,
3718 const int sizey)
3719{
3720
3721 const char* pname=NULL;
3722
3723 pname="optextract-oversample";
3724 xsh_parameter_check_int(parameters,rec_id,pname,1,100,-9,"");
3725
3726 pname="optextract-box-half-size";
3727 xsh_parameter_check_int(parameters,rec_id,pname,1,100,-9,"");
3728
3729 pname="optextract-chunk-size";
3730 xsh_parameter_check_int(parameters,rec_id,pname,1,sizey,-9,"");
3731
3732 pname="optextract-step-lambda";
3733 xsh_parameter_check_double(parameters,rec_id,pname,0,210,-9,"nm");
3734
3735 pname="optextract-clip-kappa";
3736 xsh_parameter_check_double(parameters,rec_id,pname,0,100,-9,"");
3737
3738 pname="optextract-clip-frac";
3739 xsh_parameter_check_double(parameters,rec_id,pname,0,1,-9,"");
3740
3741 pname="optextract-clip-niter";
3742 xsh_parameter_check_int(parameters,rec_id,pname,1,200,-9,"");
3743
3744 pname="optextract-niter";
3745 xsh_parameter_check_int(parameters,rec_id,pname,1,200,-9,"");
3746
3747 return cpl_error_get_code();
3748
3749}
3750
3751static cpl_error_code
3752xsh_params_follow_arclines_check(cpl_parameterlist * parameters,const char* rec_id)
3753{
3754
3755 const char* pname=NULL;
3756
3757 pname="followarclines-search-window-half-size";
3758 xsh_parameter_check_int(parameters,rec_id,pname,1,60,-9,"");
3759
3760 pname="followarclines-order-edges-mask";
3761 xsh_parameter_check_int(parameters,rec_id,pname,0,10,-9,"");
3762
3763 pname="followarclines-min-sn";
3764 xsh_parameter_check_double(parameters,rec_id,pname,0,200,-9,"");
3765
3766 return cpl_error_get_code();
3767
3768}
3769
3770static cpl_error_code
3771xsh_params_extract_mask_size_check(cpl_parameterlist * parameters,const char* rec_id)
3772{
3773
3774 const char* pname=NULL;
3775
3776 pname="stdextract-interp-hsize";
3777 xsh_parameter_check_int(parameters,rec_id,pname,0,1000,-9,"");
3778
3779
3780
3781 return cpl_error_get_code();
3782
3783}
3784
3785
3786static cpl_error_code
3787xsh_params_tilt_clip_check(cpl_parameterlist * parameters,const char* rec_id)
3788{
3789
3790 const char* pname=NULL;
3791
3792 pname="tilt-clip-kappa";
3793 xsh_parameter_check_double(parameters,rec_id,pname,0,100,-9,"");
3794
3795 pname="tilt-clip-niter";
3796 xsh_parameter_check_int(parameters,rec_id,pname,0,100,-9,"");
3797
3798 pname="tilt-clip-frac";
3799 xsh_parameter_check_double(parameters,rec_id,pname,0,200,-9,"");
3800
3801 return cpl_error_get_code();
3802
3803}
3804
3805
3806static cpl_error_code
3807xsh_params_spec_res_check(cpl_parameterlist * parameters,const char* rec_id)
3808{
3809
3810 const char* pname=NULL;
3811
3812 pname="specres-clip-kappa";
3813 xsh_parameter_check_double(parameters,rec_id,pname,0,100,-9,"");
3814
3815 pname="specres-clip-niter";
3816 xsh_parameter_check_int(parameters,rec_id,pname,0,100,-9,"");
3817
3818 pname="specres-clip-frac";
3819 xsh_parameter_check_double(parameters,rec_id,pname,0,200,-9,"");
3820
3821 return cpl_error_get_code();
3822
3823}
3824
3825
3826static cpl_error_code
3827xsh_params_background_check(cpl_parameterlist * parameters,const char* rec_id,
3828 const int sizex,const int sizey, const int norder)
3829{
3830 //int nb_y_max=0;
3831 //int radius_y=0;
3832
3833 const char* pname=NULL;
3834
3835 pname="background-poly-deg-x";
3836 xsh_parameter_check_int(parameters,rec_id,pname,0,15,-9,"");
3837
3838 pname="background-poly-deg-y";
3839 xsh_parameter_check_int(parameters,rec_id,pname,0,15,-9,"");
3840
3841
3842 pname="background-poly-kappa";
3843 xsh_parameter_check_double(parameters,rec_id,pname,0,100,-9,"");
3844
3845 //cleanup:
3846 return cpl_error_get_code();
3847
3848}
3849
3850static cpl_error_code
3851xsh_params_rectify_check(cpl_parameterlist * parameters, const char* rec_id)
3852{
3853
3854 const char* pname=NULL;
3855
3856 pname="rectify-radius";
3857 xsh_parameter_check_double(parameters,rec_id,pname,1,100,-9,"");
3858
3859 pname="rectify-bin-slit";
3860 xsh_parameter_check_double(parameters,rec_id,pname,0,6,-1,"arcsec");
3861
3862 pname="rectify-bin-lambda";
3863 xsh_parameter_check_double(parameters,rec_id,pname,0,210,-1,"nm");
3864
3865 return cpl_error_get_code();
3866
3867}
3868
3869static cpl_error_code
3870xsh_params_localize_check(cpl_parameterlist * parameters,const char* rec_id)
3871{
3872
3873 const char* pname=NULL;
3874
3875 pname="localize-chunk-nb";
3876 xsh_parameter_check_int(parameters,rec_id,pname,1,1000,-9,"");
3877
3878 pname="localize-thresh";
3879 xsh_parameter_check_double(parameters,rec_id,pname,0,1,-9,"");
3880
3881 pname="localize-deg-lambda";
3882 xsh_parameter_check_int(parameters,rec_id,pname,0,10,-9,"");
3883
3884 pname="localize-slit-position";
3885 xsh_parameter_check_double(parameters,rec_id,pname,-7,7,-9,"");
3886
3887 pname="localize-slit-hheight";
3888 xsh_parameter_check_double(parameters,rec_id,pname,0,7,-9,"");
3889
3890 /* FIXME: different default on respon_slit_nod and stare/offset */
3891 pname="localize-kappa";
3892 xsh_parameter_check_double(parameters,rec_id,pname,0,20,-9,"");
3893
3894 pname="localize-niter";
3895 xsh_parameter_check_int(parameters,rec_id,pname,0,100,-9,"");
3896
3897 return cpl_error_get_code();
3898
3899
3900}
3901
3902
3903static cpl_error_code
3904xsh_params_sky_bspline_check(cpl_parameterlist * parameters,const char* rec_id,
3905 const int biny)
3906{
3907
3908 int nbkpts_max=20000/(0.75 *biny);
3909 int niter_max=100;
3910 const char* pname=NULL;
3911
3912 pname="sky-bspline-nbkpts-first";
3913 xsh_parameter_check_int(parameters,rec_id,pname,1,nbkpts_max,-1,"");
3914
3915 pname="sky-bspline-nbkpts-second";
3916 xsh_parameter_check_int(parameters,rec_id,pname,1,nbkpts_max,-1,"");
3917
3918 pname="sky-bspline-order";
3919 xsh_parameter_check_int(parameters,rec_id,pname,0,12,-9,"");
3920
3921 pname="sky-bspline-niter";
3922 xsh_parameter_check_int(parameters,rec_id,pname,1,niter_max,-9,"");
3923
3924 pname="sky-bspline-kappa";
3925 xsh_parameter_check_double(parameters,rec_id,pname,1,500,-9,"");
3926
3927 pname="sky-slit-edges-mask";
3928 xsh_parameter_check_double(parameters,rec_id,pname,0,7,-9,"");
3929
3930 pname="sky-hheight1";
3931 xsh_parameter_check_double(parameters,rec_id,pname,0,7,-9,"");
3932
3933 pname="sky-hheight2";
3934 xsh_parameter_check_double(parameters,rec_id,pname,0,7,-9,"");
3935
3936 return cpl_error_get_code();
3937
3938}
3939
3940
3941
3942static cpl_error_code
3943xsh_params_model_anneal_check(cpl_parameterlist * parameters,const char* rec_id)
3944{
3945
3946 const char* pname=NULL;
3947
3948 pname="model-anneal-factor";
3949 xsh_parameter_check_double(parameters,rec_id,pname,0,10,-9,"");
3950
3951 pname="model-scenario";
3952 xsh_parameter_check_int(parameters,rec_id,pname,0,8,-9,"");
3953
3954 pname="model-maxit";
3955 xsh_parameter_check_int(parameters,rec_id,pname,0,100000,-9,"");
3956
3957 return cpl_error_get_code();
3958
3959}
3960
3961static cpl_error_code
3962xsh_params_overscan_check(cpl_parameterlist * parameters,const char* rec_id)
3963{
3964
3965 const char* pname=NULL;
3966
3967 pname="pre-overscan-corr";
3968 xsh_parameter_check_int(parameters,rec_id,pname,0,6,-1,"");
3969
3970 return cpl_error_get_code();
3971
3972
3973
3974}
3975
3976static cpl_error_code
3977xsh_params_detect_arclines_check(cpl_parameterlist * parameters,const char* rec_id)
3978{
3979
3980 const char* pname=NULL;
3981 int deg_slit_min=0;
3982 int deg_slit_max=0;
3983
3984 pname="detectarclines-fit-win-hsize";
3985 xsh_parameter_check_int(parameters,rec_id,pname,0,60,-1,"");
3986
3987 pname="detectarclines-search-win-hsize";
3988 xsh_parameter_check_int(parameters,rec_id,pname,0,60,-9,"");
3989
3990 pname="detectarclines-running-median-hsize";
3991 xsh_parameter_check_int(parameters,rec_id,pname,1,60,-9,"");
3992
3993 pname="detectarclines-wavesol-deg-lambda";
3994 xsh_parameter_check_int(parameters,rec_id,pname,0,10,-9,"");
3995
3996 pname="detectarclines-wavesol-deg-order";
3997 xsh_parameter_check_int(parameters,rec_id,pname,0,10,-9,"");
3998
3999 if(strcmp(rec_id,"xsh_predict") == 0) {
4000 deg_slit_max=0;
4001 deg_slit_min=0;
4002 } else {
4003 deg_slit_max=0;
4004 deg_slit_min=10;
4005 }
4006
4007 if (strcmp("xsh_2dmap", rec_id) == 0) {
4008 pname = "detectarclines-wavesol-deg-slit";
4009 xsh_parameter_check_int(parameters,rec_id,pname,deg_slit_min,deg_slit_max,-9,"");
4010
4011 }
4012
4013 if(strcmp(rec_id,"xsh_predict") == 0) {
4014 pname="detectarclines-ordertab-deg-y";
4015 xsh_parameter_check_int(parameters,rec_id,pname,0,10,-9,"");
4016 }
4017 pname="detectarclines-min-sn";
4018 xsh_parameter_check_double(parameters,rec_id,pname,0,200,-1,"");
4019
4020 pname="detectarclines-clip-sigma";
4021 xsh_parameter_check_double(parameters,rec_id,pname,0,20,-9,"");
4022
4023 pname="detectarclines-clip-niter";
4024 xsh_parameter_check_int(parameters,rec_id,pname,0,200,-9,"");
4025
4026 pname="detectarclines-clip-frac";
4027 xsh_parameter_check_double(parameters,rec_id,pname,0,1,-9,"");
4028
4029 return cpl_error_get_code();
4030
4031}
4032
4033static cpl_error_code
4034xsh_params_detect_continuum_check(cpl_parameterlist * parameters,const char* rec_id)
4035{
4036
4037 const char* pname=NULL;
4038
4039 pname="detectcontinuum-search-win-hsize";
4040 xsh_parameter_check_int(parameters,rec_id,pname,1,100,-1,"");
4041
4042 pname="detectcontinuum-running-win-hsize";
4043 xsh_parameter_check_int(parameters,rec_id,pname,1,100,-1,"");
4044
4045 pname="detectcontinuum-fit-win-hsize";
4046 xsh_parameter_check_int(parameters,rec_id,pname,0,100,-9,"");
4047
4048 pname="detectcontinuum-center-thresh-fac";
4049 xsh_parameter_check_double(parameters,rec_id,pname,0,1,-9,"");
4050
4051 pname="detectcontinuum-ordertab-step-y";
4052 xsh_parameter_check_int(parameters,rec_id,pname,1,20,-9,"");
4053
4054 pname="detectcontinuum-ordertab-deg-y";
4055 xsh_parameter_check_int(parameters,rec_id,pname,0,10,-9,"");
4056
4057 pname="detectcontinuum-clip-sigma";
4058 xsh_parameter_check_double(parameters,rec_id,pname,0,20,-9,"");
4059
4060 pname="detectcontinuum-clip-frac";
4061 xsh_parameter_check_double(parameters,rec_id,pname,0,1,-9,"");
4062
4063 pname="detectcontinuum-clip-res-max";
4064 xsh_parameter_check_double(parameters,rec_id,pname,0,1,-9,"");
4065
4066 pname="detectcontinuum-clip-niter";
4067 xsh_parameter_check_int(parameters,rec_id,pname,0,100,-9,"");
4068
4069 return cpl_error_get_code();
4070
4071}
4072
4073static cpl_error_code
4074xsh_params_detectorder_check(cpl_parameterlist * parameters,
4075 const char* rec_id,const int sizex,
4076 const int sizey,const int norders)
4077{
4078
4079 const char* pname=NULL;
4080
4081 pname="detectorder-edges-flux-thresh";
4082 xsh_parameter_check_double(parameters,rec_id,pname,0,1,-9,"");
4083
4084 pname="detectorder-edges-search-win-hsize";
4085 xsh_parameter_check_int(parameters,rec_id,pname,sizex/norders/4,sizex/norders,-1,"");
4086
4087 pname="detectorder-min-order-size-x";
4088 xsh_parameter_check_int(parameters,rec_id,pname,1,sizex/norders,-1,"");
4089
4090 pname="detectorder-chunk-half-size";
4091 xsh_parameter_check_int(parameters,rec_id,pname,1,sizey,-9,"");
4092
4093 pname="detectorder-slitlet-low-factor";
4094 xsh_parameter_check_double(parameters,rec_id,pname,0,1,-9,"");
4095
4096 pname="detectorder-slitlet-up-factor";
4097 xsh_parameter_check_double(parameters,rec_id,pname,0,1,-9,"");
4098
4099 pname="detectorder-chunk-half-size";
4100 xsh_parameter_check_int(parameters,rec_id,pname,1,sizey,-9,"");
4101
4102 pname="detectorder-min-sn";
4103 xsh_parameter_check_double(parameters,rec_id,pname,0,150,-9,"");
4104
4105 pname="detectorder-d2-min-sn";
4106 xsh_parameter_check_double(parameters,rec_id,pname,0,150,-9,"");
4107
4108 return cpl_error_get_code();
4109
4110}
4111
4112static cpl_error_code
4113xsh_params_dispersol_check(cpl_parameterlist * parameters,const char* rec_id)
4114{
4115
4116 const char* pname=NULL;
4117
4118 pname="dispersol-deg-x";
4119 xsh_parameter_check_int(parameters,rec_id,pname,0,10,-9,"");
4120
4121 pname="dispersol-deg-y";
4122 xsh_parameter_check_int(parameters,rec_id,pname,0,10,-9,"");
4123
4124 return cpl_error_get_code();
4125
4126}
4127
4128static cpl_error_code
4129xsh_params_compute_fpn_check(cpl_parameterlist * parameters,const char* rec_id, const int sizex, const int sizey)
4130{
4131
4132 int hsize=0;
4133 int nsamples=0;
4134
4135 cpl_parameter* p=NULL;
4136 const char* pname=NULL;
4137 int ival=0;
4138
4139 pname="fpn_llx";
4140 xsh_parameter_check_int(parameters,rec_id,pname,1,sizex,-1,"detector X size");
4141
4142 pname="fpn_urx";
4143 xsh_parameter_check_int(parameters,rec_id,pname,1,sizex,-1,"detector X size");
4144
4145 pname="fpn_lly";
4146 xsh_parameter_check_int(parameters,rec_id,pname,1,sizey,-1,"detector Y size");
4147
4148 pname="fpn_ury";
4149 xsh_parameter_check_int(parameters,rec_id,pname,1,sizey,-1,"detector Y size");
4150
4151 pname="fpn_nsamples";
4152 check(nsamples=xsh_parameters_get_int(parameters,rec_id,pname));
4153
4154
4155 if( nsamples<1 || nsamples > sizex || nsamples > sizey ) {
4156 xsh_msg_warning("%s (%d) < 1 or > detector X size (%d) or > detector Y size. Switch to defaults",pname,nsamples,sizex);
4157 check(p=xsh_parameters_find(parameters,rec_id,pname));
4158 ival=cpl_parameter_get_default_int(p);
4159 cpl_parameter_set_int(p,ival);
4160 }
4161
4162 pname="fpn_hsize";
4163 check(hsize=xsh_parameters_get_int(parameters,rec_id,pname));
4164 if( hsize<1 || hsize > sizex || hsize > sizey ) {
4165 xsh_msg_warning("%s (%d) < 1 or > detector X size (%d) or > detector Y size (%d). Switch to defaults",pname,hsize,sizex,sizey);
4166 check(p=xsh_parameters_find(parameters,rec_id,pname));
4167 ival=cpl_parameter_get_default_int(p);
4168 cpl_parameter_set_int(p,ival);
4169 }
4170
4171cleanup:
4172 return cpl_error_get_code();
4173
4174}
4175
4176static cpl_error_code
4177xsh_params_stacking_check(cpl_parameterlist * parameters,
4178 const char* rec_id)
4179{
4180
4181 const char* pname=NULL;
4182
4183 pname="stacking_ks_low";
4184 xsh_parameter_check_int(parameters,rec_id,pname,0,20,-9,"");
4185
4186 pname="stacking_ks_iter";
4187 xsh_parameter_check_int(parameters,rec_id,pname,0,200,-9,"");
4188
4189 return cpl_error_get_code();
4190}
4191
4192
4193
4194static cpl_error_code
4195xsh_params_stack_check(cpl_parameterlist * parameters,
4196 const char* rec_id)
4197{
4198
4199 const char* pname=NULL;
4200
4201 pname="klow";
4202 xsh_parameter_check_double(parameters,rec_id,pname,0,100,-9,"");
4203
4204 pname="khigh";
4205 xsh_parameter_check_double(parameters,rec_id,pname,0,100,-9,"");
4206
4207
4208 return cpl_error_get_code();
4209}
4210
4211
4212static cpl_error_code
4213xsh_params_compute_ron_region1_check(cpl_parameterlist * parameters,
4214 const char* rec_id,
4215 const int sizex,const int sizey)
4216
4217{
4218
4219 const char* pname=NULL;
4220
4221 pname="ref1_llx";
4222 xsh_parameter_check_int(parameters,rec_id,pname,1,sizex,-1,"detector X size");
4223
4224 pname="ref1_urx";
4225 xsh_parameter_check_int(parameters,rec_id,pname,1,sizex,-1,"detector X size");
4226
4227 pname="ref1_lly";
4228 xsh_parameter_check_int(parameters,rec_id,pname,1,sizey,-1,"detector Y size");
4229
4230 pname="ref1_ury";
4231 xsh_parameter_check_int(parameters,rec_id,pname,1,sizey,-1,"detector Y size");
4232
4233 return cpl_error_get_code();
4234
4235}
4236
4237static cpl_error_code
4238xsh_params_compute_ron_region2_check(cpl_parameterlist * parameters,
4239 const char* rec_id,
4240 const int sizex,const int sizey)
4241
4242{
4243 const char* pname=NULL;
4244
4245 pname="ref2_llx";
4246 xsh_parameter_check_int(parameters,rec_id,pname,1,sizex,-1,"detector X size");
4247
4248 pname="ref2_urx";
4249 xsh_parameter_check_int(parameters,rec_id,pname,1,sizex,-1,"detector X size");
4250
4251 pname="ref2_lly";
4252 xsh_parameter_check_int(parameters,rec_id,pname,1,sizey,-1,"detector Y size");
4253
4254 pname="ref2_ury";
4255 xsh_parameter_check_int(parameters,rec_id,pname,1,sizey,-1,"detector Y size");
4256
4257 return cpl_error_get_code();
4258
4259
4260}
4261
4262static cpl_error_code
4263xsh_params_compute_ron_mbias_set3_check(cpl_parameterlist * parameters,
4264 const char* rec_id,
4265 const int sizex,const int sizey)
4266
4267{
4268
4269 const char* pname=NULL;
4270 cpl_parameter* p=NULL;
4271 int nsamples=0;
4272 int hsize=0;
4273 int ival=0;
4274
4275 pname="random_nsamples";
4276 check(nsamples=xsh_parameters_get_int(parameters,rec_id,pname));
4277
4278
4279 if( nsamples<1 || nsamples > sizex || nsamples > sizey ) {
4280 xsh_msg_warning("%s (%d) < 1 or > detector X size (%d) or > detector Y size. Switch to defaults",pname,nsamples,sizex);
4281 check(p=xsh_parameters_find(parameters,rec_id,pname));
4282 ival=cpl_parameter_get_default_int(p);
4283 cpl_parameter_set_int(p,ival);
4284 }
4285
4286 pname="random_sizex";
4287 check(hsize=xsh_parameters_get_int(parameters,rec_id,pname));
4288 if( hsize<1 || hsize > sizex || hsize > sizey ) {
4289 xsh_msg_warning("%s (%d) < 1 or > detector X size (%d) or > detector Y size (%d). Switch to defaults",pname,hsize,sizex,sizey);
4290 check(p=xsh_parameters_find(parameters,rec_id,pname));
4291 ival=cpl_parameter_get_default_int(p);
4292 cpl_parameter_set_int(p,ival);
4293 }
4294
4295cleanup:
4296 return cpl_error_get_code();
4297
4298
4299}
4300
4301static cpl_error_code
4302xsh_params_compute_ron_mdark_check(cpl_parameterlist * parameters,
4303 const char* rec_id,
4304 const int sizex,const int sizey)
4305
4306{
4307 int hsize=0;
4308 int nsamples=0;
4309
4310 cpl_parameter* p=NULL;
4311 const char* pname=NULL;
4312 int ival=0;
4313
4314 pname="ron_llx";
4315 xsh_parameter_check_int(parameters,rec_id,pname,1,sizex,-1,"detector X size");
4316
4317 pname="ron_urx";
4318 xsh_parameter_check_int(parameters,rec_id,pname,1,sizex,-1,"detector X size");
4319
4320 pname="ron_lly";
4321 xsh_parameter_check_int(parameters,rec_id,pname,1,sizey,-1,"detector Y size");
4322
4323 pname="ron_ury";
4324 xsh_parameter_check_int(parameters,rec_id,pname,1,sizey,-1,"detector Y size");
4325
4326 pname="ron_nsamples";
4327 check(nsamples=xsh_parameters_get_int(parameters,rec_id,pname));
4328
4329 if( nsamples<1 || nsamples > sizex || nsamples > sizey ) {
4330 xsh_msg_warning("%s (%d) < 1 or > detector X size (%d) or > detector Y size. Switch to defaults",pname,nsamples,sizex);
4331 check(p=xsh_parameters_find(parameters,rec_id,pname));
4332 ival=cpl_parameter_get_default_int(p);
4333 cpl_parameter_set_int(p,ival);
4334 }
4335
4336 pname="ron_hsize";
4337 check(hsize=xsh_parameters_get_int(parameters,rec_id,pname));
4338 if( hsize<1 || hsize > sizex || hsize > sizey ) {
4339 xsh_msg_warning("%s (%d) < 1 or > detector X size (%d) or > detector Y size (%d). Switch to defaults",pname,hsize,sizex,sizey);
4340 check(p=xsh_parameters_find(parameters,rec_id,pname));
4341 ival=cpl_parameter_get_default_int(p);
4342 cpl_parameter_set_int(p,ival);
4343 }
4344
4345cleanup:
4346 return cpl_error_get_code();
4347
4348
4349}
4350
4351
4352static cpl_error_code
4353xsh_params_compute_ron_check(cpl_parameterlist * parameters,
4354 const char* rec_id,
4355 const int sizex,const int sizey)
4356{
4357
4358 if(strcmp(rec_id,"xsh_mbias") ==0 ) {
4359 check(xsh_params_compute_ron_region1_check(parameters,rec_id,sizex,sizey));
4360 xsh_params_compute_ron_region2_check(parameters,rec_id,sizex,sizey);
4361 xsh_params_compute_ron_mbias_set3_check(parameters,rec_id,sizex,sizey);
4362 } else if(strcmp(rec_id,"xsh_mdark") ==0 ) {
4363 xsh_params_compute_ron_region1_check(parameters,rec_id,sizex,sizey);
4364 xsh_params_compute_ron_mdark_check(parameters,rec_id,sizex,sizey);
4365 }
4366
4367cleanup:
4368 return cpl_error_get_code();
4369
4370}
4371
4372
4373static cpl_error_code
4374xsh_params_localizeifu_check(cpl_parameterlist* parameters, const char* rec_id){
4375
4376 int use_skymask=0;
4377 cpl_parameter* p=NULL;
4378 const char* pname=NULL;
4379 int ival=0;
4380
4381 pname="localizeifu-bckg-deg";
4382 xsh_parameter_check_int(parameters,rec_id,pname,0,100,-9,"");
4383
4384 pname="localizeifu-smooth-hsize";
4385 xsh_parameter_check_int(parameters,rec_id,pname,0,10,-9,"");
4386
4387 pname="localizeifu-wavelet-nscales";
4388 xsh_parameter_check_int(parameters,rec_id,pname,0,10,-9,"");
4389
4390 pname="localizeifu-wavelet-hf-skip";
4391 xsh_parameter_check_int(parameters,rec_id,pname,0,10,-9,"");
4392
4393 pname="localizeifu-sigma-low";
4394 xsh_parameter_check_double(parameters,rec_id,pname,0,1,-9,"");
4395
4396 pname="localizeifu-sigma-up";
4397 xsh_parameter_check_double(parameters,rec_id,pname,0,1,-9,"");
4398
4399 pname="localizeifu-snr-low";
4400 xsh_parameter_check_double(parameters,rec_id,pname,0,1,-9,"");
4401
4402 pname="localizeifu-snr-up";
4403 xsh_parameter_check_double(parameters,rec_id,pname,0,1,-9,"");
4404
4405 pname="localizeifu-slitlow-edges-mask";
4406 xsh_parameter_check_double(parameters,rec_id,pname,0,1,-9,"");
4407
4408 pname="localizeifu-slitup-edges-mask";
4409 xsh_parameter_check_double(parameters,rec_id,pname,0,1,-9,"");
4410
4411 pname="localizeifu-use-skymask";
4412 check(use_skymask=xsh_parameters_get_boolean(parameters,rec_id,pname));
4413 if( (use_skymask < 0) || use_skymask > 10 ) {
4414 xsh_msg_warning("%s (%d) < 0 or > 10. Switch to defaults",
4415 pname,use_skymask);
4416 check(p=xsh_parameters_find(parameters,rec_id,pname));
4417 ival=cpl_parameter_get_default_bool(p);
4418 cpl_parameter_set_bool(p,ival);
4419 }
4420
4421
4422 pname="localizeifu-chunk-hsize";
4423 xsh_parameter_check_int(parameters,rec_id,pname,0,10,-9,"");
4424
4425 cleanup:
4426 return cpl_error_get_code();
4427
4428}
4429
4430static cpl_error_code
4431xsh_params_correctifu_check(cpl_parameterlist* parameters, const char* rec_id){
4432
4433
4434 const char* pname=NULL;
4435
4436 pname="correctifu-niter";
4437 xsh_parameter_check_int(parameters,rec_id,pname,0,10,-9,"");
4438
4439 pname="correctifu-lambdaref";
4440 xsh_parameter_check_double(parameters,rec_id,pname,300,1500,-1,"");
4441
4442 pname="correctifu-lambdaref-hsize";
4443 xsh_parameter_check_double(parameters,rec_id,pname,0,10,-9,"");
4444
4445 return cpl_error_get_code();
4446
4447}
4448
4449cpl_error_code
4450xsh_recipe_params_check(cpl_parameterlist * parameters,xsh_instrument* instrument,const char* rec_id)
4451{
4452 XSH_ARM arm;
4453 int binx=1;
4454 int biny=1;
4455 int sizex=0;
4456 int sizey=0;
4457 int norders=0;
4458
4460
4461 if ( arm == XSH_ARM_UVB ) {
4464
4465 sizex=UVB_ASIZE;
4466 sizex/=binx;
4467 sizey=UVB_BSIZE;
4468 sizey/=biny;
4469 norders=UVB_morder;
4470 } else if ( arm == XSH_ARM_AGC ) {
4473
4474 sizex=UVB_ASIZE;
4475 sizex/=binx;
4476 sizey=UVB_BSIZE;
4477 sizey/=biny;
4478 norders=UVB_morder;
4479 } else if ( arm == XSH_ARM_VIS ) {
4482
4483 sizex=VIS_ASIZE;
4484 sizex/=binx;
4485 sizey=VIS_BSIZE;
4486 sizey/=biny;
4487 norders=VIS_morder;
4488
4489 } else if ( arm == XSH_ARM_NIR ) {
4490
4491 sizex=NIR_ASIZE;
4492 sizey=NIR_BSIZE;
4493 norders=NIR_morder;
4494
4495 } else {
4496 xsh_msg_error("arm not supported");
4497 return CPL_ERROR_ILLEGAL_INPUT;
4498 }
4499
4500 if (strcmp(rec_id, "xsh_cfg_recover") == 0) {
4501
4502 } else if (strcmp(rec_id, "xsh_mbias") == 0) {
4503 xsh_params_compute_fpn_check(parameters,rec_id,sizex,sizey);
4504 xsh_params_compute_ron_check(parameters,rec_id,sizex,sizey);
4505 xsh_params_stack_check(parameters, rec_id);
4506 } else if (strcmp(rec_id, "xsh_mdark") == 0) {
4507 xsh_params_overscan_check(parameters, rec_id);
4508 xsh_params_stack_check(parameters, rec_id);
4509 xsh_params_crhclip_check(parameters, rec_id);
4510 xsh_params_noise_clip_check(parameters,rec_id);
4511 xsh_params_compute_ron_check(parameters,rec_id,sizex,sizey);
4512 check(xsh_params_compute_fpn_check(parameters,rec_id,sizex,sizey));
4513
4514 } else if (strcmp(rec_id, "xsh_mflat") == 0) {
4515 xsh_params_detectorder_check(parameters, rec_id, sizex, sizey, norders);
4516 xsh_params_background_check(parameters, rec_id, sizex, sizey, norders);
4517 } else if (strcmp(rec_id, "xsh_predict") == 0) {
4518 xsh_params_detect_arclines_check(parameters, rec_id);
4519 xsh_params_model_anneal_check(parameters, rec_id);
4520 } else if (strcmp(rec_id, "xsh_orderpos") == 0) {
4521 xsh_params_detect_continuum_check(parameters, rec_id);
4522 } else if (strcmp(rec_id, "xsh_2dmap") == 0) {
4523 xsh_params_detect_arclines_check(parameters, rec_id);
4524 xsh_params_dispersol_check(parameters, rec_id);
4525 xsh_params_model_anneal_check(parameters, rec_id);
4526 } else if (strcmp(rec_id, "xsh_flexcomp") == 0) {
4527 xsh_params_detect_arclines_check(parameters, rec_id);
4528 xsh_params_dispersol_check(parameters, rec_id);
4529 } else if (strcmp(rec_id, "xsh_wavecal") == 0) {
4530 xsh_params_follow_arclines_check(parameters, rec_id);
4531 xsh_params_tilt_clip_check(parameters, rec_id);
4532 xsh_params_spec_res_check(parameters, rec_id);
4533 } else if (strcmp(rec_id, "xsh_respon_slit_stare") == 0) {
4534 xsh_params_overscan_check(parameters, rec_id);
4535 check(xsh_params_sky_bspline_check(parameters, rec_id, biny));
4536 xsh_params_rectify_check(parameters, rec_id);
4537 xsh_params_localize_check(parameters, rec_id);
4538 xsh_params_background_check(parameters, rec_id, sizex, sizey, norders);
4539 xsh_params_crhsingle_check(parameters, rec_id);
4540 xsh_params_optextract_check(parameters, rec_id, sizey);
4541 xsh_params_extract_mask_size_check(parameters,rec_id);
4542 } else if (strcmp(rec_id, "xsh_respon_slit_offset") == 0) {
4543 xsh_params_overscan_check(parameters, rec_id);
4544 xsh_params_rectify_check(parameters, rec_id);
4545 xsh_params_localize_check(parameters, rec_id);
4546 xsh_params_crhsingle_check(parameters, rec_id);
4547 xsh_params_extract_mask_size_check(parameters,rec_id);
4548 } else if (strcmp(rec_id, "xsh_respon_slit_nod") == 0) {
4549
4550 //xsh_params_crhsingle_nod_check(parameters, rec_id,arm);
4551 xsh_params_rectify_check(parameters, rec_id);
4552 xsh_params_localize_check(parameters, rec_id);
4553 xsh_params_extract_mask_size_check(parameters,rec_id);
4554 } else if (strcmp(rec_id, "xsh_scired_slit_stare") == 0) {
4555 xsh_params_overscan_check(parameters, rec_id);
4556 xsh_params_sky_bspline_check(parameters, rec_id, biny);
4557 xsh_params_rectify_check(parameters, rec_id);
4558 xsh_params_localize_check(parameters, rec_id);
4559 xsh_params_background_check(parameters, rec_id, sizex, sizey, norders);
4560 xsh_params_crhsingle_check(parameters, rec_id);
4561 xsh_params_optextract_check(parameters, rec_id, sizey);
4562 xsh_params_extract_mask_size_check(parameters,rec_id);
4563 } else if (strcmp(rec_id, "xsh_scired_slit_offset") == 0) {
4564 xsh_params_overscan_check(parameters, rec_id);
4565 xsh_params_rectify_check(parameters, rec_id);
4566 xsh_params_localize_check(parameters, rec_id);
4567 xsh_params_crhsingle_check(parameters, rec_id);
4568 xsh_params_extract_mask_size_check(parameters,rec_id);
4569 } else if (strcmp(rec_id, "xsh_scired_slit_nod") == 0) {
4570 xsh_params_rectify_check(parameters, rec_id);
4571 xsh_params_localize_check(parameters, rec_id);
4572 xsh_params_extract_mask_size_check(parameters,rec_id);
4573 } else if (strcmp(rec_id, "xsh_scired_ifu_offset") == 0) {
4574 xsh_params_rectify_check(parameters, rec_id);
4575 xsh_params_localize_check(parameters, rec_id);
4576 //xsh_params_background_check(parameters, rec_id, sizex, sizey, norders);
4577 xsh_params_crhsingle_check(parameters, rec_id);
4578 } else if (strcmp(rec_id, "xsh_scired_ifu_stare") == 0) {
4579 xsh_params_overscan_check(parameters,rec_id);
4580 xsh_params_rectify_check(parameters, rec_id);
4581 xsh_params_background_check(parameters, rec_id, sizex, sizey, norders);
4582 } else if (strcmp(rec_id, "xsh_absorp") == 0) {
4583 xsh_params_overscan_check(parameters, rec_id);
4584 xsh_params_stack_check(parameters, rec_id);
4585 xsh_params_background_check(parameters, rec_id, sizex, sizey, norders);
4586 xsh_params_crhsingle_check(parameters, rec_id);
4587 xsh_params_rectify_check(parameters, rec_id);
4588 xsh_params_localize_check(parameters, rec_id);
4589
4590 xsh_params_sky_bspline_check(parameters, rec_id, biny);
4591 xsh_params_optextract_check(parameters, rec_id, sizey);
4592 xsh_params_extract_mask_size_check(parameters,rec_id);
4593 } else if (strcmp(rec_id, "xsh_geom_ifu") == 0) {
4594 xsh_params_background_check(parameters, rec_id, sizex, sizey, norders);
4595 xsh_params_crhsingle_check(parameters, rec_id);
4596 xsh_params_rectify_check(parameters, rec_id);
4597 xsh_params_localizeifu_check(parameters, rec_id);
4598 check(xsh_params_correctifu_check(parameters, rec_id));
4599 } else if (strcmp(rec_id, "xsh_scired_ifu_stare_drl") == 0) {
4600 xsh_params_background_check(parameters, rec_id, sizex, sizey, norders);
4601 xsh_params_crhsingle_check(parameters, rec_id);
4602 xsh_params_rectify_check(parameters, rec_id);
4603 xsh_params_localize_check(parameters, rec_id);
4604 xsh_params_extract_mask_size_check(parameters,rec_id);
4605 } else if (strcmp(rec_id, "xsh_scired_ifu_offset_drl") == 0) {
4606 xsh_params_background_check(parameters, rec_id, sizex, sizey, norders);
4607 xsh_params_crhsingle_check(parameters, rec_id);
4608 xsh_params_rectify_check(parameters, rec_id);
4609 xsh_params_localize_check(parameters, rec_id);
4610 xsh_params_extract_mask_size_check(parameters,rec_id);
4611 } else {
4612
4613 xsh_msg_error("Parameter checking for recipe %s not supported", rec_id);
4614
4615 }
4616
4617 if ( arm == XSH_ARM_NIR ) {
4618 xsh_params_overscan_nir_check(parameters, rec_id);
4619 }
4620
4621 cleanup:
4622 return cpl_error_get_code();
4623
4624}
4625
4626
4627cpl_error_code
4628xsh_recipe_params_drs_check(cpl_parameterlist * parameters,xsh_instrument* instrument,const char* rec_id)
4629{
4630 XSH_ARM arm;
4631 int binx=1;
4632 int biny=1;
4633 int sizex=0;
4634 int sizey=0;
4635 //int norders=0;
4636
4638
4639 if ( arm == XSH_ARM_UVB ) {
4642
4643 sizex=UVB_ASIZE;
4644 sizex/=binx;
4645 sizey=UVB_BSIZE;
4646 sizey/=biny;
4647 //norders=UVB_morder;
4648 } else if ( arm == XSH_ARM_AGC ) {
4651
4652 sizex=UVB_ASIZE;
4653 sizex/=binx;
4654 sizey=UVB_BSIZE;
4655 sizey/=biny;
4656 //norders=UVB_morder;
4657 } else if ( arm == XSH_ARM_VIS ) {
4660
4661 sizex=VIS_ASIZE;
4662 sizex/=binx;
4663 sizey=VIS_BSIZE;
4664 sizey/=biny;
4665 //norders=VIS_morder;
4666
4667 } else if ( arm == XSH_ARM_NIR ) {
4668
4669 sizex=NIR_ASIZE;
4670 sizey=NIR_BSIZE;
4671 //norders=NIR_morder;
4672
4673 } else {
4674 xsh_msg_error("arm not supported");
4675 return CPL_ERROR_ILLEGAL_INPUT;
4676 return CPL_ERROR_ILLEGAL_INPUT;
4677 }
4678
4679 if (strcmp(rec_id, "xsh_cfg_recover") == 0) {
4680
4681 } else if (strcmp(rec_id, "xsh_mbias") == 0) {
4682 xsh_params_stacking_check(parameters, rec_id);
4683 xsh_params_compute_ron_check(parameters, rec_id, sizex, sizey);
4684 } else if (strcmp(rec_id, "xsh_mdark") == 0) {
4685 check(xsh_params_crhclip_check(parameters, rec_id));
4686 check(xsh_params_noise_clip_check(parameters, rec_id));
4687 check(xsh_params_compute_ron_check(parameters, rec_id, sizex, sizey));
4688 xsh_params_compute_fpn_check(parameters, rec_id, sizex, sizey);
4689 } else if (strcmp(rec_id, "xsh_mflat") == 0) {
4690 } else if (strcmp(rec_id, "xsh_predict") == 0) {
4691 } else if (strcmp(rec_id, "xsh_orderpos") == 0) {
4692 } else if (strcmp(rec_id, "xsh_2dmap") == 0) {
4693 } else if (strcmp(rec_id, "xsh_geom_ifu") == 0) {
4694 } else if (strcmp(rec_id, "xsh_flexcomp") == 0) {
4695 } else if (strcmp(rec_id, "xsh_wavecal") == 0) {
4696 } else if (strcmp(rec_id, "xsh_respon_slit_stare") == 0) {
4697 } else if (strcmp(rec_id, "xsh_respon_slit_offset") == 0) {
4698 } else if (strcmp(rec_id, "xsh_respon_slit_nod") == 0) {
4699 } else if (strcmp(rec_id, "xsh_scired_slit_stare") == 0) {
4700 } else if (strcmp(rec_id, "xsh_scired_slit_offset") == 0) {
4701 } else if (strcmp(rec_id, "xsh_scired_slit_nod") == 0) {
4702 } else if (strcmp(rec_id, "xsh_scired_ifu_offset") == 0) {
4703 } else if (strcmp(rec_id, "xsh_scired_ifu_stare") == 0) {
4704 } else {
4705
4706 xsh_msg_error("Parameter checking for recipe %s not supported", rec_id);
4707
4708 }
4709
4710 cleanup:
4711 return cpl_error_get_code();
4712
4713}
4714
4715// PIPE-10061
4716/*---------------------------------------------------------------------------*/
4717
4725/*---------------------------------------------------------------------------*/
4726void xsh_parameters_bary_corr_create(const char * recipe_id,
4727 cpl_parameterlist * list,
4729{
4730 /* check parameters */
4731 assure(list != NULL,CPL_ERROR_NULL_INPUT,"parameters list is NULL");
4732
4733 /* Fill the parameter list */
4735 list, recipe_id,
4736 "apply-corr", BARY_CORR_METHOD_PRINT(p.corr_method),
4737 "Method of barycentric correction to be applied (none|bary|helio)"));
4738
4739 cleanup:
4740 return;
4741}
4742
4743/*---------------------------------------------------------------------------*/
4751/*---------------------------------------------------------------------------*/
4753 cpl_parameterlist* list)
4754{
4755 xsh_bary_corr_param* result = NULL;
4756 const char *bary_corr_method = NULL;
4757
4758 /* check parameters */
4759 assure(list != NULL,CPL_ERROR_NULL_INPUT,"parameters list is NULL");
4760
4761 /* allocate the structure */
4762 XSH_MALLOC(result, xsh_bary_corr_param, 1);
4763
4764 /* Fill the structure */
4766 list, recipe_id, "apply-corr"));
4767 if (bary_corr_method == NULL) {
4768 return result ;
4769 }
4770 else if ( strcmp( BARY_CORR_METHOD_PRINT(BARY_CORR_BARY), bary_corr_method) == 0){
4771 result->corr_method = BARY_CORR_BARY;
4772 }
4774 result->corr_method = BARY_CORR_HELIO;
4775 }
4776 else if (strcmp( BARY_CORR_METHOD_PRINT(BARY_CORR_NONE), bary_corr_method) == 0){
4777 result->corr_method = BARY_CORR_NONE;
4778 }
4779 else {
4780 xsh_error_msg("WRONG parameter apply-corr %s", bary_corr_method);
4781 }
4782
4783 cleanup:
4784 if(cpl_error_get_code() != CPL_ERROR_NONE){
4785 cpl_free(result);
4786 result = NULL;
4787 }
4788 return result;
4789}
4790
4791
4792
static int norder
static xsh_instrument * instrument
int binx
int biny
#define XSH_ASSURE_NOT_NULL_MSG(pointer, msg)
Definition: xsh_error.h:103
#define assure(CONDITION, ERROR_CODE,...)
Definition: xsh_error.h:54
#define check(COMMAND)
Definition: xsh_error.h:71
#define xsh_error_msg(...)
Definition: xsh_error.h:94
#define XSH_ASSURE_NOT_NULL(pointer)
Definition: xsh_error.h:99
int xsh_instrument_get_binx(xsh_instrument *instrument)
int xsh_instrument_get_biny(xsh_instrument *instrument)
XSH_ARM xsh_instrument_get_arm(xsh_instrument *i)
Get an arm on instrument structure.
#define xsh_msg_warning(...)
Print an warning message.
Definition: xsh_msg.h:88
#define xsh_msg_error(...)
Print an error message.
Definition: xsh_msg.h:62
#define xsh_msg(...)
Print a message on info level.
Definition: xsh_msg.h:121
int xsh_time_stamp_set(int ts)
set timestamp
Definition: xsh_utils.c:3179
const char * xsh_string_toupper(char *s)
Convert all lowercase characters in a string into uppercase characters.
Definition: xsh_utils.c:4542
int xsh_debug_level_set(int level)
set debug level
Definition: xsh_utils.c:3125
char * xsh_stringcat_any(const char *s,...)
Concatenate an arbitrary number of strings.
Definition: xsh_utils.c:1925
const char * name
enum bary_corr_method corr_method
enum combine_method method
xsh_find_center_method find_center_method
enum extract_method method
enum localize_method method
enum merge_method method
enum optextract_method method
cpl_kernel kernel_type
const char * ron_method
const char * stack_method
enum bspline_sampling bspline_sampling
@ XSH_ARM_AGC
@ XSH_ARM_UVB
@ XSH_ARM_NIR
@ XSH_ARM_VIS
const char * method
Definition: xsh_detmon_lg.c:78
#define max(a, b)
#define UVB_morder
#define NIR_BSIZE
#define NIR_morder
#define VIS_morder
#define UVB_ASIZE
#define VIS_BSIZE
#define UVB_BSIZE
#define NIR_ASIZE
#define VIS_ASIZE
int xsh_parameters_time_stamp_get(const char *recipe_id, const cpl_parameterlist *list)
int xsh_parameters_rectify_fast_get(const char *recipe_id, cpl_parameterlist *list)
double xsh_parameters_wavecal_s_n_get(const char *recipe_id, cpl_parameterlist *list)
cpl_parameter * xsh_parameters_find(cpl_parameterlist *list, const char *recipe_id, const char *name)
find a parameter
xsh_detect_continuum_param * xsh_parameters_detect_continuum_get(const char *recipe_id, cpl_parameterlist *list)
Get the detect continuum parameters in a parameters list.
static cpl_error_code xsh_params_localize_check(cpl_parameterlist *parameters, const char *rec_id)
int xsh_parameters_get_temporary(const char *recipe_id, const cpl_parameterlist *list)
static void xsh_parameters_new_float(cpl_parameterlist *list, const char *recipe_id, const char *name, float value, const char *comment)
void xsh_parameters_ron_create(const char *recipe_id, cpl_parameterlist *list, xsh_ron_param p)
create the RON determination parameters in a parameters list
static cpl_error_code xsh_params_sky_bspline_check(cpl_parameterlist *parameters, const char *rec_id, const int biny)
void xsh_parameters_subtract_sky_single_create(const char *recipe_id, cpl_parameterlist *plist, xsh_subtract_sky_single_param p)
cpl_error_code xsh_parameters_decode_bp_set(const char *rec_id, cpl_parameterlist *parameters, const int ival)
static cpl_error_code xsh_params_localizeifu_check(cpl_parameterlist *parameters, const char *rec_id)
double xsh_parameters_subtract_sky_single_get_kappa(const char *recipe_id, cpl_parameterlist *list)
void xsh_parameters_geom_ifu_mode_create(const char *recipe_id, cpl_parameterlist *list)
void xsh_parameters_pre_overscan(const char *recipe_id, cpl_parameterlist *plist)
int xsh_parameters_subtract_sky_single_get_true(const char *recipe_id, cpl_parameterlist *list)
void xsh_parameters_new_boolean(cpl_parameterlist *list, const char *recipe_id, const char *name, int value, const char *comment)
static void xsh_parameters_new_bool(cpl_parameterlist *list, const char *recipe_id, const char *name, bool value, const char *comment)
void xsh_parameters_wavecal_s_n_create(const char *recipe_id, cpl_parameterlist *list)
void xsh_parameters_clipping_detect_arclines_create(const char *recipe_id, cpl_parameterlist *list, xsh_clipping_param p)
Create the arclines clipping parameters in a parameters list.
void xsh_parameters_stack_create(const char *recipe_id, cpl_parameterlist *list, xsh_stack_param sp)
create the RON determination parameters in a parameters list
int xsh_parameters_get_boolean(const cpl_parameterlist *list, const char *recipe_id, const char *name)
static cpl_error_code xsh_params_stacking_check(cpl_parameterlist *parameters, const char *rec_id)
void xsh_parameters_clipping_tilt_create(const char *recipe_id, cpl_parameterlist *list)
create the xsh_wavecal (function follow_arclines) clipping parameters in a parameters list
xsh_stack_param * xsh_stack_frames_get(const char *recipe_id, cpl_parameterlist *list)
get the detect arclines parameters in a parameters list
static cpl_error_code xsh_params_background_check(cpl_parameterlist *parameters, const char *rec_id, const int sizex, const int sizey, const int norder)
double xsh_parameters_get_double(const cpl_parameterlist *list, const char *recipe_id, const char *name)
static cpl_error_code xsh_parameter_check_int(cpl_parameterlist *parameters, const char *rec_id, const char *pname, const int min, const int max, const int skip_val, const char *spec)
cpl_error_code xsh_parameters_decode_bp(const char *recipe_id, cpl_parameterlist *plist, const int ival)
static cpl_error_code xsh_params_extract_mask_size_check(cpl_parameterlist *parameters, const char *rec_id)
xsh_slit_limit_param * xsh_parameters_slit_limit_get(const char *recipe_id, cpl_parameterlist *list)
int xsh_parameters_geom_ifu_mode_get(const char *recipe_id, cpl_parameterlist *list)
void xsh_parameters_combine_nod_create(const char *recipe_id, cpl_parameterlist *list, xsh_combine_nod_param p)
create the crh clipping parameters in a parameters list
static void xsh_parameters_new_range_double(cpl_parameterlist *list, const char *recipe_id, const char *name, double def, double min, double max, const char *comment)
void xsh_parameters_hot_cold_pix_create(const char *recipe_id, cpl_parameterlist *list, xsh_hot_cold_pix_param p)
create the crh clipping parameters in a parameters list
xsh_localize_obj_param * xsh_parameters_localize_obj_get(const char *recipe_id, cpl_parameterlist *list)
xsh_clipping_param * xsh_parameters_clipping_tilt_get(const char *recipe_id, cpl_parameterlist *list)
get the xsh_wavecal (follow_arclines) clipping parameters in a parameters list
void xsh_parameters_wavecal_range_create(const char *recipe_id, cpl_parameterlist *list)
void xsh_parameters_new_double(cpl_parameterlist *list, const char *recipe_id, const char *name, double value, const char *comment)
int xsh_parameters_subtract_sky_single_get_second(const char *recipe_id, cpl_parameterlist *list)
void xsh_parameters_localize_obj_create(const char *recipe_id, cpl_parameterlist *plist, xsh_localize_obj_param p)
static cpl_error_code xsh_params_detect_continuum_check(cpl_parameterlist *parameters, const char *rec_id)
void xsh_parameters_localize_ifu_create(const char *recipe_id, cpl_parameterlist *plist, xsh_localize_ifu_param p)
static cpl_error_code xsh_params_compute_fpn_check(cpl_parameterlist *parameters, const char *rec_id, const int sizex, const int sizey)
static cpl_error_code xsh_parameter_check_double(cpl_parameterlist *parameters, const char *rec_id, const char *pname, const double min, const double max, const double skip_val, const char *spec)
void xsh_parameters_clipping_crh_create(const char *recipe_id, cpl_parameterlist *list, xsh_clipping_param p)
create the crh clipping parameters in a parameters list
static cpl_error_code xsh_params_optextract_check(cpl_parameterlist *parameters, const char *rec_id, const int sizey)
static cpl_error_code xsh_params_compute_ron_region2_check(cpl_parameterlist *parameters, const char *rec_id, const int sizex, const int sizey)
xsh_extract_param * xsh_parameters_extract_get(const char *recipe_id, cpl_parameterlist *list)
xsh_clipping_param * xsh_parameters_clipping_specres_get(const char *recipe_id, cpl_parameterlist *list)
get the xsh_wavecal (follow_arclines) clipping parameters in a parameters list
void xsh_parameters_merge_ord_create(const char *recipe_id, cpl_parameterlist *plist, int p)
void xsh_parameters_slit_limit_create(const char *recipe_id, cpl_parameterlist *list, xsh_slit_limit_param p)
static cpl_error_code xsh_params_dispersol_check(cpl_parameterlist *parameters, const char *rec_id)
xsh_detect_arclines_param * xsh_parameters_detect_arclines_get(const char *recipe_id, cpl_parameterlist *list)
get the detect arclines parameters in a parameters list
void xsh_parameters_clipping_noise_create(const char *recipe_id, cpl_parameterlist *list, xsh_clipping_param noise_param)
create the crh noise clipping parameters in a parameters list
xsh_interpolate_bp_param * xsh_parameters_interpolate_bp_get(const char *recipe_id, cpl_parameterlist *list)
void xsh_parameters_d2_detect_order_create(const char *recipe_id, cpl_parameterlist *list)
Create the d2 detect order parameters in a parameters list.
double xsh_parameters_optimal_extract_get_kappa(const char *recipe_id, cpl_parameterlist *list)
void xsh_parameters_rectify_create(const char *recipe_id, cpl_parameterlist *plist, xsh_rectify_param p)
void xsh_parameters_ref2_create(const char *recipe_id, cpl_parameterlist *list, xsh_ref_param p)
create the reference region definition parameters in a parameters list
void xsh_parameters_background_create(const char *recipe_id, cpl_parameterlist *list)
create the subtract background parameters in a parameters list
static cpl_error_code xsh_params_detectorder_check(cpl_parameterlist *parameters, const char *rec_id, const int sizex, const int sizey, const int norders)
void xsh_parameters_fpn_create(const char *recipe_id, cpl_parameterlist *list, xsh_fpn_param p)
create the FPN parameters in a parameters list
xsh_clipping_param * xsh_parameters_clipping_dcn_get(const char *recipe_id, cpl_parameterlist *list)
Get the detectcontinuum clipping parameters in a parameters list.
void xsh_parameters_dispersol_create(const char *recipe_id, cpl_parameterlist *list, xsh_dispersol_param p)
Create the dispersol compute parameters in a parameters list.
static cpl_error_code xsh_params_stack_check(cpl_parameterlist *parameters, const char *rec_id)
static cpl_error_code xsh_params_compute_ron_region1_check(cpl_parameterlist *parameters, const char *rec_id, const int sizex, const int sizey)
xsh_opt_extract_param * xsh_parameters_opt_extract_get(const char *recipe_id, cpl_parameterlist *list)
Get the optimal extraction parameters in a parameters list.
static cpl_error_code xsh_params_model_anneal_check(cpl_parameterlist *parameters, const char *rec_id)
void xsh_parameters_interpolate_bp_create(const char *recipe_id, cpl_parameterlist *plist, xsh_interpolate_bp_param p)
static cpl_error_code xsh_params_overscan_nir_check(cpl_parameterlist *parameters, const char *rec_id)
static cpl_error_code xsh_params_spec_res_check(cpl_parameterlist *parameters, const char *rec_id)
void xsh_parameters_extract_create(const char *recipe_id, cpl_parameterlist *plist, xsh_extract_param p, enum extract_method method)
void xsh_parameters_ron_dark_create(const char *recipe_id, cpl_parameterlist *list, xsh_ron_dark_param p)
create the RON determination parameters in a parameters list
int xsh_parameters_debug_level_get(const char *recipe_id, const cpl_parameterlist *list)
static cpl_error_code xsh_params_compute_ron_check(cpl_parameterlist *parameters, const char *rec_id, const int sizex, const int sizey)
void xsh_parameters_ref1_create(const char *recipe_id, cpl_parameterlist *list, xsh_ref_param p)
create the reference region definition parameters in a parameters list
xsh_bary_corr_param * xsh_parameters_bary_corr_get(const char *recipe_id, cpl_parameterlist *list)
get the barycentric correction parameters in a parameters list
xsh_rectify_param * xsh_parameters_rectify_get(const char *recipe_id, cpl_parameterlist *list)
void xsh_parameters_use_model_create(const char *recipe_id, cpl_parameterlist *plist)
void xsh_parameters_bary_corr_create(const char *recipe_id, cpl_parameterlist *list, xsh_bary_corr_param p)
create the barycentric correction parameters in a parameters list
static cpl_error_code xsh_params_compute_ron_mbias_set3_check(cpl_parameterlist *parameters, const char *rec_id, const int sizex, const int sizey)
static const XSH_KERNEL_TYPE xsh_ker_type[]
static cpl_error_code xsh_params_crhsingle_check(cpl_parameterlist *parameters, const char *rec_id)
void xsh_parameters_pd_noise_create(const char *recipe_id, cpl_parameterlist *list, xsh_pd_noise_param p)
create the FPN parameters in a parameters list
static cpl_error_code xsh_params_detect_arclines_check(cpl_parameterlist *parameters, const char *rec_id)
char * xsh_parameters_test_mode_get(const char *recipe_id, const cpl_parameterlist *list)
static cpl_error_code xsh_params_overscan_check(cpl_parameterlist *parameters, const char *rec_id)
xsh_clipping_param * xsh_parameters_clipping_detect_arclines_get(const char *recipe_id, cpl_parameterlist *list)
Get the arclines clipping parameters in a parameters list.
cpl_error_code xsh_recipe_params_drs_check(cpl_parameterlist *parameters, xsh_instrument *instrument, const char *rec_id)
void xsh_parameters_remove_crh_single_create(const char *recipe_id, cpl_parameterlist *plist, xsh_remove_crh_single_param p)
int xsh_parameters_subtract_sky_single_get_niter(const char *recipe_id, cpl_parameterlist *list)
int xsh_parameters_wavecal_range_get(const char *recipe_id, cpl_parameterlist *list)
int xsh_parameters_wavecal_margin_get(const char *recipe_id, cpl_parameterlist *list)
void xsh_parameters_clipping_specres_create(const char *recipe_id, cpl_parameterlist *list)
create the xsh_wavecal (function follow_arclines) clipping parameters in a parameters list
int xsh_parameters_cut_uvb_spectrum_get(const char *recipe_id, const cpl_parameterlist *list)
static cpl_error_code xsh_params_compute_ron_mdark_check(cpl_parameterlist *parameters, const char *rec_id, const int sizex, const int sizey)
xsh_remove_crh_single_param * xsh_parameters_remove_crh_single_get(const char *recipe_id, cpl_parameterlist *list)
int xsh_parameters_get_int(const cpl_parameterlist *list, const char *recipe_id, const char *name)
static cpl_error_code xsh_params_correctifu_check(cpl_parameterlist *parameters, const char *rec_id)
xsh_localize_ifu_param * xsh_parameters_localize_ifu_get(const char *recipe_id, cpl_parameterlist *list)
void xsh_parameters_struct_create(const char *recipe_id, cpl_parameterlist *list, xsh_struct_param p)
create the structX/Y region definition parameters in a parameters list
xsh_clipping_param * xsh_parameters_clipping_noise_get(const char *recipe_id, cpl_parameterlist *list)
get the noise clipping parameters in a parameters list
void xsh_parameters_detect_continuum_create(const char *recipe_id, cpl_parameterlist *list, xsh_detect_continuum_param par)
create the detect continuum parameter "window" in a parameters list
xsh_combine_nod_param * xsh_parameters_combine_nod_get(const char *recipe_id, cpl_parameterlist *list)
get the combine nod parameters in a parameters list
static cpl_error_code xsh_params_rectify_check(cpl_parameterlist *parameters, const char *rec_id)
xsh_clipping_param * xsh_parameters_clipping_crh_get(const char *recipe_id, cpl_parameterlist *list)
get the crh clipping parameters in a parameters list
xsh_subtract_sky_single_param * xsh_parameters_subtract_sky_single_get(const char *recipe_id, cpl_parameterlist *list)
void xsh_parameters_optimal_extract_create(const char *recipe_id, cpl_parameterlist *plist, int p)
cpl_parameterlist * xsh_parameters_create_from_drs_table(const cpl_table *tab)
void xsh_parameters_generic(const char *recipe_id, cpl_parameterlist *plist)
static void set_rectify_kernel_type(xsh_rectify_param *recpar)
void xsh_parameters_detect_arclines_create(const char *recipe_id, cpl_parameterlist *list, xsh_detect_arclines_param p)
create the detect arclines parameters in a parameters list
static void xsh_parameters_new_range_int(cpl_parameterlist *list, const char *recipe_id, const char *name, int def, int min, int max, const char *comment)
cpl_error_code xsh_recipe_params_check(cpl_parameterlist *parameters, xsh_instrument *instrument, const char *rec_id)
int xsh_parameters_subtract_sky_single_get_first(const char *recipe_id, cpl_parameterlist *list)
void xsh_parameters_new_string(cpl_parameterlist *list, const char *recipe_id, const char *name, const char *value, const char *comment)
void xsh_parameters_new_int(cpl_parameterlist *list, const char *recipe_id, const char *name, int value, const char *comment)
xsh_detect_order_param * xsh_parameters_detect_order_get(const char *recipe_id, cpl_parameterlist *list, cpl_parameterlist *drs)
Get the detect orders parameters in a parameters list.
void xsh_parameters_dosky_domap_get(const char *recipe_id, cpl_parameterlist *list, cpl_frame *wavemap_frame, cpl_frame *slitmap_frame, int *dosky, int *domap)
xsh_d2_detect_order_param * xsh_parameters_d2_detect_order_get(const char *recipe_id, cpl_parameterlist *list)
Get the d2 detect orders parameters in a parameters list.
xsh_compute_response_param * xsh_parameters_compute_response_get(const char *recipe_id, cpl_parameterlist *list)
int xsh_parameters_use_model_get(const char *recipe_id, const cpl_parameterlist *plist)
xsh_merge_param * xsh_parameters_merge_ord_get(const char *recipe_id, cpl_parameterlist *list)
static cpl_error_code xsh_params_noise_clip_check(cpl_parameterlist *parameters, const char *rec_id)
xsh_dispersol_param * xsh_parameters_dispersol_get(const char *recipe_id, cpl_parameterlist *list)
Get the dispersion solution compute parameters in a parameters list.
void xsh_parameters_compute_response_create(const char *recipe_id, cpl_parameterlist *plist, xsh_compute_response_param p)
void xsh_parameters_detect_order_create(const char *recipe_id, cpl_parameterlist *list)
Create the detect order parameters in a parameters list.
xsh_background_param * xsh_parameters_background_get(const char *recipe_id, cpl_parameterlist *list)
get the background parameters in a parameters list
void xsh_parameters_opt_extract_create(const char *recipe_id, cpl_parameterlist *list, xsh_opt_extract_param p)
Create the optimal extraction parameters in a parameters list.
void xsh_parameters_clipping_dcn_create(const char *recipe_id, cpl_parameterlist *list)
create the DetectContiNuum clipping parameters in a parameters list
void xsh_parameters_wavecal_margin_create(const char *recipe_id, cpl_parameterlist *list)
char * xsh_parameters_get_string(const cpl_parameterlist *list, const char *recipe_id, const char *name)
static cpl_error_code xsh_params_tilt_clip_check(cpl_parameterlist *parameters, const char *rec_id)
static cpl_error_code xsh_params_follow_arclines_check(cpl_parameterlist *parameters, const char *rec_id)
static cpl_error_code xsh_params_crhclip_check(cpl_parameterlist *parameters, const char *rec_id)
#define LOCALIZE_METHOD_PRINT(method)
#define SKY_METHOD_PRINT(method)
#define DECODE_BP_FLAG_DEF
bspline_sampling
@ UNIFORM
@ FINE
@ GENERAL_METHOD
@ GAUSS_METHOD
@ BSPLINE_METHOD4
@ MEDIAN_METHOD
@ BSPLINE_METHOD2
@ BSPLINE_METHOD
@ BSPLINE_METHOD5
@ BSPLINE_METHOD1
@ BSPLINE_METHOD3
@ COMBINE_MEAN_METHOD
@ COMBINE_MEDIAN_METHOD
@ XSH_GAUSSIAN_METHOD
@ XSH_BARYCENTER_METHOD
#define EXTRACT_METHOD_PRINT(method)
#define OPTEXTRACT_METHOD_PRINT(method)
bary_corr_method
@ BARY_CORR_NONE
@ BARY_CORR_HELIO
@ BARY_CORR_BARY
#define WAVECAL_MARGIN_DEFAULT
#define DECODE_BP_FLAG_MAX
#define COMBINE_METHOD_PRINT(method)
#define BARY_CORR_METHOD_PRINT(corr_method)
@ LOC_MAXIMUM_METHOD
@ LOC_GAUSSIAN_METHOD
@ LOC_MANUAL_METHOD
extract_method
@ FULL_METHOD
@ NOD_METHOD
@ LOCALIZATION_METHOD
@ CLEAN_METHOD
#define WAVECAL_RANGE_DEFAULT
#define BSPLINE_SAMPLING_PRINT(method)
#define XSH_FREE(POINTER)
Definition: xsh_utils.h:92
@ XSH_DEBUG_LEVEL_HIGH
Definition: xsh_utils.h:138
@ XSH_DEBUG_LEVEL_NONE
Definition: xsh_utils.h:137
@ XSH_DEBUG_LEVEL_LOW
Definition: xsh_utils.h:137
@ XSH_DEBUG_LEVEL_MEDIUM
Definition: xsh_utils.h:138
#define XSH_MALLOC(POINTER, TYPE, SIZE)
Definition: xsh_utils.h:49