// Gaudi #include "GaudiKernel/PhysicalConstants.h" // Tb/TbEvent #include "Event/TbTrack.h" // Local #include "TbTriggerAssociator.h" DECLARE_ALGORITHM_FACTORY(TbTriggerAssociator) //============================================================================= // Standard constructor //============================================================================= TbTriggerAssociator::TbTriggerAssociator(const std::string& name, ISvcLocator* pSvcLocator) : TbAlgorithm(name, pSvcLocator) { declareProperty("TrackLocation", m_trackLocation = LHCb::TbTrackLocation::Default); declareProperty("TriggerLocation", m_triggerLocation = LHCb::TbTriggerLocation::Default); declareProperty("TimeWindow", m_twindow = 1000. * Gaudi::Units::ns); declareProperty("TimeOffset", m_toffset = 0.); declareProperty("Plane", m_plane = 999); } //============================================================================= // Initialization //============================================================================= StatusCode TbTriggerAssociator::initialize() { // Initialise the base class. StatusCode sc = TbAlgorithm::initialize(); if (sc.isFailure()) return sc; return StatusCode::SUCCESS; } //============================================================================= // Main execution //============================================================================= StatusCode TbTriggerAssociator::execute() { // Grab the tracks. LHCb::TbTracks* tracks = getIfExists<LHCb::TbTracks>(m_trackLocation); if (!tracks) { return Error("No tracks in " + m_trackLocation); } // Grab the triggers. std::vector<LHCb::TbTriggers*> triggers(m_nPlanes, nullptr); std::vector<LHCb::TbTriggers::iterator> begin(m_nPlanes); std::vector<LHCb::TbTriggers::iterator> end(m_nPlanes); for (unsigned int i = 0; i < m_nPlanes; ++i) { if (m_plane != 999 && i != m_plane) continue; const std::string location = m_triggerLocation + std::to_string(i); triggers[i] = getIfExists<LHCb::TbTriggers>(location); if (!triggers[i]) { return Error("No triggers in " + location); } begin[i] = triggers[i]->begin(); end[i] = triggers[i]->end(); } // Loop over the tracks. for (LHCb::TbTrack* track : *tracks) { const double t = track->htime() + m_toffset; // Calculate the time window. const double tMin = t - m_twindow; const double tMax = t + m_twindow; for (unsigned int i = 0; i < m_nPlanes; ++i) { if (m_plane != 999 && i != m_plane) continue; if (triggers[i]->empty()) continue; // Get the first trigger within the time window (if any). LHCb::TbTriggers::iterator it = std::lower_bound(begin[i], end[i], tMin, lowerBound()); if (it == end[i]) continue; // Associate all triggers within the window to the track. for (; it != end[i]; ++it) { // Stop when outside the time window. if ((*it)->htime() > tMax) break; track->addToTriggers(*it); (*it)->setAssociated(true); } } } return StatusCode::SUCCESS; }