diff --git a/src/cat/TPulseFinder.cc b/src/cat/TPulseFinder.cc index 1adcc8fadf24fd12e15e0d005455016fc1af3883..8a2d0c2c763bb3e80f0214c0543d82f02b1f6257 100644 --- a/src/cat/TPulseFinder.cc +++ b/src/cat/TPulseFinder.cc @@ -60,6 +60,8 @@ TPulseFinder::TPulseFinder() RegisterProcessorParameter("OffsetRange","minimum and maximum range of offset", fOffsetRange,range); + Register(fNumAvgPoints("NumAvgPoints","number of average points",5)); + } TPulseFinder::~TPulseFinder() { @@ -118,15 +120,27 @@ void TPulseFinder::Process() if (!fDoKeepInvalid && !hit->IsValid()) continue; const std::vector& sample = hit->GetSample(); - std::vector::const_iterator itbegin = sample.begin(); - std::vector::const_iterator itend = sample.end(); - std::vector::const_iterator it = sample.begin(); + std::vector smooth_sample(sample.size()); + for (Int_t i = 0, n = sample.size(); i < n; ++i) { + std::vector::const_iterator start = sample.begin() + i; + std::vector::const_iterator end = std::min(sample.end(),start + fNumAvgPoints); + smooth_sample[i] = std::accumulate(start,end,0.)/(std::distance(start,end)); + } + + std::vector::const_iterator itbegin = smooth_sample.begin(); + std::vector::const_iterator itend = smooth_sample.end(); + std::vector::const_iterator it = smooth_sample.begin(); std::vector::const_iterator itlead; std::vector::const_iterator itfirst; std::vector::const_iterator itlast; while (it != itend) { // find pulse over fRisingThreshold + Bool_t invalidNoLeading = kFALSE; + if (*it > fRisingThreshold) { + invalidNoLeading = kTRUE; + } + itlead = std::find_if(it,itend,std::bind2nd(std::greater(),fRisingThreshold)); it = itfirst = itlead; // break if no pulse is found @@ -135,8 +149,11 @@ void TPulseFinder::Process() // @todo remove magic number 100. (typical pulse length?) std::vector::const_iterator itmax = max_element(itfirst,itend); // find pulse end - itlast = std::find_if(itmax,itend,std::bind2nd(std::less(),fFallingThreshold)); - + itlast = std::find_if(itlead + fNumAvgPoints,itend,std::bind2nd(std::less(),fFallingThreshold)); + Bool_t invalidNoTrailing = kFALSE; + if (itlast == itend) { + invalidNoTrailing = kTRUE; + } // update first and last point itfirst = itfirst - fPrePulse; itlast = itlast + fPostPulse; @@ -194,7 +211,8 @@ void TPulseFinder::Process() Bool_t invalidNegativeCharge = (charge < 0); if ((!fDoKeepInvalid) && - (invalidOutOfOffsetRange || invalidLongPulse || invalidNegativeCharge)) { + (invalidOutOfOffsetRange || invalidLongPulse || + invalidNegativeCharge || invalidNoTrailing || invalidNoLeading)) { continue; } @@ -271,6 +289,9 @@ void TPulseFinder::Process() out->SetQualityBit(TCatPulseShape::kInvalid); } + if (invalidNoTrailing|| invalidNoLeading) { + out->SetQualityBit(TCatPulseShape::kInvalid); + } int num = outputSample.size(); out->SetNumSample(num); // optional output diff --git a/src/cat/TPulseFinder.h b/src/cat/TPulseFinder.h index 9e5a78b574b099733aac9cc95d92a31af5401525..2f61a2ae21cee33b9ba97139979abaa3ecf5cb90 100644 --- a/src/cat/TPulseFinder.h +++ b/src/cat/TPulseFinder.h @@ -49,6 +49,8 @@ protected: Int_t fNumSampleForBaseline; Bool_t fDoKeepInvalid; + Parameter fNumAvgPoints; + TF1 *fFunChargeRiseCompensation; //! DoubleVec_t fChargeRiseCompensation;