ATLAS Offline Software
Loading...
Searching...
No Matches
ByteStreamEmonInputSvc Class Reference

implements the interface IByteStreamInputSvc for reading events from emon. More...

#include <ByteStreamEmonInputSvc.h>

Inheritance diagram for ByteStreamEmonInputSvc:
Collaboration diagram for ByteStreamEmonInputSvc:

Public Member Functions

 ByteStreamEmonInputSvc (const std::string &name, ISvcLocator *svcloc)
 Constructors:
virtual StatusCode initialize () override
virtual StatusCode start () override
virtual StatusCode finalize () override
virtual const RawEvent * previousEvent () override
 Implementation of the ByteStreamInputSvc interface methods.
virtual const RawEvent * nextEvent () override
virtual const RawEvent * currentEvent () const override
 Implementation of the ByteStreamInputSvc interface methods.

Private Member Functions

bool getIterator ()
void check_publish ()
void get_runparams ()
void updateHandler (Gaudi::Details::PropertyBase &p)

Private Attributes

int m_totalEventCounter {0}
 event Counter
std::unique_ptr< RawEvent > m_re {nullptr}
 current event
Gaudi::Property< std::string > m_partition {this, "Partition", {}, "Partition name, default taken from $TDAQ_PARTITION if not set"}
Gaudi::Property< std::string > m_key {this, "Key", {}, &ByteStreamEmonInputSvc::updateHandler, "EMON Selection key, e.g. SFI"}
Gaudi::Property< std::vector< std::string > > m_value {this, "KeyValue", {}, &ByteStreamEmonInputSvc::updateHandler, "EMON key values, e.g. [SFI-1, SFI-2]; if empty all SFIs"}
Gaudi::Property< unsigned int > m_key_count {this, "KeyCount", 0, &ByteStreamEmonInputSvc::updateHandler, "EMON key count, e.g. 5 to get five random SFIs"}
Gaudi::Property< std::string > m_publish {this, "PublishName", "Athena", &ByteStreamEmonInputSvc::updateHandler, "Name under which to publish histograms"}
Gaudi::Property< bool > m_exit {this, "ExitOnPartitionShutdown", false, &ByteStreamEmonInputSvc::updateHandler, "If true, exit if partition shuts down"}
Gaudi::Property< std::string > m_is_server {this, "ISServer", "", &ByteStreamEmonInputSvc::updateHandler, "IS Server to publish histograms to"}
Gaudi::Property< std::string > m_include {this, "Include", {}, &ByteStreamEmonInputSvc::updateHandler, "Regular expression to select histograms to publish"}
Gaudi::Property< std::string > m_exclude {this, "Exclude", {}, &ByteStreamEmonInputSvc::updateHandler, "Regular expression to select histograms not to publish"}
Gaudi::Property< int > m_frequency {this, "Frequency", 60, &ByteStreamEmonInputSvc::updateHandler, "Frequency (in number of events) of publishing histograms"}
Gaudi::Property< int > m_updatePeriod {this, "UpdatePeriod", 0, &ByteStreamEmonInputSvc::updateHandler, "Frequency (in seconds) of publishing histograms"}
Gaudi::Property< float > m_updatePeriodRange {this, "UpdatePeriodRange", 0.2, "A percentage number to determine how close we have to be to the next update time to publish now"}
Gaudi::Property< bool > m_clearHistograms {this, "ClearHistograms", true, &ByteStreamEmonInputSvc::updateHandler, "If true, clear histograms when new run starts (default: True)"}
Gaudi::Property< std::vector< std::string > > m_l1names {this, "LVL1Names", {}, &ByteStreamEmonInputSvc::updateHandler, "A list of L1 bit names"}
Gaudi::Property< std::vector< unsigned int > > m_l1items {this, "LVL1Items", {}, &ByteStreamEmonInputSvc::updateHandler, "A list of L1 bit numbers"}
Gaudi::Property< std::string > m_l1logic {this, "LVL1Logic", "Ignore", &ByteStreamEmonInputSvc::updateHandler, "'And', 'Or' or 'Ignore' (default: Ignore)"}
Gaudi::Property< std::string > m_l1origin {this, "LVL1Origin", "TAV", &ByteStreamEmonInputSvc::updateHandler, "TBP, TAP, TAV (default: TAV"}
Gaudi::Property< std::string > m_stream_type {this, "StreamType", "physics", &ByteStreamEmonInputSvc::updateHandler, "HLT stream type (e.g. physics or calibration)"}
Gaudi::Property< std::vector< std::string > > m_stream_names {this, "StreamNames", {}, &ByteStreamEmonInputSvc::updateHandler, "List of HLT stream names"}
Gaudi::Property< std::string > m_stream_logic {this, "StreamLogic", "Ignore", &ByteStreamEmonInputSvc::updateHandler, "'And', 'Or' or 'Ignore' (default: Ignore)"}
Gaudi::Property< unsigned int > m_trigger_type {this, "TriggerType", 256, &ByteStreamEmonInputSvc::updateHandler, "LVL1 8 bit trigger type"}
Gaudi::Property< std::string > m_groupName {this, "GroupName", {}, &ByteStreamEmonInputSvc::updateHandler, "Name of the monitoring group"}
Gaudi::Property< unsigned int > m_buffer_size {this, "BufferSize", 2, "Number of buffers"}
Gaudi::Property< bool > m_readDetectorMask {this, "ReadDetectorMaskFromIS", true, "Read detector mask from IS"}
Gaudi::Property< int > m_timeout {this, "Timeout", 3600000, &ByteStreamEmonInputSvc::updateHandler, "Timeout in seconds, -1 == infinity"}
Gaudi::Property< bool > m_corrupted_events {this, "ProcessCorruptedEvents", false, &ByteStreamEmonInputSvc::updateHandler, "Process corrupted events not passing check_tree()"}
Gaudi::Property< std::string > m_state {this, "State", "None", "Read-only property showing the state"}
Gaudi::Property< bool > m_convertEfficiency {this, "ConvertEfficiency", true, "Convert TEfficiency to TProfile before publishing"}
SG::ReadHandleKey< TrigConf::L1Menu > m_l1MenuKey {this, "L1TriggerMenu", "DetectorStore+L1TriggerMenu", "Name of the L1Menu object to read configuration from"}
bool m_connect {false}
std::unique_ptr< emon::EventIterator > m_eventIt
 Event iterator.
