51 #include <irplib_utils.h>
52 #include <sinfo_globals.h>
53 #include <sinfo_tpl_utils.h>
54 #include <sinfo_pfits.h>
55 #include <sinfo_tpl_dfs.h>
56 #include <sinfo_key_names.h>
57 #include <sinfo_pro_types.h>
58 #include <sinfo_pro_save.h>
59 #include <sinfo_functions.h>
60 #include <sinfo_msg.h>
61 #include <sinfo_error.h>
62 #include <sinfo_utils_wrappers.h>
63 #include <sinfo_new_cube_ops.h>
69 static int sinfo_utl_ima_cube_ks_test_create(cpl_plugin *) ;
70 static int sinfo_utl_ima_cube_ks_test_exec(cpl_plugin *) ;
71 static int sinfo_utl_ima_cube_ks_test_destroy(cpl_plugin *) ;
72 static int sinfo_utl_ima_cube_ks_test(cpl_parameterlist *, cpl_frameset *) ;
75 static cpl_imagelist* create_cube_shift(
93 static cpl_image* create_plane(
104 static cpl_image* create_square_plane(
115 static int put_defect(cpl_image *pPlane,
int iDefectX,
int iDefectY,
double dDefectValue);
116 void putNAN(cpl_image *pPlane,
int iDefectX,
int iDefectY);
123 static char sinfo_utl_ima_cube_ks_test_description[] =
124 "This recipe produces a test for kappa-sigma clipping\n"
127 static char PARAM_NAME_SIZE_X[] =
"sinfoni.sinfo_utl_ima_cube_ks_test.size_x";
128 static char PARAM_NAME_SIZE_Y[] =
"sinfoni.sinfo_utl_ima_cube_ks_test.size_y";
129 static char PARAM_NAME_FWHM_X[] =
"sinfoni.sinfo_utl_ima_cube_ks_test.fwhm_x";
130 static char PARAM_NAME_FWHM_Y[] =
"sinfoni.sinfo_utl_ima_cube_ks_test.fwhm_y";
131 static char PARAM_NAME_SIGNAL[] =
"sinfoni.sinfo_utl_ima_cube_ks_test.total_signal";
132 static char PARAM_NAME_SIGNAL_DELTA[] =
"sinfoni.sinfo_utl_ima_cube_ks_test.total_signal_delta";
133 static char PARAM_NAME_BKGSIG[] =
"sinfoni.sinfo_utl_ima_cube_ks_test.bkg_signal";
134 static char PARAM_NAME_NOISEL[] =
"sinfoni.sinfo_utl_ima_cube_ks_test.noise_level";
135 static char PARAM_NAME_DEFECT_X[] =
"sinfoni.sinfo_utl_ima_cube_ks_test.defect_x";
136 static char PARAM_NAME_DEFECT_Y[] =
"sinfoni.sinfo_utl_ima_cube_ks_test.defect_y";
137 static char PARAM_NAME_DEFECT_SIGNAL[] =
"sinfoni.sinfo_utl_ima_cube_ks_test.defect_signal";
138 static char PARAM_NAME_DEFECT_NUMBER[] =
"sinfoni.sinfo_utl_ima_cube_ks_test.defect_number";
139 static char PARAM_NAME_CUBES_NUMBER[] =
"sinfoni.sinfo_utl_ima_cube_ks_test.cubes_number";
140 static char PARAM_NAME_PLANES_NUMBER[] =
"sinfoni.sinfo_utl_ima_cube_ks_test.planes_number";
143 static char RECIPE_NAME[] =
"sinfoni.sinfo_utl_ima_cube_ks_test";
166 cpl_recipe * recipe = cpl_calloc(1,
sizeof *recipe ) ;
167 cpl_plugin * plugin = &recipe->interface ;
169 cpl_plugin_init(plugin,
171 SINFONI_BINARY_VERSION,
172 CPL_PLUGIN_TYPE_RECIPE,
173 "sinfo_utl_ima_cube_ks_test",
174 "Test cube coaddition with kappa-sigma clip of ouliers",
175 sinfo_utl_ima_cube_ks_test_description,
179 sinfo_utl_ima_cube_ks_test_create,
180 sinfo_utl_ima_cube_ks_test_exec,
181 sinfo_utl_ima_cube_ks_test_destroy) ;
183 cpl_pluginlist_append(list, plugin) ;
198 static int sinfo_utl_ima_cube_ks_test_create(cpl_plugin * plugin)
200 const int CUBES_NUMBER = 5;
201 const int PLANES_NUMBER = 10;
202 const int SIZE_X_DEFAULT = 64;
203 const int SIZE_Y_DEFAULT = 64;
204 const int FWHM_X = 24;
205 const int FWHM_Y = 24;
206 const double TOTAL_SIGNAL = 1E6;
207 const double SIGNAL_DELTA = 1E5;
208 const double BKG_SIGNAL = 250.;
209 const double NOISE_VALUE = 100;
210 const int DEFECT_X = 42;
211 const int DEFECT_Y = 42;
212 const double DEFECT_SIGNAL = 400;
213 const int DEFECT_NUMBER = 1;
215 cpl_recipe * recipe ;
219 if (cpl_plugin_get_type(plugin) == CPL_PLUGIN_TYPE_RECIPE)
220 recipe = (cpl_recipe *)plugin ;
226 recipe->parameters = cpl_parameterlist_new() ;
238 p = cpl_parameter_new_value(PARAM_NAME_SIZE_X,
239 CPL_TYPE_INT,
"size X axis", RECIPE_NAME, SIZE_X_DEFAULT) ;
240 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI,
"size_x") ;
241 cpl_parameterlist_append(recipe->parameters, p) ;
244 p = cpl_parameter_new_value(PARAM_NAME_SIZE_Y,
245 CPL_TYPE_INT,
"size Y axis", RECIPE_NAME, SIZE_Y_DEFAULT) ;
246 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI,
"size_y") ;
247 cpl_parameterlist_append(recipe->parameters, p) ;
250 p = cpl_parameter_new_value(PARAM_NAME_FWHM_X,
251 CPL_TYPE_INT,
"FWHM X axis", RECIPE_NAME, FWHM_X) ;
252 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI,
"fwhm_x") ;
253 cpl_parameterlist_append(recipe->parameters, p) ;
256 p = cpl_parameter_new_value(PARAM_NAME_FWHM_Y,
257 CPL_TYPE_INT,
"FWHM Y axis", RECIPE_NAME, FWHM_Y) ;
258 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI,
"fwhm_y") ;
259 cpl_parameterlist_append(recipe->parameters, p) ;
262 p = cpl_parameter_new_value(PARAM_NAME_SIGNAL,
263 CPL_TYPE_DOUBLE,
"Total signal value", RECIPE_NAME, TOTAL_SIGNAL) ;
264 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI,
"total_signal") ;
265 cpl_parameterlist_append(recipe->parameters, p) ;
268 p = cpl_parameter_new_value(PARAM_NAME_BKGSIG,
269 CPL_TYPE_DOUBLE,
"background signal level", RECIPE_NAME, BKG_SIGNAL) ;
270 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI,
"bkg_signal") ;
271 cpl_parameterlist_append(recipe->parameters, p) ;
274 p = cpl_parameter_new_value(PARAM_NAME_NOISEL,
275 CPL_TYPE_DOUBLE,
"Noise level", RECIPE_NAME, NOISE_VALUE) ;
276 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI,
"noise_level") ;
277 cpl_parameterlist_append(recipe->parameters, p) ;
280 p = cpl_parameter_new_value(PARAM_NAME_CUBES_NUMBER,
281 CPL_TYPE_INT,
"Number of cubes", RECIPE_NAME, CUBES_NUMBER) ;
282 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI,
"cubes_number") ;
283 cpl_parameterlist_append(recipe->parameters, p) ;
286 p = cpl_parameter_new_value(PARAM_NAME_PLANES_NUMBER,
287 CPL_TYPE_INT,
"Number of images for each cube", RECIPE_NAME, PLANES_NUMBER) ;
288 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI,
"planes_number") ;
289 cpl_parameterlist_append(recipe->parameters, p) ;
292 p = cpl_parameter_new_value(PARAM_NAME_SIGNAL_DELTA,
293 CPL_TYPE_DOUBLE,
"Change of the signal for the next plane inside a cube", RECIPE_NAME, SIGNAL_DELTA) ;
294 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI,
"total_signal_delta") ;
295 cpl_parameterlist_append(recipe->parameters, p) ;
298 p = cpl_parameter_new_value(PARAM_NAME_DEFECT_X,
299 CPL_TYPE_INT,
"X position of the bad pixel", RECIPE_NAME, DEFECT_X) ;
300 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI,
"defect_x") ;
301 cpl_parameterlist_append(recipe->parameters, p) ;
304 p = cpl_parameter_new_value(PARAM_NAME_DEFECT_Y,
305 CPL_TYPE_INT,
"Y position of the bad pixel", RECIPE_NAME, DEFECT_Y) ;
306 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI,
"defect_y") ;
307 cpl_parameterlist_append(recipe->parameters, p) ;
310 p = cpl_parameter_new_value(PARAM_NAME_DEFECT_SIGNAL,
311 CPL_TYPE_DOUBLE,
"signal value of the bad pixel", RECIPE_NAME, DEFECT_SIGNAL) ;
312 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI,
"defect_signal") ;
313 cpl_parameterlist_append(recipe->parameters, p) ;
316 p = cpl_parameter_new_value(PARAM_NAME_DEFECT_NUMBER,
317 CPL_TYPE_INT,
"Number of planes in a cube with a bad pixel", RECIPE_NAME, DEFECT_NUMBER) ;
318 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI,
"defect_number") ;
319 cpl_parameterlist_append(recipe->parameters, p) ;
332 static int sinfo_utl_ima_cube_ks_test_exec(cpl_plugin * plugin)
334 cpl_recipe * recipe ;
336 cpl_errorstate initial_errorstate = cpl_errorstate_get();
339 if (cpl_plugin_get_type(plugin) == CPL_PLUGIN_TYPE_RECIPE)
340 recipe = (cpl_recipe *)plugin ;
344 code = sinfo_utl_ima_cube_ks_test(recipe->parameters, recipe->frames) ;
347 if (!cpl_errorstate_is_equal(initial_errorstate)) {
350 cpl_errorstate_dump(initial_errorstate, CPL_FALSE, NULL);
363 static int sinfo_utl_ima_cube_ks_test_destroy(cpl_plugin * plugin)
365 cpl_recipe * recipe ;
368 if (cpl_plugin_get_type(plugin) == CPL_PLUGIN_TYPE_RECIPE)
369 recipe = (cpl_recipe *)plugin ;
372 cpl_parameterlist_delete(recipe->parameters) ;
385 sinfo_utl_ima_cube_ks_test( cpl_parameterlist * parlist,
386 cpl_frameset * framelist)
393 int iGlobalSizeX = 0;
394 int iGlobalSizeY = 0;
397 int* pOffsetX = NULL;
398 int* pOffsetY = NULL;
400 double dBkgSignal = 0;
401 double dNoiseLvl = 0;
403 double dSignalDelta = 0;
406 double dDefectValue = 0;
407 int iDefectNumber = 0;
408 int iCubesNumber = 0;
409 int iPlanesNumber = 0;
414 const double kappa = 3;
415 const char * name_o = NULL ;
416 cpl_parameter * param = NULL ;
417 cpl_propertylist * plist = NULL ;
418 cpl_frame * product_frame = NULL;
419 cpl_imagelist ** ppCubes = NULL;
420 cpl_imagelist * pResult = NULL;
421 double * exptimes = NULL;
422 cpl_imagelist * mask = NULL;
423 sinfo_msg(
"Welcome to SINFONI Pipeline release %d.%d.%d",
424 SINFONI_MAJOR_VERSION,SINFONI_MINOR_VERSION,SINFONI_MICRO_VERSION);
425 ck0(sinfo_dfs_set_groups(framelist),
"Cannot indentify RAW and CALIB frames");
430 check_nomsg(param=cpl_parameterlist_find(parlist,
432 check_nomsg(iSizeX=cpl_parameter_get_int(param));
435 check_nomsg(param=cpl_parameterlist_find(parlist,
437 check_nomsg(iSizeY=cpl_parameter_get_int(param));
440 check_nomsg(param=cpl_parameterlist_find(parlist,
442 check_nomsg(iFWHMX=cpl_parameter_get_int(param));
445 check_nomsg(param=cpl_parameterlist_find(parlist,
447 check_nomsg(iFWHMY=cpl_parameter_get_int(param));
450 check_nomsg(param=cpl_parameterlist_find(parlist,
452 check_nomsg(dSignal=cpl_parameter_get_double(param));
455 check_nomsg(param=cpl_parameterlist_find(parlist,
457 check_nomsg(dBkgSignal=cpl_parameter_get_double(param));
460 check_nomsg(param=cpl_parameterlist_find(parlist,
462 check_nomsg(dNoiseLvl=cpl_parameter_get_double(param));
465 check_nomsg(param=cpl_parameterlist_find(parlist,
466 PARAM_NAME_CUBES_NUMBER));
467 check_nomsg(iCubesNumber=cpl_parameter_get_int(param));
470 check_nomsg(param=cpl_parameterlist_find(parlist,
471 PARAM_NAME_PLANES_NUMBER));
472 check_nomsg(iPlanesNumber=cpl_parameter_get_int(param));
475 check_nomsg(param=cpl_parameterlist_find(parlist,
476 PARAM_NAME_SIGNAL_DELTA));
477 check_nomsg(dSignalDelta=cpl_parameter_get_double(param));
480 check_nomsg(param=cpl_parameterlist_find(parlist,
481 PARAM_NAME_DEFECT_X));
482 check_nomsg(iDefectX=cpl_parameter_get_int(param));
485 check_nomsg(param=cpl_parameterlist_find(parlist,
486 PARAM_NAME_DEFECT_Y));
487 check_nomsg(iDefectY=cpl_parameter_get_int(param));
490 check_nomsg(param=cpl_parameterlist_find(parlist,
491 PARAM_NAME_DEFECT_SIGNAL));
492 check_nomsg(dDefectValue=cpl_parameter_get_double(param));
495 check_nomsg(param=cpl_parameterlist_find(parlist,
496 PARAM_NAME_DEFECT_NUMBER));
497 check_nomsg(iDefectNumber=cpl_parameter_get_int(param));
501 check(plist=cpl_propertylist_new(),
"Cannot create a Property List");
507 ppCubes = (cpl_imagelist**)cpl_malloc(
sizeof(cpl_imagelist*) * (iCubesNumber + 2));
508 pOffsetX = cpl_malloc(
sizeof(
int) * iCubesNumber);
509 pOffsetY = cpl_malloc(
sizeof(
int) * iCubesNumber);
512 sinfo_msg(
"Creating cubes....");
513 for (z = 0; z < iCubesNumber; z++)
515 pOffsetX[z] = shiftMultX*z;
516 pOffsetY[z] = shiftMultY*z;
517 cpl_msg_warning(cpl_func,
"cube [%d] offset[%d:%d]", z,pOffsetX[z], pOffsetY[z] );
518 cpl_imagelist* pCube =
533 (z < iDefectNumber) ? dDefectValue : 0,
584 sinfo_msg(
"Kappa-sigma....");
587 const int BIG_ENOUGH_INT = 65535;
588 int xmax = -BIG_ENOUGH_INT;
589 int ymax = -BIG_ENOUGH_INT;
590 int xmin = BIG_ENOUGH_INT;
591 int ymin = BIG_ENOUGH_INT;
592 for (z = 0; z < iCubesNumber; z++)
595 int localMaxX = iSizeX + pOffsetX[z];
596 int localMaxY = iSizeY + pOffsetY[z];
597 int localMinX = pOffsetX[z];
598 int localMinY = pOffsetY[z];
600 if(localMaxX > xmax) xmax = localMaxX;
601 if(localMaxY > ymax) ymax = localMaxY;
603 if(localMinX < xmin) xmin = localMinX;
604 if(localMinY < ymin) ymin = localMinY;
607 iGlobalSizeX = xmax - xmin;
608 iGlobalSizeY = ymax - ymin;
609 cpl_msg_warning(cpl_func,
"iGlobalSize[%d:%d] xmaxmin[%d:%d] ymaxmin[%d:%d]", iGlobalSizeX, iGlobalSizeY, xmin, xmax, ymin, ymax);
610 pResult = cpl_imagelist_new();
611 exptimes = cpl_malloc(
sizeof(
double) * iCubesNumber);
612 for (z = 0; z < iCubesNumber; z++)
616 mask= cpl_imagelist_new();
617 for (z = 0; z < iPlanesNumber; z++)
619 cpl_image* imMask = cpl_image_new(iGlobalSizeX, iGlobalSizeY, CPL_TYPE_FLOAT);
620 cpl_image* imResult = cpl_image_new(iGlobalSizeX, iGlobalSizeY, CPL_TYPE_FLOAT);
621 for (x = 1; x <= iGlobalSizeX; x++)
623 for (y = 1; y <= iGlobalSizeY; y++)
625 cpl_image_set(imMask, x, y, 100);
628 cpl_imagelist_set(mask, imMask, z);
629 cpl_imagelist_set(pResult, imResult, z);
632 sinfo_coadd_with_ks_clip_optimized(
649 sinfo_msg(
"Saving results");
650 ppCubes[iCubesNumber] = pResult;
651 ppCubes[iCubesNumber + 1] = mask;
655 name_o =
"ima_res_0000.fits" ;
658 check_nomsg(product_frame = cpl_frame_new());
659 check_nomsg(cpl_frame_set_filename(product_frame, name_o)) ;
660 check_nomsg(cpl_frame_set_tag(product_frame,
"image_gauss" )) ;
661 check_nomsg(cpl_frame_set_type(product_frame, CPL_FRAME_TYPE_IMAGE)) ;
662 check_nomsg(cpl_frame_set_group(product_frame, CPL_FRAME_GROUP_PRODUCT)) ;
663 check(cpl_frame_set_level(product_frame, CPL_FRAME_LEVEL_FINAL),
664 "Error while initialising the product frame") ;
667 check_nomsg(cpl_propertylist_erase_regexp(plist,
"^ESO PRO CATG",0));
669 check(cpl_dfs_setup_product_header(plist,
673 "sinfo_utl_ima_cube_ks_test",
675 KEY_VALUE_HPRO_DID,NULL),
676 "Problem in the product DFS-compliance") ;
680 for (z = 0; z <= iCubesNumber + 1; z++)
683 sprintf(BUF,
"out_cube_%d.fits",z);
684 sinfo_msg(
"Saving results cube[%d]",z);
685 check(cpl_imagelist_save(ppCubes[z],
690 "Could not save product");
692 ck0(sinfo_pro_save_ims(ppCubes[z],framelist,framelist,BUF,
"CUBE",NULL,
693 "sinfo_utl_ima_cube_ks_ex",parlist),
694 "cannot save cube %s", BUF);
697 sinfo_free_propertylist(&plist) ;
699 check_nomsg(cpl_frameset_insert(framelist, product_frame)) ;
705 sinfo_free_propertylist(&plist) ;
706 for (z = 0; z <= iCubesNumber + 1; z++)
708 cpl_imagelist_delete(ppCubes[z]);
715 return cpl_error_get_code() ? -1 : 0;
718 cpl_imagelist* create_cube_shift(
737 cpl_image* pPlane = NULL;
738 cpl_imagelist* pRetval = NULL;
739 pRetval = cpl_imagelist_new();
741 for (z = 0; z < iPlanesNumber; z++)
743 double dSignalValue = dSignal + z * dSignalDelta;
747 pPlane = create_plane(
760 pPlane = create_square_plane(
777 put_defect(pPlane, iDefectX, iDefectY, dDefectValue);
779 putNAN(pPlane, iDefectX + shiftX, iDefectY + shiftY);
780 cpl_imagelist_set(pRetval, pPlane, z);
784 cpl_image* create_plane(
796 cpl_image* imNoise = NULL;
797 cpl_image* imGauss = NULL;
798 cpl_image* imResult = NULL;
799 const double K = 2.35482;
801 imNoise = cpl_image_new(iSizeX, iSizeY, CPL_TYPE_FLOAT);
802 cpl_image_fill_noise_uniform(imNoise, dBkgSignal - dNoiseLvl, dBkgSignal + dNoiseLvl);
803 imGauss = cpl_image_new(iSizeX, iSizeY, CPL_TYPE_FLOAT);
804 sinfo_msg(
"Generate Gaussian center[%d:%d] signal[%f], sigma[%f:%f]", iSizeX/2 + shiftX, iSizeY/2 + shiftY, dSignal, iFWHMX / K, iFWHMY / K);
805 cpl_image_fill_gaussian(imGauss, iSizeX/2 + shiftX, iSizeY/2 + shiftY, dSignal, iFWHMX / K, iFWHMY / K);
806 imResult = cpl_image_add_create(imGauss, imNoise);
811 cpl_image_delete(imNoise);
816 cpl_image_delete(imGauss);
821 cpl_image* create_square_plane(
833 cpl_image* imNoise = NULL;
834 cpl_image* imHole = NULL;
835 cpl_image* imResult = NULL;
838 int xHoleInitial = 0;
839 int yHoleInitial = 0;
840 imNoise = cpl_image_new(iSizeX, iSizeY, CPL_TYPE_FLOAT);
841 cpl_image_fill_noise_uniform(imNoise, dBkgSignal - dNoiseLvl, dBkgSignal + dNoiseLvl);
842 imHole = cpl_image_new(iSizeX, iSizeY, CPL_TYPE_FLOAT);
843 xHoleInitial = iSizeX / 2 - iHoleX / 2;
844 yHoleInitial = iSizeY / 2 - iHoleY / 2;
845 for (x = 0; x <= iHoleX; x++)
847 for (y = 0; y <= iHoleY; y++)
849 int pX = x + xHoleInitial + shiftX ;
850 int pY = y + yHoleInitial + shiftY;
851 if ((pX <= iSizeX) &&(pY <= iSizeY))
852 cpl_image_set(imHole, pX,pY, dSignal);
856 imResult = cpl_image_add_create(imHole, imNoise);
861 cpl_image_delete(imNoise);
866 cpl_image_delete(imHole);
871 int put_defect(cpl_image *pPlane,
int iDefectX,
int iDefectY,
double dDefectValue)
873 sinfo_msg(
"Set bad pixel x[%d] y[%d] value[%f]", iDefectX, iDefectY, dDefectValue);
876 cpl_image_set(pPlane, iDefectX, iDefectY, dDefectValue);
877 cpl_image_set(pPlane, iDefectX+1, iDefectY+1, dDefectValue);
878 cpl_image_set(pPlane, iDefectX-1, iDefectY-1, dDefectValue);
879 cpl_image_set(pPlane, iDefectX+1, iDefectY-1, dDefectValue);
880 cpl_image_set(pPlane, iDefectX-1, iDefectY+1, dDefectValue);
885 void putNAN(cpl_image *pPlane,
int iDefectX,
int iDefectY)
887 cpl_image_set(pPlane, iDefectX, iDefectY, ZERO);
void irplib_reset(void)
Reset IRPLIB state.
int cpl_plugin_get_info(cpl_pluginlist *list)
Build the list of available plugins, for this module.