ATLAS Offline Software
Loading...
Searching...
No Matches
PhysicsVariablePlots.cxx
Go to the documentation of this file.
1//Copyright (C) 2002-2026 CERN for the benefit of the ATLAS collaboration
2
3
5
9
13
14#include "CxxUtils/phihelper.h"
15
17
18namespace FTAGValidation {
19
21 ISvcLocator* pSvcLocator ) :
22 FTAGValidationAlgorithm( name, pSvcLocator ) {}
23
25
26 /* ===================================================================== */
27
29 ATH_MSG_INFO( "Inizializing " << name() << " ..." );
31
32 ATH_MSG_INFO( "Properties declaration:" );
33 ATH_MSG_INFO( " -- " << m_jetKey );
34 ATH_MSG_INFO( " -- " << m_vertexKey );
35 ATH_MSG_INFO( " -- " << m_trackKey );
36
37 ATH_MSG_INFO( " -- " << m_minJetEta );
38 ATH_MSG_INFO( " -- " << m_maxJetEta );
39 ATH_MSG_INFO( " -- " << m_minJetPt );
40
41 ATH_CHECK( m_jetKey.initialize() );
42 ATH_CHECK( m_vertexKey.initialize() );
43 ATH_CHECK( m_trackKey.initialize() );
44
45 ATH_CHECK( m_histSvc.retrieve() );
47
48 return StatusCode::SUCCESS;
49 }
50
51 StatusCode PhysicsVariablePlots::execute(const EventContext& ctx) {
52 ATH_MSG_DEBUG( "Executing " << name() << " ..." );
53
54 /* =========================================================================================================================================== */
55 /* ==== Retrieve Collections */
56 /* =========================================================================================================================================== */
57
58 // Event Info
60 ATH_CHECK( eventInfoHandle.isValid() );
61 const xAOD::EventInfo *eventInfo = eventInfoHandle.get();
62
63 // Retrieve Jet Collection
64 const xAOD::JetContainer *jetCollection = nullptr;
66
67 // Retrieve Vertex Collection
68 const xAOD::VertexContainer *vertexCollection = nullptr;
69 ATH_CHECK( retrieveCollectionfromStoreGate( ctx,vertexCollection,m_vertexKey ) );
70 ATH_CHECK( fillHistogram( "nPrimVtx",vertexCollection->size() ) );
71
72 const xAOD::Vertex *primaryVertex = getPrimaryVertex( vertexCollection );
73 if ( primaryVertex == nullptr ) {
74 ATH_MSG_ERROR( "Could not retrieve Primary Vertex" );
75 return StatusCode::FAILURE;
76 }
77
78 ATH_CHECK( fillHistogram( "nTracksPrimVtx",primaryVertex->nTrackParticles() ) );
79 ATH_CHECK( fillHistogram( "PV_x" ,primaryVertex->x() ) );
80 ATH_CHECK( fillHistogram( "PV_y" ,primaryVertex->y() ) );
81 ATH_CHECK( fillHistogram( "PV_z" ,primaryVertex->z() ) );
82
83 // Retrieve TrackParticleCollection
84 const xAOD::TrackParticleContainer *trackParticleCollection = nullptr;
85 ATH_CHECK( retrieveCollectionfromStoreGate( ctx,trackParticleCollection,m_trackKey) );
86 ATH_CHECK( fillHistogram( "nTracks",trackParticleCollection->size() ) );
87
88 /* =========================================================================================================================================== */
89 /* ==== ShortList jets */
90 /* =========================================================================================================================================== */
91
92 std::vector< const xAOD::Jet* > qualityJetCollection;
93
94 for ( const xAOD::Jet *jet : *jetCollection ) {
95 if ( not passJetQualitySelection( jet ) ) continue;
96 if ( not passJetKinematicSelection( jet ) ) continue;
97 if ( not passJetJVTSelection( jet,m_jetKey.key() ) ) continue;
98 qualityJetCollection.push_back( jet );
99 }
100
101 ATH_CHECK( fillHistogram( "nJets",qualityJetCollection.size() ) );
102
103 /* =========================================================================================================================================== */
104 /* ==== Run on Jets */
105 /* =========================================================================================================================================== */
106
107 int nJetsWithMuon = 0;
108 int nJetsWithSV = 0;
109
110 for ( const xAOD::Jet *jet : qualityJetCollection ) {
111
112 ATH_MSG_DEBUG( "JET KINEMATICS:" );
113 ATH_MSG_DEBUG( " ** pt=" << jet->p4().Et() / Gaudi::Units::GeV <<
114 " eta=" << jet->eta() <<
115 " phi=" << jet->phi() );
116
117 ATH_CHECK( fillHistogram( "jet_E" , jet->e() / Gaudi::Units::GeV ) );
118 ATH_CHECK( fillHistogram( "jet_pT" , jet->pt() / Gaudi::Units::GeV ) );
119 ATH_CHECK( fillHistogram( "jet_eta" , jet->eta() ) );
120 ATH_CHECK( fillHistogram( "jet_phi" , jet->phi() ) );
121 //nMuons and nSV1
123 static const SG::ConstAccessor<std::vector< ElementLink< xAOD::VertexContainer > > > SV1_verticesAcc("SV1_vertices");
124 std::vector< ElementLink< xAOD::VertexContainer > > SV1_vertex = SV1_verticesAcc(*bTag);
125 if(SV1_vertex.size() >= 1) nJetsWithSV++;
126
127 static const SG::ConstAccessor< ElementLink<xAOD::MuonContainer> > SMT_mu_linkAcc("SMT_mu_link");
128 if (SMT_mu_linkAcc.isAvailable(*bTag)) {
129 ElementLink<xAOD::MuonContainer> muonLink = SMT_mu_linkAcc(*bTag);
130 if ( muonLink.isValid() ) {
131 const xAOD::Muon* muon=(*muonLink);
132 if ( muon != 0 ) {
133 nJetsWithMuon++;
134 ATH_CHECK( fillHistogram( "muon_pT_frac" , muon->pt() / jet->pt() ) );
135 }
136 }
137 }
138 else {
139 ATH_MSG_DEBUG( "SMT_mu_link is not available." );
140 }
141
142 // Retrieve jet flavour
143 std::string flavour = "DATA_";
145
146 static const SG::ConstAccessor< int > HadronConeExclTruthLabelIDAcc("HadronConeExclTruthLabelID");
147 if ( HadronConeExclTruthLabelIDAcc.isAvailable( *jet ) == false ) {
148 ATH_MSG_ERROR( "Input sample is MC but jet has no 'HadronConeExclTruthLabelID' aux data. Something is wrong!" );
149 return StatusCode::FAILURE;
150 }
151
152 int HadronConeExclTruthLabelID = HadronConeExclTruthLabelIDAcc(*jet);
153 ATH_MSG_DEBUG( " ** 'HadronConeExclTruthLabelID' is " << HadronConeExclTruthLabelID );
154 ATH_CHECK( fillHistogram( "truth_label" , HadronConeExclTruthLabelID ) );
155
156 if ( HadronConeExclTruthLabelID == 0 ) flavour = "U_";
157 else if ( HadronConeExclTruthLabelID == 4 ) flavour = "C_";
158 else if ( HadronConeExclTruthLabelID == 5 ) flavour = "B_";
159 else continue;
160 }
161
162 ATH_CHECK( analyseTrackParticleObjects( jet,primaryVertex,flavour ) );
163 ATH_CHECK( analyseBTaggingObject( jet,flavour ) );
164 }
165
166 ATH_CHECK( fillHistogram( "nJetsWithMuon" , nJetsWithMuon ) );
167 ATH_CHECK( fillHistogram( "fracJetsWithMuon" , double(nJetsWithMuon)/double(qualityJetCollection.size()) ) );
168 ATH_CHECK( fillHistogram( "nJetsWithSV" , nJetsWithSV ) );
169 ATH_CHECK( fillHistogram( "fracJetsWithSV" , double(nJetsWithSV)/double(qualityJetCollection.size()) ) );
170
171 return StatusCode::SUCCESS;
172 }
173
175 ATH_MSG_INFO( "Finalizing " << name() << " ..." );
176 return StatusCode::SUCCESS;
177 }
178
179 /* ===================================================================== */
180
182
183 // 1D histograms
184 ATH_MSG_DEBUG( "Defining 1D histograms ..." );
185 for ( const std::vector< std::string >& definitions : m_Histograms1Ddefinitions ) {
186 ATH_MSG_DEBUG( " ** " << definitions.at( HISTO::NAME ) << " of type " << definitions.at( HISTO::TYPE ) );
187
188 if ( definitions.at( HISTO::TYPE ) == "TH1I" )
190 definitions.at( HISTO::TITLE ),
191 std::stoi( definitions.at( HISTO::XBINS ) ),
192 std::stoi( definitions.at( HISTO::XMIN ) ),
193 std::stoi( definitions.at( HISTO::XMAX ) ),
194 definitions.at( HISTO::PATH ) ) );
195 else if ( definitions.at( HISTO::TYPE ) == "TH1F" )
197 definitions.at( HISTO::TITLE ),
198 std::stoi( definitions.at( HISTO::XBINS ) ),
199 std::stof( definitions.at( HISTO::XMIN ) ),
200 std::stof( definitions.at( HISTO::XMAX ) ),
201 definitions.at( HISTO::PATH )) );
202 else if ( definitions.at( HISTO::TYPE ) == "TH1D" )
204 definitions.at( HISTO::TITLE ),
205 std::stoi( definitions.at( HISTO::XBINS ) ),
206 std::stof( definitions.at( HISTO::XMIN ) ),
207 std::stof( definitions.at( HISTO::XMAX ) ),
208 definitions.at( HISTO::PATH )) );
209 }
210
211 // 2D histograms
212 ATH_MSG_DEBUG( "Defining 2D histograms ..." );
213 for ( const std::vector< std::string >& definitions : m_Histograms2Ddefinitions ) {
214 ATH_MSG_DEBUG( " ** " << definitions.at( HISTO::NAME ) << " of type " << definitions.at( HISTO::TYPE ) );
215
216 if ( definitions.at( HISTO::TYPE ) == "TH2I" )
218 definitions.at( HISTO::TITLE ),
219 std::stoi( definitions.at( HISTO::XBINS ) ),
220 std::stoi( definitions.at( HISTO::XMIN ) ),
221 std::stoi( definitions.at( HISTO::XMAX ) ),
222 std::stoi( definitions.at( HISTO::YBINS ) ),
223 std::stoi( definitions.at( HISTO::YMIN ) ),
224 std::stoi( definitions.at( HISTO::YMAX ) ),
225 definitions.at( HISTO::PATH ) ) );
226 else if ( definitions.at( HISTO::TYPE ) == "TH2F" )
228 definitions.at( HISTO::TITLE ),
229 std::stoi( definitions.at( HISTO::XBINS ) ),
230 std::stof( definitions.at( HISTO::XMIN ) ),
231 std::stof( definitions.at( HISTO::XMAX ) ),
232 std::stoi( definitions.at( HISTO::YBINS ) ),
233 std::stof( definitions.at( HISTO::YMIN ) ),
234 std::stof( definitions.at( HISTO::YMAX ) ),
235 definitions.at( HISTO::PATH )) );
236 else if ( definitions.at( HISTO::TYPE ) == "TH2D" )
238 definitions.at( HISTO::TITLE ),
239 std::stoi( definitions.at( HISTO::XBINS ) ),
240 std::stof( definitions.at( HISTO::XMIN ) ),
241 std::stof( definitions.at( HISTO::XMAX ) ),
242 std::stoi( definitions.at( HISTO::YBINS ) ),
243 std::stof( definitions.at( HISTO::YMIN ) ),
244 std::stof( definitions.at( HISTO::YMAX ) ),
245 definitions.at( HISTO::PATH )) );
246 }
247
248
249 return StatusCode::SUCCESS;
250 }
251
253 const xAOD::Vertex *primaryVertex,
254 const std::string& flavour,
255 std::string chain ) {
256
257 if( chain != "" ) chain = chain + "_";
258
259 /* =========================================================================================================================================== */
260 /* ==== Ghost Tracks */
261 /* =========================================================================================================================================== */
262/*
263 if( chain == "" ) { //No ghost tracks at trigger level
264 ATH_MSG_DEBUG( "GHOST TRACKS:" );
265
266 std::vector< const xAOD::IParticle* > trackVector = jet->getAssociatedObjects< xAOD::IParticle >( xAOD::JetAttribute::GhostTrack );
267 ATH_CHECK( fillHistogram( chain+flavour+"nGhostTracksInJet",trackVector.size() ) );
268 ATH_MSG_DEBUG( " ** nGhostTracks: " << trackVector.size() );
269
270 for ( const xAOD::IParticle* iparticle : trackVector ) {
271 const xAOD::TrackParticle* trackParticle = dynamic_cast< const xAOD::TrackParticle* >( iparticle );
272 if( not trackParticle ) continue;
273
274 CHECK( computeAndStoreTrackVariables( flavour,jet,
275 "ghost",trackParticle,
276 primaryVertex ) );
277 }
278 }
279*/
280
281 /* =========================================================================================================================================== */
282 /* ==== BTagTrackToJetAssociator Tracks */
283 /* =========================================================================================================================================== */
284
285 ATH_MSG_DEBUG( "BTagTrackToJetAssociator TRACKS:" );
286 const xAOD::BTagging* bTaggingObject = xAOD::BTaggingUtilities::getBTagging( *jet );
287
288 if ( !bTaggingObject ) {
289 ATH_MSG_ERROR( "Could not retrieve b-tagging object from selected jet." );
290 return StatusCode::FAILURE;
291 }
292
293 static const SG::ConstAccessor< std::vector< ElementLink<xAOD::TrackParticleContainer> > > BTagTrackToJetAssociatorAcc("BTagTrackToJetAssociator");
294 if ( not BTagTrackToJetAssociatorAcc.isAvailable(*bTaggingObject) ) {
295 ATH_MSG_ERROR( "Cannot retrieve 'BTagTrackToJetAssociator' auxdata from b-tagging object!" );
296 return StatusCode::FAILURE;
297 }
298
299 std::vector< ElementLink< xAOD::TrackParticleContainer > > assocTracks = BTagTrackToJetAssociatorAcc(*bTaggingObject);
300 ATH_CHECK( fillHistogram( chain+flavour+"numTracks_perJet",assocTracks.size() ) );
301 ATH_MSG_DEBUG( " ** nBTagTracksInJet: " << assocTracks.size() );
302
303 for ( const ElementLink< xAOD::TrackParticleContainer >& trackEL : assocTracks ) {
304 if ( not trackEL.isValid() ) continue;
305
306 const xAOD::TrackParticle* trackParticle = *trackEL;
307
309 "",trackParticle, //Only supporting one track type to simplify merging with PhysVal definitions
310 primaryVertex,chain ) );
311 }
312
313
314
315 return StatusCode::SUCCESS;
316 }
317
318 StatusCode PhysicsVariablePlots::computeAndStoreTrackVariables( const std::string& jetType, const xAOD::Jet* jet,
319 const std::string& trackType, const xAOD::TrackParticle *trackParticle,
320 const xAOD::Vertex* primaryVertex, const std::string& chain) {
321
322 std::string flavour = jetType + trackType;
323
324 // Jet Variables
325 float jet_pt = jet->pt();
326 float jet_eta = jet->eta();
327 float jet_phi = jet->phi();
328
329 // track Variables
330 float track_pt = trackParticle->pt();
331 float fracEt = track_pt / jet_pt;
332
333 ATH_CHECK( fillHistogram( chain+flavour+"track_pT_frac",fracEt ) );
334 ATH_MSG_DEBUG( " ** pTfrac = " << fracEt );
335
336 float track_eta = trackParticle->eta();
337 float track_phi = trackParticle->phi();
338
339 float deltaEta = fabs( jet_eta - track_eta );
340 float deltaPhi = CxxUtils::wrapToPi( jet_phi - track_phi );
341 float deltaR = sqrt( deltaEta*deltaEta + deltaPhi*deltaPhi );
342
343 ATH_CHECK( fillHistogram( chain+flavour+"DeltaR_jet_track",deltaR ) );
344 ATH_MSG_DEBUG( " ** deltaR = " << deltaR );
345
346 float d0 = trackParticle->d0();
347 float sigmad0 = sqrt( trackParticle->definingParametersCovMatrix()( Trk::d0, Trk::d0 ) );
348 float z0 = trackParticle->z0() + trackParticle->vz() - primaryVertex->z();
349 float sigmaz0 = sqrt( trackParticle->definingParametersCovMatrix()( Trk::z0, Trk::z0 ) );
350
351 ATH_CHECK( fillHistogram( chain+flavour+"track_d0",d0 ) );
352 ATH_CHECK( fillHistogram( chain+flavour+"track_sigd0",d0/sigmad0 ) );
353
354 ATH_CHECK( fillHistogram( chain+flavour+"track_z0",z0 ) );
355 ATH_CHECK( fillHistogram( chain+flavour+"track_sigz0",z0/sigmaz0 ) );
356
357 ATH_MSG_DEBUG( " ** d0 +/- err [significance] = " << d0 << " +/- " << sigmad0 << " [ " << d0/sigmad0 << " ]" );
358 ATH_MSG_DEBUG( " ** z0 +/- err [significance] = " << z0 << " +/- " << sigmaz0 << " [ " << z0/sigmaz0 << " ]" );
359
360 if (trackType == "bTag" || trackType == "") {
361
362 if (chain != "") {
363 BTagTrackIpAccessor accessor("btagIp_");
364 float d0_signed_sig = accessor.getSignedIp(*trackParticle, *jet).ip3d_signed_d0_significance;
365 float z0_signed_sig = accessor.getSignedIp(*trackParticle, *jet).ip3d_signed_z0_sin_theta_significance;
366 ATH_CHECK( fillHistogram( chain+flavour+"track_sigd0_signed", d0_signed_sig) );
367 ATH_CHECK( fillHistogram( chain+flavour+"track_sigz0_signed", z0_signed_sig) );
368 }
369
370 uint8_t nInnHits = -1;
371 uint8_t nNextToInnHits = -1;
372 uint8_t nBLHits = -1;
373 uint8_t nsharedBLHits = -1;
374 uint8_t nsplitBLHits = -1;
375 uint8_t nPixHits = -1;
376 uint8_t nPixHoles = -1;
377 uint8_t nsharedPixHits = -1;
378 uint8_t nsplitPixHits = -1;
379 uint8_t nSCTHits = -1;
380 uint8_t nSCTHoles = -1;
381 uint8_t nsharedSCTHits = -1;
382
385 ATH_CHECK( trackParticle->summaryValue(nBLHits,xAOD::numberOfBLayerHits) );
386 ATH_CHECK( trackParticle->summaryValue(nsharedBLHits,xAOD::numberOfBLayerSharedHits) );
387 ATH_CHECK( trackParticle->summaryValue(nsplitBLHits,xAOD::numberOfBLayerSplitHits) );
388 ATH_CHECK( trackParticle->summaryValue(nPixHits,xAOD::numberOfPixelHits) );
389 ATH_CHECK( trackParticle->summaryValue(nPixHoles,xAOD::numberOfPixelHoles) );
390 ATH_CHECK( trackParticle->summaryValue(nsharedPixHits,xAOD::numberOfPixelSharedHits) );
391 ATH_CHECK( trackParticle->summaryValue(nsplitPixHits,xAOD::numberOfPixelSplitHits) );
392 ATH_CHECK( trackParticle->summaryValue(nSCTHits,xAOD::numberOfSCTHits) );
393 ATH_CHECK( trackParticle->summaryValue(nSCTHoles,xAOD::numberOfSCTHoles) );
394 ATH_CHECK( trackParticle->summaryValue(nsharedSCTHits,xAOD::numberOfSCTSharedHits) );
395
396 ATH_CHECK( fillHistogram( chain+flavour+"nInnHits", nInnHits) );
397 ATH_CHECK( fillHistogram( chain+flavour+"nNextToInnHits", nNextToInnHits) );
398 ATH_CHECK( fillHistogram( chain+flavour+"nBLHits", nBLHits) );
399 ATH_CHECK( fillHistogram( chain+flavour+"nsharedBLHits", nsharedBLHits) );
400 ATH_CHECK( fillHistogram( chain+flavour+"nsplitBLHits", nsplitBLHits) );
401 ATH_CHECK( fillHistogram( chain+flavour+"nPixHits", nPixHits) );
402 ATH_CHECK( fillHistogram( chain+flavour+"nPixHoles", nPixHoles) );
403 ATH_CHECK( fillHistogram( chain+flavour+"nsharedPixHits", nsharedPixHits) );
404 ATH_CHECK( fillHistogram( chain+flavour+"nsplitPixHits", nsplitPixHits) );
405 ATH_CHECK( fillHistogram( chain+flavour+"nSCTHits", nSCTHits) );
406 ATH_CHECK( fillHistogram( chain+flavour+"nSCTHoles", nSCTHoles) );
407 ATH_CHECK( fillHistogram( chain+flavour+"nsharedSCTHits", nsharedSCTHits) );
408 }
409
410 return StatusCode::SUCCESS;
411 }
412
414 const std::string& flavour,
415 std::string chain) {
416
417 if( chain != "" ) chain = chain + "_";
418
419 float jetPt = jet->p4().Et() / Gaudi::Units::GeV;
420 float jetEta = jet->eta();
421
422 // Retrieve b-tagging object
423 const xAOD::BTagging *bTaggingObject = xAOD::BTaggingUtilities::getBTagging( *jet );
424 if ( !bTaggingObject ) {
425 ATH_MSG_ERROR( "Could not retrieve b-tagging object from selected jet." );
426 return StatusCode::FAILURE;
427 }
428
429 // Available variables listed in PhysicsAnalysis/DerivationFramework/DerivationFrameworkFlavourTag/python/BTaggingContent.py
430 ATH_MSG_DEBUG( "BTAGGING:" );
431
432 // IP2D
433 double IP2D_pu = -1;
434 double IP2D_pb = -1;
435 double IP2D_pc = -1;
436 bTaggingObject->pu( "IP2D",IP2D_pu );
437 bTaggingObject->pb( "IP2D",IP2D_pb );
438 bTaggingObject->pc( "IP2D",IP2D_pc );
439
440 ATH_CHECK( fillHistogram( chain+flavour+"IP2D_pu",IP2D_pu ) );
441 ATH_CHECK( fillHistogram( chain+flavour+"IP2D_pb",IP2D_pb ) );
442 ATH_CHECK( fillHistogram( chain+flavour+"IP2D_pc",IP2D_pc ) );
443 ATH_MSG_DEBUG( " ** IP2D [pu,pb,pc] = [" << IP2D_pu <<"," << IP2D_pb << "," << IP2D_pc << "]" );
444
445
446 int IP2D_nTrks = -1;
447 std::vector< float > IP2D_weightBOfTracks;
448 std::vector< float > IP2D_weightCOfTracks;
449 std::vector< float > IP2D_weightUOfTracks;
450 std::vector< int > IP2D_gradeOfTracks;
451
452 bTaggingObject->variable< int >( "IP2D", "nTrks", IP2D_nTrks );
453
454 static const SG::ConstAccessor< std::vector< float > > IP2D_weightBOfTracksAcc( "IP2D_weightBOfTracks" );
455 IP2D_weightBOfTracks = IP2D_weightBOfTracksAcc.withDefault(*bTaggingObject, std::vector< float >());
456
457 static const SG::ConstAccessor< std::vector< float > > IP2D_weightCOfTracksAcc( "IP2D_weightCOfTracks" );
458 IP2D_weightCOfTracks = IP2D_weightCOfTracksAcc.withDefault(*bTaggingObject, std::vector< float >());
459
460 static const SG::ConstAccessor< std::vector< float > > IP2D_weightUOfTracksAcc( "IP2D_weightUOfTracks" );
461 IP2D_weightUOfTracks = IP2D_weightUOfTracksAcc.withDefault(*bTaggingObject, std::vector< float >());
462
463 static const SG::ConstAccessor< std::vector< int > > IP2D_gradeOfTracksAcc( "IP2D_gradeOfTracks" );
464 IP2D_gradeOfTracks = IP2D_gradeOfTracksAcc.withDefault(*bTaggingObject, std::vector< int >());
465
466 ATH_CHECK( fillHistogram( chain+flavour+"IP2D_nTracks",IP2D_nTrks ) );
467 for ( unsigned int i(0); i < IP2D_gradeOfTracks.size(); i++ )
468 ATH_CHECK( fillHistogram( chain+flavour+"IP2D_gradeOfTracks", IP2D_gradeOfTracks.at(i) ) );
469 for ( unsigned int i(0); i < IP2D_weightBOfTracks.size(); i++ )
470 ATH_CHECK( fillHistogram( chain+flavour+"IP2D_weightBOfTracks", IP2D_weightBOfTracks.at(i) ) );
471 for ( unsigned int i(0); i < IP2D_weightCOfTracks.size(); i++ )
472 ATH_CHECK( fillHistogram( chain+flavour+"IP2D_weightCOfTracks", IP2D_weightCOfTracks.at(i) ) );
473 for ( unsigned int i(0); i < IP2D_weightUOfTracks.size(); i++ )
474 ATH_CHECK( fillHistogram( chain+flavour+"IP2D_weightUOfTracks", IP2D_weightUOfTracks.at(i) ) );
475
476 // IP3D
477 double IP3D_pu = -1;
478 double IP3D_pb = -1;
479 double IP3D_pc = -1;
480 double IP3D_LLR = bTaggingObject->IP3D_loglikelihoodratio();
481 bTaggingObject->pu( "IP3D",IP3D_pu );
482 bTaggingObject->pb( "IP3D",IP3D_pb );
483 bTaggingObject->pc( "IP3D",IP3D_pc );
484
485 ATH_CHECK( fillHistogram( chain+flavour+"IP3D_pu",IP3D_pu ) );
486 ATH_CHECK( fillHistogram( chain+flavour+"IP3D_pb",IP3D_pb ) );
487 ATH_CHECK( fillHistogram( chain+flavour+"IP3D_pc",IP3D_pc ) );
488 ATH_CHECK( fillHistogram( chain+flavour+"IP3D_LLR",IP3D_LLR ) );
489 ATH_MSG_DEBUG( " ** IP3D [pu,pb,pc] = [" << IP3D_pu <<"," << IP3D_pb << "," << IP3D_pc << "]" );
490
491 int IP3D_nTrks = -1;
492 std::vector< float > IP3D_weightBOfTracks;
493 std::vector< float > IP3D_weightCOfTracks;
494 std::vector< float > IP3D_weightUOfTracks;
495 std::vector< int > IP3D_gradeOfTracks;
496 std::vector< float > IP3D_D0wrtPVOfTracks;
497 std::vector< float > IP3D_sigD0wrtPVOfTracks;
498 std::vector< float > IP3D_Z0wrtPVOfTracks;
499 std::vector< float > IP3D_sigZ0wrtPVOfTracks;
500
501 bTaggingObject->variable< int >( "IP3D", "nTrks", IP3D_nTrks );
502
503 static const SG::ConstAccessor< std::vector< float > > IP3D_weightBOfTracksAcc( "IP3D_weightBOfTracks" );
504 IP3D_weightBOfTracks = IP3D_weightBOfTracksAcc.withDefault(*bTaggingObject, std::vector< float >());
505
506 static const SG::ConstAccessor< std::vector< float > > IP3D_weightCOfTracksAcc( "IP3D_weightCOfTracks" );
507 IP3D_weightCOfTracks = IP3D_weightCOfTracksAcc.withDefault(*bTaggingObject, std::vector< float >());
508
509 static const SG::ConstAccessor< std::vector< float > > IP3D_weightUOfTracksAcc( "IP3D_weightUOfTracks" );
510 IP3D_weightUOfTracks = IP3D_weightUOfTracksAcc.withDefault(*bTaggingObject, std::vector< float >());
511
512 static const SG::ConstAccessor< std::vector< int > > IP3D_gradeOfTracksAcc( "IP3D_gradeOfTracks" );
513 IP3D_gradeOfTracks = IP3D_gradeOfTracksAcc.withDefault(*bTaggingObject, std::vector< int >());
514
515 static const SG::ConstAccessor< std::vector< float > > IP3D_D0wrtPVOfTracksAcc( "IP3D_D0wrtPVOfTracks" );
516 IP3D_D0wrtPVOfTracks = IP3D_D0wrtPVOfTracksAcc.withDefault(*bTaggingObject, std::vector< float >());
517
518 static const SG::ConstAccessor< std::vector< float > > IP3D_Z0wrtPVOfTracksAcc( "IP3D_Z0wrtPVOfTracks" );
519 IP3D_Z0wrtPVOfTracks = IP3D_Z0wrtPVOfTracksAcc.withDefault(*bTaggingObject, std::vector< float >());
520
521 static const SG::ConstAccessor< std::vector< float > > IP3D_sigD0wrtPVOfTracksAcc( "IP3D_sigD0wrtPVOfTracks" );
522 IP3D_sigD0wrtPVOfTracks = IP3D_sigD0wrtPVOfTracksAcc.withDefault(*bTaggingObject, std::vector< float >());
523
524 static const SG::ConstAccessor< std::vector< float > > IP3D_sigZ0wrtPVOfTracksAcc( "IP3D_sigZ0wrtPVOfTracks" );
525 IP3D_sigZ0wrtPVOfTracks = IP3D_sigZ0wrtPVOfTracksAcc.withDefault(*bTaggingObject, std::vector< float >());
526
527 ATH_MSG_DEBUG("Size IP3D_gradeOfTracks/_weightBOfTracks/_weightUOfTracks/_D0wrtPVOfTracks/_sigD0wrtPVOfTracks/_Z0wrtPVOfTracks/_sigZ0wrtPVOfTracks: " << IP3D_gradeOfTracks.size() <<", "<< IP3D_weightBOfTracks.size() << ", " << IP3D_weightUOfTracks.size() << ", " << IP3D_D0wrtPVOfTracks.size() << ", " << IP3D_sigD0wrtPVOfTracks.size() << ", " << IP3D_Z0wrtPVOfTracks.size() << ", " << IP3D_sigZ0wrtPVOfTracks.size() );
528 ATH_CHECK( fillHistogram( chain+flavour+"IP3D_nTracks",IP3D_nTrks ) );
529 for ( unsigned int i(0); i < IP3D_gradeOfTracks.size(); i++ )
530 ATH_CHECK( fillHistogram( chain+flavour+"IP3D_gradeOfTracks", IP3D_gradeOfTracks.at(i) ) );
531 for ( unsigned int i(0); i < IP3D_weightBOfTracks.size(); i++ )
532 ATH_CHECK( fillHistogram( chain+flavour+"IP3D_weightBOfTracks", IP3D_weightBOfTracks.at(i) ) );
533 for ( unsigned int i(0); i < IP3D_weightCOfTracks.size(); i++ )
534 ATH_CHECK( fillHistogram( chain+flavour+"IP3D_weightCOfTracks", IP3D_weightCOfTracks.at(i) ) );
535 for ( unsigned int i(0); i < IP3D_weightUOfTracks.size(); i++ )
536 ATH_CHECK( fillHistogram( chain+flavour+"IP3D_weightUOfTracks", IP3D_weightUOfTracks.at(i) ) );
537 for ( unsigned int i(0); i < IP3D_D0wrtPVOfTracks.size(); i++ )
538 ATH_CHECK( fillHistogram( chain+flavour+"IP3D_D0wrtPVOfTracks", IP3D_D0wrtPVOfTracks.at(i) ) ); //value
539 for ( unsigned int i(0); i < IP3D_sigD0wrtPVOfTracks.size(); i++ )
540 ATH_CHECK( fillHistogram( chain+flavour+"IP3D_sigD0wrtPVOfTracks", IP3D_sigD0wrtPVOfTracks.at(i) ) ); //significance
541 for ( unsigned int i(0); i < IP3D_Z0wrtPVOfTracks.size(); i++ )
542 ATH_CHECK( fillHistogram( chain+flavour+"IP3D_Z0wrtPVOfTracks", IP3D_Z0wrtPVOfTracks.at(i) ) ); //value
543 for ( unsigned int i(0); i < IP3D_sigZ0wrtPVOfTracks.size(); i++ )
544 ATH_CHECK( fillHistogram( chain+flavour+"IP3D_sigZ0wrtPVOfTracks", IP3D_sigZ0wrtPVOfTracks.at(i) ) ); //significance
545
546 // SV1
547 double SV1_pu = -1;
548 double SV1_pb = -1;
549 double SV1_pc = -1;
550
551 bTaggingObject->pu( "SV1",SV1_pu );
552 bTaggingObject->pb( "SV1",SV1_pb );
553 bTaggingObject->pc( "SV1",SV1_pc );
554
555 ATH_CHECK( fillHistogram( chain+flavour+"SV1_pu",SV1_pu ) );
556 ATH_CHECK( fillHistogram( chain+flavour+"SV1_pb",SV1_pb ) );
557 ATH_CHECK( fillHistogram( chain+flavour+"SV1_pc",SV1_pc ) );
558 ATH_MSG_DEBUG( " ** SV1 [pu,pb,pc] = [" << SV1_pu <<"," << SV1_pb << "," << SV1_pc << "]" );
559
560 float SV1_masssvx = -1;
561 float SV1_efracsvx = -1;
562 float SV1_deltaR = -1;
563 int SV1_N2Tpair = -1;
564 float SV1_significance3d = -1;
565 float SV1_energyTrkInJet = -1;
566 int SV1_NGTinSvx = -1;
567 float SV1_Lxy = -1;
568
569 bTaggingObject->variable< float >( "SV1", "masssvx", SV1_masssvx );
570 bTaggingObject->variable< float >( "SV1", "efracsvx", SV1_efracsvx );
571 bTaggingObject->variable< float >( "SV1", "deltaR", SV1_deltaR );
572 bTaggingObject->variable< int >( "SV1", "N2Tpair", SV1_N2Tpair );
573 bTaggingObject->variable< float >( "SV1", "significance3d", SV1_significance3d );
574 bTaggingObject->variable< float >( "SV1", "energyTrkInJet", SV1_energyTrkInJet );
575 bTaggingObject->variable< int >( "SV1", "NGTinSvx", SV1_NGTinSvx );
576 bTaggingObject->variable< float >( "SV1", "Lxy", SV1_Lxy );
577
578 ATH_CHECK( fillHistogram( chain+flavour+"SV1_masssvx",SV1_masssvx ) );
579 ATH_CHECK( fillHistogram( chain+flavour+"SV1_efracsvx",SV1_efracsvx ) );
580 ATH_CHECK( fillHistogram( chain+flavour+"SV1_deltaR",SV1_deltaR ) );
581 ATH_CHECK( fillHistogram( chain+flavour+"SV1_N2Tpair",SV1_N2Tpair ) );
582 ATH_CHECK( fillHistogram( chain+flavour+"SV1_significance3d",SV1_significance3d ) );
583 ATH_CHECK( fillHistogram( chain+flavour+"SV1_energyTrkInJet",SV1_energyTrkInJet ) );
584 ATH_CHECK( fillHistogram( chain+flavour+"SV1_NGTinSvx",SV1_NGTinSvx ) );
585 ATH_CHECK( fillHistogram( chain+flavour+"SV1_Lxy",SV1_Lxy ) );
586
587 ATH_CHECK( fillHistogram( chain+flavour+"SV1_masssvx_vs_pT_2D",jetPt,SV1_masssvx ) );
588 ATH_CHECK( fillHistogram( chain+flavour+"SV1_N2Tpair_vs_pT_2D",jetPt,SV1_N2Tpair ) );
589 ATH_CHECK( fillHistogram( chain+flavour+"SV1_efracsvx_vs_pT_2D",jetPt,SV1_efracsvx ) );
590 ATH_CHECK( fillHistogram( chain+flavour+"SV1_deltaR_vs_pT_2D",jetPt,SV1_deltaR ) );
591 ATH_CHECK( fillHistogram( chain+flavour+"SV1_masssvx_vs_eta_2D",jetEta,SV1_masssvx ) );
592 ATH_CHECK( fillHistogram( chain+flavour+"SV1_N2Tpair_vs_eta_2D",jetEta,SV1_N2Tpair ) );
593 ATH_CHECK( fillHistogram( chain+flavour+"SV1_efracsvx_vs_eta_2D",jetEta,SV1_efracsvx ) );
594 ATH_CHECK( fillHistogram( chain+flavour+"SV1_deltaR_vs_eta_2D",jetEta,SV1_deltaR ) );
595
596
597 ATH_MSG_DEBUG( " ** SV1 [masssvx,efracsvx,deltaR,N2Tpair] = [" << SV1_masssvx <<
598 "," << SV1_efracsvx <<
599 "," << SV1_deltaR <<
600 "," << SV1_N2Tpair << "]" );
601
602 // Jet Fitter
603 int JetFitter_N2Tpair = -1;
604 int JetFitter_nVTX = -1;
605 int JetFitter_nSingleTracks = -1;
606 int JetFitter_nTracksAtVtx = -1;
607 float JetFitter_mass = -1;
608 float JetFitter_energyFraction = -1;
609 float JetFitter_significance3d = -1;
610 bTaggingObject->variable< int >( "JetFitter","N2Tpair",JetFitter_N2Tpair );
611 bTaggingObject->variable< int >( "JetFitter","nVTX",JetFitter_nVTX );
612 bTaggingObject->variable< int >( "JetFitter","nSingleTracks",JetFitter_nSingleTracks );
613 bTaggingObject->variable< int >( "JetFitter","nTracksAtVtx",JetFitter_nTracksAtVtx );
614 bTaggingObject->variable< float >( "JetFitter","mass",JetFitter_mass );
615 bTaggingObject->variable< float >( "JetFitter","energyFraction",JetFitter_energyFraction );
616 bTaggingObject->variable< float >( "JetFitter","significance3d",JetFitter_significance3d );
617
618 ATH_CHECK( fillHistogram( chain+flavour+"JetFitter_N2Tpair",JetFitter_N2Tpair ) );
619 ATH_CHECK( fillHistogram( chain+flavour+"JetFitter_nVTX",JetFitter_nVTX ) );
620 ATH_CHECK( fillHistogram( chain+flavour+"JetFitter_nSingleTracks",JetFitter_nSingleTracks ) );
621 ATH_CHECK( fillHistogram( chain+flavour+"JetFitter_nTracksAtVtx",JetFitter_nTracksAtVtx ) );
622 ATH_CHECK( fillHistogram( chain+flavour+"JetFitter_mass",JetFitter_mass ) );
623 ATH_CHECK( fillHistogram( chain+flavour+"JetFitter_energyFraction",JetFitter_energyFraction ) );
624 ATH_CHECK( fillHistogram( chain+flavour+"JetFitter_significance3d",JetFitter_significance3d ) );
625 ATH_MSG_DEBUG( " ** JetFitter [mass] = [" << JetFitter_mass <<"]" );
626
627 // RNNIP
628 double RNNIP_pu = -1;
629 double RNNIP_pb = -1;
630 double RNNIP_pc = -1;
631 double RNNIP_LLR = -1;
632 bTaggingObject->pu( "rnnip",RNNIP_pu );
633 bTaggingObject->pb( "rnnip",RNNIP_pb );
634 bTaggingObject->pc( "rnnip",RNNIP_pc );
635 bTaggingObject->loglikelihoodratio( "rnnip", RNNIP_LLR);
636
637 ATH_CHECK( fillHistogram( chain+flavour+"RNNIP_pu",RNNIP_pu ) );
638 ATH_CHECK( fillHistogram( chain+flavour+"RNNIP_pb",RNNIP_pb ) );
639 ATH_CHECK( fillHistogram( chain+flavour+"RNNIP_pc",RNNIP_pc ) );
640 ATH_CHECK( fillHistogram( chain+flavour+"RNNIP_LLR",RNNIP_LLR ) );
641 ATH_MSG_DEBUG( " ** RNNIP [pu,pb,pc] = [" << RNNIP_pu <<"," << RNNIP_pb << "," << RNNIP_pc << "]" );
642
643 // DL1
644 double DL1_pu = -1;
645 double DL1_pb = -1;
646 double DL1_pc = -1;
647 bTaggingObject->pu( "DL1",DL1_pu );
648 bTaggingObject->pb( "DL1",DL1_pb );
649 bTaggingObject->pc( "DL1",DL1_pc );
650 ATH_CHECK( fillHistogram( chain+flavour+"DL1_pu",DL1_pu ) );
651 ATH_CHECK( fillHistogram( chain+flavour+"DL1_pb",DL1_pb ) );
652 ATH_CHECK( fillHistogram( chain+flavour+"DL1_pc",DL1_pc ) );
653
654 // DL1r
655 double DL1r_pu = -1;
656 double DL1r_pb = -1;
657 double DL1r_pc = -1;
658 bTaggingObject->pu( "DL1r",DL1r_pu );
659 bTaggingObject->pb( "DL1r",DL1r_pb );
660 bTaggingObject->pc( "DL1r",DL1r_pc );
661
662 if ( DL1r_pu == -1 &&
663 DL1r_pb == -1 &&
664 DL1r_pc == -1 ) {
665 bTaggingObject->pu( "DL1rnn",DL1r_pu );
666 bTaggingObject->pb( "DL1rnn",DL1r_pb );
667 bTaggingObject->pc( "DL1rnn",DL1r_pc );
668 }
669
670 float cFraction = 0.03;
671 float DL1r = 0;
672 if ( DL1r_pu != -1 && DL1r_pb != -1 && DL1r_pc != -1 )
673 DL1r = log( DL1r_pb / ( DL1r_pu * ( 1 - cFraction ) + DL1r_pc * cFraction ) );
674
675 float bFraction = 0.03;
676 float DL1rc = 0;
677 if ( DL1r_pu != -1 && DL1r_pb != -1 && DL1r_pc != -1 )
678 DL1rc = log( DL1r_pb / ( DL1r_pu * ( 1 - bFraction ) + DL1r_pc * bFraction ) );
679
680 ATH_CHECK( fillHistogram( chain+flavour+"DL1r_LLR",DL1r ) );
681 ATH_CHECK( fillHistogram( chain+flavour+"DL1rc",DL1rc ) );
682 ATH_CHECK( fillHistogram( chain+flavour+"DL1r_pu",DL1r_pu ) );
683 ATH_CHECK( fillHistogram( chain+flavour+"DL1r_pb",DL1r_pb ) );
684 ATH_CHECK( fillHistogram( chain+flavour+"DL1r_pc",DL1r_pc ) );
685 ATH_MSG_DEBUG( " ** DL1r = " << DL1r );
686 ATH_MSG_DEBUG( " ** DL1r [pu,pb,pc] = [" << DL1r_pu <<"," << DL1r_pb << "," << DL1r_pc << "]" );
687
688 // MV2
689 double mv2c10_discriminant = -2;
690 bTaggingObject->MVx_discriminant( "MV2c10",mv2c10_discriminant );
691
692 ATH_CHECK( fillHistogram( chain+flavour+"MV2c10_discriminant",mv2c10_discriminant ) );
693 ATH_MSG_DEBUG( " ** MV2c10 = " << mv2c10_discriminant );
694
695 return StatusCode::SUCCESS;
696 }
697
698}
699
700
701
Scalar deltaPhi(const MatrixBase< Derived > &vec) const
Scalar deltaR(const MatrixBase< Derived > &vec) const
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_ERROR(x)
#define ATH_MSG_INFO(x)
#define ATH_MSG_DEBUG(x)
Helper class to provide constant type-safe access to aux data.
#define CHECK(...)
Evaluate an expression and check for errors.
size_type size() const noexcept
Returns the number of elements in the collection.
bool passJetJVTSelection(const xAOD::Jet *, const std::string &jetType="AntiKt4EMTopoJets") const
StatusCode retrieveCollectionfromStoreGate(const EventContext &, const CONTAINER *&, const SG::ReadHandleKey< CONTAINER > &) const
bool passJetKinematicSelection(const xAOD::Jet *) const
const xAOD::Vertex * getPrimaryVertex(const xAOD::VertexContainer *) const
bool passJetQualitySelection(const xAOD::Jet *) const
FTAGValidationAlgorithm(const std::string &name, ISvcLocator *pSvcLocator)
SG::ReadHandleKey< xAOD::EventInfo > m_eventInfoKey
StatusCode analyseBTaggingObject(const xAOD::Jet *, const std::string &, std::string="")
StatusCode fillHistogram(const std::string &, T)
virtual StatusCode initialize() override
SG::ReadHandleKey< xAOD::VertexContainer > m_vertexKey
SG::ReadHandleKey< xAOD::TrackParticleContainer > m_trackKey
StatusCode computeAndStoreTrackVariables(const std::string &, const xAOD::Jet *, const std::string &, const xAOD::TrackParticle *, const xAOD::Vertex *, const std::string &="")
Gaudi::Property< std::vector< std::vector< std::string > > > m_Histograms2Ddefinitions
StatusCode analyseTrackParticleObjects(const xAOD::Jet *, const xAOD::Vertex *, const std::string &, std::string="")
Gaudi::Property< std::vector< std::vector< std::string > > > m_Histograms1Ddefinitions
StatusCode defineHistogram(const std::string &, const std::string &, int, double, double, const std::string &path="")
virtual StatusCode execute(const EventContext &ctx) override
Execute method.
SG::ReadHandleKey< xAOD::JetContainer > m_jetKey
Helper class to provide constant type-safe access to aux data.
bool isAvailable(const ELT &e) const
Test to see if this variable exists in the store.
const_reference_type withDefault(const ELT &e, const T &deflt) const
Fetch the variable for one element, as a const reference, with a default.
virtual bool isValid() override final
Can the handle be successfully dereferenced?
const_pointer_type get() const
Dereference the pointer, but don't cache anything.
bool loglikelihoodratio(const std::string &taggername, double &value, const std::string &signal="pb", const std::string &bckgd="pu") const
bool pc(const std::string &taggername, double &value) const
bool pu(const std::string &taggername, double &value) const
bool pb(const std::string &taggername, double &value) const
bool variable(const std::string &taggername, const std::string &variablename, T &value) const
get variables by string
float IP3D_loglikelihoodratio() const
get IP3D log likelihood ratio
bool MVx_discriminant(const std::string &taggername, double &value) const
bool eventType(EventType type) const
Check for one particular bitmask value.
@ IS_SIMULATION
true: simulation, false: data
float z0() const
Returns the parameter.
virtual double phi() const override final
The azimuthal angle ( ) of the particle (has range to .).
const ParametersCovMatrix_t definingParametersCovMatrix() const
Returns the 5x5 symmetric matrix containing the defining parameters covariance matrix.
float vz() const
The z origin for the parameters.
float d0() const
Returns the parameter.
bool summaryValue(uint8_t &value, const SummaryType &information) const
Accessor for TrackSummary values.
virtual double pt() const override final
The transverse momentum ( ) of the particle.
virtual double eta() const override final
The pseudorapidity ( ) of the particle.
float z() const
Returns the z position.
size_t nTrackParticles() const
Get the number of tracks associated with this vertex.
float y() const
Returns the y position.
float x() const
Returns the x position.
T wrapToPi(T phi)
Wrap angle in radians to [-pi, pi].
Definition phihelper.h:24
SG::ReadCondHandle< T > makeHandle(const SG::ReadCondHandleKey< T > &key, const EventContext &ctx=Gaudi::Hive::currentContext())
@ d0
Definition ParamDefs.h:63
@ z0
Definition ParamDefs.h:64
const BTagging * getBTagging(const SG::AuxElement &part)
Access the default xAOD::BTagging object associated to an object.
Jet_v1 Jet
Definition of the current "jet version".
EventInfo_v1 EventInfo
Definition of the latest event info version.
BTagging_v1 BTagging
Definition of the current "BTagging version".
Definition BTagging.h:17
TrackParticle_v1 TrackParticle
Reference the current persistent version:
VertexContainer_v1 VertexContainer
Definition of the current "Vertex container version".
Vertex_v1 Vertex
Define the latest version of the vertex class.
TrackParticleContainer_v1 TrackParticleContainer
Definition of the current "TrackParticle container version".
Muon_v1 Muon
Reference the current persistent version:
JetContainer_v1 JetContainer
Definition of the current "jet container version".
@ numberOfPixelHoles
number of pixel layers on track with absence of hits [unit8_t].
@ numberOfPixelSplitHits
number of Pixel all-layer hits split by cluster splitting [unit8_t].
@ numberOfNextToInnermostPixelLayerHits
these are the hits in the 1st pixel barrel layer
@ numberOfBLayerHits
these are the hits in the first pixel layer, i.e.
@ numberOfBLayerSharedHits
number of Pixel b-layer hits shared by several tracks [unit8_t].
@ numberOfSCTHits
number of hits in SCT [unit8_t].
@ numberOfInnermostPixelLayerHits
these are the hits in the 0th pixel barrel layer
@ numberOfPixelHits
these are the pixel hits, including the b-layer [unit8_t].
@ numberOfPixelSharedHits
number of Pixel all-layer hits shared by several tracks [unit8_t].
@ numberOfSCTSharedHits
number of SCT hits shared by several tracks [unit8_t].
@ numberOfBLayerSplitHits
number of Pixel b-layer hits split by cluster splitting [unit8_t].
@ numberOfSCTHoles
number of SCT holes [unit8_t].
Helper for azimuthal angle calculations.