source: Sophya/trunk/AddOn/TAcq/brbaseproc.cc@ 4005

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

Ajout possibilite de faire un DataTable (NTuple) avec la puissance spectrale dans plusieurs bandes en fonction du temps, Reza 13/05/2011

File size: 7.4 KB
Line 
1//----------------------------------------------------------------
2// Projet BAORadio - (C) LAL/IRFU 2008-2010
3// Classes de base pour les threads de traitememt donnees BAORadio
4//----------------------------------------------------------------
5
6#include <stdlib.h>
7#include <string.h>
8#include <unistd.h>
9#include <fstream>
10#include "brbaseproc.h"
11
12
13using namespace SOPHYA;
14//---------------------------------------------------------------------
15// Classe BRBaseProcessor : classe de base pour l'analyse des donnees
16// BAORadio - Les classes de traitement heritent de cette classe et
17// redefinissent la mathode Process() qui est appele paquet par paquet
18//---------------------------------------------------------------------
19
20/* --Methode-- */
21BRBaseProcessor::BRBaseProcessor(RAcqMemZoneMgr& memgr, MemZaction mmact)
22 : memgr_(memgr), fbuff_(memgr.NbFibres()), fprocbuff_(memgr.NbFibres()),
23 vpaq_(memgr.NbFibres()), vprocpaq_(memgr.NbFibres()),
24 vpchk_(memgr.NbFibres()), vfgok_(memgr.NbFibres()),
25 curfc_(memgr.NbFibres()), fcfirst_(memgr.NbFibres()), ttfirst_(memgr.NbFibres())
26{
27 SetMemZAction(mmact);
28 stop_ = false;
29 for(size_t fib=0; fib<(size_t)memgr_.NbFibres(); fib++) {
30 fbuff_[fib]=NULL;
31 fprocbuff_[fib]=NULL;
32 vpaq_[fib]=BRPaquet(NULL,memgr_.PaqSize());
33 vprocpaq_[fib]=NULL;
34 vpchk_[fib]=BRPaqChecker(true,0);
35 vfgok_[fib]=true;
36 curfc_[fib]=0;
37 fcfirst_[fib]=0;
38 ttfirst_[fib]=0;
39 }
40 fgokallfibers_=true;
41 totprocnpaq_=0;
42 startdate_=0;
43 setNameId("baseproc",0);
44 ClearProcTimeWindow();
45 SetPrintLevel();
46}
47
48/* --Methode-- */
49MemZStatus BRBaseProcessor::SetMemZAction(MemZaction mmact)
50{
51 mmact_=mmact;
52 mmsta_=MemZS_ProcA;
53 switch (mmact) {
54 case MemZA_ProcA:
55 mmsta_=MemZS_ProcA;
56 break;
57 case MemZA_ProcB:
58 mmsta_=MemZS_ProcB;
59 break;
60 case MemZA_ProcC:
61 mmsta_=MemZS_ProcC;
62 break;
63 case MemZA_ProcD:
64 mmsta_=MemZS_ProcD;
65 break;
66 case MemZA_ProcE:
67 mmsta_=MemZS_ProcE;
68 break;
69 case MemZA_ProcF:
70 mmsta_=MemZS_ProcF;
71 break;
72 case MemZA_ProcG:
73 mmsta_=MemZS_ProcG;
74 break;
75 case MemZA_ProcH:
76 mmsta_=MemZS_ProcH;
77 break;
78 case MemZA_ProcI:
79 mmsta_=MemZS_ProcI;
80 break;
81 case MemZA_ProcJ:
82 mmsta_=MemZS_ProcI;
83 break;
84 default:
85 mmact_=MemZA_ProcA;
86 mmsta_=MemZS_ProcA;
87 break;
88 }
89 return mmsta_;
90}
91
92/* --Methode-- */
93void BRBaseProcessor::run()
94{
95 setRC(1);
96 int rc=0;
97 try {
98 cout << "BRBaseProcessor[" << bpnom_ << "," << bpid_ << "]::run() - Starting " << " NFibers="
99 << memgr_.NbFibres() << endl;
100 if (fgproctimewin_) cout << " BRBaseProcessor...TimeWindow Start=" << tmstart_ << " End=" << tmend_ << endl;
101
102 size_t paqsz=memgr_.PaqSize();
103 size_t procpaqsz=memgr_.ProcPaqSize();
104
105 double tstartdays = tmstart_.ToDays();
106 double tenddays = tmend_.ToDays();
107
108 bool fgrun=true;
109 while (fgrun) {
110 if (stop_) break;
111 if (memgr_.GetRunState() == MemZR_Stopped) break;
112 mid_ = memgr_.FindMemZoneId(mmact_); // (MemZA_ProcA);
113 // Byte* buffg = memgr_.GetMemZone(mid_);
114 // if (buffg == NULL) {
115 if (mid_ < 0) {
116 cout << "BRBaseProcessor[" << bpnom_ << "," << bpid_ << "]::run()/ERROR FindMemZoneId("
117 << (int)mmact_ << ") ->" << mid_ << ") -> NULL" << endl;
118 setRC(7); fgrun=false;
119 break;
120 }
121 cts_=memgr_.GetAuxData(mid_)->FillTime(); // get associated date/time (DATEOBS)
122 if (startdate_==0) startdate_=cts_.DaysPart();
123
124 for(size_t fib=0; fib<(size_t)memgr_.NbFibres(); fib++) {
125 fbuff_[fib] = memgr_.GetMemZone(mid_,fib);
126 if (fbuff_[fib] == NULL) { // cela ne devrait pas arriver
127 cout << "BRBaseProcessor[" << bpnom_ << "," << bpid_ << "]::run()/ERROR memgr.GetMemZone("
128 << mid_ << "," << fib << ") -> NULL" << endl;
129 setRC(9); fgrun=false;
130 break;
131 }
132 if ((procpaqsz>0)&&((fprocbuff_[fib]=memgr_.GetProcMemZone(mid_,fib))==NULL)) { // cela ne devrait pas arriver non plus
133 cout << "BRBaseProcessor[" << bpnom_ << "," << bpid_ << "]::run()/ERROR memgr.GetProcMemZone("
134 << mid_ << "," << fib << ") -> NULL" << endl;
135 setRC(9); fgrun=false;
136 break;
137 }
138 }
139
140 // On ne traite les paquets que si pas de fenetre en temps ou tmstart_ <= FillTime() <= tmend_
141 double ftmdays = memgr_.GetAuxData(mid_)->FillTime().ToDays();
142 if ((!fgproctimewin_) || ( (ftmdays<=tenddays)&&(ftmdays>=tstartdays) ) ) {
143
144 for(size_t jp=0; jp<memgr_.NbPaquets(); jp++) { // boucle sur les paquets d'une zone
145 fgokallfibers_=true;
146 for(size_t fib=0; fib<(size_t)memgr_.NbFibres(); fib++) {
147 vpaq_[fib].Set(fbuff_[fib]+jp*paqsz);
148 vfgok_[fib]=vpchk_[fib].Check(vpaq_[fib],curfc_[fib]);
149 if (!vfgok_[fib]) fgokallfibers_=false;
150 if (procpaqsz>0) vprocpaq_[fib] = fprocbuff_[fib]+jp*procpaqsz;
151 }
152 //--- Traitement
153 int rcp=0;
154 if (fgokallfibers_) {
155 if (totprocnpaq_==0) {
156 for(size_t fib=0; fib<(size_t)memgr_.NbFibres(); fib++) {
157 fcfirst_[fib]=curfc_[fib];
158 ttfirst_[fib]=vpaq_[fib].TimeTag();
159 }
160 }
161 rcp=Process();
162 totprocnpaq_++;
163 }
164 // if (rcp != 0) { fgrun=false; break; }
165 } // Fin de boucle sur les paquets
166 } // Fin de test pour fenetre en temps de traitement des paquets
167
168 memgr_.FreeMemZone(mid_, mmsta_); // (MemZS_ProcA);
169 } // Fin de boucle sur les zones a traiter
170 //------------------------------------
171 cout << " ---- END BRBaseProcessor[" << bpnom_ << "," << bpid_ << "]::run() , TotNbProcPaq="
172 << totprocnpaq_ << endl;
173 /*
174 for(size_t fib=0; fib<(size_t)memgr_.NbFibres(); fib++) vpchk_[fib].Print();
175 cout << " ------------------------------------ " << endl;
176 */
177 }
178 catch (std::exception& exc) {
179 cout << "BRBaseProcessor[" << bpnom_ << "," << bpid_ << "]::run()/catched std::exception " << exc.what() << endl;
180 setRC(98);
181 return;
182 }
183 catch(...) {
184 cout << "BRBaseProcessor[" << bpnom_ << "," << bpid_ << "]::run()/catched unknown ... exception " << endl;
185 setRC(99);
186 return;
187 }
188
189}
190
191
192/* --Methode-- */
193int BRBaseProcessor::Process()
194{
195 // Cette methode est appele pour chaque "trigger', cad la serie de paquets pour toutes les fibres
196 // la methode par defaut ne fait rien
197 // if (fgokallfibers_) { faire le traitement }
198 // return 0;
199 /* Exemple de code test */
200 if ((prtlev_>0)&&(totprocnpaq_ %prtmodulo_==0)) {
201 cout << " BRBaseProcessor::Process(totnpaq=" << totprocnpaq_ << ") ObsTime=" << getObsTime()
202 << " TimeTag=" << getCurTimeTagSeconds() << " s. FrameCounter=" << getCurFrameCounter() << endl;
203 if (prtlev_<2) return 0;
204 cout << " ... FrameCnt[0..." << memgr_.NbFibres()-1 << "]=" ;
205 for(size_t fib=0; fib<(size_t)memgr_.NbFibres(); fib++)
206 cout << getCurFrameCounter(fib) << "," ;
207 cout << endl;
208 cout << " ... TimeTag[0..." << memgr_.NbFibres()-1 << "]=" ;
209 for(size_t fib=0; fib<(size_t)memgr_.NbFibres(); fib++)
210 cout << getCurTimeTag(fib) << "," ;
211 cout << endl;
212 if (prtlev_<3) return 0;
213 cout << " ... TimeTagSeconds[0..." << memgr_.NbFibres()-1 << "]=" ;
214 for(size_t fib=0; fib<(size_t)memgr_.NbFibres(); fib++)
215 cout << getCurTimeTagSeconds(fib) << "," ;
216 cout << endl;
217 if (prtlev_<4) return 0;
218 cout << " ... FileSequenceNumber[0..." << memgr_.NbFibres()-1 << "]=" ;
219 for(size_t fib=0; fib<(size_t)memgr_.NbFibres(); fib++)
220 cout << memgr_.GetAuxData(mid_)->FileSequenceNumber(fib) << ",";
221 cout << endl;
222 }
223 return 0;
224}
225
Note: See TracBrowser for help on using the repository browser.