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 RawEventpreviousEvent () override
 Implementation of the ByteStreamInputSvc interface methods.
virtual const RawEventnextEvent () override
virtual const RawEventcurrentEvent () 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< RawEventm_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::L1Menum_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< StoreGateSvcm_inputMetaDataStore
ServiceHandle< StoreGateSvcm_sgSvc
ServiceHandle< IROBDataProviderSvcm_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 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}
#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.

◆ 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 653 of file ByteStreamEmonInputSvc.cxx.

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

◆ get_runparams()

void ByteStreamEmonInputSvc::get_runparams ( )
private

Definition at line 577 of file ByteStreamEmonInputSvc.cxx.

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}
#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_FATAL(x)
#define ATH_MSG_INFO(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 617 of file ByteStreamEmonInputSvc.cxx.

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

◆ updateHandler()

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

Definition at line 643 of file ByteStreamEmonInputSvc.cxx.

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

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: