diff --git a/Event/xAOD/xAODTrackingCnv/CMakeLists.txt b/Event/xAOD/xAODTrackingCnv/CMakeLists.txt new file mode 100644 index 0000000000000000000000000000000000000000..10cdadba0e8f19433b0dcd8c125e671931511056 --- /dev/null +++ b/Event/xAOD/xAODTrackingCnv/CMakeLists.txt @@ -0,0 +1,36 @@ +################################################################################ +# Package: xAODTrackingCnv +################################################################################ + +# Declare the package name: +atlas_subdir( xAODTrackingCnv ) + +# Declare the package's dependencies: +atlas_depends_on_subdirs( PUBLIC + Event/xAOD/xAODTracking + Tracking/TrkEvent/TrkTrack + PRIVATE + Control/AthenaBaseComps + Control/AthenaKernel + Event/EventPrimitives + GaudiKernel + Generators/GeneratorObjects + PhysicsAnalysis/MCTruthClassifier + Reconstruction/Particle + Reconstruction/ParticleTruth + Tracking/TrkEvent/TrkLinks + Tracking/TrkEvent/TrkParticleBase + Tracking/TrkEvent/TrkTrackLink + Tracking/TrkEvent/TrkTruthData + Tracking/TrkEvent/VxVertex + Tracking/TrkTools/TrkToolInterfaces ) + +# Component(s) in the package: +atlas_add_component( xAODTrackingCnv + src/*.cxx + src/components/*.cxx + LINK_LIBRARIES xAODTracking TrkTrack AthenaBaseComps AthenaKernel EventPrimitives GaudiKernel GeneratorObjects MCTruthClassifierLib Particle ParticleTruth TrkLinks TrkParticleBase TrkTruthData VxVertex TrkToolInterfaces ) + +# Install files from the package: +atlas_install_headers( xAODTrackingCnv ) + diff --git a/Event/xAOD/xAODTrackingCnv/cmt/requirements b/Event/xAOD/xAODTrackingCnv/cmt/requirements index 3924f0383dbd6cc8d647cde83e7462684729effe..5ae167e0925c80ed3381c9ad88ee0a6a5a82eb81 100644 --- a/Event/xAOD/xAODTrackingCnv/cmt/requirements +++ b/Event/xAOD/xAODTrackingCnv/cmt/requirements @@ -8,6 +8,8 @@ use AtlasPolicy AtlasPolicy-* public use AtlasPolicy AtlasPolicy-* +use TrkTrack TrkTrack-* Tracking/TrkEvent +use xAODTracking xAODTracking-* Event/xAOD private use AthenaBaseComps AthenaBaseComps-* Control use AthenaKernel AthenaKernel-* Control @@ -19,11 +21,9 @@ use Particle Particle-* Reconstruction use ParticleTruth ParticleTruth-* Reconstruction use TrkParticleBase TrkParticleBase-* Tracking/TrkEvent use TrkToolInterfaces TrkToolInterfaces-* Tracking/TrkTools -use TrkTrack TrkTrack-* Tracking/TrkEvent use TrkTrackLink TrkTrackLink-* Tracking/TrkEvent use TrkTruthData TrkTruthData-* Tracking/TrkEvent use VxVertex VxVertex-* Tracking/TrkEvent -use xAODTracking xAODTracking-* Event/xAOD use TrkLinks TrkLinks-* Tracking/TrkEvent end_private diff --git a/Event/xAOD/xAODTrackingCnv/src/RecTrackParticleContainerCnvTool.cxx b/Event/xAOD/xAODTrackingCnv/src/RecTrackParticleContainerCnvTool.cxx new file mode 100644 index 0000000000000000000000000000000000000000..7cc27b0d2954ff346f76770b8f43733968cabad7 --- /dev/null +++ b/Event/xAOD/xAODTrackingCnv/src/RecTrackParticleContainerCnvTool.cxx @@ -0,0 +1,81 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +// $Id$ +// EDM include(s): +#include "xAODTracking/TrackParticle.h" +#include "xAODTracking/TrackParticleContainer.h" +#include "Particle/TrackParticleContainer.h" + +// Local include(s): +#include "RecTrackParticleContainerCnvTool.h" + + + +namespace xAODMaker { + + RecTrackParticleContainerCnvTool::RecTrackParticleContainerCnvTool( const std::string& type, + const std::string& name, + const IInterface* parent ) + : AthAlgTool( type, name, parent ), + m_particleCreator("Trk::TrackParticleCreatorTool/TrackParticleCreatorTool") + { + + // Declare the interface(s) provided by the tool: + declareInterface< IRecTrackParticleContainerCnvTool >( this ); + declareProperty( "TrackParticleCreator" , m_particleCreator ); + } + + StatusCode RecTrackParticleContainerCnvTool::initialize() { + // Greet the user: + ATH_MSG_INFO( "Initializing - Package version: " << PACKAGE_VERSION ); + ATH_CHECK( m_particleCreator.retrieve() ); + + return StatusCode::SUCCESS; + } + + StatusCode RecTrackParticleContainerCnvTool::convert( const Rec::TrackParticleContainer* aod, + xAOD::TrackParticleContainer* xaod ) { + + ATH_MSG_DEBUG( "Sizes of containers before conversion: aod, xaod: " << aod->size() << ", " << xaod->size() ); + Rec::TrackParticleContainer::const_iterator itr = aod->begin(); + Rec::TrackParticleContainer::const_iterator end = aod->end(); + + for( ;itr!=end;++itr ) { + // Create the xAOD object: + if (!(*itr)) { + ATH_MSG_WARNING("WTaF? Empty element in container!"); + continue; + } + xAOD::TrackParticle* particle = createParticle(xaod, aod, *itr); + + if(!particle){ + ATH_MSG_WARNING("Failed to create a TrackParticle"); + continue; + } + } + + ATH_MSG_DEBUG( "Sizes of containers after conversion: aod, xaod: " << aod->size() << ", " << xaod->size() ); + + return StatusCode::SUCCESS; + } + + + xAOD::TrackParticle* RecTrackParticleContainerCnvTool::createParticle( xAOD::TrackParticleContainer* xaod, + const Rec::TrackParticleContainer* /**container*/, + const Rec::TrackParticle* tp) + { + // create the xAOD::TrackParticle, the pointer is added to the container in the function + return m_particleCreator->createParticle( *tp, xaod ); + } // createParticleAndTruth + + StatusCode RecTrackParticleContainerCnvTool::setParticleCreatorTool(ToolHandle<Trk::ITrackParticleCreatorTool> *tool) + { + ATH_MSG_DEBUG( "In setParticleCreatorTool" ); + m_particleCreator = *tool; + + return StatusCode::SUCCESS; + } + +} // namespace xAODMaker diff --git a/Event/xAOD/xAODTrackingCnv/src/RecTrackParticleContainerCnvTool.h b/Event/xAOD/xAODTrackingCnv/src/RecTrackParticleContainerCnvTool.h new file mode 100644 index 0000000000000000000000000000000000000000..42939dd865fa1d24672ebb46abc7288781dde7ce --- /dev/null +++ b/Event/xAOD/xAODTrackingCnv/src/RecTrackParticleContainerCnvTool.h @@ -0,0 +1,51 @@ +// Dear emacs, this is -*- c++ -*- + +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +// $Id$ +#ifndef XAODTRACKINGCNV_RECTRACKPARTICLECONTAINERCNVTOOL_H +#define XAODTRACKINGCNV_RECTRACKPARTICLECONTAINERCNVTOOL_H + +// Gaudi/Athena include(s): +#include "AthenaBaseComps/AthAlgTool.h" +#include "GaudiKernel/ToolHandle.h" + +// converting tool that will be invoked +#include "TrkToolInterfaces/ITrackParticleCreatorTool.h" + +// Local include(s): +#include "xAODTrackingCnv/IRecTrackParticleContainerCnvTool.h" + +namespace xAODMaker { + + class RecTrackParticleContainerCnvTool : public AthAlgTool, + public virtual IRecTrackParticleContainerCnvTool { + + public: + /// Regular AlgTool constructor + RecTrackParticleContainerCnvTool( const std::string& type, const std::string& name, + const IInterface* parent ); + + /// Function initialising the tool + virtual StatusCode initialize(); + + /// Function that fills an existing xAOD::TrackParticleContainer + virtual StatusCode convert( const Rec::TrackParticleContainer* aod, + xAOD::TrackParticleContainer* xaod ); + + /// allow other algorithms to pass the tool in order to preserve initialisation + virtual StatusCode setParticleCreatorTool(ToolHandle<Trk::ITrackParticleCreatorTool> *tool); + + private: + ToolHandle<Trk::ITrackParticleCreatorTool> m_particleCreator; + + inline xAOD::TrackParticle* createParticle(xAOD::TrackParticleContainer* xaod, const Rec::TrackParticleContainer* container, const Rec::TrackParticle* tp) ; + + + }; // class RecTrackParticleContainerCnvTool definition + +} // xAODMaker namespace + +#endif // XAODTRACKINGCNV_RECTRACKPARTICLECONTAINERCNVTOOL_H diff --git a/Event/xAOD/xAODTrackingCnv/src/TrackCollectionCnvTool.cxx b/Event/xAOD/xAODTrackingCnv/src/TrackCollectionCnvTool.cxx new file mode 100644 index 0000000000000000000000000000000000000000..98a3e9a84368ba3f08646a19f5b985071445d0fa --- /dev/null +++ b/Event/xAOD/xAODTrackingCnv/src/TrackCollectionCnvTool.cxx @@ -0,0 +1,81 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +// EDM include(s): +// $Id$ +#include "xAODTracking/TrackParticle.h" +#include "xAODTracking/TrackParticleContainer.h" +#include "TrkTrack/TrackCollection.h" + +// Local include(s): +#include "TrackCollectionCnvTool.h" + +namespace xAODMaker { + + TrackCollectionCnvTool::TrackCollectionCnvTool( const std::string& type, + const std::string& name, + const IInterface* parent ) + : AthAlgTool( type, name, parent ), + m_particleCreator("Trk::TrackParticleCreatorTool/TrackParticleCreatorTool") + { + + // Declare the interface(s) provided by the tool: + declareInterface< ITrackCollectionCnvTool >( this ); + declareProperty( "TrackParticleCreator", m_particleCreator ); + } + + StatusCode TrackCollectionCnvTool::initialize() { + // Greet the user: + ATH_MSG_INFO( "Initializing - Package version: " << PACKAGE_VERSION ); + ATH_CHECK( m_particleCreator.retrieve() ); + + return StatusCode::SUCCESS; + } + + StatusCode TrackCollectionCnvTool::convert( const TrackCollection* aod, + xAOD::TrackParticleContainer* xaod ) { + + ATH_MSG_DEBUG( "Sizes of containers before conversion: aod, xaod: " << aod->size() << ", " << xaod->size() ); + + TrackCollection::const_iterator itr = aod->begin(); + TrackCollection::const_iterator end = aod->end(); + + for( ;itr!=end;++itr ) { + // Create the xAOD object: + if (!(*itr)) { + ATH_MSG_WARNING("WTaF? Empty element in container!"); + continue; + } + xAOD::TrackParticle* particle = createParticle(*xaod, *aod, **itr); + + if(!particle){ + ATH_MSG_WARNING("Failed to create a TrackParticle"); + continue; + } + } + + ATH_MSG_DEBUG( "Sizes of containers after conversion: aod, xaod: " << aod->size() << ", " << xaod->size() ); + + return StatusCode::SUCCESS; + } + + xAOD::TrackParticle* TrackCollectionCnvTool::createParticle(xAOD::TrackParticleContainer& xaod, + const TrackCollection& container, + const Trk::Track& tp) { + // create the xAOD::TrackParticle, the pointer is added to the container in the function + ElementLink<TrackCollection> trackLink( &tp, container ); + return m_particleCreator->createParticle( trackLink, &xaod ); + //no! return m_particleCreator->createParticle( tp, &xaod ); + } + + StatusCode TrackCollectionCnvTool::setParticleCreatorTool(ToolHandle<Trk::ITrackParticleCreatorTool> *tool) + { + ATH_MSG_DEBUG( "In setParticleCreatorTool" ); + m_particleCreator = *tool; + + return StatusCode::SUCCESS; + } + +} // namespace xAODMaker + diff --git a/Event/xAOD/xAODTrackingCnv/src/TrackCollectionCnvTool.h b/Event/xAOD/xAODTrackingCnv/src/TrackCollectionCnvTool.h new file mode 100644 index 0000000000000000000000000000000000000000..d19ffa1e4794340813f4a16327bfd532f8f826dc --- /dev/null +++ b/Event/xAOD/xAODTrackingCnv/src/TrackCollectionCnvTool.h @@ -0,0 +1,51 @@ +// Dear emacs, this is -*- c++ -*- + +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +// $Id$ +#ifndef XAODTRACKINGCNV_TRACKCOLLECTIONCNVTOOL_H +#define XAODTRACKINGCNV_TRACKCOLLECTIONCNVTOOL_H + +// Gaudi/Athena include(s): +#include "AthenaBaseComps/AthAlgTool.h" +#include "GaudiKernel/ToolHandle.h" + +// converting tool that will be invoked +#include "TrkToolInterfaces/ITrackParticleCreatorTool.h" + +// Local include(s): +#include "xAODTrackingCnv/ITrackCollectionCnvTool.h" + +namespace xAODMaker { + + class TrackCollectionCnvTool : public AthAlgTool, + public virtual ITrackCollectionCnvTool { + + public: + /// Regular AlgTool constructor + TrackCollectionCnvTool( const std::string& type, const std::string& name, + const IInterface* parent ); + + /// Function initialising the tool + virtual StatusCode initialize(); + + /// Function that fills an existing xAOD::TrackParticleContainer + virtual StatusCode convert( const TrackCollection* aod, + xAOD::TrackParticleContainer* xaod ); + + /// allow other algorithms to pass the tool in order to preserve initialisation + virtual StatusCode setParticleCreatorTool(ToolHandle<Trk::ITrackParticleCreatorTool> *tool); + + private: + ToolHandle<Trk::ITrackParticleCreatorTool> m_particleCreator; + + inline xAOD::TrackParticle* createParticle(xAOD::TrackParticleContainer& xaod, const TrackCollection& container, const Trk::Track& tp) ; + + + }; // class TrackCollectionCnvTool definition + +} // xAODMaker namespace + +#endif // XAODTRACKINGCNV_TRACKCOLLECTIONCNVTOOL_H diff --git a/Event/xAOD/xAODTrackingCnv/src/TrackParticleCnvAlg.cxx b/Event/xAOD/xAODTrackingCnv/src/TrackParticleCnvAlg.cxx index 29666ac4f195c24a8011dbd09b2f95a605093319..f98efaa7b48f4c501062fed85ee63eaa1430c591 100644 --- a/Event/xAOD/xAODTrackingCnv/src/TrackParticleCnvAlg.cxx +++ b/Event/xAOD/xAODTrackingCnv/src/TrackParticleCnvAlg.cxx @@ -20,14 +20,19 @@ // Local include(s): #include "TrackParticleCnvAlg.h" +#include "xAODTrackingCnv/ITrackCollectionCnvTool.h" +#include "xAODTrackingCnv/IRecTrackParticleContainerCnvTool.h" namespace xAODMaker { TrackParticleCnvAlg::TrackParticleCnvAlg( const std::string& name, - ISvcLocator* svcLoc ) + ISvcLocator* svcLoc ) : AthAlgorithm( name, svcLoc ), m_particleCreator("Trk::TrackParticleCreatorTool/TrackParticleCreatorTool"), m_truthClassifier("MCTruthClassifier/MCTruthClassifier"), + m_TrackCollectionCnvTool( "xAODMaker::TrackCollectionCnvTool/TrackCollectionCnvTool", this ), + m_RecTrackParticleContainerCnvTool( "xAODMaker::RecTrackParticleContainerCnvTool/RecTrackParticleContainerCnvTool", this ), + m_truthParticleLinkVec(0), m_numEvents(0), m_nTracksProcessed(0), m_nTrackParticlesCreated(0), @@ -64,7 +69,7 @@ namespace xAODMaker { m_numberOfSCTSpoiltHits(0), m_numberOfTRTHoles(0), m_numberOfTRTDeadStraws(0), - m_numberOfTRTTubeHits(0) + m_numberOfTRTTubeHits(0) { declareProperty( "MCTruthClassifier", m_truthClassifier); declareProperty( "AODContainerName", m_aodContainerName = "TrackParticleCandidate" ); @@ -79,6 +84,8 @@ namespace xAODMaker { declareProperty( "ConvertTrackParticles", m_convertAODTrackParticles = true ); declareProperty( "ConvertTracks", m_convertTracks = false ); declareProperty( "PrintIDSummaryInfo", m_IdOutputInfo = false ); + declareProperty( "TrackCollectionCnvTool", m_TrackCollectionCnvTool ); + declareProperty( "RecTrackParticleContainerCnvTool", m_RecTrackParticleContainerCnvTool ); } StatusCode TrackParticleCnvAlg::initialize() { @@ -88,7 +95,14 @@ namespace xAODMaker { ATH_MSG_DEBUG( "xAODContainerName = " << m_xaodContainerName ); ATH_CHECK(m_particleCreator.retrieve()); ATH_CHECK(m_truthClassifier.retrieve()); - // Return gracefully: + ATH_CHECK( m_TrackCollectionCnvTool.retrieve() ); + ATH_CHECK( m_RecTrackParticleContainerCnvTool.retrieve() ); + // to preserve the inisialised parameters of the ParticleCreatorTool: + ATH_CHECK( m_TrackCollectionCnvTool->setParticleCreatorTool( &m_particleCreator ) ); + ATH_CHECK( m_RecTrackParticleContainerCnvTool->setParticleCreatorTool( &m_particleCreator ) ); + + + // Return gracefully: return StatusCode::SUCCESS; } @@ -122,7 +136,6 @@ namespace xAODMaker { const TrackParticleTruthCollection* aodTruth = 0; const TrackTruthCollection* trackTruth = 0; - m_truthParticleLinkVec = 0; if( m_addTruthLink ){ if (m_convertAODTrackParticles){ aodTruth = evtStore()->tryConstRetrieve<TrackParticleTruthCollection>(m_aodTruthContainerName); @@ -146,42 +159,72 @@ namespace xAODMaker { } } - if (m_convertTracks) convert(*tracks, trackTruth, m_xaodTracksContainerName); - if (m_convertAODTrackParticles) convert(*aod, aodTruth, m_xaodContainerName); + if (m_convertTracks) convert(*tracks, trackTruth, m_xaodTracksContainerName, m_TrackCollectionCnvTool); + if (m_convertAODTrackParticles) convert(*aod, aodTruth, m_xaodContainerName, m_RecTrackParticleContainerCnvTool); return StatusCode::SUCCESS; } - template<typename CONT, typename TRUTHCONT> - void TrackParticleCnvAlg::convert(const CONT& container, const TRUTHCONT& truth, const std::string& xaodName){ + template<typename CONT, typename TRUTHCONT, typename CONVTOOL> + int TrackParticleCnvAlg::convert(const CONT& container, const TRUTHCONT& truth, const std::string& xaodName, CONVTOOL& conv_tool){ // Create the xAOD container and its auxiliary store: + xAOD::TrackParticleContainer* xaod = new xAOD::TrackParticleContainer(); - if( evtStore()->record( xaod, xaodName ).isFailure() ){ - ATH_MSG_ERROR("Couldn't record "<<xaodName); - return; - } xAOD::TrackParticleAuxContainer* aux = new xAOD::TrackParticleAuxContainer(); - if( evtStore()->record( aux, xaodName+ "Aux." ).isFailure() ){ - ATH_MSG_ERROR("Couldn't record "<<xaodName<<"Aux."); - return; + + if (evtStore()->contains<xAOD::TrackParticleContainer> (xaodName)) { + CHECK(evtStore()->overwrite(aux, xaodName+"Aux.", true, false)); + xaod->setStore( aux ); + CHECK(evtStore()->overwrite(xaod,xaodName, true, false)); + ATH_MSG_DEBUG( "Overwrote TrackParticles with key: " << xaodName ); + } + else{ + CHECK(evtStore()->record(aux, xaodName+"Aux.")); + xaod->setStore(aux); + CHECK(evtStore()->record(xaod, xaodName)); + ATH_MSG_DEBUG( "Recorded TrackParticles with key: " << xaodName ); + } + + // convert the track containers separately with the converting tools that are also used by TrigHLTtoxAODTool + ATH_MSG_DEBUG( "calling the converting tool for " << xaodName ); + if( conv_tool->convert( &container, xaod ).isFailure() ) { + ATH_MSG_ERROR("Couldn't convert aod to xaod (" << xaodName << ") with the converting tool"); + return -1; } - xaod->setStore( aux ); // Create the xAOD objects: typename CONT::const_iterator itr = container.begin(); typename CONT::const_iterator end = container.end(); + xAOD::TrackParticleContainer::iterator itr_xaod = xaod->begin(); + xAOD::TrackParticleContainer::iterator end_xaod = xaod->end(); + + // loop over AOD and converted xAOD for summary info and truth links for( ;itr!=end;++itr ) { + //protect if something went wrong and there is no converted xaod equivalent + if( itr_xaod == end_xaod ) { + ATH_MSG_ERROR("No xAOD equivalent of the AOD track was found"); + return -1; + } + m_nTracksProcessed++; + // Create the xAOD object: if (!(*itr)) { - ATH_MSG_WARNING("WTaF? Empty element in container!"); + ATH_MSG_WARNING("WTaF? Empty element in AOD container!"); continue; } - xAOD::TrackParticle* particle = createParticle(*xaod, container, **itr); + if (!(*itr_xaod)) { + ATH_MSG_WARNING("WTaF? Empty element in xAOD container!"); + continue; + } + + // xAOD::TrackParticle* particle = createParticle(*xaod, container, **itr); + xAOD::TrackParticle* particle = 0; + particle = *itr_xaod; if(!particle){ - ATH_MSG_WARNING("Failed to create a TrackParticle"); + ATH_MSG_WARNING("Failed to get an xAOD::TrackParticle"); continue; } @@ -191,50 +234,50 @@ namespace xAODMaker { // if (m_IdOutputInfo) { - // integer entries in the summary can be -1 or -999, strange I know but that is the design ... + // integer entries in the summary can be -1 or -999, strange I know but that is the design ... uint8_t numberOfBLayerHits=0; if (particle->summaryValue(numberOfBLayerHits,xAOD::numberOfBLayerHits)) m_numberOfBLayerHits += numberOfBLayerHits; uint8_t numberOfBLayerSharedHits=0; if (particle->summaryValue(numberOfBLayerSharedHits,xAOD::numberOfBLayerSharedHits)) m_numberOfBLayerSharedHits += numberOfBLayerSharedHits; - uint8_t numberOfBLayerOutliers=0; + uint8_t numberOfBLayerOutliers=0; if (particle->summaryValue(numberOfBLayerOutliers,xAOD::numberOfBLayerOutliers)) m_numberOfBLayerOutliers += numberOfBLayerOutliers; - uint8_t numberOfContribPixelLayers = 0; + uint8_t numberOfContribPixelLayers = 0; if (particle->summaryValue(numberOfContribPixelLayers,xAOD::numberOfContribPixelLayers)) m_numberOfContribPixelLayers += numberOfContribPixelLayers; - uint8_t numberOfPixelHits = 0; + uint8_t numberOfPixelHits = 0; if (particle->summaryValue(numberOfPixelHits,xAOD::numberOfPixelHits)) m_numberOfPixelHits += numberOfPixelHits; uint8_t numberOfPixelSharedHits = 0; if (particle->summaryValue(numberOfPixelSharedHits,xAOD::numberOfPixelSharedHits)) m_numberOfPixelSharedHits += numberOfPixelSharedHits; - uint8_t numberOfPixelHoles = 0; + uint8_t numberOfPixelHoles = 0; if (particle->summaryValue(numberOfPixelHoles,xAOD::numberOfPixelHoles)) m_numberOfPixelHoles += numberOfPixelHoles; - uint8_t numberOfGangedPixels = 0; + uint8_t numberOfGangedPixels = 0; if (particle->summaryValue(numberOfGangedPixels,xAOD::numberOfGangedPixels)) m_numberOfGangedPixels += numberOfGangedPixels; - uint8_t numberOfGangedFlaggedFakes = 0; + uint8_t numberOfGangedFlaggedFakes = 0; if (particle->summaryValue(numberOfGangedFlaggedFakes,xAOD::numberOfGangedFlaggedFakes)) m_numberOfGangedFlaggedFakes += numberOfGangedFlaggedFakes; - uint8_t numberOfSCTHits = 0; + uint8_t numberOfSCTHits = 0; if (particle->summaryValue(numberOfSCTHits,xAOD::numberOfSCTHits)) m_numberOfSCTHits += numberOfSCTHits; - uint8_t numberOfSCTSharedHits = 0; + uint8_t numberOfSCTSharedHits = 0; if (particle->summaryValue(numberOfSCTSharedHits,xAOD::numberOfSCTSharedHits)) m_numberOfSCTSharedHits += numberOfSCTSharedHits; uint8_t numberOfSCTHoles = 0; if (particle->summaryValue(numberOfSCTHoles,xAOD::numberOfSCTHoles)) m_numberOfSCTHoles += numberOfSCTHoles; uint8_t numberOfSCTDoubleHoles = 0; if (particle->summaryValue(numberOfSCTDoubleHoles,xAOD::numberOfSCTDoubleHoles)) m_numberOfSCTDoubleHoles += numberOfSCTDoubleHoles; - uint8_t numberOfTRTHits = 0; + uint8_t numberOfTRTHits = 0; if (particle->summaryValue(numberOfTRTHits,xAOD::numberOfTRTHits)) m_numberOfTRTHits += numberOfTRTHits; - uint8_t numberOfTRTXenonHits = 0; + uint8_t numberOfTRTXenonHits = 0; if (particle->summaryValue(numberOfTRTXenonHits,xAOD::numberOfTRTXenonHits)) m_numberOfTRTXenonHits += numberOfTRTXenonHits; uint8_t numberOfTRTHighThresholdHits = 0; if (particle->summaryValue(numberOfTRTHighThresholdHits,xAOD::numberOfTRTHighThresholdHits)) m_numberOfTRTHighThresholdHits += numberOfTRTHighThresholdHits; - uint8_t numberOfTRTOutliers = 0; + uint8_t numberOfTRTOutliers = 0; if (particle->summaryValue(numberOfTRTOutliers,xAOD::numberOfTRTOutliers)) m_numberOfTRTOutliers += numberOfTRTOutliers; - uint8_t numberOfTRTHighThresholdOutliers = 0; + uint8_t numberOfTRTHighThresholdOutliers = 0; if (particle->summaryValue(numberOfTRTHighThresholdOutliers,xAOD::numberOfTRTHighThresholdOutliers)) m_numberOfTRTHighThresholdOutliers+= numberOfTRTHighThresholdOutliers; - uint8_t numberOfOutliersOnTrack = 0; + uint8_t numberOfOutliersOnTrack = 0; if (particle->summaryValue(numberOfOutliersOnTrack,xAOD::numberOfOutliersOnTrack)) m_numberOfOutliersOnTrack += numberOfOutliersOnTrack; - uint8_t numberOfPixelOutliers = 0; + uint8_t numberOfPixelOutliers = 0; if (particle->summaryValue(numberOfPixelOutliers,xAOD::numberOfPixelOutliers)) m_numberOfPixelOutliers += numberOfPixelOutliers; - uint8_t numberOfPixelDeadSensors = 0; + uint8_t numberOfPixelDeadSensors = 0; if (particle->summaryValue(numberOfPixelDeadSensors,xAOD::numberOfPixelDeadSensors)) m_numberOfPixelDeadSensors +=numberOfPixelDeadSensors ; - uint8_t numberOfPixelSpoiltHits = 0; + uint8_t numberOfPixelSpoiltHits = 0; if (particle->summaryValue( numberOfPixelSpoiltHits,xAOD::numberOfPixelSpoiltHits)) m_numberOfPixelSpoiltHits += numberOfPixelSpoiltHits; uint8_t expectBLayerHit = 0; @@ -274,15 +317,15 @@ namespace xAODMaker { if( result == truth->end() ){ ATH_MSG_WARNING("Failed find truth associated with Track/TrackParticle"); }else{ - // setTruthLink(link,result->second, type, origin); + // setTruthLink(link,result->second, type, origin); ATH_MSG_VERBOSE("Found track Truth: barcode " << result->second.particleLink().barcode() - << " evt " << result->second.particleLink().eventIndex()); + << " evt " << result->second.particleLink().eventIndex()); probability = result->second.probability(); link = m_truthParticleLinkVec->find(result->second.particleLink()); if( link.isValid() ){ ATH_MSG_DEBUG("Found matching xAOD Truth: barcode " << (*link)->barcode() << " pt " << (*link)->pt() - << " eta " << (*link)->eta() << " phi " << (*link)->phi()); - // if configured also get truth classification + << " eta " << (*link)->eta() << " phi " << (*link)->phi()); + // if configured also get truth classification if( result->second.particleLink().cptr() && !m_truthClassifier.empty() ){ auto truthClass = m_truthClassifier->particleTruthClassifier(result->second.particleLink().cptr()); type = truthClass.first; @@ -294,7 +337,7 @@ namespace xAODMaker { } ElementLink<xAOD::TruthParticleContainer>& theLink = particle->auxdata<ElementLink<xAOD::TruthParticleContainer> >("truthParticleLink" ); - // set element link + // set element link theLink = link; float& theProbability = const_cast<xAOD::TrackParticle*>(particle)->auxdata<float>("truthMatchProbability"); theProbability = probability; @@ -305,123 +348,132 @@ namespace xAODMaker { theOrigin = static_cast<int>(origin); } } + ++itr_xaod; + }// loop over aod tracks + + ATH_MSG_DEBUG( "Converted [" << container.size() << " -> " << xaod->size() << "] TrackParticles and stored in " << xaodName ); + if(container.size() != xaod->size()) { + ATH_MSG_ERROR( "number of items in the AOD container: " + << container.size() + << " is not equal to the number of items in its converted xAOD equivalent: " + << xaod->size() ); + return -1; } - ATH_MSG_DEBUG( "Converted ["<<container.size()<<"] TrackParticles and stored in " << xaodName ); - return; + return 1; } xAOD::TrackParticle* TrackParticleCnvAlg::createParticle( xAOD::TrackParticleContainer& xaod, - const Rec::TrackParticleContainer& /**container*/, - const Rec::TrackParticle& tp) + const Rec::TrackParticleContainer& /**container*/, + const Rec::TrackParticle& tp) { // create the xAOD::TrackParticle, the pointer is added to the container in the function return m_particleCreator->createParticle(tp,&xaod); } // createParticleAndTruth xAOD::TrackParticle* TrackParticleCnvAlg::createParticle( xAOD::TrackParticleContainer& xaod, - const TrackCollection& container, - const Trk::Track& tp) + const TrackCollection& container, + const Trk::Track& tp) { // create the xAOD::TrackParticle, the pointer is added to the container in the function ElementLink<TrackCollection> trackLink(&tp,container); return m_particleCreator->createParticle(trackLink,&xaod); } -StatusCode TrackParticleCnvAlg::finalize() { + StatusCode TrackParticleCnvAlg::finalize() { - if (m_IdOutputInfo){ + if (m_IdOutputInfo){ - double nTP = (double)m_nTrackParticlesCreated; + double nTP = (double)m_nTrackParticlesCreated; - msg(MSG::INFO) << std::setiosflags(std::ios::fixed | std::ios::showpoint) << std::setw(9) << std::setprecision(3); - msg(MSG::INFO) << " --- InDetParticleCreation Summary: " << endreq; + msg(MSG::INFO) << std::setiosflags(std::ios::fixed | std::ios::showpoint) << std::setw(9) << std::setprecision(3); + msg(MSG::INFO) << " --- InDetParticleCreation Summary: " << endreq; - msg(MSG::INFO) << " --- Input TrackCollection : \"" << m_aodTrackContainerName << "\" with " << m_nTracksProcessed << " Tracks ("; - msg(MSG::INFO) << ( m_numEvents ? (double)m_nTracksProcessed/(double)m_numEvents : 0 ) << " per event)." << endreq; + msg(MSG::INFO) << " --- Input TrackCollection : \"" << m_aodTrackContainerName << "\" with " << m_nTracksProcessed << " Tracks ("; + msg(MSG::INFO) << ( m_numEvents ? (double)m_nTracksProcessed/(double)m_numEvents : 0 ) << " per event)." << endreq; - msg(MSG::INFO) << " --- Output TrackParticleContainer : \"" << m_xaodTracksContainerName << "\" with " << nTP << " TrackParticles ("; - msg(MSG::INFO) << (m_numEvents ? nTP/(double)m_numEvents : 0 ) << " per event)." << endreq; + msg(MSG::INFO) << " --- Output TrackParticleContainer : \"" << m_xaodTracksContainerName << "\" with " << nTP << " TrackParticles ("; + msg(MSG::INFO) << (m_numEvents ? nTP/(double)m_numEvents : 0 ) << " per event)." << endreq; - if (m_nTrackParticlesCreated>0){ - msg(MSG::INFO) << " --- /Track in -----> " - << " BLayer " - << " Pixel " - << " SCT " - << " TRT " - << " All (P+S+T)" << endreq; - msg(MSG::INFO) << " --- Hits " - << (double)m_numberOfBLayerHits/nTP << " " - << (double)m_numberOfPixelHits/nTP << " " - << (double)m_numberOfSCTHits/nTP << " " - << (double)m_numberOfTRTHits/nTP << " " - << (double)(m_numberOfPixelHits+m_numberOfSCTHits+m_numberOfTRTHits)/nTP << endreq; - msg(MSG::INFO) << " --- Shared Hits " - << (double)m_numberOfBLayerSharedHits/nTP << " " - << (double)m_numberOfPixelSharedHits/nTP << " " - << (double)m_numberOfSCTSharedHits/nTP << " " - << " " << " " - << " " << (double)(m_numberOfPixelSharedHits+m_numberOfSCTSharedHits)/nTP << endreq; - msg(MSG::INFO) << " --- Spoiled/Tube Hits " - << " " - << (double)m_numberOfPixelSpoiltHits/nTP << " " - << (double)m_numberOfSCTSpoiltHits/nTP << " " - << " " << (double)m_numberOfTRTTubeHits/nTP << " " - << " " << (double)(m_numberOfPixelSpoiltHits+m_numberOfSCTSpoiltHits+m_numberOfTRTTubeHits)/nTP << endreq; - msg(MSG::INFO) << " --- Outliers " - << (double)m_numberOfBLayerOutliers/nTP << " " - << (double)m_numberOfPixelOutliers/nTP << " " - << (double)m_numberOfSCTOutliers/nTP << " " - << " " << (double)m_numberOfTRTOutliers/nTP << " " - << " " << (double)m_numberOfOutliersOnTrack/nTP << endreq; - msg(MSG::INFO) << " --- Holes " - << " " - << (double)m_numberOfPixelHoles/nTP << " " - << (double)m_numberOfSCTHoles/nTP << " " - << " " << (double)m_numberOfTRTHoles/nTP << " " - << " " << (double)(m_numberOfPixelHoles+m_numberOfSCTHoles+m_numberOfTRTHoles)/nTP << endreq; - msg(MSG::INFO) << " missed (exp) blayer " << (double) m_numberOfBlayersMissed/nTP << endreq; - msg(MSG::INFO) << " SCT Double Holes " - << " " - << " " - << (double)m_numberOfSCTDoubleHoles/nTP - << endreq; - msg(MSG::INFO) << " --- Dead Sensors/Straws " - << " " - << (double)m_numberOfPixelDeadSensors/nTP << " " - << (double)m_numberOfSCTDeadSensors/nTP << " " - << " " << (double)m_numberOfTRTDeadStraws/nTP << " " - << " " << (double)(m_numberOfPixelDeadSensors+m_numberOfSCTDeadSensors+m_numberOfTRTDeadStraws)/nTP - << endreq; - msg(MSG::INFO) << " --- Add info Pixels " << endreq; - msg(MSG::INFO) << " contributing layers " << (double)m_numberOfContribPixelLayers/nTP << endreq; - msg(MSG::INFO) << " ganged pixels " << (double)m_numberOfGangedPixels/nTP << endreq; - msg(MSG::INFO) << " ganged flagged as fake " << (double)m_numberOfGangedFlaggedFakes/nTP << endreq; - msg(MSG::INFO) << " --- Add info TRT " << endreq; - msg(MSG::INFO) << " High Threshold Hits " - << " " - << " " - << " " - << " " << (double)m_numberOfTRTHighThresholdHits/nTP - << endreq; - msg(MSG::INFO) << " High thre. outliers " - << " " - << " " - << " " - << " " << (double)m_numberOfTRTHighThresholdOutliers/nTP - << endreq; - msg(MSG::INFO) << " Xenon hits" - << " " - << " " - << " " - << " " << (double)m_numberOfTRTXenonHits/nTP - << endreq; + if (m_nTrackParticlesCreated>0){ + msg(MSG::INFO) << " --- /Track in -----> " + << " BLayer " + << " Pixel " + << " SCT " + << " TRT " + << " All (P+S+T)" << endreq; + msg(MSG::INFO) << " --- Hits " + << (double)m_numberOfBLayerHits/nTP << " " + << (double)m_numberOfPixelHits/nTP << " " + << (double)m_numberOfSCTHits/nTP << " " + << (double)m_numberOfTRTHits/nTP << " " + << (double)(m_numberOfPixelHits+m_numberOfSCTHits+m_numberOfTRTHits)/nTP << endreq; + msg(MSG::INFO) << " --- Shared Hits " + << (double)m_numberOfBLayerSharedHits/nTP << " " + << (double)m_numberOfPixelSharedHits/nTP << " " + << (double)m_numberOfSCTSharedHits/nTP << " " + << " " << " " + << " " << (double)(m_numberOfPixelSharedHits+m_numberOfSCTSharedHits)/nTP << endreq; + msg(MSG::INFO) << " --- Spoiled/Tube Hits " + << " " + << (double)m_numberOfPixelSpoiltHits/nTP << " " + << (double)m_numberOfSCTSpoiltHits/nTP << " " + << " " << (double)m_numberOfTRTTubeHits/nTP << " " + << " " << (double)(m_numberOfPixelSpoiltHits+m_numberOfSCTSpoiltHits+m_numberOfTRTTubeHits)/nTP << endreq; + msg(MSG::INFO) << " --- Outliers " + << (double)m_numberOfBLayerOutliers/nTP << " " + << (double)m_numberOfPixelOutliers/nTP << " " + << (double)m_numberOfSCTOutliers/nTP << " " + << " " << (double)m_numberOfTRTOutliers/nTP << " " + << " " << (double)m_numberOfOutliersOnTrack/nTP << endreq; + msg(MSG::INFO) << " --- Holes " + << " " + << (double)m_numberOfPixelHoles/nTP << " " + << (double)m_numberOfSCTHoles/nTP << " " + << " " << (double)m_numberOfTRTHoles/nTP << " " + << " " << (double)(m_numberOfPixelHoles+m_numberOfSCTHoles+m_numberOfTRTHoles)/nTP << endreq; + msg(MSG::INFO) << " missed (exp) blayer " << (double) m_numberOfBlayersMissed/nTP << endreq; + msg(MSG::INFO) << " SCT Double Holes " + << " " + << " " + << (double)m_numberOfSCTDoubleHoles/nTP + << endreq; + msg(MSG::INFO) << " --- Dead Sensors/Straws " + << " " + << (double)m_numberOfPixelDeadSensors/nTP << " " + << (double)m_numberOfSCTDeadSensors/nTP << " " + << " " << (double)m_numberOfTRTDeadStraws/nTP << " " + << " " << (double)(m_numberOfPixelDeadSensors+m_numberOfSCTDeadSensors+m_numberOfTRTDeadStraws)/nTP + << endreq; + msg(MSG::INFO) << " --- Add info Pixels " << endreq; + msg(MSG::INFO) << " contributing layers " << (double)m_numberOfContribPixelLayers/nTP << endreq; + msg(MSG::INFO) << " ganged pixels " << (double)m_numberOfGangedPixels/nTP << endreq; + msg(MSG::INFO) << " ganged flagged as fake " << (double)m_numberOfGangedFlaggedFakes/nTP << endreq; + msg(MSG::INFO) << " --- Add info TRT " << endreq; + msg(MSG::INFO) << " High Threshold Hits " + << " " + << " " + << " " + << " " << (double)m_numberOfTRTHighThresholdHits/nTP + << endreq; + msg(MSG::INFO) << " High thre. outliers " + << " " + << " " + << " " + << " " << (double)m_numberOfTRTHighThresholdOutliers/nTP + << endreq; + msg(MSG::INFO) << " Xenon hits" + << " " + << " " + << " " + << " " << (double)m_numberOfTRTXenonHits/nTP + << endreq; - } else - msg(MSG::INFO) << " No TrackParticles have been created ... skipping output." << endreq; - } + } else + msg(MSG::INFO) << " No TrackParticles have been created ... skipping output." << endreq; + } msg(MSG::DEBUG) << "finalize() success" << endreq; return StatusCode::SUCCESS; } diff --git a/Event/xAOD/xAODTrackingCnv/src/TrackParticleCnvAlg.h b/Event/xAOD/xAODTrackingCnv/src/TrackParticleCnvAlg.h index 12219ad4f6bb54afe1525102d90e27cdaf892cbd..fe7eaf989b9f7248ab3e52f2f7601ab13e9870d1 100644 --- a/Event/xAOD/xAODTrackingCnv/src/TrackParticleCnvAlg.h +++ b/Event/xAOD/xAODTrackingCnv/src/TrackParticleCnvAlg.h @@ -27,118 +27,126 @@ namespace Trk { class ITrackParticleCreatorTool; } class IMCTruthClassifier; +namespace xAODMaker { + class ITrackCollectionCnvTool; + class IRecTrackParticleContainerCnvTool; +} namespace xAODMaker { - /** - * @short Algorithm creating xAOD::TrackParticles from TrackParticles - * - * This algorithm can be used to translate the TrackParticles coming - * from an AOD, and create xAOD::TrackParticle objects out of them - * for an output xAOD. - * - * @author Edward Moyse <Edward.Moyse@cern.ch> - * @author Attila Krasznahorkay <Attila.Krasznahorkay@cern.ch> - * - * $Revision: 297747 $ - * $Date: 2013-10-28 16:14:24 +0100 (Mon, 28 Oct 2013) $ - */ - class TrackParticleCnvAlg : public AthAlgorithm { - - public: - /// Regular algorithm constructor - TrackParticleCnvAlg( const std::string& name, ISvcLocator* svcLoc ); - - /// Function initialising the algorithm - virtual StatusCode initialize(); - /// Function executing the algorithm - virtual StatusCode execute(); - - virtual StatusCode finalize(); - - private: - /// The key of the input TrackParticlesContainer - std::string m_aodContainerName; - /// The key for the output xAOD::TrackParticlesContainer - std::string m_xaodContainerName; - /// toggle on adding truth links - bool m_addTruthLink; - /// The key for the input TrackParticleTruthCollection - std::string m_aodTruthContainerName; + /** + * @short Algorithm creating xAOD::TrackParticles from TrackParticles + * + * This algorithm can be used to translate the TrackParticles coming + * from an AOD, and create xAOD::TrackParticle objects out of them + * for an output xAOD. + * + * @author Edward Moyse <Edward.Moyse@cern.ch> + * @author Attila Krasznahorkay <Attila.Krasznahorkay@cern.ch> + * + * $Revision: 297747 $ + * $Date: 2013-10-28 16:14:24 +0100 (Mon, 28 Oct 2013) $ + */ + class TrackParticleCnvAlg : public AthAlgorithm { + + public: + /// Regular algorithm constructor + TrackParticleCnvAlg( const std::string& name, ISvcLocator* svcLoc ); + + /// Function initialising the algorithm + virtual StatusCode initialize(); + /// Function executing the algorithm + virtual StatusCode execute(); + + virtual StatusCode finalize(); + + private: + /// The key of the input TrackParticlesContainer + std::string m_aodContainerName; + /// The key for the output xAOD::TrackParticlesContainer + std::string m_xaodContainerName; + /// toggle on adding truth links + bool m_addTruthLink; + /// The key for the input TrackParticleTruthCollection + std::string m_aodTruthContainerName; - /// The key for the input DetailedTrackTrackTruthCollection - std::string m_trackTruthContainerName; + /// The key for the input DetailedTrackTrackTruthCollection + std::string m_trackTruthContainerName; - /// The key for the input xAODTruthLinkVector - std::string m_truthLinkVecName; - - /// ToolHandle to particle creator - ToolHandle<Trk::ITrackParticleCreatorTool> m_particleCreator; - /// ToolHandle to truth classifier - ToolHandle<IMCTruthClassifier> m_truthClassifier; - - /// The key of the input TracksContainer - std::string m_aodTrackContainerName; - /// The key for the output xAOD::TrackParticlesContainer for the Tracks - std::string m_xaodTracksContainerName; + /// The key for the input xAODTruthLinkVector + std::string m_truthLinkVecName; + + /// ToolHandle to particle creator + ToolHandle<Trk::ITrackParticleCreatorTool> m_particleCreator; + /// ToolHandle to truth classifier + ToolHandle<IMCTruthClassifier> m_truthClassifier; + + // handles to the converting tools + ToolHandle< xAODMaker::ITrackCollectionCnvTool > m_TrackCollectionCnvTool; + ToolHandle< xAODMaker::IRecTrackParticleContainerCnvTool > m_RecTrackParticleContainerCnvTool; + + /// The key of the input TracksContainer + std::string m_aodTrackContainerName; + /// The key for the output xAOD::TrackParticlesContainer for the Tracks + std::string m_xaodTracksContainerName; - /// toggle on converting AOD track particles to xAOD - bool m_convertAODTrackParticles; + /// toggle on converting AOD track particles to xAOD + bool m_convertAODTrackParticles; - /// toggle on converting tracks to xAOD - bool m_convertTracks; + /// toggle on converting tracks to xAOD + bool m_convertTracks; - template <typename CONT, typename TRUTHCONT> - void convert(const CONT&, const TRUTHCONT&, const std::string& name); + template <typename CONT, typename TRUTHCONT, typename CONVTOOL> + int convert(const CONT&, const TRUTHCONT&, const std::string& name, CONVTOOL& tool); - inline xAOD::TrackParticle* createParticle(xAOD::TrackParticleContainer& xaod, const Rec::TrackParticleContainer& container, const Rec::TrackParticle& tp) ; - inline xAOD::TrackParticle* createParticle( xAOD::TrackParticleContainer& xaod, const TrackCollection& container, const Trk::Track& tp) ; - const xAODTruthParticleLinkVector* m_truthParticleLinkVec; + inline xAOD::TrackParticle* createParticle(xAOD::TrackParticleContainer& xaod, const Rec::TrackParticleContainer& container, const Rec::TrackParticle& tp) ; + inline xAOD::TrackParticle* createParticle( xAOD::TrackParticleContainer& xaod, const TrackCollection& container, const Trk::Track& tp) ; + const xAODTruthParticleLinkVector* m_truthParticleLinkVec; - bool m_IdOutputInfo; + bool m_IdOutputInfo; - unsigned int m_numEvents; - /** the number of Trk::Tracks processed, this is equal to the sum of tracks over all events in the input TrackContainer */ - unsigned long m_nTracksProcessed; - /** the number of Rec::TrackParticle created, should be the same as Trk::Tracks processed but one never knows! */ - unsigned long m_nTrackParticlesCreated; + unsigned int m_numEvents; + /** the number of Trk::Tracks processed, this is equal to the sum of tracks over all events in the input TrackContainer */ + unsigned long m_nTracksProcessed; + /** the number of Rec::TrackParticle created, should be the same as Trk::Tracks processed but one never knows! */ + unsigned long m_nTrackParticlesCreated; - unsigned int m_numberOfBLayerHits; - unsigned int m_numberOfBLayerSharedHits; - unsigned int m_numberOfBLayerOutliers; + unsigned int m_numberOfBLayerHits; + unsigned int m_numberOfBLayerSharedHits; + unsigned int m_numberOfBLayerOutliers; - unsigned int m_numberOfContribPixelLayers; - unsigned int m_numberOfPixelHits; - unsigned int m_numberOfPixelSharedHits; - unsigned int m_numberOfPixelHoles; - unsigned int m_numberOfGangedPixels; - unsigned int m_numberOfGangedFlaggedFakes; + unsigned int m_numberOfContribPixelLayers; + unsigned int m_numberOfPixelHits; + unsigned int m_numberOfPixelSharedHits; + unsigned int m_numberOfPixelHoles; + unsigned int m_numberOfGangedPixels; + unsigned int m_numberOfGangedFlaggedFakes; - unsigned int m_numberOfSCTHits; - unsigned int m_numberOfSCTSharedHits; - unsigned int m_numberOfSCTHoles; - unsigned int m_numberOfSCTDoubleHoles; - unsigned int m_numberOfTRTHits; - unsigned int m_numberOfTRTXenonHits; - unsigned int m_numberOfTRTHighThresholdHits; - unsigned int m_numberOfTRTOutliers; - unsigned int m_numberOfTRTHighThresholdOutliers; - unsigned int m_numberOfOutliersOnTrack; + unsigned int m_numberOfSCTHits; + unsigned int m_numberOfSCTSharedHits; + unsigned int m_numberOfSCTHoles; + unsigned int m_numberOfSCTDoubleHoles; + unsigned int m_numberOfTRTHits; + unsigned int m_numberOfTRTXenonHits; + unsigned int m_numberOfTRTHighThresholdHits; + unsigned int m_numberOfTRTOutliers; + unsigned int m_numberOfTRTHighThresholdOutliers; + unsigned int m_numberOfOutliersOnTrack; - unsigned int m_numberOfPixelOutliers; - unsigned int m_numberOfPixelDeadSensors; - unsigned int m_numberOfPixelSpoiltHits; - unsigned int m_numberOfBlayersMissed; + unsigned int m_numberOfPixelOutliers; + unsigned int m_numberOfPixelDeadSensors; + unsigned int m_numberOfPixelSpoiltHits; + unsigned int m_numberOfBlayersMissed; - unsigned int m_numberOfSCTOutliers; - unsigned int m_numberOfSCTDeadSensors; - unsigned int m_numberOfSCTSpoiltHits; - unsigned int m_numberOfTRTHoles; - unsigned int m_numberOfTRTDeadStraws; - unsigned int m_numberOfTRTTubeHits; - - }; // class TrackParticleCnvAlg - + unsigned int m_numberOfSCTOutliers; + unsigned int m_numberOfSCTDeadSensors; + unsigned int m_numberOfSCTSpoiltHits; + unsigned int m_numberOfTRTHoles; + unsigned int m_numberOfTRTDeadStraws; + unsigned int m_numberOfTRTTubeHits; + + }; // class TrackParticleCnvAlg + } // namespace xAODMaker #endif // XAODCREATORALGS_TRACKPARTICLECREATOR_H diff --git a/Event/xAOD/xAODTrackingCnv/src/VertexCnvAlg.cxx b/Event/xAOD/xAODTrackingCnv/src/VertexCnvAlg.cxx index f37d8a908fea2f470c051e729f56b2a6258ad811..a591c214d8b974f5425ab461798c344ccf3a67e1 100644 --- a/Event/xAOD/xAODTrackingCnv/src/VertexCnvAlg.cxx +++ b/Event/xAOD/xAODTrackingCnv/src/VertexCnvAlg.cxx @@ -58,11 +58,20 @@ namespace xAODMaker { // Create the xAOD container and its auxiliary store: xAOD::VertexContainer* xaod = new xAOD::VertexContainer(); - CHECK( evtStore()->record( xaod, m_xaodContainerName ) ); xAOD::VertexAuxContainer* aux = new xAOD::VertexAuxContainer(); - CHECK( evtStore()->record( aux, m_xaodContainerName + "Aux." ) ); - xaod->setStore( aux ); - ATH_MSG_DEBUG( "Recorded Vertexes with key: " << m_xaodContainerName ); + + if (evtStore()->contains<xAOD::VertexContainer>(m_xaodContainerName)) { + CHECK( evtStore()->overwrite( aux, m_xaodContainerName + "Aux.",true,false) ); + CHECK( evtStore()->overwrite( xaod, m_xaodContainerName,true,false) ); + xaod->setStore( aux ); + ATH_MSG_DEBUG( "Overwrote Vertexes with key: " << m_xaodContainerName ); + } + else{ + CHECK( evtStore()->record( aux, m_xaodContainerName + "Aux." ) ); + CHECK( evtStore()->record( xaod, m_xaodContainerName ) ); + xaod->setStore( aux ); + ATH_MSG_DEBUG( "Recorded Vertexes with key: " << m_xaodContainerName ); + } // Create the xAOD objects: auto itr = aod->begin(); diff --git a/Event/xAOD/xAODTrackingCnv/src/components/xAODTrackingCnv_entries.cxx b/Event/xAOD/xAODTrackingCnv/src/components/xAODTrackingCnv_entries.cxx index 94d94d4a8876f6ab32a361ac53e3f14635c1f8f7..93b22be5b37137dd3499b272a4c404d3809e5bd1 100644 --- a/Event/xAOD/xAODTrackingCnv/src/components/xAODTrackingCnv_entries.cxx +++ b/Event/xAOD/xAODTrackingCnv/src/components/xAODTrackingCnv_entries.cxx @@ -4,13 +4,19 @@ #include "GaudiKernel/DeclareFactoryEntries.h" // Local include(s): +#include "../TrackCollectionCnvTool.h" +#include "../RecTrackParticleContainerCnvTool.h" #include "../TrackParticleCnvAlg.h" #include "../VertexCnvAlg.h" +DECLARE_NAMESPACE_TOOL_FACTORY( xAODMaker, RecTrackParticleContainerCnvTool ) +DECLARE_NAMESPACE_TOOL_FACTORY( xAODMaker, TrackCollectionCnvTool ) DECLARE_NAMESPACE_ALGORITHM_FACTORY( xAODMaker, TrackParticleCnvAlg ) DECLARE_NAMESPACE_ALGORITHM_FACTORY( xAODMaker, VertexCnvAlg ) DECLARE_FACTORY_ENTRIES( xAODCreatorAlgs ) { - DECLARE_NAMESPACE_ALGORITHM( xAODMaker, TrackParticleCnvAlg ) + DECLARE_NAMESPACE_TOOL( xAODMaker, RecTrackParticleContainerCnvTool ) + DECLARE_NAMESPACE_TOOL( xAODMaker, TrackCollectionCnvTool ) + DECLARE_NAMESPACE_ALGORITHM( xAODMaker, TrackParticleCnvAlg ) DECLARE_NAMESPACE_ALGORITHM( xAODMaker, VertexCnvAlg ) -} + } diff --git a/Event/xAOD/xAODTrackingCnv/xAODTrackingCnv/IRecTrackParticleContainerCnvTool.h b/Event/xAOD/xAODTrackingCnv/xAODTrackingCnv/IRecTrackParticleContainerCnvTool.h new file mode 100644 index 0000000000000000000000000000000000000000..40e16e1637755b4c22aea707b083a60313c316e2 --- /dev/null +++ b/Event/xAOD/xAODTrackingCnv/xAODTrackingCnv/IRecTrackParticleContainerCnvTool.h @@ -0,0 +1,54 @@ +// Dear emacs, this is -*- c++ -*- + +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +// $Id$ +#ifndef XAODTRACKINGCNV_IRECTRACKPARTICLECONTAINERCNVTOOL_H +#define XAODTRACKINGCNV_IRECTRACKPARTICLECONTAINERCNVTOOL_H + +// Gaudi/Athena include(s): +#include "GaudiKernel/IAlgTool.h" + +// EDM include(s): +#include "xAODTracking/TrackParticleContainer.h" +//#include "TrkTrack/TrackCollection.h" + +// Forward declaration(s): +namespace Rec { +class TrackParticleContainer; +} + +namespace Trk { + class ITrackParticleCreatorTool; +} + + +namespace xAODMaker { + + /// The interface provided by IRecTrackParticleContainerCnvTool + static const InterfaceID + IID_IRecTrackParticleContainerCnvTool( "xAODMaker::IRecTrackParticleContainerCnvTool", 1, 0 ); + + + class IRecTrackParticleContainerCnvTool : public virtual IAlgTool { + + public: + /// Function that fills an existing xAOD::TrackParticleContainer + virtual StatusCode convert( const Rec::TrackParticleContainer* aod, + xAOD::TrackParticleContainer* xaod ) = 0; + + virtual StatusCode setParticleCreatorTool(ToolHandle<Trk::ITrackParticleCreatorTool> *tool) = 0; + + /// Gaudi interface definition + static const InterfaceID& interfaceID() { + return IID_IRecTrackParticleContainerCnvTool; + } + + };//class definition + +} // xAODMaker namespace + + +#endif // XAODTRACKINGCNV_IRECTRACKPARTICLECONTAINERCNVTOOL_H diff --git a/Event/xAOD/xAODTrackingCnv/xAODTrackingCnv/ITrackCollectionCnvTool.h b/Event/xAOD/xAODTrackingCnv/xAODTrackingCnv/ITrackCollectionCnvTool.h new file mode 100644 index 0000000000000000000000000000000000000000..f57ebb0f0441f18b467d681be91fa378258c2bf1 --- /dev/null +++ b/Event/xAOD/xAODTrackingCnv/xAODTrackingCnv/ITrackCollectionCnvTool.h @@ -0,0 +1,50 @@ +// Dear emacs, this is -*- c++ -*- + +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +// $Id$ +#ifndef XAODTRACKINGCNV_ITRACKCOLLECTIONCNVTOOL_H +#define XAODTRACKINGCNV_ITRACKCOLLECTIONCNVTOOL_H + +// Gaudi/Athena include(s): +#include "GaudiKernel/IAlgTool.h" + +// EDM include(s): +#include "xAODTracking/TrackParticleContainer.h" +#include "TrkTrack/TrackCollection.h" +// Forward declaration(s): +//class TrackCollection; - no - typedef + +namespace Trk { + class ITrackParticleCreatorTool; +} + +namespace xAODMaker { + + /// The interface provided by ITrackCollectionCnvTool + static const InterfaceID + IID_ITrackCollectionCnvTool( "xAODMaker::ITrackCollectionCnvTool", 1, 0 ); + + + class ITrackCollectionCnvTool : public virtual IAlgTool { + + public: + /// Function that fills an existing xAOD::TrackParticleContainer + virtual StatusCode convert( const TrackCollection* aod, + xAOD::TrackParticleContainer* xaod ) = 0; + + virtual StatusCode setParticleCreatorTool(ToolHandle<Trk::ITrackParticleCreatorTool> *tool) = 0; + + /// Gaudi interface definition + static const InterfaceID& interfaceID() { + return IID_ITrackCollectionCnvTool; + } + + };//class definition + +} // xAODMaker namespace + + +#endif // XAODTRACKINGCNV_ITRACKCOLLECTIONCNVTOOL_H