source: Sophya/trunk/AddOn/TAcq/svv2mtx2_1210.cc

Last change on this file was 3995, checked in by cmv, 14 years ago

nettoyage du fichier cmv 20/05/2011

File size: 9.0 KB
Line 
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/*
23export TACQEXE=~/Reza/TAcq/Objs
24./CasA03Dec.csh > CasA03Dec.log 2>&1
25*/
26
27//--------------------------- Fonctions de ce fichier -------------------
28void usage(void);
29void usage(void)
30{
31cout<<"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//----------------------------------------------------
47int 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
Note: See TracBrowser for help on using the repository browser.