// Gaudi #include "GaudiUtils/HistoLabels.h" // Tb/TbEvent #include "Event/TbTrigger.h" // Local #include "TbTriggerMonitor.h" using namespace Gaudi::Utils::Histos; DECLARE_ALGORITHM_FACTORY(TbTriggerMonitor) //============================================================================= // Standard constructor //============================================================================= TbTriggerMonitor::TbTriggerMonitor(const std::string& name, ISvcLocator* pSvcLocator) : TbAlgorithm(name, pSvcLocator), m_parTriggersInEvent("", 0., 1000., 200), m_nEvents(0) { declareProperty("TriggerLocation", m_triggerLocation = LHCb::TbTriggerLocation::Default); declareProperty("ParametersTriggersInEvent", m_parTriggersInEvent); } //============================================================================= // Destructor //============================================================================= TbTriggerMonitor::~TbTriggerMonitor() {} //============================================================================= // Initialisation //============================================================================= StatusCode TbTriggerMonitor::initialize() { // Initialise the base class. StatusCode sc = TbAlgorithm::initialize(); if (sc.isFailure()) return sc; m_missedTriggers.resize(m_nPlanes); m_counter.resize(m_nPlanes); m_counter.resize(m_nPlanes, 0); for (unsigned int i = 0; i < m_nPlanes; ++i) { const std::string plane = std::to_string(i); std::string name = "TimeBetweenTriggers"; std::string title = "Plane " + plane; m_hTimeBetweenTriggers.push_back(book1D(name, title, 0., 500., 200)); setAxisLabels(m_hTimeBetweenTriggers[i], "#Deltat [ns]", "entries"); unsigned int bins = m_parTriggersInEvent.bins(); double low = m_parTriggersInEvent.lowEdge(); double high = m_parTriggersInEvent.highEdge(); name = "TriggersInEvent/Plane" + plane; m_hTriggersInEvent.push_back(book1D(name, title, low, high, bins)); setAxisLabels(m_hTriggersInEvent[i], "number of triggers", "events"); name = "TriggersInEventTrend/Plane" + plane; m_hTriggersInEventTrend.push_back(book1D(name, title, -0.5, 999.5, 1000)); setAxisLabels(m_hTriggersInEventTrend[i], "event", "number of hits"); } return StatusCode::SUCCESS; } StatusCode TbTriggerMonitor::finalize() { /* for( unsigned int i = 0 ; i < m_nPlanes; ++i){ std::vector<std::pair<uint64_t, uint64_t>> summary = m_missedTriggers[i]; if( summary.size() != 0 ){ info() << "Trigger jumps on plane " << i << endmsg;; for( std::vector<std::pair<uint64_t, uint64_t >>::iterator jump = summary.begin(); jump != summary.end(); ++jump ){ info() << "Trigger jumps from " << jump->second << " to " << jump->first << endmsg; } } } */ return TbAlgorithm::finalize(); } //============================================================================= // Main execution //============================================================================= StatusCode TbTriggerMonitor::execute() { for (unsigned int i = 0; i < m_nPlanes; ++i) { // Grab the triggers. const std::string ext = std::to_string(i); const std::string location = m_triggerLocation + ext; const LHCb::TbTriggers* triggers = getIfExists<LHCb::TbTriggers>(location); if (!triggers) return StatusCode::SUCCESS; m_hTriggersInEvent[i]->fill(triggers->size()); m_hTriggersInEventTrend[i]->fill(m_nEvents, triggers->size()); double tprev = 0.; LHCb::TbTriggers::const_iterator begin = triggers->begin(); LHCb::TbTriggers::const_iterator end = triggers->end(); for (LHCb::TbTriggers::const_iterator it = begin; it != end; ++it) { // Check for missed triggers. if ((*it)->counter() - m_counter[i] != 1 && m_counter[i] != 4095) { info() << "Counter on plane " << i << " jumps from " << m_counter[i] << " to " << (*it)->counter() << endmsg; } m_counter[i] = (*it)->counter(); const double t = (*it)->htime(); if (it != begin) { m_hTimeBetweenTriggers[i]->fill(t - tprev); } tprev = t; counter("effFractionAssociated" + ext) += (*it)->associated(); } } ++m_nEvents; return StatusCode::SUCCESS; }