source: Sophya/trunk/AddOn/TAcq/branap.cc@ 4012

Last change on this file since 4012 was 4012, checked in by ansari, 14 years ago

Codage du mode de calcul de visibilites par intervalle de temps (BRVisibiliyCalculator) et propagation des modifs (ajouts de parametres) ds mfacq.cc et vismfib.cc, Reza 02/08/2011

File size: 12.8 KB
Line 
1#include <stdlib.h>
2#include <string.h>
3
4#include "branap.h"
5#include "minifits.h"
6#include "strutilxx.h"
7#include "sopnamsp.h"
8
9//--------------------------------------------------------------
10// Projet BAORadio - (C) LAL/IRFU 2008-2010
11// Classe de gestion des parametres programmes d'analyse
12//--------------------------------------------------------------
13
14/* --Methode-- */
15BRAnaParam::BRAnaParam(uint_4 nmean, uint_4 nzon, uint_4 npaqz)
16{
17 outpath_="./";
18 fgfitsout_=false;
19 imin_=imax_=0;
20 istep_=1;
21 rdsamefc_=true; // read paquets with same frame counter
22 freqmin_=0; freqmax_=-1;
23 nbinfreq_=1;
24 paqsize_=16424;
25 nzones_=nzon;
26 npaqinzone_=npaqz;
27 fgdatafft_=false; fgforceraworfft_=false;
28 fgsinglechannel_=false; fgforcesingleortwochan_=false;
29 prtlevel_=0;
30 prtmodulo_=50000;
31
32 nmean_=nmean;
33 fgtimeinterval_=false;
34 timeinterval_=1.;
35 nbloc_=1;
36
37 nbcalgrp_=1;
38 nthreads_=1;
39
40 spec_win_sz_=0;
41 spw_ext_sz_=0;
42 nbmax_specwfiles_=0;
43
44 vmin_=0.; vmax_=9e99;
45 nbands_=0; bandfirst_ = bandlast_ = 0;
46 fgdtpaq_ = fgdtms_ = false;
47
48 fgfreqfilter_=false; //JEC 1/2/11
49 medhalfwidth_=50; //JEC 6/4/11
50
51 gainfile_="";
52
53 proctimeduration_=9.e9;
54 fgtimeselect_=false;
55}
56
57/* --Methode-- */
58int BRAnaParam::DecodeArgs(int narg, char* arg[])
59{
60 if ((narg>1)&&(strcmp(arg[1],"-h")==0)) return Usage(false);
61 if (narg<5) return Usage(true);
62
63 bool okarg=false;
64 int ka=1;
65 while (ka<(narg-1)) {
66 if (strcmp(arg[ka],"-act")==0) {
67 action_=arg[ka+1];
68 ka+=2;
69 }
70 else if (strcmp(arg[ka],"-out")==0) {
71 outpath_=arg[ka+1];
72 size_t lenp=outpath_.size();
73 if ((lenp>0)&&(outpath_[lenp-1]!='/')) outpath_+='/';
74 ka+=2;
75 }
76 else if (strcmp(arg[ka],"-fitsout")==0) {
77 fgfitsout_=true;
78 ka++;
79 }
80 else if (strcmp(arg[ka],"-nmean")==0) {
81 nmean_=atoi(arg[ka+1]);
82 ka+=2;
83 }
84 else if (strcmp(arg[ka],"-tmint")==0) {
85 timeinterval_=atoi(arg[ka+1]);
86 fgtimeinterval_=true; ka+=2;
87 }
88 else if (strcmp(arg[ka],"-nbloc")==0) {
89 nbloc_=atoi(arg[ka+1]);
90 ka+=2;
91 }
92 else if (strcmp(arg[ka],"-freq")==0) {
93 sscanf(arg[ka+1],"%d,%d,%d",&freqmin_,&freqmax_,&nbinfreq_);
94 ka+=2;
95 }
96 else if (strcmp(arg[ka],"-zones")==0) {
97 int nzon=4;
98 int npaqz=128;
99 sscanf(arg[ka+1],"%d,%d",&nzon,&npaqz);
100 nzones_=nzon; npaqinzone_=npaqz;
101 ka+=2;
102 }
103 else if (strcmp(arg[ka],"-prt")==0) {
104 sscanf(arg[ka+1],"%d,%ld",&prtlevel_,&prtmodulo_);
105 ka+=2;
106 }
107 else if (strcmp(arg[ka],"-nthr")==0) {
108 nthreads_=atoi(arg[ka+1]);
109 ka+=2;
110 }
111 else if (strcmp(arg[ka],"-nvcal")==0) {
112 nbcalgrp_=atoi(arg[ka+1]);
113 ka+=2;
114 }
115 else if (strcmp(arg[ka],"-nosfc")==0) {
116 rdsamefc_=false;
117 ka++;
118 }
119 else if (strcmp(arg[ka],"-singlechan")==0) {
120 fgsinglechannel_=true; fgforcesingleortwochan_ = true;
121 ka++;
122 }
123 else if (strcmp(arg[ka],"-twochan")==0) {
124 fgsinglechannel_=false; fgforcesingleortwochan_ = true;
125 ka++;
126 }
127 else if (strcmp(arg[ka],"-rawdata")==0) {
128 fgforceraworfft_=true; fgdatafft_ = false;
129 ka++;
130 }
131 else if (strcmp(arg[ka],"-fftdata")==0) {
132 fgforceraworfft_=true; fgdatafft_ = true;
133 ka++;
134 }
135 else if (strcmp(arg[ka],"-varcut")==0) {
136 sscanf(arg[ka+1],"%lg,%lg",&vmin_,&vmax_);
137 ka+=2;
138 }
139 else if (strcmp(arg[ka],"-nband")==0) {
140 sscanf(arg[ka+1],"%d,%d,%d",&nbands_,&bandfirst_,&bandlast_);
141 ka+=2;
142 }
143 else if (strcmp(arg[ka],"-fdtpaq")==0) {
144 fgdtpaq_=true;
145 ka++;
146 }
147 else if (strcmp(arg[ka],"-fdtms")==0) {
148 fgdtms_=true;
149 ka++;
150 }
151 else if (strcmp(arg[ka],"-freqfilter")==0) {
152 fgfreqfilter_=true; ka++;
153 if (strcmp(arg[ka],"-")!=0) medhalfwidth_=atof(arg[ka]);
154 ka++;
155 }
156 //-tmproc hh:mm:ss,nseconds
157 else if (strcmp(arg[ka],"-tmproc")==0) {
158 int ah=0,am=0;
159 double as=0, als=0;
160 sscanf(arg[ka+1],"%d:%d:%lg,%lg",&ah,&am,&as,&als);
161 fgtimeselect_=true; proctimeduration_=als;
162 proctimestart_.SetHour(ah,am,as);
163 ka+=2;
164 }
165 else if (strcmp(arg[ka],"-gain")==0) {
166 gainfile_=arg[ka+1];
167 ka+=2;
168 }
169 else if (strcmp(arg[ka],"-tspwin")==0) {
170 int ai1=0,ai2=0,ai3=0;
171 sscanf(arg[ka+1],"%d,%d,%d",&ai1,&ai2,&ai3);
172 spec_win_sz_=ai1; spw_ext_sz_=ai2; nbmax_specwfiles_=ai3;
173 ka+=2;
174 }
175 else if (strcmp(arg[ka],"-in")==0) {
176 if ((narg-ka)<4) {
177 cout << " BRAnaParam::DecodeArgs() / Argument error " << endl;
178 return Usage(true);
179 }
180 sscanf(arg[ka+1],"%d,%d,%d",&imin_,&imax_,&istep_); ka+=2;
181 while(ka<(narg-1)) {
182 string inpath = arg[ka];
183 size_t lenp=inpath.size();
184 if (lenp<1) inpath="./";
185 if ((lenp>0)&&(inpath[lenp-1]!='/')) inpath+='/';
186 vector<string> fiblist;
187 string sa1 = arg[ka+1];
188 FillVStringFrString(sa1, fiblist, ',');
189 char dbuff[32];
190 for(size_t i=0; i<fiblist.size(); i++) {
191 sprintf(dbuff,"Fiber%d/",(int)atoi(fiblist[i].c_str()));
192 dirlist_.push_back(inpath+dbuff);
193 }
194 ka += 2;
195 }
196 okarg=true;
197 }
198 else ka++;
199 }
200
201 if (!okarg) {
202 cout << " BRAnaParam::DecodeArgs() / Argument error " << endl;
203 return Usage(true);
204 }
205 return 0;
206}
207
208/* --Methode-- */
209int BRAnaParam::Usage(bool fgshort)
210{
211 cout << " --- BRAnaParam : Reading/Processing BAORadio FITS files parameters " << endl;
212 cout << " Usage: prgname [-act ACT] [-out OutPath] [-fitsout] \n"
213 << " [-nmean NMean] [-zones NZones,nPaqinZone] \n"
214 << " [-nbloc NBloc] [-freq NumFreqMin,NumFreqMax,NBinFreq] \n"
215 << " [-prt lev,modulo] [-nvcal n] [-nthr n] [-nosfc]\n"
216 << " [-singlechan] [-twochan] [-fftdata] [-rawdata] \n"
217 << " [-freqfilter medhw] [-gain filename] [-varcut min,max] [-nband nband,first,last] \n"
218 << " [-freqfilter] [-gain filename] [-varcut min,max] [-nband nband,first,last] \n"
219 << " [-tmproc hh:mm:ss,nseconds] [-fdtpaq] [-fdtms] [-tspwin wsz,extsz,nfiles] \n"
220 << " -in Imin,Imax,Istep InPath FiberList [InPath2 FiberList2 InPath3 FiberList3 ...] \n" << endl;
221 if (fgshort) {
222 cout << " prgname -h for detailed instructions" << endl;
223 return 5;
224 }
225 cout << " -act Action: cube3d or vis or viscktt or mspec \n"
226 << " cube3d: create 3D fits cubes \n"
227 << " vis: compute visibilites (vismfib program) \n"
228 << " viscktt: compute visibilities and check TimeTag/FrameCounter (vismfib program)\n"
229 << " mspec: compute and save mean spectra for each channel \n"
230 << " bproc: run BRBaseProcessor for debug/printing (use -prt) \n"
231 << " -out OutPath: Output directory name \n"
232 << " -fitsout : Force FITS format for output files \n"
233 << " -nmean NMean: Number of packet used for spectra/visibility computation \n"
234 << " -tmint dtime: Time interval definition (instead of nmean) for spectra/visibility computation \n"
235 << " -nbloc NBloc: Number of MemMgr blocs in output file\n"
236 << " -zones NZones,NbPaqinZone : Number of Zones and number of paquets in one zone (RAcqMemZoneMgr) \n"
237 << " -freq NumFreqMin,NumFreqMax,NBinFreq : Frequency zone and number of bins \n"
238 << " -prt lev,modulo : Print level (0,1,2...) and print counter modulo (10000, 50000 ...) \n"
239 << " -nvcal n : number of BRVisibilityCalculator objects running in parallel in BRVisCalcGroup (default=1) \n"
240 << " -nthr n : number of threads for parallel execution in BRVisibilityCalculator (default=1) \n"
241 << " -nosfc : Don't force reading with SAME FrameCounter \n"
242 << " -singlechan : Force one channel per fiber \n"
243 << " -twochan : Force two channels per fiber \n"
244 << " -rawdata : Force raw data mode (firmware raw) \n"
245 << " -fftdata : Force FFT data mode (firmware fft) \n"
246 << " -varcut min,max : min-max cut on variance \n"
247 << " -nband nband,first,last: numbers of freq. bands and first and last bands used for cuts\n"
248 << " -tmproc hh:mm:ss,nseconds : processing time window definition \n"
249 << " -fdtpaq : force per paquet data table filling (specmfib) \n"
250 << " -fdtms : force time averaged/filtered data table filling; use -freq for defining bands (specmfib)\n"
251 << " -freqfilter medhw: force median filtering on the frequencies \n"
252 << " with half window width medhw (use - for default=" << medhalfwidth_ << ") \n"
253 << " -gain filename : spectral response fits file name \n"
254 << " -tspwin wsz,extsz,nfiles : spectra time (paquet no) window (ex: -tspwin 120,4,5) \n"
255 << " wsz,extsz= window,extension size; nfiles= maximum number of windows saved \n"
256 << " -in : input files/directory definition : \n"
257 << " Imin,Imax,Istep: fits files signalII.fits Imin<=II<=Imax Istep=increment \n"
258 << " InPath: Input directerory fits files in InPath/FiberJJ directory \n"
259 << " FiberList: List of fiber numbers (JJ - Ex: 2,1,4 ) \n" << endl;
260 return 1;
261}
262
263/* --Fonction-- */
264int BRAnaParam::PaqSizeFromFits()
265{
266 uint_4 paqsz, npaqf;
267 char flnm[1024];
268 sprintf(flnm,"%s/signal%d.fits",dirlist_[0].c_str(),imin_);
269 bool fgdatafft_in_fits=false;
270 bool fgsinglechan_in_fits=false;
271 SOPHYA::TimeStamp tmstart;
272 int rc = DecodeMiniFitsHeader(flnm,paqsize_, npaqinfile_,fgdatafft_in_fits, fgsinglechan_in_fits,tmstart);
273 if (!fgforcesingleortwochan_) fgsinglechannel_=fgsinglechan_in_fits;
274 if (!fgforceraworfft_) fgdatafft_=fgdatafft_in_fits;
275 if (fgtimeselect_) {
276 int year,month,day;
277 tmstart.GetDate(year,month,day);
278 proctimestart_.SetDate(year,month,day);
279 proctimeend_.Set(proctimestart_.ToDays()+proctimeduration_/86400.);
280 }
281 return rc;
282}
283
284/* --Fonction-- */
285ostream& BRAnaParam::Print(ostream& os)
286{
287 os << " BRAnaParam::Print() dirlist_.size()=" << dirlist_.size() << " Input directories: " << endl;
288 for(size_t k=0; k< dirlist_.size(); k++)
289 cout << k+1 << " : " << dirlist_[k] << endl;
290 cout << " IMin= " << imin_ << " IMax= " << imax_ << " IStep= " << istep_
291 << ((rdsamefc_)?" SameFrameCounter read mode":" AllOKPaquets read mode ") << endl;
292 if (fgtimeselect_) {
293 cout << " Processing time window, StartTime=" << proctimestart_ << " duration= " << proctimeduration_
294 << " EndTime=" << proctimeend_ << endl;
295 }
296 cout << " OutPath= " << outpath_ << (fgfitsout_?" force FITS output":" PPF output") << endl;
297 cout << " Action=" << action_ << " NMean=" << nmean_ << " NBloc=" << nbloc_ << endl;
298 cout << ((fgtimeinterval_)?" Time Interval mode for visi/spectra ":" NPaq Interval mode")
299 << " TimeInterval=" << timeinterval_ << " seconds " << endl;
300 cout << " FreqMin= " << freqmin_ << " FreqMax= " << freqmax_ << " NBinFreq= " << nbinfreq_ << endl;
301 if (fgdtpaq_) cout<< " Fill Per Paquet DadaTable ";
302 if (fgdtms_) cout<< " Fill Time Averaged/Filtered binned power DataTable ";
303 if (!fgdtpaq_&&!fgdtms_) cout << " NO DataTable " << endl;
304 else cout << endl;
305 cout << " GainFileName=" << gainfile_ << " Variance: Min= " << vmin_ << " Max= " << vmax_
306 << " Bands: N=" << nbands_ << " First=" << bandfirst_ << " Last=" << bandlast_
307 << endl;
308 if (fgfreqfilter_) {
309 cout << " force frequence median filtering (action gain), half width =" << medhalfwidth_
310 << endl;
311 } else {
312 cout<<" NO freq. filtering" << endl;
313 }
314 cout << " Spectra TimeWindow (Nb.Paquets) Size=" << spec_win_sz_ << " ExtensionSize=" << spw_ext_sz_
315 << " MaxNbFile=" << nbmax_specwfiles_ << endl;
316 cout << " PaqSize=" << paqsize_ << " - NZones=" << nzones_ << " NPaqZone=" << npaqinzone_
317 << " PrtLevel=" << prtlevel_ << " PrtCntModulo=" << prtmodulo_ << endl;
318 cout << " AcqDataMode: " << ((fgdatafft_)?" Data_FFT " : " Data_Raw " )
319 << ((fgsinglechannel_)?" SingleChannel " : " TwoChannels " ) << endl;
320 cout << " NbVisibCalculator in Group: " << nbcalgrp_ << " with N//threads: " << nthreads_ << endl;
321
322
323 return os;
324}
325
326/* --Fonction-- */
327int BRAnaParam::DecodeMiniFitsHeader(const char* filename, uint_4& paqsz, uint_4& npaq,
328 bool& fgdatafft, bool& fgsinglechannel, SOPHYA::TimeStamp& tmstart)
329{
330 cout << " DecodeMiniFitsHeader - Opening file: " << filename << endl;
331 MiniFITSFile mff(filename, MF_Read);
332 string acqmode=mff.GetKeyValue("ACQMODE");
333 cout << "DecodeMiniFitsHeader()... Type=" << mff.DataTypeToString() << " NAxis1=" << mff.NAxis1()
334 << " NAxis2=" << mff.NAxis2() << " AcqMode=" << acqmode << endl;
335 paqsz = mff.NAxis1();
336 npaq = mff.NAxis2();
337 if (acqmode.substr(0,3)=="fft") fgdatafft=true;
338 if (acqmode.substr(3,3)=="fft") fgdatafft=true; // pour ordfft1c ordfft2c - Cedric Viou, 15 Juin 2011
339 if (acqmode.find("1c") < acqmode.length()) fgsinglechannel=true;
340 string fkvs=mff.GetKeyValue("DATEOBS");
341 if (fkvs.length()>0) tmstart.Set(fkvs);
342 fkvs=mff.GetKeyValue("TMSTART");
343 if (fkvs.length()>0) tmstart.Set(fkvs);
344 return 0;
345}
346
Note: See TracBrowser for help on using the repository browser.