diff --git a/Event/xAOD/xAODTruthCnv/CMakeLists.txt b/Event/xAOD/xAODTruthCnv/CMakeLists.txt new file mode 100644 index 0000000000000000000000000000000000000000..67910e31268069f826812a5226392024d34781b4 --- /dev/null +++ b/Event/xAOD/xAODTruthCnv/CMakeLists.txt @@ -0,0 +1,30 @@ +################################################################################ +# Package: xAODTruthCnv +################################################################################ + +# Declare the package name: +atlas_subdir( xAODTruthCnv ) + +# Declare the package's dependencies: +atlas_depends_on_subdirs( PRIVATE + Control/AthenaBaseComps + Control/AthenaKernel + Control/DataModel + Control/StoreGate + Event/xAOD/xAODTruth + GaudiKernel + Generators/GeneratorObjects ) + +# External dependencies: +find_package( ROOT COMPONENTS Core Tree MathCore Hist RIO pthread ) + +# Component(s) in the package: +atlas_add_component( xAODTruthCnv + src/*.cxx + src/components/*.cxx + INCLUDE_DIRS ${ROOT_INCLUDE_DIRS} + LINK_LIBRARIES ${ROOT_LIBRARIES} AthenaBaseComps AthenaKernel DataModel StoreGateLib SGtests xAODTruth GaudiKernel GeneratorObjects ) + +# Install files from the package: +atlas_install_joboptions( share/*.py ) + diff --git a/Event/xAOD/xAODTruthCnv/src/xAODTruthCnvAlg.cxx b/Event/xAOD/xAODTruthCnv/src/xAODTruthCnvAlg.cxx index e86608a28ee594cc0ccca0e2e536da16b482c5bd..69818e3834c73f01c588c10423314015c5620f37 100644 --- a/Event/xAOD/xAODTruthCnv/src/xAODTruthCnvAlg.cxx +++ b/Event/xAOD/xAODTruthCnv/src/xAODTruthCnvAlg.cxx @@ -49,6 +49,7 @@ namespace xAODMaker { declareProperty("TruthLinks", m_truthLinkContainerName="xAODTruthLinks" ); declareProperty( "WriteAllPileUpTruth", m_doAllPileUp = false); declareProperty( "WriteInTimePileUpTruth", m_doInTimePileUp = false); + declareProperty( "ForceRerun", m_forceRerun = false); } @@ -75,11 +76,12 @@ namespace xAODMaker { StatusCode xAODTruthCnvAlg::execute() { // If the containers already exist then assume that nothing needs to be done - /// @todo Should this check be AND rather than OR? - if (evtStore()->contains< xAOD::TruthEventContainer >(m_xaodTruthEventContainerName) || - evtStore()->contains< xAOD::TruthPileupEventContainer >(m_xaodTruthPUEventContainerName) || - evtStore()->contains< xAOD::TruthParticleContainer >(m_xaodTruthParticleContainerName) || - evtStore()->contains< xAOD::TruthVertexContainer >(m_xaodTruthVertexContainerName)) { + /// @todo Should this check be AND rather than OR? But pileup might be missing. + if ((evtStore()->contains< xAOD::TruthEventContainer >(m_xaodTruthEventContainerName) || + evtStore()->contains< xAOD::TruthPileupEventContainer >(m_xaodTruthPUEventContainerName) || + evtStore()->contains< xAOD::TruthParticleContainer >(m_xaodTruthParticleContainerName) || + evtStore()->contains< xAOD::TruthVertexContainer >(m_xaodTruthVertexContainerName)) && + !m_forceRerun) { ATH_MSG_WARNING("xAOD Truth seems to be already available in the event"); return StatusCode::SUCCESS; } @@ -105,12 +107,16 @@ namespace xAODMaker { xTruthEventContainer->setStore( xTruthEventAuxContainer ); ATH_MSG_DEBUG( "Recorded TruthEventContainer with key: " << m_xaodTruthEventContainerName ); // Pile-up events - xAOD::TruthPileupEventContainer* xTruthPileupEventContainer = new xAOD::TruthPileupEventContainer(); - CHECK( evtStore()->record( xTruthPileupEventContainer, m_xaodTruthPUEventContainerName ) ); - xAOD::TruthPileupEventAuxContainer* xTruthPileupEventAuxContainer = new xAOD::TruthPileupEventAuxContainer(); - CHECK( evtStore()->record( xTruthPileupEventAuxContainer, m_xaodTruthPUEventContainerName + "Aux." ) ); - xTruthPileupEventContainer->setStore( xTruthPileupEventAuxContainer ); - ATH_MSG_DEBUG( "Recorded TruthPileupEventContainer with key: " << m_xaodTruthPUEventContainerName ); + xAOD::TruthPileupEventContainer* xTruthPileupEventContainer = 0; + xAOD::TruthPileupEventAuxContainer* xTruthPileupEventAuxContainer = 0; + if (m_doAllPileUp || m_doInTimePileUp) { + xTruthPileupEventContainer = new xAOD::TruthPileupEventContainer(); + CHECK( evtStore()->record( xTruthPileupEventContainer, m_xaodTruthPUEventContainerName ) ); + xTruthPileupEventAuxContainer = new xAOD::TruthPileupEventAuxContainer(); + CHECK( evtStore()->record( xTruthPileupEventAuxContainer, m_xaodTruthPUEventContainerName + "Aux." ) ); + xTruthPileupEventContainer->setStore( xTruthPileupEventAuxContainer ); + ATH_MSG_DEBUG( "Recorded TruthPileupEventContainer with key: " << m_xaodTruthPUEventContainerName ); + } // Particles xAOD::TruthParticleContainer* xTruthParticleContainer = new xAOD::TruthParticleContainer(); CHECK( evtStore()->record( xTruthParticleContainer, m_xaodTruthParticleContainerName ) ); @@ -312,7 +318,7 @@ namespace xAODMaker { // (c) Put particle into container; Build Event<->Vertex element link ElementLink<xAOD::TruthVertexContainer> eltv(*xTruthVertexContainer, xTruthVertexContainer->size()-1); // Mark if this is the signal process vertex - if (vertex == signalProcessVtx) xTruthEvent->setSignalProcessVertexLink(eltv); + if ((vertex == signalProcessVtx) && isSignalProcess) xTruthEvent->setSignalProcessVertexLink(eltv); if (isSignalProcess) xTruthEvent->addTruthVertexLink(eltv); if (!isSignalProcess) xTruthPileupEvent->addTruthVertexLink(eltv); // (d) Assign incoming particles to the vertex, from the map diff --git a/Event/xAOD/xAODTruthCnv/src/xAODTruthCnvAlg.h b/Event/xAOD/xAODTruthCnv/src/xAODTruthCnvAlg.h index 7ed2cd824aa838db861e0853cc310a2cbdcb6ff0..d8b17b539d088f2801fba4a7dcd861860d2f4dc3 100644 --- a/Event/xAOD/xAODTruthCnv/src/xAODTruthCnvAlg.h +++ b/Event/xAOD/xAODTruthCnv/src/xAODTruthCnvAlg.h @@ -66,6 +66,9 @@ namespace xAODMaker { bool m_doAllPileUp; bool m_doInTimePileUp; + /// a flag to force rerunning (useful for rerunning on ESDs) + bool m_forceRerun; + }; // class xAODTruthCnvAlg