7 #ifndef H_POTTU_DETECTOREVENTGENERATOR
8 #define H_POTTU_DETECTOREVENTGENERATOR
36 auto branch = createSubTree( results,
"detector_event_generator" );
37 _h_rectypes = createHistogram1DPow2( branch,
"rectypes", 2, 2 );
38 _h_infocodes = createHistogram1DPow2( branch,
"infocodes", 4, 4 );
40 _h_ch_data = createHistogram1DPow2( branch,
"ch_data", 12, 12 );
42 _h_ch_dataIgnored = createHistogram1DPow2( branch,
"ch_dataIgnored", 12, 12 );
43 _h_ch_trace = createHistogram1DPow2( branch,
"ch_trace", 12, 12 );
45 _h_ch_pileup = createHistogram1DPow2( branch,
"ch_pileup", 12, 12 );
46 _h_ch_overrange = createHistogram1DPow2( branch,
"ch_overrange", 12, 12 );
47 _h_ch_underrange = createHistogram1DPow2( branch,
"ch_underrange", 12, 12 );
48 _h_ch_overflow = createHistogram1DPow2( branch,
"ch_overflow", 12, 12 );
49 _h_ch_underflow = createHistogram1DPow2( branch,
"ch_underflow", 12, 12 );
51 _h_ch_pileup_marked = createHistogram1DPow2( branch,
"ch_pileup_marked", 12, 12 );
52 _h_ch_overrange_marked = createHistogram1DPow2( branch,
"ch_overrange_marked", 12, 12 );
53 _h_ch_underrange_marked = createHistogram1DPow2( branch,
"ch_underrange_marked", 12, 12 );
54 _h_ch_overflow_marked = createHistogram1DPow2( branch,
"ch_overflow_marked", 12, 12 );
55 _h_ch_underflow_marked = createHistogram1DPow2( branch,
"ch_underflow_marked", 12, 12 );
57 _h_ch_fail = createHistogram1DPow2( branch,
"ch_fail", 12, 12 );
58 _h_ch_veto = createHistogram1DPow2( branch,
"ch_veto", 12, 12 );
60 _h_ch_adcbit14 = createHistogram1DPow2( branch,
"ch_adcbit14", 12, 12 );
61 _h_ch_adcbit15 = createHistogram1DPow2( branch,
"ch_adcbit15", 12, 12 );
72 void process(
const std::vector<dataitem_ts_t> &input, std::vector<DetectorEvent> &output ) {
79 auto proci = _ctxh->processInstance();
84 #if POTTU_ENABLE_TRACES==1
85 std::vector<uint16_t> traceData;
88 std::size_t tracePos{0} ;
93 fillInteger( _h_rectypes, di.item.type.itemtype );
95 if( di.ts < _tsPrev ) {
96 _ctxh->logWarning( fmt::format(
"TimeOrder error: {} -> {}, {} s.\n input.size()={}, output.size()={}, counter={}",
97 _tsPrev, di.ts, (di.ts-_tsPrev)*1e-8 ,
98 input.size(), output.size(), counter ) );
100 ++_timeOrderErrorCounter;
104 std::move( _itemqueue.begin(), _itemqueue.end(), std::back_inserter(output) );
109 switch( di.item.getType() ) {
110 case itemtype_e::tracedata:
112 #if POTTU_ENABLE_TRACES==1
113 if( tracePos + 4 <= traceData.size() ) {
114 traceData[ tracePos++ ] = di.item.tracedata.sample0;
115 traceData[ tracePos++ ] = di.item.tracedata.sample1;
116 traceData[ tracePos++ ] = di.item.tracedata.sample2;
117 traceData[ tracePos++ ] = di.item.tracedata.sample3;
119 if( tracePos>0 && tracePos == traceData.size() ) {
121 if( _itemqueue.size() && _itemqueue.back().ch == traceCh && _itemqueue.back().time == traceTime ) {
122 _itemqueue.back().trace = std::move( traceData );
126 fmt::print(
"No dataitem found for trace {}\n", traceCh );
133 case itemtype_e::tracehead:
136 #if POTTU_ENABLE_TRACES==1
137 traceData.resize( di.item.tracehead.samplelength, 0 );
138 traceCh = di.item.tracehead.chi;
143 fillInteger( _h_ch_trace, di.item.tracehead.chi );
146 case itemtype_e::info:
149 fillInteger( _h_infocodes, di.item.info.code );
151 switch( di.item.info.getCode() ) {
152 case infocode_e::pileup: {
153 const auto ch = di.item.info.getChannelIdent();
155 fillInteger( _h_ch_pileup, ch );
158 for(
auto rit = _itemqueue.rbegin(); rit != _itemqueue.rend(); ++rit ) {
159 const auto tdiff = di.ts - rit->time;
160 if( tdiff > _pileupSearchtime )
162 if( rit->ch == ch ) {
164 fillInteger( _h_ch_pileup_marked, ch );
171 case infocode_e::adc_overrange:
173 const auto ch = di.item.info.getChannelIdent();
174 fillInteger( _h_ch_overrange, ch );
177 for(
auto rit = _itemqueue.rbegin(); rit != _itemqueue.rend(); ++rit ) {
178 const auto tdiff = di.ts - rit->time;
179 if( tdiff > _overrangeSearchtime )
181 if( rit->ch == ch ) {
182 rit->markOverrange();
183 fillInteger( _h_ch_overrange_marked, ch );
190 case infocode_e::adc_underrange:
192 const auto ch = di.item.info.getChannelIdent();
193 fillInteger( _h_ch_underrange, ch );
196 for(
auto rit = _itemqueue.rbegin(); rit != _itemqueue.rend(); ++rit ) {
197 const auto tdiff = di.ts - rit->time;
198 if( tdiff > _underrangeSearchtime )
200 if( rit->ch == ch ) {
201 rit->markUnderrange();
202 fillInteger( _h_ch_underrange_marked, ch );
209 case infocode_e::adc_overflow:
211 const auto ch = di.item.info.getChannelIdent();
212 fillInteger( _h_ch_overflow, ch );
215 for(
auto rit = _itemqueue.rbegin(); rit != _itemqueue.rend(); ++rit ) {
216 const auto tdiff = di.ts - rit->time;
217 if( tdiff > _overflowSearchtime )
219 if( rit->ch == ch ) {
221 fillInteger( _h_ch_overflow_marked, ch );
228 case infocode_e::adc_underflow:
230 const auto ch = di.item.info.getChannelIdent();
231 fillInteger( _h_ch_underflow, ch );
234 for(
auto rit = _itemqueue.rbegin(); rit != _itemqueue.rend(); ++rit ) {
235 const auto tdiff = di.ts - rit->time;
236 if( tdiff > _underflowSearchtime )
238 if( rit->ch == ch ) {
239 rit->markUnderflow();
240 fillInteger( _h_ch_underflow_marked, ch );
254 case itemtype_e::data:
256 fillInteger( _h_ch_data, di.item.data.chi );
257 if( di.item.data.veto )
258 fillInteger( _h_ch_veto, di.item.data.chi );
259 if( di.item.data.fail )
260 fillInteger( _h_ch_fail, di.item.data.chi );
261 if( di.item.data.adc >> 14 & 0x1 )
262 fillInteger( _h_ch_adcbit14, di.item.data.chi );
263 if( di.item.data.adc >> 15 & 0x1 )
264 fillInteger( _h_ch_adcbit15, di.item.data.chi );
269 det.ch = di.item.data.chi;
270 det.adc = di.item.data.adc;
275 #if POTTU_ENABLE_TRACES
276 if( traceData.size() && traceCh==det.ch && traceTime==det.time ) {
278 det.trace = std::move( traceData );
279 fmt::print(
"Trace found and assigned for {}\n", det.ch );
284 _itemqueue.push_back( std::move(det) );
294 if( _itemqueue.size() ) {
295 const int64_t lastTSForPop = _itemqueue.back().time - _queue_minlength;
297 auto it_last = std::upper_bound( _itemqueue.begin(), _itemqueue.end(), lastTSForPop,
299 return value < e.time; } );
300 std::move( _itemqueue.begin(), it_last, std::back_inserter(output) );
301 _itemqueue.erase( _itemqueue.begin(), it_last );
312 int64_t _queue_minlength{10000};
313 int64_t _pileupSearchtime{1000};
314 int64_t _underrangeSearchtime{1000};
315 int64_t _overrangeSearchtime{1000};
316 int64_t _underflowSearchtime{1000};
317 int64_t _overflowSearchtime{1000};
320 std::deque<DetectorEvent> _itemqueue;
323 uint64_t _timeOrderErrorCounter{0};
326 _histogram_1d_pow2_type *_h_rectypes;
327 _histogram_1d_pow2_type *_h_infocodes;
329 _histogram_1d_pow2_type *_h_ch_data;
330 _histogram_1d_pow2_type *_h_ch_dataIgnored;
331 _histogram_1d_pow2_type *_h_ch_trace;
333 _histogram_1d_pow2_type *_h_ch_pileup;
334 _histogram_1d_pow2_type *_h_ch_overrange;
335 _histogram_1d_pow2_type *_h_ch_underrange;
336 _histogram_1d_pow2_type *_h_ch_overflow;
337 _histogram_1d_pow2_type *_h_ch_underflow;
339 _histogram_1d_pow2_type *_h_ch_pileup_marked;
340 _histogram_1d_pow2_type *_h_ch_overrange_marked;
341 _histogram_1d_pow2_type *_h_ch_underrange_marked;
342 _histogram_1d_pow2_type *_h_ch_overflow_marked;
343 _histogram_1d_pow2_type *_h_ch_underflow_marked;
345 _histogram_1d_pow2_type *_h_ch_fail;
346 _histogram_1d_pow2_type *_h_ch_veto;
348 _histogram_1d_pow2_type *_h_ch_adcbit14;
349 _histogram_1d_pow2_type *_h_ch_adcbit15;
Handle to context used by specific class.
Definition: ContextBase.hpp:188
Class to process raw timestamped dataitems to DetectorEvents.
Definition: DetectorEventGenerator.hpp:31
void process(const std::vector< dataitem_ts_t > &input, std::vector< DetectorEvent > &output)
Feeds raw data in and gets processed detector events out.
Definition: DetectorEventGenerator.hpp:72
Event containing event information of one daq channel.
Definition: DetectorEvent.hpp:47
flags
Flag values used in the bitmask field flags.
Definition: DetectorEvent.hpp:94
Class holding tree of histograms and subtrees.
Definition: ObjectTree.hpp:44
Abstract baseclass for all stages which creates detector events.
Definition: StageStampedRawToDetectorEvent.hpp:19
Defines the raw low level dataitems used in tdr datastreams and files.
Definition: mainpage.dox:6
static ContextBase & getActive() noexcept
Returns active Context.
Definition: ContextBase.hpp:80
Raw dataitem with full timestamp.
Definition: dataitem.hpp:419