ATLAS Offline Software
Loading...
Searching...
No Matches
ByteStreamEmonInputSvc.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2025 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.reset(0);
329 m_eventIt.reset(new emon::EventIterator(partition, *address, criteria, m_buffer_size, m_groupName));
332 }
333 setProperty("State", "Connected").ignore();
334 return true;
335 } catch(ers::Issue& ex) {
336 ATH_MSG_INFO("Cannot connect to sampler (will wait 20s): " << m_key << "/" << m_value
337 << " Reason: " << ex.what());
338 sleep(20);
339 }
340 }
341}
342
343// Read previous event should not be called for this version of input svc
345{
346 ATH_MSG_WARNING("previousEvent not implemented for ByteStreamEmonInputSvc");
347
348 return nullptr;
349}
350
351// Read the next event.
353{
354 if (m_re) {
356 m_re->start(st);
357 if (st) delete [] st;
358 m_re.reset();
359 }
360
361 while(m_re == nullptr) {
362
363 if(m_connect) {
364
365 if(!getIterator()) {
366 return nullptr;
367 } else {
368 ATH_MSG_INFO("Got sampler...");
369 m_connect = false;
370 }
371 }
372
373 emon::Event event;
374 try {
375 int timeout = m_timeout;
376 if(m_updatePeriod) {
377 // try to hit lower end of update period
378 timeout = (m_publish_target - time(0) - int(m_updatePeriodRange * m_updatePeriod)) * 1000;
379 if(timeout <= 0) timeout = 1000;
380 }
381 event = m_eventIt->nextEvent(timeout);
382 } catch(emon::NoMoreEvents& ex) {
383 if(m_exit) {
384 return nullptr;
385 }
387 continue;
388 } catch (ers::Issue& ex) {
389 m_connect = true;
390 continue;
391 }
392
393 setProperty("State", "Processing").ignore();
394
396 memcpy(buf, event.data(), event.size() * sizeof(OFFLINE_FRAGMENTS_NAMESPACE::DataType));
397
398
399 if (buf[0] == eformat::FULL_EVENT) {
400
401 // We got a full event
402 m_re = std::make_unique<RawEvent>(buf);
403 try {
404 m_re->check_tree();
405 ATH_MSG_INFO("nextEvent: Got valid fragment of size:" << event.size());
406 } catch (ers::Issue& ex) {
407
408 // log in any case
409 std::stringstream ss;
410 ss << ex;
411 ATH_MSG_ERROR("nextEvent: Invalid event fragment: " << ss.str());
412
413 if(!m_corrupted_events) {
414
415 delete [] buf;
416 m_re.reset();
417 continue;
418 } // else fall through
419 }
420 m_robProvider->setNextEvent(Gaudi::Hive::currentContext(), m_re.get());
421 m_robProvider->setEventStatus(Gaudi::Hive::currentContext(), 0);
422
423 } else {
424 // We got something we didn't expect.
425 ATH_MSG_ERROR("nextEvent: Got invalid fragment of unknown type: 0x"
426 << std::hex << buf[0] << std::dec);
427 delete [] buf;
428 continue;
429 }
431 }
432
433 // generate DataHeader
434 DataHeader* Dh = new DataHeader();
435
436 // Declare header primary
438
439 // Now add ref to xAOD::EventInfo objects
442 StatusCode ioc = m_sgSvc->recordAddress("EventInfo",std::move(iop));
443 if (ioc.isSuccess()) {
444 const SG::DataProxy* ptmp = m_sgSvc->transientProxy(ClassID_traits<xAOD::EventInfo>::ID(), "EventInfo");
445 if (ptmp !=0) {
446 DataHeaderElement DheEI(ptmp, nullptr, "EventInfo");
447 Dh->insert(DheEI);
448 }
449 //else ATH_MSG_ERROR("Failed to create xAOD::EventInfo proxy " << ptmp);
450 }
451
452 // Now add ref to xAOD::EventAuxInfo objects
454 (new ByteStreamAddress(ClassID_traits<xAOD::EventAuxInfo>::ID(), "EventInfoAux.", ""));
455 StatusCode iocaux = m_sgSvc->recordAddress("EventInfoAux.",std::move(iopaux));
456 if (iocaux.isSuccess()) {
457 const SG::DataProxy* ptmpaux = m_sgSvc->transientProxy(ClassID_traits<xAOD::EventAuxInfo>::ID(), "EventInfoAux.");
458 if (ptmpaux !=0) {
459 DataHeaderElement DheEIAux(ptmpaux, nullptr, "EventInfoAux.");
460 Dh->insert(DheEIAux);
461 }
462 //else ATH_MSG_ERROR("Failed to create xAOD::EventAuxInfo proxy " << ptmpaux);
463 }
464
465 // Record new data header.Boolean flags will allow it's deletion in case
466 // of skipped events.
467 StatusCode rec_sg = m_sgSvc->record<DataHeader>(Dh, "ByteStreamDataHeader", true, false, true);
468 if (rec_sg != StatusCode::SUCCESS) {
469 ATH_MSG_ERROR("Fail to record BS DataHeader in StoreGate. Skipping events?! " << rec_sg);
470 }
471
472 // we got an event, check if we have to publish
474
475 return m_re.get();
476
477}
478
479// Get a pointer to the current event.
481{
482 return m_re.get();
483}
484
486{
487 // is a server specified ?
488 if(m_is_server.empty()) return;
489
490 // a time based update ?
491 if(m_updatePeriod) {
492 time_t now = time(0);
493
495 // it's too early to publish
496 return;
497 }
498
500 // it's too late
501 unsigned int missed_publications = 0;
502 while(m_publish_target < now) {
503 missed_publications++;
505 }
506
507 // do NOT publish, but print a warning
508 ATH_MSG_WARNING(" check_publish: missed " << missed_publications << " publications to OH");
509
510 return;
511 }
512 }
513
514 // an event based update ?
515 if(m_frequency && --m_frequency_counter > 0) return;
516
518
519 try {
520
521 if(m_provider == nullptr) {
522 IPCPartition part(m_partition);
523 if(!part.isValid()) return;
524 // might throw...
525 m_provider = new OHRootProvider(part, m_is_server, m_publish);
526 }
527
528 for(const std::string& name : m_histSvc->getHists()) {
529
530 if(!m_include.empty() && !regex_match(name, m_include_rex)) {
531 continue;
532 }
533
534 if(!m_exclude.empty() && regex_match(name, m_exclude_rex)) {
535 continue;
536 }
537
538 TH1 *h = nullptr;
539 if(m_histSvc->getHist(name, h)) {
540 // might throw...
541 auto name_tag = detail::extract_histogram_tag(name);
542 m_provider->publish(*h, name_tag.first, name_tag.second);
543 };
544 }
545 for(const std::string& name : m_histSvc->getEfficiencies()) {
546
547 if(!m_include.empty() && !regex_match(name, m_include_rex)) {
548 continue;
549 }
550
551 if(!m_exclude.empty() && regex_match(name, m_exclude_rex)) {
552 continue;
553 }
554
555 TEfficiency *h = nullptr;
556 if(m_histSvc->getEfficiency(name, h)) {
558 std::unique_ptr<const TH1> p;
559 if (h->GetDimension() == 1) {
560 p = create1DProfile(h);
561 } else if (h->GetDimension() == 2) {
562 p = create2DProfile(h);
563 }
564 // might throw...
565 auto name_tag = detail::extract_histogram_tag(name);
566 m_provider->publish(*p, name_tag.first, name_tag.second);
567 //m_provider->publish(*h, name_tag.first, name_tag.second);
568 } // tdaq doesn't currently support publishing efficiencies, will change in the future
569 };
570 }
571 } catch (daq::oh::Exception& ex) {
572 ATH_MSG_ERROR(ex.what());
573 }
574
576}
577
579{
580 IPCPartition p(m_partition);
581
582 RunParamsNamed runParams(p, "RunParams.RunParams");
583 try {
584 runParams.checkout();
585
586 eformat::helper::DetectorMask mask(runParams.det_mask);
587
588 auto metadatacont = std::make_unique<ByteStreamMetadataContainer>();
589 metadatacont->push_back(std::make_unique<ByteStreamMetadata>(
590 runParams.run_number,
591 0,
592 0,
593 runParams.recording_enabled,
594 runParams.trigger_type,
595 mask.serialize().second,
596 runParams.beam_type,
597 runParams.beam_energy,
598 "",
599 "",
600 runParams.T0_project_tag,
601 0,
602 std::vector<std::string>()
603 ));
604 // Record ByteStreamMetadataContainer in MetaData Store
605 if(m_inputMetaDataStore->record(std::move(metadatacont),"ByteStreamMetadata").isFailure()) {
606 ATH_MSG_WARNING("Unable to record MetaData in InputMetaDataStore");
607 }
608 else {
609 ATH_MSG_DEBUG("Recorded MetaData in InputMetaDataStore");
610 }
611
612 } catch(ers::Issue& ex) {
613 ATH_MSG_ERROR("Cannot get run parameters:" << ex.what());
614 }
615}
616
617// start of run
619{
621 ATH_MSG_INFO("Resetting histograms...");
622 for(const std::string& name : m_histSvc->getHists()) {
623 TH1 *h = nullptr;
624 if(m_histSvc->getHist(name, h)) {
625 h->Reset();
626 };
627 }
628 for(const std::string& name : m_histSvc->getEfficiencies()) {
629 TEfficiency *h = nullptr;
630 if(m_histSvc->getEfficiency(name, h)) {
631 std::unique_ptr<TH1> pass{h->GetCopyPassedHisto()};
632 pass->Reset();
633 h->SetPassedHistogram(*pass.get(), "");
634 std::unique_ptr<TH1> tot{h->GetCopyTotalHisto()};
635 tot->Reset();
636 h->SetTotalHistogram(*tot.get(), "");
637 h->SetWeight(1);
638 };
639 }
640 }
641 return StatusCode::SUCCESS;
642}
643
644void ByteStreamEmonInputSvc::updateHandler(Gaudi::Details::PropertyBase& /* p */)
645{
646 if(! m_connect) {
647 m_connect = true;
648 sleep(2);
649 setProperty("State","Reconnect").ignore();
650 }
651}
652
653
655{
656 setProperty("State","Shutdown").ignore();
657 m_inputMetaDataStore.release().ignore();
658 m_robProvider.release().ignore();
659 m_sgSvc.release().ignore();
660 return StatusCode::SUCCESS;
661}
#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
std::auto_ptr< emon::EventIterator > m_eventIt
Event iterator.
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
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.