diff --git a/Tracking/TrkAlgorithms/TrkTrackCollectionMerger/TrkTrackCollectionMerger/TrackCollectionMerger.h b/Tracking/TrkAlgorithms/TrkTrackCollectionMerger/TrkTrackCollectionMerger/TrackCollectionMerger.h new file mode 100644 index 0000000000000000000000000000000000000000..8c25275904f67f93d28fa0bdaf5520d620350930 --- /dev/null +++ b/Tracking/TrkAlgorithms/TrkTrackCollectionMerger/TrkTrackCollectionMerger/TrackCollectionMerger.h @@ -0,0 +1,80 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +/////////////////////////////////////////////////////////////////// +// TrackCollectionMerger.h, (c) ATLAS Detector software +/////////////////////////////////////////////////////////////////// +#ifndef TrackCollectionMerger_H +#define TrackCollectionMerger_H + +#include <string> +#include <map> +#include "AthenaBaseComps/AthAlgorithm.h" +#include "GaudiKernel/ToolHandle.h" + +#include "TrkTrack/TrackCollection.h" + +#include "TrkToolInterfaces/ITrackSummaryTool.h" +#include "TrkToolInterfaces/IPRD_AssociationTool.h" + +namespace Trk { + + /** @brief Class-algorithm for track collection merging and removalof potential duplicate tracks. */ + class TrackCollectionMerger : public AthAlgorithm + { + + /////////////////////////////////////////////////////////////////// + /** @brief Public methods: */ + /////////////////////////////////////////////////////////////////// + + public: + + /////////////////////////////////////////////////////////////////// + /** @brief Standard Algotithm methods: */ + /////////////////////////////////////////////////////////////////// + + TrackCollectionMerger(const std::string &name, ISvcLocator *pSvcLocator); + virtual ~TrackCollectionMerger() {} + StatusCode initialize(); + StatusCode execute(); + StatusCode finalize(); + + /////////////////////////////////////////////////////////////////// + /** @brief Print internal tool parameters and status. */ + /////////////////////////////////////////////////////////////////// + + MsgStream& dump (MsgStream& out) const; + std::ostream& dump (std::ostream& out) const; + + protected: + + /////////////////////////////////////////////////////////////////// + /** @brief Protected data: */ + /////////////////////////////////////////////////////////////////// + std::vector<std::string> m_tracklocation ; /** Vector of track collections to be merged. */ + std::string m_outtracklocation ; /** Combined track collection. */ + + ToolHandle< Trk::IPRD_AssociationTool > m_assoTool ; /** association tool for PRDs */ + ToolHandle< Trk::ITrackSummaryTool > m_trkSummaryTool ; /** summary tool with shared hits enabled */ + + /////////////////////////////////////////////////////////////////// + /** @brief Protected methods: */ + /////////////////////////////////////////////////////////////////// + + /** @brief A routine that merges the track collections. */ + StatusCode mergeTrack(const TrackCollection* trackCol, TrackCollection* outputCol); + + MsgStream& dumptools(MsgStream& out) const; + MsgStream& dumpevent(MsgStream& out) const; + + private: + bool m_createViewCollection; //!< option to create a view collection and not deep-copy tracks + bool m_updateSharedHitsOnly; //!< do not create the track summary again, but only update shared hits + + }; + + MsgStream& operator << (MsgStream& ,const TrackCollectionMerger&); + std::ostream& operator << (std::ostream&,const TrackCollectionMerger&); +} +#endif // TrackCollectionMerger_H diff --git a/Tracking/TrkAlgorithms/TrkTrackCollectionMerger/cmt/requirements b/Tracking/TrkAlgorithms/TrkTrackCollectionMerger/cmt/requirements new file mode 100644 index 0000000000000000000000000000000000000000..e5399e3527fb7842d50594faf557a56fc33424af --- /dev/null +++ b/Tracking/TrkAlgorithms/TrkTrackCollectionMerger/cmt/requirements @@ -0,0 +1,18 @@ +package TrkTrackCollectionMerger + +author Thomas Koffas <Thomas.Koffas@cern.ch> + +private + +use TrkPrepRawData TrkPrepRawData-* Tracking/TrkEvent + +public + +use AtlasPolicy AtlasPolicy-* +use GaudiInterface GaudiInterface-* External +use AthenaBaseComps AthenaBaseComps-* Control +use TrkTrack TrkTrack-* Tracking/TrkEvent +use TrkToolInterfaces TrkToolInterfaces-* Tracking/TrkTools + +library TrkTrackCollectionMerger *.cxx components/*.cxx +apply_pattern component_library diff --git a/Tracking/TrkAlgorithms/TrkTrackCollectionMerger/doc/mainpage.h b/Tracking/TrkAlgorithms/TrkTrackCollectionMerger/doc/mainpage.h new file mode 100755 index 0000000000000000000000000000000000000000..84ef8c52adddd44b5a7938f2a8644f22ee45b161 --- /dev/null +++ b/Tracking/TrkAlgorithms/TrkTrackCollectionMerger/doc/mainpage.h @@ -0,0 +1,48 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +/** + +@mainpage TrkTrackCollectionMerger +@author Thomas.Koffas@cern.ch + +@section TrkTrackCollectionMergerIntro Introduction + +This is an algorithm that merges all individual track collections, +SiSeededTracks, back-tracks, standalone TRT tracks etc. It runs at +the end of the tracking and before the post processing. It ouputs +a global track collection. + +@section TrkTrackCollectionMergerDescription Description + +This algorithm performs the following tasks: + +1. Loops over the input vector of all available track collections. + For each track collection, the track are saved in a common track + container that will be stored for later usage. The hit association + tool also gets updated simultaneuosly. + +2. Using the new common track collection, that track summary tool is then + updated. + +3. The new collection is stored. + +@section TrkTrackCollectionMergerTools Used Tools + +This algorithm uses the ITrackSummaryTool, IPRD_AssociationTool tools. + +@section TrkTrackCollectionMergerContents Algorithm Contents + +The TrkTrackCollectionMerger contains the following classes/files: + +- TrkTrackCollectionMerger.cxx...Main class calling all the necessary tools and producing the ouput track collection. + +@section TrkTrackCollectionMergerPackages Used Packages + +@htmlinclude used_packages.html + +@section TrkTrackCollectionMergerReq Requirements file +@include requirements + +*/ diff --git a/Tracking/TrkAlgorithms/TrkTrackCollectionMerger/src/TrackCollectionMerger.cxx b/Tracking/TrkAlgorithms/TrkTrackCollectionMerger/src/TrackCollectionMerger.cxx new file mode 100644 index 0000000000000000000000000000000000000000..f261faa74152a3d0dd9a94c0c42774615b200fd5 --- /dev/null +++ b/Tracking/TrkAlgorithms/TrkTrackCollectionMerger/src/TrackCollectionMerger.cxx @@ -0,0 +1,217 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +/////////////////////////////////////////////////////////////////// +// Implementation file for class Trk::TrackCollectionMerger +/////////////////////////////////////////////////////////////////// +// (c) ATLAS Detector software +/////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////// +// Version 1.0 11/26/2007 Thomas Koffas +/////////////////////////////////////////////////////////////////// + +#include "GaudiKernel/MsgStream.h" +#include "TrkPrepRawData/PrepRawData.h" +#include "TrkTrackCollectionMerger/TrackCollectionMerger.h" + +/////////////////////////////////////////////////////////////////// +// Constructor +/////////////////////////////////////////////////////////////////// + +Trk::TrackCollectionMerger::TrackCollectionMerger +(const std::string& name, ISvcLocator* pSvcLocator ) : + AthAlgorithm(name, pSvcLocator ), + m_createViewCollection(true), + m_updateSharedHitsOnly(true) +{ + m_outtracklocation = "CombinedInDetTracks" ; + + declareProperty("TracksLocation", m_tracklocation ); + declareProperty("OutputTracksLocation", m_outtracklocation ); + declareProperty("AssoTool", m_assoTool ); + declareProperty("SummaryTool" , m_trkSummaryTool ); + declareProperty("CreateViewColllection" , m_createViewCollection ); + declareProperty("UpdateSharedHitsOnly" , m_updateSharedHitsOnly); + +} + +/////////////////////////////////////////////////////////////////// +// Initialisation +/////////////////////////////////////////////////////////////////// + +StatusCode Trk::TrackCollectionMerger::initialize() +{ + + ATH_MSG_DEBUG("Initializing TrackCollectionMerger"); + + if ( m_assoTool.retrieve().isFailure() ) { + msg(MSG::FATAL) << "Failed to retrieve tool " << m_assoTool << endreq; + return StatusCode::FAILURE; + } else + ATH_MSG_INFO("Retrieved tool " << m_assoTool); + + if (m_trkSummaryTool.retrieve().isFailure()) { + msg(MSG::FATAL) << "Failed to retrieve tool " << m_trkSummaryTool << endreq; + return StatusCode::FAILURE; + } else + ATH_MSG_INFO("Retrieved tool " << m_trkSummaryTool); + + return StatusCode::SUCCESS; +} + + +/////////////////////////////////////////////////////////////////// +// Execute +/////////////////////////////////////////////////////////////////// +StatusCode Trk::TrackCollectionMerger::execute() +{ + // clean up association tool + m_assoTool->reset(); + + // out output track collection + TrackCollection* outputCol = m_createViewCollection ? + new TrackCollection(SG::VIEW_ELEMENTS) : new TrackCollection; + ATH_MSG_DEBUG("Number of Track collections " << m_tracklocation.size()); + + // pre-loop to reserve enough space in the output collection + std::vector<const TrackCollection*> trackCollections; + trackCollections.reserve(m_tracklocation.size()); + size_t ttNumber = 0; + for (auto& tcname : m_tracklocation){ + const TrackCollection* trackCol; + ///Retrieve forward tracks from StoreGate + if (evtStore()->retrieve(trackCol,tcname).isFailure()){ + ATH_MSG_DEBUG("No tracks with name " << tcname); + } else { + ATH_MSG_DEBUG("Found track collection " << tcname ); + trackCollections.push_back(trackCol); + ttNumber += trackCol->size(); + } + } + // reserve the right number of entries for the output collection + outputCol->reserve(ttNumber); + // merging loop + for(auto& tciter : trackCollections){ + // merge them in + if(mergeTrack(tciter,outputCol).isFailure()){ + ATH_MSG_ERROR( "Failed to merge tracks! "); + } + } + + ATH_MSG_DEBUG("Size of combined tracks " << outputCol->size()); + if( evtStore()->record(outputCol,m_outtracklocation,false).isFailure() ){ + ATH_MSG_ERROR("Could not save the reconstructed TRT seeded Si tracks!"); + return StatusCode::FAILURE ; + } + + ATH_MSG_DEBUG("Update summaries"); + // now loop over all tracks and update summaries with new shared hit counts + TrackCollection::iterator rf = outputCol->begin(); + TrackCollection::iterator rfE = outputCol->end(); + for( ; rf != rfE; ++rf){ + if (m_updateSharedHitsOnly) m_trkSummaryTool->updateSharedHitCount(**rf); + else m_trkSummaryTool->updateTrack(**rf); + } + + //Print common event information + if(msgLvl(MSG::DEBUG)){ + ATH_MSG_DEBUG((*this)); + } + + ATH_MSG_DEBUG("Done !"); + return StatusCode::SUCCESS; +} + +/////////////////////////////////////////////////////////////////// +// Finalize +/////////////////////////////////////////////////////////////////// + +StatusCode Trk::TrackCollectionMerger::finalize() +{ + return StatusCode::SUCCESS; +} + +/////////////////////////////////////////////////////////////////// +// Dumps relevant information into the MsgStream +/////////////////////////////////////////////////////////////////// + +MsgStream& Trk::TrackCollectionMerger::dump( MsgStream& out ) const +{ + out<<std::endl; + if(msgLvl(MSG::DEBUG)) return dumpevent(out); + return dumptools(out); +} + +/////////////////////////////////////////////////////////////////// +// Dumps conditions information into the MsgStream +/////////////////////////////////////////////////////////////////// + +MsgStream& Trk::TrackCollectionMerger::dumptools( MsgStream& out ) const +{ + return out; +} + +/////////////////////////////////////////////////////////////////// +// Dumps event information into the MsgStream +/////////////////////////////////////////////////////////////////// + +MsgStream& Trk::TrackCollectionMerger::dumpevent( MsgStream& out ) const +{ + return out; +} + +/////////////////////////////////////////////////////////////////// +// Dumps relevant information into the ostream +/////////////////////////////////////////////////////////////////// + +std::ostream& Trk::TrackCollectionMerger::dump( std::ostream& out ) const +{ + return out; +} + +/////////////////////////////////////////////////////////////////// +// Overload of << operator MsgStream +/////////////////////////////////////////////////////////////////// + +MsgStream& Trk::operator << + (MsgStream& sl,const Trk::TrackCollectionMerger& se) +{ + return se.dump(sl); +} + +/////////////////////////////////////////////////////////////////// +// Overload of << operator std::ostream +/////////////////////////////////////////////////////////////////// + +std::ostream& Trk::operator << + (std::ostream& sl,const Trk::TrackCollectionMerger& se) +{ + return se.dump(sl); +} + + +/////////////////////////////////////////////////////////////////// +// Merge track collections and remove duplicates +/////////////////////////////////////////////////////////////////// + +StatusCode Trk::TrackCollectionMerger::mergeTrack(const TrackCollection* trackCol, TrackCollection* outputCol) +{ + // loop over forward track, accept them and add them imto association tool + if(trackCol && trackCol->size()) { + ATH_MSG_DEBUG("Size of track collection " << trackCol->size()); + + // loop over tracks + for(auto& rf: *trackCol){ + // add track into output + Trk::Track* newTrack = m_createViewCollection ? rf : new Trk::Track(*rf); + outputCol->push_back(newTrack); + // add tracks into PRD tool + if (m_assoTool->addPRDs(*newTrack).isFailure()) + msg(MSG::WARNING) << "Failed to add PRDs to map" << endreq; + } + } + + return StatusCode::SUCCESS; +} + diff --git a/Tracking/TrkAlgorithms/TrkTrackCollectionMerger/src/components/TrkTrackCollectionMerger_entries.cxx b/Tracking/TrkAlgorithms/TrkTrackCollectionMerger/src/components/TrkTrackCollectionMerger_entries.cxx new file mode 100644 index 0000000000000000000000000000000000000000..734e7a343985e80ef7c82a4a15645581edaf6e78 --- /dev/null +++ b/Tracking/TrkAlgorithms/TrkTrackCollectionMerger/src/components/TrkTrackCollectionMerger_entries.cxx @@ -0,0 +1,12 @@ +#include "GaudiKernel/DeclareFactoryEntries.h" +#include "TrkTrackCollectionMerger/TrackCollectionMerger.h" + +using namespace Trk; + +DECLARE_ALGORITHM_FACTORY( TrackCollectionMerger ) + +DECLARE_FACTORY_ENTRIES( TrkTrackCollectionMerger ) +{ + DECLARE_ALGORITHM( TrackCollectionMerger ) +} + diff --git a/Tracking/TrkAlgorithms/TrkTrackCollectionMerger/src/components/TrkTrackCollectionMerger_load.cxx b/Tracking/TrkAlgorithms/TrkTrackCollectionMerger/src/components/TrkTrackCollectionMerger_load.cxx new file mode 100644 index 0000000000000000000000000000000000000000..fe7827ecc26a4e41730351ac3e8254b92a408d20 --- /dev/null +++ b/Tracking/TrkAlgorithms/TrkTrackCollectionMerger/src/components/TrkTrackCollectionMerger_load.cxx @@ -0,0 +1,4 @@ +#include "GaudiKernel/LoadFactoryEntries.h" + +LOAD_FACTORY_ENTRIES( TrkTrackCollectionMerger) +