// Utilisation de SOPHYA pour faciliter les tests ... #include "sopnamsp.h" #include "machdefs.h" /* ---------------------------------------------------------- Projet BAORadio - (C) LAL/IRFU 2011 Programme de lecture des fichiers matrices de visibilites au format fits pour ecrire une DataTable de visib_moyenne(temps) Fichier de visibilites produits par le prog vismf R. Ansari, C. Magneville - LAL/Irfu V : Mai 2009 ---------------------------------------------------------- */ // 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 "fitsarrhand.h" #include "fitshdtable.h" // include sophya mesure ressource CPU/memoire ... #include "resusage.h" #include "ctimer.h" #include "timing.h" //--------------------------- Fonctions de ce fichier ------------------- int Usage(bool fgshort=true); int DecodeProc(int narg, char* arg[]); int ProcVisMtxFiles(string& inoutpath, int imin, int imax, int istep, int jf1, int jf2, int nfreq, vector tfrlist); int FillVisDTable(BaseDataTable& visdt_, TMatrix< r_4 > vismtx_, TVector< int_4> chanum_, sa_size_t jf1_, sa_size_t jf2_, sa_size_t djf_) ; //------------------------------------------------------------------------------------------------------------ /* --Fonction-- */ int Usage(bool fgshort) { cout << " --- visfits2dt : Read fits visibility matrices produced by visfmib to make \n" << " time-frequency matrices and Visibilites=f(time) datatable " << endl; cout << " Usage: visfits2dt InOutPath Imin,Imax,step NumFreq1,NumFreq2,NBinFreq VisMtxRowList [DT] \n" << endl; if (fgshort) { cout << " svv2mtx -h for detailed instructions" << endl; return 1; } cout << " InOutPath : Input/Output directory name \n" << " Imin,Imax,IStep: Input FITS files sequence number (vismtxII.fits) \n" << " FileNames=InOutPath/vismtxII.fits Imin<=II<=Imax II+=IStep \n" << " NumFreq1,NumFreq2,NBinFreq: Freq Zone and number of frequency bins for DataTable\n" << " VisMtxRowList : List of visibiliy matrix rows (0,2,...) -> time-freq map \n" << " DT : Fill datatable if DT arg specified " << endl; return 1; } //---------------------------------------------------- //---------------------------------------------------- int main(int narg, char* arg[]) { if ((narg>1)&&(strcmp(arg[1],"-h")==0)) return Usage(false); if (narg<5) return Usage(true); HiStatsInitiator _inia; // TArrayInitiator _inia; int rc = 0; try { bool fgvjun09=false; ResourceUsage resu; DecodeProc(narg-1, arg+1); resu.Update(); cout << resu; } catch (PException& exc) { cerr << " visfits2dt.cc catched PException " << exc.Msg() << endl; rc = 77; } catch (std::exception& sex) { cerr << "\n visfits2dt.cc std::exception :" << (string)typeid(sex).name() << "\n msg= " << sex.what() << endl; rc = 78; } catch (...) { cerr << " visfits2dt.cc catched unknown (...) exception " << endl; rc = 79; } cout << ">>>> visfits2dt.cc ------- END ----------- RC=" << rc << endl; return rc; } //-------------------------------------------------------------------- // Traitement fichiers produits par vismfib (V Nov09) /* --Fonction-- */ static bool fgfilldt=false; int DecodeProc(int narg, char* arg[]) { // Decodage des arguments et traitement string inoutpath = arg[0]; int imin=0; int imax=0; int istep=1; sscanf(arg[1],"%d,%d,%d",&imin,&imax,&istep); int jf1=0; int jf2=0; int nfreq=0; sscanf(arg[2],"%d,%d,%d",&jf1,&jf2,&nfreq); int card=1; vector rowlist; EnumeratedSequence es; int nbad; es.Append(arg[3], nbad, ","); for(int j=0; j4)&&(strcmp(arg[4],"DT")==0)) fgfilldt=true; // if (rowlist.size()<1) rowlist.push_back(0); cout << " ----- visfits2dt/DecodeProc - Start - InOutPath= " << inoutpath << " IMin,Max,Step=" << imin << "," << imax << "," << istep << " Card=" << card << endl; cout << "Frequency num range JF=" << jf1 << "," << jf2 << "," << nfreq << " ------- " << endl; cout << " RowList: " ; for(int j=0; j rowlist) { Timer tm("ProcVisMtxFiles"); DataTable visdt; visdt.AddDoubleColumn("mfc"); visdt.AddDoubleColumn("mtt"); visdt.AddIntegerColumn("jfreq"); visdt.AddIntegerColumn("numch"); visdt.AddFloatColumn("vre"); visdt.AddFloatColumn("vim"); vector< TMatrix< r_4 > > vmtf; vector< TMatrix< r_4 > > vmtfa; if (jf1<1) jf1=1; if ((jf2<1)||(jf2 chanum; { sprintf(fname, "%s/chanum.fits",inoutpath.c_str()); FitsInOutFile fic(fname, FitsInOutFile::Fits_RO); fic.MoveAbsToHDU(3); fic >> chanum; } cout << " ---- ProcVisMtxFiles()-Read chanum done " << endl; sa_size_t nrows = (imax-imin+1)/istep; sa_size_t ktime=0; // sa_size_t mtf_binfreq=25; sa_size_t mtf_bintime=1; sa_size_t ncols=1; for(int ifile=imin; ifile<=imax; ifile+=istep) { sprintf(fname, "%s/vismtx%d.fits",inoutpath.c_str(),ifile); cout << " ProcVisMtxFiles[" << ifile << "] opening file " << fname << endl; FitsInOutFile fin(fname, FitsInOutFile::Fits_RO); TMatrix< r_4 > vismtx; fin >> vismtx; // cout << vismtx.Info(); if ((ifile==imin)&&(rowlist.size()>0)) { ncols = vismtx.NCols(); cout << " ProcVisMtxFiles/Info: Output Time-Frequency matrices NRows(time) " << nrows/mtf_bintime+1 << " NCols=2*NFreq) =" << nfreq << endl; for(size_t j=0; j(nrows/mtf_bintime+1, nfreq*2)); vmtfa.push_back(TMatrix< r_4 >(nrows/mtf_bintime+1, nfreq)); } } if (rowlist.size()>0) { for(size_t j=0; j=nfreq) break; vmtf[j](ktime/mtf_bintime,jfreb*2)+=vismtx(rowlist[j],jf*2); // partie reelle vmtf[j](ktime/mtf_bintime,jfreb*2+1)+=vismtx(rowlist[j],jf*2+1); // partie imaginaire vmtfa[j](ktime/mtf_bintime,jfreb)+=vismtx(rowlist[j],jf*2)*vismtx(rowlist[j],jf*2); // module carre - z.real^2 vmtfa[j](ktime/mtf_bintime,jfreb)+=vismtx(rowlist[j],jf*2+1)*vismtx(rowlist[j],jf*2+1); // module carre z.imag^2 } } } // cout << " DBG* kr=" << kr << " kr/mtf_bintime=" << kr/mtf_bintime // << " ncols/2/mtf_binfreq=" << ncols/2/mtf_binfreq << endl; ktime++; // Calcul moyenne dans des bandes en frequence if (fgfilldt) FillVisDTable(visdt, vismtx, chanum, jf1, jf2, djf); } if (rowlist.size()>0) { sprintf(fname, "!%s/vistfreqmtx.fits",inoutpath.c_str()); cout << "ProcVisMtxFiles: Opening file " << fname << " for writing Visi(Freq,Time) matrices" << endl; FitsInOutFile fo(fname, FitsInOutFile::Fits_Create); for(size_t j=0; j vismtx_, TVector< int_4> chanum_, sa_size_t jf1_, sa_size_t jf2_, sa_size_t djf_) { double xnt_[20]; xnt_[0]=(double)vismtx_.Info()["MEANFC"]; xnt_[1]=(double)vismtx_.Info()["MEANTT"]/1.25e8; uint_4 nmean_=vismtx_.Info()["NPAQSUM"]; if (djf_<2) { for(sa_size_t rv=0; rv vismtx_.NCols()) jjfmx=vismtx_.NCols(); for(sa_size_t jjf=jf; jjf