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::auto_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 485 of file ByteStreamEmonInputSvc.cxx.

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}
#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 480 of file ByteStreamEmonInputSvc.cxx.

481{
482 return m_re.get();
483}
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.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}
#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
std::auto_ptr< emon::EventIterator > m_eventIt
Event iterator.
Gaudi::Property< unsigned int > m_trigger_type
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 352 of file ByteStreamEmonInputSvc.cxx.

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
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
440 CxxUtils::RefCountedPtr<ByteStreamAddress> iop
441 (new ByteStreamAddress(ClassID_traits<xAOD::EventInfo>::ID(), "EventInfo", ""));
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
453 CxxUtils::RefCountedPtr<ByteStreamAddress> iopaux
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}
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 344 of file ByteStreamEmonInputSvc.cxx.

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

◆ 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::auto_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: