| 1 | // lecture des fichiers acq de Pittsburgh Dec 2010
 | 
|---|
| 2 | // et ecriture des matrices de visi temps-frequence
 | 
|---|
| 3 | // > make OBJ=$CMVPROG/obj/ EXE=$CMVPROG/exe/ chanum_1210 svv2mtx2_1210
 | 
|---|
| 4 | 
 | 
|---|
| 5 | #include "sopnamsp.h"
 | 
|---|
| 6 | #include "machdefs.h"
 | 
|---|
| 7 | #include <math.h>
 | 
|---|
| 8 | #include <stdio.h>
 | 
|---|
| 9 | #include <stdlib.h>
 | 
|---|
| 10 | #include <string.h>
 | 
|---|
| 11 | #include <unistd.h>
 | 
|---|
| 12 | #include <sys/stat.h>
 | 
|---|
| 13 | #include <fstream>
 | 
|---|
| 14 | #include <iostream>
 | 
|---|
| 15 | #include <string>
 | 
|---|
| 16 | 
 | 
|---|
| 17 | #include "pexceptions.h"
 | 
|---|
| 18 | #include "tvector.h"
 | 
|---|
| 19 | #include "fioarr.h"
 | 
|---|
| 20 | #include "timing.h"
 | 
|---|
| 21 | 
 | 
|---|
| 22 | /*
 | 
|---|
| 23 | export TACQEXE=~/Reza/TAcq/Objs
 | 
|---|
| 24 | ./CasA03Dec.csh > CasA03Dec.log 2>&1
 | 
|---|
| 25 | */
 | 
|---|
| 26 | 
 | 
|---|
| 27 | //--------------------------- Fonctions de ce fichier   ------------------- 
 | 
|---|
| 28 | void usage(void);
 | 
|---|
| 29 | void usage(void)
 | 
|---|
| 30 | {
 | 
|---|
| 31 | cout<<"svv2mtx2_1012 [options] dir : lecture des fichiers acq de Pittsburgh Dec 2010"<<endl
 | 
|---|
| 32 |     <<" dir : repertoire ou se trouvent les fichiers d'acq"<<endl
 | 
|---|
| 33 |     <<" -D : visi is a duplicated one"<<endl
 | 
|---|
| 34 |     <<" -o visi.ppf : nom du ficher ppf pour ecrire la visi temps-frequence"<<endl
 | 
|---|
| 35 |     <<" -v v1,v2 : numero de voie acq pour cette visi [1-32]"<<endl
 | 
|---|
| 36 |     <<"            on calcule <v1.conj(v2)>"<<endl
 | 
|---|
| 37 |     <<" -C : compute and store the complexe conjugated visi"<<endl
 | 
|---|
| 38 |     <<"      dans ce cas on calcule <v2.conj(v1)>, le but est d'avoir toujours <E.conj(W)>"<<endl
 | 
|---|
| 39 |     <<" -t thr : numero de la thread ayant traite cette visi [0-N]"<<endl
 | 
|---|
| 40 |     <<" -r row : numero de la ligne de la matrice acq pour cette visi [0-Nrow["<<endl
 | 
|---|
| 41 |     <<" -f freq0 : 1ere frequence en MHz"<<endl
 | 
|---|
| 42 |     <<" -T it1,it2 : numero (temps) des fichiers a traiter [it1,it2]"<<endl
 | 
|---|
| 43 |     <<"ATTENTION: lancer ce prog depuis le repertoire ou doivent etre ecrits les fichiers de visi"<<endl;
 | 
|---|
| 44 | }
 | 
|---|
| 45 | 
 | 
|---|
| 46 | //----------------------------------------------------
 | 
|---|
| 47 | int main(int narg, char* arg[])
 | 