OHRootProvider * m_provider {nullptr}
boost::regex m_include_rex
boost::regex m_exclude_rex
int m_frequency_counter {60}
int m_publish_target {0}
ServiceHandle< StoreGateSvc > m_inputMetaDataStore
ServiceHandle< StoreGateSvc > m_sgSvc
ServiceHandle< IROBDataProviderSvc > m_robProvider
ServiceHandle< ITHistSvc > m_histSvc

Detailed Description

implements the interface IByteStreamInputSvc for reading events from emon.

Definition at line 37 of file ByteStreamEmonInputSvc.h.

Constructor & Destructor Documentation

◆ ByteStreamEmonInputSvc()

ByteStreamEmonInputSvc::ByteStreamEmonInputSvc ( const std::string & name,
ISvcLocator * svcloc )

Constructors:

Definition at line 152 of file ByteStreamEmonInputSvc.cxx.

152 :
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}
ServiceHandle< IROBDataProviderSvc > m_robProvider
ServiceHandle< StoreGateSvc > m_inputMetaDataStore
ServiceHandle< StoreGateSvc > m_sgSvc
ServiceHandle< ITHistSvc > m_histSvc

Member Function Documentation

◆ check_publish()

void ByteStreamEmonInputSvc::check_publish ( )
private

Definition at line 484 of file ByteStreamEmonInputSvc.cxx.

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 if (!p)[[unlikely]] continue;
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}
#define ATH_MSG_ERROR(x,...)
#define ATH_MSG_WARNING(x,...)
Gaudi::Property< bool > m_convertEfficiency
Gaudi::Property< std::string > m_is_server
Gaudi::Property< std::string > m_exclude
Gaudi::Property< std::string > m_partition
Gaudi::Property< int > m_updatePeriod
Gaudi::Property< float > m_updatePeriodRange
Gaudi::Property< std::string > m_include
Gaudi::Property< std::string > m_publish
Gaudi::Property< int > m_frequency
time(flags, cells_name, *args, **kw)
std::pair< std::string, int > extract_histogram_tag(const std::string &histo_name)
Extract tag/LB number from per-LBN histogram name.
#define unlikely(x)

