source: Sophya/trunk/ArchTOIPipe/ProcWSophya/simtoipr.cc@ 1466

Last change on this file since 1466 was 1464, checked in by ansari, 24 years ago

1) Fin de passage des flags en int_8
2) TOIRegularWindow mis ds un fichier spare , Reza 11/4/2001

File size: 13.9 KB
RevLine 
[1462]1#include "array.h"
[1442]2#include "simtoipr.h"
[1454]3#include <math.h>
[1442]4#include "toimanager.h"
5#include "pexceptions.h"
6#include "ctimer.h"
7
8SimpleDeglitcher::SimpleDeglitcher(int wsz, double ns, int maxnpt)
9{
10 if (wsz < 5) wsz = 5;
11 if (wsz%2 == 0) wsz++;
12 if (maxnpt > wsz) maxnpt = wsz;
13
14 cout << "SimpleDeglitcher::SimpleDeglitcher() WSize= " << wsz
15 << " nSig=" << ns << " maxNPt=" << maxnpt << endl;
16
17 wsize = wsz;
18 nsig = ns;
19 maxpoints = maxnpt;
[1454]20 totnscount = glnscount = glcount = out_range_nscount = 0;
[1443]21 deglitchdone = false;
[1454]22 SetRange(-9.e39, 9.e39);
[1442]23}
24
25SimpleDeglitcher::~SimpleDeglitcher()
26{
27}
28
[1454]29
[1443]30void SimpleDeglitcher::PrintStatus(ostream & os)
31{
32 os << "\n ------------------------------------------------------ \n"
33 << " SimpleDeglitcher::PrintStatus() - WindowSize=" << WSize()
34 << " NbSigmas=" << NbSigmas() << " MaxPoints=" << MaxPoints() << endl;
[1454]35 os << " Range_Min= " << range_min << " Range_Max= " << range_max << endl;
[1443]36 TOIProcessor::PrintStatus(os);
37 if (deglitchdone) os << " Deglitching performed " << endl;
38 else os << " NO deglitching done " << endl;
[1454]39 double nst = (ProcessedSampleCount() > 0) ? ProcessedSampleCount() : 1.;
40 os << " ProcessedSampleCount=" << ProcessedSampleCount()
41 << " OutOfRangeSampleCount=" << OutOfRangeSampleCount() << endl;
42 os << " GlitchCount= " << GlitchCount()
43 << " GlitchSampleCount=" << GlitchSampleCount()
[1443]44 << "( " << (double)GlitchSampleCount()*100./nst << " % )" << endl;
45 os << " ------------------------------------------------------ " << endl;
46}
47
[1442]48void SimpleDeglitcher::init() {
49 cout << "SimpleDeglitcher::init" << endl;
50 declareInput("in");
51 declareOutput("out");
52 declareOutput("mean");
53 declareOutput("sigma");
[1443]54 declareOutput("incopie");
[1442]55 name = "SimpleDeglitcher";
56 // upExtra = 1; A quoi ca sert ?
57}
58
59void SimpleDeglitcher::run() {
60
61 // TOIManager* mgr = TOIManager::getManager();
62 int snb = getMinIn();
63 int sne = getMaxIn();
64
65 bool fgout = checkOutputTOIIndex(0);
66 bool fgmean = checkOutputTOIIndex(1);
67 bool fgsigma = checkOutputTOIIndex(2);
[1443]68 bool fgincopie = checkOutputTOIIndex(3);
[1442]69
70 if (!checkInputTOIIndex(0)) {
71 cerr << " SimpleDeglitcher::run() - Input TOI (in) not connected! "
72 << endl;
73 throw ParmError("SimpleDeglitcher::run() Input TOI (in) not connected!");
74 }
[1443]75 if (!fgout && !fgmean && !fgsigma &&!fgincopie) {
[1442]76 cerr << " SimpleDeglitcher::run() - No Output TOI connected! "
77 << endl;
78 throw ParmError("SimpleDeglitcher::run() No output TOI connected!");
79 }
80
81 if (!fgout) {
82 cout << "Warning: SimpleDeglitcher::run() - No TOI connected to out \n"
83 << " No deglitching would be performed !" << endl;
84 }
85
[1443]86 cout << " SimpleDeglitcher::run() SNRange=" << snb << " - " << sne << endl;
[1442]87 try {
[1443]88 Timer tm("SimpleDeglitcher::run()");
[1442]89 // Le debut
90 Vector vin(wsize);
[1454]91 TVector<int_8> vfg(wsize);
[1442]92 int k;
[1464]93 for(k=0; k<wsize; k++)
94 getData(0, k+snb, vin(k), vfg(k));
95
[1443]96 double s = vin.Sum();
[1442]97 double mean = s/wsize;
[1454]98 for(k=0; k<wsize; k++) {
99 if ( (vin(k) < range_min) || (vin(k) > range_max) ) {
100 vin(k) = mean;
101 vfg(k) |= 2;
102 out_range_nscount++;
103 }
104 }
105 s = vin.Sum();
106 mean = s/wsize;
107
[1442]108 double s2 = vin.SumX2();
109 double sigma = sqrt(s2/wsize-mean*mean);
110 int kgl = -1;
111 int ii,lastput;
112 bool fgglitch = false;
113 double valcur,valsub,valadd;
[1454]114 uint_8 fgcur;
115
116 // Boucle sur les sampleNum
117
[1443]118 for(k=0;k<=sne-snb;k++) {
[1442]119 totnscount++;
[1443]120// if (k%10000 == 0) cout << " DBG: K=" << k << endl;
[1442]121 // Calcul mean-sigma
[1454]122 if (k>=wsize) {
123 valsub = vin(k%wsize);
[1464]124 getData(0, k+snb, vin(k%wsize), vfg(k%wsize));
125 valadd = vin(k%wsize);
[1454]126 if ( (valadd < range_min) || (valadd > range_max) )
127 valadd = mean;
[1442]128 s += (valadd-valsub);
[1443]129 s2 += (valadd*valadd-valsub*valsub);
[1442]130 mean = s/wsize;
131 sigma = sqrt(s2/wsize-mean*mean);
132 }
133
134 // On gere les sorties Mean et Sigma
135 if (fgmean)
136 putData(1, k+snb, mean, 0);
137 if (fgsigma)
138 putData(2, k+snb, sigma, 0);
[1454]139 if (fgincopie)
140 putData(3, k+snb, vin(k%wsize), vfg(k%wsize));
[1442]141
[1443]142 valcur = vin(k%wsize);
[1454]143 if ( (valcur < range_min) || (valcur > range_max) ) {
144 vin(k%wsize) = valcur = mean;
145 vfg(k%wsize) |= 2;
146 out_range_nscount++;
147 }
[1443]148
[1442]149 if (!fgout) continue; // Pas de sortie out (deglitche)
150
[1443]151
152// if (k<100) {
153// cout << "DBG-A-Deglitch[" << k << "] mean="
154// << mean << " sigma=" << sigma << " valcur="
155// << valcur << " Kgl=" << kgl ;
156// if (fgglitch) cout << " In Glitch" ;
157// cout << endl;
158// }
[1442]159
160 if (valcur < mean+nsig*sigma) { // inferieur au seuil
161 if (fgglitch) {
162 if (k-kgl < maxpoints) { // On vient de detecter un glitch
163 glcount++;
164 for(ii=kgl; ii<k; ii++) {
[1454]165 putData(0, ii+snb, mean, vfg(ii%wsize)|5);
[1442]166 glnscount++;
167 }
168 lastput = snb+k-1;
169 }
170 else {
171 for(ii=kgl; ii<k; ii++) {
[1454]172 putData(0, ii+snb, vin(ii%wsize), vfg(ii%wsize));
[1442]173 }
174 lastput = snb+k-1;
175 }
176 }
177 putData(0, k+snb, valcur, 0);
178 lastput = snb+k;
179 kgl = -1; fgglitch = false;
180 }
181 else { // Superieur au seuil
182 if (fgglitch) {
183 if (k-kgl+1 >= maxpoints) { // serie de points > seuil
184 for(ii=kgl; ii<=k; ii++) // -> Donc pas glitch
[1454]185 putData(0, ii+snb, vin(ii%wsize), vfg(ii%wsize));
[1442]186 lastput = snb+k;
187 fgglitch = false;
188 }
189 }
190 else {
191 if (kgl < 0) { // debut possible de glitch
192 fgglitch = true; kgl = k;
193 }
194 else { // On est toujours dans une serie > seuil
[1454]195 putData(0, k+snb, valcur, fgcur);
[1442]196 lastput = snb+k;
197 }
198 }
199 }
200
[1443]201// if (k%5000 == 0) cout << " ---DBG2: K=" << k << " glcount="
202// << glcount << " LastPut= " << lastput << endl;
203 } // Fin de Boucle sur les num-sample
204
205 //DBG cout << " La fin lastput=" << lastput << " SNE=" << sne;
206 //DBG for(k=lastput-snb+1; k<sne-snb; k++)
207 //DBG putData(0, k+snb, vin(k%wsize), 0);
208 // cout << " DBG3- OUT of try bloc ! " << endl;
209 cout << " SimpleDeglitcher::run() - End of processing "
[1454]210 << " ProcessedSampleCount=" << ProcessedSampleCount()
[1443]211 << " GlitchCount= " << GlitchCount() << endl;
212 if (fgout) deglitchdone = true;
[1442]213 } // Bloc try
214 catch (PException & exc) {
215 cerr << "SimpleDeglitcher: Catched Exception " << (string)typeid(exc).name()
216 << "\n .... Msg= " << exc.Msg() << endl;
217 }
218}
219
220
[1454]221// -------------------------------------------------------------------
222// Classe SimpleFilter : Filtre simple ds le domaine temporel
223// -------------------------------------------------------------------
[1442]224
[1454]225string SimpleFilter::FilterKind2String(FilterKind fk)
226{
227 switch (fk) {
228 case UserFilter :
229 return ("UserFilter");
230 break;
231 case MeanFilter :
232 return ("MeanFilter");
233 break;
234 case SumFilter :
235 return ("SumFilter");
236 break;
237 case GaussFilter :
238 return ("GaussFilter");
239 break;
240 case DiffFilter :
241 return ("DiffFilter");
242 break;
243 default :
244 return ("ErrorFilterKind");
245 break;
246 }
247 return("");
248}
249
[1442]250SimpleFilter::SimpleFilter(int wsz, FilterKind fk, double a, double s)
251{
252 if (wsz < 3) wsz = 3;
253 if (wsz%2 == 0) wsz++;
254 cout << "SimpleFilter::SimpleFilter() wsz= " << wsz
[1454]255 << " FilterKind=" << FilterKind2String(fk) << endl;
[1442]256 wsize = wsz;
257 totnscount = 0;
258 coef = new double[wsz];
[1454]259 switch (fk) {
260 case UserFilter :
261 throw ParmError("SimpleFilter: Error in filter Kind (UserFilter)!");
262 break;
263 case MeanFilter :
264 for(int kk=0; kk<wsz; kk++)
265 coef[kk] = a/wsize;
266 break;
267 case SumFilter :
268 for(int kk=0; kk<wsz; kk++)
269 coef[kk] = a;
270 break;
271 case GaussFilter :
272 for(int kk=-(wsz/2); kk<=(wsz/2); kk++)
273 coef[kk] = a*exp((double)(kk*kk)/(s*s));
274 break;
275 case DiffFilter :
276 for(int kk=0; kk<wsz; kk++)
277 coef[kk] = -a/wsize;
278 coef[wsz/2+1] += 1.;
279 break;
280 default :
281 throw ParmError("SimpleFilter: Error in filter Kind (UnknownFilter)!");
282 break;
283 }
[1442]284}
285
[1454]286SimpleFilter::SimpleFilter(Vector const & vc)
287{
288 int wsz = vc.Size();
289 if (wsz < 3) wsz = 3;
290 if (wsz%2 == 0) wsz++;
291 FilterKind fk = UserFilter;
292 cout << "SimpleFilter::SimpleFilter(Vector & vc) vc.Size()= "
293 << vc.Size() << " WSize=" << wsz
294 << " FilterKind=" << FilterKind2String(fk) << endl;
295 wsize = wsz;
296 totnscount = 0;
297 coef = new double[wsz];
298 for(int kk=0; kk<vc.Size(); kk++)
299 coef[kk] = vc(kk);
300 for(int kk=vc.Size(); kk<wsz; kk++)
301 coef[kk] = 0.;
302}
303
[1442]304SimpleFilter::~SimpleFilter()
305{
306 delete[] coef;
307}
308
[1443]309void SimpleFilter::PrintStatus(ostream & os)
310{
311 os << "\n ------------------------------------------------------ \n"
312 << " SimpleFilter::PrintStatus() - WindowSize=" << WSize()
313 << " FilterKind= " << Type() << endl;
314 TOIProcessor::PrintStatus(os);
315 os << " Coeff= " ;
316 for(int k=0; k<wsize; k++) os << coef[k] << " " ;
317 os << endl;
[1454]318 os << " ProcessedSampleCount=" << ProcessedSampleCount() << endl;
[1443]319 os << " ------------------------------------------------------ " << endl;
320}
321
[1442]322void SimpleFilter::init() {
323 cout << "SimpleFilter::init" << endl;
324 declareInput("in");
325 declareOutput("out");
[1443]326 declareOutput("incopie");
[1442]327 name = "SimpleFilter";
328 // upExtra = 1;
329}
330
331void SimpleFilter::run() {
332 // TOIManager* mgr = TOIManager::getManager();
333 int snb = getMinIn();
334 int sne = getMaxIn();
335
336 bool fgout = checkOutputTOIIndex(0);
[1443]337 bool fgincopie = checkOutputTOIIndex(1);
[1442]338
339 if (!checkInputTOIIndex(0)) {
340 cerr << " SimpleFilter::run() - Input TOI (in) not connected! "
341 << endl;
342 throw ParmError("SimpleFilter::run() Input TOI (in) not connected!");
343 }
344 if (!fgout) {
345 cerr << " SimpleFilter::run() - No Output TOI connected! "
346 << endl;
347 throw ParmError("SimpleFilter::run() No output TOI connected!");
348 }
[1443]349
350 cout << " SimpleFilter::run() SNRange=" << snb << " - " << sne << endl;
[1442]351
352
353 try {
[1443]354 Timer tm("SimpleFilter::run()");
[1442]355 // Le debut
356 int wsz2 = wsize/2;
357 Vector vin(wsize);
[1454]358 TVector<int_8> vfg(wsize);
[1442]359 int k;
[1464]360 for(k=0; k<wsize; k++)
361 getData(0, k+snb, vin(k%wsize), vfg(k%wsize));
362
[1442]363 double mean = vin.Sum()/wsize;
[1454]364 for(k=wsz2+1; k<wsize; k++) {
365 vin(k) = mean;
366 vfg(k) = 0;
367 }
368 int knext;
369 bool fgfin = false;
370 // Boucle sur les sampleNum
[1443]371 for(k=0;k<=sne-snb;k++) {
[1442]372 double sortie = 0;
373 for(int ii=0; ii<wsize; ii++) {
[1454]374 sortie += vin(ii)*coef[(ii+wsz2)%wsize];
[1442]375 }
[1454]376 putData(0,k+snb,sortie,vfg(k%wsize));
377 if (fgincopie)
378 putData(1, k+snb, vin(k%wsize), vfg(k%wsize));
379 knext = k+wsz2+1;
[1464]380 if (knext<=(sne-snb))
381 getData(0, knext+snb, vin(knext%wsize), vfg(knext%wsize));
382
[1454]383 else {
384 if (!fgfin) {
385 mean = vin.Sum()/wsize;
386 fgfin = true;
387 }
388 vin(knext%wsize) = mean;
389 vfg(knext%wsize) = 0;
390 }
391 totnscount++;
[1442]392 } // Boucle sur les num-sample
[1443]393 cout << " SimpleFilter::run() - End of processing " << endl;
[1442]394 } // Bloc try
395
396 catch (PException & exc) {
397 cerr << "SimpleFilter: Catched Exception " << (string)typeid(exc).name()
398 << "\n .... Msg= " << exc.Msg() << endl;
399 }
[1454]400}
[1442]401
[1454]402// ---------------------------------------------------------------
403// -------------------- Classe SimpleAdder -----------------------
404// ---------------------------------------------------------------
[1442]405
[1454]406SimpleAdder::SimpleAdder(int nbinput)
407 : gains(nbinput)
408{
409 if (nbinput < 1)
410 throw ParmError("SimpleAdder::SimpleAdder() NbInput < 1 !");
411 nb_input = nbinput;
412 for(int k=0; k<nb_input; k++) gains(k) = 1.;
413 totnscount = 0;
[1442]414}
[1454]415
416SimpleAdder::~SimpleAdder()
417{
418}
419
420void SimpleAdder::SetGain(int num, double g)
421{
422 if ((num < 0) || (num >= nb_input))
423 throw RangeCheckError("SimpleAdder::SetGain() Out of range input number!");
424 gains(num) = g;
425 return;
426}
427
428double SimpleAdder::Gain(int num)
429{
430 if ((num < 0) || (num >= nb_input))
431 throw RangeCheckError("SimpleAdder::Gain() Out of range input number!");
432 return gains(num);
433}
434
435void SimpleAdder::PrintStatus(ostream & os)
436{
437 os << "\n ------------------------------------------------------ \n"
438 << " SimpleAdder::PrintStatus() - NbInput=" << NbInput() << endl;
439 TOIProcessor::PrintStatus(os);
440 os << " Gains= " ;
441 for(int k=0; k<nb_input; k++) os << gains(k) << " " ;
442 os << endl;
443 os << " ProcessedSampleCount=" << ProcessedSampleCount() << endl;
444 os << " ------------------------------------------------------ " << endl;
445}
446
447void SimpleAdder::init() {
448 cout << "SimpleAdder::init NbInput=" << nb_input << endl;
449 char buff[32];
450 for(int k=0; k<nb_input; k++) {
451 sprintf(buff,"in%d", k);
452 declareInput(buff);
453 }
454
455 declareOutput("out");
456 name = "SimpleAdder";
457 // upExtra = 1;
458}
459
460void SimpleAdder::run() {
461 // TOIManager* mgr = TOIManager::getManager();
462 int snb = getMinIn();
463 int sne = getMaxIn();
464
465 bool fgout = checkOutputTOIIndex(0);
466 string msg_err;
467 for(int ki=0;ki<nb_input;ki++) {
468 if (!checkInputTOIIndex(ki)) {
469 msg_err = "SimpleAdder::run() - Input TOI (" + getInName(ki) +
470 " not connected!";
471 cerr << msg_err << endl;
472 throw ParmError(msg_err);
473 }
474 }
475 if (!fgout) {
476 cerr << " SimpleAdder::run() - No Output TOI connected! "
477 << endl;
478 throw ParmError("SimpleAdder::run() No output TOI connected!");
479 }
480
481 cout << " SimpleAdder::run() SNRange=" << snb << " - " << sne << endl;
482
483
484 try {
485 Timer tm("SimpleAdder::run()");
486 int k,i;
487 double out = 0.;
[1464]488 double valin = 0.;
489 int_8 fgin = 0;
490 int_8 fgout = 0;
[1454]491 for(k=snb;k<=sne;k++) {
492 out = 0;
493 fgout = 0;
494 for(i=0; i<nb_input; i++) {
[1464]495 getData(i, k, valin, fgin);
496 out += gains(i)*valin;
497 fgout = fgout | fgin;
[1454]498 }
499 putData(0,k,out,fgout);
500 totnscount++;
501 } // Boucle sur les num-sample
502 cout << " SimpleAdder::run() - End of processing " << endl;
503 } // Bloc try
504
505 catch (PException & exc) {
506 cerr << "SimpleAdder: Catched Exception " << (string)typeid(exc).name()
507 << "\n .... Msg= " << exc.Msg() << endl;
508 }
509}
510
511
512
Note: See TracBrowser for help on using the repository browser.