/* PAON4 analysis software classes and functions to read in and perform array geometry determination using satellites and celestial sources tracks R. Ansari, Fevrier 2019 */ #include #include "pexceptions.h" #include "trkfit.h" #include "datacards.h" #include "array.h" #include "acbeam.h" #include "gacfit.h" #include "gcxfit.h" #include "gcxfitbaseline.h" #include "p4autils.h" //------------------- Print Level for this file -------------------------- static int _prtlevel_ =0; void TrkFit_SetPrintLevel(int lev) { _prtlevel_=lev; return; } //------------------- TrkInputDataSet ------------------------------------- TrkInputDataSet::TrkInputDataSet(string dcfilename, string inp_path) : zenang(0.) , theta_0(0.) , phi_0(0.) { setInputBasePath(inp_path); ReadDatacardFile(dcfilename); } static vector * dataflnm_p_ = NULL; static vector * tstart_p_ = NULL; static vector * tend_p_ = NULL; static vector * v_freqs_p_ = NULL; static vector * trkflnm_p_ = NULL; static size_t trk_cnt = 0; static int decode_trkcard(string const& key, string const& toks) { if (key != "trk") { // CA NE DEVRAIT PAS ARRIVER cout << "decode_trkcard/ERROR BAD key = " << key << " ( <> trk"<push_back(flnmdata); tstart_p_->push_back(ts*60.); tend_p_->push_back(te*60.); v_freqs_p_->push_back(freq); trkflnm_p_->push_back(flnmtrk); trk_cnt++; return 0; } void TrkInputDataSet::setInputBasePath(string inp_path) { if (inp_path.length()>0) input_base_path=inp_path; return; } size_t TrkInputDataSet::ReadDatacardFile(string dcfilename) { DataCards dc; string match="trk"; dc.AddProcF(decode_trkcard, match); zenang=0.; theta_0=0.; phi_0=0.; dataflnm.clear(); tstart.clear(); tend.clear(); v_freqs.clear(); trkflnm.clear(); dataflnm_p_ = &dataflnm; tstart_p_ = &tstart; tend_p_ = &tend; v_freqs_p_ = &v_freqs; trkflnm_p_ = &trkflnm; trk_cnt = 0; // @trk visiDataTableFile tstart,tend freq TrackFileName // tstart , tend in minutes freq in MHz dc.ReadFile(dcfilename); if (dc.HasKey("inpath")) { // @inpath InputFilesDirectoryPath input_base_path = dc.SParam("inpath",0,""); } if (dc.HasKey("zenang")) { // @zenang Zenith Angle in degree zenang = dc.DParam("zenang",0,0.); if (zenang<0.) { theta_0 = Angle(-zenang, Angle::Degree).ToRadian(); phi_0 = Angle::PioTwoCst()+Angle::OnePiCst(); } else { theta_0 = Angle(+zenang, Angle::Degree).ToRadian(); phi_0 = Angle::PioTwoCst(); } } dataflnm_p_ = NULL; tstart_p_ = NULL; tend_p_ = NULL; v_freqs_p_ = NULL; trkflnm_p_ = NULL; if (trk_cnt != trkflnm.size()) { // ca ne devrait pas arriver cout << " TrkInputDataSet::ReadDatacardFile()/BUG trk_cnt != trkflnm.size()"<> dt_data; dt_data.SetShowMinMaxFlag(true); size_t ktime = dt_data.IndexNom("timesec"); vector vtm; dt_data.GetColumn(ktime, vtm); vector< vector > v_vac(NB_ANTENNES); for(size_t ii=0; ii vtmp, vetmp; vv_data[j].push_back(vtmp); vv_err[j].push_back(vetmp); v_min_data[j].push_back(9.e19); v_max_data[j].push_back(-9.e19); } vector< vector > > v_vcx(NB_CXCORS); for(size_t ii=0; ii > vtmp; vector vetmp; vv_cxdata[j].push_back(vtmp); vv_cxerr[j].push_back(vetmp); v_min_cxdata[j].push_back(9.e19); v_max_cxdata[j].push_back(-9.e19); } vector< vector > & v_data = vv_data[j]; vector< vector > & v_err = vv_err[j]; vector< vector< complex > > & v_cxdata = vv_cxdata[j]; vector< vector > & v_cxerr = vv_cxerr[j]; for(size_t k=0; ktkds.tend[j])) continue; v_time_data[j].push_back(vtm[k]); for(size_t ii=0; ii & vac = v_vac[ii]; v_data[ii].push_back(vac[k]); v_err[ii].push_back(0.1*sqrt(fabs(vac[k]))); // calcul d'erreur, a affiner if (vac[k]v_max_data[j][ii]) v_max_data[j][ii]=vac[k]; } for(size_t ii=0; ii > & vcx = v_vcx[ii]; v_cxdata[ii].push_back(vcx[k]); double acx=std::abs(vcx[k]); v_cxerr[ii].push_back(0.1*sqrt(acx)); if (acxv_max_cxdata[j][ii]) v_max_cxdata[j][ii]=acx; } } tot_npoints += v_time_data[j].size(); // total number of points for fit cout << " ... Done for " << j+1 << " data size="<> dt_sat; dt_sat.SetShowMinMaxFlag(true); size_t ktime = dt_sat.IndexNom("timesec"); dt_sat.GetColumn(ktime, v_time_sat[j]); size_t kelev = dt_sat.IndexNom("elevation"); dt_sat.GetColumn(kelev, v_sat_elev[j]); size_t kazim = dt_sat.IndexNom("azimuth"); dt_sat.GetColumn(kazim, v_sat_azim[j]); cout << "2."< size()="< cazim(v_sat_azim[j].size()); // azimuth values, shifted possibly +360 +720 deg ... to avoid jumping from 360 deg to 0 deg vector shifted_azim(v_sat_azim[j].size()); double azim_offset=0.; double min_azim_offset=0.; bool fgneg_azim_offset=false; for(size_t k=0; k0)&&(azim300.)&&(azim<60.)) { azim_offset += 360.; if (_prtlevel_>0) cout << " read_srctracks 360 to 0 deg. Jump k="<"<0)&&(azim>last_azim)) { if ((last_azim<60)&&(azim>300.)) { azim_offset -= 360.; if (_prtlevel_>0) cout << " read_srctracks 0 to 360 deg. Jump: k="<"< Adding " << -min_azim_offset <<" deg."<1.e-6) { if (acxd_.zenang<0) { thetaAntenne=Angle(-acxd_.zenang,Angle::Degree).ToRadian(); phiAntenne=Angle(270.,Angle::Degree).ToRadian(); } else { thetaAntenne=Angle(acxd_.zenang,Angle::Degree).ToRadian(); phiAntenne=Angle(90.,Angle::Degree).ToRadian(); } } mFit.SetParam(1,"ThetaAntenne",thetaAntenne,M_PI/1440,0.,thetaAntenne+M_PI/36.); mFit.SetParam(2,"PhiAntenne",phiAntenne,M_PI/180.,0.,2.*M_PI); // mFit.SetFix(1, thetaAntenne); // mFit.SetFix(2, phiAntenne); for(size_t j=0; j A= "<1) cout << "... Computing DataSignal & Expected Signal for fitted params and dish "< v_amp(NTRK); for(size_t j=0; j > signal = gxi2.getDataSignal(j); Vector asig = SOPHYA::abs(signal); double mins, maxs; asig.MinMax(mins, maxs); TVector< complex > expsignal = gxi2.getExpectedSignal(j, 0., A); Vector aexpsig = SOPHYA::abs(expsignal); double mine, maxe; aexpsig.MinMax(mine, maxe); A=maxs/maxe; v_amp[j]=A; } double fparm[500]; fparm[0]=0.; double bestxi2 = 9.e19; double bestphase=0.; int bestnpts,npts; int bestafact; double afact[12]={0.15,0.3,0.5,0.75,1.0,1.25,1.5,1.75,2.0,2.4,2.8,3.2}; for(int ia=0; ia<12; ia++) { for(size_t j=0; j1) cout << " 3."<1) mFit.PrintFit(); if(rcfit>0) { v_xi2red_cx[ii]=mFit.GetChi2Red(); // cout<< "-------------------------- Result for Cross No " << ii << endl; cout<< "------ Fit result for Cross No "<2.*M_PI) phase -= 2.*M_PI; cout <<"Phase= "<(0.,0.); v_err_Acx[ii][j]=err_A; ofr < > signal = cxsig.getDataSignal(j); sprintf(oname,"cx_%d_%d",(int)ii+1,(int)j+1); pox << PPFNameTag(oname)< > expsignal = cxsig.getExpectedSignal(j, v_phase[ii], v_Acx[ii][j]); sprintf(oname,"simcx_%d_%d",(int)ii+1,(int)j+1); pox << PPFNameTag(oname)< & v_data, vector & v_tks) : v_acxd(v_data), v_trks(v_tks), tot_ntrks(0), fit_done(false), simplex_done(false), xi2red(-9.e9), bestfitparam(NULL), err_bestfitparam(NULL) { if (v_acxd.size() != v_trks.size()) throw ParmError("CxBaselineFitter::CxBaselineFitter(v_data, v_tks) NOT same size v_data,v_tks "); if (v_acxd.size() < 1) throw ParmError("CxBaselineFitter::CxBaselineFitter(v_data, v_tks) v_data.size()<1 "); v_phases.resize(v_acxd[0].getNbAutoCor()-1); v_baselineshits.resize(v_acxd[0].getNbAutoCor()-1); tot_ntrks=0; for(size_t i=0; i > signal = cxsigb.getDataSignal(i,j,kcx); sprintf(oname,"cx_%d_%d_%d",(int)kcx+1,(int)j+1,(int)i+1); pox << PPFNameTag(oname)< > expsignal = cxsigb.getExpectedSignal(i,j,kcx,bestfitparam); sprintf(oname,"simcx_%d_%d_%d",(int)kcx+1,(int)j+1,(int)i+1); pox << PPFNameTag(oname)<