◆ currentEvent()

const RawEvent * ByteStreamEmonInputSvc::currentEvent ( ) const
overridevirtual

Implementation of the ByteStreamInputSvc interface methods.

Definition at line 479 of file ByteStreamEmonInputSvc.cxx.

480{
481 return m_re.get();
482}
std::unique_ptr< RawEvent > m_re
current event

◆ finalize()

StatusCode ByteStreamEmonInputSvc::finalize ( )
overridevirtual

Definition at line 654 of file ByteStreamEmonInputSvc.cxx.

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}
void setProperty(columnar::PythonToolHandle &self, const std::string &key, nb::object value)

◆ get_runparams()

void ByteStreamEmonInputSvc::get_runparams ( )
private

Definition at line 578 of file ByteStreamEmonInputSvc.cxx.

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}
#define ATH_MSG_DEBUG(x,...)

◆ getIterator()

bool ByteStreamEmonInputSvc::getIterator ( )
private

Definition at line 222 of file ByteStreamEmonInputSvc.cxx.

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");
291 SG::ReadHandle<TrigConf::L1Menu> l1Menu = SG::makeHandle(m_l1MenuKey);
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}
#define ATH_MSG_INFO(x,...)
#define ATH_MSG_FATAL(x,...)
Gaudi::Property< std::vector< unsigned int > > m_l1items
Gaudi::Property< unsigned int > m_key_count
Gaudi::Property< std::string > m_groupName
Gaudi::Property< std::string > m_stream_type
Gaudi::Property< std::string > m_stream_logic
Gaudi::Property< std::string > m_l1logic
SG::ReadHandleKey< TrigConf::L1Menu > m_l1MenuKey
Gaudi::Property< bool > m_exit
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
Gaudi::Property< std::string > m_l1origin
Gaudi::Property< std::vector< std::string > > m_value
Gaudi::Property< unsigned int > m_trigger_type
std::unique_ptr< emon::EventIterator > m_eventIt
Event iterator.
Gaudi::Property< unsigned int > m_buffer_size
virtual bool isValid() override final
Can the handle be successfully dereferenced?
SG::ReadCondHandle< T > makeHandle(const SG::ReadCondHandleKey< T > &key, const EventContext &ctx=Gaudi::Hive::currentContext())

◆ initialize()

StatusCode ByteStreamEmonInputSvc::initialize ( )
overridevirtual

Definition at line 162 of file ByteStreamEmonInputSvc.cxx.

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}
#define ATH_CHECK
Evaluate an expression and check for errors.
std::string getenv(const std::string &variableName)
get an environment variable

◆ nextEvent()

const RawEvent * ByteStreamEmonInputSvc::nextEvent ( )
overridevirtual

Definition at line 351 of file ByteStreamEmonInputSvc.cxx.

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
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
439 CxxUtils::RefCountedPtr<ByteStreamAddress> iop
440 (new ByteStreamAddress(ClassID_traits<xAOD::EventInfo>::ID(), "EventInfo", ""));
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
452 CxxUtils::RefCountedPtr<ByteStreamAddress> iopaux
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}
static Double_t ss
Gaudi::Property< int > m_timeout
Gaudi::Property< bool > m_corrupted_events
int m_totalEventCounter
event Counter
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.
::StatusCode StatusCode
StatusCode definition for legacy code.
const DataType * PointerType
Definition RawEvent.h:25

◆ previousEvent()

const RawEvent * ByteStreamEmonInputSvc::previousEvent ( )
overridevirtual

Implementation of the ByteStreamInputSvc interface methods.

Definition at line 343 of file ByteStreamEmonInputSvc.cxx.

