// Utilisation de SOPHYA pour faciliter les tests ... #include "sopnamsp.h" #include "machdefs.h" /* ---------------------------------------------------------- Projet BAORadio/PAON4 - (C) LAL/IRFU 2017 visiavg: programme de lecture des fichiers matrices de visibilites de PAON4, calcul de visibilities moyennes en bin de temps et de frequence O. Perdereau, R.Ansari - LAL ---------------------------------------------------------- */ // include standard c/c++ #include #include #include #include #include #include #include "pexceptions.h" #include "tvector.h" #include "fioarr.h" // #include "tarrinit.h" #include "ntuple.h" #include "datatable.h" #include "histinit.h" #include "matharr.h" #include "timestamp.h" #include // include sophya mesure ressource CPU/memoire ... #include "resusage.h" #include "ctimer.h" #include "timing.h" // include lecteur de fichiers visibilites #include "visp4winreader.h" #include "fitsioserver.h" #include "fiosinit.h" int Usage(void); int Usage(void) { cout << " --- visiavg.cc : Read PPF files produced by mfacq time-frequency\n" << endl; cout << " Usage: visiavg [-arguments] \n" << endl; P4AnaParams::UsageOptions(); cout<< endl; return 1; } //---------------------------------------------------- int main(int narg, const char* arg[]) { // --- Decoding parameters if( (narg<2) || ((narg>1)&&(strcmp(arg[1],"-h")==0) ) ) return Usage(); FitsIOServerInit(); P4AnaParams params; params.DecodeArgs(narg, arg); string outfile = params.outfile_; if (outfile.length()<1) outfile = "visavg.ppf"; string fitsoutfile = params.fitsoutfile_; if (fitsoutfile.length()>=1) { fitsoutfile = "!"+fitsoutfile ; // adds '!' ? } int deltaIavg = params.TFMtimebin_; sa_size_t TFMfbin = params.TFMfreqbin_; int prtlev = params.prtlev_; bool FgTFMAC = true; bool FgTFMCX = true; string desctfmap; bool FgTFM = params.fgTFM_; // true -> create time-frequency maps params.Print(cout); cout <<"visiavg/Info: Path BAO5:"< KVAC = visiencod.getAllAutoCor(); vector KVCXHH = visiencod.getAllHCrossCor(); vector KVCXVV = visiencod.getAllVCrossCor(); vector KVCXHV = visiencod.getAllHVCrossCor(); cout << " List of AutoCorrelation rows:"<"<"< TotalNbWindows="< ext_names; // un vecteur avec les temps TVector< double > timevec(wreader.getTotalNbWindows()/deltaIavg); TVector< double > ravec(wreader.getTotalNbWindows()/deltaIavg); TMatrix< complex > vismtx; TMatrix< complex > acsum; TMatrix< r_4 > acsum_sq; // wil sum only the real part ^2 TMatrix< complex > cxsum; // for sums of real and imag parts TMatrix< r_4 > cxsum_sq_rp; TMatrix< r_4 > cxsum_sq_ip; // for VV if needed TMatrix< complex > cxsum_vv; // for sums of real and imag parts TMatrix< r_4 > cxsum_vv_sq_rp; TMatrix< r_4 > cxsum_vv_sq_ip; // for HV if needed TMatrix< complex > cxsum_hv; // for sums of real and imag parts TMatrix< r_4 > cxsum_hv_sq_rp; TMatrix< r_4 > cxsum_hv_sq_ip; TimeStamp dateobs, cfdate,datestart; TimeStamp dateorg(2015,1,1,12,0,0.); // Date origine 1 jan 2015 double mttag; int cnt=0, cntnt=0, pcntnt=0; int I=0; // for //----- 6 H-H cross-cor TimeFrequency maps vector< TArray< complex > > vtfm; //----- 6 H-H cross-cor TimeFrequency maps for the variances of real and imag parts vector< TArray< r_4 > > vtfm_rp_sq; vector< TArray< r_4 > > vtfm_ip_sq; //----- 6 V-V cross-cor TimeFrequency maps vector< TArray< complex > > vtfm_vv; //----- 6 V-V cross-cor TimeFrequency maps for the variances of real and imag parts vector< TArray< r_4 > > vtfm_vv_rp_sq; vector< TArray< r_4 > > vtfm_vv_ip_sq; //----- 16 H-V cross-cor TimeFrequency maps vector< TArray< complex > > vtfm_hv; //----- 16 H-V cross-cor TimeFrequency maps for the variances of real and imag parts vector< TArray< r_4 > > vtfm_hv_rp_sq; vector< TArray< r_4 > > vtfm_hv_ip_sq; //----- 8 auto-corr TimeFrequency maps vector< TArray< r_4 > > vtfmac; //----- 8 auto-corr TimeFrequency variance maps vector< TArray< r_4 > > vtfmac_sq; //---- for the time-freqency map filling sa_size_t TFMtmidx=0; sa_size_t tfmSX, tfmSY; while (fgok) { //reads next visibility matrix window fgok = wreader.Shift(); if (!fgok) break; vismtx = wreader.getAverageVisMtx(cfdate); if (cnt==0) { //resizing matrices for sum of auto-correlations and sum of 6 cross-correlations acsum.SetSize(8, vismtx.NCols()); if (params.doSigma_) // for computing Sigma, if required acsum_sq.SetSize(8, vismtx.NCols()); cxsum.SetSize(6, vismtx.NCols()); if (params.doSigma_) { // for computing Sigma, if required cxsum_sq_rp.SetSize(6, vismtx.NCols()); cxsum_sq_ip.SetSize(6, vismtx.NCols()); } // VV if needed if (params.doVV_){ cxsum_vv.SetSize(6, vismtx.NCols()); if (params.doSigma_) { // for computing Sigma, if required cxsum_vv_sq_rp.SetSize(6, vismtx.NCols()); cxsum_vv_sq_ip.SetSize(6, vismtx.NCols()); } } // HV if needed if (params.doHV_){ cxsum_hv.SetSize(16, vismtx.NCols()); if (params.doSigma_) { // for computing Sigma, if required cxsum_hv_sq_rp.SetSize(16, vismtx.NCols()); cxsum_hv_sq_ip.SetSize(16, vismtx.NCols()); } } tfmSX=wreader.getTotalNbWindows()/deltaIavg; tfmSY=vismtx.NCols()/TFMfbin; //allocating 8 Auto-Corr time-frequency maps cout<<"visiavg/Info: allocating 8 AutoCor Time-Frequency maps : Time->NX="<NY="<(tfmSX, tfmSY) ); if (params.doSigma_) { // for computing Sigma, if required cout <<" and 8 for the the variance maps "<(tfmSX, tfmSY) ); } //allocating 6 Cross-Corr H-H time-frequency maps cout<<"visiavg/Info: allocating H-H cross-cor Time-Frequency maps : Time->NX="<NY="< >(tfmSX, tfmSY) ); if (params.doSigma_) { // for computing Sigma, if required cout << "and the 2x6 for squares of real & imaginary parts " << endl; for(int k=0; k<6; k++) vtfm_rp_sq.push_back( TArray< r_4 >(tfmSX, tfmSY) ); for(int k=0; k<6; k++) vtfm_ip_sq.push_back( TArray< r_4 >(tfmSX, tfmSY) ); } // VV if needed if (params.doVV_){ //allocating 6 Cross-Corr V-V time-frequency maps cout<<"visiavg/Info: allocating V-V cross-cor Time-Frequency maps : Time->NX="<NY="< >(tfmSX, tfmSY) ); if (params.doSigma_) { // for computing Sigma, if required cout << "and the 2x6 for squares of real & imaginary parts " << endl; for(int k=0; k<6; k++) vtfm_vv_rp_sq.push_back( TArray< r_4 >(tfmSX, tfmSY) ); for(int k=0; k<6; k++) vtfm_vv_ip_sq.push_back( TArray< r_4 >(tfmSX, tfmSY) ); } } // HV if needed if (params.doHV_){ //allocating 16 Cross-Corr H-V time-frequency maps cout<<"visiavg/Info: allocating 16 H-V cross-cor Time-Frequency maps : Time->NX="<NY="< >(tfmSX, tfmSY) ); if (params.doSigma_) { // for computing Sigma, if required cout << "and the 2x16 for squares of real & imaginary parts " << endl; for(int k=0; k<16; k++) vtfm_hv_rp_sq.push_back( TArray< r_4 >(tfmSX, tfmSY) ); for(int k=0; k<16; k++) vtfm_hv_ip_sq.push_back( TArray< r_4 >(tfmSX, tfmSY) ); } } // recupere le jour de depart @ 0h datestart = TimeStamp(cfdate.DaysPart(),0.); } // end if cnt==0 if (I==0) { // start filling a new time bin dateobs=cfdate; if (prtlev>0) cout<<"visiavg/Info: dateobs="<= (tfmSX="<=1){ cout << " fitsoutfile :" < & tfmap = vtfmac[k]; tfmap *= (r_4)(1./((double)deltaIavg*(double)TFMfbin)); potfm << PPFNameTag(tfm_names[k]) << tfmap; if (fos != NULL) { ext_names.push_back(tfm_names[k]); (*fos)<< tfmap; } if (params.doSigma_) { // for saving TFM-Sigma, if required TArray< r_4 > & tfmapsq = vtfmac_sq[k]; tfmapsq *= (r_4)(1./((double)deltaIavg*(double)TFMfbin)); tfmapsq = tfmapsq - tfmap.MulElt(tfmap,tfmap) ; // tfmap ->tfmap*tfmap !! potfm << PPFNameTag(tfmsq_names[k]) << tfmapsq; if (fos != NULL) { ext_names.push_back(tfmsq_names[k]); (*fos)<< tfmapsq; } } // end of saving TFM-of-sigma } // --- renormalizing and saving H-H Cross-Corr time-frequency maps cout<<" visiavg/Info: Saving 6 H-H cross-corr time-frequency maps to PPF file "< > & tfmap = vtfm[k]; TArray< r_4 > & tfmap_sqpr = vtfm_rp_sq[k]; TArray< r_4 > & tfmap_sqpi = vtfm_ip_sq[k]; tfmap *= complex((r_4)(1./((double)deltaIavg*(double)TFMfbin)), 0.); potfm << PPFNameTag(tfmCC_names[k]) << tfmap; if (fos != NULL) { ext_names.push_back(string(tfmCC_names[k])+"_real"); (*fos)<< real(tfmap); ext_names.push_back(string(tfmCC_names[k])+"_imag"); (*fos)<< imag(tfmap); } if (params.doSigma_) { // for saving TFM-Sigma, if required TArray< r_4 > tfmapr = real(tfmap); TArray< r_4 > tfmapi = imag(tfmap); tfmap_sqpr *= ((r_4)(1./((double)deltaIavg*(double)TFMfbin))); tfmap_sqpi *= ((r_4)(1./((double)deltaIavg*(double)TFMfbin))); tfmapr = tfmapr.MulElt(tfmapr,tfmapr) ; tfmap_sqpr -= tfmapr ; tfmapi = tfmapi.MulElt(tfmapi,tfmapi) ; tfmap_sqpi -= tfmapi; potfm << PPFNameTag(vrtfmCC_names[k]) << tfmap_sqpr; potfm << PPFNameTag(vitfmCC_names[k]) << tfmap_sqpi; if (fos != NULL) { ext_names.push_back(vrtfmCC_names[k]); (*fos)<< tfmap_sqpr; ext_names.push_back(vitfmCC_names[k]); (*fos)<< tfmap_sqpi; } } // end of saving TFM-of-sigma } // ========================== end saving HH XCorr //=========================== if (params.doVV_){ // Option VV // --- renormalizing and saving V-V Cross-Corr time-frequency maps cout<<" visiavg/Info: Saving 6 V-V cross-corr time-frequency maps to PPF file "< > & tfmap = vtfm_vv[k]; TArray< r_4 > & tfmap_sqpr = vtfm_vv_rp_sq[k]; TArray< r_4 > & tfmap_sqpi = vtfm_vv_ip_sq[k]; tfmap *= complex((r_4)(1./((double)deltaIavg*(double)TFMfbin)), 0.); potfm << PPFNameTag(tfmVV_names[k]) << tfmap; if (fos != NULL) { ext_names.push_back(string(tfmVV_names[k])+"_real"); (*fos)<< real(tfmap); ext_names.push_back(string(tfmVV_names[k])+"_imag"); (*fos)<< imag(tfmap); } if (params.doSigma_) { // for saving TFM-Sigma, if required TArray< r_4 > tfmapr = real(tfmap); TArray< r_4 > tfmapi = imag(tfmap); tfmap_sqpr *= ((r_4)(1./((double)deltaIavg*(double)TFMfbin))); tfmap_sqpi *= ((r_4)(1./((double)deltaIavg*(double)TFMfbin))); tfmapr = tfmapr.MulElt(tfmapr,tfmapr) ; tfmap_sqpr -= tfmapr ; tfmapi = tfmapi.MulElt(tfmapi,tfmapi) ; tfmap_sqpi -= tfmapi; potfm << PPFNameTag(vrtfmVV_names[k]) << tfmap_sqpr; potfm << PPFNameTag(vitfmVV_names[k]) << tfmap_sqpi; if (fos != NULL) { ext_names.push_back(vrtfmVV_names[k]); (*fos)<< tfmap_sqpr; ext_names.push_back(vitfmVV_names[k]); (*fos)<< tfmap_sqpi; } } // end of saving TFM-of-sigma } } // end option VV //=========================== if (params.doHV_){ // Option HV // --- renormalizing and saving H-V Cross-Corr time-frequency maps cout<<" visiavg/Info: Saving 16 H-V cross-corr time-frequency maps to PPF file "< > & tfmap = vtfm_hv[k]; TArray< r_4 > & tfmap_sqpr = vtfm_hv_rp_sq[k]; TArray< r_4 > & tfmap_sqpi = vtfm_hv_ip_sq[k]; tfmap *= complex((r_4)(1./((double)deltaIavg*(double)TFMfbin)), 0.); potfm << PPFNameTag(tfmHV_names[k]) << tfmap; if (fos != NULL) { ext_names.push_back(string(tfmHV_names[k])+"_real"); (*fos)<< real(tfmap); ext_names.push_back(string(tfmHV_names[k])+"_imag"); (*fos)<< imag(tfmap); } if (params.doSigma_) { // for saving TFM-Sigma, if required TArray< r_4 > tfmapr = real(tfmap); TArray< r_4 > tfmapi = imag(tfmap); tfmap_sqpr *= ((r_4)(1./((double)deltaIavg*(double)TFMfbin))); tfmap_sqpi *= ((r_4)(1./((double)deltaIavg*(double)TFMfbin))); tfmapr = tfmapr.MulElt(tfmapr,tfmapr) ; tfmap_sqpr -= tfmapr ; tfmapi = tfmapi.MulElt(tfmapi,tfmapi) ; tfmap_sqpi -= tfmapi; potfm << PPFNameTag(vrtfmHV_names[k]) << tfmap_sqpr; potfm << PPFNameTag(vitfmHV_names[k]) << tfmap_sqpi; if (fos != NULL) { ext_names.push_back(vrtfmHV_names[k]); (*fos)<< tfmap_sqpr; ext_names.push_back(vitfmHV_names[k]); (*fos)<< tfmap_sqpi; } } // end of saving TFM-of-sigma } } // end option HV P4FreqBand myp4fre; TVector lim_freq(2); if (params.gain_gnu_file_.length()>0) { P4gnuGain p4gnu( params.gain_gnu_file_ ); lim_freq(0) = p4gnu. minGoodF(); lim_freq(1) = p4gnu. maxGoodF(); }else{ lim_freq(0) = myp4fre.freqstart_; lim_freq(1) = myp4fre.freqend_; } cout << " frequences limites "<< lim_freq(0) <<" ; "<< lim_freq(1)< avg_freqs( myp4fre.getP4NbFreqChannels()/TFMfbin); double frbase = myp4fre.freqstart_ + myp4fre.getP4FreqResolution()/2. ; for (int kf=0 ; kf< myp4fre.getP4NbFreqChannels()/TFMfbin ; kf++,frbase += myp4fre.getP4FreqResolution()*TFMfbin ) avg_freqs(kf) = frbase ; potfm << PPFNameTag("FreqVec") << avg_freqs; if (fos != NULL) { ext_names.push_back("FreqsLims"); (*fos)<< lim_freq ; ext_names.push_back("Frequences"); (*fos)<< avg_freqs ; ext_names.push_back("RAs"); (*fos)<< ravec; ext_names.push_back("Times"); (*fos)<< timevec; cout << " number of objs in fits "<< ext_names.size() << endl; cout << ext_names << endl; delete(fos); } cout << " return code "<>>> visiavg.cc ------- END ----------- RC=" << rc << endl; return rc; }