#include "array.h" #include "simtoipr.h" #include #include "toimanager.h" #include "pexceptions.h" #include "ctimer.h" SimpleDeglitcher::SimpleDeglitcher(int wsz, double ns, int maxnpt) { if (wsz < 5) wsz = 5; if (wsz%2 == 0) wsz++; if (maxnpt > wsz) maxnpt = wsz; cout << "SimpleDeglitcher::SimpleDeglitcher() WSize= " << wsz << " nSig=" << ns << " maxNPt=" << maxnpt << endl; wsize = wsz; nsig = ns; maxpoints = maxnpt; totnscount = glnscount = glcount = out_range_nscount = 0; deglitchdone = false; SetRange(-9.e39, 9.e39); } SimpleDeglitcher::~SimpleDeglitcher() { } void SimpleDeglitcher::PrintStatus(ostream & os) { os << "\n ------------------------------------------------------ \n" << " SimpleDeglitcher::PrintStatus() - WindowSize=" << WSize() << " NbSigmas=" << NbSigmas() << " MaxPoints=" << MaxPoints() << endl; os << " Range_Min= " << range_min << " Range_Max= " << range_max << endl; TOIProcessor::PrintStatus(os); if (deglitchdone) os << " Deglitching performed " << endl; else os << " NO deglitching done " << endl; double nst = (ProcessedSampleCount() > 0) ? ProcessedSampleCount() : 1.; os << " ProcessedSampleCount=" << ProcessedSampleCount() << " OutOfRangeSampleCount=" << OutOfRangeSampleCount() << endl; os << " GlitchCount= " << GlitchCount() << " GlitchSampleCount=" << GlitchSampleCount() << "( " << (double)GlitchSampleCount()*100./nst << " % )" << endl; os << " ------------------------------------------------------ " << endl; } void SimpleDeglitcher::init() { cout << "SimpleDeglitcher::init" << endl; declareInput("in"); declareOutput("out"); declareOutput("mean"); declareOutput("sigma"); declareOutput("incopie"); name = "SimpleDeglitcher"; // upExtra = 1; A quoi ca sert ? } void SimpleDeglitcher::run() { // TOIManager* mgr = TOIManager::getManager(); int snb = getMinIn(); int sne = getMaxIn(); bool fgout = checkOutputTOIIndex(0); bool fgmean = checkOutputTOIIndex(1); bool fgsigma = checkOutputTOIIndex(2); bool fgincopie = checkOutputTOIIndex(3); if (!checkInputTOIIndex(0)) { cerr << " SimpleDeglitcher::run() - Input TOI (in) not connected! " << endl; throw ParmError("SimpleDeglitcher::run() Input TOI (in) not connected!"); } if (!fgout && !fgmean && !fgsigma &&!fgincopie) { cerr << " SimpleDeglitcher::run() - No Output TOI connected! " << endl; throw ParmError("SimpleDeglitcher::run() No output TOI connected!"); } if (!fgout) { cout << "Warning: SimpleDeglitcher::run() - No TOI connected to out \n" << " No deglitching would be performed !" << endl; } cout << " SimpleDeglitcher::run() SNRange=" << snb << " - " << sne << endl; try { Timer tm("SimpleDeglitcher::run()"); // Le debut Vector vin(wsize); TVector vfg(wsize); int k; for(k=0; k range_max) ) { vin(k) = mean; vfg(k) |= 2; out_range_nscount++; } } s = vin.Sum(); mean = s/wsize; double s2 = vin.SumX2(); double sigma = sqrt(s2/wsize-mean*mean); int kgl = -1; int ii,lastput; bool fgglitch = false; double valcur,valsub,valadd; uint_8 fgcur; // Boucle sur les sampleNum for(k=0;k<=sne-snb;k++) { totnscount++; // if (k%10000 == 0) cout << " DBG: K=" << k << endl; // Calcul mean-sigma if (k>=wsize) { valsub = vin(k%wsize); vin(k%wsize) = valadd = getData(0, k+snb); vfg(k%wsize) = getFlag(0, k+snb); if ( (valadd < range_min) || (valadd > range_max) ) valadd = mean; s += (valadd-valsub); s2 += (valadd*valadd-valsub*valsub); mean = s/wsize; sigma = sqrt(s2/wsize-mean*mean); } // On gere les sorties Mean et Sigma if (fgmean) putData(1, k+snb, mean, 0); if (fgsigma) putData(2, k+snb, sigma, 0); if (fgincopie) putData(3, k+snb, vin(k%wsize), vfg(k%wsize)); valcur = vin(k%wsize); if ( (valcur < range_min) || (valcur > range_max) ) { vin(k%wsize) = valcur = mean; vfg(k%wsize) |= 2; out_range_nscount++; } if (!fgout) continue; // Pas de sortie out (deglitche) // if (k<100) { // cout << "DBG-A-Deglitch[" << k << "] mean=" // << mean << " sigma=" << sigma << " valcur=" // << valcur << " Kgl=" << kgl ; // if (fgglitch) cout << " In Glitch" ; // cout << endl; // } if (valcur < mean+nsig*sigma) { // inferieur au seuil if (fgglitch) { if (k-kgl < maxpoints) { // On vient de detecter un glitch glcount++; for(ii=kgl; ii= maxpoints) { // serie de points > seuil for(ii=kgl; ii<=k; ii++) // -> Donc pas glitch putData(0, ii+snb, vin(ii%wsize), vfg(ii%wsize)); lastput = snb+k; fgglitch = false; } } else { if (kgl < 0) { // debut possible de glitch fgglitch = true; kgl = k; } else { // On est toujours dans une serie > seuil putData(0, k+snb, valcur, fgcur); lastput = snb+k; } } } // if (k%5000 == 0) cout << " ---DBG2: K=" << k << " glcount=" // << glcount << " LastPut= " << lastput << endl; } // Fin de Boucle sur les num-sample //DBG cout << " La fin lastput=" << lastput << " SNE=" << sne; //DBG for(k=lastput-snb+1; k vfg(wsize); int k; for(k=0; k= nb_input)) throw RangeCheckError("SimpleAdder::SetGain() Out of range input number!"); gains(num) = g; return; } double SimpleAdder::Gain(int num) { if ((num < 0) || (num >= nb_input)) throw RangeCheckError("SimpleAdder::Gain() Out of range input number!"); return gains(num); } void SimpleAdder::PrintStatus(ostream & os) { os << "\n ------------------------------------------------------ \n" << " SimpleAdder::PrintStatus() - NbInput=" << NbInput() << endl; TOIProcessor::PrintStatus(os); os << " Gains= " ; for(int k=0; k