#include "TbPacketRecycler.h" #include "Event/TbTrack.h" DECLARE_ALGORITHM_FACTORY(TbPacketRecycler) //============================================================================= // Standard constructor, initializes variables //============================================================================= TbPacketRecycler::TbPacketRecycler(const std::string& name, ISvcLocator* pSvcLocator) : TbAlgorithm(name, pSvcLocator) { // Declare algorithm properties - see header for description. declareProperty("HitLocation", m_hitLocation = LHCb::TbHitLocation::Default); declareProperty("TriggerLocation", m_trgLocation = LHCb::TbTriggerLocation::Default); declareProperty("ClusterLocation", m_clusLocation = LHCb::TbClusterLocation::Default); } //============================================================================= // Initialisation //============================================================================= StatusCode TbPacketRecycler::initialize() { // Initialise the base class. StatusCode sc = TbAlgorithm::initialize(); if (sc.isFailure()) return sc; IToolSvc* toolsvc = nullptr; sc = service("ToolSvc", toolsvc); if (!sc.isSuccess()) { return Error("Unable to get a handle to the tool service", sc); } for (unsigned int i = 0; i < m_nPlanes; ++i) { TbRawStream* foo = nullptr; sc = toolSvc()->retrieveTool("TbRawStream/" + std::to_string(i), foo); if (!sc.isSuccess()) { return Error("Unable to retrieve TbRawStream for plane " + std::to_string(i), sc); } m_streams.push_back(foo); } return StatusCode::SUCCESS; } //============================================================================= // Main execution //============================================================================= StatusCode TbPacketRecycler::execute() { for (unsigned int i = 0; i < m_nPlanes; ++i) { const std::string hitLocation = m_hitLocation + std::to_string(i); const std::string trgLocation = m_trgLocation + std::to_string(i); const std::string clusLocation = m_clusLocation + std::to_string(i); LHCb::TbHits* hits = getIfExists<LHCb::TbHits>(hitLocation); LHCb::TbTriggers* trgs = getIfExists<LHCb::TbTriggers>(trgLocation); LHCb::TbClusters* clusters = getIfExists<LHCb::TbClusters>(clusLocation); removeClusters(clusters); recycle(hits, m_streams[i]); recycle(trgs, m_streams[i]); } return StatusCode::SUCCESS; } //============================================================================= // Copy unused hits and triggers to the cache. //============================================================================= template <typename TYPE> void TbPacketRecycler::recycle( KeyedContainer<TYPE, Containers::HashMap>* container, TbRawStream* s) { if (!container) return; std::vector<TYPE*> tmp_cache; tmp_cache.clear(); typename KeyedContainer<TYPE, Containers::HashMap>::reverse_iterator packet; for (packet = container->rbegin(); packet != container->rend(); ++packet) { // Break when outside the overlap time window. if (timingSvc()->beforeOverlap((*packet)->time())){ break; } // If unused, add the hit/trigger to the temporary cache. if (!(*packet)->associated()) { tmp_cache.push_back(new TYPE(*packet)); container->remove(*packet); } } std::reverse(tmp_cache.begin(), tmp_cache.end()); s->cache<TYPE*>()->insert(s->cache<TYPE*>()->begin(), tmp_cache.begin(), tmp_cache.end()); } //============================================================================= // Remove non-associated clusters from a container //============================================================================= void TbPacketRecycler::removeClusters(LHCb::TbClusters* clusters) { if (!clusters) return; LHCb::TbClusters::reverse_iterator it; for (it = clusters->rbegin(); it != clusters->rend(); ++it) { // Break when outside the overlap time window. if (timingSvc()->beforeOverlap((*it)->time())) break; // If unused, remove the cluster from the container. if (!(*it)->associated()) clusters->remove(*it); } }