Changeset 1454 in Sophya for trunk/ArchTOIPipe/ProcWSophya/simtoipr.cc
- Timestamp:
- Apr 9, 2001, 2:14:21 PM (24 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/ArchTOIPipe/ProcWSophya/simtoipr.cc
r1443 r1454 1 1 #include "simtoipr.h" 2 #include <math.h> 2 3 #include "toimanager.h" 3 4 #include "pexceptions.h" … … 16 17 nsig = ns; 17 18 maxpoints = maxnpt; 18 totnscount = glnscount = glcount = 0;19 totnscount = glnscount = glcount = out_range_nscount = 0; 19 20 deglitchdone = false; 21 SetRange(-9.e39, 9.e39); 20 22 } 21 23 … … 23 25 { 24 26 } 27 25 28 26 29 void SimpleDeglitcher::PrintStatus(ostream & os) … … 29 32 << " SimpleDeglitcher::PrintStatus() - WindowSize=" << WSize() 30 33 << " NbSigmas=" << NbSigmas() << " MaxPoints=" << MaxPoints() << endl; 34 os << " Range_Min= " << range_min << " Range_Max= " << range_max << endl; 31 35 TOIProcessor::PrintStatus(os); 32 36 if (deglitchdone) os << " Deglitching performed " << endl; 33 37 else os << " NO deglitching done " << endl; 34 double nst = (TotalSampleCount() > 0) ? TotalSampleCount() : 1.; 35 os << " TotalSampleCount=" << TotalSampleCount() << " GlitchCount= " 36 << GlitchCount() << " GlitchSampleCount=" << GlitchSampleCount() 38 double nst = (ProcessedSampleCount() > 0) ? ProcessedSampleCount() : 1.; 39 os << " ProcessedSampleCount=" << ProcessedSampleCount() 40 << " OutOfRangeSampleCount=" << OutOfRangeSampleCount() << endl; 41 os << " GlitchCount= " << GlitchCount() 42 << " GlitchSampleCount=" << GlitchSampleCount() 37 43 << "( " << (double)GlitchSampleCount()*100./nst << " % )" << endl; 38 44 os << " ------------------------------------------------------ " << endl; … … 81 87 Timer tm("SimpleDeglitcher::run()"); 82 88 // Le debut 83 int wsz2 = wsize/2;84 89 Vector vin(wsize); 90 TVector<int_8> vfg(wsize); 85 91 int k; 86 for(k=0; k<wsize; k++) 92 for(k=0; k<wsize; k++) { 87 93 vin(k) = getData(0, k+snb); 94 vfg(k) = getFlag(0, k+snb); 95 } 88 96 double s = vin.Sum(); 89 97 double mean = s/wsize; 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 90 108 double s2 = vin.SumX2(); 91 109 double sigma = sqrt(s2/wsize-mean*mean); … … 94 112 bool fgglitch = false; 95 113 double valcur,valsub,valadd; 114 uint_8 fgcur; 115 116 // Boucle sur les sampleNum 117 96 118 for(k=0;k<=sne-snb;k++) { 97 119 totnscount++; 98 120 // if (k%10000 == 0) cout << " DBG: K=" << k << endl; 99 121 // Calcul mean-sigma 100 if ((k>wsz2) && (k<sne-snb-wsz2)) { 101 valsub = vin((k+wsz2)%wsize); 102 vin((k+wsz2)%wsize) = valadd = getData(0, k+wsz2+snb); 122 if (k>=wsize) { 123 valsub = vin(k%wsize); 124 vin(k%wsize) = valadd = getData(0, k+snb); 125 vfg(k%wsize) = getFlag(0, k+snb); 126 if ( (valadd < range_min) || (valadd > range_max) ) 127 valadd = mean; 103 128 s += (valadd-valsub); 104 129 s2 += (valadd*valadd-valsub*valsub); … … 112 137 if (fgsigma) 113 138 putData(2, k+snb, sigma, 0); 139 if (fgincopie) 140 putData(3, k+snb, vin(k%wsize), vfg(k%wsize)); 114 141 115 142 valcur = vin(k%wsize); 116 if (fgincopie) 117 putData(3, k+snb, valcur, 0); 143 if ( (valcur < range_min) || (valcur > range_max) ) { 144 vin(k%wsize) = valcur = mean; 145 vfg(k%wsize) |= 2; 146 out_range_nscount++; 147 } 118 148 119 149 if (!fgout) continue; // Pas de sortie out (deglitche) … … 133 163 glcount++; 134 164 for(ii=kgl; ii<k; ii++) { 135 putData(0, ii+snb, mean, 7);165 putData(0, ii+snb, mean, vfg(ii%wsize)|5); 136 166 glnscount++; 137 167 } … … 140 170 else { 141 171 for(ii=kgl; ii<k; ii++) { 142 putData(0, ii+snb, vin(ii%wsize), 0);172 putData(0, ii+snb, vin(ii%wsize), vfg(ii%wsize)); 143 173 } 144 174 lastput = snb+k-1; … … 153 183 if (k-kgl+1 >= maxpoints) { // serie de points > seuil 154 184 for(ii=kgl; ii<=k; ii++) // -> Donc pas glitch 155 putData(0, ii+snb, vin(ii%wsize), 0);185 putData(0, ii+snb, vin(ii%wsize), vfg(ii%wsize)); 156 186 lastput = snb+k; 157 187 fgglitch = false; … … 163 193 } 164 194 else { // On est toujours dans une serie > seuil 165 putData(0, k+snb, valcur, 0);195 putData(0, k+snb, valcur, fgcur); 166 196 lastput = snb+k; 167 197 } … … 178 208 // cout << " DBG3- OUT of try bloc ! " << endl; 179 209 cout << " SimpleDeglitcher::run() - End of processing " 180 << " TotalSampleCount=" << TotalSampleCount()210 << " ProcessedSampleCount=" << ProcessedSampleCount() 181 211 << " GlitchCount= " << GlitchCount() << endl; 182 212 if (fgout) deglitchdone = true; … … 189 219 190 220 221 // ------------------------------------------------------------------- 222 // Classe SimpleFilter : Filtre simple ds le domaine temporel 223 // ------------------------------------------------------------------- 224 225 string 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 } 191 249 192 250 SimpleFilter::SimpleFilter(int wsz, FilterKind fk, double a, double s) … … 195 253 if (wsz%2 == 0) wsz++; 196 254 cout << "SimpleFilter::SimpleFilter() wsz= " << wsz 197 << " fk=" << fk<< endl;255 << " FilterKind=" << FilterKind2String(fk) << endl; 198 256 wsize = wsz; 199 257 totnscount = 0; 200 258 coef = new double[wsz]; 201 for(int kk=0; kk<wsz; kk++) 202 coef[kk] = 1./wsize; 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 } 284 } 285 286 SimpleFilter::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.; 203 302 } 204 303 … … 217 316 for(int k=0; k<wsize; k++) os << coef[k] << " " ; 218 317 os << endl; 219 os << " TotalSampleCount=" << TotalSampleCount() << endl;318 os << " ProcessedSampleCount=" << ProcessedSampleCount() << endl; 220 319 os << " ------------------------------------------------------ " << endl; 221 320 } … … 257 356 int wsz2 = wsize/2; 258 357 Vector vin(wsize); 358 TVector<int_8> vfg(wsize); 259 359 int k; 260 for(k=0; k<wsize; k++) 261 vin(k) = getData(0, k+snb); 360 for(k=0; k<wsize; k++) { 361 vin(k%wsize) = getData(0, k+snb); 362 vfg(k%wsize) = getFlag(0, k+snb); 363 } 262 364 double mean = vin.Sum()/wsize; 263 for(k=0; k<wsize/2; k++) vin(k) = mean; 365 for(k=wsz2+1; k<wsize; k++) { 366 vin(k) = mean; 367 vfg(k) = 0; 368 } 369 int knext; 370 bool fgfin = false; 371 // Boucle sur les sampleNum 264 372 for(k=0;k<=sne-snb;k++) { 265 totnscount++;266 // Calcul mean-sigma267 if ((k>wsz2) && (k<sne-snb-wsz2))268 vin((k+wsz2)%wsize) = getData(0, k+snb);269 // if (k == sne-snb-wsz2) {270 // }271 373 double sortie = 0; 272 374 for(int ii=0; ii<wsize; ii++) { 273 sortie += vin((ii+k)%wsize)*coef[ii]; 274 } 275 putData(0,k+snb,sortie,0); 276 if (fgincopie) putData(1,k+snb,vin(k%wsize),0); 375 sortie += vin(ii)*coef[(ii+wsz2)%wsize]; 376 } 377 putData(0,k+snb,sortie,vfg(k%wsize)); 378 if (fgincopie) 379 putData(1, k+snb, vin(k%wsize), vfg(k%wsize)); 380 knext = k+wsz2+1; 381 if (knext<=(sne-snb)) { 382 vin(knext%wsize) = getData(0, knext+snb); 383 vfg(knext%wsize) = getFlag(0, knext+snb); 384 } 385 else { 386 if (!fgfin) { 387 mean = vin.Sum()/wsize; 388 fgfin = true; 389 } 390 vin(knext%wsize) = mean; 391 vfg(knext%wsize) = 0; 392 } 393 totnscount++; 277 394 } // Boucle sur les num-sample 278 395 cout << " SimpleFilter::run() - End of processing " << endl; … … 283 400 << "\n .... Msg= " << exc.Msg() << endl; 284 401 } 285 286 287 } 402 } 403 404 // --------------------------------------------------------------- 405 // -------------------- Classe SimpleAdder ----------------------- 406 // --------------------------------------------------------------- 407 408 SimpleAdder::SimpleAdder(int nbinput) 409 : gains(nbinput) 410 { 411 if (nbinput < 1) 412 throw ParmError("SimpleAdder::SimpleAdder() NbInput < 1 !"); 413 nb_input = nbinput; 414 for(int k=0; k<nb_input; k++) gains(k) = 1.; 415 totnscount = 0; 416 } 417 418 SimpleAdder::~SimpleAdder() 419 { 420 } 421 422 void SimpleAdder::SetGain(int num, double g) 423 { 424 if ((num < 0) || (num >= nb_input)) 425 throw RangeCheckError("SimpleAdder::SetGain() Out of range input number!"); 426 gains(num) = g; 427 return; 428 } 429 430 double SimpleAdder::Gain(int num) 431 { 432 if ((num < 0) || (num >= nb_input)) 433 throw RangeCheckError("SimpleAdder::Gain() Out of range input number!"); 434 return gains(num); 435 } 436 437 void SimpleAdder::PrintStatus(ostream & os) 438 { 439 os << "\n ------------------------------------------------------ \n" 440 << " SimpleAdder::PrintStatus() - NbInput=" << NbInput() << endl; 441 TOIProcessor::PrintStatus(os); 442 os << " Gains= " ; 443 for(int k=0; k<nb_input; k++) os << gains(k) << " " ; 444 os << endl; 445 os << " ProcessedSampleCount=" << ProcessedSampleCount() << endl; 446 os << " ------------------------------------------------------ " << endl; 447 } 448 449 void SimpleAdder::init() { 450 cout << "SimpleAdder::init NbInput=" << nb_input << endl; 451 char buff[32]; 452 for(int k=0; k<nb_input; k++) { 453 sprintf(buff,"in%d", k); 454 declareInput(buff); 455 } 456 457 declareOutput("out"); 458 name = "SimpleAdder"; 459 // upExtra = 1; 460 } 461 462 void SimpleAdder::run() { 463 // TOIManager* mgr = TOIManager::getManager(); 464 int snb = getMinIn(); 465 int sne = getMaxIn(); 466 467 bool fgout = checkOutputTOIIndex(0); 468 string msg_err; 469 for(int ki=0;ki<nb_input;ki++) { 470 if (!checkInputTOIIndex(ki)) { 471 msg_err = "SimpleAdder::run() - Input TOI (" + getInName(ki) + 472 " not connected!"; 473 cerr << msg_err << endl; 474 throw ParmError(msg_err); 475 } 476 } 477 if (!fgout) { 478 cerr << " SimpleAdder::run() - No Output TOI connected! " 479 << endl; 480 throw ParmError("SimpleAdder::run() No output TOI connected!"); 481 } 482 483 cout << " SimpleAdder::run() SNRange=" << snb << " - " << sne << endl; 484 485 486 try { 487 Timer tm("SimpleAdder::run()"); 488 int k,i; 489 double out = 0.; 490 unsigned long fgout = 0; 491 for(k=snb;k<=sne;k++) { 492 out = 0; 493 fgout = 0; 494 for(i=0; i<nb_input; i++) { 495 out += gains(i)*getData(i, k); 496 fgout = fgout | (unsigned int)getFlag(i,k); 497 } 498 putData(0,k,out,fgout); 499 totnscount++; 500 } // Boucle sur les num-sample 501 cout << " SimpleAdder::run() - End of processing " << endl; 502 } // Bloc try 503 504 catch (PException & exc) { 505 cerr << "SimpleAdder: Catched Exception " << (string)typeid(exc).name() 506 << "\n .... Msg= " << exc.Msg() << endl; 507 } 508 } 509 510 511
Note:
See TracChangeset
for help on using the changeset viewer.