19 #include "GaudiKernel/ISvcLocator.h"
20 #include "GaudiKernel/Service.h"
28 const std::string& anaTag,
29 const std::string&
chain,
32 m_anaTag( anaTag ), m_chain(
chain ),
41 ATH_MSG_DEBUG(
"Initialising in directory: " << m_directory );
44 m_trkAnaDefSvc = Gaudi::svcLocator()->service(
"TrkAnaDefSvc"+m_anaTag );
48 if( m_trkAnaDefSvc->plotTrackMultiplicities() ) {
49 m_plots_summary = std::make_unique< SummaryPlots >(
50 this,
"Tracks/Multiplicities", m_anaTag,
51 m_trkAnaDefSvc->doTrigNavigation() );
55 if( m_trkAnaDefSvc->plotTrackParameters() ) {
56 m_plots_trkParam_vsTest = std::make_unique< TrackParametersPlots >(
57 this,
"Tracks/Parameters", m_anaTag, m_trkAnaDefSvc->testTag(),
58 ( not m_trkAnaDefSvc->isTestTruth() ) and m_trkAnaDefSvc->plotTrackParametersErrors(),
59 m_trkAnaDefSvc->plotTracksInJets() );
60 m_plots_trkParam_vsRef = std::make_unique< TrackParametersPlots >(
61 this,
"Tracks/Parameters", m_anaTag, m_trkAnaDefSvc->referenceTag(),
62 ( not m_trkAnaDefSvc->isReferenceTruth() ) and m_trkAnaDefSvc->plotTrackParametersErrors(),
63 m_trkAnaDefSvc->plotTracksInJets() );
67 if( m_trkAnaDefSvc->plotTrackMultiplicities() ) {
68 m_plots_nTracks_vsTest = std::make_unique< NtracksPlots >(
69 this,
"Tracks/Multiplicities", m_anaTag, m_trkAnaDefSvc->testTag(),
70 m_trkAnaDefSvc->doTrigNavigation(), m_trkAnaDefSvc->hasFullPileupTruth() );
71 m_plots_nTracks_vsRef = std::make_unique< NtracksPlots >(
72 this,
"Tracks/Multiplicities", m_anaTag, m_trkAnaDefSvc->referenceTag(),
73 m_trkAnaDefSvc->doTrigNavigation(), m_trkAnaDefSvc->hasFullPileupTruth() );
77 if( m_trkAnaDefSvc->plotEfficiencies() ) {
78 m_plots_eff_vsTest = std::make_unique< EfficiencyPlots >(
79 this,
"Tracks/Efficiencies/Purities", m_anaTag, m_trkAnaDefSvc->testTag(),
false );
80 m_plots_eff_vsRef = std::make_unique< EfficiencyPlots >(
81 this,
"Tracks/Efficiencies", m_anaTag, m_trkAnaDefSvc->referenceTag(),
false,
82 true, m_trkAnaDefSvc->hasFullPileupTruth() );
83 if( m_trkAnaDefSvc->matchingType() ==
"EFTruthMatch" ) {
84 m_plots_eff_vsTruth = std::make_unique< EfficiencyPlots >(
85 this,
"Tracks/Efficiencies", m_anaTag,
"truth",
false );
90 if( m_trkAnaDefSvc->plotTechnicalEfficiencies()) {
91 m_plots_tech_eff_vsTest = std::make_unique< EfficiencyPlots >(
92 this,
"Tracks/Efficiencies/Technical/Purities", m_anaTag, m_trkAnaDefSvc->testTag(),
true );
93 m_plots_tech_eff_vsRef = std::make_unique< EfficiencyPlots >(
94 this,
"Tracks/Efficiencies/Technical", m_anaTag, m_trkAnaDefSvc->referenceTag(),
true,
95 true, m_trkAnaDefSvc->hasFullPileupTruth() );
96 if( m_trkAnaDefSvc->matchingType() ==
"EFTruthMatch" ) {
97 m_plots_tech_eff_vsTruth = std::make_unique< EfficiencyPlots >(
98 this,
"Tracks/Efficiencies/Technical", m_anaTag,
"truth",
true );
103 if( m_trkAnaDefSvc->plotResolutions() ) {
104 m_plots_resolution = std::make_unique< ResolutionPlots >(
105 this,
"Tracks/Resolutions", m_anaTag,
106 m_trkAnaDefSvc->testTag(), m_trkAnaDefSvc->referenceTag(),
107 m_trkAnaDefSvc->resolutionMethod() );
111 if( m_trkAnaDefSvc->plotFakeRates() and m_trkAnaDefSvc->isReferenceTruth() ) {
112 m_plots_fakeRate = std::make_unique< FakeRatePlots >(
113 this,
"Tracks/FakeRates", m_anaTag, m_trkAnaDefSvc->testTag(),
114 true, m_trkAnaDefSvc->hasFullPileupTruth() );
115 if ( not m_trkAnaDefSvc->unlinkedAsFakes() ) {
116 m_plots_missingTruth = std::make_unique< FakeRatePlots >(
117 this,
"Tracks/FakeRates/Unlinked", m_anaTag, m_trkAnaDefSvc->testTag(),
118 true, m_trkAnaDefSvc->hasFullPileupTruth() );
123 if( m_trkAnaDefSvc->plotDuplicateRates() ) {
124 m_plots_duplRate = std::make_unique< DuplicateRatePlots >(
125 this,
"Tracks/Duplicates", m_anaTag, m_trkAnaDefSvc->referenceTag(),
126 true, m_trkAnaDefSvc->hasFullPileupTruth() );
131 if( m_trkAnaDefSvc->plotHitsOnTracks() and not m_trkAnaDefSvc->isTestTruth() ) {
132 m_plots_hitsOnTrk_vsTest = std::make_unique< HitsOnTracksPlots >(
133 this,
"Tracks/HitsOnTracks", m_anaTag,
134 m_trkAnaDefSvc->testTag(), m_trkAnaDefSvc->isITk(),
135 true, m_trkAnaDefSvc->hasFullPileupTruth() );
137 if( m_trkAnaDefSvc->plotHitsOnTracksReference() and not m_trkAnaDefSvc->isReferenceTruth() ) {
138 m_plots_hitsOnTrk_vsRef = std::make_unique< HitsOnTracksPlots >(
139 this,
"Tracks/HitsOnTracks", m_anaTag,
140 m_trkAnaDefSvc->referenceTag(), m_trkAnaDefSvc->isITk() );
143 if( m_trkAnaDefSvc->plotHitsOnMatchedTracks() and not m_trkAnaDefSvc->isTestTruth() ) {
144 m_plots_hitsOnMatchedTrk = std::make_unique< HitsOnTracksPlots >(
145 this,
"Tracks/Resolutions/HitsOnTracks", m_anaTag,
146 m_trkAnaDefSvc->testTag(), m_trkAnaDefSvc->isITk(),
147 true, m_trkAnaDefSvc->hasFullPileupTruth() );
148 m_plots_hitsOnMatchedTrk_vsRef = std::make_unique< HitsOnTracksPlots >(
149 this,
"Tracks/Resolutions/HitsOnTracks", m_anaTag,
150 m_trkAnaDefSvc->testTag(), m_trkAnaDefSvc->referenceTag(), m_trkAnaDefSvc->isITk() );
153 if( m_trkAnaDefSvc->plotHitsOnFakeTracks() and m_trkAnaDefSvc->isReferenceTruth() ) {
154 m_plots_hitsOnFakeTrk = std::make_unique< HitsOnTracksPlots >(
155 this,
"Tracks/FakeRates/HitsOnTracks", m_anaTag,
156 m_trkAnaDefSvc->testTag(), m_trkAnaDefSvc->isITk(),
157 true, m_trkAnaDefSvc->hasFullPileupTruth() );
158 if ( not m_trkAnaDefSvc->unlinkedAsFakes() ) {
159 m_plots_hitsOnUnlinkedTrk = std::make_unique< HitsOnTracksPlots >(
160 this,
"Tracks/FakeRates/Unlinked/HitsOnTracks", m_anaTag,
161 m_trkAnaDefSvc->testTag(), m_trkAnaDefSvc->isITk(),
162 true, m_trkAnaDefSvc->hasFullPileupTruth() );
167 if( m_trkAnaDefSvc->plotOfflineElectrons() ) {
168 m_plots_offEle = std::make_unique< OfflineElectronPlots >(
169 this,
"Tracks/Parameters", m_anaTag );
170 if( m_trkAnaDefSvc->plotEfficiencies() ) {
171 m_plots_eff_vsOffEle = std::make_unique< OfflineElectronPlots >(
172 this,
"Tracks/Efficiencies", m_anaTag,
true );
177 if( m_trkAnaDefSvc->plotVertexParameters() ) {
179 m_plots_vtxParam_vsTest = std::make_unique< VertexParametersPlots >(
180 this,
"Vertices/AllPrimary/Parameters", m_anaTag,
181 m_trkAnaDefSvc->testTag(),
182 not m_trkAnaDefSvc->isTestTruth() );
183 m_plots_vtxParam_vsRef = std::make_unique< VertexParametersPlots >(
184 this,
"Vertices/AllPrimary/Parameters", m_anaTag,
185 m_trkAnaDefSvc->referenceTag(),
186 not m_trkAnaDefSvc->isReferenceTruth() );
189 m_plots_nVtxParam_vsTest = std::make_unique< VertexParametersPlots >(
190 this,
"Vertices/AllPrimary/Parameters", m_anaTag,
191 m_trkAnaDefSvc->testTag(),
false,
192 true, m_trkAnaDefSvc->hasFullPileupTruth() );
193 m_plots_nVtxParam_vsRef = std::make_unique< VertexParametersPlots >(
194 this,
"Vertices/AllPrimary/Parameters", m_anaTag,
195 m_trkAnaDefSvc->referenceTag(),
false,
196 true, m_trkAnaDefSvc->hasFullPileupTruth() );
202 return StatusCode::SUCCESS;
212 float actualMu = trkAnaColls.
eventInfo() ?
218 if( m_trkAnaDefSvc->isTestTruth() ) {
223 truthMu, actualMu,
weight ) );
229 truthMu, actualMu,
weight ) );
233 if( m_trkAnaDefSvc->isReferenceTruth() ) {
238 truthMu, actualMu,
weight ) );
244 truthMu, actualMu,
weight ) );
248 if( m_trkAnaDefSvc->matchingType() ==
"EFTruthMatch" ) {
254 truthMu, actualMu,
weight ) );
259 std::vector< size_t > refTrackCounts = trkAnaColls.
refTrackCounts();
264 if( m_plots_summary ) {
266 testTrackCounts, refTrackCounts,
270 if( m_plots_nTracks_vsTest ) {
271 ATH_CHECK( m_plots_nTracks_vsTest->fillPlots(
272 testTrackCounts, testVertexCounts,
273 truthMu, actualMu,
weight ) );
276 if( m_plots_nTracks_vsRef ) {
277 ATH_CHECK( m_plots_nTracks_vsRef->fillPlots(
278 refTrackCounts, refVertexCounts,
279 truthMu, actualMu,
weight ) );
282 return StatusCode::SUCCESS;
289 template<
typename PARTICLE,
typename VERTEX >
291 const std::vector< const PARTICLE* >&
particles,
293 const std::vector< const VERTEX* >& vertices,
294 float truthMu,
float actualMu,
float weight )
299 if( m_plots_trkParam_vsTest ) {
304 if( m_plots_hitsOnTrk_vsTest ) {
311 if( m_plots_eff_vsTest ) {
312 ATH_CHECK( m_plots_eff_vsTest->fillPlots(
317 if( m_plots_tech_eff_vsTest ) {
318 if ( m_trkAnaDefSvc->isTestTruth() and
320 m_trkAnaDefSvc->minSilHits(),
321 m_trkAnaDefSvc->etaBins() ) ) {
322 ATH_CHECK( m_plots_tech_eff_vsTest->fillPlots(
325 else if ( m_trkAnaDefSvc->isReferenceTruth() ) {
328 m_trkAnaDefSvc->minSilHits(),
329 m_trkAnaDefSvc->etaBins() ) :
false;
330 ATH_CHECK( m_plots_tech_eff_vsTest->fillPlots(
333 else if ( m_trkAnaDefSvc->matchingType() ==
"EFTruthMatch" ) {
335 *
particle, m_trkAnaDefSvc->truthProbCut() );
338 m_trkAnaDefSvc->minSilHits(),
339 m_trkAnaDefSvc->etaBins() ) :
false;
340 ATH_CHECK( m_plots_tech_eff_vsTest->fillPlots(
346 if( m_plots_resolution ) {
348 if( m_trkAnaDefSvc->isReferenceTruth() ) {
349 ATH_CHECK( m_plots_resolution->fillPlots(
352 ATH_CHECK( m_plots_resolution->fillPlots(
359 if( m_plots_hitsOnMatchedTrk and m_plots_hitsOnMatchedTrk_vsRef and
isMatched ) {
361 if( m_trkAnaDefSvc->isReferenceTruth() ) {
362 ATH_CHECK( m_plots_hitsOnMatchedTrk_vsRef->fillPlots(
365 ATH_CHECK( m_plots_hitsOnMatchedTrk_vsRef->fillPlots(
374 if( m_plots_missingTruth ) {
377 if( m_plots_hitsOnUnlinkedTrk ) {
382 bool doFakes = m_trkAnaDefSvc->unlinkedAsFakes() ? true : not isUnlinked;
383 if( doFakes and m_plots_fakeRate ) {
385 if( m_plots_hitsOnFakeTrk and isFakeTruth ) {
391 if( m_trkAnaDefSvc->isTestOffline() ) {
392 if( m_plots_offEle ) {
395 if( m_plots_eff_vsOffEle ) {
403 int nGoodVertices(0);
404 for(
const VERTEX*
vertex : vertices ) {
413 std::vector< const PARTICLE* > vtxTracks{};
414 std::vector< float > vtxTrackWeights{};
416 *
vertex, vtxTracks, vtxTrackWeights,
417 particles, m_trkAnaDefSvc->useSelectedVertexTracks() ) ) {
418 ATH_MSG_WARNING(
"Problem when retrieving vertex-assocciated tracks" );
419 if( not vtxTracks.empty() ) {
420 ATH_MSG_WARNING(
"Invalid associated track links found. Check your input format." );
425 if( m_plots_vtxParam_vsTest ) {
431 if( m_plots_nVtxParam_vsTest ) {
432 ATH_CHECK( m_plots_nVtxParam_vsTest->fillPlots( nGoodVertices, truthMu, actualMu,
weight ) );
435 return StatusCode::SUCCESS;
440 const std::vector< const xAOD::TrackParticle* >&
particles,
441 const ITrackMatchingLookup& matches,
442 const std::vector< const xAOD::Vertex* >& vertices,
443 float truthMu,
float actualMu,
float weight );
447 const std::vector< const xAOD::TruthParticle* >&
particles,
448 const ITrackMatchingLookup& matches,
449 const std::vector< const xAOD::TruthVertex* >& vertices,
450 float truthMu,
float actualMu,
float weight );
456 template<
typename PARTICLE,
typename VERTEX >
458 const std::vector< const PARTICLE* >&
particles,
460 const std::vector< const VERTEX* >& vertices,
461 float truthMu,
float actualMu,
float weight )
467 if( m_plots_trkParam_vsRef ) {
472 if( m_plots_hitsOnTrk_vsRef ) {
479 if( m_plots_eff_vsRef ) {
485 if( m_plots_tech_eff_vsRef ) {
486 if( m_trkAnaDefSvc->isReferenceTruth() and
489 ATH_CHECK( m_plots_tech_eff_vsRef->fillPlots(
492 else if ( m_trkAnaDefSvc->isTestTruth() ) {
494 bool isTechMatched =
false;
498 if (
nHitsSelVec( *thisTruth, m_trkAnaDefSvc->minSilHits(), m_trkAnaDefSvc->etaBins() ) ) {
499 isTechMatched =
true;
504 ATH_CHECK( m_plots_tech_eff_vsRef->fillPlots(
508 else if ( m_trkAnaDefSvc->matchingType() ==
"EFTruthMatch" ) {
510 *
particle, m_trkAnaDefSvc->truthProbCut() );
512 nHitsSelVec( *linkedTruth, m_trkAnaDefSvc->minSilHits(), m_trkAnaDefSvc->etaBins() ) :
false;
513 ATH_CHECK( m_plots_tech_eff_vsRef->fillPlots(
519 if( m_plots_duplRate ) {
520 unsigned int nMatched = m_trkAnaDefSvc->isTestTruth() ?
529 if( m_trkAnaDefSvc->isReferenceOffline() ) {
530 if( m_plots_offEle ) {
533 if( m_plots_eff_vsOffEle ) {
541 int nGoodVertices(0);
542 for(
const VERTEX*
vertex : vertices ) {
551 std::vector< const PARTICLE* > vtxTracks{};
552 std::vector< float > vtxTrackWeights{};
554 *
vertex, vtxTracks, vtxTrackWeights,
555 particles, m_trkAnaDefSvc->useSelectedVertexTracks() ) ) {
556 ATH_MSG_WARNING(
"Problem when retrieving vertex-assocciated tracks" );
557 if( not vtxTracks.empty() ) {
558 ATH_MSG_WARNING(
"Invalid associated track links found. Check your input format." );
563 if( m_plots_vtxParam_vsRef ) {
569 if( m_plots_nVtxParam_vsRef ) {
570 ATH_CHECK( m_plots_nVtxParam_vsRef->fillPlots( nGoodVertices, truthMu, actualMu,
weight ) );
573 return StatusCode::SUCCESS;
578 const std::vector< const xAOD::TrackParticle* >&
particles,
579 const ITrackMatchingLookup& matches,
580 const std::vector< const xAOD::Vertex* >& vertices,
581 float truthMu,
float actualMu,
float weight );
585 const std::vector< const xAOD::TruthParticle* >&
particles,
586 const ITrackMatchingLookup& matches,
587 const std::vector< const xAOD::TruthVertex* >& vertices,
588 float truthMu,
float actualMu,
float weight );
595 const std::vector< const xAOD::TrackParticle* >& testTracks,
596 const std::vector< const xAOD::TrackParticle* >& refTracks,
597 const std::vector< const xAOD::TruthParticle* >& truths,
599 float truthMu,
float actualMu,
float weight )
605 bool refMatched(
false );
610 *thisTrack, m_trkAnaDefSvc->truthProbCut() );
611 if( not linkedTruth ) {
615 if( thisTruth == linkedTruth ) {
622 if ( not refMatched )
continue;
629 *thisTrack, m_trkAnaDefSvc->truthProbCut() );
630 if( not linkedTruth ) {
634 if( thisTruth == linkedTruth ) {
641 if( m_plots_eff_vsTruth ) {
642 ATH_CHECK( m_plots_eff_vsTruth->fillPlots(
647 if( m_plots_tech_eff_vsTruth ) {
648 if (
nHitsSelVec( *thisTruth, m_trkAnaDefSvc->minSilHits(), m_trkAnaDefSvc->etaBins() )) {
649 ATH_CHECK( m_plots_tech_eff_vsTruth->fillPlots(
656 return StatusCode::SUCCESS;