1 #ifndef _sdet_StationTriggerAlgorithm_h_
2 #define _sdet_StationTriggerAlgorithm_h_
5 #include <sevt/StationTriggerData.h>
6 #include <sdet/StationTriggerInfo.h>
7 #include <sdet/UUBDownsampleFilter.h>
32 const unsigned int multiplicity,
const unsigned int n) :
40 const unsigned int multiplicity,
const unsigned int n) :
49 unsigned int coincidences = 0;
50 for (
unsigned int i = 0, n =
fThreshold.size(); i < n; ++i)
67 const unsigned int multiplicity,
const unsigned int n) :
75 const unsigned int multiplicity,
const unsigned int n) :
83 unsigned int coincidences = 0;
105 explicit Fifo(
const unsigned int length,
const T& init = T()) :
fFifo(length, init) { }
107 void Assign(
const unsigned int length,
const T& init = T())
108 {
fFifo.assign(length, init); }
114 const auto y =
fFifo.back();
131 const int minOccupancy,
const unsigned int window,
132 const unsigned int multiplicity,
const unsigned int n) :
138 template<
class Vector>
141 const int minOccupancy,
const unsigned int window,
142 const unsigned int multiplicity,
const unsigned int n) :
176 const double decrement,
const double threshold,
177 const double baseline,
178 const double baselineTolerance,
const double baselineStep,
179 const unsigned int n) :
190 template<
class Array>
193 const double decrement,
const double threshold,
194 const Array& baseline,
195 const double baselineTolerance,
const double baselineStep,
196 const unsigned int n) :
213 for (
unsigned int i = 0; i < n; ++i)
216 for (
unsigned int i = 0; i < n; ++i) {
218 const auto& value = v[i];
221 const auto windowIntegral =
fIntegralQueue[i].PushPop(currentIntegral);
222 currentIntegral += value - baseline -
fDecrement;
223 if (windowIntegral >
fThreshold || currentIntegral < 0)
226 if (currentIntegral > twiceThreshold)
227 currentIntegral = twiceThreshold;
242 }
else if (v < baseline) {
273 :
fFD(decayFD),
fFN(decayFN) { }
279 const int x =
std::max(current*64 - previous*
fFD, 0);
280 constexpr
int half = 1 << 9;
281 return std::min((x*
fFN + half) >> 10, 4096);
292 const int decayFD,
const int decayFN,
293 const unsigned int minCount,
const unsigned int window,
294 const unsigned int multiplicity,
const unsigned int n) :
299 for (
unsigned int i = 0; i < n; ++i)
303 template<
class Array>
306 const int decayFD,
const int decayFN,
307 const unsigned int minCount,
const unsigned int window,
308 const unsigned int multiplicity,
const unsigned int n) :
313 for (
unsigned int i = 0; i < n; ++i)
324 unsigned int mult = 0;
325 for (
unsigned int i = 0; i < n; ++i) {
326 const int value = v[i];
346 const int minUp,
const int maxUp,
347 const int vetoOffset) :
380 const auto prevCounts =
fCounts;
392 typedef std::numeric_limits<decltype(x)>
nl;
393 return nl::digits + nl::is_signed - 1 - __builtin_clz(x);
418 const int minUp,
const int maxUp,
const int vetoOffset,
419 const unsigned int multiplicity,
420 const unsigned int n) :
421 fStepCounter(n, { occupancy, window, minUp, maxUp, vetoOffset }),
428 unsigned int trig = 0;
429 for (
unsigned int i = 0, n =
fStepCounter.size(); i < n; ++i)
462 const int latchBin,
const int traceLength) :
473 template<
typename T,
template<
typename>
class Trace>
474 std::vector<StationTriggerInfo>
475 Run(
const int start,
const int stop,
const std::vector<
const Trace<T>*>& traces)
478 if (std::fabs(traces.front()->GetBinning() - binning)/binning < 1e-3)
482 const double uubBinning = binning / 3;
483 if (std::fabs(traces.front()->GetBinning() - uubBinning)/uubBinning > 1e-3) {
484 std::ostringstream err;
485 err <<
"The implemented trigger algorithms work correctly only for "
487 "while " << traces.front()->GetBinning()/
utl::nanosecond <<
" ns was received";
495 for (
auto& info : triggerInfos) {
496 const int scaledStart = 3*info.GetStart();
497 const int scaledLatch = 3*info.GetLatch();
499 info.SetStartLatchStop(scaledStart, scaledLatch, scaledStop);
505 template<
typename Trace>
506 std::vector<StationTriggerInfo>
507 RunUB(
const int start,
const int stop,
const int latch,
508 const std::vector<Trace>& traces,
const int traceLength)
510 std::vector<const Trace*> tracePtrs;
511 for (
const auto& t : traces)
512 tracePtrs.push_back(&t);
513 return RunUB(start, stop, latch, tracePtrs.size(), &tracePtrs.front(), traceLength);
521 template<
typename Trace>
522 std::vector<StationTriggerInfo>
523 RunUB(
const int start,
const int stop,
const int latch,
524 const int n,
const Trace*
const traces,
const int traceLength)
526 std::vector<StationTriggerInfo> info;
533 for ( ; i < stop; ++i) {
535 for (
int j = 0; j < n; ++j)
536 values[j] = (*traces[j])[i];
558 const int trigLatch = i;
559 const int trigStart = trigLatch - latch + 1;
560 const int trigStop = trigStart + traceLength;
562 const int iMax = std::min(trigStop, stop);
565 for (++i; i < iMax; ++i) {
567 for (
int j = 0; j < n; ++j)
568 values[j] = (*traces[j])[i];
581 info.emplace_back(pld, isT2Th.
GetMax(), trigStart, trigLatch, trigStop);
bool operator()(const int *const v) const
Trigger::TimeOverThreshold fTOTTrigger
std::vector< int > fPrevious
Threshold(const int threshold, const unsigned int multiplicity, const unsigned int n)
void UpdateBaseline(double &baseline, const int v)
std::vector< StationTriggerInfo > RunUB(const int start, const int stop, const int latch, const int n, const Trace *const traces, const int traceLength)
fMultiplicity(multiplicity)
const Deconvolution fDeconvolve
bool operator()(const int *const v)
std::vector< PositiveStepCounter > fStepCounter
StationTriggerAlgorithm(const Trigger::ThresholdUp &t1th, const Trigger::ThresholdUp &t2th, const Trigger::TimeOverThreshold &tot, const Trigger::DecayingIntegral &integ, const Trigger::TimeOverThresholdDeconvolved &totd, const Trigger::MultiplicityOfPositiveSteps &mops, const int latchBin, const int traceLength)
void operator()(const int *const v)
std::vector< TimeOverThreshold > fTimeOverThreshold
std::vector< Fifo< double > > fIntegralQueue
bool operator()(const int v)
int operator()(const int current, const int previous) const
const unsigned int fMultiplicity
const unsigned int fMultiplicity
Fifo(const unsigned int length, const T &init=T())
std::vector< double > fBaseline
TimeOverThresholdDeconvolved(const Array &threshold, const int decayFD, const int decayFN, const unsigned int minCount, const unsigned int window, const unsigned int multiplicity, const unsigned int n)
std::vector< StationTriggerInfo > RunUB(const int start, const int stop, const int latch, const std::vector< Trace > &traces, const int traceLength)
Trigger::Threshold fT2ThresholdTrigger
constexpr double nanosecond
utl::TraceI UUBDownsampleFilter(const utl::TraceI &trace, const int phase=1)
TimeOverThresholdDeconvolved(const int threshold, const int decayFD, const int decayFN, const unsigned int minCount, const unsigned int window, const unsigned int multiplicity, const unsigned int n)
ThresholdUp(const Array &threshold, const unsigned int multiplicity, const unsigned int n)
const double fBaselineTolerance
Trigger::MultiplicityOfPositiveSteps fMOPSTrigger
constexpr int FloorDiv(const int num, const int den)
Trigger::DecayingIntegral fIntegral
TimeOverThreshold(const int threshold, const int minOccupancy, const unsigned int window, const unsigned int multiplicity, const unsigned int n)
Local station hardware (PLD) and software (T2) trigger algorithm.
ThresholdUp(const int threshold, const unsigned int multiplicity, const unsigned int n)
Base class for inconsistency/illogicality exceptions.
static int IntLog2(unsigned int x)
TimeOverThreshold(const Vector &thresholds, const int minOccupancy, const unsigned int window, const unsigned int multiplicity, const unsigned int n)
const unsigned int fWindow
bool operator()(const int *const v)
unsigned int GetLength() const
void Assign(const unsigned int length, const T &init=T())
bool HasTriggered(const unsigned int i) const
std::vector< int > fPrevious
const unsigned int fMultiplicity
DecayingIntegral(const unsigned int window, const double decrement, const double threshold, const double baseline, const double baselineTolerance, const double baselineStep, const unsigned int n)
PositiveStepCounter(const int occupancy, const unsigned int window, const int minUp, const int maxUp, const int vetoOffset)
std::vector< StationTriggerInfo > Run(const int start, const int stop, const std::vector< const Trace< T > * > &traces)
Threshold(const Array &thresholds, const unsigned int multiplicity, const unsigned int n)
bool operator()(const int *const v, const DecayingIntegral &integ)
Trigger::TimeOverThresholdDeconvolved fTOTdTrigger
std::vector< int > fThreshold
const double fBaselineStep
MultiplicityOfPositiveSteps(const int occupancy, const unsigned int window, const int minUp, const int maxUp, const int vetoOffset, const unsigned int multiplicity, const unsigned int n)
Fifo< bool > fTriggersInWindow
Trigger::Threshold fT1ThresholdTrigger
Deconvolution(const int decayFD, const int decayFN)
TabulatedPDF::Array Array
bool Update(const int v, const bool isStep)
bool operator()(const int *const v, const DecayingIntegral &integ)
DecayingIntegral(const unsigned int window, const double decrement, const double threshold, const Array &baseline, const double baselineTolerance, const double baselineStep, const unsigned int n)
std::vector< double > fIntegral