ATLAS Offline Software
Loading...
Searching...
No Matches
ByteStreamEmonInputSvc.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2026 CERN for the benefit of the ATLAS collaboration
3*/
4
5//===================================================================
6// Implementation of ByteStreamEmonInputSvc
7//===================================================================
8
9// Include files.
11
12#include "eformat/Version.h"
13#include "eformat/HeaderMarker.h"
14#include "eformat/DetectorMask.h"
15#include "oh/OHRootProvider.h"
16#include "rc/RunParamsNamed.h"
17#include "TProfile.h"
18#include "TEfficiency.h"
19#include "TProfile2D.h"
20
30
31#include <cstdlib>
32#include <csignal>
33#include <sstream>
34
35#include <memory>
36
37namespace {
38
39 void handle_terminate ATLAS_NOT_THREAD_SAFE (int)
40 {
41 // online wants
42 ::exit(0);
43 }
44}
45
46namespace {
47 void copyAttributes(TH1* prof, const TEfficiency* eff) {
48 // we take the profile as a TH1 since TProfile2D is not descended from TProfile
49 // code adapted from TEfficiency::FillHistogram
50 const auto* tot{eff->GetTotalHistogram()};
51
52 // set the axis labels
53 TString xlabel{tot->GetXaxis()->GetTitle()};
54 TString ylabel{tot->GetYaxis()->GetTitle()};
55 TString zlabel{tot->GetZaxis()->GetTitle()};
56 if (xlabel) prof->GetXaxis()->SetTitle(xlabel);
57 if (ylabel) prof->GetYaxis()->SetTitle(ylabel);
58 if (zlabel) prof->GetZaxis()->SetTitle(zlabel);
59
60 Int_t nbinsx = prof->GetNbinsX();
61 Int_t nbinsy = prof->GetNbinsY();
62
63 // copy axis labels if existing. Assume are there in the total histogram
64 if (tot->GetXaxis()->GetLabels() != nullptr) {
65 for (int ibinx = 1; ibinx <= nbinsx; ++ibinx)
66 prof->GetXaxis()->SetBinLabel(ibinx, tot->GetXaxis()->GetBinLabel(ibinx));
67 }
68 if (tot->GetYaxis()->GetLabels() != nullptr) {
69 for (int ibiny = 1; ibiny <= nbinsy; ++ibiny)
70 prof->GetYaxis()->SetBinLabel(ibiny, tot->GetYaxis()->GetBinLabel(ibiny));
71 }
72
73 //copying style information
74 eff->TAttLine::Copy(*prof);
75 eff->TAttFill::Copy(*prof);
76 eff->TAttMarker::Copy(*prof);
77 prof->SetStats(0);
78 }
79
80 std::unique_ptr<const TProfile> create1DProfile(const TEfficiency* eff) {
81 const auto* tot{eff->GetTotalHistogram()};
82 const auto* pass{eff->GetPassedHistogram()};
83 std::unique_ptr<TProfile> prof;
84 const auto* xaxis{tot->GetXaxis()};
85 if (xaxis->IsVariableBinSize()) {
86 prof = std::make_unique<TProfile>("eff_histo",eff->GetTitle(),
87 xaxis->GetNbins(), xaxis->GetXbins()->GetArray());
88 } else {
89 prof = std::make_unique<TProfile>("eff_histo",eff->GetTitle(),
90 xaxis->GetNbins(), xaxis->GetXmin(), xaxis->GetXmax());
91 }
92 prof->SetDirectory(0);
93
94 for (Int_t ibin = 0; ibin < tot->GetNbinsX()+2; ++ibin) {
95 auto center{tot->GetBinCenter(ibin)};
96 prof->Fill(center, 1, pass->GetBinContent(ibin));
97 prof->Fill(center, 0, tot->GetBinContent(ibin)-pass->GetBinContent(ibin));
98 prof->SetBinEntries(ibin, tot->GetBinContent(ibin));
99 }
100 copyAttributes(prof.get(), eff);
101
102 return prof;
103 }
104
105 std::unique_ptr<const TProfile2D> create2DProfile(const TEfficiency* eff) {
106 const auto* tot{eff->GetTotalHistogram()};
107 const auto* pass{eff->GetPassedHistogram()};
108 std::unique_ptr<TProfile2D> prof;
109 Int_t nbinsx{tot->GetNbinsX()};
110 Int_t nbinsy{tot->GetNbinsY()};
111 const auto* xaxis{tot->GetXaxis()};
112 const auto* yaxis{tot->GetYaxis()};
113
114 if (xaxis->IsVariableBinSize() && yaxis->IsVariableBinSize() ) {
115 prof = std::make_unique<TProfile2D>("eff_histo",
116 eff->GetTitle(), nbinsx, xaxis->GetXbins()->GetArray(),
117 nbinsy, yaxis->GetXbins()->GetArray());
118 } else if (xaxis->IsVariableBinSize() && ! yaxis->IsVariableBinSize() ) {
119 prof = std::make_unique<TProfile2D>("eff_histo",
120 eff->GetTitle(), nbinsx, xaxis->GetXbins()->GetArray(),
121 nbinsy, yaxis->GetXmin(), yaxis->GetXmax());
122 } else if (!xaxis->IsVariableBinSize() && yaxis->IsVariableBinSize() ) {
123 prof = std::make_unique<TProfile2D>("eff_histo",
124 eff->GetTitle(), nbinsx, xaxis->GetXmin(), xaxis->GetXmax(),
125 nbinsy, yaxis->GetXbins()->GetArray());
126 } else {
127 prof = std::make_unique<TProfile2D>("eff_histo",
128 eff->GetTitle(), nbinsx, xaxis->GetXmin(), xaxis->GetXmax(),
129 nbinsy, yaxis->GetXmin(), yaxis->GetXmax());
130 }
131 prof->SetDirectory(0);
132
133 for (Int_t ibinx = 0; ibinx < tot->GetNbinsX()+2; ++ibinx) {
134 auto centerx{tot->GetXaxis()->GetBinCenter(ibinx)};
135 for (Int_t ibiny = 0; ibiny < tot->GetNbinsY()+2; ++ibiny) {
136 auto centery{tot->GetYaxis()->GetBinCenter(ibiny)};
137 prof->Fill(centerx, centery, 1, pass->GetBinContent(ibinx, ibiny));
138 prof->Fill(centerx, centery, 0,
139 tot->GetBinContent(ibinx, ibiny)-pass->GetBinContent(ibinx, ibiny));
140 prof->SetBinEntries(prof->GetBin(ibinx, ibiny),
141 tot->GetBinContent(ibinx, ibiny));
142
143 }
144 }
145 copyAttributes(prof.get(), eff);
146
147 return prof;
148 }
149}
150
151// Constructor.
152ByteStreamEmonInputSvc::ByteStreamEmonInputSvc(const std::string& name, ISvcLocator* svcloc) :
153 base_class(name,svcloc),
154 m_inputMetaDataStore("StoreGateSvc/InputMetaDataStore", name ),
155 m_sgSvc("StoreGateSvc", name),
156 m_robProvider("ROBDataProviderSvc", name),
157 m_histSvc("THistSvc", name)
158{
159}
160
161// Open the first input file and read the first event.
163{
164 setProperty("State", "Init").ignore();
165
166 // check properties
167 if(m_partition.empty() && getenv("TDAQ_PARTITION") != 0) {
168 m_partition = getenv("TDAQ_PARTITION");
169 }
170
171 if(m_partition.empty()){
172 ATH_MSG_ERROR("initialize: No partition name specified");
173 return StatusCode::FAILURE;
174 }
175
176 if(m_key.empty()) {
177 ATH_MSG_ERROR("initialize: No emon key ");
178 return StatusCode::FAILURE;
179 }
180
181 m_connect = true;
182
183 if (m_histSvc.retrieve().isFailure()) {
184 ATH_MSG_ERROR("Unable to locate THistSvc");
185 m_is_server.clear();
186 } else {
187 if(!m_include.empty()) m_include_rex = m_include.value();
188 if(!m_exclude.empty()) m_exclude_rex = m_exclude.value();
189 if(m_frequency < 0) m_frequency = 100000;
191
192 // if time based update, disable frequency based update
193 if(m_updatePeriod) {
194 m_frequency = 0;
195 // calculate our next target for publishing
196 time_t now = time(0);
198 }
199 }
200
201 //-------------------------------------------------------------------------
202 // Setup the InputMetaDataStore
203 //-------------------------------------------------------------------------
204 ATH_CHECK( m_inputMetaDataStore.retrieve() );
205 ATH_CHECK( m_robProvider.retrieve() );
206
207 // Initialise the L1Menu read handle if we need to map L1 item names to IDs
208 ATH_CHECK(m_l1MenuKey.initialize(not m_l1names.value().empty()));
209
210 signal(SIGTERM, handle_terminate);
211
212 // Read run parameters from the partition
213 if (m_readDetectorMask) {
215 }
216
217 ATH_MSG_INFO("initialized for: " << m_partition << " " << m_key << "/" << m_value);
218
219 return StatusCode::SUCCESS;
220}
221
223{
224 setProperty("State", "Init").ignore();
225
226 if(!IPCCore::isInitialised()) {
227 char* argv[2] = { 0 };
228 int argc = 0;
229 IPCCore::init(argc, argv);
230 }
231
232 IPCPartition partition(m_partition);
233 while(!partition.isValid()) {
234 if(m_exit) {
235 ATH_MSG_ERROR("No such partition: " << m_partition);
236 return false;
237 }
238 ATH_MSG_INFO("No such partition (yet?): " << m_partition);
239 sleep(20);
240 }
241
242 delete m_provider;
243 m_provider = nullptr;
244
245 std::unique_ptr<emon::SamplingAddress> address;
246
247 if(m_key_count > 0) {
248 address.reset(new emon::SamplingAddress(m_key, m_key_count));
249 } else {
250 address.reset(new emon::SamplingAddress(m_key, m_value));
251 }
252
253 emon::Logic l1_logic = emon::logic::IGNORE;
254 emon::Logic stream_logic = emon::logic::IGNORE;
255 emon::Origin l1_origin = emon::origin::AFTER_VETO;
256
257 if(m_l1logic == "Or") {
258 l1_logic = emon::logic::OR;
259 } else if (m_l1logic == "And") {
260 l1_logic = emon::logic::AND;
261 } else if (m_l1logic == "Ignore") {
262 l1_logic = emon::logic::IGNORE;
263 }
264
265 if(m_l1origin == "TBP") {
266 l1_origin = emon::origin::BEFORE_PRESCALE;
267 } else if (m_l1origin == "TAP") {
268 l1_origin = emon::origin::AFTER_PRESCALE;
269 } else if(m_l1origin == "TAV") {
270 l1_origin = emon::origin::AFTER_VETO;
271 } else {
272 ATH_MSG_FATAL("Invalid L1 origin");
273 }
274
275 if(m_stream_logic == "Or") {
276 stream_logic = emon::logic::OR;
277 } else if (m_stream_logic == "And") {
278 stream_logic = emon::logic::AND;
279 } else if (m_stream_logic == "Ignore") {
280 stream_logic = emon::logic::IGNORE;
281 }
282
283 // now put together the bit mask from all
284 // three sources: l1 bit mask, l1 names, l1 items
285
286 std::vector<unsigned short> l1bits(m_l1items.begin(), m_l1items.end());
287
288 // if names are given, read the mapping information from L1Menu
289 if (not m_l1names.value().empty()) {
290 ATH_MSG_DEBUG("Reading L1Menu to map " << m_l1names.name() << " to CTP IDs");
292 if (not l1Menu.isValid()) {
293 ATH_MSG_ERROR("Cannot read L1Menu to map L1 item names to IDs. The property " << m_l1names.name() << " will be ignored!");
294 } else {
295 for (const std::string& l1name : m_l1names) {
296 try {
297 const unsigned int id = l1Menu->item(l1name).ctpId();
298 ATH_MSG_DEBUG("Item " << l1name << " mapped to CTP ID " << id);
299 l1bits.push_back(static_cast<unsigned short>(id));
300 } catch (const std::exception& ex) {
301 ATH_MSG_ERROR(ex.what());
302 continue;
303 }
304 }
305 }
306 }
307
308 typedef emon::MaskedValue<unsigned char> L1TriggerType;
309
310 emon::SmartBitValue l1pattern(l1bits, l1_logic, l1_origin);
311 emon::SmartStreamValue streamTags(m_stream_type, m_stream_names, stream_logic);
312
313 emon::L1TriggerType l1triggerType(static_cast<unsigned char>(m_trigger_type), m_trigger_type > 255);
314
315 emon::SelectionCriteria criteria(l1triggerType,
316 std::move(l1pattern),
317 std::move(streamTags),
318 emon::StatusWord());
319
320 while (true) {
321
322 if (partition.name() != m_partition) {
323 ATH_MSG_INFO("Partition name changed - reconnecting to " << m_partition);
324 return getIterator();
325 }
326
327 try {
328 m_eventIt = std::make_unique<emon::EventIterator>(partition, *address, criteria, m_buffer_size, m_groupName);
331 }
332 setProperty("State", "Connected").ignore();
333 return true;
334 } catch(ers::Issue& ex) {
335 ATH_MSG_INFO("Cannot connect to sampler (will wait 20s): " << m_key << "/" << m_value
336 << " Reason: " << ex.what());
337 sleep(20);
338 }
339 }
340}
341
342// Read previous event should not be called for this version of input svc
344{
345 ATH_MSG_WARNING("previousEvent not implemented for ByteStreamEmonInputSvc");
346
347 return nullptr;
348}
349
350// Read the next event.
352{
353 if (m_re) {
355 m_re->start(st);
356 if (st) delete [] st;
357 m_re.reset();
358 }
359
360 while(m_re == nullptr) {
361
362 if(m_connect) {
363
364 if(!getIterator()) {
365 return nullptr;
366 } else {
367 ATH_MSG_INFO("Got sampler...");
368 m_connect = false;
369 }
370 }
371
372 emon::Event event;
373 try {
374 int timeout = m_timeout;
375 if(m_updatePeriod) {
376 // try to hit lower end of update period
377 timeout = (m_publish_target - time(0) - int(m_updatePeriodRange * m_updatePeriod)) * 1000;
378 if(timeout <= 0) timeout = 1000;
379 }
380 event = m_eventIt->nextEvent(timeout);
381 } catch(emon::NoMoreEvents& ex) {
382 if(m_exit) {
383 return nullptr;
384 }
386 continue;
387 } catch (ers::Issue& ex) {
388 m_connect = true;
389 continue;
390 }
391
392 setProperty("State", "Processing").ignore();
393
395 memcpy(buf, event.data(), event.size() * sizeof(OFFLINE_FRAGMENTS_NAMESPACE::DataType));
396
397
398 if (buf[0] == eformat::FULL_EVENT) {
399
400 // We got a full event
401 m_re = std::make_unique<RawEvent>(buf);
402 try {
403 m_re->check_tree();
404 ATH_MSG_INFO("nextEvent: Got valid fragment of size:" << event.size());
405 } catch (ers::Issue& ex) {
406
407 // log in any case
408 std::stringstream ss;
409 ss << ex;
410 ATH_MSG_ERROR("nextEvent: Invalid event fragment: " << ss.str());
411
412 if(!m_corrupted_events) {
413
414 delete [] buf;
415 m_re.reset();
416 continue;
417 } // else fall through
418 }
419 m_robProvider->setNextEvent(Gaudi::Hive::currentContext(), m_re.get());
420 m_robProvider->setEventStatus(Gaudi::Hive::currentContext(), 0);
421
422 } else {
423 // We got something we didn't expect.
424 ATH_MSG_ERROR("nextEvent: Got invalid fragment of unknown type: 0x"
425 << std::hex << buf[0] << std::dec);
426 delete [] buf;
427 continue;
428 }
430 }
431
432 // generate DataHeader
433 DataHeader* Dh = new DataHeader();
434
435 // Declare header primary
437
438 // Now add ref to xAOD::EventInfo objects
441 StatusCode ioc = m_sgSvc->recordAddress("EventInfo",std::move(iop));
442 if (ioc.isSuccess()) {
443 const SG::DataProxy* ptmp = m_sgSvc->transientProxy(ClassID_traits<xAOD::EventInfo>::ID(), "EventInfo");
444 if (ptmp !=0) {
445 DataHeaderElement DheEI(ptmp, nullptr, "EventInfo");
446 Dh->insert(DheEI);
447 }
448 //else ATH_MSG_ERROR("Failed to create xAOD::EventInfo proxy " << ptmp);
449 }
450
451 // Now add ref to xAOD::EventAuxInfo objects
453 (new ByteStreamAddress(ClassID_traits<xAOD::EventAuxInfo>::ID(), "EventInfoAux.", ""));
454 StatusCode iocaux = m_sgSvc->recordAddress("EventInfoAux.",std::move(iopaux));
455 if (iocaux.isSuccess()) {
456 const SG::DataProxy* ptmpaux = m_sgSvc->transientProxy(ClassID_traits<xAOD::EventAuxInfo>::ID(), "EventInfoAux.");
457 if (ptmpaux !=0) {
458 DataHeaderElement DheEIAux(ptmpaux, nullptr, "EventInfoAux.");
459 Dh->insert(DheEIAux);
460 }
461 //else ATH_MSG_ERROR("Failed to create xAOD::EventAuxInfo proxy " << ptmpaux);
462 }
463
464 // Record new data header.Boolean flags will allow it's deletion in case
465 // of skipped events.
466 StatusCode rec_sg = m_sgSvc->record<DataHeader>(Dh, "ByteStreamDataHeader", true, false, true);
467 if (rec_sg != StatusCode::SUCCESS) {
468 ATH_MSG_ERROR("Fail to record BS DataHeader in StoreGate. Skipping events?! " << rec_sg);
469 }
470
471 // we got an event, check if we have to publish
473
474 return m_re.get();
475
476}
477
478// Get a pointer to the current event.
480{
481 return m_re.get();
482}
483
485{
486 // is a server specified ?
487 if(m_is_server.empty()) return;
488
489 // a time based update ?
490 if(m_updatePeriod) {
491 time_t now = time(0);
492
494 // it's too early to publish
495 return;
496 }
497
499 // it's too late
500 unsigned int missed_publications = 0;
501 while(m_publish_target < now) {
502 missed_publications++;
504 }
505
506 // do NOT publish, but print a warning
507 ATH_MSG_WARNING(" check_publish: missed " << missed_publications << " publications to OH");
508
509 return;
510 }
511 }
512
513 // an event based update ?
514 if(m_frequency && --m_frequency_counter > 0) return;
515
517
518 try {
519
520 if(m_provider == nullptr) {
521 IPCPartition part(m_partition);
522 if(!part.isValid()) return;
523 // might throw...
524 m_provider = new OHRootProvider(part, m_is_server, m_publish);
525 }
526
527 for(const std::string& name : m_histSvc->getHists()) {
528
529 if(!m_include.empty() && !regex_match(name, m_include_rex)) {
530 continue;
531 }
532
533 if(!m_exclude.empty() && regex_match(name, m_exclude_rex)) {
534 continue;
535 }
536
537 TH1 *h = nullptr;
538 if(m_histSvc->getHist(name, h)) {
539 // might throw...
540 auto name_tag = detail::extract_histogram_tag(name);
541 m_provider->publish(*h, name_tag.first, name_tag.second);
542 };
543 }
544 for(const std::string& name : m_histSvc->getEfficiencies()) {
545
546 if(!m_include.empty() && !regex_match(name, m_include_rex)) {
547 continue;
548 }
549
550 if(!m_exclude.empty() && regex_match(name, m_exclude_rex)) {
551 continue;
552 }
553
554 TEfficiency *h = nullptr;
555 if(m_histSvc->getEfficiency(name, h)) {
557 std::unique_ptr<const TH1> p;
558 if (h->GetDimension() == 1) {
559 p = create1DProfile(h);
560 } else if (h->GetDimension() == 2) {
561 p = create2DProfile(h);
562 }
563 // might throw...
564 auto name_tag = detail::extract_histogram_tag(name);
565 m_provider->publish(*p, name_tag.first, name_tag.second);
566 //m_provider->publish(*h, name_tag.first, name_tag.second);
567 } // tdaq doesn't currently support publishing efficiencies, will change in the future
568 };
569 }
570 } catch (daq::oh::Exception& ex) {
571 ATH_MSG_ERROR(ex.what());
572 }
573
575}
576
578{
579 IPCPartition p(m_partition);
580
581 RunParamsNamed runParams(p, "RunParams.RunParams");
582 try {
583 runParams.checkout();
584
585 eformat::helper::DetectorMask mask(runParams.det_mask);
586
587 auto metadatacont = std::make_unique<ByteStreamMetadataContainer>();
588 metadatacont->push_back(std::make_unique<ByteStreamMetadata>(
589 runParams.run_number,
590 0,
591 0,
592 runParams.recording_enabled,
593 runParams.trigger_type,
594 mask.serialize().second,
595 runParams.beam_type,
596 runParams.beam_energy,
597 "",
598 "",
599 runParams.T0_project_tag,
600 0,
601 std::vector<std::string>()
602 ));
603 // Record ByteStreamMetadataContainer in MetaData Store
604 if(m_inputMetaDataStore->record(std::move(metadatacont),"ByteStreamMetadata").isFailure()) {
605 ATH_MSG_WARNING("Unable to record MetaData in InputMetaDataStore");
606 }
607 else {
608 ATH_MSG_DEBUG("Recorded MetaData in InputMetaDataStore");
609 }
610
611 } catch(ers::Issue& ex) {
612 ATH_MSG_ERROR("Cannot get run parameters:" << ex.what());
613 }
614}
615
616// start of run
618{
620 ATH_MSG_INFO("Resetting histograms...");
621 for(const std::string& name : m_histSvc->getHists()) {
622 TH1 *h = nullptr;
623 if(m_histSvc->getHist(name, h)) {
624 h->Reset();
625 };
626 }
627 for(const std::string& name : m_histSvc->getEfficiencies()) {
628 TEfficiency *h = nullptr;
629 if(m_histSvc->getEfficiency(name, h)) {
630 std::unique_ptr<TH1> pass{h->GetCopyPassedHisto()};
631 pass->Reset();
632 h->SetPassedHistogram(*pass.get(), "");
633 std::unique_ptr<TH1> tot{h->GetCopyTotalHisto()};
634 tot->Reset();
635 h->SetTotalHistogram(*tot.get(), "");
636 h->SetWeight(1);
637 };
638 }
639 }
640 return StatusCode::SUCCESS;
641}
642
643void ByteStreamEmonInputSvc::updateHandler(Gaudi::Details::PropertyBase& /* p */)
644{
645 if(! m_connect) {
646 m_connect = true;
647 sleep(2);
648 setProperty("State","Reconnect").ignore();
649 }
650}
651
652
654{
655 setProperty("State","Shutdown").ignore();
656 m_inputMetaDataStore.release().ignore();
657 m_robProvider.release().ignore();
658 m_sgSvc.release().ignore();
659 return StatusCode::SUCCESS;
660}
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_ERROR(x)
#define ATH_MSG_FATAL(x)
#define ATH_MSG_INFO(x)
#define ATH_MSG_WARNING(x)
#define ATH_MSG_DEBUG(x)
This file contains the class definition for the ByteStreamMetadataContainer class.
This file contains the class definition for the ByteStreamMetadata class.
This file contains the class definition for the DataHeader and DataHeaderElement classes.
static Double_t ss
void setProperty(columnar::PythonToolHandle &self, const std::string &key, nb::object value)
OFFLINE_FRAGMENTS_NAMESPACE::FullEventFragment RawEvent
data type for reading raw event
Definition RawEvent.h:37
Define macros for attributes used to control the static checker.
#define ATLAS_NOT_THREAD_SAFE
getNoisyStrip() Find noisy strips from hitmaps and write out into xml/db formats
Header file for AthHistogramAlgorithm.
IOpaqueAddress for ByteStreamCnvSvc, with ROB ids.
void updateHandler(Gaudi::Details::PropertyBase &p)
Gaudi::Property< int > m_timeout
Gaudi::Property< std::vector< unsigned int > > m_l1items
Gaudi::Property< unsigned int > m_key_count
Gaudi::Property< bool > m_convertEfficiency
Gaudi::Property< std::string > m_groupName
virtual StatusCode initialize() override
Gaudi::Property< std::string > m_stream_type
virtual const RawEvent * currentEvent() const override
Implementation of the ByteStreamInputSvc interface methods.
Gaudi::Property< std::string > m_stream_logic
virtual const RawEvent * previousEvent() override
Implementation of the ByteStreamInputSvc interface methods.
Gaudi::Property< std::string > m_l1logic
SG::ReadHandleKey< TrigConf::L1Menu > m_l1MenuKey
Gaudi::Property< bool > m_clearHistograms
ServiceHandle< IROBDataProviderSvc > m_robProvider
Gaudi::Property< bool > m_exit
Gaudi::Property< bool > m_corrupted_events
Gaudi::Property< std::vector< std::string > > m_stream_names
Gaudi::Property< std::string > m_key
Gaudi::Property< std::vector< std::string > > m_l1names
Gaudi::Property< bool > m_readDetectorMask
int m_totalEventCounter
event Counter
Gaudi::Property< std::string > m_l1origin
virtual StatusCode finalize() override
Gaudi::Property< std::vector< std::string > > m_value
Gaudi::Property< std::string > m_is_server
virtual StatusCode start() override
Gaudi::Property< unsigned int > m_trigger_type
Gaudi::Property< std::string > m_exclude
Gaudi::Property< std::string > m_partition
Gaudi::Property< int > m_updatePeriod
ServiceHandle< StoreGateSvc > m_inputMetaDataStore
Gaudi::Property< float > m_updatePeriodRange
ByteStreamEmonInputSvc(const std::string &name, ISvcLocator *svcloc)
Constructors:
std::unique_ptr< RawEvent > m_re
current event
ServiceHandle< StoreGateSvc > m_sgSvc
Gaudi::Property< std::string > m_include
Gaudi::Property< std::string > m_publish
std::unique_ptr< emon::EventIterator > m_eventIt
Event iterator.
Gaudi::Property< unsigned int > m_buffer_size
Gaudi::Property< int > m_frequency
ServiceHandle< ITHistSvc > m_histSvc
virtual const RawEvent * nextEvent() override
Simple smart pointer for Gaudi-style refcounted objects.
This class provides a persistent form for the TransientAddress.
Definition DataHeader.h:37
This class provides the layout for summary information stored for data written to POOL.
Definition DataHeader.h:123
void setStatus(statusFlag status)
Set StatusFlag enum for DataHeader.
void insert(const SG::TransientAddress *sgAddress, IOpaqueAddress *tokAddress=0, const std::string &pTag="")
Insert a new element into the "DataObject" vector.
virtual bool isValid() override final
Can the handle be successfully dereferenced?
const DataType * PointerType
Definition RawEvent.h:25
SG::ReadCondHandle< T > makeHandle(const SG::ReadCondHandleKey< T > &key, const EventContext &ctx=Gaudi::Hive::currentContext())
std::pair< std::string, int > extract_histogram_tag(const std::string &histo_name)
Extract tag/LB number from per-LBN histogram name.