344{
345 ATH_MSG_WARNING("previousEvent not implemented for ByteStreamEmonInputSvc");
346
347 return nullptr;
348}

◆ start()

StatusCode ByteStreamEmonInputSvc::start ( )
overridevirtual

Definition at line 618 of file ByteStreamEmonInputSvc.cxx.

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}
Gaudi::Property< bool > m_clearHistograms

◆ updateHandler()

void ByteStreamEmonInputSvc::updateHandler ( Gaudi::Details::PropertyBase & p)
private

Definition at line 644 of file ByteStreamEmonInputSvc.cxx.

645{
646 if(! m_connect) {
647 m_connect = true;
648 sleep(2);
649 setProperty("State","Reconnect").ignore();
650 }
651}

Member Data Documentation

◆ m_buffer_size

Gaudi::Property<unsigned int> ByteStreamEmonInputSvc::m_buffer_size {this, "BufferSize", 2, "Number of buffers"}
private

Definition at line 90 of file ByteStreamEmonInputSvc.h.

90{this, "BufferSize", 2, "Number of buffers"};

◆ m_clearHistograms

Gaudi::Property<bool> ByteStreamEmonInputSvc::m_clearHistograms {this, "ClearHistograms", true, &ByteStreamEmonInputSvc::updateHandler, "If true, clear histograms when new run starts (default: True)"}
private

Definition at line 79 of file ByteStreamEmonInputSvc.h.

79{this, "ClearHistograms", true, &ByteStreamEmonInputSvc::updateHandler, "If true, clear histograms when new run starts (default: True)"};
void updateHandler(Gaudi::Details::PropertyBase &p)

◆ m_connect

bool ByteStreamEmonInputSvc::m_connect {false}
private

Definition at line 101 of file ByteStreamEmonInputSvc.h.

101{false};

◆ m_convertEfficiency

Gaudi::Property<bool> ByteStreamEmonInputSvc::m_convertEfficiency {this, "ConvertEfficiency", true, "Convert TEfficiency to TProfile before publishing"}
private

Definition at line 95 of file ByteStreamEmonInputSvc.h.

95{this, "ConvertEfficiency", true, "Convert TEfficiency to TProfile before publishing"};

◆ m_corrupted_events

Gaudi::Property<bool> ByteStreamEmonInputSvc::m_corrupted_events {this, "ProcessCorruptedEvents", false, &ByteStreamEmonInputSvc::updateHandler, "Process corrupted events not passing check_tree()"}
private

Definition at line 93 of file ByteStreamEmonInputSvc.h.

93{this, "ProcessCorruptedEvents", false, &ByteStreamEmonInputSvc::updateHandler, "Process corrupted events not passing check_tree()"};

◆ m_eventIt

std::unique_ptr<emon::EventIterator> ByteStreamEmonInputSvc::m_eventIt
private

Event iterator.

Definition at line 102 of file ByteStreamEmonInputSvc.h.

◆ m_exclude

Gaudi::Property<std::string> ByteStreamEmonInputSvc::m_exclude {this, "Exclude", {}, &ByteStreamEmonInputSvc::updateHandler, "Regular expression to select histograms not to publish"}
private

Definition at line 75 of file ByteStreamEmonInputSvc.h.

75{this, "Exclude", {}, &ByteStreamEmonInputSvc::updateHandler, "Regular expression to select histograms not to publish"};

◆ m_exclude_rex

boost::regex ByteStreamEmonInputSvc::m_exclude_rex
private

Definition at line 107 of file ByteStreamEmonInputSvc.h.

◆ m_exit

Gaudi::Property<bool> ByteStreamEmonInputSvc::m_exit {this, "ExitOnPartitionShutdown", false, &ByteStreamEmonInputSvc::updateHandler, "If true, exit if partition shuts down"}
private

Definition at line 72 of file ByteStreamEmonInputSvc.h.

72{this, "ExitOnPartitionShutdown", false, &ByteStreamEmonInputSvc::updateHandler, "If true, exit if partition shuts down"};

◆ m_frequency

Gaudi::Property<int> ByteStreamEmonInputSvc::m_frequency {this, "Frequency", 60, &ByteStreamEmonInputSvc::updateHandler, "Frequency (in number of events) of publishing histograms"}
private

