30 #include <irplib_utils.h>
32 #include <uves_error.h>
33 #include <uves_qclog.h>
35 #include <uves_utils_wrappers.h>
36 #include <flames_midas_def.h>
37 #include <flames_corvel.h>
38 #include <flames_reduce_vcorrel.h>
42 double DRS_CVEL_MIN = -6.;
43 double DRS_CVEL_MAX = +6.;
44 double DRS_CVEL_STEP = 0.5;
48 flames_reduce_vcorrel(
const char* sci_pfx,
52 const cpl_frame* cvel_tab,
53 const char* xxima_pfx,
54 const char* xwcal_pfx,
55 const double drs_cvel_min,
56 const double drs_cvel_max,
65 char cvel_tab_name[80];
74 const int npix=(drs_cvel_max-drs_cvel_min)/DRS_CVEL_STEP+1;
76 cpl_image* tim_ccf_ima=NULL;
77 cpl_image* nim_ccf_ima=NULL;
79 cpl_table* cvel_tbl=NULL;
80 double ccfcnt[ord_max];
90 char out_cvel_tab[80];
93 cpl_table* cvel_ord_tbl=NULL;
96 cpl_image* tot_ima=NULL;
97 cpl_image* nrm_ima=NULL;
104 cpl_propertylist* plist_ima_new=NULL;
105 cpl_propertylist* plist_tbl_new=NULL;
112 const char* command=NULL;
120 sprintf(otab,
"%s%s%s",cvel_pfx,ccd_id,
".fits");
121 sprintf(tim_ccf,
"%s%s%s%s",
"tot_",cvel_pfx,ccd_id,
".fits");
122 sprintf(nim_ccf,
"%s%s%s%s",
"nrm_",cvel_pfx,ccd_id,
".fits");
123 sprintf(iim_pfx,
"%s%s%s%s",
"mw",sci_pfx,xxima_pfx,
".fits");
124 sprintf(tab_pfx,
"%s%s%s",
"tab_",ccd_id,
"_");
125 sprintf(nim_pfx,
"%s%s%s",
"nrm_",ccd_id,
"_");
126 sprintf(tim_pfx,
"%s%s%s",
"tot_",ccd_id,
"_");
127 sprintf(ref_frm,
"%s%s%s",
"w",sci_pfx,xwcal_pfx);
132 uves_msg(
"name=%s",cpl_frame_get_filename(cvel_tab));
133 sprintf(cvel_tab_name,
"%s",cpl_frame_get_filename(cvel_tab));
136 tim_ccf_ima=cpl_image_new(npix,ord_max,CPL_TYPE_FLOAT);
137 nim_ccf_ima=cpl_image_new(npix,ord_max,CPL_TYPE_FLOAT);
144 cvel_tbl=cpl_table_new(0);
145 check_nomsg(cpl_table_new_column(cvel_tbl,
"Select",CPL_TYPE_INT));
146 check_nomsg(cpl_table_new_column(cvel_tbl,
"ccf_pos",CPL_TYPE_DOUBLE));
147 check_nomsg(cpl_table_new_column(cvel_tbl,
"ccf_nrm",CPL_TYPE_DOUBLE));
148 check_nomsg(cpl_table_new_column(cvel_tbl,
"ccf_out",CPL_TYPE_DOUBLE));
149 check_nomsg(cpl_table_new_column(cvel_tbl,
"ORDER",CPL_TYPE_INT));
159 uves_check_rec_status(0);
161 for (ord=ord_min;ord<=ord_max;ord++) {
165 sprintf(out_cvel_tab,
"%s%s%d%s",
"tab_",ccd_id,ord,
".fits");
166 sprintf(out_tot_ima,
"%s%s%d%s",
"tot_",ccd_id,ord,
".fits");
167 sprintf(out_nrm_ima,
"%s%s%d%s",
"nrm_",ccd_id,ord,
".fits");
170 uves_msg_debug(
"vc2 %s %s %s",out_cvel_tab,out_tot_ima,out_nrm_ima);
172 iim_pfx,cvel_tab_name,ord);
194 drs_cvel_min,drs_cvel_max,DRS_CVEL_STEP);
196 check_nomsg(tot_ima=cpl_image_load(out_tot_ima,CPL_TYPE_FLOAT,0,0));
197 check_nomsg(nrm_ima=cpl_image_load(out_nrm_ima,CPL_TYPE_FLOAT,0,0));
198 check_nomsg(cpl_image_copy(tim_ccf_ima,tot_ima,1,ord-ord_min+1));
199 check_nomsg(cpl_image_copy(nim_ccf_ima,nrm_ima,1,ord-ord_min+1));
200 check_nomsg(cvel_ord_tbl=cpl_table_load(out_cvel_tab,1,1));
203 check_nomsg(cpl_table_new_column(cvel_ord_tbl,
"ORDER",CPL_TYPE_INT));
204 check_nomsg(nrow=cpl_table_get_nrow(cvel_ord_tbl));
206 check_nomsg(cpl_table_fill_column_window_int(cvel_ord_tbl,
"ORDER",0,nrow,ord));
207 check_nomsg(cpl_table_insert(cvel_tbl,cvel_ord_tbl,row_pos));
210 if((status=SCFOPN(out_tot_ima,D_R4_FORMAT,0,F_IMA_TYPE,&in_ima_id))!=0) {
212 return flames_midas_error(MAREMMA);
215 if((status=SCFOPN(iim_pfx,D_R4_FORMAT,0,F_IMA_TYPE,&iim_pfx_id))!=0) {
217 return flames_midas_error(MAREMMA);
222 sprintf(key_name,
"%s",
"CORVEL_MAX");
223 if((status=SCDRDD(iim_pfx_id,key_name,1,1,&actvals,&corvel_max,&unit,&null))
226 key_name,out_tot_ima);
227 return flames_midas_error(MAREMMA);
232 sprintf(key_name,
"%s%d",
"CCF_PMX",ord);
234 if(!irplib_isnan(corvel_max)) {
235 ccfcnt[ord]=corvel_max;
236 check_nomsg(cpl_propertylist_append_double(plist_ima_new,key_name,
242 cpl_sprintf(
"%s%d%s",
243 "QC CCF",ord,
" POSMAX"),
251 check_nomsg(cpl_propertylist_append_double(plist_ima_new,key_name,
258 cpl_sprintf(
"%s%d%s",
259 "QC CCF",ord,
" POSMAX"),
268 sprintf(key_name,
"%s",
"CCF_MAX");
269 if((status=SCDRDD(in_ima_id,key_name,1,1,&actvals,&ccf_max,&unit,&null))
272 key_name,out_tot_ima);
273 return flames_midas_error(MAREMMA);
277 sprintf(key_name,
"%s%d",
"CCF_MAX",ord);
279 check_nomsg(cpl_propertylist_append_double(plist_ima_new,key_name,ccf_max));
283 cpl_sprintf(
"%s%d%s",
284 "QC CCF",ord,
" INTMAX"),
291 sprintf(key_name,
"%s",
"WAV_RNG");
292 if((status=SCDRDD(in_ima_id,key_name,1,1,&actvals,&wav_rng,&unit,&null))
295 key_name,out_tot_ima);
296 return flames_midas_error(MAREMMA);
299 sprintf(key_name,
"%s%d",
"WAV_RNG",ord);
302 check_nomsg(cpl_propertylist_append_double(plist_ima_new,key_name,wav_rng));
306 cpl_sprintf(
"%s%d%s",
307 "QC CCF",ord,
" WAVRNG"),
314 sprintf(key_name,
"%s",
"PIX_TOT");
315 if((status=SCDRDD(in_ima_id,key_name,1,1,&actvals,&pix_tot,&unit,&null))
318 key_name,out_tot_ima);
319 return flames_midas_error(MAREMMA);
324 if(!irplib_isinf(pix_tot)) {
326 sprintf(key_name,
"%s%d",
"PIX_TOT",ord);
327 check_nomsg(cpl_propertylist_append_double(plist_ima_new,key_name,pix_tot));
330 cpl_sprintf(
"%s%d%s",
331 "QC CCF",ord,
" PIXTOT"),
338 sprintf(key_name,
"%s%d",
"PIX_TOT",ord);
339 check_nomsg(cpl_propertylist_append_double(plist_ima_new,key_name,999.));
342 cpl_sprintf(
"%s%d%s",
343 "QC CCF",ord,
" PIXTOT"),
351 sprintf(key_name,
"%s",
"LIN_TOT");
352 if((status=SCDRDI(in_ima_id,key_name,1,1,&actvals,&lin_tot,&unit,&null))
355 key_name,out_tot_ima);
356 return flames_midas_error(MAREMMA);
360 sprintf(key_name,
"%s%d",
"LIN_TOT",ord);
362 check_nomsg(cpl_propertylist_append_int(plist_ima_new,key_name,lin_tot));
367 cpl_sprintf(
"%s%d%s",
368 "QC CCF",ord,
" LINTOT"),
374 if((status = SCFCLO(in_ima_id))!=0) {
376 return flames_midas_error(MAREMMA);
378 if((status = SCFCLO(iim_pfx_id))!=0) {
380 return flames_midas_error(MAREMMA);
384 uves_free_table(&cvel_ord_tbl);
385 uves_free_image(&tot_ima);
386 uves_free_image(&nrm_ima);
388 command=uves_sprintf(
"%s%s",
"rm -rf ",out_cvel_tab);
390 command=uves_sprintf(
"%s%s",
"rm -rf ",out_tot_ima);
392 command=uves_sprintf(
"%s%s",
"rm -rf ",out_nrm_ima);
399 check_nomsg(cpl_image_save(tim_ccf_ima,
"tot_ima.fits",CPL_BPP_IEEE_FLOAT,
400 plist_ima_new,CPL_IO_DEFAULT));
401 check_nomsg(cpl_image_save(nim_ccf_ima,
"nrm_ima.fits",CPL_BPP_IEEE_FLOAT,
402 plist_ima_new,CPL_IO_DEFAULT));
404 check_nomsg(cpl_table_save(cvel_tbl, plist_tbl_new, NULL, otab,
407 uves_free_image(&tim_ccf_ima);
408 uves_free_image(&nim_ccf_ima);
409 uves_free_table(&cvel_tbl);
411 ord = ord_max-ord_min+1;
418 for (ord=ord_min; ord<= ord_max; ord++) {
419 if (ccfcnt[ord] != 999) {
420 *avg_cnt +=ccfcnt[ord];
421 uves_msg_debug(
"POSMAX avg=%g cnt=%g ord=%d",*avg_cnt,ccfcnt[ord],ord);
428 for (ord = ord_min; ord <= ord_max; ord++) {
429 if (ccfcnt[ord] != 999) {
430 *sig_cnt += (ccfcnt[ord]-*avg_cnt)*(ccfcnt[ord]-*avg_cnt);
434 *sig_cnt = sqrt(*sig_cnt/(num_ord-1));
436 *zero_point+=(*avg_cnt);
557 if(plist_ima_new!=NULL) {
559 cpl_propertylist_delete(plist_ima_new);
562 uves_free_table(&cvel_tbl);
563 uves_free_image(&tim_ccf_ima);
564 uves_free_image(&nim_ccf_ima);
565 uves_free_image(&tot_ima);
566 uves_free_image(&nrm_ima);
567 uves_free_table(&cvel_ord_tbl);
571 if (cpl_error_get_code() != CPL_ERROR_NONE) {
572 uves_check_rec_status(9);