41 #include <flames_lfit.h>
42 #include <flames_midas_def.h>
43 #include <flames_corvel.h>
44 #include <flames_newmatrix.h>
45 #include <uves_utils.h>
50 #include <irplib_utils.h>
63 #define FLAMES_SPEED_OF_LIGHT 299792.458 //is defined also in uves_utils.h
78 do_cor_vel(
double* wcal_sol,
float** sp_flux,
79 double* rv_ccf,
double* msk_hole_siz,
double* msk_hole_cen,
80 double* msk_hole_wgt,
double bar_v,
double bar_v_max,
81 int fit_type,
int in_ima_nrow,
82 int in_msk_nrow,
int rv_ccf_size,
double* ccf,
double* ccf_max,
83 double* pix_passed_ord,
int* tot_line,
double* ll_range_ord,
87 fit_ccf(
double* rv_ccf,
double* ccf_nor,
int type,
double* ccf_res,
101 gaussian_fit(
const double * xfit,
const double * yfit,
int size,
102 double * norm,
double * xcen,
double * sig_x,
105 correl_bin(
int sp_flux_sz,
float** sp_flux,
double* sp_ll,
double* sp_dll,
106 int *in_msk_nrow,
double* msk_blu,
double* msk_red,
107 double* msk_w,
int* i_blue_masques,
int* i_red_masques,
108 double* intensity_s,
double* pix,
double* ll_range);
111 hunt(
double* xx,
int n,
double x,
int jlo);
115 do_ccf_f(
double* mask_ll,
double* mask_d,
double* mask_w,
double* sp_ll,
116 float** sp_flux,
double* sp_dll,
double* rv_ccf,
double* ccf_o,
117 double* pix_passed_ord,
double* wcal_range_ord,
int in_msk_nrow,
118 int in_ima_ncol,
int rv_ccf_size,
int in_ima_id);
138 int flames_corvel(
const char *IN_A,
144 const double rv_ccf_min,
145 const double rv_ccf_max,
146 const double rv_ccf_step)
151 char in_ima[MAX_LEN];
152 char ou_ima[MAX_LEN];
153 char ou_tab[MAX_LEN];
154 char in_msk[MAX_LEN];
160 int midas_status = 0;
168 int ou_ima_npix[2] ={0,0};
169 double ou_ima_start[2] ={0.,0.};
170 double ou_ima_step[2] ={0.,0.};
172 float cuts[4]={0.,0.,0.,0.};
178 int in_ima_npix[MAX_DIM];
190 float ** m_in_ima=NULL;
192 double* in_ima_wcal_sol=NULL;
194 double* msk_hole_sta=NULL;
195 double* msk_hole_end=NULL;
196 double* msk_hole_cen=NULL;
197 double* msk_hole_siz=NULL;
198 double* msk_hole_wgt=NULL;
200 double* msk_hole_cen_selw=NULL;
201 double* msk_hole_siz_selw=NULL;
202 double* msk_hole_wgt_selw=NULL;
205 double in_msk_wgt_min=0.9;
206 double in_msk_hole_wid=0.;
208 double in_ima_wstart =0.;
209 double in_ima_wstep =0.;
228 double* ccf_nrm=NULL;
229 double pix_passed_ord=0;
232 double ll_range_ord=0;
233 double* ccf_res=NULL;
234 double* ccf_fit=NULL;
239 SCSPRO(
"flames_corvel");
242 memset(ident,
'\0', 73);
243 memset(cunit[0],
'\0', 48);
244 strncpy(cunit[1],
"PIXEL ", 16);
245 strncpy(cunit[2],
"PIXEL ", 16);
252 if((midas_status = SCKGETC(IN_A,1,MAX_LEN,&midas_nval,in_ima)) !=0) {
254 return flames_midas_error(MAREMMA);
268 if( (midas_status = SCFOPN(in_ima,D_R4_FORMAT,0,F_IMA_TYPE,&in_ima_id))!=0) {
270 return flames_midas_error(MAREMMA);
274 if((midas_status = SCDRDI(in_ima_id,
"NAXIS",1,1,&midas_nval,
275 &in_ima_naxis,&midas_unit,&midas_null)) !=0)
278 return flames_midas_error(MAREMMA);
282 if((midas_status = SCDRDI(in_ima_id,
"NPIX",1,in_ima_naxis,&midas_nval,
283 in_ima_npix,&midas_unit,&midas_null))!=0) {
285 return flames_midas_error(MAREMMA);
290 if (in_ima_naxis > 1) {
291 in_ima_nx = in_ima_npix[0];
292 in_ima_ny = in_ima_npix[1];
295 in_ima_nx = in_ima_npix[0];
300 m_in_ima = matrix(0, in_ima_ny-1, 0, in_ima_nx-1);
302 memset(&m_in_ima[0][0],
'\0', in_ima_nx*in_ima_ny*
sizeof(
float));
305 if((midas_status = SCFGET(in_ima_id,1,in_ima_nx*in_ima_ny,&midas_nval,
306 (
char *)&m_in_ima[0][0])) != 0) {
308 return flames_midas_error(MAREMMA);
319 sprintf(wstart_key,
"%s%d",
"WSTART",in_ima_ord);
320 if((midas_status = SCDRDD(in_ima_id,wstart_key,1,1,
321 &midas_nval,&tmp_double,
322 &midas_unit,&midas_null)) != 0) {
324 return flames_midas_error(MAREMMA);
329 in_ima_wstart=(float)tmp_double;
332 if((midas_status = SCDRDD(in_ima_id,
"CDELT1",1,1,&midas_nval,&tmp_double,
333 &midas_unit,&midas_null))!=0) {
335 return flames_midas_error(MAREMMA);
339 in_ima_wstep=(float)tmp_double;
340 in_ima_wcal_sol=dvector(0,in_ima_nx);
343 for (i=0; i< in_ima_nx; i++){
344 in_ima_wcal_sol[i]=(double)(in_ima_wstart+in_ima_wstep*i);
347 if((midas_status = SCKGETC(IN_B,1,MAX_LEN,&midas_nval,in_msk))!=0) {
349 return flames_midas_error(MAREMMA);
383 if((midas_status = TCTOPN(in_msk,F_I_MODE,&in_msk_id))!=0) {
385 return flames_midas_error(MAREMMA);
389 TCIGET (in_msk_id, &in_msk_ncol, &in_msk_nrow);
391 if((midas_status = TCCSER(in_msk_id,
"WSTART",&wstart_id))!=0) {
393 return flames_midas_error(MAREMMA);
397 if((midas_status = TCCSER(in_msk_id,
"WEND",&wend_id))!=0) {
399 return flames_midas_error(MAREMMA);
403 if((midas_status = TCCSER(in_msk_id,
"WEIGHT",&weight_id))!=0) {
405 return flames_midas_error(MAREMMA);
409 msk_hole_sta=dvector(0,in_msk_nrow);
410 msk_hole_end=dvector(0,in_msk_nrow);
411 msk_hole_siz=dvector(0,in_msk_nrow);
412 msk_hole_wgt=dvector(0,in_msk_nrow);
413 msk_hole_cen=dvector(0,in_msk_nrow);
416 msk_hole_siz_selw=dvector(0,in_msk_nrow);
417 msk_hole_wgt_selw=dvector(0,in_msk_nrow);
418 msk_hole_cen_selw=dvector(0,in_msk_nrow);
421 for(i=1;i<in_msk_nrow;i++) {
422 TCERDD(in_msk_id,i,wstart_id,&tmp_dbl,&midas_null);
423 msk_hole_sta[i-1]=tmp_dbl;
424 TCERDD(in_msk_id,i,wend_id,&tmp_dbl,&midas_null);
425 msk_hole_end[i-1]=tmp_dbl;
426 TCERDD(in_msk_id,i,weight_id,&tmp_dbl,&midas_null);
427 msk_hole_wgt[i-1]=tmp_dbl;
428 msk_hole_siz[i-1]=msk_hole_end[i-1]-msk_hole_sta[i-1];
429 msk_hole_cen[i-1]=msk_hole_sta[i-1]+msk_hole_siz[i-1]*0.5;
448 if (in_msk_hole_wid > 0) {
450 for(i=1;i<in_msk_nrow;i++) {
452 in_msk_hole_wid*msk_hole_siz[i-1]/FLAMES_SPEED_OF_LIGHT;
462 if (in_msk_wgt_min < 1) {
469 for(i=1;i<in_msk_nrow;i++) {
470 if (msk_hole_wgt[counter] > in_msk_wgt_min) {
471 msk_hole_siz_selw[counter] = msk_hole_siz[i];
472 msk_hole_cen_selw[counter] = msk_hole_cen[i];
473 msk_hole_wgt_selw[counter] = msk_hole_wgt[i];
479 for(i=1;i<in_msk_nrow;i++) {
480 if (msk_hole_wgt[i] > in_msk_wgt_min) {
481 msk_hole_siz_selw[i] = msk_hole_siz[i];
482 msk_hole_cen_selw[i] = msk_hole_cen[i];
483 msk_hole_wgt_selw[i] = msk_hole_wgt[i];
500 rv_ccf_size=(int)((rv_ccf_max-rv_ccf_min)/rv_ccf_step+1);
501 rv_ccf=dvector(0,rv_ccf_size);
502 ccf_o=dvector(0,rv_ccf_size);
505 rv_ccf[0]=rv_ccf_min;
506 for(i=1;i<rv_ccf_size;i++){
507 rv_ccf[i]=rv_ccf[i-1]+rv_ccf_step;
529 do_cor_vel(in_ima_wcal_sol,
553 ccf_nrm=dvector(0,rv_ccf_size);
554 for(i=0;i<rv_ccf_size;i++){
556 if(!irplib_isinf(ccf_o[i])) {
557 if(ccf_o[i] > ccf_max) {
565 SCKGETC(OU_A,1,MAX_LEN,&midas_nval,ou_tab);
568 TCTINI(ou_tab,F_O_MODE,rv_ccf_size,&tid);
571 TCCINI(tid, D_R8_FORMAT, 1,
"F8.4",
" ",
"ccf_pos", &ccf_pos_col);
572 TCCINI(tid, D_R8_FORMAT, 1,
"F8.4",
" ",
"ccf_nrm", &ccf_nrm_col);
573 TCCINI(tid, D_R8_FORMAT, 1,
"F8.4",
" ",
"ccf_out", &ccf_out_col);
594 for(i=0;i<rv_ccf_size;i++){
595 ccf_nrm[i]=ccf_o[i]/ccf_max;
596 TCEWRD(tid, i+1, ccf_pos_col, &rv_ccf[i]);
597 TCEWRD(tid, i+1, ccf_nrm_col, &ccf_nrm[i]);
598 TCEWRD(tid, i+1, ccf_out_col, &ccf_o[i]);
601 SCDWRD(tid,
"CCF_MAX",&ccf_max,1,1,&midas_unit);
602 SCDWRD(tid,
"WAV_RNG",&ll_range_ord,1,1,&midas_unit);
603 SCDWRD(tid,
"PIX_TOT",&pix_passed_ord,1,1,&midas_unit);
604 SCDWRI(tid,
"LIN_TOT",&tot_line,1,1,&midas_unit);
619 fit_ccf(rv_ccf,ccf_nrm,1,ccf_res,ccf_fit);
625 ou_ima_npix[0]=rv_ccf_size;
627 ou_ima_start[0]=rv_ccf[0];
628 ou_ima_start[1]=ccf_nrm[0];
629 ou_ima_step[0]=ccf_max;
637 SCKGETC(OU_B,1,MAX_LEN,&midas_nval,ou_ima);
639 SCFCRE(ou_ima,D_R8_FORMAT,F_O_MODE,F_IMA_TYPE,rv_ccf_size,&ou_ima_id);
640 SCDWRC(ou_ima_id,
"IDENT", 1, ident, 1, 72, &midas_unit);
641 SCDWRI(ou_ima_id,
"NAXIS",&ou_ima_naxis,1,1,&midas_unit);
642 SCDWRI(ou_ima_id,
"NPIX",ou_ima_npix,1,2,&midas_unit);
643 SCDWRD(ou_ima_id,
"START",ou_ima_start, 1, 2, &midas_unit);
644 SCDWRD(ou_ima_id,
"STEP", ou_ima_step, 1, 2, &midas_unit);
645 SCDWRC(ou_ima_id,
"CUNIT", 1, cunit[0], 1, 48, &midas_unit);
646 SCDWRR(ou_ima_id,
"LHCUTS", cuts, 1, 4, &midas_unit);
647 SCFPUT(ou_ima_id,1,rv_ccf_size,(
char *)ccf_o);
648 SCDWRD(ou_ima_id,
"CCF_MAX",&ccf_max,1,1,&midas_unit);
649 SCDWRD(ou_ima_id,
"WAV_RNG",&ll_range_ord,1,1,&midas_unit);
650 SCDWRD(ou_ima_id,
"PIX_TOT",&pix_passed_ord,1,1,&midas_unit);
651 SCDWRI(ou_ima_id,
"LIN_TOT",&tot_line,1,1,&midas_unit);
655 SCKGETC(OU_C,1,MAX_LEN,&midas_nval,ou_ima);
656 SCFCRE(ou_ima,D_R8_FORMAT,F_O_MODE,F_IMA_TYPE,rv_ccf_size,&ou_ima_id);
658 SCDWRC(ou_ima_id,
"IDENT", 1, ident, 1, 72, &midas_unit);
659 SCDWRI(ou_ima_id,
"NAXIS",&ou_ima_naxis,1,1,&midas_unit);
660 SCDWRI(ou_ima_id,
"NPIX",ou_ima_npix,1,2,&midas_unit);
661 SCDWRD(ou_ima_id,
"START",ou_ima_start, 1, 2, &midas_unit);
662 SCDWRD(ou_ima_id,
"STEP", ou_ima_step, 1, 2, &midas_unit);
663 SCDWRC(ou_ima_id,
"CUNIT", 1, cunit[0], 1, 48, &midas_unit);
664 SCDWRR(ou_ima_id,
"LHCUTS", cuts, 1, 4, &midas_unit);
665 SCFPUT(ou_ima_id,1,rv_ccf_size,(
char *)ccf_nrm);
666 SCDWRD(ou_ima_id,
"CCF_MAX",&ccf_max,1,1,&midas_unit);
667 SCDWRD(ou_ima_id,
"WAV_RNG",&ll_range_ord,1,1,&midas_unit);
668 SCDWRD(ou_ima_id,
"PIX_TOT",&pix_passed_ord,1,1,&midas_unit);
669 SCDWRI(ou_ima_id,
"LIN_TOT",&tot_line,1,1,&midas_unit);
673 free_dvector(msk_hole_sta,0,in_msk_nrow);
674 free_dvector(msk_hole_end,0,in_msk_nrow);
675 free_dvector(msk_hole_siz,0,in_msk_nrow);
676 free_dvector(msk_hole_wgt,0,in_msk_nrow);
677 free_dvector(msk_hole_cen,0,in_msk_nrow);
678 free_dvector(msk_hole_siz_selw,0,in_msk_nrow);
679 free_dvector(msk_hole_wgt_selw,0,in_msk_nrow);
680 free_dvector(msk_hole_cen_selw,0,in_msk_nrow);
681 free_dvector(rv_ccf,0,rv_ccf_size);
682 free_dvector(ccf_nrm,0,rv_ccf_size);
683 free_dvector(in_ima_wcal_sol,0,in_ima_nx);
684 free_dvector(ccf_o,0,rv_ccf_size);
693 do_cor_vel(
double* wcal_sol,
float** sp_flux,
double* rv_ccf,
694 double* msk_hole_siz,
double* msk_hole_cen,
695 double* msk_hole_wgt,
double bar_v,
double bar_v_max,
696 int fit_type,
int in_ima_ncol,
int in_msk_nrow,
700 double* pix_passed_ord,
702 double* wcal_range_ord,
708 double* ccf_all=NULL;
709 double* ccf_all_fit=NULL;
710 double* msk_hole_cen_selr=NULL;
711 double* msk_hole_siz_selr=NULL;
712 double* msk_hole_wgt_selr=NULL;
714 double* ccf_o_results=NULL;
717 double* rv_ccf_cor=NULL;
721 double d_secular_red=0;
722 double d_secular_blu=0;
736 d_secular_red=bar_v_max-bar_v;
737 d_secular_blu=bar_v_max-bar_v;
740 dw_map=dvector(0,in_ima_ncol);
741 ccf_all=dvector(0,rv_ccf_size);
742 ccf_all_fit=dvector(0,rv_ccf_size);
743 rv_ccf_cor=dvector(0,rv_ccf_size);
746 ccf_o_results=dvector(0,4);
749 msk_hole_cen_selr=dvector(0,in_msk_nrow);
750 msk_hole_siz_selr=dvector(0,in_msk_nrow);
751 msk_hole_wgt_selr=dvector(0,in_msk_nrow);
753 for(i=0;i<in_ima_ncol-1;i++){
754 dw_map[i]=wcal_sol[i+1]-wcal_sol[i];
772 wcal_min=wcal_sol[0]-(rv_ccf[0]-bar_v-d_secular_blu)*
773 wcal_sol[0]/FLAMES_SPEED_OF_LIGHT;
775 wcal_max=wcal_sol[in_ima_ncol-1]-(rv_ccf[rv_ccf_size-1]-bar_v+d_secular_red)*
776 wcal_sol[in_ima_ncol-1]/FLAMES_SPEED_OF_LIGHT;
788 for(i=0;i<in_msk_nrow;i++){
789 if((msk_hole_cen[i]>wcal_min) && (msk_hole_cen[i]<wcal_max)) {
790 msk_hole_cen_selr[sel_no]=msk_hole_cen[i];
791 msk_hole_siz_selr[sel_no]=msk_hole_siz[i];
792 msk_hole_wgt_selr[sel_no]=msk_hole_wgt[i];
803 for(i=0;i<rv_ccf_size;i++){
804 rv_ccf_cor[i]=rv_ccf[i]-bar_v;
830 do_ccf_f(msk_hole_cen_selr, msk_hole_siz_selr, msk_hole_wgt_selr,
831 wcal_sol, sp_flux, dw_map, rv_ccf_cor, ccf_o, pix_passed_ord,
832 wcal_range_ord, sel_no, in_ima_ncol, rv_ccf_size, in_ima_id);
838 printf(
"No hole between wcal_min=%f and wcal_max=%f all set to 0. \n",
840 for(i=0;i<rv_ccf_size;i++){
842 ccf_o[i]=rv_ccf[i]*0.;
860 free_dvector(rv_ccf_cor,0,rv_ccf_size);
861 free_dvector(dw_map,0,in_ima_ncol);
864 free_dvector(ccf_o_results,0,4);
867 free_dvector(ccf_all,0,rv_ccf_size);
868 free_dvector(ccf_all_fit,0,rv_ccf_size);
870 free_dvector(msk_hole_cen_selr,0,in_msk_nrow);
871 free_dvector(msk_hole_siz_selr,0,in_msk_nrow);
872 free_dvector(msk_hole_wgt_selr,0,in_msk_nrow);
880 do_ccf_f(
double* mask_ll,
double* mask_d,
double* mask_w,
double* sp_ll,
881 float** sp_flux,
double* sp_dll,
double* rv_ccf,
double* ccf_o,
882 double* pix_tot,
double* ll_range_tot,
int in_msk_nrow,
883 int in_ima_ncol,
int rv_ccf_size,
int in_ima_id)
907 double* msk_blu=NULL;
908 double* msk_red=NULL;
909 double* sp_ll_prime=NULL;
917 int* i_blu_masques=NULL;
918 int* i_red_masques=NULL;
921 double intensity_s=0;
934 int sp_ll_sz = in_ima_ncol;
941 xfit=dvector(1,rv_ccf_size);
942 yfit=dvector(1,rv_ccf_size);
943 sfit=dvector(1,rv_ccf_size);
945 covar = dmatrix(1,ndeg,1,ndeg);
946 alpha = dmatrix(1,ndeg,1,ndeg);
949 erraa=dvector(1,ndeg);
951 sp_ll_prime=dvector(0,in_ima_ncol);
952 msk_blu = dvector(0,in_msk_nrow);
953 msk_red = dvector(0,in_msk_nrow);
954 i_blu_masques = ivector(0,in_msk_nrow);
955 i_red_masques = ivector(0,in_msk_nrow);
957 for(i=0;i<rv_ccf_size;i++) {
962 for(i=0;i<rv_ccf_size;i++) {
969 for(j=0; j<sp_ll_sz; j++) {
970 sp_ll_prime[j]=sp_ll[j]+sp_dll[j]*0.5;
972 for(j=0;j<in_msk_nrow;j++) {
974 msk_blu[j]=mask_ll[j]+rv*mask_ll[j]/FLAMES_SPEED_OF_LIGHT-0.5*mask_d[j];
975 msk_red[j]=mask_ll[j]+rv*mask_ll[j]/FLAMES_SPEED_OF_LIGHT+0.5*mask_d[j];
1010 first_hole=hunt(msk_blu-1, in_msk_nrow, sp_ll[0],0);
1013 for(j=0;j<in_msk_nrow;j++) {
1016 i_blu_masques[j]=hunt(sp_ll_prime-1,sp_ll_sz,msk_blu[j],0)+1;
1018 guess=i_blu_masques[j];
1019 i_red_masques[j]=hunt(sp_ll_prime-1,sp_ll_sz,msk_red[j],guess)+1;
1020 guess=i_red_masques[j];
1024 correl_bin(sp_ll_sz,sp_flux,sp_ll,sp_dll,
1025 &in_msk_nrow,msk_blu,msk_red,mask_w,i_blu_masques,
1026 i_red_masques,&intensity_s,&pix,&ll_range);
1028 ccf_o[i]=intensity_s;
1032 *ll_range_tot+=ll_range;
1033 for(i=0;i<rv_ccf_size;i++) {
1060 gaussian_fit(rv_ccf,ccf_o,rv_ccf_size,&norm,&cen,&sig,&fwhm);
1064 SCDWRD(in_ima_id,
"CORVEL_MAX",&cen,1,1,&midas_unit);
1069 free_dmatrix(covar,1,ndeg,1,ndeg);
1070 free_dmatrix(alpha,1,ndeg,1,ndeg);
1072 free_dvector(aa,1,ndeg);
1073 free_dvector(erraa,1,ndeg);
1074 free_ivector(ia,1,ndeg);
1076 free_dvector(xfit,1,rv_ccf_size);
1077 free_dvector(yfit,1,rv_ccf_size);
1078 free_dvector(sfit,1,rv_ccf_size);
1080 free_dvector(msk_blu,0,in_msk_nrow);
1081 free_dvector(msk_red,0,in_msk_nrow);
1082 free_ivector(i_blu_masques,0,in_msk_nrow);
1083 free_ivector(i_red_masques,0,in_msk_nrow);
1085 free_dvector(sp_ll_prime,0,in_ima_ncol);
1115 double *pll_wei=NULL;
1139 for (trou=0;trou < *nbr_trou;trou++) {
1141 if (pi_start[trou] == pi_end[trou]) {
1142 *out_ccf=*out_ccf+(pll_e[trou]-pll_s[trou])/pdll[pi_start[trou]]*
1143 pflux[pi_start[trou]]*(pll_wei[trou]);
1145 *pix=*pix+(pll_e[trou]-pll_s[trou])*pll_wei[trou]/
1146 pdll[pi_start[trou]];
1148 *llrange=*llrange+(pll_e[trou]-pll_s[trou])*pll_wei[trou];
1150 }
else if (pi_start[trou]+1 == pi_end[trou]) {
1153 ((pll[pi_start[trou]]+pdll[pi_start[trou]]*.5-pll_s[trou])*
1154 pflux[pi_start[trou]]/pdll[pi_start[trou]]+
1155 (pll_e[trou]-(pll[pi_start[trou]]+pdll[pi_start[trou]]*.5))*
1156 pflux[pi_end[trou]]/pdll[pi_start[trou]])*pll_wei[trou];
1158 *pix=*pix+((pll[pi_start[trou]]+pdll[pi_start[trou]]*.5-
1159 pll_s[trou])/pdll[pi_start[trou]]+
1160 (pll_e[trou]-(pll[pi_start[trou]]+pdll[pi_start[trou]]*.5))/
1161 pdll[pi_end[trou]])*pll_wei[trou];
1164 *llrange=*llrange+((pll[pi_start[trou]]+pdll[pi_start[trou]]*.5-
1166 (pll_e[trou]-(pll[pi_start[trou]]+pdll[pi_start[trou]]*.5)))*
1172 *out_ccf=*out_ccf+((pll[pi_start[trou]]+pdll[pi_start[trou]]*0.5-
1173 pll_s[trou])*pflux[pi_start[trou]]/pdll[pi_start[trou]]+
1174 (pll_e[trou]-(pll[pi_end[trou]]-pdll[pi_end[trou]]*.5))*
1175 pflux[pi_end[trou]]/pdll[pi_end[trou]])*pll_wei[trou];
1178 ((pll[pi_start[trou]]+pdll[pi_start[trou]]*0.5-pll_s[trou])/
1179 pdll[pi_start[trou]]+
1180 (pll_e[trou]-(pll[pi_end[trou]]-pdll[pi_end[trou]]*.5))/
1181 pdll[pi_end[trou]])*pll_wei[trou];
1184 ((pll[pi_start[trou]]+pdll[pi_start[trou]]*0.5-pll_s[trou])+
1185 (pll_e[trou]-(pll[pi_end[trou]]-pdll[pi_end[trou]]*.5)))
1188 for (i=pi_start[trou]+1;i<=pi_end[trou]-1;i++) {
1190 *out_ccf=*out_ccf+pflux[i]*pll_wei[trou];
1191 *pix=*pix+pll_wei[trou];
1192 *llrange=*llrange+pdll[i]*pll_wei[trou];
1200 fit_ccf(
double* rv_ccf,
double* ccf_nor,
int type,
double* ccf_res,
1219 hunt(
double* xx,
int n,
double x,
int jlo) {
1224 ascnd=(xx[n] >= xx[1]);
1225 if (jlo <= 0 || jlo >n) {
1230 if ((x>=xx[jlo]) == ascnd) {
1231 if (jlo == n)
return jlo-1;
1233 while ((x>=xx[jhi]) == ascnd) {
1248 while ((x<xx[jlo])==ascnd) {
1259 while ((jhi-jlo) != 1) {
1261 if ( (x >= xx[jm]) ==ascnd)
1266 if (x == xx[n]) jlo=n-1;
1267 if (x == xx[1]) jlo=1;
1321 gaussian_fit(
const double * x,
1341 for (i=0 ; i<size ; i++) {
1347 for (i=0 ; i<size ; i++) {
1348 uxx += (x[i]-(ux/u0)) * (x[i]-(ux/u0)) * y[i] ;
1350 if (sig_x) *sig_x = sqrt(fabs(uxx/u0)) ;
1351 if (fwhm_x) *fwhm_x = 2 * sqrt(2 * log(2.0)) * sqrt(fabs(uxx/u0)) ;
1354 for (i=1 ; i<size ; i++) {
1355 if(y[i] > max_val) max_val=y[i];
1358 if (norm) *norm = max_val*2*M_PI*sqrt(fabs(uxx/u0)) ;
1361 if (xcen) *xcen = ux/u0;