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 #ifdef HAVE_CONFIG_H
00028 #include <config.h>
00029 #endif
00030
00031
00037
00038
00039
00040
00041
00042
00043
00044 #include <xsh_dfs.h>
00045 #include <xsh_pfits.h>
00046 #include <xsh_data_pre.h>
00047 #include <xsh_data_pre_3d.h>
00048 #include <xsh_error.h>
00049 #include <xsh_msg.h>
00050 #include <cpl.h>
00051 #include <string.h>
00052 #include <time.h>
00053 #include <math.h>
00054 #include <xsh_paf_save.h>
00055 #include <xsh_utils_table.h>
00056 #include <xsh_utils.h>
00057 #include <xsh_data_spectrum.h>
00058
00059
00060
00061
00062 static cpl_frame *xsh_find_frame (cpl_frameset * frames,
00063 const char *tags[]);
00064
00065
00075 int
00076 xsh_parameter_get_default_flag(const cpl_parameter* p) {
00077 int flag_gasgano=0;
00078 int flag_norm=0;
00079 int flag=0;
00080 cpl_type type =0;
00081
00082 flag_norm = (cpl_parameter_get_default_flag(p) == 0) ? 1 : 0;
00083 type=cpl_parameter_get_type(p);
00084
00085 switch(type) {
00086 case CPL_TYPE_BOOL:
00087 flag_gasgano = (cpl_parameter_get_default_bool(p) ==
00088 cpl_parameter_get_bool(p)) ? 1:0;
00089 break;
00090 case CPL_TYPE_INT:
00091 flag_gasgano = (cpl_parameter_get_default_int(p) ==
00092 cpl_parameter_get_int(p)) ? 1:0;
00093 break;
00094 case CPL_TYPE_DOUBLE:
00095 flag_gasgano = (cpl_parameter_get_default_double(p) ==
00096 cpl_parameter_get_double(p)) ? 1:0;
00097 break;
00098 case CPL_TYPE_STRING:
00099 flag_gasgano = (cpl_parameter_get_default_string(p) ==
00100 cpl_parameter_get_string(p)) ? 1:0;
00101 break;
00102
00103 default:
00104 xsh_msg_error("type not supported");
00105 }
00106
00107 flag = (flag_gasgano && flag_norm) ? 0 : 1;
00108
00109 return flag;
00110 }
00111
00118 cpl_error_code
00119 xsh_validate_model_cfg(cpl_frame* mod, cpl_frameset* set) {
00120
00121 const char* mod_name=NULL;
00122 const char* raw_name=NULL;
00123 cpl_frame* raw_frame=0;
00124 cpl_propertylist* mod_header=NULL;
00125 cpl_propertylist* raw_header=NULL;
00126 double mod_mjd=0;
00127 double raw_mjd=0;
00128
00129 raw_frame=cpl_frameset_get_frame(set,0);
00130
00131 mod_name=cpl_frame_get_filename(mod);
00132 mod_header=cpl_propertylist_load(mod_name,0);
00133 mod_mjd=xsh_pfits_get_mjdobs(mod_header);
00134
00135 raw_name=cpl_frame_get_filename(raw_frame);
00136 raw_header=cpl_propertylist_load(mod_name,0);
00137 check(raw_mjd=xsh_pfits_get_mjdobs(mod_header));
00138
00139 if(raw_mjd < mod_mjd) {
00140
00141 xsh_msg_warning("Raw frame %s has MJD-OBS prior than model cfg frame %s",
00142 raw_name,mod_name);
00143 xsh_msg_warning("The user should use a model cfg frame corresponding to a more recent period");
00144 }
00145
00146 cleanup:
00147 return cpl_error_get_code();
00148
00149 }
00150
00156 cpl_frameset*
00157 xsh_frameset_ext_table_frames(cpl_frameset* set) {
00158 cpl_frameset* result=NULL;
00159 int nset=0;
00160 int i=0;
00161 cpl_frame* frm=NULL;
00162 cpl_propertylist* plist=NULL;
00163 const char* name=NULL;
00164 int naxis=0;
00165
00166 check(nset=cpl_frameset_get_size(set));
00167 result=cpl_frameset_new();
00168 for(i=0;i<nset;i++) {
00169 check(frm=cpl_frameset_get_frame(set,i));
00170 check(name=cpl_frame_get_filename(frm));
00171 check(plist=cpl_propertylist_load(name,0));
00172 check(naxis=xsh_pfits_get_naxis(plist));
00173 if(naxis==0) {
00174 check(cpl_frameset_insert(result,cpl_frame_duplicate(frm)));
00175 }
00176 xsh_free_propertylist(&plist);
00177 }
00178
00179 cleanup:
00180
00181 return result;
00182 }
00183
00184
00194
00195 int xsh_dfs_files_dont_exist(cpl_frameset *frameset)
00196 {
00197 const char *func = "dfs_files_dont_exist";
00198 cpl_frame *frame;
00199
00200
00201 if (frameset == NULL) {
00202 cpl_error_set(func, CPL_ERROR_NULL_INPUT);
00203 return 1;
00204 }
00205
00206 if (cpl_frameset_is_empty(frameset)) {
00207 return 0;
00208 }
00209
00210 frame = cpl_frameset_get_first(frameset);
00211
00212 while (frame) {
00213 if (access(cpl_frame_get_filename(frame), F_OK)) {
00214 cpl_msg_error(func, "File %s (%s) was not found",
00215 cpl_frame_get_filename(frame),
00216 cpl_frame_get_tag(frame));
00217 cpl_error_set(func, CPL_ERROR_FILE_NOT_FOUND);
00218 }
00219
00220 frame = cpl_frameset_get_next(frameset);
00221 }
00222
00223 if (cpl_error_get_code())
00224 return 1;
00225
00226 return 0;
00227 }
00228
00234 cpl_frameset*
00235 xsh_frameset_ext_image_frames(cpl_frameset* set) {
00236 cpl_frameset* result=NULL;
00237 int nset=0;
00238 int i=0;
00239 cpl_frame* frm=NULL;
00240 cpl_propertylist* plist=NULL;
00241 const char* name=NULL;
00242 int naxis=0;
00243
00244 check(nset=cpl_frameset_get_size(set));
00245 result=cpl_frameset_new();
00246 for(i=0;i<nset;i++) {
00247 check(frm=cpl_frameset_get_frame(set,i));
00248 check(name=cpl_frame_get_filename(frm));
00249 check(plist=cpl_propertylist_load(name,0));
00250 check(naxis=xsh_pfits_get_naxis(plist));
00251 if(naxis==2) {
00252 check(cpl_frameset_insert(result,cpl_frame_duplicate(frm)));
00253 }
00254 xsh_free_propertylist(&plist);
00255 }
00256
00257 cleanup:
00258
00259 return result;
00260 }
00261
00267 cpl_frameset*
00268 xsh_frameset_drl_frames(cpl_frameset* set) {
00269 cpl_frameset* result=NULL;
00270 int nset=0;
00271 int i=0;
00272 cpl_frame* frm=NULL;
00273 cpl_propertylist* plist=NULL;
00274 const char* name=NULL;
00275 int naxis=0;
00276
00277 check(nset=cpl_frameset_get_size(set));
00278 result=cpl_frameset_new();
00279 for(i=0;i<nset;i++) {
00280 check(frm=cpl_frameset_get_frame(set,i));
00281 check(name=cpl_frame_get_filename(frm));
00282 check(plist=cpl_propertylist_load(name,0));
00283 check(naxis=xsh_pfits_get_naxis(plist));
00284 if(naxis==0) {
00285 check(cpl_frameset_insert(result,cpl_frame_duplicate(frm)));
00286 }
00287 xsh_free_propertylist(&plist);
00288 }
00289
00290 cleanup:
00291
00292 return result;
00293 }
00300 cpl_error_code
00301 xsh_ensure_raws_input_offset_recipe_is_proper(cpl_frameset* raws,
00302 xsh_instrument* instrument)
00303 {
00304 int nraws=0;
00305 cpl_frameset* obj=NULL;
00306 cpl_frameset* sky=NULL;
00307 const char * obj_tag=NULL;
00308 const char * sky_tag=NULL;
00309 int nobj=0;
00310 int nsky=0;
00311 int i=0;
00312 int ndif=0;
00313 cpl_frame* frm=NULL;
00314
00315 check(nraws=cpl_frameset_get_size(raws));
00316
00317 assure(nraws>=2, CPL_ERROR_ILLEGAL_INPUT, "Too few input frames. At least one OBJ and a SKY frame are required" );
00318
00319 if(xsh_instrument_get_mode(instrument) == XSH_MODE_IFU) {
00320 obj_tag = XSH_GET_TAG_FROM_ARM( XSH_OBJECT_IFU_OFFSET,instrument);
00321 } else {
00322 obj_tag = XSH_GET_TAG_FROM_ARM( XSH_OBJECT_SLIT_OFFSET,instrument);
00323 }
00324
00325 check(obj=xsh_frameset_extract(raws,obj_tag));
00326 nobj=cpl_frameset_get_size(obj);
00327 if(nobj==0) {
00328 if(xsh_instrument_get_mode(instrument) == XSH_MODE_IFU) {
00329 obj_tag = XSH_GET_TAG_FROM_ARM( XSH_STD_FLUX_IFU_OFFSET,instrument);
00330 } else {
00331 obj_tag = XSH_GET_TAG_FROM_ARM( XSH_STD_FLUX_SLIT_OFFSET,instrument);
00332 }
00333 xsh_free_frameset(&obj);
00334 check(obj=xsh_frameset_extract(raws,obj_tag));
00335 nobj=cpl_frameset_get_size(obj);
00336 }
00337
00338 if(xsh_instrument_get_mode(instrument) == XSH_MODE_IFU) {
00339 sky_tag = XSH_GET_TAG_FROM_ARM( XSH_SKY_IFU,instrument);
00340 } else {
00341 sky_tag = XSH_GET_TAG_FROM_ARM( XSH_SKY_SLIT,instrument);
00342 }
00343 xsh_free_frameset(&sky);
00344 check(sky=xsh_frameset_extract(raws,sky_tag));
00345
00346
00347
00348 nsky=cpl_frameset_get_size(sky);
00349
00350 assure(nobj>0, CPL_ERROR_ILLEGAL_INPUT, "Too few input obj frames. At least a OBJ frame is required" );
00351
00352 assure(nsky>0, CPL_ERROR_ILLEGAL_INPUT, "Too few input sky frames. At least a SKY frame is required" );
00353
00354 if(nobj>nsky) {
00355 xsh_msg("case nobj> nsky");
00356 ndif=nobj-nsky;
00357 for(i=0;i<ndif;i++) {
00358 check(frm=cpl_frameset_get_frame(obj,nobj-i-1));
00359 check(cpl_frameset_erase_frame(obj,frm));
00360 }
00361 } else if(nsky>nobj) {
00362 xsh_msg("case nsky> nobj");
00363 ndif=nsky-nobj;
00364 for(i=0;i<ndif;i++) {
00365 check(frm=cpl_frameset_get_frame(sky,nsky-i-1));
00366 check(cpl_frameset_erase_frame(sky,frm));
00367 }
00368 } else {
00369 ndif=nsky-nobj;
00370 xsh_free_frameset(&obj);
00371 xsh_free_frameset(&sky);
00372 return CPL_ERROR_NONE;
00373
00374 }
00375 xsh_free_frameset(&raws);
00376 check(raws=cpl_frameset_duplicate(obj));
00377 check(xsh_frameset_merge(raws,sky));
00378
00379 cleanup:
00380 xsh_free_frameset(&obj);
00381 xsh_free_frameset(&sky);
00382
00383 return cpl_error_get_code();
00384
00385 }
00386
00387
00394 static double
00395 xsh_get_offsety(cpl_propertylist* plist)
00396 {
00397
00398 double offsety=0;
00399 double ra_off=0;
00400 double dec_off=0;
00401 double posang=0;
00402
00403 if(cpl_propertylist_has(plist,XSH_NOD_CUMULATIVE_OFFSETY)) {
00404 offsety=xsh_pfits_get_cumoffsety(plist);
00405 } else {
00406 ra_off=xsh_pfits_get_ra_cumoffset(plist);
00407 dec_off=xsh_pfits_get_dec_cumoffset(plist);
00408 posang = xsh_pfits_get_posang(plist);
00409 posang = posang/180.0* M_PI;
00410
00411
00412
00413
00414 offsety=(cos(-posang)*dec_off+
00415 sin(-posang)*ra_off);
00416 xsh_msg("ra_off=%f,dec_off=%f,offsety=%f,posang=%f",
00417 ra_off,dec_off,offsety,posang);
00418 }
00419
00420 return offsety;
00421
00422 }
00423
00431 cpl_frameset*
00432 xsh_frameset_extract_offsety_matches(cpl_frameset* raws,const double offset)
00433 {
00434 cpl_frame* frm=NULL;
00435 cpl_frameset* result=NULL;
00436 cpl_propertylist* plist=NULL;
00437 double offsety=0;
00438 const char* name=NULL;
00439 int nraw=0;
00440 int i=0;
00441
00442 XSH_ASSURE_NOT_NULL_MSG(raws,"null input frameset");
00443 nraw=cpl_frameset_get_size(raws);
00444 result=cpl_frameset_new();
00445 for(i=0;i<nraw;i++) {
00446 frm=cpl_frameset_get_frame(raws,i);
00447 name=cpl_frame_get_filename(frm);
00448 plist=cpl_propertylist_load(name,0);
00449 offsety=xsh_get_offsety(plist);
00450
00451 if(fabs(offsety-offset)<1.E-8) {
00452 cpl_frameset_insert(result,cpl_frame_duplicate(frm));
00453 }
00454 xsh_free_propertylist(&plist);
00455 }
00456
00457 cleanup:
00458 xsh_free_propertylist(&plist);
00459
00460 return result;
00461
00462 }
00463
00464
00465
00473 cpl_frameset*
00474 xsh_frameset_extract_offsety_mismatches(cpl_frameset* raws,const double offset)
00475 {
00476 cpl_frame* frm=NULL;
00477 cpl_frameset* result=NULL;
00478 cpl_propertylist* plist=NULL;
00479 double offsety=0;
00480 const char* name=NULL;
00481 int nraw=0;
00482 int i=0;
00483
00484 double ra_off=0;
00485 double dec_off=0;
00486 double posang=0;
00487
00488 XSH_ASSURE_NOT_NULL_MSG(raws,"null input frameset");
00489 nraw=cpl_frameset_get_size(raws);
00490 result=cpl_frameset_new();
00491 for(i=0;i<nraw;i++) {
00492 frm=cpl_frameset_get_frame(raws,i);
00493 name=cpl_frame_get_filename(frm);
00494 plist=cpl_propertylist_load(name,0);
00495 if(cpl_propertylist_has(plist,XSH_NOD_CUMULATIVE_OFFSETY)) {
00496 offsety=xsh_pfits_get_cumoffsety(plist);
00497 } else {
00498 ra_off=xsh_pfits_get_ra_cumoffset(plist);
00499 dec_off=xsh_pfits_get_dec_cumoffset(plist);
00500 posang = xsh_pfits_get_posang(plist);
00501 posang = posang/180.0* M_PI;
00502
00503
00504
00505
00506 offsety=(cos(-posang)*dec_off+
00507 sin(-posang)*ra_off);
00508 xsh_msg("ra_off=%f,dec_off=%f,offsety=%f,posang=%f",
00509 ra_off,dec_off,offsety,posang);
00510 }
00511 if(offsety!=offset) {
00512 cpl_frameset_insert(result,cpl_frame_duplicate(frm));
00513 }
00514 xsh_free_propertylist(&plist);
00515 }
00516
00517 cleanup:
00518 xsh_free_propertylist(&plist);
00519
00520 return result;
00521
00522 }
00523
00530 cpl_frameset*
00531 xsh_extract_nod_pairs(cpl_frameset* raws,
00532 cpl_vector* offset)
00533 {
00534 int nraws=0;
00535 cpl_frameset* set_a=NULL;
00536 cpl_frameset* set_b=NULL;
00537 cpl_frameset* result=NULL;
00538 cpl_propertylist* plist=NULL;
00539 double offsety_a=0;
00540
00541
00542 int na=0;
00543 int nb=0;
00544 int i=0;
00545 int j=0;
00546 int k=0;
00547 cpl_frame* frm_a=NULL;
00548 cpl_frame* frm_b=NULL;
00549 cpl_frame* frm_tmp=NULL;
00550 double mjd_obs_a=0;
00551 double mjd_obs_b=0;
00552 double mjd_obs_tmp=0;
00553 const char* name=NULL;
00554 int noff=0;
00555 double mjd_obs_ref=-999999.;
00556 XSH_ASSURE_NOT_NULL_MSG(raws,"null input frameset");
00557
00558 check(nraws=cpl_frameset_get_size(raws));
00559 xsh_msg("nraws=%d",nraws);
00560 assure(nraws>=2, CPL_ERROR_ILLEGAL_INPUT, "Too few input frames. At least two NOD positions are required" );
00561
00562 noff=cpl_vector_get_size(offset);
00563 result=cpl_frameset_new();
00564 for(i=0;i<noff;i++) {
00565 offsety_a=cpl_vector_get(offset,i);
00566 xsh_msg("offsety_a=%f",offsety_a);
00567 xsh_free_frameset(&set_a);
00568 xsh_free_frameset(&set_b);
00569 check(set_a=xsh_frameset_extract_offsety_matches(raws,offsety_a));
00570 check(set_b=xsh_frameset_extract_offsety_mismatches(raws,offsety_a));
00571
00572 na=cpl_frameset_get_size(set_a);
00573 nb=cpl_frameset_get_size(set_b);
00574 xsh_msg("na=%d nb=%d",na,nb);
00575 for(k=0;k<na;k++) {
00576
00577 check(frm_a=cpl_frameset_get_frame(set_a,k));
00578 check(name=cpl_frame_get_filename(frm_a));
00579 check(plist=cpl_propertylist_load(name,0));
00580 check(mjd_obs_a=xsh_pfits_get_mjdobs(plist));
00581 xsh_free_propertylist(&plist);
00582
00583
00584
00585 mjd_obs_b=mjd_obs_ref;
00586 for(j=0;j<nb;j++) {
00587
00588 check(frm_tmp=cpl_frameset_get_frame(set_b,j));
00589 check(name=cpl_frame_get_filename(frm_tmp));
00590 check(plist=cpl_propertylist_load(name,0));
00591 check(mjd_obs_tmp=xsh_pfits_get_mjdobs(plist));
00592
00593 if(fabs(mjd_obs_tmp-mjd_obs_a) < fabs(mjd_obs_b-mjd_obs_a)) {
00594 mjd_obs_b=mjd_obs_tmp;
00595 frm_b=frm_tmp;
00596 }
00597 }
00598
00599
00600 cpl_frameset_erase_frame(raws,frm_a);
00601
00602
00603
00604
00605
00606
00607
00608 cpl_frameset_erase_frame(raws,frm_b);
00609 cpl_frameset_insert(result,cpl_frame_duplicate(frm_a));
00610 cpl_frameset_insert(result,cpl_frame_duplicate(frm_b));
00611 xsh_free_frameset(&set_a);
00612 xsh_free_frameset(&set_b);
00613 check(set_a=xsh_frameset_extract_offsety_matches(raws,offsety_a));
00614 check(set_b=xsh_frameset_extract_offsety_mismatches(raws,offsety_a));
00615 na=cpl_frameset_get_size(set_a);
00616 nb=cpl_frameset_get_size(set_b);
00617
00618 xsh_msg("check again na=%d nb=%d",na,nb);
00619
00620 }
00621 xsh_msg("ok0 i=%d",i);
00622
00623 }
00624
00625 cleanup:
00626 xsh_free_frameset(&set_a);
00627 xsh_free_frameset(&set_b);
00628 xsh_free_propertylist(&plist);
00629
00630
00631 return result;
00632
00633 }
00634
00635
00636
00637
00644 cpl_frameset*
00645 xsh_extract_obj_and_sky_pairs(cpl_frameset* raws, xsh_instrument* instrument)
00646 {
00647 int nraws=0;
00648 cpl_frameset* obj=NULL;
00649 cpl_frameset* sky=NULL;
00650 cpl_frameset* result=NULL;
00651 cpl_propertylist* plist=NULL;
00652
00653 const char * obj_tag=NULL;
00654 const char * sky_tag=NULL;
00655 int nobj=0;
00656 int nsky=0;
00657 int i=0;
00658 int j=0;
00659 cpl_frame* frm_obj=NULL;
00660 cpl_frame* frm_sky=NULL;
00661 cpl_frame* frm_tmp=NULL;
00662 double mjdobs_obj=0;
00663 double mjdobs_sky=0;
00664 double mjdobs_tmp=0;
00665 const char* name=NULL;
00666
00667 check(nraws=cpl_frameset_get_size(raws));
00668 xsh_msg("nraws=%d",nraws);
00669 assure(nraws>=2, CPL_ERROR_ILLEGAL_INPUT, "Too few input frames. At least one OBJ and a SKY frame are required" );
00670 if(xsh_instrument_get_mode(instrument) == XSH_MODE_IFU) {
00671 obj_tag = XSH_GET_TAG_FROM_ARM( XSH_OBJECT_IFU_OFFSET,instrument);
00672 sky_tag = XSH_GET_TAG_FROM_ARM( XSH_SKY_IFU,instrument);
00673 } else {
00674 obj_tag = XSH_GET_TAG_FROM_ARM( XSH_OBJECT_SLIT_OFFSET,instrument);
00675 sky_tag = XSH_GET_TAG_FROM_ARM( XSH_SKY_SLIT,instrument);
00676 }
00677
00678 check(obj=xsh_frameset_extract(raws,obj_tag));
00679 check(sky=xsh_frameset_extract(raws,sky_tag));
00680
00681 nobj=cpl_frameset_get_size(obj);
00682 nsky=cpl_frameset_get_size(sky);
00683
00684 assure(nobj>0, CPL_ERROR_ILLEGAL_INPUT, "Too few input obj frames. At least a OBJ frame is required" );
00685
00686 assure(nsky>0, CPL_ERROR_ILLEGAL_INPUT, "Too few input sky frames. At least a SKY frame is required" );
00687
00688 result=cpl_frameset_new();
00689 for(i=0;i<nobj;i++) {
00690 check(frm_obj=cpl_frameset_get_frame(obj,i));
00691 check(name=cpl_frame_get_filename(frm_obj));
00692 check(plist=cpl_propertylist_load(name,0));
00693 check(mjdobs_obj=xsh_pfits_get_mjdobs(plist));
00694 xsh_free_propertylist(&plist);
00695
00696
00697 check(frm_sky=cpl_frameset_get_frame(sky,0));
00698 check(name=cpl_frame_get_filename(frm_sky));
00699 check(plist=cpl_propertylist_load(name,0));
00700 check(mjdobs_sky=xsh_pfits_get_mjdobs(plist));
00701 xsh_free_propertylist(&plist);
00702 cpl_frameset_insert(result,cpl_frame_duplicate(frm_obj));
00703
00704 for(j=1;j<nsky;j++) {
00705 check(frm_tmp=cpl_frameset_get_frame(sky,j));
00706 check(name=cpl_frame_get_filename(frm_tmp));
00707 check(plist=cpl_propertylist_load(name,0));
00708 check(mjdobs_tmp=xsh_pfits_get_mjdobs(plist));
00709
00710 if(fabs(mjdobs_tmp-mjdobs_obj) < fabs(mjdobs_sky-mjdobs_obj)) {
00711 mjdobs_sky=mjdobs_tmp;
00712 frm_sky=frm_tmp;
00713 }
00714 }
00715 cpl_frameset_insert(result,cpl_frame_duplicate(frm_sky));
00716 }
00717
00718
00719 cleanup:
00720 xsh_free_frameset(&obj);
00721 xsh_free_frameset(&sky);
00722 xsh_free_propertylist(&plist);
00723
00724 return result;
00725
00726 }
00727
00733 cpl_error_code
00734 xsh_ensure_raws_number_is_even(cpl_frameset* raws)
00735 {
00736 int nraws=0;
00737 cpl_frame* frame1=NULL;
00738 cpl_frame* frame2=NULL;
00739 cpl_frame* frameN=NULL;
00740 cpl_propertylist* plist1=NULL;
00741 cpl_propertylist* plist2=NULL;
00742 cpl_propertylist* plistN=NULL;
00743 const char* name1=NULL;
00744 const char* name2=NULL;
00745 const char* nameN=NULL;
00746 double yshift1=0;
00747 double yshift2=0;
00748 double yshiftN=0;
00749
00750
00751
00752 check(nraws=cpl_frameset_get_size(raws));
00753 if ( (nraws % 2) != 0 ) {
00754 xsh_msg_warning("odd number of frames: nraws=%d",nraws);
00755 check(frame1=cpl_frameset_get_frame(raws,0));
00756 check(frame2=cpl_frameset_get_frame(raws,1));
00757 check(frameN=cpl_frameset_get_frame(raws,nraws-1));
00758 check(name1=cpl_frame_get_filename(frame1));
00759 check(name2=cpl_frame_get_filename(frame2));
00760 check(nameN=cpl_frame_get_filename(frameN));
00761 check(plist1=cpl_propertylist_load(name1,0));
00762 check(plist2=cpl_propertylist_load(name2,0));
00763 check(plistN=cpl_propertylist_load(nameN,0));
00764 check(yshift1=xsh_get_offsety(plist1));
00765 check(yshift2=xsh_get_offsety(plist2));
00766 check(yshiftN=xsh_get_offsety(plistN));
00767 if(yshift1 == yshiftN) {
00768 xsh_msg_warning("yshift(Frame1)==yshift(FrameN)");
00769 if ( fabs(yshift1-yshift2) <= DBL_MIN ) {
00770 xsh_msg_warning("yshift(Frame1)!=yshift(Frame2)");
00771 xsh_msg_warning("Remove last from list. Frame %s",
00772 cpl_frame_get_filename(frameN));
00773 cpl_frameset_erase_frame(raws,frameN);
00774 } else {
00775 xsh_msg_warning("yshift(Frame1)==yshift(Frame2)");
00776 xsh_msg_warning("Remove last from list. Frame %s",
00777 cpl_frame_get_filename(frameN));
00778 cpl_frameset_erase_frame(raws,frameN);
00779 }
00780 } else {
00781 xsh_msg_warning("yshift(Frame1)!=yshift(FrameN)");
00782 if (fabs(yshift1 - yshift2) <= DBL_MIN) {
00783 xsh_msg_warning("yshift(Frame1)!=yshift(Frame2)");
00784 xsh_msg_warning("Remove last from list. Frame %s",
00785 cpl_frame_get_filename(frameN));
00786 cpl_frameset_erase_frame(raws,frameN);
00787 } else {
00788 xsh_msg_warning("yshift(Frame1)==yshift(Frame2)");
00789 xsh_msg_warning("Remove first from list. Frame %s",
00790 cpl_frame_get_filename(frame1));
00791 cpl_frameset_erase_frame(raws,frame1);
00792 }
00793 }
00794 }
00795
00796 cleanup:
00797 xsh_free_propertylist(&plist1);
00798 xsh_free_propertylist(&plist2);
00799 xsh_free_propertylist(&plistN);
00800
00801 return cpl_error_get_code();
00802
00803 }
00809 int
00810 xsh_print_rec_status(const int val) {
00811 if(cpl_error_get_code() != CPL_ERROR_NONE) {
00812 xsh_msg_error("Recipe status at %d",val);
00813 xsh_msg_error("%s",(const char*) cpl_error_get_message());
00814 xsh_msg_error("%s",(const char*) cpl_error_get_where());
00815 return -1;
00816 }
00817 return 0;
00818 }
00819
00820
00832 void
00833 xsh_frame_config(const char* fname,
00834 const char* tag,
00835 cpl_frame_type type,
00836 cpl_frame_group group,
00837 cpl_frame_level level,
00838 cpl_frame** frame)
00839 {
00840
00841 check(cpl_frame_set_filename(*frame,fname));
00842 check(cpl_frame_set_tag(*frame,tag));
00843 check(cpl_frame_set_type(*frame,type));
00844 check(cpl_frame_set_group(*frame,group));
00845 check(cpl_frame_set_level(*frame,level));
00846
00847 cleanup:
00848
00849 return;
00850
00851 }
00862 cpl_frame*
00863 xsh_frame_product(const char* fname, const char* tag, cpl_frame_type type,
00864 cpl_frame_group group,cpl_frame_level level)
00865 {
00866 cpl_frame* frame=NULL;
00867 check(frame=cpl_frame_new());
00868
00869 check(xsh_frame_config(fname,tag,type,group,level,&frame));
00870
00871 return frame;
00872
00873 cleanup:
00874 xsh_free_frame(&frame);
00875
00876 return NULL;
00877 }
00878
00889
00890
00891
00892 int xsh_file_exists(const char * filename)
00893 {
00894 int exists=0;
00895 FILE* fo=NULL;
00896 if ((fo=fopen(filename,"r"))==NULL) {
00897 exists=0;
00898 } else {
00899 exists=1;
00900 }
00901 fclose(fo);
00902 return exists;
00903 }
00904
00905
00912
00913 cpl_frameset *
00914 xsh_frameset_extract(const cpl_frameset *frames,
00915 const char *tag)
00916 {
00917 cpl_frameset *subset = NULL;
00918 const cpl_frame *f;
00919
00920
00921
00922 assure( frames != NULL, CPL_ERROR_ILLEGAL_INPUT, "Null frameset" );
00923 assure( tag != NULL, CPL_ERROR_ILLEGAL_INPUT, "Null tag" );
00924
00925 subset = cpl_frameset_new();
00926
00927 for (f = cpl_frameset_find_const(frames, tag);
00928 f != NULL;
00929 f = cpl_frameset_find_const(frames, NULL)) {
00930
00931 cpl_frameset_insert(subset, cpl_frame_duplicate(f));
00932 }
00933 cleanup:
00934 return subset;
00935 }
00936
00943
00944 cpl_error_code
00945 xsh_frameset_merge(cpl_frameset * set1, cpl_frameset* set2)
00946 {
00947
00948 cpl_frame* frm_tmp=NULL;
00949 cpl_frame* frm_dup=NULL;
00950
00951 passure(set1 != NULL, "Wrong input set");
00952
00953 check(frm_tmp = cpl_frameset_get_first(set2));
00954 while (frm_tmp != NULL)
00955 {
00956 frm_dup=cpl_frame_duplicate(frm_tmp);
00957 cpl_frameset_insert(set1,frm_dup);
00958 frm_tmp = cpl_frameset_get_next(set2);
00959 }
00960
00961 cleanup:
00962 return cpl_error_get_code();
00963 }
00964
00965
00972
00973 xsh_instrument* xsh_dfs_set_groups (cpl_frameset * set)
00974 {
00975 cpl_frame * cur_frame = NULL;
00976 xsh_instrument* instrument = NULL;
00977
00978
00979 assure (set != NULL, CPL_ERROR_NULL_INPUT, "Null frame set");
00980 assure (!cpl_frameset_is_empty(set),CPL_ERROR_ILLEGAL_INPUT,
00981 "Empty frame set");
00982
00983
00984 instrument = xsh_instrument_new();
00985
00986
00987 for (cur_frame = cpl_frameset_get_first (set);
00988 cur_frame != NULL;
00989 cur_frame = cpl_frameset_get_next (set)) {
00990 const char *tag = NULL;
00991
00992 check(tag = cpl_frame_get_tag (cur_frame));
00993
00994
00995
00996 check(cpl_frame_set_group (cur_frame, CPL_FRAME_GROUP_NONE));
00997
00998
00999 if (XSH_IS_RAW (tag)) {
01000 check(cpl_frame_set_group (cur_frame, CPL_FRAME_GROUP_RAW));
01001 }
01002
01003 else if (XSH_IS_CALIB (tag)) {
01004 check(cpl_frame_set_group (cur_frame, CPL_FRAME_GROUP_CALIB));
01005 }
01006
01007 else {
01008 xsh_msg_error("Unrecognized frame tag '%s'",tag);
01009 check(cpl_error_set(cpl_func,CPL_ERROR_ILLEGAL_INPUT ));
01010
01011
01012 }
01013
01014
01015
01016 check_msg(xsh_instrument_parse_tag(instrument,tag),
01017 "invalid tag %s in file %s",
01018 tag, cpl_frame_get_filename (cur_frame));
01019 }
01020
01021 assure(xsh_instrument_get_arm(instrument)!=XSH_ARM_UNDEFINED,
01022 CPL_ERROR_TYPE_MISMATCH,"Arm is undefined");
01023 xsh_instrument_get_config( instrument ) ;
01024 xsh_msg( "Arm %s, Mode %s Nb Orders %d, min: %d, max: %d",
01025 xsh_instrument_arm_tostring(instrument),
01026 xsh_instrument_mode_tostring( instrument),
01027 instrument->config->orders, instrument->config->order_min,
01028 instrument->config->order_max ) ;
01029 cleanup:
01030 if (cpl_error_get_code () != CPL_ERROR_NONE){
01031 xsh_instrument_free(&instrument);
01032 instrument = NULL;
01033 }
01034 return instrument;
01035 }
01036
01043
01044 cpl_error_code
01045 xsh_dfs_extract_raw_frames (cpl_frameset * input, cpl_frameset * raws)
01046 {
01047 cpl_frame *cur_frame = NULL;
01048
01049
01050 for (cur_frame = cpl_frameset_get_first (input);
01051 cur_frame != NULL; cur_frame = cpl_frameset_get_next (input)) {
01052
01053 if (cpl_frame_get_group (cur_frame) == CPL_FRAME_GROUP_RAW) {
01054 cpl_frameset_insert (raws, cpl_frame_duplicate(cur_frame));
01055 }
01056 }
01057
01058 return cpl_error_get_code();
01059
01060 }
01061
01068
01069 cpl_error_code
01070 xsh_dfs_extract_calib_frames (cpl_frameset * input, cpl_frameset * calib)
01071 {
01072 cpl_frame *cur_frame = NULL;
01073
01074
01075 for (cur_frame = cpl_frameset_get_first (input);
01076 cur_frame != NULL; cur_frame = cpl_frameset_get_next (input)) {
01077
01078 if (cpl_frame_get_group (cur_frame) == CPL_FRAME_GROUP_CALIB) {
01079 cpl_frameset_insert (calib, cpl_frame_duplicate(cur_frame));
01080 }
01081 }
01082
01083 return cpl_error_get_code();
01084
01085 }
01086
01087
01094
01095 cpl_error_code
01096 xsh_dfs_extract_pro_frames (cpl_frameset * input, cpl_frameset * pros)
01097 {
01098 cpl_frame *cur_frame = NULL;
01099 XSH_ASSURE_NOT_NULL_MSG(pros,"Null pros frameset. Alllocated it outside!");
01100
01101 for (cur_frame = cpl_frameset_get_first (input);
01102 cur_frame != NULL; cur_frame = cpl_frameset_get_next (input)) {
01103
01104 if (cpl_frame_get_group (cur_frame) == CPL_FRAME_GROUP_PRODUCT) {
01105 cpl_frameset_insert (pros, cpl_frame_duplicate(cur_frame));
01106 }
01107 }
01108 cleanup:
01109 return cpl_error_get_code();
01110
01111 }
01112
01113
01120
01121 void
01122 xsh_dfs_split_in_group (cpl_frameset * input, cpl_frameset * raws,
01123 cpl_frameset * calib)
01124 {
01125 cpl_frame *cur_frame = NULL;
01126
01127
01128 for (cur_frame = cpl_frameset_get_first (input);
01129 cur_frame != NULL; cur_frame = cpl_frameset_get_next (input)) {
01130
01131 if (cpl_frame_get_group (cur_frame) == CPL_FRAME_GROUP_RAW) {
01132
01133 cpl_frameset_insert (raws, cpl_frame_duplicate(cur_frame));
01134 }
01135
01136 else if (cpl_frame_get_group (cur_frame) == CPL_FRAME_GROUP_CALIB) {
01137 cpl_frameset_insert (calib, cpl_frame_duplicate(cur_frame));
01138 }
01139
01140 else {
01141 xsh_msg_error ("Unrecognized group for frame %s",
01142 cpl_frame_get_filename (cur_frame));
01143 }
01144 }
01145 }
01146
01147
01148
01156
01157 void
01158 xsh_dfs_split_qth_d2(cpl_frameset * input,
01159 cpl_frameset** qth,
01160 cpl_frameset** d2)
01161 {
01162 cpl_frame* cur_frame = NULL;
01163 cpl_frame* temp =NULL;
01164
01165
01166 XSH_ASSURE_NOT_NULL( input);
01167 XSH_ASSURE_NOT_NULL( qth);
01168 XSH_ASSURE_NOT_NULL( d2);
01169
01170
01171 XSH_NEW_FRAMESET( *qth);
01172 XSH_NEW_FRAMESET( *d2);
01173
01174
01175 for (cur_frame = cpl_frameset_get_first (input);
01176 cur_frame != NULL; cur_frame = cpl_frameset_get_next (input)) {
01177 const char* tag = NULL;
01178
01179 check(tag = cpl_frame_get_tag(cur_frame));
01180
01181 if ( strstr(tag,"D2") != NULL) {
01182 check(temp = cpl_frame_duplicate(cur_frame));
01183 check(cpl_frameset_insert(*d2, temp));
01184 }
01185
01186 else if ( strstr(tag, "QTH") != NULL) {
01187 check(temp = cpl_frame_duplicate(cur_frame));
01188 check(cpl_frameset_insert(*qth, temp));
01189 }
01190
01191 else {
01192 xsh_msg_error ("Invalid tag %s for frame %s",tag,
01193 cpl_frame_get_filename (cur_frame));
01194 }
01195 }
01196
01197 cleanup:
01198 if (cpl_error_get_code() != CPL_ERROR_NONE){
01199 xsh_free_frame(&temp);
01200 xsh_free_frameset(d2);
01201 xsh_free_frameset(qth);
01202 }
01203 return;
01204 }
01205
01212
01213 void xsh_dfs_split_nir(cpl_frameset * input, cpl_frameset** on,
01214 cpl_frameset** off)
01215 {
01216 cpl_frame* cur_frame = NULL;
01217 cpl_frame* temp =NULL;
01218
01219
01220 XSH_ASSURE_NOT_NULL(input);
01221 XSH_ASSURE_NOT_NULL(on);
01222 XSH_ASSURE_NOT_NULL(off);
01223
01224
01225 XSH_NEW_FRAMESET(*on);
01226 XSH_NEW_FRAMESET(*off);
01227
01228
01229 for (cur_frame = cpl_frameset_get_first (input);
01230 cur_frame != NULL; cur_frame = cpl_frameset_get_next (input)) {
01231 const char* tag = NULL;
01232
01233 check(tag = cpl_frame_get_tag(cur_frame));
01234
01235 if ( strstr(tag,"ON") != NULL) {
01236 check(temp = cpl_frame_duplicate(cur_frame));
01237 check(cpl_frameset_insert(*on, temp));
01238 }
01239
01240 else if ( strstr(tag, "OFF") != NULL) {
01241 check(temp = cpl_frame_duplicate(cur_frame));
01242 check(cpl_frameset_insert(*off, temp));
01243 }
01244
01245 else {
01246 xsh_msg_error ("Invalid tag %s for frame %s",tag,
01247 cpl_frame_get_filename (cur_frame));
01248 }
01249 }
01250
01251 cleanup:
01252 if (cpl_error_get_code() != CPL_ERROR_NONE){
01253 xsh_free_frame(&temp);
01254 xsh_free_frameset(on);
01255 xsh_free_frameset(off);
01256 }
01257 return;
01258 }
01259
01260
01271
01272 int
01273 xsh_dfs_split_offset(cpl_frameset * input,
01274 const char * object_tag,
01275 const char * sky_tag,
01276 cpl_frameset ** object,
01277 cpl_frameset ** sky)
01278 {
01279 cpl_frame* cur_frame = NULL;
01280 cpl_frame* temp =NULL;
01281 int nobj = 0, nsky = 0 ;
01282
01283
01284 XSH_ASSURE_NOT_NULL(input);
01285 XSH_ASSURE_NOT_NULL(object);
01286 XSH_ASSURE_NOT_NULL(sky);
01287
01288
01289 *object=cpl_frameset_new();
01290 *sky=cpl_frameset_new();
01291
01292
01293 for (cur_frame = cpl_frameset_get_first (input);
01294 cur_frame != NULL; cur_frame = cpl_frameset_get_next (input)) {
01295 const char* tag = NULL;
01296
01297 check(tag = cpl_frame_get_tag(cur_frame));
01298
01299 xsh_msg_dbg_medium( "Tag: %s", tag ) ;
01300
01301 if ( strstr(tag, object_tag) != NULL) {
01302 check(temp = cpl_frame_duplicate(cur_frame));
01303 check(cpl_frameset_insert(*object, temp));
01304 nobj++ ;
01305 }
01306
01307 else if ( strstr(tag, sky_tag) != NULL) {
01308 check(temp = cpl_frame_duplicate(cur_frame));
01309 check(cpl_frameset_insert(*sky, temp));
01310 nsky++ ;
01311 }
01312
01313 else {
01314 xsh_msg_error ("Invalid tag %s for frame %s",tag,
01315 cpl_frame_get_filename (cur_frame));
01316 }
01317
01318 }
01319
01320 xsh_msg_dbg_medium( "Nobj: %d, Nsky: %d", nobj, nsky ) ;
01321 XSH_ASSURE_NOT_ILLEGAL( nobj == nsky ) ;
01322
01323 cleanup:
01324 if (cpl_error_get_code() != CPL_ERROR_NONE){
01325 xsh_print_rec_status(0);
01326 xsh_free_frame(&temp);
01327 return 0 ;
01328 }
01329 return nobj ;
01330 }
01331
01332
01333
01334
01346
01347 static bool
01348 xsh_dfs_tag_check( const char* tag, const char* tag_list[], int size)
01349 {
01350 int i;
01351
01352 for( i=0; i< size; i++){
01353 if ( strstr( tag, tag_list[i])!=NULL){
01354 return true;
01355 }
01356 }
01357 return false;
01358 }
01359
01360
01371
01372 void
01373 xsh_dfs_filter( cpl_frameset * set, const char* tags[], int size){
01374 cpl_frame *cur_frame = NULL;
01375
01376 XSH_ASSURE_NOT_NULL( set);
01377 XSH_ASSURE_NOT_NULL( tags);
01378 XSH_ASSURE_NOT_ILLEGAL( size > 0);
01379
01380
01381 check( cur_frame = cpl_frameset_get_first (set));
01382
01383 while(cur_frame != NULL){
01384 const char* ftag = NULL;
01385
01386 check( ftag = cpl_frame_get_tag( cur_frame));
01387 if (!xsh_dfs_tag_check( ftag, tags, size)){
01388 cpl_frame *del_frame = NULL;
01389
01390 del_frame = cur_frame;
01391 check( cur_frame = cpl_frameset_get_next( set));
01392 check( cpl_frameset_erase_frame( set, del_frame));
01393 }
01394 else{
01395 check(cur_frame = cpl_frameset_get_next (set));
01396 }
01397 }
01398
01399 cleanup:
01400 return;
01401 }
01402
01403
01411
01412 cpl_frameset *
01413 xsh_frameset_extract_pre(cpl_frameset * frameset, const char* prefix)
01414 {
01415 cpl_frameset* set=NULL;
01416 cpl_frame* current=NULL;
01417 cpl_frame* found=NULL;
01418 int sz=0;
01419 int i=0;
01420 char tag[80];
01421 char name[80];
01422
01423 check(sz=cpl_frameset_get_size(frameset));
01424
01425 check(set=cpl_frameset_new());
01426 for(i=0;i<sz;i++) {
01427 check( current = cpl_frameset_get_frame(frameset, i));
01428 sprintf(name, "%s_PRE_%d.fits", prefix, i);
01429 sprintf(tag, "%s_PRE_%d", prefix, i);
01430
01431 if(xsh_file_exists(name) == 1) {
01432 check(found=cpl_frame_duplicate(current));
01433 check( cpl_frame_set_filename(found, name) );
01434 cpl_frameset_insert(set,found);
01435 }
01436
01437 }
01438 cleanup:
01439
01440 return set;
01441
01442 }
01443
01444
01450
01451 cpl_frame *
01452 xsh_find_bpmap (cpl_frameset * set)
01453 {
01454 cpl_frame *cur_frame = NULL;
01455
01456
01457 for (cur_frame = cpl_frameset_get_first (set);
01458 cur_frame != NULL; cur_frame = cpl_frameset_get_next (set)) {
01459 if (strstr (cpl_frame_get_tag (cur_frame), "BADPIXEL_MAP")) {
01460 return cur_frame;
01461 }
01462 }
01463 return NULL;
01464 }
01465
01466
01467
01473
01474 cpl_frame *
01475 xsh_find_master_bpmap (cpl_frameset * set)
01476 {
01477 cpl_frame *cur_frame = NULL;
01478
01479
01480 for (cur_frame = cpl_frameset_get_first (set);
01481 cur_frame != NULL; cur_frame = cpl_frameset_get_next (set)) {
01482 if (strstr (cpl_frame_get_tag (cur_frame), XSH_MASTER_BP_MAP)) {
01483 return cur_frame;
01484 }
01485 }
01486 return NULL;
01487 }
01488
01489
01495
01496 cpl_frame * xsh_find_off(cpl_frameset* set)
01497 {
01498 cpl_frame *cur_frame = NULL;
01499
01500
01501 for (cur_frame = cpl_frameset_get_first (set);
01502 cur_frame != NULL; cur_frame = cpl_frameset_get_next (set)) {
01503 if (strstr (cpl_frame_get_tag (cur_frame), "OFF")) {
01504 return cur_frame;
01505 }
01506 }
01507 return NULL;
01508 }
01509
01510
01516
01517 cpl_frame * xsh_find_on(cpl_frameset* set)
01518 {
01519 cpl_frame *cur_frame = NULL;
01520
01521
01522 for (cur_frame = cpl_frameset_get_first (set);
01523 cur_frame != NULL; cur_frame = cpl_frameset_get_next (set)) {
01524 if (strstr (cpl_frame_get_tag (cur_frame), "ON")) {
01525 return cur_frame;
01526 }
01527 }
01528 return NULL;
01529 }
01530
01537
01538 void
01539 xsh_dfs_find_flat(cpl_frameset* raws,cpl_frameset* flat)
01540 {
01541 cpl_frame *cur_frame = NULL;
01542 const char* tag = NULL;
01543
01544 assure (raws != NULL, CPL_ERROR_NULL_INPUT, "Null frameset");
01545 assure (flat != NULL, CPL_ERROR_NULL_INPUT, "Null frameset");
01546
01547
01548 tag = cpl_frame_get_tag(cpl_frameset_get_first(raws));
01549
01550
01551 for (cur_frame = cpl_frameset_get_first (raws);
01552 cur_frame != NULL; cur_frame = cpl_frameset_get_next (raws))
01553 {
01554 tag = cpl_frame_get_tag (cur_frame);
01555 if (strstr(tag,"FLAT")!=NULL)
01556 cpl_frameset_insert (flat, cur_frame);
01557 }
01558
01559 cleanup:
01560 return;
01561
01562 }
01563
01564
01579
01580 char *
01581 xsh_unique_filename (const char *context, const char *caller_id,
01582 const char *pro_catg)
01583 {
01584 if (context != NULL) {
01585
01586 return xsh_stringcat_6 (context, "-", caller_id, "-", pro_catg, ".fits");
01587 }
01588 else {
01589 return xsh_stringcat_4 (caller_id, "-", pro_catg, ".fits");
01590 }
01591 }
01592
01593
01605 void xsh_add_product(cpl_frame *frame,
01606 cpl_frameset * frameset,
01607 const cpl_parameterlist * parameters,
01608 const char *recipe_id,
01609 xsh_instrument* instrument,
01610 const char *final_prefix ,
01611 const char* type)
01612 {
01613 cpl_propertylist *primary_header = NULL;
01614 cpl_propertylist *tbl_header = NULL;
01615 int extension=0;
01616 const char *pro_catg = NULL;
01617 cpl_frame* product_frame = NULL;
01618
01619 cpl_table *table = NULL ;
01620 cpl_image *image = NULL ;
01621 cpl_imagelist *imagelist = NULL ;
01622
01623
01624 const char *fname = NULL;
01625 char *final_name = NULL ;
01626 time_t now ;
01627 char* date = NULL ;
01628
01629
01630
01631 XSH_ASSURE_NOT_NULL(frame);
01632 XSH_ASSURE_NOT_NULL(frameset);
01633 XSH_ASSURE_NOT_NULL(parameters);
01634 XSH_ASSURE_NOT_NULL(recipe_id);
01635 XSH_ASSURE_NOT_NULL(instrument);
01636 XSH_ASSURE_NOT_NULL(final_prefix);
01637
01638 check(pro_catg = cpl_frame_get_tag (frame));
01639 XSH_ASSURE_NOT_NULL(pro_catg);
01640
01641
01642 check(fname = cpl_frame_get_filename( frame ));
01643 check(primary_header = cpl_propertylist_load( fname, 0 ));
01644
01645 if(strcmp(type,"imagelist") == 0) {
01646 check(imagelist = cpl_imagelist_load( fname, CPL_TYPE_FLOAT, 0 ));
01647 } else if(strcmp(type,"image") == 0) {
01648 check(image = cpl_image_load( fname, CPL_TYPE_FLOAT, 0,0 ));
01649 } else if(strcmp(type,"table") == 0) {
01650 check(table = cpl_table_load( fname, 1,0 ));
01651 } else {
01652 xsh_msg_error("Frame type %s not supported",type);
01653 }
01654
01655
01656 check( cpl_frame_set_group( frame, CPL_FRAME_GROUP_PRODUCT));
01657 check_msg (cpl_dfs_setup_product_header ( primary_header,
01658 frame,frameset,parameters,
01659 recipe_id,
01660 instrument->pipeline_id,
01661 instrument->dictionary,NULL),
01662 "Problem in the product DFS-compliance");
01663
01664
01665 if ( xsh_time_stamp_get() ) {
01666 time( &now ) ;
01667 date = xsh_sdate_utc( &now ) ;
01668 final_name = xsh_stringcat_any( XSH_PRODUCT_PREFIX,
01669 final_prefix, "_", date,
01670 ".fits", "" ) ;
01671 }
01672 else
01673 final_name = xsh_stringcat_any( XSH_PRODUCT_PREFIX,
01674 final_prefix, ".fits", "" ) ;
01675
01676 xsh_msg_dbg_low( "Final product name: %s", final_name ) ;
01677
01678
01679
01680
01681 if(strcmp(type,"imagelist") == 0) {
01682 cpl_imagelist_save(imagelist, final_name, CPL_BPP_IEEE_FLOAT,
01683 primary_header,CPL_IO_DEFAULT ) ;
01684 } else if(strcmp(type,"image") == 0) {
01685 cpl_image_save(image, final_name, CPL_BPP_IEEE_FLOAT,
01686 primary_header,CPL_IO_DEFAULT ) ;
01687 } else if(strcmp(type,"table") == 0) {
01688 check(cpl_table_save( table, primary_header, tbl_header,
01689 final_name, extension ));
01690 }
01691
01692
01693
01694
01695
01696
01697
01698
01699
01700
01701
01702
01703
01704
01705
01706
01707
01708 if(strcmp(type,"imagelist") == 0) {
01709 check(product_frame=xsh_frame_product(final_name,pro_catg,
01710 CPL_FRAME_TYPE_IMAGE,
01711 CPL_FRAME_GROUP_PRODUCT,
01712 CPL_FRAME_LEVEL_FINAL));
01713 } else if(strcmp(type,"image") == 0) {
01714 check(product_frame=xsh_frame_product(final_name,pro_catg,
01715 CPL_FRAME_TYPE_IMAGE,
01716 CPL_FRAME_GROUP_PRODUCT,
01717 CPL_FRAME_LEVEL_FINAL));
01718 } else if(strcmp(type,"table") == 0) {
01719 check(product_frame=xsh_frame_product(final_name,pro_catg,
01720 CPL_FRAME_TYPE_TABLE,
01721 CPL_FRAME_GROUP_PRODUCT,
01722 CPL_FRAME_LEVEL_FINAL));
01723
01724 }
01725
01726 check(cpl_frameset_insert(frameset, product_frame));
01727 xsh_add_product_file(final_name);
01728 cleanup:
01729 XSH_FREE(date);
01730 xsh_free_propertylist(&primary_header);
01731 xsh_free_image( &image ) ;
01732 xsh_free_imagelist( &imagelist ) ;
01733 xsh_free_table( &table ) ;
01734 XSH_FREE( final_name ) ;
01735
01736 return;
01737 }
01738
01748 void
01749 xsh_add_product_spectrum( cpl_frame *frame,
01750 cpl_frameset *frameset,
01751 const cpl_parameterlist *parameters,
01752 const char *recipe_id,
01753 xsh_instrument* instr)
01754 {
01755
01756 const char *pro_catg = "";
01757 xsh_spectrum *spectrum = NULL;
01758 cpl_frame *product_frame = NULL;
01759 char product_id[256];
01760 char* product_name = NULL;
01761
01762 time_t now ;
01763 char* date = NULL;
01764
01765
01766 XSH_ASSURE_NOT_NULL( frame);
01767 XSH_ASSURE_NOT_NULL( frameset);
01768 XSH_ASSURE_NOT_NULL( parameters);
01769 XSH_ASSURE_NOT_NULL( recipe_id);
01770 XSH_ASSURE_NOT_NULL( instr);
01771
01772 check( pro_catg = cpl_frame_get_tag (frame));
01773
01774 assure( pro_catg != NULL, CPL_ERROR_NULL_INPUT,
01775 "Frame tag has not been set");
01776
01777
01778 check( spectrum = xsh_spectrum_load( frame, instr));
01779
01780
01781 cpl_frame_set_group( frame, CPL_FRAME_GROUP_PRODUCT);
01782 check( cpl_dfs_setup_product_header( spectrum->flux_header,
01783 frame, frameset, parameters, recipe_id, instr->pipeline_id,
01784 instr->dictionary, NULL));
01785
01786 if (xsh_time_stamp_get() ){
01787 time( &now );
01788 date = xsh_sdate_utc(&now);
01789 sprintf( product_id, "%s%s_%s", XSH_PRODUCT_PREFIX,
01790 pro_catg, date);
01791 }
01792 else {
01793 sprintf( product_id, "%s%s", XSH_PRODUCT_PREFIX,
01794 pro_catg);
01795 }
01796 product_name = xsh_stringcat_any( product_id, ".fits", NULL);
01797 check( product_frame = xsh_spectrum_save(spectrum, product_name,pro_catg));
01798
01799
01800
01801
01802
01803
01804
01805
01806
01807
01808
01809 cpl_frame_set_type( product_frame, CPL_FRAME_TYPE_IMAGE);
01810 cpl_frame_set_group( product_frame, CPL_FRAME_GROUP_PRODUCT);
01811 cpl_frame_set_level( product_frame, CPL_FRAME_LEVEL_FINAL);
01812 cpl_frame_set_tag( product_frame, pro_catg);
01813 cpl_frameset_insert( frameset, product_frame);
01814 xsh_add_product_file(product_name);
01815
01816 cleanup:
01817 if (cpl_error_get_code () != CPL_ERROR_NONE) {
01818 xsh_free_frame( &product_frame);
01819 product_frame = NULL;
01820 }
01821 XSH_FREE( date);
01822 xsh_spectrum_free( &spectrum);
01823 XSH_FREE( product_name);
01824
01825 return;
01826 }
01827
01828
01853
01854 void
01855 xsh_add_product_pre (cpl_frame * frame,
01856 cpl_frameset * frameset,
01857 const cpl_parameterlist *parameters,
01858 const char *recipe_id,
01859 xsh_instrument* instr)
01860 {
01861 const char *pro_catg = "";
01862 xsh_pre* product_pre = NULL;
01863 cpl_frame* product_frame = NULL;
01864 char product_id[256];
01865 char* product_name = NULL;
01866
01867 time_t now ;
01868 char* date = NULL;
01869 cpl_propertylist* plist=NULL;
01870 char arcfile[80];
01871 bool arcfile_found=false;
01872
01873
01874 XSH_ASSURE_NOT_NULL( frame);
01875 XSH_ASSURE_NOT_NULL( frameset);
01876 XSH_ASSURE_NOT_NULL( parameters);
01877 XSH_ASSURE_NOT_NULL( recipe_id);
01878 XSH_ASSURE_NOT_NULL( instr);
01879
01880 check( pro_catg = cpl_frame_get_tag (frame));
01881
01882 assure( pro_catg != NULL, CPL_ERROR_NULL_INPUT,
01883 "Frame tag has not been set");
01884
01885
01886 check( product_pre = xsh_pre_load( frame,instr));
01887 if(cpl_propertylist_has(product_pre->data_header,"ARCFILE")) {
01888 sprintf(arcfile,"%s",xsh_pfits_get_arcfile(product_pre->data_header));
01889 arcfile_found=true;
01890 }
01891
01892 cpl_frame_set_group( frame, CPL_FRAME_GROUP_PRODUCT);
01893 check( cpl_dfs_setup_product_header( product_pre->data_header,
01894 frame, frameset, parameters, recipe_id, instr->pipeline_id,
01895 instr->dictionary,NULL));
01896
01897
01898 if (xsh_time_stamp_get() ){
01899 time( &now );
01900 date = xsh_sdate_utc(&now);
01901 sprintf( product_id, XSH_PRODUCT_PREFIX, "%s%s_%s",
01902 pro_catg, product_pre->binx, product_pre->biny, date);
01903 }
01904 else {
01905 sprintf( product_id, "%s%s", XSH_PRODUCT_PREFIX,
01906 pro_catg, product_pre->binx, product_pre->biny);
01907 }
01908 product_name = xsh_stringcat_any( product_id, ".fits", NULL);
01909 check( product_frame = xsh_pre_save( product_pre, product_name, pro_catg,0));
01910
01911
01912
01913
01914
01915 check(plist=cpl_propertylist_duplicate(product_pre->data_header));
01916 if(arcfile_found) {
01917
01918 check(cpl_propertylist_append_string(plist,"ARCFILE",arcfile));
01919 check(cpl_propertylist_set_comment(plist,"ARCFILE","Archive File Name"));
01920
01921
01922
01923
01924 } else {
01925
01926
01927
01928
01929
01930 }
01931
01932
01933 cpl_frame_set_type( product_frame, CPL_FRAME_TYPE_IMAGE);
01934 cpl_frame_set_group( product_frame, CPL_FRAME_GROUP_PRODUCT);
01935 cpl_frame_set_level( product_frame, CPL_FRAME_LEVEL_FINAL);
01936 cpl_frame_set_tag( product_frame, pro_catg);
01937 cpl_frameset_insert( frameset, product_frame);
01938 xsh_add_product_file(product_name);
01939
01940 cleanup:
01941 if (cpl_error_get_code () != CPL_ERROR_NONE) {
01942 xsh_free_frame( &product_frame);
01943 product_frame = NULL;
01944 }
01945 XSH_FREE( date);
01946 xsh_pre_free( &product_pre);
01947 xsh_free_propertylist(&plist);
01948 XSH_FREE( product_name);
01949
01950 return;
01951 }
01952
01953
01965
01966 void
01967 xsh_add_product_pre_3d( cpl_frame * frame,
01968 cpl_frameset * frameset,
01969 const cpl_parameterlist *parameters,
01970 const char *recipe_id,
01971 xsh_instrument* instr)
01972 {
01973 const char * pro_catg = "";
01974 xsh_pre_3d * product_pre = NULL;
01975 cpl_frame * product_frame = NULL;
01976 char product_id[256];
01977 char * product_name = NULL;
01978
01979 time_t now ;
01980 char * date = NULL;
01981
01982
01983 XSH_ASSURE_NOT_NULL( frame);
01984 XSH_ASSURE_NOT_NULL( frameset);
01985 XSH_ASSURE_NOT_NULL( parameters);
01986 XSH_ASSURE_NOT_NULL( recipe_id);
01987 XSH_ASSURE_NOT_NULL( instr);
01988
01989 check( pro_catg = cpl_frame_get_tag (frame));
01990
01991 assure( pro_catg != NULL, CPL_ERROR_NULL_INPUT,
01992 "Frame tag has not been set");
01993
01994
01995 check( product_pre = xsh_pre_3d_load( frame));
01996
01997
01998 cpl_frame_set_group( frame, CPL_FRAME_GROUP_PRODUCT);
01999 check( cpl_dfs_setup_product_header( product_pre->data_header,
02000 frame, frameset, parameters,
02001 recipe_id, instr->pipeline_id,
02002 instr->dictionary,NULL));
02003
02004
02005 if (xsh_time_stamp_get() ){
02006 time( &now );
02007 date = xsh_sdate_utc(&now);
02008 sprintf( product_id, XSH_PRODUCT_PREFIX, "%s%s_%s",
02009 pro_catg, date);
02010 }
02011 else {
02012 sprintf( product_id, "%s%s", XSH_PRODUCT_PREFIX, pro_catg );
02013 }
02014 product_name = xsh_stringcat_any( product_id, ".fits", NULL);
02015 check( product_frame = xsh_pre_3d_save( product_pre, product_name, 0));
02016
02017
02018
02019
02020
02021
02022
02023
02024
02025
02026 cpl_frame_set_type( product_frame, CPL_FRAME_TYPE_IMAGE);
02027 cpl_frame_set_group( product_frame, CPL_FRAME_GROUP_PRODUCT);
02028 cpl_frame_set_level( product_frame, CPL_FRAME_LEVEL_FINAL);
02029 cpl_frame_set_tag( product_frame, pro_catg);
02030 cpl_frameset_insert( frameset, product_frame);
02031 xsh_add_product_file(product_name);
02032
02033 cleanup:
02034 if (cpl_error_get_code () != CPL_ERROR_NONE) {
02035 xsh_free_frame( &product_frame);
02036 product_frame = NULL;
02037 }
02038 XSH_FREE( date);
02039 xsh_pre_3d_free( &product_pre);
02040 XSH_FREE( product_name);
02041
02042 return;
02043 }
02044
02055 void
02056 xsh_add_product_bpmap( cpl_frame *frame,
02057 cpl_frameset * frameset,
02058 const cpl_parameterlist * parameters,
02059 const char *recipe_id,
02060 xsh_instrument* instrument,
02061 const char *final_prefix )
02062 {
02063 cpl_propertylist *primary_header = NULL;
02064 const char *pro_catg = "";
02065 cpl_frame* product_frame = NULL;
02066 cpl_image *image = NULL ;
02067 const char *fname = NULL;
02068 char *final_name = NULL ;
02069 time_t now ;
02070 char* date = NULL ;
02071
02072
02073
02074 XSH_ASSURE_NOT_NULL(frame);
02075 XSH_ASSURE_NOT_NULL(frameset);
02076 XSH_ASSURE_NOT_NULL(parameters);
02077 XSH_ASSURE_NOT_NULL(recipe_id);
02078 XSH_ASSURE_NOT_NULL(instrument);
02079 XSH_ASSURE_NOT_NULL(final_prefix);
02080
02081 check(pro_catg = cpl_frame_get_tag (frame));
02082 XSH_ASSURE_NOT_NULL(pro_catg);
02083
02084
02085 check(fname = cpl_frame_get_filename( frame ));
02086 check(primary_header = cpl_propertylist_load( fname, 0 ));
02087 check(image = cpl_image_load( fname, CPL_TYPE_INT, 0, 0 ));
02088
02089
02090 check( cpl_frame_set_group( frame, CPL_FRAME_GROUP_PRODUCT));
02091 check_msg (cpl_dfs_setup_product_header ( primary_header,
02092 frame,frameset,parameters,
02093 recipe_id,
02094 instrument->pipeline_id,
02095 instrument->dictionary,NULL),
02096 "Problem in the product DFS-compliance");
02097
02098
02099 if ( xsh_time_stamp_get() == TRUE ) {
02100 time( &now ) ;
02101 date = xsh_sdate_utc( &now ) ;
02102 final_name = xsh_stringcat_any( XSH_PRODUCT_PREFIX,
02103 final_prefix, "_", date, ".fits", "" ) ;
02104 }
02105 else
02106 final_name = xsh_stringcat_any( XSH_PRODUCT_PREFIX,
02107 final_prefix, ".fits", "" ) ;
02108
02109 xsh_msg_dbg_low( "Final product name: %s", final_name ) ;
02110
02111
02112 cpl_image_save( image, final_name, CPL_BPP_32_SIGNED, primary_header,
02113 CPL_IO_DEFAULT ) ;
02114
02115
02116
02117
02118
02119
02120
02121
02122
02123
02124
02125 check(product_frame=xsh_frame_product(final_name,pro_catg,
02126 CPL_FRAME_TYPE_IMAGE,
02127 CPL_FRAME_GROUP_PRODUCT,
02128 CPL_FRAME_LEVEL_FINAL));
02129
02130
02131
02132
02133
02134
02135
02136
02137
02138
02139
02140
02141
02142 check(cpl_frameset_insert(frameset, product_frame));
02143 xsh_add_product_file(final_name);
02144
02145 cleanup:
02146 XSH_FREE(date);
02147 xsh_free_propertylist(&primary_header);
02148 xsh_free_image( &image ) ;
02149 XSH_FREE( final_name ) ;
02150
02151 return;
02152 }
02153
02154
02165
02166 void
02167 xsh_add_product_imagelist( cpl_frame *frame,
02168 cpl_frameset *frameset,
02169 const cpl_parameterlist *parameters,
02170 const char *recipe_id,
02171 xsh_instrument *instrument,
02172 const char *final_prefix)
02173 {
02174 cpl_propertylist *primary_header = NULL;
02175 const char *pro_catg = NULL;
02176 cpl_frame* product_frame = NULL;
02177 cpl_imagelist *imagelist = NULL ;
02178 const char *fname = NULL;
02179 char *final_name = NULL ;
02180 time_t now ;
02181 char* date = NULL ;
02182
02183
02184
02185 XSH_ASSURE_NOT_NULL(frame);
02186 XSH_ASSURE_NOT_NULL(frameset);
02187 XSH_ASSURE_NOT_NULL(parameters);
02188 XSH_ASSURE_NOT_NULL(recipe_id);
02189 XSH_ASSURE_NOT_NULL(instrument);
02190 XSH_ASSURE_NOT_NULL(final_prefix);
02191
02192 check(pro_catg = cpl_frame_get_tag (frame));
02193 XSH_ASSURE_NOT_NULL(pro_catg);
02194
02195
02196 check(fname = cpl_frame_get_filename( frame ));
02197 check(primary_header = cpl_propertylist_load( fname, 0 ));
02198 check(imagelist = cpl_imagelist_load( fname, CPL_TYPE_FLOAT, 0 ));
02199
02200
02201 check( cpl_frame_set_group( frame, CPL_FRAME_GROUP_PRODUCT));
02202 check_msg ( cpl_dfs_setup_product_header ( primary_header,
02203 frame,frameset,parameters,
02204 recipe_id,
02205 instrument->pipeline_id,
02206 instrument->dictionary,NULL),
02207 "Problem in the product DFS-compliance");
02208
02209
02210 if ( xsh_time_stamp_get()){
02211 time( &now);
02212 date = xsh_sdate_utc( &now);
02213 final_name = xsh_stringcat_any( XSH_PRODUCT_PREFIX,
02214 final_prefix, "_", date, ".fits", "" );
02215 }
02216 else
02217 final_name = xsh_stringcat_any( XSH_PRODUCT_PREFIX,
02218 final_prefix, ".fits", "");
02219
02220 xsh_msg_dbg_low( "Final product name: %s", final_name ) ;
02221
02222
02223 cpl_imagelist_save(imagelist, final_name, CPL_BPP_IEEE_FLOAT, primary_header,
02224 CPL_IO_DEFAULT);
02225
02226
02227
02228
02229
02230
02231
02232
02233
02234
02235
02236 check(product_frame=xsh_frame_product(final_name,pro_catg,
02237 CPL_FRAME_TYPE_IMAGE,
02238 CPL_FRAME_GROUP_PRODUCT,
02239 CPL_FRAME_LEVEL_FINAL));
02240
02241
02242
02243
02244
02245
02246
02247
02248
02249
02250
02251
02252
02253 check(cpl_frameset_insert(frameset, product_frame));
02254 xsh_add_product_file(final_name);
02255
02256 cleanup:
02257 XSH_FREE(date);
02258 xsh_free_propertylist(&primary_header);
02259 xsh_free_imagelist( &imagelist ) ;
02260 XSH_FREE( final_name ) ;
02261
02262 return;
02263 }
02264
02265
02276
02277 void
02278 xsh_add_product_image( cpl_frame *frame,
02279 cpl_frameset *frameset,
02280 const cpl_parameterlist *parameters,
02281 const char *recipe_id,
02282 xsh_instrument *instrument,
02283 const char *final_prefix)
02284 {
02285 cpl_propertylist *primary_header = NULL;
02286 const char *pro_catg = NULL;
02287 cpl_frame* product_frame = NULL;
02288 cpl_image *image = NULL ;
02289 const char *fname = NULL;
02290 char *final_name = NULL ;
02291 time_t now ;
02292 char* date = NULL ;
02293
02294 int i=0;
02295 int nbext=0;
02296 char arcfile[80];
02297 bool arcfile_found=false;
02298
02299
02300 XSH_ASSURE_NOT_NULL(frame);
02301 XSH_ASSURE_NOT_NULL(frameset);
02302 XSH_ASSURE_NOT_NULL(parameters);
02303 XSH_ASSURE_NOT_NULL(recipe_id);
02304 XSH_ASSURE_NOT_NULL(instrument);
02305 XSH_ASSURE_NOT_NULL(final_prefix);
02306
02307 check( pro_catg = cpl_frame_get_tag (frame));
02308
02309 XSH_ASSURE_NOT_NULL(pro_catg);
02310
02311
02312 check( fname = cpl_frame_get_filename( frame));
02313
02314 check( primary_header = cpl_propertylist_load( fname, 0));
02315
02316 check( image = cpl_image_load( fname, CPL_TYPE_FLOAT, 0, 0));
02317 if(cpl_propertylist_has(primary_header,"ARCFILE")) {
02318 sprintf(arcfile,"%s",xsh_pfits_get_arcfile(primary_header));
02319 arcfile_found=true;
02320 }
02321
02322 check( cpl_frame_set_group( frame, CPL_FRAME_GROUP_PRODUCT));
02323
02324 check_msg (cpl_dfs_setup_product_header ( primary_header,
02325 frame,frameset,parameters,
02326 recipe_id,
02327 instrument->pipeline_id,
02328 instrument->dictionary,NULL),
02329 "Problem in the product DFS-compliance");
02330
02331
02332 if ( xsh_time_stamp_get() ) {
02333 time( &now ) ;
02334 date = xsh_sdate_utc( &now ) ;
02335 final_name = xsh_stringcat_any( XSH_PRODUCT_PREFIX,
02336 final_prefix, "_", date, ".fits", "" ) ;
02337 }
02338 else if ( strstr( final_prefix, ".fits" ) == NULL )
02339 final_name = xsh_stringcat_any( XSH_PRODUCT_PREFIX,
02340 final_prefix, ".fits", "");
02341 else final_name = xsh_stringcat_any( XSH_PRODUCT_PREFIX,
02342 final_prefix, "" ) ;
02343
02344 xsh_msg( "Final product name: %s", final_name ) ;
02345
02346
02347 check(cpl_image_save( image, final_name, CPL_BPP_IEEE_FLOAT, primary_header,
02348 CPL_IO_DEFAULT )) ;
02349
02350
02351 nbext = cpl_frame_get_nextensions( frame);
02352
02353
02354 for( i = 1 ; i<=nbext ; i++ ) {
02355 int extension ;
02356 cpl_image* ext_img=NULL;
02357 cpl_propertylist* ext_header=NULL;
02358
02359 check( ext_img = cpl_image_load( fname, CPL_TYPE_FLOAT,0, i));
02360 check( ext_header = cpl_propertylist_load( fname ,i));
02361
02362 if ( i == 0 ) extension = CPL_IO_DEFAULT ;
02363 else extension = CPL_IO_EXTEND ;
02364 check(cpl_image_save( ext_img, final_name, CPL_BPP_IEEE_FLOAT,ext_header,
02365 extension));
02366 xsh_free_image( &ext_img) ;
02367 xsh_free_propertylist( &ext_header) ;
02368 }
02369
02370
02371
02372
02373
02374
02375 if(arcfile_found) {
02376 check(cpl_propertylist_append_string(primary_header,"ARCFILE",arcfile));
02377 check(cpl_propertylist_set_comment(primary_header,"ARCFILE",
02378 "Archive File Name"));
02379 }
02380
02381
02382
02383
02384
02385
02386 check( product_frame = xsh_frame_product( final_name,pro_catg,
02387 CPL_FRAME_TYPE_IMAGE,
02388 CPL_FRAME_GROUP_PRODUCT,
02389 CPL_FRAME_LEVEL_FINAL));
02390
02391 check(cpl_frameset_insert(frameset, product_frame));
02392 xsh_add_product_file(final_name);
02393
02394 cleanup:
02395 XSH_FREE(date);
02396 xsh_free_propertylist( &primary_header);
02397 xsh_free_image( &image);
02398 XSH_FREE( final_name);
02399
02400 return;
02401 }
02402
02403
02413
02414 void
02415 xsh_add_product_table_multi( cpl_frame *frame,
02416 cpl_frameset *frameset,
02417 const cpl_parameterlist * parameters,
02418 const char *recipe_id,
02419 xsh_instrument* instrument)
02420 {
02421 cpl_propertylist *primary_header = NULL;
02422 cpl_propertylist *tbl_header = NULL;
02423 const char *pro_catg = "";
02424 cpl_frame* product_frame = NULL;
02425 cpl_table * table = NULL ;
02426 const char *fname = NULL;
02427 char *product_id = NULL;
02428 char *product_name = NULL ;
02429 char *tmp_name = NULL ;
02430
02431 time_t now ;
02432 char* date = NULL ;
02433
02434 int nbext, i ;
02435
02436
02437 XSH_ASSURE_NOT_NULL(frame);
02438 XSH_ASSURE_NOT_NULL(frameset);
02439 XSH_ASSURE_NOT_NULL(parameters);
02440 XSH_ASSURE_NOT_NULL(recipe_id);
02441 XSH_ASSURE_NOT_NULL(instrument);
02442
02443
02444 check(pro_catg = cpl_frame_get_tag (frame));
02445
02446 XSH_ASSURE_NOT_NULL(pro_catg);
02447
02448
02449 check( fname = cpl_frame_get_filename( frame));
02450 check( primary_header = cpl_propertylist_load( fname, 0));
02451 XSH_ASSURE_NOT_NULL( primary_header);
02452 check( tbl_header = cpl_propertylist_load( fname, 1));
02453 XSH_ASSURE_NOT_NULL( tbl_header);
02454 nbext = cpl_frame_get_nextensions( frame);
02455
02456
02457 check( cpl_frame_set_group (frame, CPL_FRAME_GROUP_PRODUCT));
02458 check( cpl_dfs_setup_product_header ( primary_header,
02459 frame, frameset, parameters, recipe_id, instrument->pipeline_id,
02460 instrument->dictionary,NULL));
02461
02462
02463 if ( xsh_time_stamp_get() ) {
02464 time( &now ) ;
02465 date = xsh_sdate_utc( &now ) ;
02466 product_id = xsh_stringcat_any( XSH_PRODUCT_PREFIX,
02467 pro_catg, "_", date, "" ) ;
02468 }
02469 else
02470 product_id = xsh_stringcat_any( XSH_PRODUCT_PREFIX,
02471 pro_catg, "" ) ;
02472
02473 product_name = xsh_stringcat_any( product_id, ".fits", NULL );
02474
02475
02476
02477 tmp_name=xsh_stringcat_any( "tmp_",product_name, NULL );
02478 for( i = 0 ; i<nbext ; i++ ) {
02479 int extension ;
02480 cpl_table *tbl_ext = NULL;
02481 cpl_propertylist *tbl_ext_header = NULL;
02482
02483
02484
02485 check( tbl_ext = cpl_table_load( fname, i+1, 0));
02486 check( tbl_ext_header = cpl_propertylist_load( fname, i+1));
02487
02488 if ( i == 0 ) extension = CPL_IO_DEFAULT ;
02489 else extension = CPL_IO_EXTEND ;
02490 check(cpl_table_save( tbl_ext, primary_header, tbl_ext_header,
02491 tmp_name, extension));
02492 xsh_free_table( &tbl_ext);
02493 xsh_free_propertylist( &tbl_ext_header);
02494 }
02495
02496 xsh_fileutils_move( tmp_name,product_name );
02497
02498
02499
02500
02501
02502
02503
02504
02505
02506
02507
02508
02509 check(product_frame=xsh_frame_product(product_name,pro_catg,
02510 CPL_FRAME_TYPE_IMAGE,
02511 CPL_FRAME_GROUP_PRODUCT,
02512 CPL_FRAME_LEVEL_FINAL));
02513
02514 cpl_frameset_insert(frameset, product_frame);
02515 xsh_add_product_file(product_name);
02516
02517 cleanup:
02518 xsh_free_propertylist(&primary_header);
02519 xsh_free_propertylist(&tbl_header);
02520 XSH_TABLE_FREE( table) ;
02521 XSH_FREE(product_id);
02522 XSH_FREE(tmp_name);
02523 XSH_FREE(product_name);
02524 XSH_FREE(date);
02525
02526 return;
02527 }
02528
02529
02538 void
02539 xsh_add_product_table( cpl_frame *frame,
02540 cpl_frameset * frameset,
02541 const cpl_parameterlist * parameters,
02542 const char *recipe_id,
02543 xsh_instrument* instrument)
02544 {
02545 cpl_propertylist *primary_header = NULL;
02546 cpl_propertylist *tbl_header = NULL;
02547 const char *pro_catg = NULL;
02548 cpl_frame* product_frame = NULL;
02549 cpl_table * table = NULL ;
02550 const char *fname = NULL;
02551 char *product_id = NULL;
02552 char *product_name = NULL;
02553 time_t now ;
02554 char* date = NULL ;
02555
02556
02557
02558 XSH_ASSURE_NOT_NULL(frame);
02559 XSH_ASSURE_NOT_NULL(frameset);
02560 XSH_ASSURE_NOT_NULL(parameters);
02561 XSH_ASSURE_NOT_NULL(recipe_id);
02562 XSH_ASSURE_NOT_NULL(instrument);
02563
02564
02565 check( pro_catg = cpl_frame_get_tag (frame));
02566
02567 XSH_ASSURE_NOT_NULL(pro_catg);
02568
02569
02570 check( fname = cpl_frame_get_filename( frame ));
02571 check( primary_header = cpl_propertylist_load( fname, 0 ));
02572 XSH_ASSURE_NOT_NULL( primary_header);
02573 check( tbl_header = cpl_propertylist_load( fname, 1 ));
02574 XSH_ASSURE_NOT_NULL( tbl_header);
02575 XSH_TABLE_LOAD( table, fname);
02576 XSH_ASSURE_NOT_NULL( table);
02577
02578
02579 check( cpl_frame_set_group (frame, CPL_FRAME_GROUP_PRODUCT));
02580 check( cpl_dfs_setup_product_header( primary_header,
02581 frame, frameset, parameters,
02582 recipe_id, instrument->pipeline_id,
02583 instrument->dictionary,NULL));
02584
02585
02586 if ( xsh_time_stamp_get() ) {
02587 time( &now ) ;
02588 date = xsh_sdate_utc( &now ) ;
02589 product_id = xsh_stringcat_any( XSH_PRODUCT_PREFIX,
02590 pro_catg, date, "" ) ;
02591 }
02592 else
02593 product_id = xsh_stringcat_any( XSH_PRODUCT_PREFIX,
02594 pro_catg, "");
02595
02596
02597 product_name = xsh_stringcat_any( product_id,".fits", NULL);
02598
02599 check( cpl_table_save( table, primary_header, tbl_header,
02600 product_name, CPL_IO_DEFAULT ));
02601
02602
02603
02604
02605
02606
02607
02608
02609
02610
02611 check(product_frame=xsh_frame_product(product_name,pro_catg,
02612 CPL_FRAME_TYPE_IMAGE,
02613 CPL_FRAME_GROUP_PRODUCT,
02614 CPL_FRAME_LEVEL_FINAL));
02615
02616
02617 cpl_frameset_insert(frameset, product_frame);
02618 xsh_add_product_file(product_name);
02619
02620 cleanup:
02621 xsh_free_propertylist(&primary_header);
02622 xsh_free_propertylist(&tbl_header);
02623 XSH_TABLE_FREE( table) ;
02624 XSH_FREE( product_id);
02625 XSH_FREE(product_name);
02626 XSH_FREE(date);
02627
02628 return;
02629 }
02630
02631
02640
02641
02642 cpl_frame *
02643 xsh_find_std_flux (cpl_frameset * frames)
02644 {
02645 const char *tags[] = {
02646 XSH_STD_FLUX_SLIT (XSH_ARM_UVB),
02647 XSH_STD_FLUX_SLIT (XSH_ARM_VIS),
02648 XSH_STD_FLUX_SLIT (XSH_ARM_NIR),
02649 XSH_STD_TELL_SLIT (XSH_ARM_UVB),
02650 XSH_STD_TELL_SLIT (XSH_ARM_VIS),
02651 XSH_STD_TELL_SLIT (XSH_ARM_NIR),
02652 XSH_STD_FLUX_OFFSET (XSH_ARM_UVB),
02653 XSH_STD_FLUX_OFFSET (XSH_ARM_VIS),
02654 XSH_STD_FLUX_OFFSET (XSH_ARM_NIR),
02655 XSH_STD_TELL_OFFSET (XSH_ARM_UVB),
02656 XSH_STD_TELL_OFFSET (XSH_ARM_VIS),
02657 XSH_STD_TELL_OFFSET (XSH_ARM_NIR),
02658 NULL
02659 };
02660
02661 return xsh_find_frame (frames, tags);
02662 }
02663
02672
02673
02674 cpl_frame *
02675 xsh_find_std_star_flux (cpl_frameset * frames)
02676 {
02677 const char *tags[] = { XSH_STD_STAR_FLUX (XSH_ARM_UVB),
02678 XSH_STD_STAR_FLUX (XSH_ARM_VIS),
02679 XSH_STD_STAR_FLUX (XSH_ARM_NIR),
02680 NULL
02681 };
02682
02683 return xsh_find_frame (frames, tags);
02684 }
02685
02686
02697
02698
02699 cpl_frame*
02700 xsh_find_master_bias (cpl_frameset * frames, xsh_instrument* instr)
02701 {
02702 const char *tags[2] ={NULL,NULL};
02703 cpl_frame* result = NULL;
02704
02705 tags[0] = XSH_GET_TAG_FROM_ARM( XSH_MASTER_BIAS, instr);
02706
02707 check(result = xsh_find_frame (frames,(const char**) tags));
02708
02709 cleanup:
02710 return result;
02711 }
02712
02713
02725
02726
02727 cpl_frame*
02728 xsh_find_frame_with_tag (cpl_frameset * frames,
02729 const char* tag,
02730 xsh_instrument* instr)
02731 {
02732 char *tags[2];
02733 cpl_frame* result = NULL;
02734
02735 tags[0] = xsh_get_tag_from_arm( tag, instr);
02736 tags[1] = NULL;
02737 xsh_msg_dbg_high("search for tag %s",tags[0]);
02738 result = xsh_find_frame (frames,(const char**) tags);
02739 cpl_free( tags[0]);
02740 return result;
02741 }
02742
02743
02744
02753
02754
02755 char* xsh_get_tag_from_arm(const char* tag, xsh_instrument* instr){
02756 const char* arm=xsh_instrument_arm_tostring(instr);
02757 char* composed_tag=NULL;
02758
02759 int len = strlen(tag);
02760
02761 if(tag[len-1]=='_') {
02762 composed_tag=cpl_sprintf("%s%s",tag,arm);
02763 } else {
02764 composed_tag=cpl_sprintf("%s%s%s",tag,"_",arm);
02765 }
02766 xsh_msg_dbg_high("composed tag='%s'",composed_tag);
02767
02768 return composed_tag;
02769 }
02770
02771
02772
02783
02784
02785 cpl_frame* xsh_find_master_dark (cpl_frameset * frames, xsh_instrument* instr)
02786 {
02787 const char *tags[2];
02788
02789 tags[0] = XSH_GET_TAG_FROM_ARM( XSH_MASTER_DARK, instr);
02790 tags[1] = NULL;
02791
02792 return xsh_find_frame (frames, tags);
02793 }
02794
02795
02806
02807 cpl_frame* xsh_find_master_flat (cpl_frameset * frames, xsh_instrument* instr)
02808 {
02809 const char *tags[2];
02810
02811 tags[0] = XSH_GET_TAG_FROM_MODE ( XSH_MASTER_FLAT, instr);
02812 tags[1] = NULL;
02813
02814 return xsh_find_frame (frames, tags);
02815 }
02816
02817
02825
02826 cpl_frame *xsh_find_theo_tab_sing( cpl_frameset *frames, xsh_instrument* instr)
02827 {
02828 const char* tags[2] = {NULL, NULL};
02829 cpl_frame* result = NULL;
02830
02831 XSH_ASSURE_NOT_NULL( frames);
02832 XSH_ASSURE_NOT_NULL( instr);
02833 tags[0] = XSH_GET_TAG_FROM_ARM( XSH_THEO_TAB_SING, instr);
02834 check(result = xsh_find_frame (frames, tags));
02835
02836 cleanup:
02837 return result;
02838 }
02839
02840
02848
02849 cpl_frame *xsh_find_theo_tab_mult( cpl_frameset *frames, xsh_instrument* instr)
02850 {
02851 const char *tags[2] = {NULL, NULL};
02852 cpl_frame* result = NULL;
02853
02854 XSH_ASSURE_NOT_NULL( frames);
02855 XSH_ASSURE_NOT_NULL( instr);
02856 tags[0] = XSH_GET_TAG_FROM_ARM( XSH_THEO_TAB_MULT, instr);
02857 check(result = xsh_find_frame (frames, tags));
02858
02859 cleanup:
02860 return result;
02861 }
02862
02870
02871 cpl_frame *xsh_find_theo_tab_mode( cpl_frameset *frames, xsh_instrument* instr)
02872 {
02873 const char *tags[2] = {NULL, NULL};
02874 cpl_frame* result = NULL;
02875
02876 XSH_ASSURE_NOT_NULL( frames);
02877 XSH_ASSURE_NOT_NULL( instr);
02878
02879 if ( instr->mode == XSH_MODE_IFU){
02880 tags[0] = XSH_GET_TAG_FROM_ARM( XSH_THEO_TAB_IFU, instr);
02881 }
02882 else{
02883 tags[0] = XSH_GET_TAG_FROM_ARM( XSH_THEO_TAB_SING, instr);
02884 }
02885 check(result = xsh_find_frame (frames, tags));
02886
02887 cleanup:
02888 return result;
02889 }
02890
02891
02899
02900 cpl_frame *
02901 xsh_find_order_tab_recov( cpl_frameset *frames, xsh_instrument* instr)
02902 {
02903 const char *tags[2] = {NULL, NULL};
02904 cpl_frame* result = NULL;
02905
02906 XSH_ASSURE_NOT_NULL( frames);
02907 XSH_ASSURE_NOT_NULL( instr);
02908
02909 tags[0] = XSH_GET_TAG_FROM_ARM( XSH_ORDER_TAB_RECOV, instr);
02910 check( result = xsh_find_frame (frames, tags));
02911
02912 cleanup:
02913 return result;
02914 }
02915
02916
02924
02925 cpl_frame *
02926 xsh_find_order_tab_guess( cpl_frameset *frames, xsh_instrument* instr)
02927 {
02928 const char *tags[2] = {NULL, NULL};
02929 cpl_frame* result = NULL;
02930
02931 XSH_ASSURE_NOT_NULL( frames);
02932 XSH_ASSURE_NOT_NULL( instr);
02933
02934 tags[0] = XSH_GET_TAG_FROM_ARM( XSH_ORDER_TAB_GUESS, instr);
02935 check(result = xsh_find_frame (frames, tags));
02936
02937 cleanup:
02938 return result;
02939 }
02940
02941
02949
02950 cpl_frame *
02951 xsh_find_order_tab_centr( cpl_frameset *frames, xsh_instrument* instr)
02952 {
02953 const char *tags[2] = {NULL, NULL};
02954 cpl_frame* result = NULL;
02955
02956 XSH_ASSURE_NOT_NULL( frames);
02957 XSH_ASSURE_NOT_NULL( instr);
02958
02959 tags[0] = XSH_GET_TAG_FROM_ARM( XSH_ORDER_TAB_CENTR, instr);
02960 check(result = xsh_find_frame (frames, tags));
02961
02962 cleanup:
02963 return result;
02964 }
02965
02966
02974
02975 cpl_frame *
02976 xsh_find_order_tab_edges( cpl_frameset *frames, xsh_instrument* instr)
02977 {
02978 const char *tags[3] = {NULL, NULL};
02979 cpl_frame* result = NULL;
02980
02981 XSH_ASSURE_NOT_NULL( frames);
02982 XSH_ASSURE_NOT_NULL( instr);
02983
02984 tags[0] = XSH_GET_TAG_FROM_MODE( XSH_ORDER_TAB_AFC, instr);
02985 tags[1] = XSH_GET_TAG_FROM_LAMP( XSH_ORDER_TAB_EDGES, instr);
02986
02987 check(result = xsh_find_frame (frames, tags));
02988
02989 xsh_msg_dbg_medium( "ORDER_TAB => %s", cpl_frame_get_filename( result));
02990
02991 cleanup:
02992 return result;
02993 }
02994
02995
03003
03004 cpl_frame *
03005 xsh_find_wave_tab_guess( cpl_frameset *frames, xsh_instrument* instr)
03006 {
03007 const char *tags[2] = {NULL, NULL};
03008 cpl_frame* result = NULL;
03009
03010 XSH_ASSURE_NOT_NULL( frames);
03011 XSH_ASSURE_NOT_NULL( instr);
03012
03013 tags[0] = XSH_GET_TAG_FROM_ARM( XSH_WAVE_TAB_GUESS, instr);
03014 check(result = xsh_find_frame (frames, tags));
03015
03016 cleanup:
03017 return result;
03018 }
03019
03020
03028
03029 cpl_frame *
03030 xsh_find_wave_tab_2d( cpl_frameset *frames, xsh_instrument* instr)
03031 {
03032 const char *tags[2] = {NULL, NULL};
03033 cpl_frame* result = NULL;
03034
03035 XSH_ASSURE_NOT_NULL( frames);
03036 XSH_ASSURE_NOT_NULL( instr);
03037
03038 tags[0] = XSH_GET_TAG_FROM_ARM( XSH_WAVE_TAB_2D, instr);
03039 check(result = xsh_find_frame (frames, tags));
03040
03041 cleanup:
03042 return result;
03043 }
03044
03045
03053 cpl_frame *xsh_find_slitmap( cpl_frameset *frames,
03054 xsh_instrument* instr)
03055 {
03056 const char *tags[3] = {NULL, NULL, NULL};
03057 cpl_frame* result = NULL;
03058
03059 XSH_ASSURE_NOT_NULL( frames);
03060 XSH_ASSURE_NOT_NULL( instr);
03061
03062 tags[0] = XSH_GET_TAG_FROM_ARM( XSH_SLIT_MAP, instr);
03063 tags[1] = XSH_GET_TAG_FROM_ARM( XSH_IFU_MAP, instr);
03064 check(result = xsh_find_frame (frames, tags));
03065
03066 cleanup:
03067 return result;
03068 }
03069
03070
03078
03079 cpl_frame *xsh_find_wave_tab( cpl_frameset *frames,
03080 xsh_instrument* instr)
03081 {
03082 const char *tags[4] = {NULL, NULL};
03083 cpl_frame* result = NULL;
03084
03085 XSH_ASSURE_NOT_NULL( frames);
03086 XSH_ASSURE_NOT_NULL( instr);
03087
03088 tags[0] = XSH_GET_TAG_FROM_ARM( XSH_WAVE_TAB_AFC, instr);
03089 tags[1] = XSH_GET_TAG_FROM_MODE( XSH_WAVE_TAB_ARC, instr);
03090 tags[2] = XSH_GET_TAG_FROM_ARM( XSH_WAVE_TAB_2D, instr);
03091 check(result = xsh_find_frame (frames, tags));
03092
03093 cleanup:
03094 return result;
03095 }
03096
03097
03098
03106
03107 cpl_frame *
03108 xsh_find_model_config( cpl_frameset *frames, xsh_instrument* instr)
03109 {
03110 const char *tags[4] = {NULL, NULL};
03111 cpl_frame* result = NULL;
03112
03113 XSH_ASSURE_NOT_NULL( frames);
03114 XSH_ASSURE_NOT_NULL( instr);
03115
03116 tags[0] = XSH_GET_TAG_FROM_ARM( XSH_MOD_CFG_OPT_AFC, instr);
03117 tags[1] = XSH_GET_TAG_FROM_ARM( XSH_MOD_CFG_OPT_2D, instr);
03118 tags[2] = XSH_GET_TAG_FROM_ARM( XSH_MOD_CFG_TAB, instr);
03119 check(result = xsh_find_frame (frames, tags));
03120
03121 cleanup:
03122 return result;
03123 }
03124
03125
03134
03135 cpl_frameset *
03136 xsh_find_wave_tab_ifu( cpl_frameset *frames, xsh_instrument* instrument)
03137 {
03138 const char * tags[3] = { NULL, NULL, NULL} ;
03139 cpl_frameset * result = NULL;
03140 cpl_frame * resframe = NULL ;
03141
03142 XSH_ASSURE_NOT_NULL( frames);
03143 XSH_ASSURE_NOT_NULL( instrument);
03144
03145
03146 check( result = cpl_frameset_new() ) ;
03147
03148
03149
03150
03151
03152
03153 tags[0] = XSH_GET_TAG_FROM_ARM( XSH_WAVE_TAB_AFC, instrument);
03154 tags[1] = XSH_GET_TAG_FROM_ARM( XSH_WAVE_TAB_2D, instrument);
03155 resframe = xsh_find_frame (frames, tags) ;
03156 if (resframe != NULL ) {
03157 cpl_frame * down = NULL, * cen = NULL , * up = NULL ;
03158
03159 xsh_msg_warning( "Only one Wave Solution Frame %s, use it for the 3 slitlets",
03160 cpl_frame_get_filename( resframe)) ;
03161 check( down = cpl_frame_duplicate( resframe ) ) ;
03162 tags[0] = XSH_GET_TAG_FROM_ARM( XSH_WAVE_TAB_ARC_DOWN_IFU, instrument ) ;
03163 check( cpl_frame_set_tag( down, tags[0] ) ) ;
03164 check( cpl_frameset_insert( result, down ) ) ;
03165
03166 check( cen = cpl_frame_duplicate( resframe ) ) ;
03167 tags[0] = XSH_GET_TAG_FROM_ARM( XSH_WAVE_TAB_ARC_CEN_IFU, instrument ) ;
03168 check( cpl_frame_set_tag( cen, tags[0] ) ) ;
03169 check( cpl_frameset_insert( result, cen ) ) ;
03170
03171 check( up = cpl_frame_duplicate( resframe ) ) ;
03172 tags[0] = XSH_GET_TAG_FROM_ARM( XSH_WAVE_TAB_ARC_UP_IFU, instrument ) ;
03173 check( cpl_frame_set_tag( up, tags[0] ) ) ;
03174 check( cpl_frameset_insert( result, up ) ) ;
03175 }
03176 else {
03177 xsh_msg( "Three wave solution found" ) ;
03178
03179 tags[0] = XSH_GET_TAG_FROM_ARM( XSH_WAVE_TAB_ARC_DOWN_IFU, instrument ) ;
03180 check(resframe = xsh_find_frame (frames, tags));
03181 check( cpl_frameset_insert( result, resframe ) ) ;
03182
03183 tags[0] = XSH_GET_TAG_FROM_ARM( XSH_WAVE_TAB_ARC_CEN_IFU, instrument ) ;
03184 check(resframe = xsh_find_frame (frames, tags));
03185 check( cpl_frameset_insert( result, resframe ) ) ;
03186
03187 tags[0] = XSH_GET_TAG_FROM_ARM( XSH_WAVE_TAB_ARC_UP_IFU, instrument ) ;
03188 check(resframe = xsh_find_frame (frames, tags));
03189 check( cpl_frameset_insert( result, resframe ) ) ;
03190 }
03191
03192 cleanup:
03193 if ( cpl_error_get_code() != CPL_ERROR_NONE ) {
03194 cpl_frameset_delete( result ) ;
03195 return NULL ;
03196 }
03197 else return result;
03198 }
03199
03200
03208
03209 cpl_frame *
03210 xsh_find_arc_line_list_clean( cpl_frameset *frames, xsh_instrument* instr)
03211 {
03212 const char *tags[2] = {NULL, NULL};
03213 cpl_frame* result = NULL;
03214
03215 XSH_ASSURE_NOT_NULL( frames);
03216 XSH_ASSURE_NOT_NULL( instr);
03217
03218 tags[0] = XSH_GET_TAG_FROM_ARM( XSH_ARC_LINE_LIST, instr);
03219 check(result = xsh_find_frame (frames, tags));
03220
03221 cleanup:
03222 return result;
03223 }
03224
03225
03226
03234
03235 cpl_frame *
03236 xsh_find_arc_line_list( cpl_frameset *frames, xsh_instrument* instr)
03237 {
03238 const char *tags[2] = {NULL, NULL};
03239 cpl_frame* result = NULL;
03240
03241 XSH_ASSURE_NOT_NULL( frames);
03242 XSH_ASSURE_NOT_NULL( instr);
03243
03244 tags[0] = XSH_GET_TAG_FROM_ARM( XSH_ARC_LINE_LIST, instr);
03245 check(result = xsh_find_frame (frames, tags));
03246
03247 cleanup:
03248 return result;
03249 }
03250
03258
03259 cpl_frame *
03260 xsh_find_usr_lines_guess_tab( cpl_frameset *frames, xsh_instrument* instr)
03261 {
03262 const char *tags[2] = {NULL, NULL};
03263 cpl_frame* result = NULL;
03264
03265 XSH_ASSURE_NOT_NULL( frames);
03266 XSH_ASSURE_NOT_NULL( instr);
03267
03268 tags[0] = XSH_GET_TAG_FROM_ARM( XSH_GUESS_LINES_POS, instr);
03269 check(result = xsh_find_frame (frames, tags));
03270
03271 cleanup:
03272 return result;
03273 }
03274
03275
03283
03284 cpl_frame *
03285 xsh_find_model_config_tab( cpl_frameset *frames, xsh_instrument* instr)
03286 {
03287 const char *tags[2] = {NULL, NULL};
03288 cpl_frame* result = NULL;
03289
03290 XSH_ASSURE_NOT_NULL( frames);
03291 XSH_ASSURE_NOT_NULL( instr);
03292
03293 tags[0] = XSH_GET_TAG_FROM_ARM( XSH_MOD_CFG_TAB, instr);
03294 check(result = xsh_find_frame (frames, tags));
03295
03296 cleanup:
03297 return result;
03298 }
03299
03310
03311 cpl_frame * xsh_find_wavemap(cpl_frameset *frames,
03312 xsh_instrument* instr)
03313 {
03314 const char *tags[2] ={NULL,NULL};
03315 cpl_frame* result = NULL;
03316
03317 tags[0] = XSH_GET_TAG_FROM_ARM( XSH_WAVE_MAP, instr);
03318 check(result = xsh_find_frame (frames,(const char**) tags));
03319
03320 cleanup:
03321 return result;
03322 }
03323
03331
03332
03333 cpl_frame * xsh_find_raw_orderdef_vis_uvb ( cpl_frameset * frames )
03334 {
03335 char *tags[4] ={NULL,NULL, NULL,NULL};
03336 cpl_frame* result = NULL;
03337
03338 check(tags[0] = xsh_stringcat_any( XSH_ORDERDEF_D2_UVB, NULL )) ;
03339 check(tags[1] = xsh_stringcat_any( XSH_ORDERDEF_QTH_UVB, NULL )) ;
03340 check(tags[2] = xsh_stringcat_any( XSH_ORDERDEF_VIS, NULL )) ;
03341
03342 check(result = xsh_find_frame (frames,(const char**) tags));
03343
03344 cleanup:
03345 cpl_free( tags[0]);
03346 cpl_free( tags[1]);
03347 cpl_free( tags[2]);
03348 return result;
03349 }
03350
03358
03359
03360 cpl_frame * xsh_find_raw_orderdef_nir( cpl_frameset * frames )
03361 {
03362 char *tags[] ={NULL,NULL};
03363 cpl_frame* result = NULL;
03364
03365 check(tags[0] = xsh_stringcat_any( XSH_ORDERDEF_NIR, NULL ) );
03366 check(result = xsh_find_frame (frames,(const char**) tags));
03367
03368 cleanup:
03369 cpl_free(tags[0]);
03370 return result;
03371 }
03372
03373
03382
03383 cpl_frame* xsh_find_disp_tab( cpl_frameset *frames,
03384 xsh_instrument* instr)
03385 {
03386 const char *tags[3] ={NULL,NULL};
03387 cpl_frame* result = NULL;
03388
03389 tags[0] = XSH_GET_TAG_FROM_ARM( XSH_DISP_TAB_AFC, instr);
03390 tags[1] = XSH_GET_TAG_FROM_ARM( XSH_DISP_TAB, instr);
03391
03392 check( result = xsh_find_frame( frames,(const char**) tags));
03393
03394 if (result == NULL){
03395 xsh_msg( "No DISP TAB frame found !!");
03396 }
03397 else{
03398 xsh_msg("DISP_TAB => %s", cpl_frame_get_filename( result));
03399 }
03400
03401 cleanup:
03402 return result;
03403 }
03404
03405
03406
03414
03415
03416 cpl_frame * xsh_find_raw_orderdef_nir_off( cpl_frameset * frames )
03417 {
03418 char *tags[] ={NULL,NULL};
03419 cpl_frame* result = NULL;
03420
03421 check(tags[0] = xsh_stringcat_any( XSH_ORDERDEF_OFF, NULL ) ) ;
03422 check(result = xsh_find_frame (frames,(const char**) tags));
03423
03424 cleanup:
03425 cpl_free(tags[0]);
03426 return result;
03427 }
03428
03436 cpl_frame * xsh_find_raw_arc_slit_uvb_vis( cpl_frameset * frames,
03437 XSH_ARM arm )
03438 {
03439 char *tags[] ={NULL,NULL};
03440 cpl_frame* result = NULL;
03441
03442 if ( arm == XSH_ARM_UVB )
03443 check( tags[0] = xsh_stringcat_any( XSH_ARC_SLIT_UVB, NULL ) ) ;
03444 else if ( arm == XSH_ARM_VIS )
03445 check( tags[0] = xsh_stringcat_any( XSH_ARC_SLIT_VIS, NULL ) ) ;
03446 else goto cleanup ;
03447
03448 check(result = xsh_find_frame (frames,(const char**) tags));
03449
03450 cleanup:
03451 cpl_free(tags[0]);
03452 return result;
03453 }
03454
03462 cpl_frame * xsh_find_raw_arc_slit_nir_on( cpl_frameset * frames )
03463 {
03464 char *tags[] ={NULL,NULL};
03465 cpl_frame* result = NULL;
03466
03467 check(tags[0] = xsh_stringcat_any( XSH_ARC_SLIT_NIR, NULL ) ) ;
03468 check(result = xsh_find_frame (frames,(const char**) tags));
03469
03470 cleanup:
03471 cpl_free(tags[0]);
03472 return result;
03473 }
03474
03482 cpl_frame * xsh_find_raw_arc_slit_nir_off( cpl_frameset * frames )
03483 {
03484 char *tags[] ={NULL,NULL};
03485 cpl_frame* result = NULL;
03486
03487 check(tags[0] = xsh_stringcat_any( XSH_ARC_SLIT_OFF, NULL ) ) ;
03488 check(result = xsh_find_frame (frames,(const char**) tags));
03489
03490 cleanup:
03491 cpl_free(tags[0]);
03492 return result;
03493 }
03494
03495
03504 cpl_frame * xsh_find_calpro_model_config( cpl_frameset * frames,
03505 xsh_instrument * instr )
03506 {
03507 char *tags[] ={NULL,NULL};
03508 cpl_frame* result = NULL;
03509
03510 check(tags[0] = xsh_stringcat_any( XSH_MOD_CFG,
03511 xsh_instrument_arm_tostring(instr),
03512 NULL ) ) ;
03513 xsh_msg_debug("tag=%s",tags[0]);
03514 check(result = xsh_find_frame (frames,(const char**) tags));
03515
03516 cleanup:
03517 cpl_free(tags[0]);
03518 return result;
03519 }
03520
03521
03531 cpl_frame * xsh_find_model_config_open( cpl_frameset * frames,
03532 xsh_instrument * instr )
03533 {
03534 char *tags[] ={NULL,NULL};
03535 cpl_frame* result = NULL;
03536
03537 check(tags[0] = xsh_stringcat_any( XSH_MOD_CFG_OPEN,
03538 xsh_instrument_arm_tostring(instr),
03539 NULL ) ) ;
03540 xsh_msg_debug("tag=%s",tags[0]);
03541 check(result = xsh_find_frame (frames,(const char**) tags));
03542
03543 cleanup:
03544 cpl_free(tags[0]);
03545 return result;
03546 }
03547
03548
03558 cpl_frame * xsh_find_calpro_model_meas_coord( cpl_frameset * frames,
03559 xsh_instrument * instr )
03560 {
03561 char *tags[] ={NULL,NULL};
03562 cpl_frame* result = NULL;
03563
03564 check(tags[0] = xsh_stringcat_any( XSH_MEASCOORD,
03565 xsh_instrument_arm_tostring(instr),
03566 NULL ) ) ;
03567 check(result = xsh_find_frame (frames,(const char**) tags));
03568
03569 cleanup:
03570 cpl_free(tags[0]);
03571 return result;
03572 }
03573
03583 cpl_frame * xsh_find_model_wavelist( cpl_frameset * frames,
03584 xsh_instrument * instr )
03585 {
03586 char *tags[] ={NULL,NULL};
03587 cpl_frame* result = NULL;
03588
03589 check(tags[0] = xsh_stringcat_any( XSH_MODEL_WAVE_LIST,
03590 xsh_instrument_arm_tostring(instr),
03591 NULL ) ) ;
03592 check(result = xsh_find_frame (frames,(const char**) tags));
03593
03594 cleanup:
03595 cpl_free(tags[0]);
03596 return result;
03597 }
03598
03599
03600
03610 cpl_frame * xsh_find_model_testpar( cpl_frameset * frames,
03611 xsh_instrument * instr )
03612 {
03613 char *tags[] ={NULL,NULL};
03614 cpl_frame* result = NULL;
03615
03616 check(tags[0] = xsh_stringcat_any( XSH_MODEL_TEST_PAR,
03617 xsh_instrument_arm_tostring(instr),
03618 NULL ) ) ;
03619 check(result = xsh_find_frame (frames,(const char**) tags));
03620
03621 cleanup:
03622 cpl_free(tags[0]);
03623 return result;
03624 }
03625
03626
03636 cpl_frame * xsh_find_spectral_format( cpl_frameset * frames,
03637 xsh_instrument * instr )
03638 {
03639 char *tags[] ={NULL,NULL};
03640 cpl_frame* result = NULL;
03641
03642 check(tags[0] = xsh_stringcat_any( XSH_SPECTRAL_FORMAT,
03643 xsh_instrument_arm_tostring(instr),
03644 NULL ) ) ;
03645 check(result = xsh_find_frame (frames,(const char**) tags));
03646
03647 cleanup:
03648 cpl_free(tags[0]);
03649 return result;
03650 }
03651
03652
03662
03663 static cpl_frame *
03664 xsh_find_frame( cpl_frameset *frames, const char *tags[])
03665 {
03666 cpl_frame *frame = NULL;
03667 bool found = false;
03668 char *tags_string = NULL;
03669 char *temp = NULL;
03670 int i;
03671
03672 assure (frames != NULL, CPL_ERROR_NULL_INPUT, "Null frameset");
03673 assure (tags != NULL, CPL_ERROR_NULL_INPUT, "Null tags");
03674
03675 tags_string = xsh_stringdup ("");
03676
03677 for (i = 0; !found && tags[i] != NULL; i++) {
03678
03679 cpl_free (temp);
03680 temp = NULL;
03681 temp = xsh_stringdup (tags_string);
03682
03683 if (i == 0) {
03684 cpl_free (tags_string);
03685 tags_string = NULL;
03686 check (tags_string = xsh_stringdup (tags[i]));
03687 }
03688 else {
03689 cpl_free (tags_string);
03690 tags_string = NULL;
03691 check (tags_string = xsh_stringcat_3 (temp, ", ", tags[i]));
03692 }
03693
03694
03695 frame = cpl_frameset_find (frames, tags[i]);
03696
03697 if (frame != NULL) {
03698 found = true;
03699 }
03700 }
03701 if(!found) {
03702 xsh_msg_warning("%d, Frameset does not contain any %s frame(s)",
03703 CPL_ERROR_DATA_NOT_FOUND,tags_string);
03704 }
03705 cleanup:
03706 cpl_free (tags_string);
03707 cpl_free (temp);
03708
03709 return frame;
03710 }
03711