20 const std::string& anaTag ) :
22 m_anaTag( anaTag ), m_trkAnaDefSvc( nullptr )
35 if( not m_trkAnaDefSvc ) {
36 ISvcLocator* svcLoc = Gaudi::svcLocator();
37 ATH_CHECK( svcLoc->service(
"TrkAnaDefSvc"+m_anaTag, m_trkAnaDefSvc ) );
43 if( m_trkAnaDefSvc->isTestTruth() ) {
44 m_matches = std::make_unique< TrackMatchingLookup_truthTrk >( m_anaTag );
47 else if( m_trkAnaDefSvc->isReferenceTruth() ) {
48 m_matches = std::make_unique< TrackMatchingLookup_trkTruth >( m_anaTag );
52 m_matches = std::make_unique< TrackMatchingLookup_trk >( m_anaTag );
55 return StatusCode::SUCCESS;
65 if( m_trkAnaDefSvc->useTruth() ) {
71 ATH_MSG_ERROR(
"Non valid truth particles collection: " << handleKey.
key() );
72 return StatusCode::FAILURE;
76 m_truthPartContainer = pColl.
ptr();
80 m_truthPartVec[
FULL ].insert(
84 m_truthPartContainer =
nullptr;
85 m_truthPartVec[
FULL ].clear();
88 return StatusCode::SUCCESS;
95 if( m_trkAnaDefSvc->useOffline() ) {
101 ATH_MSG_ERROR(
"Non valid offline tracks collection: " << handleKey.
key() );
102 return StatusCode::FAILURE;
106 m_offlTrackContainer = pColl.
ptr();
110 m_offlTrackVec[
FULL ].insert(
114 m_offlTrackContainer =
nullptr;
115 m_offlTrackVec[
FULL ].clear();
118 return StatusCode::SUCCESS;
125 if( m_trkAnaDefSvc->useTrigger()) {
131 ATH_MSG_ERROR(
"Non valid trigger tracks collection: " << handleKey.
key() );
132 return StatusCode::FAILURE;
136 m_trigTrackContainer = pColl.
ptr();
140 m_trigTrackVec[
FULL ].insert(
144 m_trigTrackContainer =
nullptr;
145 m_trigTrackVec[
FULL ].clear();
148 return StatusCode::SUCCESS;
156 const std::vector< const xAOD::TruthParticle* >&
vec,
159 if( m_trkAnaDefSvc->isTestTruth() ) {
160 m_truthPartVec[
stage ].clear();
161 m_truthPartVec[
stage ].insert(
164 return StatusCode::SUCCESS;
168 return StatusCode::SUCCESS;
173 const std::vector< const xAOD::TrackParticle* >&
vec,
176 if( m_trkAnaDefSvc->isTestOffline() ) {
177 m_offlTrackVec[
stage ].clear();
178 m_offlTrackVec[
stage ].insert(
181 return StatusCode::SUCCESS;
184 if( m_trkAnaDefSvc->isTestTrigger() ) {
185 m_trigTrackVec[
stage ].clear();
186 m_trigTrackVec[
stage ].insert(
189 return StatusCode::SUCCESS;
193 return StatusCode::SUCCESS;
198 const std::vector< const xAOD::TruthParticle* >&
vec,
201 if( m_trkAnaDefSvc->isReferenceTruth() ) {
202 m_truthPartVec[
stage ].clear();
203 m_truthPartVec[
stage ].insert(
206 return StatusCode::SUCCESS;
210 return StatusCode::SUCCESS;
215 const std::vector< const xAOD::TrackParticle* >&
vec,
218 if( m_trkAnaDefSvc->isReferenceOffline() ) {
219 m_offlTrackVec[
stage ].clear();
220 m_offlTrackVec[
stage ].insert(
223 return StatusCode::SUCCESS;
226 if( m_trkAnaDefSvc->isReferenceTrigger() ) {
227 m_trigTrackVec[
stage ].clear();
228 m_trigTrackVec[
stage ].insert(
231 return StatusCode::SUCCESS;
235 return StatusCode::SUCCESS;
240 const std::vector< const xAOD::TruthParticle* >&
vec,
243 if( m_trkAnaDefSvc->useTruth() ) {
244 m_truthPartVec[
stage ].clear();
245 m_truthPartVec[
stage ].insert(
248 return StatusCode::SUCCESS;
252 return StatusCode::SUCCESS;
257 const std::vector< const xAOD::TrackParticle* >&
vec,
260 if( m_trkAnaDefSvc->useOffline() ) {
261 m_offlTrackVec[
stage ].clear();
262 m_offlTrackVec[
stage ].insert(
265 return StatusCode::SUCCESS;
269 return StatusCode::SUCCESS;
274 const std::vector< const xAOD::TrackParticle* >&
vec,
277 if( m_trkAnaDefSvc->useTrigger() or m_trkAnaDefSvc->useEFTrigger() ) {
278 m_trigTrackVec[
stage ].clear();
279 m_trigTrackVec[
stage ].insert(
282 return StatusCode::SUCCESS;
286 return StatusCode::SUCCESS;
298 bool isTrigEmpty = m_trkAnaDefSvc->useTrigger() and not m_trkAnaDefSvc->useEFTrigger() and
300 m_trigTrackVec[
stage ].empty() :
false;
301 bool isEFTrigEmpty = m_trkAnaDefSvc->useEFTrigger() ?
302 m_trigTrackVec[
stage ].empty() :
false;
303 bool isOfflEmpty = m_trkAnaDefSvc->useOffline() ?
304 m_offlTrackVec[
stage ].empty() :
false;
305 bool isTruthEmpty = m_trkAnaDefSvc->useTruth() ?
306 m_truthPartVec[
stage ].empty() :
false;
308 if( isTrigEmpty or isEFTrigEmpty or isOfflEmpty or isTruthEmpty )
return true;
318 m_truthPartVec[
FULL ].clear();
319 m_offlTrackVec[
FULL ].clear();
320 m_trigTrackVec[
FULL ].clear();
323 m_truthPartVec[ FS ].clear();
324 m_offlTrackVec[ FS ].clear();
325 m_trigTrackVec[ FS ].clear();
328 m_truthPartVec[ InRoI ].clear();
329 m_offlTrackVec[ InRoI ].clear();
330 m_trigTrackVec[ InRoI ].clear();
340 m_offlTrackVec[ InRoI ].clear();
341 m_offlTrackVec[ InRoI ].insert(
342 m_offlTrackVec[ InRoI ].
begin(),
343 m_offlTrackVec[ FS ].
begin(),
344 m_offlTrackVec[ FS ].
end() );
347 m_truthPartVec[ InRoI ].clear();
348 m_truthPartVec[ InRoI ].insert(
349 m_truthPartVec[ InRoI ].
begin(),
350 m_truthPartVec[ FS ].
begin(),
351 m_truthPartVec[ FS ].
end() );
354 if (m_trkAnaDefSvc->useEFTrigger()) {
355 m_trigTrackVec[ InRoI ].clear();
356 m_trigTrackVec[ InRoI ].insert(
357 m_trigTrackVec[ InRoI ].
begin(),
358 m_trigTrackVec[ FS ].
begin(),
359 m_trigTrackVec[ FS ].
end() );
363 ATH_MSG_DEBUG(
"Tracks after in RoI copy: " << printInfo( InRoI ) );
373 if( m_trkAnaDefSvc->isTestTruth() ) {
374 return m_truthPartContainer;
384 if( m_trkAnaDefSvc->isTestOffline() ) {
385 return m_offlTrackContainer;
388 if( m_trkAnaDefSvc->isTestTrigger() ) {
389 return m_trigTrackContainer;
399 if( m_trkAnaDefSvc->isReferenceTruth() ) {
400 return m_truthPartContainer;
410 if( m_trkAnaDefSvc->isReferenceOffline() ) {
411 return m_offlTrackContainer;
414 if( m_trkAnaDefSvc->isReferenceTrigger() ) {
415 return m_trigTrackContainer;
425 const std::vector< const xAOD::TruthParticle* >&
429 if( m_trkAnaDefSvc->isTestTruth() ) {
430 return m_truthPartVec[
stage ];
434 return m_nullTruthVec;
438 const std::vector< const xAOD::TrackParticle* >&
442 if( m_trkAnaDefSvc->isTestOffline() ) {
443 return m_offlTrackVec[
stage ];
446 if( m_trkAnaDefSvc->isTestTrigger() ) {
447 return m_trigTrackVec[
stage ];
451 return m_nullTrackVec;
455 const std::vector< const xAOD::TruthParticle* >&
459 if( m_trkAnaDefSvc->isReferenceTruth() ) {
460 return m_truthPartVec[
stage ];
464 return m_nullTruthVec;
468 const std::vector< const xAOD::TrackParticle* >&
472 if( m_trkAnaDefSvc->isReferenceOffline() ) {
473 return m_offlTrackVec[
stage ];
476 if( m_trkAnaDefSvc->isReferenceTrigger() ) {
477 return m_trigTrackVec[
stage ];
481 return m_nullTrackVec;
491 std::stringstream
ss;
492 ss <<
"\n==========================================" << std::endl;
496 ss <<
"Offline track"
497 <<
" : pt = " <<
pT( *thisOfflineTrack )
498 <<
" : eta = " <<
eta( *thisOfflineTrack )
499 <<
" : phi = " <<
phi( *thisOfflineTrack )
501 if(
it > 20 ) {
ss <<
"et al...." << std::endl;
break; }
506 ss <<
"==========================================" << std::endl;
510 ss <<
"Truth particle"
511 <<
" : pt = " <<
pT( *thisTruthParticle )
512 <<
" : eta = " <<
eta( *thisTruthParticle )
513 <<
" : phi = " <<
phi( *thisTruthParticle )
515 if(
it > 20 ) {
ss <<
"et al...." << std::endl;
break; }
520 ss <<
"==========================================" << std::endl;
524 ss <<
"Trigger track"
525 <<
" : pt = " <<
pT( *thisTriggerTrack )
526 <<
" : eta = " <<
eta( *thisTriggerTrack )
527 <<
" : phi = " <<
phi( *thisTriggerTrack )
529 if(
it > 20 ) {
ss <<
"et al...." << std::endl;
break; }
534 ss <<
"==========================================" << std::endl;
546 if( m_trkAnaDefSvc->isTestTruth() ) {
547 return m_matches->printInfo( testTruthVec( InRoI ), refTrackVec( InRoI ) );
550 if( m_trkAnaDefSvc->isReferenceTruth() ) {
551 return m_matches->printInfo( testTrackVec( InRoI ), refTruthVec( InRoI ) );
554 return m_matches->printInfo( testTrackVec( InRoI ), refTrackVec( InRoI ) );
562 const std::string& chainRoi,
const std::string& roiStr )
564 ATH_MSG_DEBUG(
"Updating TrackAnalysisCollection with ChainRoiName: " << chainRoi );
566 std::pair< mapChainRoi_t::iterator, bool >
result =
567 m_chainRois.insert( mapChainRoi_t::value_type( chainRoi, roiStr ) );
576 m_matches->chainRoiName( chainRoi );