00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031 #ifdef HAVE_CONFIG_H
00032 #include <config.h>
00033 #endif
00034
00035
00036
00037
00038
00039
00040 #include <strings.h>
00041 #include <string.h>
00042 #include <stdio.h>
00043 #include <math.h>
00044 #include <libgen.h>
00045
00046
00047 #include <cxmacros.h>
00048 #include <cxtypes.h>
00049 #include <cxmessages.h>
00050 #include <cpl_memory.h>
00051
00052
00053 #include <cpl.h>
00054
00055
00056 #include <xmemory.h>
00057
00058
00059 #include <sinfoni_pro_types.h>
00060 #include <sinfoni_prepare_stacked_frames_config.h>
00061 #include <sinfoni_objnod_config.h>
00062 #include <objnod.h>
00063 #include <objnod_rel.h>
00064 #include <prepare_stacked_frames.h>
00065 #include <sinfoni_key_names.h>
00066 #include <sinfoni_raw_types.h>
00067 #include <sinfoni_functions.h>
00068 #include <sinfoni_tpl_utils.h>
00069 #include <sinfoni_tpl_dfs.h>
00070 #include <sinfoni_hidden.h>
00071 #include <sinfoni_globals.h>
00072 #include "si_rec_utils.h"
00073 #include <sinfoni_memory.h>
00074
00075
00076
00077
00078
00079 #define EPSILON 1.e-6
00080
00081
00082
00083
00084 static cxint si_rec_objnod(cpl_parameterlist *, cpl_frameset *);
00085
00086
00087
00088
00089
00090 static char si_rec_objnod_description1[] =
00091 "This recipe performs science data reduction.\n"
00092 "The input files are science object and sky frames with tags OBJECT_NODDING and SKY_NODDING\n"
00093 "Master calibration frames:\n";
00094
00095
00096 static char si_rec_objnod_description2[] =
00097 "A corresponding (band,preoptics) wavelength map image with tag WAVE_MAP\n"
00098 "A corresponding (band,preoptics) master flat field with tag MASTER_FLAT_LAMP\n"
00099 "A corresponding (band,preoptics) master bad pixel map with tag MASTER_BP_MAP\n"
00100 "A corresponding (band,preoptics) slitlets position frame with tag SLIT_POS\n"
00101 "A corresponding (band) distortion table with tag DISTORTION\n"
00102 "A corresponding (band) slitlet distance table with tag SLITLETS_DISTANCE\n";
00103
00104
00105 static char si_rec_objnod_description3[] =
00106 "The output is an image resulting from the IMA1 op IMA2 where op indicates\n"
00107 "A reference table with the position of the first column with tag FIRST_COLUMN\n"
00108 "Relevant outputs are:\n"
00109 "combined cubes (PRO.CATG=x_OBS x=STD,OBJ,PSF)\n"
00110 "reconstructed cube (PRO.CATG=COADD_x_OBS x=STD,OBJ,PSF)\n"
00111 "An average along Z of the reconstructed cube (PRO.CATG=MED_x_OBS x=STD,OBJ,PSF)\n"
00112 "The bad pixel map associated to the cube (PRO.CATG=BP_MAP_COADD_x_OBS x=STD,OBJ,PSF)\n";
00113
00114
00115 static char si_rec_objnod_description4[] =
00116 "Information on relevant parameters can be found with\n"
00117 "esorex --params si_rec_objnod\n"
00118 "esorex --help si_rec_objnod\n"
00119 "\n";
00120
00121 static char si_rec_objnod_description[1300];
00122
00123
00124
00125
00126
00127
00128 cxint
00129 si_rec_objnod_create(cpl_plugin *plugin)
00130 {
00131
00132
00133
00134
00135
00136
00137 cpl_recipe *recipe = (cpl_recipe *)plugin;
00138 recipe->parameters = cpl_parameterlist_new();
00139 if(recipe->parameters == NULL) {
00140 return 1;
00141 }
00142
00143
00144
00145
00146
00147 sinfoni_prepare_stacked_frames_config_add(recipe->parameters);
00148 sinfoni_objnod_config_add(recipe->parameters);
00149
00150 return 0;
00151
00152 }
00153
00154 cxint
00155 si_rec_objnod_exec(cpl_plugin *plugin)
00156 {
00157
00158 cpl_recipe *recipe = (cpl_recipe *) plugin;
00159 if(recipe->parameters == NULL) {
00160 return 1;
00161 }
00162 if(recipe->frames == NULL) {
00163 return 1;
00164 }
00165 cpl_error_reset();
00166 return si_rec_objnod(recipe->parameters, recipe->frames);
00167
00168 }
00169
00170 cxint
00171 si_rec_objnod_destroy(cpl_plugin *plugin)
00172 {
00173 cpl_recipe *recipe = (cpl_recipe *) plugin;
00174
00175
00176
00177
00178
00179
00180 cpl_parameterlist_delete(recipe->parameters);
00181
00182 return 0;
00183
00184 }
00185
00186
00187 int
00188 cpl_plugin_get_info(cpl_pluginlist *list)
00189 {
00190
00191 cpl_recipe *recipe = cpl_calloc(1, sizeof *recipe);
00192 cpl_plugin *plugin = &recipe->interface;
00193
00194 strcpy(si_rec_objnod_description,si_rec_objnod_description1);
00195 strcat(si_rec_objnod_description,si_rec_objnod_description2);
00196 strcat(si_rec_objnod_description,si_rec_objnod_description3);
00197 strcat(si_rec_objnod_description,si_rec_objnod_description4);
00198
00199 cpl_plugin_init(plugin,
00200 CPL_PLUGIN_API,
00201 SINFONI_BINARY_VERSION,
00202 CPL_PLUGIN_TYPE_RECIPE,
00203 "si_rec_objnod",
00204 "Object data reduction",
00205 si_rec_objnod_description,
00206 "Andrea Modigliani",
00207 "Andrea.Mdigliani@eso.org",
00208 sinfoni_get_license(),
00209 si_rec_objnod_create,
00210 si_rec_objnod_exec,
00211 si_rec_objnod_destroy);
00212
00213 cpl_pluginlist_append(list, plugin);
00214
00215 return 0;
00216
00217 }
00218
00219
00220
00221
00222
00223 static cxint
00224 si_rec_objnod(cpl_parameterlist *config, cpl_frameset *set)
00225 {
00226 const char *_id = "si_rec_objnod";
00227 char filename[FILE_NAME_SZ];
00228 char outname[FILE_NAME_SZ];
00229
00230 int i=0;
00231 int j=0;
00232 int k=0;
00233
00234 int ind=0;
00235 int nsky=0;
00236 int nobj=0;
00237 int ncdb=0;
00238 int nstk=0;
00239 int ntot=0;
00240
00241 int aj_meth=0;
00242
00243 double mjd_obj=0;
00244 double mjd_sky=0;
00245 double mjd_sky_frm=0;
00246
00247 cpl_frameset * obj_set=NULL;
00248 cpl_frameset * sky_set=NULL;
00249 cpl_frameset * cdb_set=NULL;
00250 cpl_frameset * wrk_set=NULL;
00251 cpl_frameset * stk_set=NULL;
00252 cpl_frameset * tot_set=NULL;
00253 cpl_frame * sky_frm=NULL;
00254
00255 cpl_frame * dup_frm=NULL;
00256 cpl_frame * obj_frm=NULL;
00257 cpl_frame * cdb_frm=NULL;
00258 cpl_frame * wrk_frm=NULL;
00259 cpl_frameset* ref_set=NULL;
00260
00261
00262 cpl_parameter * p=NULL;
00263 fake* fk=fake_new();
00264
00265
00266
00267
00268 if(sinfoni_dfs_set_groups(set)) {
00269 cpl_msg_error(_id, "Cannot indentify RAW and CALIB frames") ;
00270 return -1;
00271 }
00272 ref_set=cpl_frameset_duplicate(set);
00273
00274
00275
00276 obj_set=cpl_frameset_new();
00277 sky_set=cpl_frameset_new();
00278 cdb_set=cpl_frameset_new();
00279
00280 sinfoni_extract_obj_frames(set,obj_set);
00281 sinfoni_extract_sky_frames(set,sky_set);
00282 sinfoni_extract_mst_frames(set,cdb_set);
00283
00284
00285
00286
00287 nobj=cpl_frameset_get_size(obj_set);
00288 nsky=cpl_frameset_get_size(sky_set);
00289 ncdb=cpl_frameset_get_size(cdb_set);
00290
00291 if ((nobj==0) && (nsky==0)) {
00292 cpl_msg_error(_id,"Empty input set");
00293 cpl_frameset_delete(obj_set);
00294 cpl_frameset_delete(sky_set);
00295 cpl_frameset_delete(cdb_set);
00296 cpl_frameset_delete(ref_set);
00297 fake_delete(fk);
00298 return -1;
00299 }
00300
00301
00302
00303 if ( (nobj != 0) && (nsky != 0) ) {
00304
00305 cpl_msg_info (_id,"------------------------------") ;
00306 cpl_msg_info(_id,"generates OBJ-SKY pairs");
00307 cpl_msg_info (_id,"------------------------------") ;
00308 tot_set=cpl_frameset_new();
00309 p = cpl_parameterlist_find(config,"sinfoni.objnod.autojitter_method");
00310 cpl_parameter_set_int(p,0);
00311
00312
00313
00314 for (i=0;i<nobj;i++) {
00315
00316 wrk_set=cpl_frameset_new();
00317 obj_frm=cpl_frameset_get_frame(obj_set,i);
00318 mjd_obj=sinfoni_get_mjd_obs(obj_frm);
00319 sky_frm=cpl_frameset_get_frame(sky_set,0);
00320 mjd_sky=sinfoni_get_mjd_obs(sky_frm);
00321 strcpy(filename,cpl_frame_get_filename(obj_frm));
00322
00323
00324 for (j=1;j<nsky;j++) {
00325 mjd_sky_frm = sinfoni_get_mjd_obs(cpl_frameset_get_frame(sky_set,j));
00326 if(1000.*(mjd_sky_frm-mjd_obj)*(mjd_sky_frm-mjd_obj) <
00327 1000.*(mjd_sky- mjd_obj)*(mjd_sky- mjd_obj) ) {
00328 mjd_sky=mjd_sky_frm;
00329 sky_frm=cpl_frameset_get_frame(sky_set,j);
00330 }
00331 }
00332 strcpy(filename,cpl_frame_get_filename(sky_frm));
00333
00334
00335
00336
00337 dup_frm=cpl_frame_duplicate(obj_frm);
00338 cpl_frameset_insert(wrk_set,dup_frm);
00339 dup_frm=cpl_frame_duplicate(sky_frm);
00340 cpl_frameset_insert(wrk_set,dup_frm);
00341
00342
00343 for(k=0;k<ncdb;k++) {
00344 cdb_frm=cpl_frameset_get_frame(cdb_set,k);
00345 dup_frm=cpl_frame_duplicate(cdb_frm);
00346 cpl_frameset_insert(wrk_set,dup_frm);
00347 }
00348
00349
00350
00351 sprintf(outname,"%s%d%s","out_stack",i,".fits");
00352 if(-1 == stack_frames(config,wrk_set,
00353 PRO_OBJECT_NODDING_STACKED,i,fk,_id)) {
00354
00355 cpl_frameset_delete(wrk_set);
00356 cpl_frameset_delete(tot_set);
00357 cpl_frameset_delete(obj_set);
00358 cpl_frameset_delete(sky_set);
00359 cpl_frameset_delete(cdb_set);
00360 cpl_frameset_delete(ref_set);
00361 fake_delete(fk);
00362 sinfoni_memory_status();
00363 return -1;
00364
00365 }
00366
00367 stk_set=cpl_frameset_new();
00368 sinfoni_contains_frames_kind(wrk_set,stk_set,PRO_STACKED);
00369 nstk=cpl_frameset_get_size(stk_set);
00370
00371 for(k=0;k<nstk;k++) {
00372 wrk_frm=cpl_frameset_get_frame(stk_set,k);
00373 dup_frm = cpl_frame_duplicate(wrk_frm);
00374 cpl_frameset_insert(tot_set,dup_frm);
00375 }
00376 cpl_frameset_delete(stk_set);
00377 cpl_frameset_delete(wrk_set);
00378
00379
00380
00381
00382 }
00383
00384
00385 ntot=cpl_frameset_get_size(tot_set);
00386 for(k=0;k<ntot;k++) {
00387 wrk_frm=cpl_frameset_get_frame(tot_set,k);
00388 dup_frm = cpl_frame_duplicate(wrk_frm);
00389 cpl_frameset_insert(set,dup_frm);
00390 }
00391 cpl_frameset_delete(tot_set);
00392 }
00393
00394 if ( (nobj == 0) && (nsky != 0) ) {
00395
00396
00397
00398
00399
00400 {
00401 cpl_msg_info (_id,"------------------------------") ;
00402 cpl_msg_info (_id,"SKY ONLY FRAMES DATA REDUCTION NOT SUPPORTED") ;
00403 cpl_msg_info (_id,"------------------------------") ;
00404 cpl_frameset_delete(obj_set);
00405 cpl_frameset_delete(sky_set);
00406 cpl_frameset_delete(cdb_set);
00407 cpl_frameset_delete(ref_set);
00408 fake_delete(fk);
00409 return 0;
00410 }
00411
00412
00413 }
00414
00415
00416 if ( (nobj != 0) && (nsky == 0) ) {
00417
00418
00419
00420
00421 p = cpl_parameterlist_find(config,"sinfoni.objnod.autojitter_method");
00422 aj_meth = cpl_parameter_get_int(p);
00423 if(aj_meth == 2) {
00424
00425 cpl_msg_info(_id,"Dummy sky case");
00426 cpl_msg_info(_id,"fake sky is coming from median of all objects");
00427 if( (sky_frm = get_dummy_sky(obj_set)) == NULL) {
00428
00429 cpl_msg_error(_id,"Problem to get dummy frame");
00430 return -1;
00431
00432 }
00433 cpl_msg_info (_id,"------------------------------") ;
00434 cpl_msg_info(_id,"generates OBJ-SKY pairs");
00435 cpl_msg_info (_id,"------------------------------") ;
00436 tot_set=cpl_frameset_new();
00437
00438
00439 for (i=0;i<nobj;i++) {
00440
00441 wrk_set=cpl_frameset_new();
00442 obj_frm=cpl_frameset_get_frame(obj_set,i);
00443 dup_frm=cpl_frame_duplicate(obj_frm);
00444 cpl_frameset_insert(wrk_set,dup_frm);
00445 dup_frm=cpl_frame_duplicate(sky_frm);
00446 cpl_frameset_insert(wrk_set,dup_frm);
00447 for(k=0;k<ncdb;k++) {
00448 cdb_frm=cpl_frameset_get_frame(cdb_set,k);
00449 dup_frm=cpl_frame_duplicate(cdb_frm);
00450 cpl_frameset_insert(wrk_set,dup_frm);
00451 }
00452
00453 sprintf(outname,"%s%d%s","out_stack",i,".fits");
00454 if(-1 == stack_frames(config,wrk_set,
00455 PRO_OBJECT_NODDING_STACKED,i,fk,_id)) {
00456
00457 cpl_msg_error(_id,"cannot stack frames");
00458 cpl_frame_delete(sky_frm);
00459 cpl_frameset_delete(wrk_set);
00460 cpl_frameset_delete(tot_set);
00461
00462
00463 cpl_frameset_delete(obj_set);
00464 cpl_frameset_delete(sky_set);
00465 cpl_frameset_delete(cdb_set);
00466 cpl_frameset_delete(ref_set);
00467
00468 fake_delete(fk);
00469 sinfoni_memory_status();
00470 return -1;
00471 }
00472
00473 stk_set=cpl_frameset_new();
00474 sinfoni_contains_frames_kind(wrk_set,stk_set,PRO_STACKED);
00475 nstk=cpl_frameset_get_size(stk_set);
00476 for(k=0;k<nstk;k++) {
00477 wrk_frm=cpl_frameset_get_frame(stk_set,k);
00478 dup_frm=cpl_frame_duplicate(wrk_frm);
00479 cpl_frameset_insert(tot_set,dup_frm);
00480 }
00481 cpl_frameset_delete(stk_set);
00482 cpl_frameset_delete(wrk_set);
00483
00484 }
00485 ntot=cpl_frameset_get_size(tot_set);
00486 for(k=0;k<ntot;k++) {
00487 wrk_frm=cpl_frameset_get_frame(tot_set,k);
00488 dup_frm=cpl_frame_duplicate(wrk_frm);
00489 cpl_frameset_insert(set,dup_frm);
00490 }
00491 cpl_frameset_delete(tot_set);
00492 cpl_frame_delete(sky_frm);
00493 } else if(aj_meth == 1 ) {
00494
00495
00496 cpl_msg_info(_id,"Dummy obj-sky case");
00497 cpl_msg_info(_id,"fake sky is coming from each next object");
00498
00499 if(nobj > 1) {
00500
00501 if( get_dummy_obj_sky_stacked(obj_set,&set,config,fk,PRO_OBJECT_NODDING_STACKED,_id) == -1 ) {
00502 cpl_msg_error(_id,"Found error to get obj-sky-stacked frame");
00503 cpl_frameset_delete(obj_set);
00504 cpl_frameset_delete(sky_set);
00505 cpl_frameset_delete(cdb_set);
00506 cpl_frameset_delete(ref_set);
00507 fake_delete(fk);
00508 sinfoni_memory_status();
00509 return -1;
00510 }
00511
00512 } else {
00513 cpl_msg_info (_id,"Only one object frame, no sky");
00514 if(-1==stack_frames(config,set,
00515 PRO_OBJECT_NODDING_STACKED,0,fk,_id)) {
00516 cpl_frameset_delete(obj_set);
00517 cpl_frameset_delete(sky_set);
00518 cpl_frameset_delete(cdb_set);
00519 cpl_frameset_delete(ref_set);
00520 fake_delete(fk);
00521 sinfoni_memory_status();
00522 return -1;
00523 }
00524 }
00525
00526 } else {
00527
00528 cpl_msg_info (_id,"------------------------------") ;
00529 cpl_msg_info (_id,"staks each OBJECT ");
00530 cpl_msg_info (_id,"------------------------------") ;
00531 tot_set=cpl_frameset_new();
00532
00533 for (i=0;i<nobj;i++) {
00534
00535 wrk_set=cpl_frameset_new();
00536 obj_frm=cpl_frameset_get_frame(obj_set,i);
00537 dup_frm=cpl_frame_duplicate(obj_frm);
00538 cpl_frameset_insert(wrk_set,dup_frm);
00539 for(k=0;k<ncdb;k++) {
00540 cdb_frm=cpl_frameset_get_frame(cdb_set,k);
00541 dup_frm=cpl_frame_duplicate(cdb_frm);
00542 cpl_frameset_insert(wrk_set,dup_frm);
00543 }
00544
00545
00546 sprintf(outname,"%s%d%s","out_stack",i,".fits");
00547 if(-1==stack_frames(config,wrk_set,
00548 PRO_OBJECT_NODDING_STACKED,i,fk,_id)) {
00549 cpl_frameset_delete(wrk_set);
00550 cpl_frameset_delete(obj_set);
00551 cpl_frameset_delete(sky_set);
00552 cpl_frameset_delete(cdb_set);
00553 cpl_frameset_delete(ref_set);
00554 cpl_frameset_delete(tot_set);
00555 fake_delete(fk);
00556 sinfoni_memory_status();
00557
00558
00559 return -1;
00560 }
00561
00562 stk_set=cpl_frameset_new();
00563 sinfoni_contains_frames_kind(wrk_set,stk_set,PRO_STACKED);
00564 nstk=cpl_frameset_get_size(stk_set);
00565 for(k=0;k<nstk;k++) {
00566 wrk_frm=cpl_frameset_get_frame(stk_set,k);
00567 dup_frm=cpl_frame_duplicate(wrk_frm);
00568 cpl_frameset_insert(tot_set,dup_frm);
00569 }
00570 cpl_frameset_delete(stk_set);
00571 cpl_frameset_delete(wrk_set);
00572
00573 }
00574
00575 ntot=cpl_frameset_get_size(tot_set);
00576 for(k=0;k<ntot;k++) {
00577 wrk_frm=cpl_frameset_get_frame(tot_set,k);
00578 dup_frm=cpl_frame_duplicate(wrk_frm);
00579 cpl_frameset_insert(set,dup_frm);
00580 }
00581 cpl_frameset_delete(tot_set);
00582 }
00583 }
00584
00585
00586
00587
00588
00589
00590
00591 {
00592
00593
00594
00595
00596
00597 cpl_msg_info (_id,"------------------------------") ;
00598 cpl_msg_info(_id,"NODDING SCIENCE FRAMES");
00599 cpl_msg_info (_id,"------------------------------") ;
00600
00601
00602 if ( -1 == (ind = objnod(_id,config, set, PRO_COADD_OBJ ) ) )
00603 {
00604 cpl_msg_error(_id,"NODDING SCIENCE FRAMES no. %d\n", ind) ;
00605 cpl_frameset_delete(obj_set);
00606 cpl_frameset_delete(sky_set);
00607 cpl_frameset_delete(cdb_set);
00608 cpl_frameset_delete(ref_set);
00609 fake_delete(fk);
00610
00611 return -1 ;
00612 }
00613 cpl_msg_info (_id,"------------------------------") ;
00614 cpl_msg_info(_id,"NODDED SCIENCE FRAMES");
00615 cpl_msg_info (_id,"------------------------------") ;
00616
00617 }
00618 cpl_frameset_delete(obj_set);
00619 cpl_frameset_delete(sky_set);
00620 cpl_frameset_delete(cdb_set);
00621 cpl_frameset_delete(ref_set);
00622
00623 fake_delete(fk);
00624 sinfoni_memory_status();
00625 return 0 ;
00626 }
00627