35 #include "sinfo_new_cubes_coadd.h"
36 #include "sinfo_pfits.h"
37 #include "sinfo_baryvel.h"
38 #include "sinfo_pro_save.h"
39 #include "sinfo_objnod_ini_by_cpl.h"
40 #include "sinfo_functions.h"
41 #include "sinfo_utilities_scired.h"
42 #include "sinfo_wave_calibration.h"
43 #include "sinfo_cube_construct.h"
44 #include "sinfo_error.h"
45 #include "sinfo_utils_wrappers.h"
47 #include "sinfo_dfs.h"
51 #define PI_NUMB (3.1415926535897932384626433832795)
78 sinfo_new_cubes_coadd (
const char* plugin_id,cpl_parameterlist* config,
79 cpl_frameset* sof,
const char* procatg)
82 object_config * cfg=NULL ;
84 cpl_image* jitter_image=NULL;
85 cpl_imagelist ** cube_tmp=NULL ;
87 cpl_imagelist ** cubeobject=NULL ;
88 cpl_imagelist * jittercube=NULL ;
89 cpl_imagelist * maskcube=NULL ;
90 cpl_propertylist* plist=NULL;
109 float newcenter_x=0 ;
110 float newcenter_y=0 ;
122 double * times=NULL ;
123 float * offsetx=NULL;
124 float * offsety=NULL;
125 float offx_min=1.e10;
126 float offy_min=1.e10;
127 float offx_max=-1.e10;
128 float offy_max=-1.e10;
131 double centralLambda=0 ;
134 char name_jitter[MAX_NAME_SIZE] ;
135 char pro_mjit[MAX_NAME_SIZE];
136 char pro_obs[MAX_NAME_SIZE];
137 char pro_med[MAX_NAME_SIZE];
141 char * partname=NULL;
143 char file_name[MAX_NAME_SIZE];
151 cpl_image* j_img=NULL;
152 cpl_image* m_img=NULL;
153 cpl_table* qclog_tbl=NULL;
154 cpl_image* ill_cor=NULL;
155 cpl_frame* frame=NULL;
156 cpl_frameset* stk=NULL;
157 cpl_parameter* p=NULL;
158 int mosaic_max_size=0;
161 cpl_table* qclog=NULL;
163 check_nomsg(p=cpl_parameterlist_find(config,
164 "sinfoni.objnod.mosaic_max_size"));
165 check_nomsg(mosaic_max_size=cpl_parameter_get_int(p));
166 check_nomsg(p=cpl_parameterlist_find(config,
"sinfoni.product.density"));
167 check_nomsg(pdensity=cpl_parameter_get_int(p));
169 if (strcmp(procatg,PRO_COADD_STD) == 0) {
170 strcpy(pro_mjit,PRO_MASK_COADD_STD);
171 strcpy(pro_obs,PRO_OBS_STD);
172 strcpy(pro_med,PRO_MED_COADD_STD);
174 }
else if (strcmp(procatg,PRO_COADD_PSF) == 0) {
175 strcpy(pro_mjit,PRO_MASK_COADD_PSF);
176 strcpy(pro_obs,PRO_OBS_PSF);
177 strcpy(pro_med,PRO_MED_COADD_PSF);
179 strcpy(pro_mjit,PRO_MASK_COADD_OBJ);
180 strcpy(pro_obs,PRO_OBS_OBJ);
181 strcpy(pro_med,PRO_MED_COADD_OBJ);
185 check_nomsg(stk = cpl_frameset_new());
187 cknull(cfg = sinfo_parse_cpl_input_objnod(config,sof,&stk),
188 "Error setting parameter configuration");
190 ck0(sinfo_check_input_data(cfg),
"error checking input");
192 if ( cfg->jitterind == 1 )
194 cknull(times = (
double*) cpl_calloc (cfg->nframes, sizeof (
double)),
195 " could not allocate memory!") ;
197 cknull(offsetx = (
float*) cpl_calloc (cfg->nframes,
sizeof(
float)),
198 " could not allocate memory!") ;
200 cknull(offsety = (
float*) cpl_calloc (cfg->nframes,
sizeof(
float)),
201 " could not allocate memory!") ;
204 if (cfg->jitterind == 0)
206 if ( NULL != (partname = strtok(cfg->outName,
".")))
213 ck0(sinfo_auto_size_cube5(cfg,&ref_offx,&ref_offy,
215 &offx_max,&offy_max),
216 "Error resizing cube");
218 if(NULL != cpl_frameset_find(sof,PRO_ILL_COR)) {
219 frame = cpl_frameset_find(sof,PRO_ILL_COR);
220 ill_cor=cpl_image_load(cpl_frame_get_filename(frame),CPL_TYPE_FLOAT,0,0);
222 sinfo_msg(
"Illumination correction image not provided");
226 for ( n = 0 ; n < cfg->nframes ; n++ )
230 name = cfg->framelist[n] ;
233 strcpy (name_jitter, name) ;
235 if( sinfo_is_fits_file(name) != 1) {
242 plist=cpl_propertylist_load(name,0);
244 if (sinfo_propertylist_has(plist, KEY_NAME_MJD_OBS)) {
245 mjd_obs=cpl_propertylist_get_double(plist, KEY_NAME_MJD_OBS);
248 cpl_propertylist_delete(plist) ;
256 if(cpl_error_get_code() != CPL_ERROR_NONE) {
260 sinfo_free_propertylist(&plist);
271 cknull(im = cpl_image_load(name,CPL_TYPE_FLOAT,0,0),
272 " could not load frame %s!",name) ;
274 if (cfg->jitterind == 1)
276 exptime = sinfo_pfits_get_ditndit(name) ;
285 ck0(sinfo_new_assign_offset(n,name,offsetx,offsety,
287 "Error assigning offsets");
290 sinfo_free_image(&im);
296 if(cfg->jitterind == 0) {
301 if( (cfg->size_x*cfg->size_y*cfg->nframes) > (100*mosaic_max_size) ) {
303 cfg->size_x,cfg->size_y,cfg->nframes);
305 "that sixeX*sixeY*Nframes < 100*%d",mosaic_max_size);
309 if ( cfg->jitterind == 1 )
311 check_nomsg(p = cpl_parameterlist_find(config,
"sinfoni.objnod.vllx"));
312 check_nomsg(vllx = cpl_parameter_get_int(p));
313 check_nomsg(p = cpl_parameterlist_find(config,
"sinfoni.objnod.vlly"));
314 check_nomsg(vlly = cpl_parameter_get_int(p));
315 check_nomsg(p = cpl_parameterlist_find(config,
"sinfoni.objnod.vurx"));
316 check_nomsg(vurx = cpl_parameter_get_int(p));
317 check_nomsg(p = cpl_parameterlist_find(config,
"sinfoni.objnod.vury"));
318 check_nomsg(vury = cpl_parameter_get_int(p));
319 cknull(cube_tmp = (cpl_imagelist**) cpl_calloc (cfg->nframes,
320 sizeof (cpl_imagelist*)),
321 "Could not allocate memory for cube_tmp");
324 cknull(cubeobject = (cpl_imagelist**) cpl_calloc (cfg->nframes,
325 sizeof (cpl_imagelist*)),
326 "Could not allocate memory for cubeobject");
327 check_nomsg(p=cpl_parameterlist_find(config,
328 "sinfoni.objnod.sky_cor"));
329 check_nomsg(sky_cor=cpl_parameter_get_bool(p));
332 for ( n = 0 ; n < cfg->nframes ; n++ ) {
333 if(sky_cor == 1 && (pdensity == 1 || pdensity == 3) &&
334 strcmp(cfg->sky_dist,
"no_sky")!=0) {
335 sinfo_msg(
"load sky corrected cubes");
337 snprintf(file_name,MAX_NAME_SIZE-1,
"%s%2.2d%s",
"out_cube_obj_cor",
341 snprintf(file_name,MAX_NAME_SIZE-1,
"%s%2.2d%s",
"out_cube_obj",n,
344 check_nomsg(cube_tmp[n] = cpl_imagelist_load(file_name,
348 check_nomsg(cubeobject[n] = sinfo_new_cube_getvig(
351 64 - vurx, 64 - vury));
352 check_nomsg(sinfo_free_imagelist(&cube_tmp[n]));
355 sinfo_free_array_imagelist(&cube_tmp);
367 if (cfg->jitterind == 1)
369 sinfo_msg(
"Jittering...");
371 sinfo_msg(
"Coadded cube size. x: %d y: %d",
372 cfg->size_x,cfg->size_y);
373 check_nomsg(jittercube = cpl_imagelist_new()) ;
382 check_nomsg(p=cpl_parameterlist_find(config,
383 "sinfoni.objnod.scales_sky"));
384 check_nomsg(scales_sky=cpl_parameter_get_bool(p));
385 check_nomsg(p=cpl_parameterlist_find(config,
"sinfoni.objnod.ks_clip"));
386 check_nomsg(ks_clip = cpl_parameter_get_bool(p));
387 check_nomsg(p=cpl_parameterlist_find(config,
"sinfoni.objnod.kappa"));
388 check_nomsg(kappa = cpl_parameter_get_double(p));
391 if(scales_sky == 1) {
392 sinfo_msg(
"Subtract spatial sinfo_median to each cube plane");
393 for(n=0;n<cfg->nframes;n++) {
394 sinfo_msg(
"Process cube %d\n",n);
395 sinfo_new_sinfoni_correct_median_it(&(cubeobject[n]));
402 cknull(maskcube=cpl_imagelist_new(),
"could not allocate cube!");
405 if(ill_cor != NULL) {
406 for(n=0;n<cfg->nframes;n++) {
407 cpl_imagelist_divide_image(cubeobject[n],ill_cor);
410 sinfo_free_image(&ill_cor);
412 sinfo_msg(
"Combine jittered cubes");
416 sinfo_msg(
"Cube coaddition with kappa-sigma");
418 check_nomsg(onp=cpl_imagelist_get_size(cubeobject[0]));
419 for(z=0;z<onp;z+=z_stp) {
420 z_siz=(z_stp < (onp-z)) ? z_stp : (onp-z);
423 sinfo_msg(
"Coadding cubes: range [%4.4d,%4.4d) of 0-%d\n",
426 for(j=z_min;j<z_max;j++) {
427 check_nomsg(j_img=cpl_image_new(cfg->size_x,
428 cfg->size_y,CPL_TYPE_FLOAT));
429 check_nomsg(cpl_imagelist_set(jittercube,j_img,j));
430 check_nomsg(m_img = cpl_image_new(cfg->size_x,
431 cfg->size_y,CPL_TYPE_FLOAT));
432 check_nomsg(cpl_imagelist_set(maskcube,m_img,j));
435 sinfo_new_combine_jittered_cubes_thomas_range(cubeobject,
447 sinfo_new_combine_jittered_cubes_range(cubeobject,
459 sinfo_new_convert_0_to_ZERO_for_cubes(jittercube) ;
461 if (jittercube == NULL)
467 if (maskcube == NULL)
473 for ( i = 0 ; i <cfg->nframes ; i++ ) {
474 sinfo_free_imagelist(&cubeobject[i]);
477 sinfo_free_array_imagelist(&cubeobject);
500 if (mjd_obs > 53825. ) {
502 newcenter_x=cfg->size_x / 2. +2*ref_offx;
503 newcenter_y=cfg->size_y / 2. +2*ref_offy;
504 }
else if ((mjd_obs > 53421.58210082 ) && (mjd_obs <= 53825.)){
506 newcenter_x=cfg->size_x / 2. -2*ref_offx;
507 newcenter_y=cfg->size_y / 2. +2*ref_offy;
510 newcenter_x=cfg->size_x / 2. +2*ref_offx;
511 newcenter_y=cfg->size_y / 2. -2*ref_offy;
519 cknull_nomsg(qclog = sinfo_qclog_init());
520 plist=cpl_propertylist_load(file_name,0);
521 if(sinfo_baryvel(plist, &barycor,&helicor) != CPL_ERROR_NONE) {
526 check_nomsg(sinfo_qclog_add_double(qclog,
529 "Barycentric radial velocity correction ",
532 check_nomsg(sinfo_qclog_add_double(qclog,
535 "Heliocentric radial velocity correction ",
537 sinfo_msg(
"Barycor=%g Helicor=%g",barycor,helicor);
539 sinfo_free_propertylist(&plist);
543 ck0(sinfo_pro_save_ims(jittercube,sof,sof,cfg->outName,
544 procatg,qclog,plugin_id,config),
545 "cannot save cube %s", cfg->outName);
547 sinfo_free_table(&qclog);
550 plist=cpl_propertylist_load(file_name,0);
551 dis=sinfo_pfits_get_cdelt3(plist);
552 centralLambda=sinfo_pfits_get_crval3(plist);
553 centralpix=sinfo_pfits_get_crpix3(plist);
554 sinfo_free_propertylist(&plist);
555 sinfo_new_set_wcs_cube(jittercube, cfg->outName,
557 centralpix, newcenter_x, newcenter_y);
559 cknull(jitter_image = sinfo_new_median_cube(jittercube),
560 " could not do sinfo_medianCube()");
561 cknull_nomsg(qclog = sinfo_qclog_init());
562 update_bad_pixel_map(jitter_image);
563 check_nomsg(sinfo_qclog_add_double(qclog,
565 cpl_image_get_mean(jitter_image),
566 "mean of the collapesd cube",
568 check_nomsg(sinfo_qclog_add_double(qclog,
570 cpl_image_get_stdev(jitter_image),
571 "standard deviation of the collapesd cube",
573 ck0(sinfo_pro_save_ima(jitter_image,sof,sof,cfg->med_cube_name,
574 pro_med,qclog,plugin_id,config),
575 "cannot save ima %s", cfg->outName);
576 sinfo_free_table(&qclog);
578 sinfo_new_set_wcs_image(jitter_image, cfg->med_cube_name,
579 newcenter_x,newcenter_y);
581 sinfo_free_image(&jitter_image);
583 ck0(sinfo_pro_save_ims(maskcube,sof,sof,cfg->maskname,
584 pro_mjit,NULL,plugin_id,config),
585 "cannot save cube %s", cfg->maskname);
587 sinfo_new_set_wcs_cube(maskcube, cfg->maskname,
588 centralLambda, dis, centralpix,
589 newcenter_x, newcenter_y);
591 sinfo_free_double(×) ;
592 sinfo_free_float(&offsetx) ;
593 sinfo_free_float(&offsety) ;
594 sinfo_free_imagelist(&maskcube) ;
595 sinfo_free_imagelist(&jittercube) ;
602 sinfo_objnod_free(&cfg);
603 sinfo_free_frameset(&stk);
608 sinfo_free_image(&jitter_image);
609 sinfo_free_imagelist(&jittercube) ;
610 sinfo_free_imagelist(&maskcube) ;
611 sinfo_free_table(&qclog);
614 if(cube_tmp != NULL) {
615 for ( n = 0 ; n < cfg->nframes ; n++ ) {
616 sinfo_free_imagelist(&(cube_tmp[n]));
618 sinfo_free_array_imagelist(&cube_tmp);
620 if(cubeobject != NULL) {
621 for ( n = 0 ; n < cfg->nframes ; n++ ) {
622 sinfo_free_imagelist(&(cubeobject[n]));
624 sinfo_free_array_imagelist(&cubeobject);
628 sinfo_free_table(&qclog_tbl);
629 sinfo_free_image(&im);
630 sinfo_free_image(&ill_cor);
631 sinfo_free_float(&offsety);
632 sinfo_free_float(&offsetx);
633 sinfo_free_double(×);
634 sinfo_objnod_free(&cfg);
635 sinfo_free_frameset(&stk);
637 if (cpl_error_get_code() != CPL_ERROR_NONE) {
638 sinfo_check_rec_status(0);