ATLAS Offline Software
Loading...
Searching...
No Matches
METAssociator.cxx
Go to the documentation of this file.
1
2
3/*
4 Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
5*/
6
7// METAssociator.cxx
8// Implementation for class METAssociator
9//
10// This is the base class for tools that construct MET terms
11// from other object collections.
12//
13// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
14//
15// Author: P Loch, S Resconi, TJ Khoo, AS Mete
17
18// METReconstruction includes
25
26// Tracking EDM
27#include "xAODTracking/Vertex.h"
29
30// Track errors
32
33// Tool interface headers
37
38// For DeltaR
40
41#include "GaudiKernel/SystemOfUnits.h"
42
43#include "TRandom3.h"
44
45
46namespace met {
47
48 using namespace xAOD;
49
50 // UE correction for each lepton
51 const static SG::Decorator<float> dec_UEcorr("UEcorr_Pt");
52
53
55 // Public methods:
57
58 // Constructors
60 METAssociator::METAssociator(const std::string& name) :
62 m_trkseltool(this,""),
63 m_trkIsolationTool(this,""),
64 m_caloIsolationTool(this,"")
65 {
66 ATH_MSG_INFO("METAssoc constructor");
67 declareProperty( "UseModifiedClus", m_useModifiedClus = false );
68 declareProperty( "UseTracks", m_useTracks = true );
69 declareProperty( "PFlow", m_pflow = false );
70 declareProperty( "UseRapidity", m_useRapidity = false );
71 declareProperty( "TrackSelectorTool", m_trkseltool );
72 declareProperty( "TrackIsolationTool", m_trkIsolationTool );
73 declareProperty( "CaloIsolationTool", m_caloIsolationTool );
74 declareProperty( "IgnoreJetConst", m_skipconst = false );
75 declareProperty( "ForwardColl", m_forcoll = "" );
76 declareProperty( "ForwardDef", m_foreta = 2.5 );
77 declareProperty( "CentralTrackPtThr", m_cenTrackPtThr = 30e+3 );
78 declareProperty( "ForwardTrackPtThr", m_forTrackPtThr = 30e+3 );
79 declareProperty( "CleanCPFO", m_cleanChargedPFO = true );
80 declareProperty( "UsePFOLinks", m_usePFOLinks = false );
81 declareProperty( "UseFELinks", m_useFELinks = false );
82 declareProperty( "NeutralPFOLinksKey", m_neutralPFOLinksKey = "neutralpfoLinks");
83 declareProperty( "ChargedPFOLinksKey", m_chargedPFOLinksKey = "chargedpfoLinks");
84 declareProperty( "NeutralFELinksKey", m_neutralFELinksKey = "neutralGlobalFELinks");
85 declareProperty( "ChargedFELinksKey", m_chargedFELinksKey = "chargedGlobalFELinks");
86 }
87
88 // Destructor
91 = default;
92
93 // Athena algtool's Hooks
96 {
97 ATH_MSG_DEBUG ("Initializing " << name() << "...");
98
99 ATH_CHECK( m_trkseltool.retrieve() );
100 ATH_CHECK(m_trkIsolationTool.retrieve());
101 ATH_CHECK(m_caloIsolationTool.retrieve());
102
103 if(m_clcollKey.key() == "CaloCalTopoClusters") {
105 ATH_MSG_ERROR("Configured to use modified topocluster collection but \"CaloCalTopoClusters\" collection specified!");
106 return StatusCode::FAILURE;
107 } else {
108 ATH_MSG_INFO("Configured to use standard topocluster collection.");
109 }
110 } else {
112 ATH_MSG_INFO("Configured to use modified topocluster collection \"" << m_clcollKey.key() << "\".");
113 } else {
114 ATH_MSG_ERROR("Configured to use topocluster collection \"" << m_clcollKey.key() << "\", but modified clusters flag not set!");
115 return StatusCode::FAILURE;
116 }
117 }
118 //initialise read handle keys
119 ATH_CHECK( m_pvcollKey.initialize(m_useTracks));
120 ATH_CHECK( m_trkcollKey.initialize(m_useTracks));
121
122 ATH_CHECK(m_fecollKey.initialize(m_pflow && !m_fecollKey.key().empty()));
123 ATH_CHECK( m_pfcollKey.initialize(m_pflow && m_fecollKey.key().empty()));
124 if(m_pflow){
125 if(!m_fecollKey.key().empty()){
126 ATH_MSG_INFO("Configured to use FlowElement collection \"" << m_fecollKey.key() << "\".");
127 }
128 else{
129 ATH_MSG_INFO("Configured to use PFlow collection \"" << m_pfcollKey.key() << "\".");
130 if(m_pfcollKey.key() == "JetETMissParticleFlowObjects") {
131 ATH_MSG_ERROR("Configured to use standard pflow collection \"" << m_pfcollKey.key() << "\".");
132 ATH_MSG_ERROR("This is no longer supported -- please use the CHSParticleFlowObjects collection, which has the four-vector corrections built in.");
133 return StatusCode::FAILURE;
134 }
135 }
136 }
137
138 ATH_CHECK( m_clcollKey.initialize(!m_skipconst || m_forcoll.empty()));
139
140 std::string hybridname = "Etmiss";
141 hybridname += m_clcollKey.key();
142 hybridname += m_foreta;
143 hybridname += m_forcoll;
144 ATH_CHECK( m_hybridContKey.assign(hybridname));
145 ATH_CHECK( m_hybridContKey.initialize(m_skipconst && !m_forcoll.empty()));
146
147 return StatusCode::SUCCESS;
148 }
149
151 {
152 ATH_MSG_DEBUG ("In execute: " << name() << "...");
153 if(!metCont) {
154 ATH_MSG_WARNING("Invalid pointer to MissingETContainer supplied! Abort.");
155 return StatusCode::FAILURE;
156 }
157
158 if(!metMap) {
159 ATH_MSG_WARNING("Invalid pointer to MissingETAssociationMap supplied! Abort.");
160 return StatusCode::FAILURE;
161 }
162 if(m_pflow && !m_useTracks ){
163 ATH_MSG_WARNING("Attempting to build PFlow MET without a track collection.");
164 return StatusCode::FAILURE;
165 }
166
167 return this->executeTool(metCont, metMap);
168 }
169
171 {
172 ATH_MSG_DEBUG ("In execute: " << name() << "...");
173 if (!m_skipconst || m_forcoll.empty()) {
174
176 if (!topoclusterCont.isValid()) {
177 ATH_MSG_WARNING("Unable to retrieve topocluster container " << m_clcollKey.key() << " for overlap removal");
178 return StatusCode::FAILURE;
179 }
180 constits.tcCont=topoclusterCont.cptr();
181 ATH_MSG_DEBUG("Successfully retrieved topocluster collection");
182 } else {
183 std::string hybridname = "Etmiss";
184 hybridname += m_clcollKey.key();
185 hybridname += m_foreta;
186 hybridname += m_forcoll;
187
189 if( hybridCont.isValid()) {
190 constits.tcCont=hybridCont.cptr();
191 } else {
192 ATH_MSG_WARNING("Trying to do something currently unsupported- lets abort");
193 return StatusCode::FAILURE;
194 // Trying to do this using write handles (need to get some input here)
195 /*std::unique_ptr<ConstDataVector<IParticleContainer>> hybridCont = std::make_unique<ConstDataVector<IParticleContainer>>();
196 SG::WriteHandle<ConstDataVector<IParticleContainer>> hybridContHandle(hybridname);
197
198 StatusCode sc = hybridContHandle.record(std::make_unique<ConstDataVector<IParticleContainer>>(*hybridCont));
199
200 if (sc.isFailure()) {
201 ATH_MSG_WARNING("Unable to record container");
202 return StatusCode::SUCCESS;
203
204 }*/
205
206 /*SG::ReadHandle<IParticleContainer> centCont(m_clcoll);
207 if (!centCont.isValid()) {
208 ATH_MSG_WARNING("Unable to retrieve central container " << m_clcoll << " for overlap removal");
209 return StatusCode::FAILURE;
210 }
211
212 SG::ReadHandle<IParticleContainer> forCont(m_forcoll);
213 if (!forCont.isValid()) {
214 ATH_MSG_WARNING("Unable to retrieve forward container " << m_forcoll << " for overlap removal");
215 return StatusCode::FAILURE;
216 }
217 ConstDataVector<IParticleContainer> *hybridCont = new ConstDataVector<IParticleContainer>(SG::VIEW_ELEMENTS);
218
219 const IParticleContainer* centCont=0;
220 if( evtStore()->retrieve(centCont, m_clcoll).isFailure() ) {
221 ATH_MSG_WARNING("Unable to retrieve central container " << m_clcoll << " for overlap removal");
222 return StatusCode::FAILURE;
223 }
224
225 const IParticleContainer* forCont=0;
226 if( evtStore()->retrieve(forCont, m_forcoll).isFailure() ) {
227 ATH_MSG_WARNING("Unable to retrieve forward container " << m_forcoll << " for overlap removal");
228 return StatusCode::FAILURE;
229 }
230
231 for(const auto clus : *centCont) if (fabs(clus->eta())<m_foreta) hybridCont->push_back(clus);
232 for(const auto clus : *forCont) if (fabs(clus->eta())>=m_foreta) hybridCont->push_back(clus);
233 ATH_CHECK( evtStore()->record(hybridCont,hybridname));
234 constits.tcCont = hybridCont->asDataVector();
235 */
236 }
237 }
238
239 if( !m_useTracks){
240 //if you want to skip tracks, set the track collection empty manually
241 ATH_MSG_DEBUG("Skipping tracks");
242 }else{
244 if (!vxCont.isValid()) {
245 ATH_MSG_WARNING("Unable to retrieve primary vertex container " << m_pvcollKey.key());
246 //this is actually really bad. If it's empty that's okay
247 return StatusCode::FAILURE;
248 }
249
250 ATH_MSG_DEBUG("Successfully retrieved primary vertex container");
251 ATH_MSG_DEBUG("Container holds " << vxCont->size() << " vertices");
252
253 for(const auto *const vx : *vxCont) {
254 ATH_MSG_VERBOSE( "Testing vertex " << vx->index() );
255 if(vx->vertexType()==VxType::PriVtx)
256 {constits.pv = vx; break;}
257 }
258 if(!constits.pv) {
259 ATH_MSG_DEBUG("Failed to find primary vertex! Reject all tracks.");
260 } else {
261 ATH_MSG_VERBOSE("Primary vertex has z = " << constits.pv->z());
262 }
263
264 constits.trkCont=nullptr;
265 ATH_MSG_DEBUG("Retrieving Track collection " << m_trkcollKey.key());
267 if (!trCont.isValid()) {
268 ATH_MSG_WARNING("Unable to retrieve track particle container");
269 return StatusCode::FAILURE;
270 }
271 constits.trkCont=trCont.cptr();
272
273 if(m_pflow){
274 if(!m_fecollKey.key().empty()){
275 ATH_MSG_DEBUG("Retrieving FlowElement collection " << m_fecollKey.key());
276 constits.feCont = nullptr;
278 if (!feCont.isValid()) {
279 ATH_MSG_ERROR("Unable to retrieve FlowElement container "<< m_fecollKey.key());
280 return StatusCode::FAILURE;
281 }
282 constits.feCont=feCont.cptr();
283 }
284 else{
285 ATH_MSG_DEBUG("Retrieving PFlow collection " << m_pfcollKey.key());
286 constits.pfoCont = nullptr;
288 if (!pfCont.isValid()) {
289 ATH_MSG_WARNING("Unable to PFlow object container");
290 return StatusCode::FAILURE;
291 }
292 constits.pfoCont=pfCont.cptr();
293 }
294 }//pflow
295 }//retrieve track/pfo containers
296
297 return StatusCode::SUCCESS;
298 }
299
301 // Protected methods:
303
305 const xAOD::IParticleContainer* hardObjs) const
306 {
307 ConstitHolder constits;
308
309 if (retrieveConstituents(constits).isFailure()) {
310 ATH_MSG_DEBUG("Unable to retrieve constituent containers");
311 return StatusCode::FAILURE;
312 }
313
314 std::vector<const IParticle*> constlist;
315 constlist.reserve(20);
316 std::vector<const IParticle*> hardObjs_tmp;
317 for(const auto *const obj : *hardObjs) {
318 hardObjs_tmp.push_back(obj);
319 }
320 std::sort(hardObjs_tmp.begin(),hardObjs_tmp.end(),greaterPt);
321
322 for(const auto& obj : hardObjs_tmp) {
323 if(obj->pt()<4e3 && obj->type()!=xAOD::Type::Muon) continue;
324 constlist.clear();
325 ATH_MSG_VERBOSE( "Object type, pt, eta, phi = " << obj->type() << ", " << obj->pt() << ", " << obj->eta() << "," << obj->phi() );
326 if(m_pflow){
327 if(!m_fecollKey.key().empty()){
328 if(!m_useTracks){
329 ATH_MSG_ERROR("Attempting to build FlowElement MET without a track collection.");
330 return StatusCode::FAILURE;
331 }
332 std::map<const IParticle*, MissingETBase::Types::constvec_t> momentumOverride;
333 if(m_recoil){ // HR part:
334 float UEcorr_Pt = 0.; // Underlying event correction for HR
335 ATH_CHECK(extractFEHR(obj,hardObjs_tmp,constlist,constits,momentumOverride, UEcorr_Pt));
336 ATH_MSG_DEBUG("Energy correction is: " << UEcorr_Pt);
337 dec_UEcorr(*obj) = UEcorr_Pt;
338 }
339 else{ // MET part:
340 ATH_CHECK( this->extractFE(obj, constlist, constits, momentumOverride) );
341 }
342 MissingETComposition::insert(metMap, obj, constlist, momentumOverride);
343 }
344 else{
345 // Old PFO EDM
346 if(!m_useTracks){
347 ATH_MSG_DEBUG("Attempting to build PFlow without a track collection.");
348 return StatusCode::FAILURE;
349 }else{
350 std::map<const IParticle*,MissingETBase::Types::constvec_t> momentumOverride;
351 ATH_CHECK( this->extractPFO(obj,constlist,constits,momentumOverride) );
352 MissingETComposition::insert(metMap,obj,constlist,momentumOverride);
353 }
354 }
355 } else {
356 std::vector<const IParticle*> tclist;
357 tclist.reserve(20);
358 ATH_CHECK( this->extractTopoClusters(obj,tclist,constits) );
360 for(const auto& cl : tclist) {
361 // use index-parallelism to identify shallow copied constituents
362 constlist.push_back((*constits.tcCont)[cl->index()]);
363 }
364 } else {
365 constlist = tclist;
366 }
367 if(m_useTracks) ATH_CHECK( this->extractTracks(obj,constlist,constits) );
368 MissingETComposition::insert(metMap,obj,constlist);
369 }
370 }
371 return StatusCode::SUCCESS;
372 }
373
374 // Accept Track
377 {
378
379 if (!vx) return false;//in events with no pv, we will just reject all tracks, and therefore build only the calo MET
380 return static_cast<bool> (m_trkseltool->accept( *trk, vx ));
381 }
382
383
385 {
386
387 if( (fabs(trk->eta())<1.5 && trk->pt()>m_cenTrackPtThr) ||
388 (fabs(trk->eta())>=1.5 && trk->pt()>m_forTrackPtThr) ) {
389
390 // Get relative error on qoverp
391 float Rerr = Amg::error(trk->definingParametersCovMatrix(),4)/fabs(trk->qOverP());
392 ATH_MSG_VERBOSE( "Track momentum error (%): " << Rerr*100 );
393
394 // first compute track and calo isolation variables
395 float ptcone20 = 0., isolfrac = 0., etcone10 = 0., EoverP = 0.;
396 // ptcone
397 TrackIsolation trkIsoResult;
398 std::vector<Iso::IsolationType> trkIsoCones;
399 trkIsoCones.push_back(xAOD::Iso::IsolationType::ptcone20);
400 xAOD::TrackCorrection trkIsoCorr;
402 m_trkIsolationTool->trackIsolation(trkIsoResult,
403 *trk,
404 trkIsoCones,
405 trkIsoCorr);
406 ptcone20 = !trkIsoResult.ptcones.empty() ? trkIsoResult.ptcones[0] : 0;
407 isolfrac = ptcone20/trk->pt();
408 // etcone
409 CaloIsolation caloIsoResult;
410 std::vector<Iso::IsolationType> caloIsoCones;
411 // We can't actually configure the tool to give etcone10, so instead we have to compute etcone20,
412 // applying the core cone correction.
413 // Then, we retrieve the correction value, which is etcone10, rather than the isolation value
414 caloIsoCones.push_back(xAOD::Iso::IsolationType::etcone20);
415 xAOD::CaloCorrection caloIsoCorr_coreCone;
416 caloIsoCorr_coreCone.calobitset.set(xAOD::Iso::IsolationCaloCorrection::coreCone); // this is etcone10
417 m_caloIsolationTool->caloTopoClusterIsolation(caloIsoResult,
418 *trk,
419 caloIsoCones,
420 caloIsoCorr_coreCone);
421 if(!caloIsoResult.etcones.empty()) {
422 // retrieve the correction value for the core cone
424 } else {
425 ATH_MSG_WARNING("isGoodEoverP: Failed to retrieve the isolation core correction (etcone10)! Setting etcone10=0");
426 etcone10 = 0.;
427 }
428 EoverP = etcone10/trk->pt();
430 ATH_MSG_VERBOSE( "Track isolation fraction: " << isolfrac );
431 ATH_MSG_VERBOSE( "Track E/P = " << EoverP );
432
433 if(isolfrac<0.1) {
434 // isolated track cuts
435 if(Rerr>0.4) return false;
436 else if (EoverP<0.65 && ((EoverP>0.1 && Rerr>0.05) || Rerr>0.1)) return false;
437 } else {
438 // non-isolated track cuts
439 float trkptsum = ptcone20+trk->pt();
440 if(etcone10/trkptsum<0.6 && trk->pt()/trkptsum>0.6) return false;
441 }
442 }
443 return true;
444 }
445
446 StatusCode METAssociator::GetUEcorr(const met::METAssociator::ConstitHolder& constits, // all PFOs
447 std::vector<TLorentzVector>& v_clus, // TLV vector of all clusters of hard objects
448 TLorentzVector& clus, // TLV of current cluster
449 TLorentzVector& HR, // uncorrected HR
450 const float Drcone, // Cone size for el-pfo association
451 const float MinDistCone, // Cone size for getting random Phi
452 float& UEcorr) const // UE correction (result)
453 {
454 // 1. Get random phi
455 unsigned int seed = floor( clus.Pt() * Gaudi::Units::GeV );
456 TRandom3 hole;
457 hole.SetSeed(seed);
458
459 bool isNextToPart(true);
460 bool isNextToHR(true);
461 double phiRnd(0.);
462
463 int numOfRndTrials = 0; // Counter for trials to find random cone without overlaps
464 const int maxNumOfRndTrials = 100; // Max. number of trials to find random cone without overlaps
465
466 while(isNextToPart || isNextToHR ){
467 isNextToPart = false;
468 isNextToHR = true;
469
470 phiRnd = hole.Uniform( -std::numbers::pi, std::numbers::pi);
471 double dR = P4Helpers::deltaR( HR.Eta(), HR.Phi(), clus.Eta(), phiRnd );
472 if(dR > MinDistCone){
473 isNextToHR = false;
474 }
475
476 for(const auto& clus_j : v_clus) { // loop over leptons
477 dR = P4Helpers::deltaR( clus.Eta(), phiRnd, clus_j.Eta(), clus_j.Phi() );
478 if(dR < MinDistCone){
479 isNextToPart = true;
480 break;
481 }
482 } // swclus_j
483
484 numOfRndTrials++;
485 if(numOfRndTrials == maxNumOfRndTrials){ // check number of trials
486 UEcorr = 0.;
487 return StatusCode::SUCCESS;
488 }
489 } // while isNextToPart, isNextToHR
490
491 ATH_MSG_DEBUG("Found rnd phi: " << phiRnd);
492
493
494 // 2. Calculete UE correction
495 TLorentzVector tv_UEcorr; // TLV of UE correction (initialized with 0,0,0,0 automatically)
496 std::pair <double, double> eta_rndphi = std::make_pair(clus.Eta(), phiRnd); // pair of current cluser eta and random phi
497
498
499 // Calculate delta phi -> always the same angle so its sufficient to calculate it only once
500 float dphi_angle=P4Helpers::deltaPhi(clus.Phi(),eta_rndphi.second);
501
502 for(const auto fe_itr : *constits.feCont){ // loop over PFOs
503 if(fe_itr->pt() < 0 || fe_itr->e() < 0){ //sanity check
504 continue;
505 }
506
507 //remove charged FE that are not matched to the PV
508 const static SG::ConstAccessor<char> PVMatchedAcc("matchedToPV");
509 if(fe_itr->isCharged() && !PVMatchedAcc(*fe_itr)){
510 continue;
511 }
512
513 double dR = P4Helpers::deltaR( fe_itr->eta(), fe_itr->phi(), eta_rndphi.first, eta_rndphi.second );
514 if( dR < Drcone ){
515 // Rotate on dphi_angle
516 TLorentzVector tv_fe = fe_itr->p4();
517 tv_fe.RotateZ(dphi_angle);
518 tv_UEcorr += tv_fe; // summing PFOs of UE for correction
519 } // cone requirement
520 } // loop over PFOs
521
522 UEcorr = tv_UEcorr.Pt(); // Pt of UE correction
523
524 return StatusCode::SUCCESS;
525 }
526}
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_ERROR(x)
#define ATH_MSG_INFO(x)
#define ATH_MSG_VERBOSE(x)
#define ATH_MSG_WARNING(x)
#define ATH_MSG_DEBUG(x)
DataVector adapter that acts like it holds const pointers.
Gaudi::Details::PropertyBase & declareProperty(Gaudi::Property< T, V, H > &t)
Helper class to provide constant type-safe access to aux data.
Helper class to provide type-safe access to aux data.
Definition Decorator.h:59
virtual bool isValid() override final
Can the handle be successfully dereferenced?
const_pointer_type cptr()
Dereference the pointer.
AsgTool(const std::string &name)
Constructor specifying the tool instance's name.
Definition AsgTool.cxx:58
SG::ReadHandleKey< xAOD::PFOContainer > m_pfcollKey
SG::ReadHandleKey< xAOD::TrackParticleContainer > m_trkcollKey
SG::ReadHandleKey< xAOD::VertexContainer > m_pvcollKey
virtual StatusCode initialize() override
Dummy implementation of the initialisation function.
virtual StatusCode extractFEHR(const xAOD::IParticle *, std::vector< const xAOD::IParticle * >, std::vector< const xAOD::IParticle * > &, const met::METAssociator::ConstitHolder &, std::map< const xAOD::IParticle *, MissingETBase::Types::constvec_t > &, float &) const
virtual StatusCode extractPFO(const xAOD::IParticle *obj, std::vector< const xAOD::IParticle * > &pfolist, const met::METAssociator::ConstitHolder &constits, std::map< const xAOD::IParticle *, MissingETBase::Types::constvec_t > &momenta) const =0
ToolHandle< xAOD::ICaloTopoClusterIsolationTool > m_caloIsolationTool
virtual StatusCode extractFE(const xAOD::IParticle *obj, std::vector< const xAOD::IParticle * > &felist, const met::METAssociator::ConstitHolder &constits, std::map< const xAOD::IParticle *, MissingETBase::Types::constvec_t > &momenta) const =0
ToolHandle< InDet::IInDetTrackSelectionTool > m_trkseltool
virtual StatusCode execute(xAOD::MissingETContainer *metCont, xAOD::MissingETAssociationMap *metMap) const override
virtual StatusCode fillAssocMap(xAOD::MissingETAssociationMap *metMap, const xAOD::IParticleContainer *hardObjs) const
std::string m_chargedFELinksKey
std::string m_forcoll
SG::ReadHandleKey< xAOD::IParticleContainer > m_hybridContKey
std::string m_neutralPFOLinksKey
static bool greaterPt(const xAOD::IParticle *part1, const xAOD::IParticle *part2)
virtual StatusCode extractTopoClusters(const xAOD::IParticle *obj, std::vector< const xAOD::IParticle * > &tclist, const met::METAssociator::ConstitHolder &constits) const =0
virtual ~METAssociator()
std::string m_chargedPFOLinksKey
virtual StatusCode extractTracks(const xAOD::IParticle *obj, std::vector< const xAOD::IParticle * > &constlist, const met::METAssociator::ConstitHolder &constits) const =0
ToolHandle< xAOD::ITrackIsolationTool > m_trkIsolationTool
Gaudi::Property< bool > m_recoil
virtual StatusCode executeTool(xAOD::MissingETContainer *metCont, xAOD::MissingETAssociationMap *metMap) const =0
bool isGoodEoverP(const xAOD::TrackParticle *trk) const
StatusCode retrieveConstituents(met::METAssociator::ConstitHolder &constits) const
std::string m_neutralFELinksKey
SG::ReadHandleKey< xAOD::IParticleContainer > m_clcollKey
SG::ReadHandleKey< xAOD::FlowElementContainer > m_fecollKey
StatusCode GetUEcorr(const met::METAssociator::ConstitHolder &constits, std::vector< TLorentzVector > &v_clus, TLorentzVector &clus, TLorentzVector &HR, const float Drcone, const float MinDistCone, float &UEcorr) const
bool acceptTrack(const xAOD::TrackParticle *trk, const xAOD::Vertex *pv) const
const ParametersCovMatrix_t definingParametersCovMatrix() const
Returns the 5x5 symmetric matrix containing the defining parameters covariance matrix.
float qOverP() const
Returns the parameter.
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.
double error(const Amg::MatrixX &mat, int index)
return diagonal error of the matrix caller should ensure the matrix is symmetric and the index is in ...
static const SG::Decorator< float > dec_UEcorr("UEcorr_Pt")
static const SG::ConstAccessor< char > PVMatchedAcc("matchedToPV")
void sort(typename DataModel_detail::iterator< DVL > beg, typename DataModel_detail::iterator< DVL > end)
Specialization of sort for DataVector/List.
@ Muon
The object is a muon.
Definition ObjectType.h:48
@ etcone20
Calorimeter isolation.
@ ptcone20
Track isolation.
double deltaPhi(double phiA, double phiB)
delta Phi in range [-pi,pi[
double deltaR(double rapidity1, double phi1, double rapidity2, double phi2)
from bare bare rapidity,phi
@ PriVtx
Primary vertex.
setRcore setEtHad setFside pt
TrackParticle_v1 TrackParticle
Reference the current persistent version:
Vertex_v1 Vertex
Define the latest version of the vertex class.
MissingETAssociationMap_v1 MissingETAssociationMap
Version control by type defintion.
DataVector< IParticle > IParticleContainer
Simple convenience declaration of IParticleContainer.
const xAOD::IParticleContainer * tcCont
const xAOD::FlowElementContainer * feCont
const xAOD::PFOContainer * pfoCont
const xAOD::TrackParticleContainer * trkCont
static bool insert(MissingETComponentMap *pMap, const MissingET *pMET, const IParticle *pPart, MissingETBase::Types::weight_t weight=MissingETBase::Types::weight_t())
Insert contributing signal or physics object by pointer, with optional kinematic weight object.
Iso::IsolationCaloCorrectionBitset calobitset
std::vector< float > etcones
std::map< Iso::IsolationCaloCorrection, std::map< Iso::IsolationCorrectionParameter, float > > coreCorrections
Iso::IsolationTrackCorrectionBitset trackbitset
std::vector< float > ptcones