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// For DeltaR
35
37
38#include "GaudiKernel/SystemOfUnits.h"
39
40#include "TRandom3.h"
41
42
43namespace met {
44
45 using namespace xAOD;
46
48 // Public methods:
50
51 // Constructors
53 METAssociator::METAssociator(const std::string& name) :
55 {
56 }
57
58 // Destructor
61 = default;
62
63 // Athena algtool's Hooks
66 {
67 ATH_MSG_DEBUG ("Initializing " << name() << "...");
68
69 ATH_CHECK( m_trkseltool.retrieve() );
70 ATH_CHECK(m_trkIsolationTool.retrieve());
72
73 if(m_clcollKey.key() == "CaloCalTopoClusters") {
75 ATH_MSG_ERROR("Configured to use modified topocluster collection but \"CaloCalTopoClusters\" collection specified!");
76 return StatusCode::FAILURE;
77 } else {
78 ATH_MSG_INFO("Configured to use standard topocluster collection.");
79 }
80 } else {
82 ATH_MSG_INFO("Configured to use modified topocluster collection \"" << m_clcollKey.key() << "\".");
83 } else {
84 ATH_MSG_ERROR("Configured to use topocluster collection \"" << m_clcollKey.key() << "\", but modified clusters flag not set!");
85 return StatusCode::FAILURE;
86 }
87 }
88 //initialise read handle keys
89 ATH_CHECK( m_pvcollKey.initialize(m_useTracks));
91
92 ATH_CHECK(m_fecollKey.initialize(m_pflow && !m_fecollKey.key().empty()));
93 ATH_CHECK( m_pfcollKey.initialize(m_pflow && m_fecollKey.key().empty()));
94 if(m_pflow){
95 if(!m_fecollKey.key().empty()){
96 ATH_MSG_INFO("Configured to use FlowElement collection \"" << m_fecollKey.key() << "\".");
97 }
98 else{
99 ATH_MSG_INFO("Configured to use PFlow collection \"" << m_pfcollKey.key() << "\".");
100 if(m_pfcollKey.key() == "JetETMissParticleFlowObjects") {
101 ATH_MSG_ERROR("Configured to use standard pflow collection \"" << m_pfcollKey.key() << "\".");
102 ATH_MSG_ERROR("This is no longer supported -- please use the CHSParticleFlowObjects collection, which has the four-vector corrections built in.");
103 return StatusCode::FAILURE;
104 }
105 }
106 }
107
108 ATH_CHECK( m_clcollKey.initialize(!m_skipconst || m_forcoll.value().empty()));
109
110 std::string hybridname = "Etmiss";
111 hybridname += m_clcollKey.key();
112 hybridname += m_foreta.value();
113 hybridname += m_forcoll.value();
114 ATH_CHECK( m_hybridContKey.assign(hybridname)); // FIXME Keys should be properly assigned during the configuration
115 ATH_CHECK( m_hybridContKey.initialize(m_skipconst && !m_forcoll.value().empty()));
116
118 if (!m_recoil && !m_UEcorrPtDecorKey.key().empty()) {
120 }
121 return StatusCode::SUCCESS;
122 }
123
124 StatusCode METAssociator::execute(xAOD::MissingETContainer* metCont, xAOD::MissingETAssociationMap* metMap, const EventContext& ctx) const
125 {
126 ATH_MSG_DEBUG ("In execute: " << name() << "...");
127 if(!metCont) {
128 ATH_MSG_WARNING("Invalid pointer to MissingETContainer supplied! Abort.");
129 return StatusCode::FAILURE;
130 }
131
132 if(!metMap) {
133 ATH_MSG_WARNING("Invalid pointer to MissingETAssociationMap supplied! Abort.");
134 return StatusCode::FAILURE;
135 }
136 if(m_pflow && !m_useTracks ){
137 ATH_MSG_WARNING("Attempting to build PFlow MET without a track collection.");
138 return StatusCode::FAILURE;
139 }
140
141 return this->executeTool(metCont, metMap, ctx);
142 }
143
144 StatusCode METAssociator::retrieveConstituents(met::METAssociator::ConstitHolder& constits, const EventContext& ctx) const
145 {
146 ATH_MSG_DEBUG ("In execute: " << name() << "...");
147 if (!m_skipconst || m_forcoll.value().empty()) { // FIXME m_clcollKey.value().empty() ???
148
150 if (!topoclusterCont.isValid()) {
151 ATH_MSG_WARNING("Unable to retrieve topocluster container " << m_clcollKey.key() << " for overlap removal");
152 return StatusCode::FAILURE;
153 }
154 constits.tcCont=topoclusterCont.cptr();
155 ATH_MSG_DEBUG("Successfully retrieved topocluster collection");
156 } else {
157 std::string hybridname = "Etmiss";
158 hybridname += m_clcollKey.key();
159 hybridname += m_foreta.value();
160 hybridname += m_forcoll.value();
161
163 if( hybridCont.isValid()) {
164 constits.tcCont=hybridCont.cptr();
165 } else {
166 ATH_MSG_WARNING("Trying to do something currently unsupported- lets abort");
167 return StatusCode::FAILURE;
168 // Trying to do this using write handles (need to get some input here)
169 /*std::unique_ptr<ConstDataVector<IParticleContainer>> hybridCont = std::make_unique<ConstDataVector<IParticleContainer>>();
170 SG::WriteHandle<ConstDataVector<IParticleContainer>> hybridContHandle(hybridname, ctx);
171
172 StatusCode sc = hybridContHandle.record(std::make_unique<ConstDataVector<IParticleContainer>>(*hybridCont));
173
174 if (sc.isFailure()) {
175 ATH_MSG_WARNING("Unable to record container");
176 return StatusCode::SUCCESS;
177
178 }*/
179
180 /*SG::ReadHandle<IParticleContainer> centCont(m_clcoll, ctx);
181 if (!centCont.isValid()) {
182 ATH_MSG_WARNING("Unable to retrieve central container " << m_clcoll << " for overlap removal");
183 return StatusCode::FAILURE;
184 }
185
186 SG::ReadHandle<IParticleContainer> forCont(m_forcoll, ctx);
187 if (!forCont.isValid()) {
188 ATH_MSG_WARNING("Unable to retrieve forward container " << m_forcoll << " for overlap removal");
189 return StatusCode::FAILURE;
190 }
191 ConstDataVector<IParticleContainer> *hybridCont = new ConstDataVector<IParticleContainer>(SG::VIEW_ELEMENTS);
192
193 const IParticleContainer* centCont=0;
194 if( evtStore()->retrieve(centCont, m_clcoll).isFailure() ) {
195 ATH_MSG_WARNING("Unable to retrieve central container " << m_clcoll << " for overlap removal");
196 return StatusCode::FAILURE;
197 }
198
199 const IParticleContainer* forCont=0;
200 if( evtStore()->retrieve(forCont, m_forcoll).isFailure() ) {
201 ATH_MSG_WARNING("Unable to retrieve forward container " << m_forcoll << " for overlap removal");
202 return StatusCode::FAILURE;
203 }
204
205 for(const auto clus : *centCont) if (fabs(clus->eta())<m_foreta) hybridCont->push_back(clus);
206 for(const auto clus : *forCont) if (fabs(clus->eta())>=m_foreta) hybridCont->push_back(clus);
207 ATH_CHECK( evtStore()->record(hybridCont,hybridname));
208 constits.tcCont = hybridCont->asDataVector();
209 */
210 }
211 }
212
213 if( !m_useTracks){
214 //if you want to skip tracks, set the track collection empty manually
215 ATH_MSG_DEBUG("Skipping tracks");
216 }else{
218 if (!vxCont.isValid()) {
219 ATH_MSG_WARNING("Unable to retrieve primary vertex container " << m_pvcollKey.key());
220 //this is actually really bad. If it's empty that's okay
221 return StatusCode::FAILURE;
222 }
223
224 ATH_MSG_DEBUG("Successfully retrieved primary vertex container");
225 ATH_MSG_DEBUG("Container holds " << vxCont->size() << " vertices");
226
227 for(const auto *const vx : *vxCont) {
228 ATH_MSG_VERBOSE( "Testing vertex " << vx->index() );
229 if(vx->vertexType()==VxType::PriVtx)
230 {constits.pv = vx; break;}
231 }
232 if(!constits.pv) {
233 ATH_MSG_DEBUG("Failed to find primary vertex! Reject all tracks.");
234 } else {
235 ATH_MSG_VERBOSE("Primary vertex has z = " << constits.pv->z());
236 }
237
238 constits.trkCont=nullptr;
239 ATH_MSG_DEBUG("Retrieving Track collection " << m_trkcollKey.key());
241 if (!trCont.isValid()) {
242 ATH_MSG_WARNING("Unable to retrieve track particle container");
243 return StatusCode::FAILURE;
244 }
245 constits.trkCont=trCont.cptr();
246
247 if(m_pflow){
248 if(!m_fecollKey.key().empty()){
249 ATH_MSG_DEBUG("Retrieving FlowElement collection " << m_fecollKey.key());
250 constits.feCont = nullptr;
252 if (!feCont.isValid()) {
253 ATH_MSG_ERROR("Unable to retrieve FlowElement container "<< m_fecollKey.key());
254 return StatusCode::FAILURE;
255 }
256 constits.feCont=feCont.cptr();
257 }
258 else{
259 ATH_MSG_DEBUG("Retrieving PFlow collection " << m_pfcollKey.key());
260 constits.pfoCont = nullptr;
262 if (!pfCont.isValid()) {
263 ATH_MSG_WARNING("Unable to PFlow object container");
264 return StatusCode::FAILURE;
265 }
266 constits.pfoCont=pfCont.cptr();
267 }
268 }//pflow
269 }//retrieve track/pfo containers
270
271 return StatusCode::SUCCESS;
272 }
273
275 // Protected methods:
277
279 const xAOD::IParticleContainer* hardObjs, const EventContext& ctx) const
280 {
281 ConstitHolder constits;
282
283 if (retrieveConstituents(constits, ctx).isFailure()) {
284 ATH_MSG_DEBUG("Unable to retrieve constituent containers");
285 return StatusCode::FAILURE;
286 }
287
289 std::vector<const IParticle*> constlist;
290 constlist.reserve(20);
291 std::vector<const IParticle*> hardObjs_tmp;
292 for(const auto *const obj : *hardObjs) {
293 hardObjs_tmp.push_back(obj);
294 }
295 std::sort(hardObjs_tmp.begin(),hardObjs_tmp.end(),greaterPt);
296
297 for(const auto& obj : hardObjs_tmp) {
298 if(obj->pt()<4e3 && obj->type()!=xAOD::Type::Muon){
299 if (m_pflow && !m_fecollKey.key().empty() && m_useTracks && m_recoil) { dec_UEcorr(*obj) = 0.f; }
300 continue;
301 }
302 constlist.clear();
303 ATH_MSG_VERBOSE( "Object type, pt, eta, phi = " << obj->type() << ", " << obj->pt() << ", " << obj->eta() << "," << obj->phi() );
304 if(m_pflow){
305 if(!m_fecollKey.key().empty()){
306 if(!m_useTracks){
307 ATH_MSG_ERROR("Attempting to build FlowElement MET without a track collection.");
308 return StatusCode::FAILURE;
309 }
310 std::map<const IParticle*, MissingETBase::Types::constvec_t> momentumOverride;
311 if(m_recoil){ // HR part:
312 float UEcorr_Pt = 0.; // Underlying event correction for HR
313 ATH_CHECK(extractFEHR(obj,hardObjs_tmp,constlist,constits,momentumOverride, UEcorr_Pt));
314 ATH_MSG_DEBUG("Energy correction is: " << UEcorr_Pt);
315 dec_UEcorr(*obj) = UEcorr_Pt;
316 }
317 else{ // MET part:
318 ATH_CHECK( this->extractFE(obj, constlist, constits, momentumOverride, ctx) );
319 }
320 MissingETComposition::insert(metMap, obj, constlist, momentumOverride);
321 }
322 else{
323 // Old PFO EDM
324 if(!m_useTracks){
325 ATH_MSG_DEBUG("Attempting to build PFlow without a track collection.");
326 return StatusCode::FAILURE;
327 }else{
328 std::map<const IParticle*,MissingETBase::Types::constvec_t> momentumOverride;
329 ATH_CHECK( this->extractPFO(obj,constlist,constits,momentumOverride, ctx) );
330 MissingETComposition::insert(metMap,obj,constlist,momentumOverride);
331 }
332 }
333 } else {
334 std::vector<const IParticle*> tclist;
335 tclist.reserve(20);
336 ATH_CHECK( this->extractTopoClusters(obj,tclist,constits, ctx) );
338 for(const auto& cl : tclist) {
339 // use index-parallelism to identify shallow copied constituents
340 constlist.push_back((*constits.tcCont)[cl->index()]);
341 }
342 } else {
343 constlist = tclist;
344 }
345 if(m_useTracks) ATH_CHECK( this->extractTracks(obj,constlist,constits) );
346 MissingETComposition::insert(metMap,obj,constlist);
347 }
348 }
349 return StatusCode::SUCCESS;
350 }
351
352 // Accept Track
355 {
356
357 if (!vx) return false;//in events with no pv, we will just reject all tracks, and therefore build only the calo MET
358 return static_cast<bool> (m_trkseltool->accept( *trk, vx ));
359 }
360
361
363 {
364
365 if( (fabs(trk->eta())<1.5 && trk->pt()>m_cenTrackPtThr) ||
366 (fabs(trk->eta())>=1.5 && trk->pt()>m_forTrackPtThr) ) {
367
368 // Get relative error on qoverp
369 float Rerr = Amg::error(trk->definingParametersCovMatrix(),4)/fabs(trk->qOverP());
370 ATH_MSG_VERBOSE( "Track momentum error (%): " << Rerr*100 );
371
372 // first compute track and calo isolation variables
373 float ptcone20 = 0., isolfrac = 0., etcone10 = 0., EoverP = 0.;
374 // ptcone
375 TrackIsolation trkIsoResult;
376 std::vector<Iso::IsolationType> trkIsoCones;
377 trkIsoCones.push_back(xAOD::Iso::IsolationType::ptcone20);
378 xAOD::TrackCorrection trkIsoCorr;
380 m_trkIsolationTool->trackIsolation(trkIsoResult,
381 *trk,
382 trkIsoCones,
383 trkIsoCorr);
384 ptcone20 = !trkIsoResult.ptcones.empty() ? trkIsoResult.ptcones[0] : 0;
385 isolfrac = ptcone20/trk->pt();
386 // etcone
387 CaloIsolation caloIsoResult;
388 std::vector<Iso::IsolationType> caloIsoCones;
389 // We can't actually configure the tool to give etcone10, so instead we have to compute etcone20,
390 // applying the core cone correction.
391 // Then, we retrieve the correction value, which is etcone10, rather than the isolation value
392 caloIsoCones.push_back(xAOD::Iso::IsolationType::etcone20);
393 xAOD::CaloCorrection caloIsoCorr_coreCone;
394 caloIsoCorr_coreCone.calobitset.set(xAOD::Iso::IsolationCaloCorrection::coreCone); // this is etcone10
395 m_caloIsolationTool->caloTopoClusterIsolation(caloIsoResult,
396 *trk,
397 caloIsoCones,
398 caloIsoCorr_coreCone);
399 if(!caloIsoResult.etcones.empty()) {
400 // retrieve the correction value for the core cone
402 } else {
403 ATH_MSG_WARNING("isGoodEoverP: Failed to retrieve the isolation core correction (etcone10)! Setting etcone10=0");
404 etcone10 = 0.;
405 }
406 EoverP = etcone10/trk->pt();
408 ATH_MSG_VERBOSE( "Track isolation fraction: " << isolfrac );
409 ATH_MSG_VERBOSE( "Track E/P = " << EoverP );
410
411 if(isolfrac<0.1) {
412 // isolated track cuts
413 if(Rerr>0.4) return false;
414 else if (EoverP<0.65 && ((EoverP>0.1 && Rerr>0.05) || Rerr>0.1)) return false;
415 } else {
416 // non-isolated track cuts
417 float trkptsum = ptcone20+trk->pt();
418 if(etcone10/trkptsum<0.6 && trk->pt()/trkptsum>0.6) return false;
419 }
420 }
421 return true;
422 }
423
424 StatusCode METAssociator::GetUEcorr(const met::METAssociator::ConstitHolder& constits, // all PFOs
425 std::vector<TLorentzVector>& v_clus, // TLV vector of all clusters of hard objects
426 TLorentzVector& clus, // TLV of current cluster
427 TLorentzVector& HR, // uncorrected HR
428 const float Drcone, // Cone size for el-pfo association
429 const float MinDistCone, // Cone size for getting random Phi
430 float& UEcorr) const // UE correction (result)
431 {
432 // 1. Get random phi
433 unsigned int seed = floor( clus.Pt() * Gaudi::Units::GeV );
434 TRandom3 hole;
435 hole.SetSeed(seed);
436
437 bool isNextToPart(true);
438 bool isNextToHR(true);
439 double phiRnd(0.);
440
441 int numOfRndTrials = 0; // Counter for trials to find random cone without overlaps
442 const int maxNumOfRndTrials = 100; // Max. number of trials to find random cone without overlaps
443
444 while(isNextToPart || isNextToHR ){
445 isNextToPart = false;
446 isNextToHR = true;
447
448 phiRnd = hole.Uniform( -std::numbers::pi, std::numbers::pi);
449 double dR = P4Helpers::deltaR( HR.Eta(), HR.Phi(), clus.Eta(), phiRnd );
450 if(dR > MinDistCone){
451 isNextToHR = false;
452 }
453
454 for(const auto& clus_j : v_clus) { // loop over leptons
455 dR = P4Helpers::deltaR( clus.Eta(), phiRnd, clus_j.Eta(), clus_j.Phi() );
456 if(dR < MinDistCone){
457 isNextToPart = true;
458 break;
459 }
460 } // swclus_j
461
462 numOfRndTrials++;
463 if(numOfRndTrials == maxNumOfRndTrials){ // check number of trials
464 UEcorr = 0.;
465 return StatusCode::SUCCESS;
466 }
467 } // while isNextToPart, isNextToHR
468
469 ATH_MSG_DEBUG("Found rnd phi: " << phiRnd);
470
471
472 // 2. Calculete UE correction
473 TLorentzVector tv_UEcorr; // TLV of UE correction (initialized with 0,0,0,0 automatically)
474 std::pair <double, double> eta_rndphi = std::make_pair(clus.Eta(), phiRnd); // pair of current cluser eta and random phi
475
476
477 // Calculate delta phi -> always the same angle so its sufficient to calculate it only once
478 float dphi_angle=P4Helpers::deltaPhi(clus.Phi(),eta_rndphi.second);
479
480 for(const auto fe_itr : *constits.feCont){ // loop over PFOs
481 if(fe_itr->pt() < 0 || fe_itr->e() < 0){ //sanity check
482 continue;
483 }
484
485 //remove charged FE that are not matched to the PV
486 const static SG::ConstAccessor<char> PVMatchedAcc("matchedToPV");
487 if(fe_itr->isCharged() && !PVMatchedAcc(*fe_itr)){
488 continue;
489 }
490
491 double dR = P4Helpers::deltaR( fe_itr->eta(), fe_itr->phi(), eta_rndphi.first, eta_rndphi.second );
492 if( dR < Drcone ){
493 // Rotate on dphi_angle
494 TLorentzVector tv_fe = fe_itr->p4();
495 tv_fe.RotateZ(dphi_angle);
496 tv_UEcorr += tv_fe; // summing PFOs of UE for correction
497 } // cone requirement
498 } // loop over PFOs
499
500 UEcorr = tv_UEcorr.Pt(); // Pt of UE correction
501
502 return StatusCode::SUCCESS;
503 }
504}
#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)
Handle class for adding a decoration to an object.
DataVector adapter that acts like it holds const pointers.
std::enable_if_t< std::is_void_v< std::result_of_t< decltype(&T::renounce)(T)> > &&!std::is_base_of_v< SG::VarHandleKeyArray, T > &&std::is_base_of_v< Gaudi::DataHandle, T >, void > renounce(T &h)
Helper class to provide constant type-safe access to aux data.
virtual bool isValid() override final
Can the handle be successfully dereferenced?
const_pointer_type cptr()
Dereference the pointer.
Handle class for adding a decoration to an object.
AsgTool(const std::string &name)
Constructor specifying the tool instance's name.
Definition AsgTool.cxx:58
virtual StatusCode execute(xAOD::MissingETContainer *metCont, xAOD::MissingETAssociationMap *metMap, const EventContext &ctx) const override
SG::ReadHandleKey< xAOD::PFOContainer > m_pfcollKey
SG::ReadHandleKey< xAOD::TrackParticleContainer > m_trkcollKey
Gaudi::Property< double > m_forTrackPtThr
Gaudi::Property< bool > m_pflow
virtual StatusCode executeTool(xAOD::MissingETContainer *metCont, xAOD::MissingETAssociationMap *metMap, const EventContext &ctx) const =0
SG::ReadHandleKey< xAOD::VertexContainer > m_pvcollKey
StatusCode retrieveConstituents(met::METAssociator::ConstitHolder &constits, const EventContext &ctx) const
virtual StatusCode initialize() override
Dummy implementation of the initialisation function.
Gaudi::Property< std::string > m_forcoll
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 EventContext &ctx) const =0
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
Gaudi::Property< double > m_cenTrackPtThr
ToolHandle< xAOD::ICaloTopoClusterIsolationTool > m_caloIsolationTool
Gaudi::Property< bool > m_useModifiedClus
Gaudi::Property< bool > m_skipconst
Gaudi::Property< double > m_foreta
ToolHandle< InDet::IInDetTrackSelectionTool > m_trkseltool
Gaudi::Property< bool > m_useTracks
SG::WriteDecorHandleKey< xAOD::IParticleContainer > m_UEcorrPtDecorKey
SG::ReadHandleKey< xAOD::IParticleContainer > m_hybridContKey
static bool greaterPt(const xAOD::IParticle *part1, const xAOD::IParticle *part2)
virtual ~METAssociator()
virtual StatusCode extractTracks(const xAOD::IParticle *obj, std::vector< const xAOD::IParticle * > &constlist, const met::METAssociator::ConstitHolder &constits) const =0
virtual StatusCode extractTopoClusters(const xAOD::IParticle *obj, std::vector< const xAOD::IParticle * > &tclist, const met::METAssociator::ConstitHolder &constits, const EventContext &ctx) const =0
ToolHandle< xAOD::ITrackIsolationTool > m_trkIsolationTool
virtual StatusCode fillAssocMap(xAOD::MissingETAssociationMap *metMap, const xAOD::IParticleContainer *hardObjs, const EventContext &ctx) const
Gaudi::Property< bool > m_recoil
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 EventContext &ctx) const =0
bool isGoodEoverP(const xAOD::TrackParticle *trk) const
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::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