source: Sophya/trunk/AddOn/TAcq/brproc.cc@ 3777

Last change on this file since 3777 was 3777, checked in by ansari, 15 years ago

Ajout calcul nb total d'operations , Reza 18/05/2010

File size: 41.6 KB
Line 
1#include "racquproc.h"
2
3#include <stdlib.h>
4#include <string.h>
5#include <unistd.h>
6#include <fstream>
7#include <signal.h>
8
9#include "pexceptions.h"
10#include "tvector.h"
11#include "ntuple.h"
12#include "datatable.h"
13#include "histos.h"
14#include "fioarr.h"
15#include "matharr.h"
16#include "timestamp.h"
17#include "ctimer.h"
18#include "fftpserver.h"
19#include "fftwserver.h"
20
21#include "FFTW/fftw3.h"
22
23
24#include "pciewrap.h"
25#include "brpaqu.h"
26#include "brproc.h"
27
28//---------------------------------------------------------------------
29// Classe de traitement - calcul de visibilite pour n fibres
30//---------------------------------------------------------------------
31
32/* --Methode-- */
33BRVisibilityCalculator::BRVisibilityCalculator(RAcqMemZoneMgr& memgr, string outpath, uint_4 nmean, size_t nthr)
34 : BRBaseProcessor(memgr), paralex_(*this, nthr), nparthr_(nthr),
35 outpath_(outpath), nmean_(nmean), nbcalc_(1), calcid_(0), vpdata_(2*memgr.NbFibres())
36 // , dtfos_(outpath+"visdt.fits", Fits_Create), visdt_(dtfos_, 1024, true);
37{
38 DefineRank(1,0);
39
40 uint_4 maxnpairs = (2*memgr_.NbFibres()+1)*memgr_.NbFibres();
41 chanum_.SetSize(maxnpairs);
42 sa_size_t k=0;
43 for(size_t i=0; i<2*memgr_.NbFibres(); i++) vpdata_[i]=NULL;
44 for(size_t i=0; i<2*memgr_.NbFibres(); i++) {
45 for(size_t j=i; j<2*memgr_.NbFibres(); j++) {
46 chanum_(k) = (i+1)*100+(j+1); k++;
47 }
48 }
49 SelectPairs();
50
51 // visdt_.AddFloatColumn("mfc");
52 visdt_.AddDoubleColumn("mfc");
53 visdt_.AddDoubleColumn("mtt");
54 visdt_.AddIntegerColumn("jfreq");
55 visdt_.AddIntegerColumn("numch");
56 visdt_.AddFloatColumn("vre");
57 visdt_.AddFloatColumn("vim");
58
59 if (nmean_ < 1) nmean_=memgr_.NbPaquets();
60 if (nmean_ < 1) nmean_=1;
61
62 cout << " BRVisibilityCalculator::/Info nmean=" << nmean_ << endl;
63
64 totnbpaq_=0;
65 numfile_=0;
66 nb_flop_=0.;
67 moyfc_=moytt_=0.;
68
69 fgallfibok=NULL;
70 fgcktt_=false;
71}
72
73/* --Methode-- */
74BRVisibilityCalculator::~BRVisibilityCalculator()
75{
76 cout << " BRVisibilityCalculator - Visibility Datatable : " << endl;
77 cout << visdt_;
78 string filename;
79 filename = outpath_+"visdt.ppf";
80 if (nbcalc_>1) {
81 char sbuff[32];
82 sprintf(sbuff,"visdt_%d",(int)calcid_);
83 filename = outpath_+sbuff;
84 }
85 POutPersist po(filename);
86 po << visdt_;
87 if (calcid_ == 0) {
88 POutPersist poc(outpath_+"chanum.ppf");
89 poc << chanum_;
90
91 if (fgcktt_) {
92 cout << " BRVisibilityCalculator - Check TimeTag done: TotNPaqProc= " << totnbpaq_ << endl;
93 for(size_t fib=0; fib<(size_t)memgr_.NbFibres(); fib++) {
94 cout << " BRTTCheck-Fiber[" << fib << "] NBadTT=" << vbadtt_[fib] << " NDiffTT>5="
95 << vndiff5tt_[fib] << " NotSameTT=" << vnsamett_[fib] << endl;
96 }
97 POutPersist pott(outpath_+"ttfcmtx.ppf");
98 pott << PPFNameTag("FC") << fcmtx_;
99 pott << PPFNameTag("TT") << ttmtx_;
100 }
101 }
102}
103
104/* --Methode-- */
105void BRVisibilityCalculator::DefineRank(uint_4 nbc, uint_4 cid)
106{
107 if ((nbc>4)||(cid>=nbc))
108 throw ParmError("BRVisibilityCalculator::DefineRank() NbCalc > 4 !");
109 nbcalc_=nbc;
110 calcid_=cid;
111 if (nbcalc_>1) {
112 uint_4 maxnpairs = (2*memgr_.NbFibres()+1)*memgr_.NbFibres();
113 uint_4 npairs=maxnpairs/nbcalc_;
114 if (calcid_==(nbcalc_-1))
115 SelectPairs(calcid_*npairs, maxnpairs-calcid_*npairs);
116 else
117 SelectPairs(calcid_*npairs, npairs);
118 MemZaction mmzas[4]={MemZA_ProcA,MemZA_ProcB,MemZA_ProcC,MemZA_ProcD};
119 SetMemZAction(mmzas[calcid_]);
120 }
121 return ;
122}
123
124/* --Methode-- */
125uint_4 BRVisibilityCalculator::SelectPairs(uint_4 pair1, uint_4 nbpairs)
126{
127 BRPaquet paq(memgr_.PaqSize());
128 uint_4 maxnpairs = (2*memgr_.NbFibres()+1)*memgr_.NbFibres();
129
130 if (pair1 >= maxnpairs) pair1=maxnpairs-1;
131 if (nbpairs > maxnpairs-pair1) nbpairs=maxnpairs-pair1;
132 pairst_=pair1;
133 nbpairs_=nbpairs;
134 vismtx_.SetSize(nbpairs_, paq.DataSize()/4);
135 return nbpairs_;
136}
137
138/* --Methode-- */
139int BRVisibilityCalculator::SelectFreqBinning(uint_4 freq1, uint_4 freq2, uint_4 nbfreq)
140{
141 jf1_=freq1; jf2_=freq2;
142 if ((jf1_<1)||(jf1_>=vismtx_.NCols())) jf1_=1;
143 if ((jf2_<1)||(jf2_>=vismtx_.NCols())||(jf2_<jf1_)) jf2_=vismtx_.NCols()-1;
144 if (nbfreq<1) nbfreq=1;
145 djf_=(jf2_-jf1_)/nbfreq;
146 if (djf_<1) djf_=0;
147 cout << " BRVisibilityCalculator::SelectFreqBinning/Info JF1=" << jf1_
148 << " JF2=" << jf2_ << " DJF=" << djf_ << endl;
149
150}
151
152
153/* --Methode-- */
154int BRVisibilityCalculator::ActivateTimeTagCheck(uint_8 maxnpaq)
155{
156 mindeltatt_=memgr_.PaqSize()/2;
157 if (mindeltatt_<1) mindeltatt_=1;
158 fcmtx_.SetSize(memgr_.NbFibres(), maxnpaq);
159 ttmtx_.SetSize(memgr_.NbFibres(), maxnpaq);
160 vlasttt_.resize(memgr_.NbFibres(), 0);
161 vbadtt_.resize(memgr_.NbFibres(), 0);
162 vnsamett_.resize(memgr_.NbFibres(), 0);
163 vndiff5tt_.resize(memgr_.NbFibres(), 0);
164
165 fgcktt_=true;
166 cout << " BRVisibilityCalculator::ActivateTimeTagCheck() - TT/Fc matrix NCols=" << maxnpaq
167 << " MinDeltaTT=" << mindeltatt_ << endl;
168
169 return 0;
170}
171
172
173/* --Methode-- */
174void BRVisibilityCalculator::run()
175{
176 cout << " BRVisibilityCalculator[" << calcid_ << "/" << nbcalc_
177 << "]::run() - Starting " << " NFibers=" << memgr_.NbFibres()
178 << " NChan=" << 2*memgr_.NbFibres() << " NPairs=" << nbpairs_ << " First:" << pairst_ << endl;
179
180 if (nparthr_ < 2) return BRBaseProcessor::run();
181 // Execution multithread parallele
182 setRC(1);
183 int rc=0;
184 try {
185 if ((nmean_%memgr_.NbPaquets())!=0) {
186 uint_4 mnmean = (nmean_/memgr_.NbPaquets()+1)*memgr_.NbPaquets();
187 cout << " BRVisibilityCalculator::run()/Info changing nmean=" << nmean_ << " to multiple of"
188 << " memgr_.NbPaquets() -> " << mnmean << endl;
189 nmean_=mnmean;
190 }
191 paralex_.SetParallelTask(*this);
192 cout << " BRVisibilityCalculator::run()/Info : starting ParallelExecutor with nThreads="
193 << paralex_.nThreads() << " ... " << endl;
194 paralex_.start();
195
196 fgallfibok = new bool[memgr_.NbPaquets()];
197
198 size_t paqsz=memgr_.PaqSize();
199 bool fgrun=true;
200 while (fgrun) {
201 if (stop_) break;
202 if (memgr_.GetRunState() == MemZR_Stopped) break;
203 int mid = memgr_.FindMemZoneId(mmact_); // (MemZA_ProcA);
204 Byte* buffg = memgr_.GetMemZone(mid);
205 if (buffg == NULL) {
206 cout << "BRVisibilityCalculator::run()/ERROR memgr.GetMemZone(" << mid << ") -> NULL" << endl;
207 setRC(7); fgrun=false;
208 break;
209 }
210 for(size_t fib=0; fib<(size_t)memgr_.NbFibres(); fib++) {
211 fbuff_[fib] = memgr_.GetMemZone(mid,fib);
212 if (fbuff_[fib] == NULL) { // cela ne devrait pas arriver
213 cout << "BRVisibilityCalculator::run()/ERROR memgr.GetMemZone(" << mid << "," << fib << ") -> NULL" << endl;
214 setRC(9); fgrun=false;
215 break;
216 }
217 }
218
219 if (totnbpaq_%nmean_ == 0) {
220 if (totnbpaq_ > 0) {
221 moyfc_/=nmean_;
222 moytt_/=nmean_;
223 vismtx_.Info()["MeanFC"] = moyfc_;
224 vismtx_.Info()["MeanTT"] = moytt_;
225 vismtx_.Info()["NPAQSUM"] = nmean_;
226
227 // ATTENTION : Matrice visibilites non moyennee
228 char nfile[48];
229 if (nbcalc_==1)
230 sprintf(nfile,"vismtx%d.ppf",numfile_);
231 else
232 sprintf(nfile,"vismtx_%d_%d.ppf",(int)calcid_,numfile_);
233 string flnm=outpath_+nfile;
234 POutPersist po(flnm);
235 po << vismtx_;
236 cout << numfile_ << "-BRVisibilityCalculator::run() NPaqProc="
237 << totnbpaq_ << " -> Visibility Matrix in " << flnm << endl;
238 FillVisibTable(moyfc_, moytt_);
239 numfile_++;
240 }
241 vismtx_ = complex<r_4>((r_4)0.,(r_4)0.);
242 moyfc_=moytt_=0.;
243 }
244
245 for(size_t jp=0; jp<memgr_.NbPaquets(); jp++) { // boucle sur les paquets d'une zone
246 fgallfibok[jp]=fgokallfibers_=true;
247 for(size_t fib=0; fib<(size_t)memgr_.NbFibres(); fib++) {
248 vpaq_[fib].Set(fbuff_[fib]+jp*paqsz);
249 vfgok_[fib] = vpchk_[fib].Check(vpaq_[fib],curfc_[fib]);
250 if (!vfgok_[fib]) fgallfibok[jp]=fgokallfibers_=false;
251 }
252 if (fgokallfibers_) {
253 if (totprocnpaq_==0) {
254 for(size_t fib=0; fib<(size_t)memgr_.NbFibres(); fib++) {
255 fcfirst_[fib]=curfc_[fib];
256 ttfirst_[fib]=vpaq_[fib].TimeTag();
257 }
258 }
259 totprocnpaq_++;
260 moyfc_ += curfc_[0];
261 moytt_ += (vpaq_[0].TimeTag()-ttfirst_[0]);
262 if ((fgcktt_)&&(calcid_==0)) CheckTimeTag();
263 totnbpaq_++;
264 }
265 } // Fin de boucle sur les paquets
266
267 // Execution parallele pour calcul des visibilites par bandes de frequence
268 int rcpex=paralex_.execute();
269 if (rcpex!=0) cout << " BRVisibilityCalculator::run() / Error Rc[paralex_.execute()]=" << rcpex << endl;
270
271 memgr_.FreeMemZone(mid, mmsta_); // (MemZS_ProcA);
272 } // Fin de boucle sur les zones a traiter
273 //------------------------------------
274 cout << " --------- END BRVisibilityCalculator::run() , TotNbProcPaq=" << totprocnpaq_ << endl;
275 /*
276 for(size_t fib=0; fib<(size_t)memgr_.NbFibres(); fib++) vpchk_[fib].Print();
277 cout << " ------------------------------------ " << endl;
278 */
279 delete[] fgallfibok;
280 }
281 catch (std::exception& exc) {
282 cout << " BRVisibilityCalculator::run()/catched std::exception " << exc.what() << endl;
283 setRC(98);
284 return;
285 }
286 catch(...) {
287 cout << " BRVisibilityCalculator::run()/catched unknown ... exception " << endl;
288 setRC(99);
289 return;
290 }
291
292}
293
294/* --Methode-- */
295int BRVisibilityCalculator::Process()
296{
297
298 for(size_t fib=0; fib<(size_t)memgr_.NbFibres(); fib++) {
299 vpdata_[2*fib] = vpaq_[fib].Data1C();
300 vpdata_[2*fib+1] = vpaq_[fib].Data2C();
301 }
302
303 if (totnbpaq_%nmean_ == 0) {
304 if (totnbpaq_ > 0) {
305 moyfc_/=nmean_;
306 moytt_/=nmean_;
307 vismtx_.Info()["MeanFC"] = moyfc_;
308 vismtx_.Info()["MeanTT"] = moytt_;
309 vismtx_.Info()["NPAQSUM"] = nmean_;
310
311 // ATTENTION : Matrice visibilites non moyennee
312 char nfile[48];
313 if (nbcalc_==1)
314 sprintf(nfile,"vismtx%d.ppf",numfile_);
315 else
316 sprintf(nfile,"vismtx_%d_%d.ppf",(int)calcid_,numfile_);
317 string flnm=outpath_+nfile;
318 POutPersist po(flnm);
319 po << vismtx_;
320 cout << numfile_ << "-BRVisibilityCalculator::Process() NPaqProc="
321 << totnbpaq_ << " -> Visibility Matrix in " << flnm << endl;
322 FillVisibTable(moyfc_, moytt_);
323 numfile_++;
324 }
325 vismtx_ = complex<r_4>((r_4)0.,(r_4)0.);
326 moyfc_=moytt_=0.;
327 }
328
329 sa_size_t k=0;
330 for(size_t i=0; i<vpdata_.size(); i++) {
331 for(size_t j=i; j<vpdata_.size(); j++) {
332 size_t kpair=i*vpdata_.size()+j;
333 if (kpair<pairst_) continue;
334 if (kpair>=(pairst_+nbpairs_)) break;
335 TVector< complex<r_4> > vis = vismtx_.Row(k); k++;
336 for(sa_size_t f=1; f<vis.Size(); f++) {
337 vis(f) += complex<r_4>((r_4)vpdata_[i][f].realB(), (r_4)vpdata_[i][f].imagB()) *
338 complex<r_4>((r_4)vpdata_[j][f].realB(), -(r_4)vpdata_[j][f].imagB());
339 }
340 nb_flop_ += (7.*(r_8)vis.Size());
341 }
342 }
343
344 moyfc_ += curfc_[0];
345 moytt_ += (vpaq_[0].TimeTag()-ttfirst_[0]);
346 if ((fgcktt_)&&(calcid_==0)) CheckTimeTag();
347 totnbpaq_++;
348 return 0;
349}
350
351/* --Methode-- */
352int BRVisibilityCalculator::execute(int tid)
353{
354 vector<TwoByteComplex*> pvpdata(2*memgr_.NbFibres());
355 size_t paqsz=memgr_.PaqSize();
356 BRPaquet ppaq(paqsz);
357
358 sa_size_t fdelt = vismtx_.NCols()/nparthr_;
359 sa_size_t fdeb = tid*fdelt;
360 sa_size_t ffin = (tid+1)*fdelt;
361
362 if (fdeb<1) fdeb=1;
363 if ((ffin>vismtx_.NCols())||(tid==(nparthr_-1))) ffin=vismtx_.NCols();
364
365 for(size_t jp=0; jp<memgr_.NbPaquets(); jp++) { // boucle sur les paquets d'une zone
366 if (!fgallfibok[jp]) continue;
367 for(size_t fib=0; fib<(size_t)memgr_.NbFibres(); fib++) {
368 ppaq.Set(fbuff_[fib]+jp*paqsz);
369 pvpdata[2*fib] = ppaq.Data1C();
370 pvpdata[2*fib+1] = ppaq.Data2C();
371 }
372 sa_size_t k=0;
373 for(size_t i=0; i<vpdata_.size(); i++) {
374 for(size_t j=i; j<vpdata_.size(); j++) {
375 size_t kpair=i*vpdata_.size()+j;
376 if (kpair<pairst_) continue;
377 if (kpair>=(pairst_+nbpairs_)) break;
378 TVector< complex<r_4> > vis = vismtx_.Row(k); k++;
379 for(sa_size_t f=fdeb; f<ffin; f++) {
380 vis(f) += complex<r_4>((r_4)pvpdata[i][f].realB(), (r_4)pvpdata[i][f].imagB()) *
381 complex<r_4>((r_4)pvpdata[j][f].realB(), -(r_4)pvpdata[j][f].imagB());
382 }
383 nb_flop_ += (7.*(r_8)(ffin-fdeb));
384 }
385 }
386
387 } // Fin de boucle sur les paquets
388
389 return 0;
390}
391
392/* --Methode-- */
393int BRVisibilityCalculator::FillVisibTable(double fcm, double ttm)
394{
395 double xnt[10];
396 xnt[0]=fcm; xnt[1]=ttm/1.25e8;
397
398 if (djf_<2) {
399 for(sa_size_t rv=0; rv<vismtx_.NRows(); rv++) {
400 for(sa_size_t jf=jf1_; jf<jf2_; jf++) {
401 xnt[2]=jf;
402 xnt[3]=chanum_(rv+pairst_);
403 xnt[4]=vismtx_(rv,jf).real()/(r_4)(nmean_);
404 xnt[5]=vismtx_(rv,jf).imag()/(r_4)(nmean_);
405 visdt_.AddRow(xnt);
406 }
407 }
408 }
409 else {
410 for(sa_size_t rv=0; rv<vismtx_.NRows(); rv++) {
411 for(sa_size_t jf=jf1_; jf<jf2_; jf+=djf_) {
412 r_4 moyreal=0.;
413 r_4 moyimag=0.;
414 sa_size_t jjfmx=jf+djf_;
415 if (jjfmx > vismtx_.NCols()) jjfmx=vismtx_.NCols();
416 for(sa_size_t jjf=jf; jjf<jjfmx; jjf++) {
417 moyreal+=vismtx_(rv,jjf).real();
418 moyimag+=vismtx_(rv,jjf).imag();
419 }
420 xnt[2]=jf+djf_/2;
421 xnt[3]=chanum_(rv+pairst_);
422 xnt[4]=moyreal/(r_4)(nmean_*djf_);
423 xnt[5]=moyimag/(r_4)(nmean_*djf_);
424 visdt_.AddRow(xnt);
425 }
426 }
427 }
428 return 0;
429}
430
431/* --Methode-- */
432int BRVisibilityCalculator::CheckTimeTag()
433{
434 if (totnbpaq_==0) {
435 for(size_t fib=0; fib<(size_t)memgr_.NbFibres(); fib++) {
436 vlasttt_[fib]=ttfirst_[fib];
437 if (ttmtx_.NCols()>0) {
438 fcmtx_(fib,totnbpaq_) = curfc_[fib];
439 ttmtx_(fib,totnbpaq_) = vlasttt_[fib];
440 }
441 }
442 return 0;
443 }
444 for(size_t fib=0; fib<(size_t)memgr_.NbFibres(); fib++) {
445 int_8 ld = (int_8)vpaq_[fib].TimeTag()-(int_8)vlasttt_[fib];
446 int_8 fd = (int_8)vpaq_[fib].TimeTag()-(int_8)ttfirst_[fib]-(int_8)vpaq_[0].TimeTag()+(int_8)ttfirst_[0];
447 /* if ( (ld < mindeltatt_) || (fd<-5) || (fd>5)) { vbadtt_[fib]++; vnsamett_[fib]++; }
448 else {
449 if (fd!=0) vnsamett_[fib]++;
450 }
451 */
452 if (ld < mindeltatt_) vbadtt_[fib]++;
453 else {
454 if (fd != 0) vnsamett_[fib]++;
455 if ((fd<-5)||(fd>5)) vndiff5tt_[fib]++;
456 }
457 vlasttt_[fib]=vpaq_[fib].TimeTag();
458 if (totnbpaq_<ttmtx_.NCols()) {
459 fcmtx_(fib,totnbpaq_) = curfc_[fib];
460 ttmtx_(fib,totnbpaq_) = vlasttt_[fib];
461 }
462 }
463 return 0;
464}
465
466//-------------------------------------------------------------------------------
467// Classe Groupe (ensemble) de Calculateur de Visibilites, tourant en parallele
468//-------------------------------------------------------------------------------
469
470/* --Methode-- */
471BRVisCalcGroup::BRVisCalcGroup(size_t nbcalc, RAcqMemZoneMgr& memgr, string outpath, uint_4 nmean, size_t nthr)
472 : tm_(false)
473{
474 if ((nbcalc<1)||(nbcalc>4))
475 throw ParmError("BRVisCalcGroup::BRVisCalcGroup NbCalc > 4 !");
476 for(size_t i=0; i<nbcalc; i++) {
477 BRVisibilityCalculator * viscp=new BRVisibilityCalculator(memgr, outpath, nmean, nthr);
478 viscp->DefineRank(nbcalc, i);
479 viscalcp_.push_back(viscp);
480 }
481}
482/* --Methode-- */
483BRVisCalcGroup::~BRVisCalcGroup()
484{
485 for(size_t i=0; i<viscalcp_.size(); i++)
486 delete viscalcp_[i];
487}
488/* --Methode-- */
489int BRVisCalcGroup::SelectFreqBinning(uint_4 freq1, uint_4 freq2, uint_4 nbfreq)
490{
491 int rc=0;
492 for(size_t i=0; i<viscalcp_.size(); i++)
493 rc=viscalcp_[i]->SelectFreqBinning(freq1, freq2, nbfreq);
494 return rc;
495}
496/* --Methode-- */
497void BRVisCalcGroup::start()
498{
499 for(size_t i=0; i<viscalcp_.size(); i++)
500 viscalcp_[i]->start();
501 tm_.SplitQ();
502}
503/* --Methode-- */
504void BRVisCalcGroup::join()
505{
506 r_8 totflop=0.;
507 for(size_t i=0; i<viscalcp_.size(); i++) {
508 viscalcp_[i]->join();
509 totflop += viscalcp_[i]->TotNbFLOP();
510 }
511 tm_.SplitQ();
512 cout << " ----------------------------------------------------------" << endl;
513 cout << " BRVisCalcGroup::join() : Finished , Elaspsed time: " << tm_.PartialElapsedTimems()
514 << " ms (total:" << tm_.TotalElapsedTimems() << ")" << endl;
515 cout << " ... TotalMegaFLOP= " << totflop/(1024.e3) << " @ "
516 << totflop/(r_8)tm_.PartialElapsedTimems()/(1024) << " MFLOP/s" << endl;
517 cout << " ----------------------------------------------------------" << endl;
518 return;
519}
520
521
522//---------------------------------------------------------------------
523// Classe de traitement simple - calcul de spectres moyennes / voie
524//---------------------------------------------------------------------
525/* --Methode-- */
526BRMeanSpecCalculator::BRMeanSpecCalculator(RAcqMemZoneMgr& memgr, string outpath, uint_4 nmean)
527 : BRBaseProcessor(memgr), outpath_(outpath), nmean_(nmean)
528{
529 BRPaquet paq(memgr_.PaqSize());
530 mspecmtx_.SetSize(2*memgr_.NbFibres(), paq.DataSize()/4);
531 numfile_=0;
532 totnbpaq_=0;
533}
534
535/* --Methode-- */
536BRMeanSpecCalculator::~BRMeanSpecCalculator()
537{
538}
539
540
541/* --Methode-- */
542int BRMeanSpecCalculator::Process()
543{
544
545 if (totnbpaq_%nmean_ == 0) {
546 if (totnbpaq_ > 0) {
547 mspecmtx_.Info()["NPAQSUM"] = nmean_;
548 mspecmtx_ /= (double)nmean_;
549 char nfile[32];
550 sprintf(nfile,"mspecmtx%d.ppf",numfile_);
551 string flnm=outpath_+nfile;
552 POutPersist po(flnm);
553 po << mspecmtx_;
554 cout << numfile_ << "-BRMeanSpecCalculator::Process() NPaqProc="
555 << totnbpaq_ << " -> Mean spectra Matrix in " << flnm << endl;
556 numfile_++;
557 }
558 mspecmtx_ = (r_8)(0.);
559 }
560
561 sa_size_t k=0;
562 for(size_t i=0; i<(size_t)2*memgr_.NbFibres(); i++) {
563 TwoByteComplex* zp=vpaq_[i/2].Data1C();
564 if (i%2==1) zp=vpaq_[i/2].Data2C();
565 TVector< r_4 > spec = mspecmtx_.Row(k); k++;
566 for(sa_size_t f=1; f<spec.Size(); f++) {
567 spec(f) += zp[f].module2F();
568 }
569 }
570
571 totnbpaq_++;
572 return 0;
573}
574
575
576//---------------------------------------------------------------
577// Classe thread de traitement donnees ADC avec 2 voies par frame
578//---------------------------------------------------------------
579
580// Mutex pour eviter le plantage du a FFTW qui ne semble pas thread-safe
581static ZMutex* pmutfftw=NULL;
582
583/* --Methode-- */
584BRProcA2C::BRProcA2C(RAcqMemZoneMgr& mem, string& path, bool fgraw, uint_4 nmean,
585 uint_4 nmax, bool fghist, uint_4 nfsmap, bool fgnotrl, int card)
586 : memgr(mem)
587{
588 fgraw_ = fgraw;
589 nmax_ = nmax;
590 nmean_ = nmean;
591 if (fgraw_) cout << " BRProcA2C::BRProcA2C() - constructeur RAW data - NMean=" << nmean_ << endl;
592 else cout << " BRProcA2C::BRProcA2C() - constructeur FFT data - NMean=" << nmean_ << endl;
593 nfsmap_ = nfsmap;
594 stop_ = false;
595 path_ = path;
596 fgnotrl_ = fgnotrl;
597 fghist_ = fghist;
598 card_ = card;
599 if (pmutfftw==NULL) pmutfftw=new ZMutex;
600}
601
602/* --Methode-- */
603void BRProcA2C::Stop()
604{
605 stop_=true;
606 // cout <<" BRProcA2C::Stop ... > STOP " << endl;
607}
608
609
610static inline r_4 Zmod2(complex<r_4> z)
611{ return (z.real()*z.real()+z.imag()*z.imag()); }
612
613static inline string card2name_(int card)
614{
615 if (card==2) return " (Chan3,4) ";
616 else return " (Chan1,2) ";
617}
618/* --Methode-- */
619void BRProcA2C::run()
620{
621 setRC(1);
622 try {
623 Timer tm("BRProcA2C", false);
624 TimeStamp ts;
625 BRPaqChecker pcheck(!fgnotrl_); // Verification/comptage des paquets
626
627 size_t totnbytesout = 0;
628 size_t totnbytesproc = 0;
629
630 cout << " BRProcA2C::run() - Starting " << ts << " NMaxMemZones=" << nmax_
631 << " NMean=" << nmean_ << card2name_(card_) << endl;
632 cout << " BRProcA2C::run()... - Output Data Path: " << path_ << endl;
633 char fname[512];
634// sprintf(fname,"%s/proc.log",path_.c_str());
635// ofstream filog(fname);
636// filog << " BRProcA2C::run() - starting log file " << ts << endl;
637// filog << " ... NMaxMemZones=" << nmax_ << " NMean=" << nmean_ << " Step=" << step_ << endl;
638
639/*----DELETE NTuple
640 const char* nnames[8] = {"fcs","tts","s1","s2","s12","s12re","s12im","s12phi"};
641 NTuple nt(8, nnames);
642 double xnt[10];
643 uint_4 nmnt = 0;
644 double ms1,ms2,ms12,ms12re,ms12im,ms12phi;
645----*/
646// Time sample (raw data) /FFT coeff histograms
647 Histo* ph1=NULL;
648 Histo* ph2=NULL;
649 if (fghist_) {
650 if (fgraw_) {
651 ph1 = new Histo(-0.5, 255.5, 256);
652 ph2 = new Histo(-0.5, 255.5, 256);
653 }
654 else {
655 ph1 = new Histo(-128.5, 128.5, 257);
656 ph2 = new Histo(-128.5, 128.5, 257);
657 }
658 }
659
660// Initialisation pour calcul FFT
661 TVector< complex<r_4> > cfour1; // composant TF
662 uint_4 paqsz = memgr.PaqSize();
663 uint_4 procpaqsz = memgr.ProcPaqSize();
664
665
666 BRPaquet pq(NULL, NULL, paqsz);
667 TVector<r_4> vx(pq.DataSize()/2);
668 int szfour = pq.DataSize()/2/2+1;
669 cfour1.SetSize(szfour);
670/*
671 vx = (r_4)(0.);
672 FFTPackServer ffts;
673 ffts.FFTForward(vx, cfour1);
674 szfour = cfour1.Size();
675*/
676
677 bool fgtimfreq = false; // true->cartes temps<>frequences
678 if (nfsmap_>0) fgtimfreq=true;
679
680 TVector< complex<r_4> > cfour2(cfour1.Size());
681
682 TVector<r_4> spectreV1(cfour1.Size());
683 TVector<r_4> spectreV2(cfour1.Size());
684 TVector<r_4> moyspecV1(cfour1.Size()); // Moyenne des Spectres
685 TVector<r_4> moyspecV2(cfour1.Size());
686 TVector<r_4> sigspecV1(cfour1.Size()); // Sigma des Spectres
687 TVector<r_4> sigspecV2(cfour1.Size());
688 TVector< complex<r_4> > visiV12( cfour1.Size() );
689
690 TMatrix<r_4> timfreqV1, timfreqV2; // Cartes temps<>frequences
691 if (fgtimfreq) {
692 timfreqV1.SetSize(nmean_, spectreV1.Size()/nfsmap_);
693 timfreqV2.SetSize(nmean_, spectreV2.Size()/nfsmap_);
694 }
695 cout << " *DBG*BRProcA2C PaqSz=" << paqsz << " ProcPaqSize=" << procpaqsz
696 << " procpaqsz/2=" << procpaqsz/2 << " cfour1.Size()=" << cfour1.Size()
697 << " *8=" << cfour1.Size()*8 << endl;
698
699 pmutfftw->lock();
700 fftwf_plan plan1 = fftwf_plan_dft_r2c_1d(vx.Size(), vx.Data(),
701 (fftwf_complex*)cfour1.Data(), FFTW_ESTIMATE);
702 fftwf_plan plan2 = fftwf_plan_dft_r2c_1d(vx.Size(), vx.Data(),
703 (fftwf_complex*)cfour2.Data(), FFTW_ESTIMATE);
704 pmutfftw->unlock();
705
706 uint_4 ifile = 0;
707 uint_4 nzm = 0; // Nb de paquets moyennes pour le calcul de chaque spectre
708 uint_4 nmoyspec = 0; // Nb de spectres moyennes
709
710 uint_4 curfc=0;
711 uint_8 curtt=0;
712 uint_8 firsttt=0;
713 bool fgfirst=true;
714 double moysig[2]={0.,0.};
715 double sigsig[2]={0.,0.};
716 uint_8 nbsig[2]={0,0};
717
718 for (uint_4 kmz=0; kmz<nmax_; kmz++) {
719 if (stop_) break;
720 int mid = memgr.FindMemZoneId(MemZA_ProcA);
721 Byte* buff = memgr.GetMemZone(mid);
722 if (buff == NULL) {
723 cout << " BRProcA2C::run()/ERROR memgr.GetMemZone(" << mid << ") -> NULL" << endl;
724 break;
725 }
726 Byte* procbuff = memgr.GetProcMemZone(mid);
727 if (procbuff == NULL) {
728 cout << " BRProcA2C::run()/ERROR memgr.GetProcMemZone(" << mid << ") -> NULL" << endl;
729 break;
730 }
731//---- DELETE nmnt=0; ms1=ms2=ms12=ms12re=ms12im=ms12phi=0.;
732 for(uint_4 i=0; i<memgr.NbPaquets(); i++) {
733 BRPaquet paq(NULL, buff+i*paqsz, paqsz);
734 if (!pcheck.Check(paq)) continue; // on ne traite que les paquets OK
735 if (fgfirst) { firsttt=paq.TimeTag(); fgfirst=false; }
736 curfc=paq.FrameCounter();
737 curtt=paq.TimeTag()-firsttt;
738// Traitement voie 1
739 if (fghist_) {
740 for(sa_size_t j=0; j<vx.Size(); j++) {
741 r_4 vts=(fgraw_)?((r_4)(*(paq.Data1()+j))):((r_4)(*(paq.Data1S()+j)));
742 ph1->Add((r_8)vts);
743 moysig[0] += (double)vts;
744 sigsig[0] += ((double)vts)*((double)vts);
745 nbsig[0]++;
746 }
747 for(sa_size_t j=0; j<vx.Size(); j++) {
748 r_4 vts=(fgraw_)?((r_4)(*(paq.Data2()+j))):((r_4)(*(paq.Data2S()+j)));
749 ph2->Add((r_8)vts);
750 moysig[1] += (double)vts;
751 sigsig[1] += ((double)vts)*((double)vts);
752 nbsig[1]++;
753 }
754 }
755 if (fgraw_) {
756 for(sa_size_t j=0; j<vx.Size(); j++)
757 vx(j) = (r_4)(*(paq.Data1()+j))-127.5;
758 // fftwf_complex* coeff1 = (fftwf_complex*)(procbuff+i*procpaqsz);
759 fftwf_execute(plan1);
760 // Traitement voie 2
761 for(sa_size_t j=0; j<vx.Size(); j++)
762 vx(j) = (r_4)(*(paq.Data2()+j))-127.5;
763 fftwf_execute(plan2);
764 }
765 else {
766 for(sa_size_t j=1; j<cfour1.Size()-1; j++) {
767 cfour1(j) = complex<r_4>((r_4)paq.Data1C()[j].realB(), (r_4)paq.Data1C()[j].imagB());
768 cfour2(j) = complex<r_4>((r_4)paq.Data2C()[j].realB(), (r_4)paq.Data2C()[j].imagB());
769 }
770 cfour1(0) = complex<r_4>((r_4)paq.Data1C()[0].realB(), (r_4)0.);
771 cfour1(cfour1.Size()-1) = complex<r_4>((r_4)paq.Data1C()[0].imagB(), (r_4)0.);
772 cfour2(0) = complex<r_4>((r_4)paq.Data2C()[0].realB(), (r_4)0.);
773 cfour2(cfour2.Size()-1) = complex<r_4>((r_4)paq.Data2C()[0].imagB(), (r_4)0.);
774 }
775 for(sa_size_t j=0; j<spectreV1.Size(); j++)
776 spectreV1(j) += Zmod2(cfour1(j));
777 memcpy(procbuff+i*procpaqsz, cfour1.Data(), sizeof(complex<r_4>)*cfour1.Size());
778 if (fgtimfreq) { // Remplissage tableau temps-frequence
779 for(sa_size_t c=1; c<timfreqV1.NCols(); c++) {
780 for(sa_size_t j=c*nfsmap_; j<(c+1)*nfsmap_; j++)
781 timfreqV1(nzm, c) += Zmod2(cfour1(j));
782 }
783 }
784 for(sa_size_t j=0; j<spectreV2.Size(); j++)
785 spectreV2(j) += Zmod2(cfour2(j)); // Zmod2(zp2[j]);
786 memcpy(procbuff+i*procpaqsz+procpaqsz/2, cfour2.Data(), sizeof(complex<r_4>)*cfour2.Size());
787 if (fgtimfreq) { // Remplissage tableau temps-frequence
788 for(sa_size_t c=1; c<timfreqV2.NCols(); c++) {
789 for(sa_size_t j=c*nfsmap_; j<(c+1)*nfsmap_; j++)
790 timfreqV2(nzm,c) += Zmod2(cfour2(j));
791 }
792 }
793
794// Calcul correlation (visibilite V1 * V2)
795 for(sa_size_t j=0; j<visiV12.Size(); j++)
796 visiV12(j)+=cfour1(j)*conj(cfour2(j));
797// for(sa_size_t j=0; j<visiV12.Size(); j++) visiV12(j)+=zp1[j]*zp2[j];
798 if (nzm==0) {
799 spectreV1.Info()["StartFC"] = curfc;
800 spectreV2.Info()["StartFC"] = curfc;
801 visiV12.Info()["StartFC"] = curfc;
802 spectreV1.Info()["StartTT"] = curtt;
803 spectreV2.Info()["StartTT"] = curtt;
804 visiV12.Info()["StartTT"] = curtt;
805 }
806 nzm++;
807/*----DELETE
808 if (nmnt==0) { xnt[0]=paq.FrameCounter(); xnt[1]=paq.TimeTag(); }
809 for(sa_size_t j=2700; j<2800; j++) {
810 ms1 += Zmod2(cfour1(j)); ms2 += Zmod2(cfour2(j));
811 complex<r_4> zvis = cfour1(j)*conj(cfour2(j));
812 ms12 += Zmod2(zvis); ms12re += zvis.real(); ms12im += zvis.imag();
813 ms12phi+= atan2(zvis.imag(),zvis.real());
814 }
815 nmnt++;
816----*/
817 totnbytesproc += paq.DataSize();
818 totnbytesout += (2*sizeof(complex<r_4>)*cfour1.Size());
819
820 } // Fin de boucle sur les paquets d'une zone
821
822/*---- DELETE
823 if (nmnt>0) {
824 double fnorm = (double)nmnt*(2800-2700);
825 xnt[2] = ms1 /= fnorm;
826 xnt[3] = ms2 /= fnorm;
827 xnt[4] = ms12 /= fnorm;
828 xnt[5] = ms12re /= fnorm;
829 xnt[6] = ms12im /= fnorm;
830 xnt[7] = ms12phi /= fnorm;
831 nt.Fill(xnt);
832 }
833----*/
834 if ((nzm >= nmean_) || ((kmz==(nmax_-1))&&(nzm>1))) {
835 spectreV1 /= (r_4)(nzm);
836 spectreV2 /= (r_4)(nzm);
837
838 // pour le calcul des moyennes et sigmas de ces spectres
839 moyspecV1 += spectreV1;
840 moyspecV2 += spectreV2;
841 sigspecV1 += (spectreV1 && spectreV1);
842 sigspecV2 += (spectreV2 && spectreV2);
843 nmoyspec++;
844
845 visiV12 /= complex<r_4>((r_4)nzm, 0.);
846
847 spectreV1.Info()["NPaqMoy"] = nzm;
848 spectreV2.Info()["NPaqMoy"] = nzm;
849 visiV12.Info()["NPaqMoy"] = nzm;
850 spectreV1.Info()["EndFC"] = curfc;
851 spectreV2.Info()["EndFC"] = curfc;
852 visiV12.Info()["EndFC"] = curfc;
853 spectreV1.Info()["EndTT"] = curtt;
854 spectreV2.Info()["EndTT"] = curtt;
855 visiV12.Info()["EndTT"] = curtt;
856 {
857 sprintf(fname,"%s_%d.ppf",path_.c_str(),(int)ifile);
858 POutPersist po(fname);
859 string tag1="specV1";
860 string tag2="specV2";
861 string tag12="visiV12";
862 string tagh1="tshV1";
863 string tagh2="tshV2";
864 string tagtf1="timfreqV1";
865 string tagtf2="timfreqV2";
866 if (card_==2) {
867 tag1 = "specV3";
868 tag2 = "specV4";
869 tagh1 = "tshV1";
870 tagh2 = "tshV2";
871 tag12="visiV34";
872 tagtf1="timfreqV3";
873 tagtf2="timfreqV4";
874 }
875 po << PPFNameTag(tag1) << spectreV1;
876 po << PPFNameTag(tag2) << spectreV2;
877 po << PPFNameTag(tag12) << visiV12;
878 if (fghist_) {
879 po << PPFNameTag(tagh1) << (*ph1);
880 po << PPFNameTag(tagh2) << (*ph2);
881
882 double sspvmax[3] = {0.,0.,0.};
883 int_4 sspvmaxidx[3] = {-1,-1,-1};
884 for(int jji=1;jji<visiV12.Size()-1;jji++) {
885 r_4 zmv2 = Zmod2(visiV12(jji));
886 if (zmv2>sspvmax[2]) { sspvmax[2]=zmv2; sspvmaxidx[2]=jji; }
887 }
888 TVector<r_4>& sspv = spectreV1;
889 for(int ic=0; ic<2; ic++) {
890 if (ic==1) sspv = spectreV2;
891 for(int jji=1;jji<sspv.Size()-1;jji++)
892 if (sspv(jji)>sspvmax[ic]) { sspvmax[ic]=sspv(jji); sspvmaxidx[ic]=jji; }
893 if (nbsig[ic] < 1) { moysig[ic]=sigsig[ic]=-1.; }
894 else {
895 moysig[ic] /= (double)nbsig[ic];
896 sigsig[ic] /= (double)nbsig[ic];
897 sigsig[ic] -= (moysig[ic]*moysig[ic]);
898 sigsig[ic] = sqrt(sigsig[ic]);
899 cout << "===Voie " << ic << " Moy=" << moysig[ic] << " Sig=" << sigsig[ic]
900 << " MaxSpec Amp= " << sqrt(sspvmax[ic])/double(pq.DataSize()/2/2)
901 << " Pos=" << sspvmaxidx[ic] << " (NPts=" << nbsig[ic] << ")" << endl;
902 }
903 }
904 cout << "=== Voie1x2 MaxSpec Amp= " << sqrt(sqrt(sspvmax[2])/double(pq.DataSize()/2/2))
905 << " Pos=" << sspvmaxidx[2] << endl;
906 } // fin if (fghist_)
907
908 if (fgtimfreq) {
909 timfreqV1 /= (r_4)nzm;
910 timfreqV2 /= (r_4)nzm;
911 po << PPFNameTag(tagtf1) << timfreqV1;
912 po << PPFNameTag(tagtf2) << timfreqV2;
913 }
914 }
915 spectreV1 = (r_4)(0.);
916 spectreV2 = (r_4)(0.);
917 visiV12 = complex<r_4>(0., 0.);
918 if (fghist_) {
919 ph1->Zero();
920 ph2->Zero();
921 moysig[0]=moysig[1]=0.;
922 sigsig[0]=sigsig[1]=0.;
923 nbsig[0]=nbsig[1]=0;
924 }
925 if (fgtimfreq) {
926 timfreqV1 = (r_4)(0.);
927 timfreqV2 = (r_4)(0.);
928 }
929 nzm = 0; ifile++;
930// ts.SetNow();
931// filog << ts << " : proc file " << fname << endl;
932 cout << " BRProcA2C::run() created file " << fname << card2name_(card_) << endl;
933 }
934
935 memgr.FreeMemZone(mid, MemZS_ProcA);
936 } // Fin de boucle sur les zones a traiter
937 cout << " ------------ BRProcA2C::run() END " << card2name_(card_)
938 << " ------------ " << endl;
939/*---- DELETE
940 {
941 nt.Info()["FirstTT"]=firsttt;
942 cout << nt;
943 sprintf(fname,"%s_nt.ppf",path_.c_str());
944 POutPersist po(fname);
945 po << PPFNameTag("ntv12") << nt;
946 cout << " BRProcA2C::run() created NTuple file " << fname << card2name_(card_) << endl;
947 }
948---- */
949 if (nmoyspec>0) { // Calcul des moyennes et sigmas des spectres
950 r_4 fnms = nmoyspec;
951 moyspecV1 /= fnms;
952 moyspecV2 /= fnms;
953 sigspecV1 /= fnms;
954 sigspecV2 /= fnms;
955 sigspecV1 -= (moyspecV1 && moyspecV1);
956 sigspecV2 -= (moyspecV2 && moyspecV2);
957 sigspecV1 = Sqrt(sigspecV1);
958 sigspecV2 = Sqrt(sigspecV2);
959 TVector<r_4> rsbV1, rsbV2; // Rapport signal/bruit
960 moyspecV1.DivElt(sigspecV1, rsbV1, false, true);
961 moyspecV2.DivElt(sigspecV2, rsbV2, false, true);
962 sprintf(fname,"%s_ms.ppf",path_.c_str());
963 POutPersist po(fname);
964 po << PPFNameTag("moyspecV1") << moyspecV1;
965 po << PPFNameTag("moyspecV2") << moyspecV2;
966 po << PPFNameTag("sigspecV1") << sigspecV1;
967 po << PPFNameTag("sigspecV2") << sigspecV2;
968 po << PPFNameTag("rsbV1") << rsbV1;
969 po << PPFNameTag("rsbV2") << rsbV2;
970 cout << " BRProcA2C::run() created moysigspec file " << fname << card2name_(card_) << endl;
971 }
972
973 if (fghist_) {
974 delete ph1;
975 delete ph2;
976 }
977 ts.SetNow();
978 tm.SplitQ();
979 cout << " TotalProc= " << totnbytesproc/(1024*1024) << " MBytes, rate= "
980 << (double)(totnbytesproc)/1024./tm.PartialElapsedTimems() << " MB/s"
981 << " ProcDataOut=" << totnbytesout/(1024*1024) << " MB" << endl;
982 cout << pcheck;
983 cout << " BRProcA2C::run()/Timing: " << card2name_(card_) << endl;
984 tm.Print();
985 cout << " ---------------------------------------------------------- " << endl;
986
987 }
988 catch (PException& exc) {
989 cout << " BRProcA2C::run()/catched PException " << exc.Msg() << endl;
990 setRC(3);
991 return;
992 }
993 catch(...) {
994 cout << " BRProcA2C::run()/catched unknown ... exception " << endl;
995 setRC(4);
996 return;
997 }
998 setRC(0);
999 return;
1000}
1001
1002//---------------------------------------------------------------------
1003// Classe thread de traitement 2 x 2 voies/frames (Apres BRProcA2C)
1004//---------------------------------------------------------------------
1005
1006/* --Methode-- */
1007BRProcB4C::BRProcB4C(RAcqMemZoneMgr& mem1, RAcqMemZoneMgr& mem2, string& path,
1008 bool fgraw, uint_4 nmean, uint_4 nmax, bool fgnotrl)
1009 : memgr1(mem1), memgr2(mem2)
1010{
1011 fgraw_ = fgraw;
1012 nmax_ = nmax;
1013 nmean_ = nmean;
1014 if (fgraw_) cout << " BRProcB4C::BRProcB4C() - constructeur RAW data - NMean= " << nmean_ << endl;
1015 else cout << " BRProcB4C::BRProcB4C() - constructeur FFT data - NMean= " << nmean_ << endl;
1016 stop_ = false;
1017 path_ = path;
1018 fgnotrl_ = fgnotrl;
1019}
1020
1021/* --Methode-- */
1022void BRProcB4C::Stop()
1023{
1024 stop_=true;
1025 // cout <<" BRProcB4C::Stop ... > STOP " << endl;
1026}
1027
1028
1029/* --Methode-- */
1030void BRProcB4C::run()
1031{
1032 setRC(1);
1033 try {
1034 Timer tm("BRProcB4C", false);
1035 TimeStamp ts;
1036 BRPaqChecker pcheck1(!fgnotrl_); // Verification/comptage des paquets
1037 BRPaqChecker pcheck2(!fgnotrl_); // Verification/comptage des paquets
1038
1039 size_t totnbytesout = 0;
1040 size_t totnbytesproc = 0;
1041
1042 cout << " BRProcB4C::run() - Starting " << ts << " NMaxMemZones=" << nmax_
1043 << " NMean=" << nmean_ << endl;
1044 cout << " BRProcB4C::run()... - Output Data Path: " << path_ << endl;
1045
1046 uint_4 paqsz = memgr1.PaqSize();
1047 uint_4 procpaqsz = memgr1.ProcPaqSize();
1048 if ((paqsz != memgr2.PaqSize())||(procpaqsz!= memgr2.ProcPaqSize())) {
1049 cout << "BRProcB4C::run()/ERROR : different paquet size -> stop \n ...(PaqSz1="
1050 << paqsz << " Sz2=" << memgr2.PaqSize() << " ProcPaqSz1="
1051 << procpaqsz << " Sz2=" << memgr2.ProcPaqSize() << " )" << endl;
1052 setRC(9);
1053 return;
1054 }
1055
1056 TVector< complex<r_4> > cfour; // composant TF
1057 BRPaquet pq(NULL, NULL, paqsz);
1058/*
1059 TVector<r_4> vx(pq.DataSize()/2);
1060 vx = (r_4)(0.);
1061 FFTPackServer ffts;
1062 ffts.FFTForward(vx, cfour);
1063
1064 TVector< complex<r_4> > visiV13( cfour.Size() );
1065 TVector< complex<r_4> > visiV14( cfour.Size() );
1066 TVector< complex<r_4> > visiV23( cfour.Size() );
1067 TVector< complex<r_4> > visiV24( cfour.Size() );
1068*/
1069 int szfour = pq.DataSize()/2/2+1;
1070// int szfour = (paqsz-40)/2+1;
1071 TVector< complex<r_4> > visiV13( szfour );
1072 TVector< complex<r_4> > visiV14( szfour );
1073 TVector< complex<r_4> > visiV23( szfour );
1074 TVector< complex<r_4> > visiV24( szfour );
1075 // cout << " *DBG*AAAAA ---- Vectors OK" << endl;
1076 cout << " *DBG*BRProcB4C PaqSz=" << paqsz << " ProcPaqSize=" << procpaqsz
1077 << " procpaqsz/2=" << procpaqsz/2 << " cfour.Size()=" << szfour
1078 << " *8=" << szfour*8 << endl;
1079
1080 DataTable dt;
1081 dt.AddLongColumn("fc1");
1082 dt.AddLongColumn("tt1");
1083 dt.AddLongColumn("fc2");
1084 dt.AddLongColumn("tt2");
1085 DataTableRow dtr = dt.EmptyRow();
1086
1087 uint_4 nzm = 0;
1088 uint_4 totnoksfc = 0;
1089 uint_4 totnokpaq = 0;
1090 uint_4 totnpaq = 0;
1091 uint_4 ifile = 0;
1092
1093 uint_4 curfc=0;
1094 uint_8 curtt=0;
1095 uint_4 curfc2=0;
1096 uint_8 curtt2=0;
1097 uint_8 firsttt=0;
1098 uint_8 firsttt2=0;
1099 bool fgfirst=true;
1100 for (uint_4 kmz=0; kmz<nmax_; kmz++) {
1101 uint_4 noksfc = 0;
1102 uint_4 nokpaq = 0;
1103 if (stop_) break;
1104 // cout << " *DBG*BBBBB" << kmz << endl;
1105
1106 int mid1 = memgr1.FindMemZoneId(MemZA_ProcB);
1107 Byte* buff1 = memgr1.GetMemZone(mid1);
1108 if (buff1 == NULL) {
1109 cout << " BRProcB4C::run()/ERROR memgr.GetMemZone(" << mid1 << ") -> NULL" << endl;
1110 break;
1111 }
1112 Byte* procbuff1 = memgr1.GetProcMemZone(mid1);
1113 if (procbuff1 == NULL) {
1114 cout << " BRProcB4C::run()/ERROR memgr.GetProcMemZone(" << mid1 << ") -> NULL" << endl;
1115 break;
1116 }
1117 int mid2 = memgr2.FindMemZoneId(MemZA_ProcB);
1118 Byte* buff2 = memgr2.GetMemZone(mid2);
1119 if (buff1 == NULL) {
1120 cout << " BRProcB4C::run()/ERROR memgr.GetMemZone(" << mid2 << ") -> NULL" << endl;
1121 break;
1122 }
1123 Byte* procbuff2 = memgr2.GetProcMemZone(mid2);
1124 if (procbuff2 == NULL) {
1125 cout << " BRProcB4C::run()/ERROR memgr.GetProcMemZone(" << mid2 << ") -> NULL" << endl;
1126 break;
1127 }
1128 uint_4 i1,i2;
1129 i1=i2=0;
1130// cout << " *DBG*CCCCCC " << kmz << " memgr1.NbPaquets() =" << memgr1.NbPaquets() << endl;
1131 while((i1<memgr1.NbPaquets())&&(i2<memgr2.NbPaquets())) {
1132 BRPaquet paq1(NULL, buff1+i1*paqsz, paqsz);
1133 BRPaquet paq2(NULL, buff2+i2*paqsz, paqsz);
1134 totnpaq++;
1135// cout << " DBG["<<kmz<<"] i1,i2=" << i1 <<","<<i2<<" FC1,FC2=" <<paq1.FrameCounter()
1136//<<","<<paq2.FrameCounter()<<endl;
1137 // on ne traite que les paquets OK
1138 if (!pcheck1.Check(paq1)) { i1++; continue; }
1139 if (!pcheck2.Check(paq2)) { i2++; continue; }
1140 nokpaq++;
1141 if (paq1.FrameCounter()<paq2.FrameCounter()) { i1++; continue; }
1142 if (paq2.FrameCounter()<paq1.FrameCounter()) { i2++; continue; }
1143// cout << " DBG["<<kmz<<"]OKOK i1,i2=" << i1 <<","<<i2<<" FC1,FC2=" <<paq1.FrameCounter()
1144// <<","<<paq2.FrameCounter()<<endl;
1145
1146 if ((i1>=memgr1.NbPaquets())||(i2>=memgr1.NbPaquets())) {
1147 cout << " *BUG*BUG i1=" << i1 << " i2=" << i2 << endl;
1148 break;
1149 }
1150 // Les deux framecounters sont identiques ...
1151 noksfc++;
1152 curfc=paq1.FrameCounter();
1153 curfc2=paq2.FrameCounter();
1154 if (fgfirst) {
1155 firsttt=paq1.TimeTag(); firsttt2=paq2.TimeTag();
1156 cout << " BRProcB4C()/Info First FC="<<curfc<<" , "<<curfc2<<" -> TT="
1157 << firsttt<<" , "<<firsttt2 <<endl;
1158 fgfirst=false;
1159 }
1160 curtt=paq1.TimeTag()-firsttt;
1161 curtt2=paq2.TimeTag()-firsttt2;
1162 dtr[0]=curfc; dtr[1]=curtt;
1163 dtr[2]=curfc2; dtr[3]=curtt2;
1164 dt.AddRow(dtr);
1165
1166 complex<r_4>* zp1 = (complex<r_4>*)(procbuff1+i1*procpaqsz);
1167 complex<r_4>* zp2 = (complex<r_4>*)(procbuff1+i1*procpaqsz+procpaqsz/2);
1168 complex<r_4>* zp3 = (complex<r_4>*)(procbuff2+i2*procpaqsz);
1169 complex<r_4>* zp4 = (complex<r_4>*)(procbuff2+i2*procpaqsz+procpaqsz/2);
1170 for(sa_size_t j=0; j<visiV13.Size(); j++) {
1171 visiV13(j)+=zp1[j]*conj(zp3[j]);
1172 visiV14(j)+=zp1[j]*conj(zp4[j]);
1173 visiV23(j)+=zp2[j]*conj(zp3[j]);
1174 visiV24(j)+=zp2[j]*conj(zp4[j]);
1175 }
1176 if (nzm==0) {
1177 visiV13.Info()["StartFC"] = curfc;
1178 visiV14.Info()["StartFC"] = curfc;
1179 visiV23.Info()["StartFC"] = curfc;
1180 visiV24.Info()["StartFC"] = curfc;
1181 visiV13.Info()["StartTT"] = curtt;
1182 visiV14.Info()["StartTT"] = curtt;
1183 visiV23.Info()["StartTT"] = curtt;
1184 visiV24.Info()["StartTT"] = curtt;
1185 }
1186 nzm++; i1++; i2++;
1187 totnbytesproc += 2*paq1.DataSize();
1188 } // Fin de boucle sur les paquets d'une zone
1189 memgr1.FreeMemZone(mid1, MemZS_ProcB);
1190 memgr2.FreeMemZone(mid2, MemZS_ProcB);
1191
1192 if ((nzm >= nmean_) || ((kmz==(nmax_-1))&&(nzm>1))) {
1193 visiV13 /= complex<r_4>((r_4)nzm, 0.);
1194 visiV14 /= complex<r_4>((r_4)nzm, 0.);
1195 visiV23 /= complex<r_4>((r_4)nzm, 0.);
1196 visiV24 /= complex<r_4>((r_4)nzm, 0.);
1197 visiV13.Info()["NPaqMoy"] = nzm;
1198 visiV14.Info()["NPaqMoy"] = nzm;
1199 visiV23.Info()["NPaqMoy"] = nzm;
1200 visiV24.Info()["NPaqMoy"] = nzm;
1201 visiV13.Info()["EndFC"] = curfc;
1202 visiV14.Info()["EndFC"] = curfc;
1203 visiV23.Info()["EndFC"] = curfc;
1204 visiV24.Info()["EndFC"] = curfc;
1205 visiV13.Info()["EndTT"] = curtt;
1206 visiV14.Info()["EndTT"] = curtt;
1207 visiV23.Info()["EndTT"] = curtt;
1208 visiV24.Info()["EndTT"] = curtt;
1209 char fname[512];
1210 {
1211 sprintf(fname,"%s_%d.ppf",path_.c_str(),(int)ifile);
1212 POutPersist po(fname);
1213 po << PPFNameTag("visiV13") << visiV13;
1214 po << PPFNameTag("visiV14") << visiV14;
1215 po << PPFNameTag("visiV23") << visiV23;
1216 po << PPFNameTag("visiV24") << visiV24;
1217 }
1218 visiV13 = complex<r_4>(0., 0.);
1219 visiV14 = complex<r_4>(0., 0.);
1220 visiV23 = complex<r_4>(0., 0.);
1221 visiV24 = complex<r_4>(0., 0.);
1222 nzm = 0; ifile++;
1223// ts.SetNow();
1224// filog << ts << " : proc file " << fname << endl;
1225 cout << " BRProcB4C::run() created file " << fname << endl;
1226 }
1227 double okfrac = (nokpaq>1)?((double)noksfc/(double)nokpaq*100.):0.;
1228 cout << "BRProcB4C ["<<kmz<<"] NOKPaq=" << nokpaq << " NSameFC=" << noksfc
1229 << " (" << okfrac << " %)" << endl;
1230 totnokpaq += nokpaq;
1231 totnoksfc += noksfc;
1232 } // Fin de boucle sur les zones a traiter
1233 cout << " ------------------ BRProcB4C::run() END ----------------- " << endl;
1234 {
1235 dt.Info()["FirstTT1"]=firsttt;
1236 dt.Info()["FirstTT2"]=firsttt2;
1237 cout << dt;
1238 char fname[512];
1239 sprintf(fname,"%s_fctt.ppf",path_.c_str());
1240 POutPersist po(fname);
1241 po << PPFNameTag("ttfc") << dt;
1242 cout << " BRProcB4C::run() created TimeTag/FrameCounter file " << fname << endl;
1243 }
1244 ts.SetNow();
1245 tm.SplitQ();
1246 cout << " TotalProc= " << totnbytesproc/(1024*1024) << " MBytes, rate= "
1247 << (double)(totnbytesproc)/1024./tm.PartialElapsedTimems() << " MB/s" << endl;
1248 double totokfrac = (totnokpaq>1)?((double)totnoksfc/(double)totnokpaq*100.):0.;
1249 cout << " NOkPaq1,2=" << totnokpaq << " /TotNPaq=" << totnpaq << " TotNSameFC="
1250 << totnoksfc << " (" << totokfrac << " %)" << endl;
1251// cout << pcheck1;
1252// cout << pcheck2;
1253 cout << " BRProcB4C::run()/Timing: \n";
1254 tm.Print();
1255 cout << " ---------------------------------------------------------- " << endl;
1256}
1257 catch (PException& exc) {
1258 cout << " BRProcB4C::run()/catched PException " << exc.Msg() << endl;
1259 setRC(3);
1260 return;
1261 }
1262 catch(...) {
1263 cout << " BRProcB4C::run()/catched unknown ... exception " << endl;
1264 setRC(4);
1265 return;
1266 }
1267 setRC(0);
1268 return;
1269}
1270
1271
Note: See TracBrowser for help on using the repository browser.