Definition at line 76 of file ByteStreamEmonInputSvc.h.

76{this, "Frequency", 60, &ByteStreamEmonInputSvc::updateHandler, "Frequency (in number of events) of publishing histograms"};

◆ m_frequency_counter

int ByteStreamEmonInputSvc::m_frequency_counter {60}
private

Definition at line 109 of file ByteStreamEmonInputSvc.h.

109{60};

◆ m_groupName

Gaudi::Property<std::string> ByteStreamEmonInputSvc::m_groupName {this, "GroupName", {}, &ByteStreamEmonInputSvc::updateHandler, "Name of the monitoring group"}
private

Definition at line 89 of file ByteStreamEmonInputSvc.h.

89{this, "GroupName", {}, &ByteStreamEmonInputSvc::updateHandler, "Name of the monitoring group"};

◆ m_histSvc

ServiceHandle<ITHistSvc> ByteStreamEmonInputSvc::m_histSvc
private

Definition at line 115 of file ByteStreamEmonInputSvc.h.

◆ m_include

Gaudi::Property<std::string> ByteStreamEmonInputSvc::m_include {this, "Include", {}, &ByteStreamEmonInputSvc::updateHandler, "Regular expression to select histograms to publish"}
private

Definition at line 74 of file ByteStreamEmonInputSvc.h.

74{this, "Include", {}, &ByteStreamEmonInputSvc::updateHandler, "Regular expression to select histograms to publish"};

◆ m_include_rex

boost::regex ByteStreamEmonInputSvc::m_include_rex
private

Definition at line 106 of file ByteStreamEmonInputSvc.h.

◆ m_inputMetaDataStore

ServiceHandle<StoreGateSvc> ByteStreamEmonInputSvc::m_inputMetaDataStore
private

Definition at line 112 of file ByteStreamEmonInputSvc.h.

◆ m_is_server

Gaudi::Property<std::string> ByteStreamEmonInputSvc::m_is_server {this, "ISServer", "", &ByteStreamEmonInputSvc::updateHandler, "IS Server to publish histograms to"}
private

Definition at line 73 of file ByteStreamEmonInputSvc.h.

73{this, "ISServer", "", &ByteStreamEmonInputSvc::updateHandler, "IS Server to publish histograms to"};

◆ m_key

Gaudi::Property<std::string> ByteStreamEmonInputSvc::m_key {this, "Key", {}, &ByteStreamEmonInputSvc::updateHandler, "EMON Selection key, e.g. SFI"}
private

Definition at line 68 of file ByteStreamEmonInputSvc.h.

68{this, "Key", {}, &ByteStreamEmonInputSvc::updateHandler, "EMON Selection key, e.g. SFI"};

◆ m_key_count

Gaudi::Property<unsigned int> ByteStreamEmonInputSvc::m_key_count {this, "KeyCount", 0, &ByteStreamEmonInputSvc::updateHandler, "EMON key count, e.g. 5 to get five random SFIs"}
private

Definition at line 70 of file ByteStreamEmonInputSvc.h.

70{this, "KeyCount", 0, &ByteStreamEmonInputSvc::updateHandler, "EMON key count, e.g. 5 to get five random SFIs"};

◆ m_l1items

Gaudi::Property<std::vector<unsigned int> > ByteStreamEmonInputSvc::m_l1items {this, "LVL1Items", {}, &ByteStreamEmonInputSvc::updateHandler, "A list of L1 bit numbers"}
private

Definition at line 81 of file ByteStreamEmonInputSvc.h.

81{this, "LVL1Items", {}, &ByteStreamEmonInputSvc::updateHandler, "A list of L1 bit numbers"};

◆ m_l1logic

Gaudi::Property<std::string> ByteStreamEmonInputSvc::m_l1logic {this, "LVL1Logic", "Ignore", &ByteStreamEmonInputSvc::updateHandler, "'And', 'Or' or 'Ignore' (default: Ignore)"}
private

Definition at line 82 of file ByteStreamEmonInputSvc.h.

