27 declareInterface<Trk::IPRD_TruthTrajectoryBuilder>(
this);
37 ATH_MSG_ERROR (
"Could not get AtlasDetectorID helper. Arborting ...");
38 return StatusCode::FAILURE;
41 if ( !m_idPrdProvider.empty() && m_idPrdProvider.retrieve().isFailure()){
42 ATH_MSG_ERROR (
"Could not get " << m_idPrdProvider <<
". Arborting ..." );
43 return StatusCode::FAILURE;
46 if ( !m_msPrdProvider.empty() && m_msPrdProvider.retrieve().isFailure()){
47 ATH_MSG_ERROR (
"Could not get " << m_msPrdProvider <<
". Arborting ..." );
48 return StatusCode::FAILURE;
51 if ( !m_prdTruthTrajectoryManipulators.empty() && m_prdTruthTrajectoryManipulators.retrieve().isFailure()){
52 ATH_MSG_ERROR (
"Could not get configured " << m_prdTruthTrajectoryManipulators <<
". Arborting ..." );
53 return StatusCode::FAILURE;
56 ATH_CHECK( m_prdMultiTruthCollectionNames.initialize() );
58 return StatusCode::SUCCESS;
63 ATH_MSG_INFO(
"Calling refreshEvent() to reset cache and retrieve collections");
65 m_prdMultiTruthCollections.clear();
66 m_prdMultiTruthCollections.reserve(m_prdMultiTruthCollectionNames.size());
68 for(
const auto& pmtCollNameIter:m_prdMultiTruthCollectionNames){
72 ATH_MSG_WARNING(
"Could not retrieve " << pmtCollNameIter <<
". Ignoring ... ");
75 ATH_MSG_INFO(
"Added " << pmtCollNameIter <<
" to collection list for truth track creation.");
76 m_prdMultiTruthCollections.push_back(curColl.
cptr());
80 if (!m_idPrdProvider.empty() && m_idPrdProvider->retrieveCollection().isFailure()){
81 ATH_MSG_ERROR (
"Failure in collection retrieval of " << m_idPrdProvider <<
". Arborting ..." );
82 return StatusCode::FAILURE;
84 if (!m_msPrdProvider.empty() && m_msPrdProvider->retrieveCollection().isFailure()){
85 ATH_MSG_ERROR (
"Failure in collection retrieval of " << m_msPrdProvider <<
". Arborting ..." );
86 return StatusCode::FAILURE;
89 return StatusCode::SUCCESS;
98 std::map< HepMC::ConstGenParticlePtr, PRD_TruthTrajectory > gpPrdTruthTrajectories;
102 std::vector<const PRD_MultiTruthCollection*>::const_iterator pmtCollIter = m_prdMultiTruthCollections.begin();
103 std::vector<const PRD_MultiTruthCollection*>::const_iterator pmtCollIterE = m_prdMultiTruthCollections.end();
104 for ( ; pmtCollIter != pmtCollIterE; ++pmtCollIter ){
106 PRD_MultiTruthCollection::const_iterator prdMtCIter = (*pmtCollIter)->begin();
107 PRD_MultiTruthCollection::const_iterator prdMtCIterE = (*pmtCollIter)->end();
108 for ( ; prdMtCIter != prdMtCIterE; ++ prdMtCIter ){
117 Identifier curIdentifier = (*prdMtCIter).first;
119 if ( curGenP->momentum().perp() < m_minPt )
continue;
121 if (!m_geantinos && std::abs(curGenP->pdg_id())==999)
continue;
124 m_idPrdProvider->prdFromIdentifier(curIdentifier,
ndof) : m_msPrdProvider->prdFromIdentifier(curIdentifier,
ndof);
128 auto prdTrajIter = gpPrdTruthTrajectories.find(curGenP);
129 if ( prdTrajIter == gpPrdTruthTrajectories.end() ){
132 newPrdTruthTrajectory.
prds.push_back(prd);
133 newPrdTruthTrajectory.
nDoF =
ndof-5;
137 gpPrdTruthTrajectories[curGenP] = newPrdTruthTrajectory;
141 (prdTrajIter->second).prds.push_back(prd);
143 ndofTotal = (prdTrajIter->second).
nDoF;
145 ATH_MSG_DEBUG(
" Associating PRD with " <<
ndof <<
" degrees of freedom, total N.d.o.F : " << ndofTotal );
146 ATH_MSG_DEBUG(
" Associating Identifier " << curIdentifier <<
" with particle at [ " << curGenP <<
" ]." );
147 std::string prdtype = m_idHelper->is_pixel(curIdentifier) ?
"Pixel" : m_idHelper->is_sct(curIdentifier) ?
"SCT" :
"TRT";
150 std::string prdtype = m_idHelper->is_pixel(curIdentifier) ?
"Pixel" : m_idHelper->is_sct(curIdentifier) ?
"SCT" :
"TRT";
157 auto prdTruthTrajIter = gpPrdTruthTrajectories.begin();
158 auto prdTruthTrajIterE = gpPrdTruthTrajectories.end();
159 for ( ; prdTruthTrajIter != prdTruthTrajIterE; ++prdTruthTrajIter ){
160 if ( !m_prdTruthTrajectoryManipulators.empty() ){
161 ToolHandleArray<IPRD_TruthTrajectoryManipulator>::const_iterator prdTTMIter = m_prdTruthTrajectoryManipulators.begin();
162 ToolHandleArray<IPRD_TruthTrajectoryManipulator>::const_iterator prdTTMIterE = m_prdTruthTrajectoryManipulators.end();
163 for ( ; prdTTMIter != prdTTMIterE; ++prdTTMIter ){
164 if ((*prdTTMIter)->manipulateTruthTrajectory((*prdTruthTrajIter).second))
165 ATH_MSG_DEBUG(
"PRD truth trajectory got manipulated by: " << (*prdTTMIter).name() );
170 return gpPrdTruthTrajectories;
176 m_prdMultiTruthCollections.clear();
177 return StatusCode::SUCCESS;