// ArchTOIPipe (C) CEA/DAPNIA/SPP IN2P3/LAL // Eric Aubourg // Christophe Magneville // Reza Ansari // $Id: simtoipr.cc,v 1.20 2002-05-16 13:13:00 ansari Exp $ #include "config.h" #include "array.h" #include "simtoipr.h" #include #include "toimanager.h" #include "pexceptions.h" #include "ctimer.h" #include "fftpserver.h" #include "flagtoidef.h" SimpleDeglitcher::SimpleDeglitcher(int wsz, double ns, int maxnpt, int minnpt) { SetWSize(wsz); SetDetectionParam(ns, ns/2., maxnpt, minnpt); SetRange(-9.e39, 9.e39); RepBadSamples(true, true); totnscount = glnscount = glcount = out_range_nscount = 0; srcfgcount = srcfgnscount = 0; deglitchdone = false; cout << "SimpleDeglitcher::SimpleDeglitcher() WSize= " << wsz << " nSig=" << ns << " maxNPt=" << maxnpt << endl; } SimpleDeglitcher::~SimpleDeglitcher() { } void SimpleDeglitcher::SetDetectionParam(double ns, double ns2, int maxnpt, int minnpt, int wszrec) { nsig = (ns > 0.01) ? ns : 1.; nsig2 = (ns2 > 0.01) ? ns2 : nsig/2.; maxpoints = ((maxnpt > 0) && (maxnpt <= wsize)) ? maxnpt : 5; minpoints = ((minnpt > 0) && (minnpt <= maxpoints)) ? minnpt : maxpoints/2; wrecsize = ((wszrec > 0) && (wszrec <= wsize)) ? wszrec : 2*maxpoints; } inline char * _Bool2YesNo(bool fg) { if (fg) return "YES" ; else return "NO" ; } void SimpleDeglitcher::PrintStatus(::ostream & os) { os << "\n ------------------------------------------------------ \n" << " SimpleDeglitcher::PrintStatus() - WindowSize=" << WSize() << " MaxPoints=" << MaxPoints() << " MinPoints=" << MinPoints() << endl; os << " NbSigmas=" << NbSigmas() << " NbSigmas2=" << NbSigmas2() << " WRecSize= " << WRecSize() << " Range_Min= " << range_min << " Range_Max= " << range_max << endl; os << " RepOutOfRangeSamples: " << _Bool2YesNo(rec_out_range_samples) << " RepGlitchSamples: " << _Bool2YesNo(rec_gl_samples) << " UseWRec: " << _Bool2YesNo(rec_use_wrec) << 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 << " SrcFgCount= " << SrcFgCount() << " SrcFgSampleCount=" << SrcFgSampleCount() << "( " << (double)SrcFgSampleCount()*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()"); Vector vin(wsize); Vector vas(wsize); int wrecsize = maxpoints*2; Vector vrec(wrecsize); TVector vfg(wsize); int wsz2 = wsize/2; // Le debut int k; for(k=0; k range_max) ) continue; s += vin(k); s2 += vin(k)*vin(k); nokdebut++; } if (nokdebut > 0) { mean = s/nokdebut; if (nokdebut > 1) sigma = sqrt(s2/nokdebut-mean*mean); } for(k=wsz2; k range_max) ) continue; vas(k) = vin(k); } for(k=0; k range_max) ) vrec(k)=mean; else vrec(k)=vin(k); } bool fgokdebut = false; int kgl = -1; int ii,lastput; bool fgglitch = false; double valcur,valsub,valadd; double lastvalok = mean; uint_8 fgcur; bool fgokcur=false; int sx_refresh_count = 0; int sx_refresh_count_max = 16*wsize; // Boucle sur les sampleNum int knext; int kfin = sne-snb; for(k=0;k<=kfin;k++) { totnscount++; // if (k%10000 == 0) cout << " DBG: K=" << k << endl; knext = k+wsz2; // Calcul mean-sigma if (knext<=kfin) { valsub = vas(knext%wsize); getData(0, knext+snb, vin(knext%wsize), vfg(knext%wsize)); valadd = vin(knext%wsize); if ( vfg(knext%wsize) || (valadd < range_min) || (valadd > range_max) ) { vas(knext%wsize) = valadd = mean; fgokcur = false; } else { vas(knext%wsize) = valadd = vin(knext%wsize); fgokcur = true; } if (!fgokdebut && fgokcur) { s += valadd; s2 += valadd*valadd; nokdebut++; mean = s/nokdebut; if (nokdebut > 1) sigma = sqrt(s2/nokdebut-mean*mean); if (nokdebut >= wsize) { fgokdebut = true; cout << " SimpleDeglitcher::DebugInfo - nokdebut=" << nokdebut << " k=" << k << " knext=" << knext << "\n ...DebugInfo mean=" << mean << " sigma=" << sigma << " s=" << s << " s2=" << s2 << endl; } } else { if (sx_refresh_count >= sx_refresh_count_max) { // On recalcule la somme s = vas.Sum(); s2 = vas.SumX2(); sx_refresh_count = 0; } else { s += (valadd-valsub); s2 += (valadd*valadd-valsub*valsub); sx_refresh_count++; } 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) ) { valcur = (rec_use_wrec) ? vrec.Sum()/wrecsize : mean; if (rec_out_range_samples) vin(k%wsize) = valcur; vfg(k%wsize) |= FlgToiOut; out_range_nscount++; } valcur = vin(k%wsize); fgcur = vfg(k%wsize); 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; // } double curnsig = (fgglitch) ? nsig2 : nsig; if (valcur < mean+curnsig*sigma) { // inferieur au seuil if (fgglitch) { if ( (k-kgl <= maxpoints) && (k-kgl >= minpoints) ) { // On vient de detecter un glitch glcount++; if (rec_gl_samples) { // On change la valeur des samples double recval = (rec_use_wrec) ? vrec.Sum()/wrecsize : mean; for(ii=kgl; ii maxpoints) { flg_src = FlgToiSource; // Si trop long srcfgcount++; srcfgnscount += (k-kgl); } 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)|FlgToiSource); srcfgcount++; srcfgnscount += (k-kgl+1); lastput = snb+k; fgglitch = false; vrec(k%wrecsize) = lastvalok = valcur; } } else { if (kgl < 0) { // debut possible de glitch fgglitch = true; kgl = k; } else { // On est toujours dans une serie > seuil putData(0, k+snb, vin(k%wsize), vfg(k%wsize)); srcfgnscount++; lastput = snb+k; lastvalok = valcur; } vrec(k%wrecsize) = lastvalok; } } // 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 vfg(wsize); TVector< complex > vfft, vfftmean; Vector meanpowerspectra; TVector< complex > zcoef(ffcoef.Size()); zcoef = ffcoef; FFTPackServer ffts; ffts.setNormalize(true); POutPersist pout(outppfname); int k,i,klast; int nks = 0; klast = snb-1; totnbblock = 0; // Boucle sur les sampleNum // 1er partie, on traite par paquets de wsize for(k=snb;k<=sne-wsize+1;k+=wsize) { for(i=0; i > vfftcopie; vfftcopie = vfft; string nomvfft = "spectra" + (string)MuTyV(nks); pout.PutObject(vfftcopie, nomvfft); nks++; } if (fgout) { vfft.MulElt(zcoef); ffts.FFTBackward(vfft, vout); } for(i=0; i((r_8)totnbblock, 0.); pout.PutObject(vfftmean, "meanspectra"); meanpowerspectra /= (r_8)totnbblock; pout.PutObject(vfftmean, "meanpowerspectra"); } pout.PutObject(ffcoef, "fourierfilter"); cout << " SimpleFourierFilter::run() - End of processing " << " NbFFTBlocks= " << totnbblock << endl; } // Bloc try catch (PException & exc) { cerr << "SimpleFourierFilter: Catched Exception " << (string)typeid(exc).name() << "\n .... Msg= " << exc.Msg() << endl; } } // --------------------------------------------------------------- // -------------------- Classe SimpleFanOut ----------------------- // --------------------------------------------------------------- SimpleFanOut::SimpleFanOut(int nbinput, int mfanout) { if (nbinput < 1) throw ParmError("SimpleFanOut::SimpleFanOut() NbInput < 1 !"); if (mfanout < 1) throw ParmError("SimpleFanOut::SimpleFanOut() M_FanOut < 1 !"); nb_input = nbinput; m_fanout = mfanout; totnscount = 0; } SimpleFanOut::~SimpleFanOut() { } void SimpleFanOut::PrintStatus(::ostream & os) { os << "\n ------------------------------------------------------ \n" << " SimpleFanOut::PrintStatus() - NbInput=" << NbInput() << " M_FanOut=" << MFanOut() << endl; TOIProcessor::PrintStatus(os); os << endl; os << " ProcessedSampleCount=" << ProcessedSampleCount() << endl; os << " ------------------------------------------------------ " << endl; } void SimpleFanOut::init() { cout << "SimpleFanOut::init NbInput=" << nb_input << endl; char buff[64]; for(int k=0; k in_index(nb_input); TMatrix out_index(nb_input, m_fanout); in_index = -1; out_index = -1; int nbconin = 0; char buff[64]; for(int ki=0;ki