51 #include <irplib_utils.h>
54 #include <sinfo_pro_types.h>
55 #include <sinfo_product_config.h>
56 #include <sinfo_prepare_stacked_frames_config.h>
57 #include <sinfo_objnod_config.h>
58 #include <sinfo_new_objnod.h>
59 #include <sinfo_new_prepare_stacked_frames.h>
60 #include <sinfo_pro_save.h>
61 #include <sinfo_raw_types.h>
62 #include <sinfo_functions.h>
63 #include <sinfo_tpl_utils.h>
64 #include <sinfo_tpl_dfs.h>
65 #include <sinfo_hidden.h>
66 #include <sinfo_globals.h>
67 #include <sinfo_rec_utils.h>
73 static int sinfo_utl_illumcorr_create(cpl_plugin *plugin);
74 static int sinfo_utl_illumcorr_exec(cpl_plugin *plugin);
75 static int sinfo_utl_illumcorr_destroy(cpl_plugin *plugin);
76 static int sinfo_utl_illumcorr(cpl_parameterlist *config, cpl_frameset *set);
79 #define SINFO_DOUBLE_SWAP(a,b) { register double t=(a);(a)=(b);(b)=t; }
82 sinfo_tools_sort_double(
87 sinfo_get_dummy_object(cpl_frameset* obj_set);
90 sinfo_illumcorr_config_add (cpl_parameterlist *list);
93 create_illumcorr (
const char* plugin_id,
94 cpl_parameterlist *cpl_cfg,
98 sinfo_illumcorr_create_bins (cpl_imagelist *sky,
99 int llx,
int lly,
int urx,
int ury,
107 sinfo_juha_function1d_natural_spline(
double *,
double *,
int,
double *,
111 sinfo_function1d_search_value(
double *,
int,
double,
int *) ;
114 sinfo_vector_filter_median_create(
const cpl_vector * v,
int hw);
117 sinfo_juha_vector_filter_median_create(
const cpl_vector * v,
int hw);
120 sinfo_image_get_median_window (
const cpl_image *image,
121 int llx,
int lly,
int urx,
int ury);
128 static char sinfo_utl_illumcorr_description1[] =
129 "This recipe calculates illumination correction based on sky emission.\n"
130 "The input files are sky (or object) frames tagged\n"
131 " SKY_NODDING (OBJECT_NODDING)\n"
132 "Master calibration frames:\n";
135 static char sinfo_utl_illumcorr_description2[] =
136 "A corresponding (DIT) dark frame (tag=MASTER_DARK)"
137 "A corresponding (band,preoptics) wavelength map image (tag=WAVE_MAP)\n"
138 "A corresponding (band,preoptics) master flat field (tag=MASTER_FLAT_LAMP)\n"
139 "A corresponding (band,preoptics) master bad pixel map (tag=MASTER_BP_MAP)\n"
140 "A corresponding (band,preoptics) slitlets position frame (tag=SLIT_POS)\n"
141 "A corresponding (band) distortion table (tag=DISTORTION)\n"
142 "A corresponding (band) slitlet distance table (tag=SLITLETS_DISTANCE)\n";
145 static char sinfo_utl_illumcorr_description3[] =
146 "The output is a cube resulting from the analysis of sky emission\n"
150 static char sinfo_utl_illumcorr_description[1300];
164 sinfo_utl_illumcorr_create(cpl_plugin *plugin)
172 cpl_recipe *recipe = (cpl_recipe *)plugin;
173 recipe->parameters = cpl_parameterlist_new();
174 if(recipe->parameters == NULL) {
183 sinfo_product_config_add (recipe->parameters);
184 sinfo_prepare_stacked_frames_config_add(recipe->parameters);
185 sinfo_objnod_config_add(recipe->parameters);
186 sinfo_illumcorr_config_add (recipe->parameters);
200 sinfo_utl_illumcorr_exec(cpl_plugin *plugin)
203 cpl_recipe *recipe = (cpl_recipe *) plugin;
205 cpl_errorstate initial_errorstate = cpl_errorstate_get();
207 if(recipe->parameters == NULL) {
210 if(recipe->frames == NULL) {
213 code=sinfo_utl_illumcorr(recipe->parameters, recipe->frames);
215 if (!cpl_errorstate_is_equal(initial_errorstate)) {
218 cpl_errorstate_dump(initial_errorstate, CPL_FALSE, NULL);
233 sinfo_utl_illumcorr_destroy(cpl_plugin *plugin)
235 cpl_recipe *recipe = (cpl_recipe *) plugin;
242 cpl_parameterlist_delete(recipe->parameters);
261 cpl_recipe *recipe = cpl_calloc(1,
sizeof *recipe);
262 cpl_plugin *plugin = &recipe->interface;
264 strcpy(sinfo_utl_illumcorr_description,sinfo_utl_illumcorr_description1);
265 strcat(sinfo_utl_illumcorr_description,sinfo_utl_illumcorr_description2);
266 strcat(sinfo_utl_illumcorr_description,sinfo_utl_illumcorr_description3);
268 cpl_plugin_init(plugin,
270 SINFONI_BINARY_VERSION,
271 CPL_PLUGIN_TYPE_RECIPE,
272 "sinfo_utl_illumcorr",
273 "Object data reduction",
274 sinfo_utl_illumcorr_description,
276 "reunanen@strw.leidenuniv.nl",
278 sinfo_utl_illumcorr_create,
279 sinfo_utl_illumcorr_exec,
280 sinfo_utl_illumcorr_destroy);
282 cpl_pluginlist_append(list, plugin);
293 sinfo_utl_illumcorr(cpl_parameterlist *config, cpl_frameset *set)
295 char outname[FILE_NAME_SZ];
306 cpl_frameset * obj_set=NULL;
307 cpl_frameset * sky_set=NULL;
308 cpl_frameset * cdb_set=NULL;
309 cpl_frameset * wrk_set=NULL;
310 cpl_frameset * stk_set=NULL;
311 cpl_frame * sky_frm=NULL;
313 cpl_frame * wrk_frm=NULL;
314 cpl_frameset * ref_set=NULL;
316 cpl_frame * dark_frm=NULL;
321 cpl_image * ima1=NULL ;
322 cpl_image * ima2=NULL ;
323 cpl_image * resima=NULL ;
324 cpl_propertylist * plist=NULL ;
325 cpl_frame * product_frame=NULL;
326 const char *name_i=NULL;
329 sinfo_msg(
"Welcome to SINFONI Pipeline release %d.%d.%d",
330 SINFONI_MAJOR_VERSION,SINFONI_MINOR_VERSION,SINFONI_MICRO_VERSION);
332 if(sinfo_dfs_set_groups(set)) {
337 dark_frm = cpl_frameset_find(set,PRO_MASTER_DARK);
338 if (dark_frm == NULL) {
343 ref_set=cpl_frameset_duplicate(set);
345 obj_set=cpl_frameset_new();
346 sky_set=cpl_frameset_new();
347 cdb_set=cpl_frameset_new();
348 fk = sinfo_fake_new();
350 sinfo_extract_obj_frames(set,obj_set);
351 sinfo_extract_sky_frames(set,sky_set);
352 sinfo_extract_mst_frames(set,cdb_set);
354 nobj=cpl_frameset_get_size(obj_set);
355 nsky=cpl_frameset_get_size(sky_set);
356 ncdb=cpl_frameset_get_size(cdb_set);
358 if ((nobj==0) && (nsky==0)) {
360 cpl_frameset_delete(obj_set);
361 cpl_frameset_delete(sky_set);
362 cpl_frameset_delete(cdb_set);
363 cpl_frameset_delete(ref_set);
364 sinfo_fake_delete(&fk);
374 if( (sky_frm = sinfo_get_dummy_object(sky_set)) == NULL) {
376 cpl_frameset_delete(obj_set);
377 cpl_frameset_delete(sky_set);
378 cpl_frameset_delete(cdb_set);
379 cpl_frameset_delete(ref_set);
380 sinfo_fake_delete(&fk);
385 if( (sky_frm = sinfo_get_dummy_object(obj_set)) == NULL) {
387 cpl_frameset_delete(obj_set);
388 cpl_frameset_delete(sky_set);
389 cpl_frameset_delete(cdb_set);
390 cpl_frameset_delete(ref_set);
391 sinfo_fake_delete(&fk);
400 ima1 = cpl_image_load(cpl_frame_get_filename(sky_frm),CPL_TYPE_FLOAT,0,0);
401 ima2 = cpl_image_load(cpl_frame_get_filename(dark_frm),CPL_TYPE_FLOAT,0,0);
402 resima = cpl_image_subtract_create(ima1, ima2);
403 plist=cpl_propertylist_load(cpl_frame_get_filename(sky_frm), 0);
404 cpl_image_delete(ima1);
405 cpl_image_delete(ima2);
407 product_frame = cpl_frame_new();
408 cpl_frame_set_filename(product_frame,
"out_fake_object2.fits") ;
409 cpl_frame_set_tag(product_frame,
"OBJECT_NODDING") ;
410 cpl_frame_set_type(product_frame, CPL_FRAME_TYPE_IMAGE) ;
411 cpl_frame_set_group(product_frame, CPL_FRAME_GROUP_RAW) ;
413 cpl_propertylist_erase_regexp(plist,
"^ESO PRO CATG",0);
415 cpl_image_save(resima,
"out_fake_object2.fits", CPL_BPP_IEEE_FLOAT, plist,
417 cpl_propertylist_delete(plist) ;
418 cpl_image_delete(resima) ;
424 wrk_set=cpl_frameset_new();
426 cpl_frame* dup_frm=cpl_frame_duplicate(product_frame);
427 cpl_frame_set_tag (dup_frm,
"OBJECT_NODDING");
428 cpl_frame_set_group (dup_frm ,CPL_FRAME_GROUP_RAW);
429 cpl_frameset_insert(wrk_set,dup_frm);
432 for(k=0;k<ncdb;k++) {
433 cpl_frame* cdb_frm=cpl_frameset_get_frame(cdb_set,k);
434 dup_frm=cpl_frame_duplicate(cdb_frm);
435 cpl_frameset_insert(wrk_set,dup_frm);
440 sprintf(outname,
"%s%d%s",
"out_stack",i,
".fits");
441 if(-1 == sinfo_new_stack_frames(config,wrk_set,
442 PRO_OBJECT_NODDING_STACKED,i,fk,cpl_func)) {
444 cpl_frameset_delete(wrk_set);
446 cpl_frameset_delete(obj_set);
447 cpl_frameset_delete(sky_set);
448 cpl_frameset_delete(cdb_set);
449 cpl_frameset_delete(ref_set);
450 sinfo_fake_delete(&fk);
454 stk_set=cpl_frameset_new();
455 sinfo_contains_frames_kind(wrk_set,stk_set,PRO_STACKED);
456 nstk=cpl_frameset_get_size(stk_set);
458 for(k=0;k<nstk;k++) {
459 wrk_frm=cpl_frameset_get_frame(stk_set,k);
460 dup_frm = cpl_frame_duplicate(wrk_frm);
461 cpl_frameset_insert(set,dup_frm);
463 cpl_frameset_delete(stk_set);
464 cpl_frameset_delete(wrk_set);
466 sinfo_msg(
"------------------------------") ;
467 sinfo_msg(
"CREATING SKY CUBE");
468 sinfo_msg(
"------------------------------") ;
471 if ( -1 == (ind=sinfo_new_objnod(cpl_func,config, set, PRO_COADD_OBJ ) ) ) {
473 cpl_frameset_delete(obj_set);
474 cpl_frameset_delete(sky_set);
475 cpl_frameset_delete(cdb_set);
476 cpl_frameset_delete(ref_set);
477 sinfo_fake_delete(&fk);
481 sinfo_msg(
"------------------------------") ;
482 sinfo_msg(
"CREATED SKY CUBE");
483 sinfo_msg(
"------------------------------") ;
486 stk_set=cpl_frameset_new();
487 sinfo_contains_frames_kind(set, stk_set, PRO_OBS_OBJ);
490 wrk_frm=cpl_frameset_get_frame(stk_set,0);
491 name_i = cpl_frame_get_filename(wrk_frm);
495 cpl_frameset_delete(obj_set);
496 cpl_frameset_delete(sky_set);
497 cpl_frameset_delete(cdb_set);
498 cpl_frameset_delete(ref_set);
499 sinfo_fake_delete(&fk);
500 cpl_frame_delete(sky_frm);
501 create_illumcorr (cpl_func, config, set, name_i);
509 sinfo_get_dummy_object(cpl_frameset* obj_set)
512 cpl_imagelist* obj_list=NULL;
513 cpl_image* fake_object=NULL;
514 char filename[FILE_NAME_SZ];
515 cpl_frame* frame=NULL;
516 cpl_frame* object_frame=NULL;
518 cpl_propertylist* plist=NULL;
520 obj_list = cpl_imagelist_load_frameset(obj_set,CPL_TYPE_FLOAT,0,0);
521 fake_object = cpl_imagelist_collapse_median_create(obj_list);
523 frame = cpl_frameset_get_frame(obj_set,0);
524 strcpy(filename,cpl_frame_get_filename(frame));
526 if ((cpl_error_code)((plist = cpl_propertylist_load(filename, 0)) == NULL)) {
527 sinfo_msg_error(
"getting header from reference ima frame %s",filename);
528 cpl_propertylist_delete(plist) ;
532 if (cpl_propertylist_has(plist, KEY_NAME_DPR_TYPE)) {
533 cpl_propertylist_set_string(plist, KEY_NAME_DPR_TYPE,
"OBJECT");
535 cpl_propertylist_append_string(plist, KEY_NAME_DPR_TYPE,
"OBJECT") ;
538 if (cpl_image_save(fake_object,
"out_fake_object.fits", CPL_BPP_IEEE_FLOAT,
539 plist,CPL_IO_DEFAULT)!=CPL_ERROR_NONE) {
541 cpl_propertylist_delete(plist) ;
544 cpl_propertylist_delete(plist);
546 object_frame = cpl_frame_new() ;
547 cpl_frame_set_filename(object_frame,
"out_fake_object.fits") ;
548 cpl_frame_set_tag(object_frame,
"OBJECT") ;
549 cpl_frame_set_type(object_frame, CPL_FRAME_TYPE_IMAGE);
553 cpl_frame_set_level(object_frame, CPL_FRAME_LEVEL_FINAL);
554 cpl_image_delete(fake_object);
555 cpl_imagelist_delete(obj_list);
561 sinfo_illumcorr_config_add (cpl_parameterlist *list)
569 p = cpl_parameter_new_range(
"sinfoni.illumcorr.spec_bin",
571 "Number of spectral planes to be combined ",
574 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI,
"illumcorr-spec_bin");
575 cpl_parameterlist_append(list, p);
577 p = cpl_parameter_new_value(
"sinfoni.illumcorr.min_flux",
579 "Minimum flux in each spectral bin ",
582 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI,
"illumcorr-min_flux");
583 cpl_parameterlist_append(list, p);
585 p = cpl_parameter_new_value(
"sinfoni.illumcorr.center_bins",
587 "Center the spectral bins at prominent "
588 "emission features ",
591 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI,
"illumcorr-center_bins");
592 cpl_parameterlist_append(list, p);
594 p = cpl_parameter_new_enum(
"sinfoni.illumcorr.order",
596 "The order of the polynomial to be fitted "
601 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI,
"illumcorr-order");
602 cpl_parameterlist_append(list, p);
604 p = cpl_parameter_new_value(
"sinfoni.illumcorr.sigma",
606 "Reject n-sigma deviant pixels on each slitlet ",
609 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI,
"illumcorr-sigma");
610 cpl_parameterlist_append(list, p);
612 p = cpl_parameter_new_value(
"sinfoni.illumcorr.iterations",
614 "Number of sigma rejection iterations to run ",
617 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI,
"illumcorr-iter");
618 cpl_parameterlist_append(list, p);
620 p = cpl_parameter_new_range(
"sinfoni.illumcorr.llx",
622 "Reference region coordinates ",
625 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI,
"illumcorr-llx");
626 cpl_parameterlist_append(list, p);
628 p = cpl_parameter_new_range(
"sinfoni.illumcorr.lly",
630 "Reference region coordinates ",
633 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI,
"illumcorr-lly");
634 cpl_parameterlist_append(list, p);
636 p = cpl_parameter_new_range(
"sinfoni.illumcorr.urx",
638 "Reference region coordinates ",
641 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI,
"illumcorr-urx");
642 cpl_parameterlist_append(list, p);
644 p = cpl_parameter_new_range(
"sinfoni.illumcorr.ury",
646 "Reference region coordinates ",
649 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI,
"illumcorr-ury");
650 cpl_parameterlist_append(list, p);
652 p = cpl_parameter_new_enum(
"sinfoni.illumcorr.smooth0",
654 "Smooth zeroth order terms by fitting "
655 "with polynomial (1),"
656 "with median filter (2) or not (0) ",
660 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI,
"illumcorr-smooth0");
661 cpl_parameterlist_append(list, p);
663 p = cpl_parameter_new_value(
"sinfoni.illumcorr.smooth0_order",
665 "Order of the smoothing polynomial for 0th term",
668 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI,
"illumcorr-smooth_order0");
669 cpl_parameterlist_append(list, p);
671 p = cpl_parameter_new_range(
"sinfoni.illumcorr.smooth0_size",
673 "Size of the median filter for 0th "
677 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI,
"illumcorr-smooth0_size");
678 cpl_parameterlist_append(list, p);
680 p = cpl_parameter_new_value(
"sinfoni.illumcorr.smooth1",
682 "Smooth higher (>0) order polynomials ",
685 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI,
"illumcorr-smooth");
686 cpl_parameterlist_append(list, p);
688 p = cpl_parameter_new_value(
"sinfoni.illumcorr.smooth1_order",
690 "Smoothing order for higher terms ",
693 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI,
"illumcorr-smooth_order");
694 cpl_parameterlist_append(list, p);
696 p = cpl_parameter_new_value(
"sinfoni.illumcorr.illumcorr_sigma",
698 "Reject all fits for which the rms is "
699 "illumcorr-sigma times bigger than the "
700 "median rms in each spectral bin" ,
703 cpl_parameter_set_alias(p,CPL_PARAMETER_MODE_CLI,
704 "illumcorr-illumcorr_sigma");
705 cpl_parameterlist_append(list, p);
710 create_illumcorr (
const char* plugin_id,
711 cpl_parameterlist *cpl_cfg,
715 cpl_parameter *p=NULL;
721 cpl_imagelist *sky=NULL;
722 cpl_imagelist *binnedsky=NULL;
723 cpl_imagelist *result=NULL;
724 cpl_image *temp_image=NULL;
725 cpl_image *temp_image2=NULL;
738 double *inter_pos=NULL;
739 double *inter_val=NULL;
740 double *plane_pos=NULL;
741 double *plane_val=NULL;
748 cpl_vector *row=NULL;
749 cpl_vector *model=NULL;
750 cpl_vector *xpos=NULL;
751 cpl_vector *tempvector=NULL;
752 cpl_vector *tempvector2=NULL;
755 cpl_polynomial*poly=NULL;
756 cpl_polynomial *poly2=NULL;
757 double *temparray=NULL;
758 double *tempxarray=NULL;
759 double * tempsarray=NULL;
760 cpl_polynomial**coeffs=NULL;
762 double *rms_values=NULL;
763 double rms_array[32];
786 p = cpl_parameterlist_find(cpl_cfg,
"sinfoni.illumcorr.spec_bin");
787 spec_bin = cpl_parameter_get_int(p);
788 p = cpl_parameterlist_find(cpl_cfg,
"sinfoni.illumcorr.min_flux");
789 min_flux = cpl_parameter_get_double(p);
790 p = cpl_parameterlist_find(cpl_cfg,
"sinfoni.illumcorr.order");
791 _order = cpl_parameter_get_int(p);
792 p = cpl_parameterlist_find(cpl_cfg,
"sinfoni.illumcorr.sigma");
793 sigma = cpl_parameter_get_double(p);
794 p = cpl_parameterlist_find(cpl_cfg,
"sinfoni.illumcorr.llx");
795 llx = cpl_parameter_get_int(p);
796 p = cpl_parameterlist_find(cpl_cfg,
"sinfoni.illumcorr.lly");
797 lly = cpl_parameter_get_int(p);
798 p = cpl_parameterlist_find(cpl_cfg,
"sinfoni.illumcorr.urx");
799 urx = cpl_parameter_get_int(p);
800 p = cpl_parameterlist_find(cpl_cfg,
"sinfoni.illumcorr.ury");
801 ury = cpl_parameter_get_int(p);
802 p = cpl_parameterlist_find(cpl_cfg,
"sinfoni.illumcorr.illumcorr_sigma");
803 il_sigma = cpl_parameter_get_double(p);
805 p = cpl_parameterlist_find(cpl_cfg,
"sinfoni.illumcorr.smooth0");
806 smooth0 = cpl_parameter_get_int (p);
807 p = cpl_parameterlist_find(cpl_cfg,
"sinfoni.illumcorr.smooth0_order");
808 smooth_order0 = cpl_parameter_get_int (p);
809 p = cpl_parameterlist_find(cpl_cfg,
"sinfoni.illumcorr.smooth0_size");
810 smooth_size0 = cpl_parameter_get_int (p);
812 p = cpl_parameterlist_find(cpl_cfg,
"sinfoni.illumcorr.smooth1");
813 smooth = cpl_parameter_get_bool (p);
814 p = cpl_parameterlist_find(cpl_cfg,
"sinfoni.illumcorr.smooth1_order");
815 smooth_order = cpl_parameter_get_int (p);
817 p = cpl_parameterlist_find(cpl_cfg,
"sinfoni.illumcorr.iterations");
818 iter = cpl_parameter_get_int (p);
820 p = cpl_parameterlist_find(cpl_cfg,
"sinfoni.illumcorr.center_bins");
821 center_bins = cpl_parameter_get_bool (p);
828 sky = cpl_imagelist_load(name_i, CPL_TYPE_FLOAT, 0);
829 nplanes = cpl_imagelist_get_size(sky);
836 && isnan(cpl_image_get_mean_window(cpl_imagelist_get(sky, z1),
837 llx, lly, urx, ury)))
840 && isnan(cpl_image_get_mean_window(cpl_imagelist_get(sky, z2),
841 llx, lly, urx, ury)))
845 if (z1>=nplanes || z2 <0 || z2<=z1) {
847 cpl_imagelist_delete (sky);
850 sinfo_msg (
"Start z = %d, end z = %d", z1, z2);
852 binnedsky = cpl_imagelist_new ();
853 median = (
double*) cpl_calloc(nplanes/spec_bin,
sizeof(
double));
854 pos = (
double*) cpl_calloc(nplanes/spec_bin,
sizeof(
double));
855 temparray = (
double*) cpl_calloc(64,
sizeof(
double));
856 tempxarray= (
double*) cpl_calloc(64,
sizeof(
double));
857 tempsarray= (
double*) cpl_calloc (nplanes/spec_bin,
sizeof(
double));
858 plane_pos = (
double*) cpl_calloc (nplanes/spec_bin,
sizeof(
double));
859 plane_val = (
double*) cpl_calloc (nplanes/spec_bin,
sizeof(
double));
860 coeffs = (cpl_polynomial**) cpl_calloc(32*(nplanes/spec_bin),
861 sizeof(cpl_polynomial*));
862 rms_values= (
double*) cpl_calloc (32*(nplanes/spec_bin),
sizeof (double));
863 inter_pos = (
double*) cpl_calloc (nplanes,
sizeof(
double));
864 inter_val = (
double*) cpl_calloc (nplanes,
sizeof(
double));
866 model = cpl_vector_new(64);
867 xpos = cpl_vector_new(64);
870 cpl_vector_set(xpos, i, (
double)(i)-((
double)urx-(
double)llx)/2.0);
871 for (i=0; i<nplanes; i++)
872 inter_pos[i] = (
double)i;
883 if (center_bins == 1) {
884 sinfo_msg(
"Using centering on emission features\n");
885 nbins = sinfo_illumcorr_create_bins (sky,llx, lly, urx, ury,
887 &bin_start, &bin_end,
891 sinfo_msg(
"Using simple spectral binning - "
892 "not centering on emission features\n");
893 nbins = (z2-z1)/spec_bin;
894 bin_start = (
int*)cpl_calloc(nbins+1,
sizeof(
int));
895 bin_end = (
int*)cpl_calloc(nbins+1,
sizeof(
int));
896 for (i = 0; i<nbins; i++) {
897 bin_start[i] = z1+i*spec_bin;
898 bin_end[i] = z1+(i+1)*spec_bin - 1;
900 if (bin_end[nbins-1]<z2-spec_bin/10) {
901 bin_start[nbins] = bin_end[nbins-1]+1;
913 sinfo_msg(
"Binning the cube and calculating statistics\n");
914 for (i=0; i<nbins; i++) {
915 temp_image = cpl_image_duplicate(cpl_imagelist_get(sky, bin_start[i]));
916 median[i] = sinfo_image_get_median_window (temp_image, llx, lly, urx, ury);
917 pos[i] = median[i] * (double)bin_start[i];
918 cpl_imagelist_set (binnedsky, temp_image, i);
919 for (j=bin_start[i]+1; j<bin_end[i]; j++) {
920 temp_image2 = cpl_imagelist_get (sky, j);
921 cpl_image_add (temp_image, temp_image2);
922 temp = sinfo_image_get_median_window (temp_image2, llx, lly, urx, ury);
923 median[i] = median[i] + temp;
924 pos[i] = pos[i] + temp*(double)j;
926 temp2 =(double)(bin_end[i]-bin_start[i]+1);
927 cpl_image_divide_scalar (temp_image, temp2);
928 pos[i] = pos[i]/median[i];
929 median[i] = median[i] / temp2;
933 sinfo_msg(
"Fitting slitlets between x=%d - x=%d\n", llx, urx);
934 sinfo_msg(
"Fitting order %d\n", _order);
935 for (k=0;k<nbins; k++) {
936 if (median[k]>min_flux) {
937 for (j=0; j<32; j++) {
938 row=cpl_vector_new_from_image_row(cpl_imagelist_get(binnedsky,k),2*j+1);
940 for (i=llx; i<=urx; i++) {
941 if (!isnan(cpl_vector_get(row, i))) {
943 temparray[n] = cpl_vector_get(row, i);
944 tempxarray[n] = cpl_vector_get(xpos, i);
953 tempvector = cpl_vector_wrap (n, temparray);
954 tempvector2= cpl_vector_wrap (n, tempxarray);
955 poly = cpl_polynomial_fit_1d_create (tempvector2, tempvector,
959 sinfo_msg(
"Fitting failed (plane %d, row %d): %s",
960 k, j, (
char* ) cpl_error_get_message());
962 if (sigma>0 && iter>0) {
963 for (kk = 0; kk<iter; kk++) {
964 cpl_vector_fill_polynomial (model, poly, 0.0, 1.0);
965 cpl_vector_subtract (model, row);
969 for (i=llx; i<=urx; i++)
971 temparray[n++] = cpl_vector_get(model, i);
972 stddev = cpl_vector_get_stdev(tempvector);
974 for (i=llx; i<=urx; i++)
976 if (fabs(cpl_vector_get(model, i))>(stddev*sigma))
981 for (i=llx; i<=urx; i++) {
983 temparray[n] = cpl_vector_get(row, i);
984 tempxarray[n] = cpl_vector_get(xpos, i);
988 cpl_polynomial_delete(poly);
990 cpl_vector_unwrap (tempvector);
991 cpl_vector_unwrap (tempvector2);
992 tempvector = cpl_vector_wrap (n, temparray);
993 tempvector2= cpl_vector_wrap (n, tempxarray);
994 stddev = cpl_vector_get_stdev(tempvector);
996 poly = cpl_polynomial_fit_1d_create (tempvector2,
1011 coeffs[j*nbins+k] = poly;
1012 rms_values[j*nbins+k] = sqrt(mse);
1015 coeffs[j*nbins+k] = NULL;
1017 cpl_vector_unwrap (tempvector);
1018 cpl_vector_unwrap (tempvector2);
1020 cpl_vector_delete(row);
1028 sinfo_msg(
"Writing dat out_illum.dat\n");
1029 dumpfile = fopen (
"out_illum.dat",
"w");
1030 fprintf (dumpfile,
"# slitlet, pos, median, rms, coeff0, coeff1...\n");
1031 for (slitlet = 0; slitlet<32; slitlet++)
1032 for (bin=0; bin<nbins; bin++) {
1033 poly = coeffs[slitlet*nbins+bin];
1035 fprintf (dumpfile,
"%d %f %f %f ",slitlet, pos[bin],
1037 rms_values[slitlet*nbins+bin]);
1038 for (i=0; i<(cpl_polynomial_get_degree(poly)+1); i++) {
1039 temp = cpl_polynomial_get_coeff (poly, &i);
1040 fprintf (dumpfile,
"%f ", temp);
1042 fprintf (dumpfile,
"\n");
1052 sinfo_msg(
"Removing poor fits - factor %f", il_sigma);
1056 sinfo_msg(
"max loop over bin =%d",nbins);
1057 for (bin=0; bin<nbins; bin++) {
1059 for (slitlet=0; slitlet<32; slitlet++)
1060 if (coeffs[slitlet*nbins+bin] != NULL)
1061 rms_array[k++] = rms_values[slitlet*nbins+bin];
1066 tempvector = cpl_vector_wrap (k, &rms_array[0]);
1067 temp = cpl_vector_get_median (tempvector);
1068 sinfo_msg(
"median temp=%g",temp);
1069 cpl_vector_unwrap (tempvector);
1070 for (slitlet=0; slitlet<32; slitlet++)
1071 if (coeffs[slitlet*nbins+bin] != NULL) {
1073 if (rms_values[slitlet*nbins+bin]>(il_sigma*temp)) {
1074 cpl_polynomial_delete(coeffs[slitlet*nbins+bin]);
1075 coeffs[slitlet*nbins+bin] = NULL;
1084 sinfo_msg(
"Removed %d poor fits out of %d. Bad coeffs=%d", n,i,nbad);
1087 sinfo_msg(
"Smoothing zeroth terms (order %d)", smooth_order0);
1091 for (slitlet = 0; slitlet<32; slitlet++) {
1093 for (bin=0; bin<nbins; bin++) {
1094 if (coeffs[slitlet*nbins+bin] != NULL) {
1095 poly = coeffs[slitlet*nbins+bin];
1097 temp = cpl_polynomial_get_coeff (poly, &i);
1098 plane_pos[k] = pos[bin];
1099 plane_val[k] = temp/median[bin];
1104 tempvector = cpl_vector_wrap (k, plane_pos);
1105 tempvector2= cpl_vector_wrap (k, plane_val);
1106 poly2 = cpl_polynomial_fit_1d_create (tempvector, tempvector2,
1107 smooth_order0, &mse);
1108 cpl_vector_unwrap (tempvector);
1109 cpl_vector_unwrap (tempvector2);
1110 for (bin=0; bin<nbins; bin++) {
1111 if (coeffs[slitlet*nbins+bin] != NULL) {
1112 poly = coeffs[slitlet*nbins+bin];
1114 temp2 = cpl_polynomial_eval_1d (poly2, pos[bin], NULL);
1115 cpl_polynomial_set_coeff (poly, &i, temp2*median[bin]);
1118 cpl_polynomial_delete(poly2);
1124 else if (smooth0 == 2) {
1125 sinfo_msg(
"Smoothing zeroth terms (median filter size %d)", smooth_size0);
1126 smooth_size0 = smooth_size0/2;
1127 if (smooth_size0 <= 0) smooth_size0 = 1;
1128 for (slitlet = 0; slitlet<32; slitlet++) {
1130 for (bin=0; bin<nbins; bin++) {
1131 if (coeffs[slitlet*nbins+bin] != NULL) {
1132 poly = coeffs[slitlet*nbins+bin];
1134 temp = cpl_polynomial_get_coeff (poly, &i);
1136 plane_val[k] = temp/median[bin];
1141 tempvector = cpl_vector_wrap (k, plane_val);
1142 tempvector2= sinfo_juha_vector_filter_median_create (tempvector,
1144 cpl_vector_unwrap (tempvector);
1146 for (bin=0; bin<nbins; bin++) {
1147 if (coeffs[slitlet*nbins+bin] != NULL) {
1148 poly = coeffs[slitlet*nbins+bin];
1150 cpl_polynomial_set_coeff(poly, &i, cpl_vector_get(tempvector2, kk++)
1154 cpl_vector_delete (tempvector2);
1160 sinfo_msg(
"Smoothing higher terms (with order %d)", smooth_order);
1161 for (slitlet = 0; slitlet<32; slitlet++) {
1162 if (order[slitlet]>0) {
1163 for (j=1; j<=order[slitlet]; j++) {
1165 for (bin=0; bin<nbins; bin++) {
1166 if (coeffs[slitlet*nbins+bin] != NULL) {
1167 poly = coeffs[slitlet*nbins+bin];
1170 temp2 = cpl_polynomial_get_coeff (poly, &j);
1171 plane_pos[k] = pos[bin];
1172 plane_val[k] = temp2/median[bin];
1177 tempvector = cpl_vector_wrap (k, plane_pos);
1178 tempvector2= cpl_vector_wrap (k, plane_val);
1179 poly2 = cpl_polynomial_fit_1d_create (tempvector, tempvector2,
1180 smooth_order, &mse);
1181 cpl_vector_unwrap (tempvector);
1182 cpl_vector_unwrap (tempvector2);
1183 for (bin=0; bin<nbins; bin++) {
1184 if (coeffs[slitlet*nbins+bin] != NULL) {
1185 poly = coeffs[slitlet*nbins+bin];
1188 temp2 = cpl_polynomial_eval_1d (poly2, pos[bin], NULL);
1189 cpl_polynomial_set_coeff (poly, &j, temp2*median[bin]);
1192 cpl_polynomial_delete(poly2);
1202 sinfo_msg(
"Creating cube for illumination correction\n");
1203 result = cpl_imagelist_new ();
1204 for (i=0; i<nplanes; i++) {
1205 temp_image = cpl_image_new (64, 64, CPL_TYPE_FLOAT);
1206 cpl_imagelist_set (result, temp_image, i);
1209 sinfo_msg(
"nplanes=%d spec_bin=%d",nplanes,spec_bin);
1211 sinfo_msg(
"Interpolating\n");
1212 for (slitlet = 0; slitlet<32; slitlet++) {
1213 for (i=0; i<64; i++) {
1215 for (bin=0; bin<nbins; bin++) {
1216 if (coeffs[slitlet*nbins+bin] != NULL) {
1217 plane_pos[k] = pos[bin];
1218 plane_val[k] = cpl_polynomial_eval_1d(coeffs[slitlet*nbins+bin],
1219 cpl_vector_get(xpos, i),NULL)/
1226 sinfo_juha_function1d_natural_spline (plane_pos, plane_val, k,
1227 &inter_pos[(
int)plane_pos[0]],
1228 &inter_val[(
int)plane_pos[0]],
1229 (
int)(plane_pos[k-1]-plane_pos[0]));
1230 for (j=0; j<=(int)plane_pos[0]; j++)
1231 inter_val[j] = inter_val[(
int)plane_pos[0]+1];
1232 for (j=(
int)plane_pos[k-1]-1; j<nplanes; j++)
1233 inter_val[j] = inter_val[(
int)plane_pos[k-1]-2];
1234 for (k=0; k<nplanes; k++) {
1235 data = cpl_image_get_data_float(cpl_imagelist_get(result, k));
1236 data[i + (2*slitlet)*64] = inter_val[k];
1237 data[i + (2*slitlet+1)*64] = inter_val[k];
1246 else if (nbins==1) {
1247 sinfo_msg(
"Filling the illumination cube\n");
1248 for (slitlet = 0; slitlet<32; slitlet++) {
1249 for (i=0; i<64; i++) {
1250 if (coeffs[slitlet] != NULL) {
1251 temp = cpl_polynomial_eval_1d(coeffs[slitlet],
1252 cpl_vector_get(xpos, i),NULL)/median[0];
1253 for (k=0; k<nplanes; k++) {
1254 data = cpl_image_get_data_float(cpl_imagelist_get(result, k));
1255 data[i + (2*slitlet)*64] = temp;
1256 data[i + (2*slitlet+1)*64] = temp;
1257 sinfo_msg(
"temp=%g",temp);
1267 sinfo_msg(
"Writing ima out_illum.fits\n");
1276 sinfo_pro_save_ims(result,sof,sof,
"out_illum.fits",
1277 PRO_ILL_COR,NULL,plugin_id, cpl_cfg);
1282 sinfo_msg(
"Writing dat out_illum2.dat\n");
1283 dumpfile = fopen (
"out_illum2.dat",
"w");
1284 fprintf (dumpfile,
"# slitlet, pos, median, rms, coeff0, coeff1...\n");
1285 for (slitlet = 0; slitlet<32; slitlet++)
1286 for (bin=0; bin<nbins; bin++) {
1287 poly = coeffs[slitlet*nbins+bin];
1289 fprintf (dumpfile,
"%d %f %f %f ",slitlet, pos[bin],
1291 rms_values[slitlet*nbins+bin]);
1292 for (i=0; i<(cpl_polynomial_get_degree(poly)+1); i++) {
1293 temp = cpl_polynomial_get_coeff (poly, &i);
1294 fprintf (dumpfile,
"%f ", temp);
1296 fprintf (dumpfile,
"\n");
1304 for (i = 0; i<32*nbins; i++)
1305 if (coeffs[i] != NULL)
1306 cpl_polynomial_delete(coeffs[i]);
1307 cpl_imagelist_delete (sky);
1308 cpl_imagelist_delete (binnedsky);
1309 cpl_imagelist_delete (result);
1312 cpl_free (temparray);
1313 cpl_free (tempxarray);
1314 cpl_free (tempsarray);
1316 cpl_free (inter_pos);
1317 cpl_free (inter_val);
1318 cpl_free (plane_pos);
1319 cpl_free (plane_val);
1320 cpl_free (rms_values);
1321 cpl_vector_delete (xpos);
1322 cpl_vector_delete (model);
1324 cpl_free (bin_start);
1345 sinfo_illumcorr_create_bins (cpl_imagelist *sky,
1346 int llx,
int lly,
int urx,
int ury,
1354 double testarray3[15];
1355 double temp_double=0;
1356 int i=0, j=0, k=0,kk=0,nplanes=0;
1358 int norig = 0, nmerged = 0, ncont = 0, nline=0;
1369 double *spec_cont=NULL;
1370 double *spec_line=NULL;
1374 nplanes = cpl_imagelist_get_size(sky);
1376 spec = (
double*) cpl_calloc(nplanes,
sizeof(
double));
1377 spec_line = (
double*) cpl_calloc(nplanes,
sizeof(
double));
1378 spec_cont = (
double*) cpl_calloc(nplanes,
sizeof(
double));
1381 pos = (
int*) cpl_calloc(nplanes,
sizeof(
int));
1382 flux = (
double*) cpl_calloc(nplanes,
sizeof(
double));
1383 x1 = (
int*) cpl_calloc(nplanes,
sizeof(
int));
1384 x2 = (
int*) cpl_calloc(nplanes,
sizeof(
int));
1385 x1b = (
int*) cpl_calloc(nplanes,
sizeof(
int));
1386 x2b = (
int*) cpl_calloc(nplanes,
sizeof(
int));
1388 for (i=z1; i<=z2; i++) {
1389 cpl_image* temp_image = cpl_imagelist_get(sky, i);
1390 spec[i] = sinfo_image_get_median_window (temp_image, llx, lly, urx, ury);
1392 for (i=z1+7; i<=z2-7; i++) {
1394 for (j=-7; j<=7; j++)
1395 if (!isnan(spec[i+j]))
1396 testarray3[k++] = spec[i+j];
1398 sinfo_tools_sort_double (&testarray3[0], k);
1399 spec_cont[i] = testarray3[1];
1402 spec_cont[i] = 0./0.;
1406 "original, continuum, line");
1407 for (i=z1; i<=z2; i++) {
1408 spec_line[i] = spec[i] - spec_cont[i];
1410 i,spec[i],spec_cont[i], spec_line[i]);
1417 sinfo_msg (
"Searching for peaks");
1418 temp_double = -10000.0;
1421 if (!isnan (spec_line[i])) {
1422 if (temp_double<spec_line[i]) {
1424 temp_double = spec_line[i];
1428 if (temp_i == i-1 && spec_line[temp_i]>min_flux) {
1430 for (j=-spec_bin/2; j<=spec_bin/2; j++)
1431 if (j+i>=0 && i+j<nplanes && isnan(spec[i+j])) {
1436 pos[norig] = temp_i;
1437 flux[norig] = temp_double;
1440 temp_double = -10000.0;
1441 while (spec_line[i]<spec_line[i-1])
1455 sinfo_msg (
"Merging emission features too close to each other");
1458 if (flux[i] > 0.0) {
1461 && (x1[j]-x2[i]) <=spec_bin
1472 nline = norig - nmerged;
1475 for (i=0; i<norig; i++)
1477 x1b[j] = x1[i] - spec_bin/2;
1478 x2b[j] = x2[i] + spec_bin/2;
1492 if (!isnan (spec[i])) {
1493 if (x1b[j]-i < spec_bin) {
1499 for (k=0; k<spec_bin; k++)
1500 if (spec[i+k]>min_flux)
1504 x2[ncont] = i+spec_bin-1;
1516 sinfo_msg (
"Number of bins centered on emission features:");
1517 sinfo_msg (
" %i - %i (merged) = %i", norig, nmerged, nline);
1518 sinfo_msg (
" %i continuum bins", ncont);
1520 s1 = (
int*)cpl_calloc(norig-nmerged+ncont,
sizeof(
int));
1521 s2 = (
int*)cpl_calloc(norig-nmerged+ncont,
sizeof(
int));
1530 while (k<norig-nmerged+ncont) {
1531 if (i<norig && j<ncont && x1b[i]<x1[j]) {
1537 else if (i<norig && j<ncont && x1b[i]>x1[j]) {
1543 else if (i == norig) {
1549 else if (j == ncont) {
1558 "the bins %i and %i", i,j);
1563 for (i=0; i<nline+ncont; i++)
1576 cpl_free (spec_line);
1577 cpl_free (spec_cont);
1579 return (nline+ncont);
1613 sinfo_juha_function1d_natural_spline(
1624 register int i, j, n;
1637 a = cpl_malloc(
sizeof(
double) * splLen * 9) ;
1647 for (i = 0; i < len; i++) {
1648 a[i] = (double)y[i];
1652 for (i = 0; i < end; i++) {
1653 h[i] = (double)x[i + 1] - (
double)x[i];
1661 for (n = 0, i = 1; i < end; i++, n++) {
1663 alpha[i] = 3.0 * ((a[i+1] / h[i]) - (a[i] / h[n]) - (a[i] / h[i]) +
1668 l[0] = l[end] = 1.0;
1669 mu[0] = mu[end] = 0.0;
1670 z[0] = z[end] = 0.0;
1671 c[0] = c[end] = 0.0;
1674 for (n = 0, i = 1; i < end; i++, n++) {
1676 l[i] = 2 * (h[i] + h[n]) - h[n] * mu[n];
1677 mu[i] = h[i] / l[i];
1678 z[i] = (alpha[i] - h[n] * z[n]) / l[i];
1680 for (n = end, j = end - 1; j >= 0; j--, n--) {
1682 c[j] = z[j] - mu[j] * c[n];
1683 b[j] = (a[n] - a[j]) / h[j] - h[j] * (c[n] + 2.0 * c[j]) / 3.0;
1684 d[j] = (c[n] - c[j]) / (3.0 * h[j]);
1688 for (j = 0; j < splLen; j++) {
1689 double v = (double)splX[j];
1693 if ((v < (
double)x[0]) || (v > (
double)x[end])) {
1697 loc = sinfo_function1d_search_value(x, len, (
double)v, &found);
1702 v -= (double)x[loc];
1703 splY[j] = (float)( a[loc] + v * (b[loc] + v * (c[loc] + v * d[loc])));
1729 sinfo_function1d_search_value(
1740 while (high >= low) {
1741 int middle = (high + low) / 2;
1742 if (key > x[middle]) {
1744 }
else if (key < x[middle]) {
1791 sinfo_juha_vector_filter_median_create(
1792 const cpl_vector * v,
1795 cpl_vector * filtered=NULL;
1800 size = cpl_vector_get_size(v);
1801 filtered = cpl_vector_new(size);
1803 row = cpl_malloc((2*hw+1) *
sizeof(
double));
1804 for (i=0; i<size; i++) {
1806 for (j=-hw; j<=hw; j++)
1807 if ( (i+j) >= 0 && (i+j) < size) {
1808 temp = cpl_vector_get (v, i+j);
1812 sinfo_tools_sort_double (row, k);
1818 cpl_vector_set (filtered, i, temp);
1824 #define CPL_PIX_STACK_SIZE 50
1837 static cpl_error_code sinfo_tools_sort_double(
1847 cpl_ensure(pix_arr, CPL_ERROR_NULL_INPUT, CPL_ERROR_NULL_INPUT) ;
1852 i_stack = malloc(CPL_PIX_STACK_SIZE *
sizeof(
double)) ;
1855 for (j=l+1 ; j<=ir ; j++) {
1857 for (i=j-1 ; i>=1 ; i--) {
1858 if (pix_arr[i-1] <= a)
break;
1859 pix_arr[i] = pix_arr[i-1];
1863 if (j_stack == 0)
break;
1864 ir = i_stack[j_stack-- -1];
1865 l = i_stack[j_stack-- -1];
1868 SINFO_DOUBLE_SWAP(pix_arr[k-1], pix_arr[l])
1869 if (pix_arr[l] > pix_arr[ir-1]) {
1870 SINFO_DOUBLE_SWAP(pix_arr[l], pix_arr[ir-1])
1872 if (pix_arr[l-1] > pix_arr[ir-1]) {
1873 SINFO_DOUBLE_SWAP(pix_arr[l-1], pix_arr[ir-1])
1875 if (pix_arr[l] > pix_arr[l-1]) {
1876 SINFO_DOUBLE_SWAP(pix_arr[l], pix_arr[l-1])
1882 do i++;
while (pix_arr[i-1] < a);
1883 do j--;
while (pix_arr[j-1] > a);
1885 SINFO_DOUBLE_SWAP(pix_arr[i-1], pix_arr[j-1]);
1887 pix_arr[l-1] = pix_arr[j-1];
1890 if (j_stack > CPL_PIX_STACK_SIZE) {
1893 return CPL_ERROR_ILLEGAL_INPUT ;
1895 if (ir-i+1 >= j-l) {
1896 i_stack[j_stack-1] = ir;
1897 i_stack[j_stack-2] = i;
1900 i_stack[j_stack-1] = j-1;
1901 i_stack[j_stack-2] = l;
1907 return CPL_ERROR_NONE ;
1911 sinfo_vector_filter_median_create(
1912 const cpl_vector * v,
1915 cpl_vector * filtered;
1921 size = cpl_vector_get_size(v);
1922 filtered = cpl_vector_new(size);
1925 row = cpl_vector_new((2*hw+1));
1926 for (i=0; i<size; i++) {
1928 for (j=-hw; j<=hw; j++)
1929 if ( (i+j) >= 0 && (i+j) < size) {
1930 temp = cpl_vector_get (v, i+j);
1931 cpl_vector_set(row,k,temp);
1936 cpl_vector_sort(row, +1);
1938 temp = cpl_vector_get(row,k/2);
1941 temp = cpl_vector_get(row,k/2-1);
1944 sinfo_msg(
"value = %g ", temp);
1945 cpl_vector_set (filtered, i, temp);
1947 cpl_vector_delete(row);
1955 sinfo_image_get_median_window (
const cpl_image *image,
1956 int llx,
int lly,
int urx,
int ury)
1960 double *array, median;
1963 window = cpl_image_extract (image, llx, lly, urx, ury);
1964 size = (urx-llx+1)*(ury-lly+1);
1965 data = cpl_image_get_data_float(window);
1967 array = (
double*)cpl_calloc ( size,
sizeof(
double));
1969 for (i=0; i<size; i++)
1970 if (!isnan(data[i]))
1971 array[j++] = data[i];
1974 sinfo_tools_sort_double (array, j);
1976 if (j == 0 || 2*j<size)
1979 median = array[j/2];
1981 median = array[j/2-1];
1983 cpl_image_delete (window);
void irplib_reset(void)
Reset IRPLIB state.
#define sinfo_msg_debug(...)
Print a debug message.
#define sinfo_msg_error(...)
Print an error message.
int cpl_plugin_get_info(cpl_pluginlist *list)
Build the list of available plugins, for this module.
#define sinfo_msg_warning(...)
Print an warning message.