|---|
| 48 | {
 | 
|---|
| 49 |   // --- Decodage des arguments et traitement 
 | 
|---|
| 50 |   int nmiss_stop = 1000;  // on s'arrete si on a "nmiss_stop" fichiers consecutifs manquants
 | 
|---|
| 51 |   string outname = "";
 | 
|---|
| 52 |   int numthread = -1, numrow = -1;
 | 
|---|
| 53 |   bool dupli = false, doconj = false;
 | 
|---|
| 54 |   double freq0 = 0.;
 | 
|---|
| 55 |   int vacq1=-1, vacq2=-1;
 | 
|---|
| 56 |   int ifilmin=0, ifilmax=99999;
 | 
|---|
| 57 | 
 | 
|---|
| 58 |   char c;
 | 
|---|
| 59 |   while((c = getopt(narg,arg,"hDCo:t:r:f:T:v:")) != -1) {
 | 
|---|
| 60 |     switch (c) {
 | 
|---|
| 61 |     case 'v' :
 | 
|---|
| 62 |       sscanf(optarg,"%d,%d",&vacq1,&vacq2);
 | 
|---|
| 63 |       break;
 | 
|---|
| 64 |     case 'D' :
 | 
|---|
| 65 |       dupli = true;
 | 
|---|
| 66 |       break;
 | 
|---|
| 67 |     case 'C' :
 | 
|---|
| 68 |       doconj = true;
 | 
|---|
| 69 |       break;
 | 
|---|
| 70 |     case 'o' :
 | 
|---|
| 71 |       outname = optarg;
 | 
|---|
| 72 |       break;
 | 
|---|
| 73 |     case 't' :
 | 
|---|
| 74 |       numthread = atoi(optarg);
 | 
|---|
| 75 |       break;
 | 
|---|
| 76 |     case 'r' :
 | 
|---|
| 77 |       numrow = atoi(optarg);
 | 
|---|
| 78 |       break;
 | 
|---|
| 79 |     case 'f' :
 | 
|---|
| 80 |       freq0 = atof(optarg);
 | 
|---|
| 81 |       break;
 | 
|---|
| 82 |     case 'T' :
 | 
|---|
| 83 |       sscanf(optarg,"%d,%d",&ifilmin,&ifilmax);
 | 
|---|
| 84 |       if(ifilmin<0) ifilmin=0;
 | 
|---|
| 85 |       break;
 | 
|---|
| 86 |     case 'h' :
 | 
|---|
| 87 |     default :
 | 
|---|
| 88 |       usage(); return -1;
 | 
|---|
| 89 |     }
 | 
|---|
| 90 |   }
 | 
|---|
| 91 |   if(optind>=narg) {usage(); return -1;}
 | 
|---|
| 92 |   string indir = arg[optind];
 | 
|---|
| 93 | 
 | 
|---|
| 94 |   cout<<"v1="<<vacq1<<" v2="<<vacq2<<" doconj="<<(int)doconj<<endl;
 | 
|---|
| 95 |   cout<<"thread="<<numthread<<endl; if(numthread<0) return -2;
 | 
|---|
| 96 |   cout<<"numrow="<<numrow<<endl;  if(numrow<0) return -2;
 | 
|---|
| 97 |   cout<<"dupli="<<(int)dupli<<endl;
 | 
|---|
| 98 |   cout<<"outname="<<outname<<endl; if(outname.size()<=0) return -2;
 | 
|---|
| 99 |   cout<<"indir="<<indir<<endl;
 | 
|---|
| 100 |   cout<<"freq0="<<freq0<<" MHz"<<endl;
 | 
|---|
| 101 |   cout<<"request: file "<<ifilmin<<" to "<<ifilmax<<endl; if(ifilmax<ifilmin) return -3;
 | 
|---|
| 102 | 
 | 
|---|
| 103 |   InitTim();
 | 
|---|
| 104 | 
 | 
|---|
| 105 |   // --- recherche et comptage des fichiers de visibilites
 | 
|---|
| 106 |   // ATTENTION: il peut manquer des fichiers au debut ou dans la sequence
 | 
|---|
| 107 |   string flistname = outname; flistname += ".filelist";
 | 
|---|
| 108 |   int nfile = 0;
 | 
|---|
| 109 |   {
 | 
|---|
| 110 |   ofstream flistw(flistname.c_str(), ofstream::out);
 | 
|---|
| 111 |   cout<<"writing in file list in: "<<flistname<<" (is_open="<<flistw.is_open()<<")"<<endl;
 | 
|---|
| 112 |   if(!flistw) {cout<<"!!!!OPEN failed "<<flistname<<endl; return -4;}
 | 
|---|
| 113 | 
 | 
|---|
| 114 |   char str[4096];
 | 
|---|
| 115 |   struct stat buffer;
 | 
|---|
| 116 |   int ifmin2 = ifilmin, ifmax2 = ifilmax; ifilmax = -1;
 | 
|---|
| 117 |   bool foundfirst = false;
 | 
|---|
| 118 |   int nmiss = 0;
 | 
|---|
| 119 |   for(int ifile=ifmin2; ifile<=ifmax2; ifile++) {
 | 
|---|
| 120 |     sprintf(str, "%s/vismtx_%d_%d.ppf",indir.c_str(),numthread,ifile);
 | 
|---|
| 121 |     int status = stat(str,&buffer);
 | 
|---|
| 122 |     if(!foundfirst && status==0) {
 | 
|---|
| 123 |       cout<<"first file found: "<<str<<endl;
 | 
|---|
| 124 |       foundfirst = true;
 | 
|---|
| 125 |       if(ifile>ifilmin) ifilmin = ifile;
 | 
|---|
| 126 |     }
 | 
|---|
| 127 |     if(!foundfirst) continue;
 | 
|---|
| 128 |     if(ifile<ifilmin) continue;
 | 
|---|
| 129 |     if(foundfirst && status!=0) {
 | 
|---|
| 130 |       // On fait ca car "stst()" est extremement long si le fichier n'existe pas!
 | 
|---|
| 131 |       if(nmiss>nmiss_stop) break;
 | 
|---|
| 132 |       nmiss++;
 | 
|---|
| 133 |       continue;
 | 
|---|
| 134 |     }
 | 
|---|
| 135 |     nfile++;
 | 
|---|
| 136 |     ifilmax = ifile;
 | 
|---|
| 137 |     nmiss = 0;
 | 
|---|
| 138 |     flistw << string(str) <<endl;
 | 
|---|
| 139 |   }
 | 
|---|
| 140 |   
 | 
|---|
| 141 |   flistw.close();
 | 
|---|
| 142 |   cout<<"Found "<<nfile<<" files from "<<ifilmin<<" to "<<ifilmax<<endl;
 | 
|---|
| 143 |   if(nfile==0 || ifilmax<ifilmin) return -5;
 | 
|---|
| 144 |   }
 | 
|---|
| 145 | 
 | 
|---|
| 146 |   PrtTim("--- End of file number search");
 | 
|---|
| 147 | 
 | 
|---|
| 148 |   //--------------------------------------------------------------------
 | 
|---|
| 149 |   int rc = 0;
 | 
|---|
| 150 |   try {
 | 
|---|
| 151 | 
 | 
|---|
| 152 |   ifstream flistr(flistname.c_str(), ofstream::in);
 | 
|---|
| 153 |   if(!flistr) {cout<<"!!!!OPEN failed "<<flistname<<endl; return -6;}
 | 
|---|
| 154 | 
 | 
|---|
| 155 |   // --- read visibility files
 | 
|---|
| 156 |   TMatrix< complex<r_4> > MVisi;
 | 
|---|
| 157 |   TVector<r_8> MeanTT(nfile);
 | 
|---|
| 158 |   TVector<int_4> Npaqsum(nfile);
 | 
|---|
| 159 |   TVector<r_4> Freq;
 | 
|---|
| 160 |   string tudeb, tufin;
 | 
|---|
| 161 |   double tudeb_day, tufin_day;
 | 
|---|
| 162 |   int nfreq = 0;
 | 
|---|
| 163 |   int lpmod = nfile/25; if(lpmod<=0) lpmod=1;
 | 
|---|
| 164 | 
 | 
|---|
| 165 |   int_4 ntimefill = 0, ntimebad = 0;
 | 
|---|
| 166 |   bool foundfirst = true;
 | 
|---|
| 167 |   while(!flistr.eof()) {
 | 
|---|
| 168 |     // --- Lecture d'une visi elementaire (fichier acq)
 | 
|---|
| 169 |     string fname;
 | 
|---|
| 170 |     getline(flistr,fname);
 | 
|---|
| 171 |     if(fname.size()==0) continue;
 | 
|---|
| 172 |     if(ntimefill%lpmod==0) cout<<ntimefill<<" "<<" : "<<fname<<endl;
 | 
|---|
| 173 |     TMatrix< complex<r_4> > vismtx;
 | 
|---|
| 174 |     try {
 | 
|---|
| 175 |       PInPersist pin(fname);
 | 
|---|
| 176 |       pin >> vismtx;
 | 
|---|
| 177 |     } catch(...) {
 | 
|---|
| 178 |       cout<<"ERROR: bad file "<<fname<<endl;
 | 
|---|
| 179 |       ntimebad++;
 | 
|---|
| 180 |       continue;
 | 
|---|
| 181 |     }
 | 
|---|
| 182 |     tufin = (string)vismtx.Info()["DATEOBS"];
 | 
|---|
| 183 | 
 | 
|---|
| 184 |     // --- Time keeping and number of summed elementary visibilities
 | 
|---|
| 185 |     MeanTT(ntimefill) = (double)vismtx.Info()["MeanTT"]/125.e6;
 | 
|---|
| 186 |     uint_4 npaqsum = vismtx.Info()["NPAQSUM"];
 | 
|---|
| 187 |     Npaqsum(ntimefill) = npaqsum;
 | 
|---|
| 188 | 
 | 
|---|
| 189 |     // --- Initialisation purposes for the first read file
 | 
|---|
| 190 |     if(foundfirst) {
 | 
|---|
| 191 |       foundfirst = false;
 | 
|---|
| 192 |       tudeb = tufin;
 | 
|---|
| 193 |       printf("Reference Time: tt = %.5f sec, TU = %s\n",MeanTT(0),tudeb.c_str());
 | 
|---|
| 194 |       if(numrow>=vismtx.NRows()) {
 | 
|---|
| 195 |         cout<<"ERROR: requested numrow="<<numrow<<" => "<<vismtx.NRows()<<endl;
 | 
|---|
| 196 |         return -5;
 | 
|---|
| 197 |       }
 | 
|---|
| 198 |       // Frequency
 | 
|---|
| 199 |       nfreq = vismtx.NCols();
 | 
|---|
| 200 |       cout<<"vismtx: number of frequencies = "<<nfreq<<endl;
 | 
|---|
| 201 |       Freq.ReSize(nfreq); for(int i=0;i<nfreq;i++) Freq(i) = i;
 | 
|---|
| 202 |       // allocate visib matrice <f> vs t
 | 
|---|
| 203 |       cout<<"allocating visibility matrice ("<<nfile<<","<<nfreq<<") "
 | 
|---|
| 204 |           <<nfile*nfreq*sizeof(complex<r_4>)/1.e6<<" Mo"<<endl;
 | 
|---|
| 205 |       MVisi.ReSize(nfile,nfreq);
 | 
|---|
| 206 |       MVisi = complex<r_4>(0.,0.);
 | 
|---|
| 207 |     }
 | 
|---|
| 208 | 
 | 
|---|
| 209 |     // Fill time-freq visibility matrix
 | 
|---|
| 210 |     for(int c=0;c<nfreq;c++) {
 | 
|---|
| 211 |       MVisi(ntimefill,c) = vismtx(numrow,c) / complex<r_4>(npaqsum);
 | 
|---|
| 212 |       if(doconj) MVisi(ntimefill,c) = conj(MVisi(ntimefill,c));
 | 
|---|
| 213 |     }
 | 
|---|
| 214 |     ntimefill++;
 | 
|---|
| 215 | 
 | 
|---|
| 216 |   }  // fin boucle sur le fichiers d'acq
 | 
|---|
| 217 |   cout<<"ntimefill = "<<ntimefill<<" / "<<nfile<<" , ntimebad="<<ntimebad<<" bad files"<<endl;
 | 
|---|
| 218 |   flistr.close();
 | 
|---|
| 219 |   string order = "rm -f "; order += flistname;
 | 
|---|
| 220 |   system(order.c_str());
 | 
|---|
| 221 | 
 | 
|---|
| 222 |   // --- keeping info with visi
 | 
|---|
| 223 |   {
 | 
|---|
| 224 |   // bricolo en unite de jours depuis le 0/12/2010 a 0h
 | 
|---|
| 225 |   int y,m,d,h,mn; double s;
 | 
|---|
| 226 |   sscanf(tudeb.c_str(),"%d-%d-%dT%d:%d:%lf",&y,&m,&d,&h,&mn,&s);
 | 
|---|
| 227 |   tudeb_day = (double)d + ((double)h + mn/60. + s/3600.)/24.;
 | 
|---|
| 228 |   sscanf(tufin.c_str(),"%d-%d-%dT%d:%d:%lf",&y,&m,&d,&h,&mn,&s);
 | 
|---|
| 229 |   tufin_day = (double)d + ((double)h + mn/60. + s/3600.)/24.;
 | 
|---|
| 230 |   }
 | 
|---|
| 231 |   DVList dvl;
 | 
|---|
| 232 |   dvl["vacq1"] = vacq1;
 | 
|---|
| 233 |   dvl["vacq2"] = vacq2;
 | 
|---|
| 234 |   dvl["nth"] = numthread;
 | 
|---|
| 235 |   dvl["row"] = numrow;
 | 
|---|
| 236 |   dvl["dir"] = indir;
 | 
|---|
| 237 |   dvl["dupli"] = (dupli) ? 1: 0;
 | 
|---|
| 238 |   dvl["isconj"] = (doconj) ? 1: 0;
 | 
|---|
| 239 |   dvl["TUobs_0"] = tudeb;
 | 
|---|
| 240 |   dvl["TUobs_N"] = tufin;
 | 
|---|
| 241 |   dvl["TUday_0"] = tudeb_day;
 | 
|---|
| 242 |   dvl["TUday_N"] = tufin_day;
 | 
|---|
| 243 |   dvl["TTag_0"] = MeanTT(0);
 | 
|---|
| 244 |   if(ntimefill>0) dvl["TTag_N"] = MeanTT(ntimefill-1);
 | 
|---|
| 245 |   dvl["freq0"] = freq0;
 | 
|---|
| 246 |   dvl["dfreq0"] = 500./8192.;
 | 
|---|
| 247 |   dvl["jfr1"] = 0;
 | 
|---|
| 248 |   dvl["jfr2"] = nfreq-1;
 | 
|---|
| 249 |   dvl["nfreq"] = nfreq;
 | 
|---|
| 250 |   dvl["ngrpfreq"] = 1;
 | 
|---|
| 251 |   dvl["ifilmin"] = ifilmin;
 | 
|---|
| 252 |   dvl["ifilmax"] = ifilmax;
 | 
|---|
| 253 |   dvl["ntimefill"] = ntimefill;
 | 
|---|
| 254 |   dvl["ntimebad"] = ntimebad;
 | 
|---|
| 255 | 
 | 
|---|
| 256 |   // --- writing visibility matrix to file
 | 
|---|
| 257 |   cout<<"writing visibility matrix to file "<<outname<<endl;
 | 
|---|
| 258 |   POutPersist pos(outname);
 | 
|---|
| 259 |   if(ntimefill>0) {
 | 
|---|
| 260 |     TVector<r_8> dum1(MeanTT(Range(0,ntimefill-1)));
 | 
|---|
| 261 |     pos.PutObject(dum1,"meantt");
 | 
|---|
| 262 |     TVector<int_4> dum2(Npaqsum(Range(0,ntimefill-1)));
 | 
|---|
| 263 |     pos.PutObject(dum2,"npaqsum");
 | 
|---|
| 264 |     TMatrix< complex<r_4> > dum3(MVisi(Range(0,ntimefill-1),Range(0,MVisi.NCols()-1)));
 | 
|---|
| 265 |     dum3.Info() = dvl;
 | 
|---|
| 266 |     pos.PutObject(dum3,"visi");
 | 
|---|
| 267 |     pos.PutObject(Freq,"ifreq");
 | 
|---|
| 268 |   }
 | 
|---|
| 269 | 
 | 
|---|
| 270 |   }
 | 
|---|
| 271 | 
 | 
|---|
| 272 |   //--------------------------------------------------------------------
 | 
|---|
| 273 |   catch(PException& exc) {
 | 
|---|
| 274 |     cerr<<" svv2mtx2_1210.cc catched PException "<<exc.Msg()<<endl;
 | 
|---|
| 275 |     rc = 77;
 | 
|---|
| 276 |   }
 | 
|---|
| 277 |   catch (std::exception& sex) {
 | 
|---|
| 278 |     cerr<<"\n svv2mtx2_1210.cc std::exception :" 
 | 
|---|
| 279 |         <<(string)typeid(sex).name() << "\n msg= "<<sex.what()<<endl;
 | 
|---|
| 280 |     rc = 78;
 | 
|---|
| 281 |   }
 | 
|---|
| 282 |   catch(...) {
 | 
|---|
| 283 |     cerr<<" svv2mtx2_1210.cc catched unknown (...) exception  "<<endl; 
 | 
|---|
| 284 |     rc = 79; 
 | 
|---|
| 285 |   }
 | 
|---|
| 286 |   cout<<">>>> svv2mtx2_1210.cc ------- END ----------- RC="<<rc<<endl;
 | 
|---|
| 287 |   PrtTim("--- End of job");
 | 
|---|
| 288 |   return rc;
 | 
|---|
| 289 | }
 | 
|---|
| 290 | 
 | 
|---|
| 291 | 
 | 
|---|
| 292 | /*
 | 
|---|
| 293 | openppf visi1_01_05.ppf
 | 
|---|
| 294 | 
 | 
|---|
| 295 | print visi 5
 | 
|---|
| 296 | 
 | 
|---|
| 297 | n/plot ifreq.val%n ! ! "cpts"
 | 
|---|
| 298 | 
 | 
|---|
| 299 | n/plot meantt.val%n ! ! "cpts"
 | 
|---|
| 300 | cp meantt dmeantt
 | 
|---|
| 301 | c++exec dmeantt=0.; for(int i=1;i<dmeantt.Size();i++) dmeantt(i)=meantt(i)-meantt(i-1);
 | 
|---|
| 302 | n/plot dmeantt.val%n n>0 ! "cpts nsta"
 | 
|---|
| 303 | 
 | 
|---|
| 304 | imag visi "cdmod"
 | 
|---|
| 305 | imag visi "cdreal"
 | 
|---|
| 306 | imag visi "cdimag"
 | 
|---|
| 307 | imag visi "cdphas"
 | 
|---|
| 308 | 
 | 
|---|
| 309 |  */
 | 
|---|