82{this, "LVL1Logic", "Ignore", &ByteStreamEmonInputSvc::updateHandler, "'And', 'Or' or 'Ignore' (default: Ignore)"};

◆ m_l1MenuKey

SG::ReadHandleKey<TrigConf::L1Menu> ByteStreamEmonInputSvc::m_l1MenuKey {this, "L1TriggerMenu", "DetectorStore+L1TriggerMenu", "Name of the L1Menu object to read configuration from"}
private

Definition at line 98 of file ByteStreamEmonInputSvc.h.

98{this, "L1TriggerMenu", "DetectorStore+L1TriggerMenu", "Name of the L1Menu object to read configuration from"};

◆ m_l1names

Gaudi::Property<std::vector<std::string> > ByteStreamEmonInputSvc::m_l1names {this, "LVL1Names", {}, &ByteStreamEmonInputSvc::updateHandler, "A list of L1 bit names"}
private

Definition at line 80 of file ByteStreamEmonInputSvc.h.

80{this, "LVL1Names", {}, &ByteStreamEmonInputSvc::updateHandler, "A list of L1 bit names"};

◆ m_l1origin

Gaudi::Property<std::string> ByteStreamEmonInputSvc::m_l1origin {this, "LVL1Origin", "TAV", &ByteStreamEmonInputSvc::updateHandler, "TBP, TAP, TAV (default: TAV"}
private

Definition at line 83 of file ByteStreamEmonInputSvc.h.

83{this, "LVL1Origin", "TAV", &ByteStreamEmonInputSvc::updateHandler, "TBP, TAP, TAV (default: TAV"};

◆ m_partition

Gaudi::Property<std::string> ByteStreamEmonInputSvc::m_partition {this, "Partition", {}, "Partition name, default taken from $TDAQ_PARTITION if not set"}
private

Definition at line 67 of file ByteStreamEmonInputSvc.h.

67{this, "Partition", {}, "Partition name, default taken from $TDAQ_PARTITION if not set"};

◆ m_provider

OHRootProvider* ByteStreamEmonInputSvc::m_provider {nullptr}
private

Definition at line 104 of file ByteStreamEmonInputSvc.h.

104{nullptr};

◆ m_publish

Gaudi::Property<std::string> ByteStreamEmonInputSvc::m_publish {this, "PublishName", "Athena", &ByteStreamEmonInputSvc::updateHandler, "Name under which to publish histograms"}
private

Definition at line 71 of file ByteStreamEmonInputSvc.h.

71{this, "PublishName", "Athena", &ByteStreamEmonInputSvc::updateHandler, "Name under which to publish histograms"};

◆ m_publish_target

int ByteStreamEmonInputSvc::m_publish_target {0}
private

Definition at line 110 of file ByteStreamEmonInputSvc.h.

110{0};

◆ m_re

std::unique_ptr<RawEvent> ByteStreamEmonInputSvc::m_re {nullptr}
private

current event

Definition at line 64 of file ByteStreamEmonInputSvc.h.

64{nullptr};

◆ m_readDetectorMask

Gaudi::Property<bool> ByteStreamEmonInputSvc::m_readDetectorMask {this, "ReadDetectorMaskFromIS", true, "Read detector mask from IS"}
private

Definition at line 91 of file ByteStreamEmonInputSvc.h.

91{this, "ReadDetectorMaskFromIS", true, "Read detector mask from IS"};

◆ m_robProvider

ServiceHandle<IROBDataProviderSvc> ByteStreamEmonInputSvc::m_robProvider
private

Definition at line 114 of file ByteStreamEmonInputSvc.h.

◆ m_sgSvc

ServiceHandle<StoreGateSvc> ByteStreamEmonInputSvc::m_sgSvc
private

Definition at line 113 of file ByteStreamEmonInputSvc.h.

◆ m_state

Gaudi::Property<std::string> ByteStreamEmonInputSvc::m_state {this, "State", "None", "Read-only property showing the state"}
private

Definition at line 94 of file ByteStreamEmonInputSvc.h.

94{this, "State", "None", "Read-only property showing the state"};

◆ m_stream_logic

Gaudi::Property<std::string> ByteStreamEmonInputSvc::m_stream_logic {this, "StreamLogic", "Ignore", &ByteStreamEmonInputSvc::updateHandler, "'And', 'Or' or 'Ignore' (default: Ignore)"}
private

Definition at line 86 of file ByteStreamEmonInputSvc.h.

86{this, "StreamLogic", "Ignore", &ByteStreamEmonInputSvc::updateHandler, "'And', 'Or' or 'Ignore' (default: Ignore)"};

◆ m_stream_names

Gaudi::Property<std::vector<std::string> > ByteStreamEmonInputSvc::m_stream_names {this, "StreamNames", {}, &ByteStreamEmonInputSvc::updateHandler, "List of HLT stream names"}
private

Definition at line 85 of file ByteStreamEmonInputSvc.h.

85{this, "StreamNames", {}, &ByteStreamEmonInputSvc::updateHandler, "List of HLT stream names"};

◆ m_stream_type

Gaudi::Property<std::string> ByteStreamEmonInputSvc::m_stream_type {this, "StreamType", "physics", &ByteStreamEmonInputSvc::updateHandler, "HLT stream type (e.g. physics or calibration)"}
private

Definition at line 84 of file ByteStreamEmonInputSvc.h.

84{this, "StreamType", "physics", &ByteStreamEmonInputSvc::updateHandler, "HLT stream type (e.g. physics or calibration)"};

◆ m_timeout

Gaudi::Property<int> ByteStreamEmonInputSvc::m_timeout {this, "Timeout", 3600000, &ByteStreamEmonInputSvc::updateHandler, "Timeout in seconds, -1 == infinity"}
private

Definition at line 92 of file ByteStreamEmonInputSvc.h.

92{this, "Timeout", 3600000, &ByteStreamEmonInputSvc::updateHandler, "Timeout in seconds, -1 == infinity"};

◆ m_totalEventCounter

int ByteStreamEmonInputSvc::m_totalEventCounter {0}
private

event Counter

Definition at line 62 of file ByteStreamEmonInputSvc.h.

62{0};

◆ m_trigger_type

Gaudi::Property<unsigned int> ByteStreamEmonInputSvc::m_trigger_type {this, "TriggerType", 256, &ByteStreamEmonInputSvc::updateHandler, "LVL1 8 bit trigger type"}
private

Definition at line 88 of file ByteStreamEmonInputSvc.h.

88{this, "TriggerType", 256, &ByteStreamEmonInputSvc::updateHandler, "LVL1 8 bit trigger type"};

◆ m_updatePeriod

Gaudi::Property<int> ByteStreamEmonInputSvc::m_updatePeriod {this, "UpdatePeriod", 0, &ByteStreamEmonInputSvc::updateHandler, "Frequency (in seconds) of publishing histograms"}
private

Definition at line 77 of file ByteStreamEmonInputSvc.h.

77{this, "UpdatePeriod", 0, &ByteStreamEmonInputSvc::updateHandler, "Frequency (in seconds) of publishing histograms"};

◆ m_updatePeriodRange

Gaudi::Property<float> ByteStreamEmonInputSvc::m_updatePeriodRange {this, "UpdatePeriodRange", 0.2, "A percentage number to determine how close we have to be to the next update time to publish now"}
private

Definition at line 78 of file ByteStreamEmonInputSvc.h.

78{this, "UpdatePeriodRange", 0.2, "A percentage number to determine how close we have to be to the next update time to publish now"};

◆ m_value

Gaudi::Property<std::vector<std::string> > ByteStreamEmonInputSvc::m_value {this, "KeyValue", {}, &ByteStreamEmonInputSvc::updateHandler, "EMON key values, e.g. [SFI-1, SFI-2]; if empty all SFIs"}
private

Definition at line 69 of file ByteStreamEmonInputSvc.h.

69{this, "KeyValue", {}, &ByteStreamEmonInputSvc::updateHandler, "EMON key values, e.g. [SFI-1, SFI-2]; if empty all SFIs"};

The documentation for this class was generated from the following files: