ATLAS Offline Software
Loading...
Searching...
No Matches
CP::IsolationCloseByCorrectionTool Class Reference

#include <IsolationCloseByCorrectionTool.h>

Inheritance diagram for CP::IsolationCloseByCorrectionTool:

Classes

struct  ObjectCache

Public Types

enum  TopoConeCorrectionModel { SubtractObjectsDirectly = -1 , UseAveragedDecorators = 0 }
using caloDecorNames = std::array<std::string, 4>
using IsoHelperMap = std::map<IsoType, std::unique_ptr<IsoVariableHelper>>
using PrimaryCollection = std::set<const xAOD::IParticle*>
 Helper struct to collect all relevant objects for the procedure.

Public Member Functions

 IsolationCloseByCorrectionTool (const std::string &name)
virtual StatusCode initialize () override
 Dummy implementation of the initialisation function.
virtual CorrectionCode getCloseByCorrection (std::vector< float > &corrections, const xAOD::IParticle &par, const std::vector< xAOD::Iso::IsolationType > &types, const xAOD::IParticleContainer &closePar) const override
virtual asg::AcceptData acceptCorrected (const xAOD::IParticle &x, const xAOD::IParticleContainer &closePar) const override
virtual CorrectionCode getCloseByIsoCorrection (const EventContext &ctx, const xAOD::ElectronContainer *Electrons, const xAOD::MuonContainer *Muons, const xAOD::PhotonContainer *Photons) const override
virtual float getOriginalIsolation (const xAOD::IParticle &P, IsoType type) const override
virtual float getOriginalIsolation (const xAOD::IParticle *particle, IsoType type) const override
TrackSet getTrackCandidates (const EventContext &ctx, const xAOD::IParticle *particle) const override
 Load all TrackParticles associated with the particles in the Container. The particles have to pass the selection decoration flag.
const xAOD::IParticle * isoRefParticle (const xAOD::IParticle *particle) const override
 Retrieve the reference particle to define the cone axis in which the track particles contributing to the isolation have to be.
void associateCluster (const xAOD::IParticle *particle, float &eta, float &phi, float &energy) const override
 Retrieve the associated clusters from the Particle and calculate the average eta/phi/energy.
void associateFlowElement (const EventContext &ctx, const xAOD::IParticle *particle, float &eta, float &phi, float &energy) const override
void getExtrapEtaPhi (const xAOD::IParticle *particlear, float &eta, float &phi) const
void loadPrimaryParticles (const xAOD::IParticleContainer *container, ObjectCache &cache) const
 Filter all electrons/muons/photons from the collection which pass the selection decoration.
void loadAssociatedObjects (const EventContext &ctx, ObjectCache &cache) const
 Load all associated tracks / clusters / flow elements into the cache.
bool isSame (const xAOD::IParticle *particle, const xAOD::IParticle *particle1) const
bool overlap (const xAOD::IParticle *particle, const xAOD::IParticle *particle1, float dR) const
float deltaR2 (const xAOD::IParticle *particle, const xAOD::IParticle *particle1, bool AvgCalo=false) const
const xAOD::Vertex * retrieveIDBestPrimaryVertex (const EventContext &ctx) const
virtual void print () const
 Print the state of the tool.
ServiceHandle< StoreGateSvc > & evtStore ()
 The standard StoreGateSvc (event store) Returns (kind of) a pointer to the StoreGateSvc.
const ServiceHandle< StoreGateSvc > & detStore () const
 The standard StoreGateSvc/DetectorStore Returns (kind of) a pointer to the StoreGateSvc.
virtual StatusCode sysInitialize () override
 Perform system initialization for an algorithm.
virtual StatusCode sysStart () override
 Handle START transition.
virtual std::vector< Gaudi::DataHandle * > inputHandles () const override
 Return this algorithm's input handles.
virtual std::vector< Gaudi::DataHandle * > outputHandles () const override
 Return this algorithm's output handles.
Gaudi::Details::PropertyBase & declareProperty (Gaudi::Property< T, V, H > &t)
void updateVHKA (Gaudi::Details::PropertyBase &)
MsgStream & msg () const
bool msgLvl (const MSG::Level lvl) const
Additional helper functions, not directly mimicking Athena
template<class T>
const T * getProperty (const std::string &name) const
 Get one of the tool's properties.
const std::string & msg_level_name () const __attribute__((deprecated))
 A deprecated function for getting the message level's name.
const std::string & getName (const void *ptr) const
 Get the name of an object that is / should be in the event store.
SG::sgkey_t getKey (const void *ptr) const
 Get the (hashed) key of an object that is in the event store.

Static Public Member Functions

static const caloDecorNames & caloDecors ()
 Returns an array with the calo cluster decoration names [0]-> eta, [1]->phi, [2]->energy. [3]->isDecorated.
static const caloDecorNames & pflowDecors ()
static bool isFixedTrackIso (xAOD::Iso::IsolationType type)
static bool isVarTrackIso (xAOD::Iso::IsolationType type)
static bool isFixedTrackIsoTTVA (xAOD::Iso::IsolationType type)
static bool isVarTrackIsoTTVA (xAOD::Iso::IsolationType Iso)
static bool isTrackIso (xAOD::Iso::IsolationType type)
static bool isTrackIsoTTVA (xAOD::Iso::IsolationType type)
static float trackPtCut (xAOD::Iso::IsolationType type)
static bool isTopoEtIso (xAOD::Iso::IsolationType type)
static bool isPFlowIso (xAOD::Iso::IsolationType type)
static bool isEgamma (const xAOD::IParticle *particle)
static float clusterEtMinusTile (const xAOD::CaloCluster *C)
static std::string particleName (const xAOD::IParticle *C)
static std::string particleName (xAOD::Type::ObjectType T)

Protected Member Functions

void renounceArray (SG::VarHandleKeyArray &handlesArray)
 remove all handles from I/O resolution
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)
void extraDeps_update_handler (Gaudi::Details::PropertyBase &ExtraDeps)
 Add StoreName to extra input/output deps as needed.

Private Types

typedef ServiceHandle< StoreGateSvc > StoreGateSvc_t

Private Member Functions

void isoTypesFromWP (const std::vector< std::unique_ptr< IsolationWP > > &WP, IsoVector &types)
 Helper function to load all Isolation types from the iso working points.
TrackSet getAssociatedTracks (const xAOD::IParticle *P) const
 Retrieve all Inner detector tracks associated with the primary particle.
TrackSet getAssociatedTracks (const xAOD::IParticle *P, const xAOD::Vertex *vtx) const
 Retrieve the subset of tracks passing the isolation selection.
void getAssocFlowElements (const EventContext &ctx, ObjectCache &cache) const
 Retrieve all Flow elements associated with the particles in the cache.
CorrectionCode performCloseByCorrection (const EventContext &ctx, ObjectCache &cache) const
void lockDecorations (const xAOD::IParticleContainer *parts, const IsoVector &isoTypes) const
const IsoVector & getIsolationTypes (const xAOD::IParticle *particle) const
CorrectionCode subtractCloseByContribution (const EventContext &ctx, const xAOD::IParticle *P, ObjectCache &cache) const
CorrectionCode getCloseByCorrectionTrackIso (const xAOD::IParticle *primary, const IsoType type, const ObjectCache &cache, float &isoValue) const
CorrectionCode getCloseByCorrectionTopoIso (const EventContext &ctx, const xAOD::IParticle *primary, const IsoType type, ObjectCache &cache, float &isoValue) const
CorrectionCode getCloseByCorrectionPflowIso (const EventContext &ctx, const xAOD::IParticle *primary, const IsoType type, const ObjectCache &cache, float &isoValue) const
CorrectionCode copyIsoValuesForPartsNotSelected (const xAOD::IParticle *part) const
ClusterSet getAssociatedClusters (const EventContext &ctx, const xAOD::IParticle *particle, ObjectCache &cache) const
 Loads the topo clusters associated with the primary IParticle.
PflowSet getAssocFlowElements (const EventContext &ctx, const xAOD::IParticle *particle) const
 Loads the pflow elements associated with the primary IParticle.
bool getExtrapEtaPhi (const EventContext &ctx, const xAOD::TrackParticle *tp, float &eta, float &phi) const
 helper to get eta,phi of muon extrap
float coneSize (const xAOD::IParticle *particle, IsoType Cone) const
float unCalibPt (const xAOD::IParticle *particle) const
bool passSelectionQuality (const xAOD::IParticle *particle) const
bool passFirstStage (const xAOD::TrackParticle *trk, const xAOD::Vertex *vtx) const
 The Track particle has to pass the Track selection tool and the TTVA selection.
void printIsolationCones (const IsoVector &types, xAOD::Type::ObjectType T) const
void declareDependency (const std::vector< std::string > &containers, const IsoVector &types)
 Helper function to declare the data dependencies.
Gaudi::Details::PropertyBase & declareGaudiProperty (Gaudi::Property< T, V, H > &hndl, const SG::VarHandleKeyType &)
 specialization for handling Gaudi::Property<SG::VarHandleKey>

Private Attributes

ToolHandle< InDet::IInDetTrackSelectionTool > m_trkselTool
ToolHandle< CP::ITrackVertexAssociationTool > m_ttvaTool
ToolHandle< CP::IIsolationSelectionTool > m_selectorTool
Gaudi::Property< std::string > m_quality_name
Gaudi::Property< std::string > m_passOR_name
Gaudi::Property< std::string > m_isoSelection_name {this, "IsolationSelectionDecorator", "", "Name of the final isolation decorator."}
Gaudi::Property< std::string > m_backup_prefix
Gaudi::Property< std::string > m_isoDecSuffix
Gaudi::Property< std::string > m_caloDecSuffix
Gaudi::Property< int > m_caloModel {this, "CaloCorrectionModel", TopoConeCorrectionModel::SubtractObjectsDirectly}
 EXPERT PROPERTIES.
Gaudi::Property< float > m_coreConeEl
Gaudi::Property< float > m_coreConeMu {this, "CoreConeMuons", 0.05, "This is the size of the core cone for the topoetcone variables."}
Gaudi::Property< float > m_ptvarconeRadius {this, "PtvarconeRadius", 1.e4, "This is the kT parameter for the ptvarcone variables."}
Gaudi::Property< float > m_maxTopoPolution
Gaudi::Property< float > m_ConeSizeVariation
Gaudi::Property< bool > m_declareCaloDecors {this, "declareCaloDecors", false, "If set to true, the data dependency on the calo/pflow decors will be declared"}
Gaudi::Property< std::vector< std::string > > m_elecKeys
 Declare the data dependencies of the Input containers.
Gaudi::Property< std::vector< std::string > > m_muonKeys
Gaudi::Property< std::vector< std::string > > m_photKeys
SG::ReadDecorHandleKeyArray< xAOD::IParticleContainer > m_isoVarKeys
SG::WriteDecorHandleKeyArray< xAOD::IParticleContainer > m_isoWriteDecVarKeys
ToolHandle< Trk::IParticleCaloExtensionTool > m_caloExtTool {this, "ParticleCaloExtensionTool", "Trk::ParticleCaloExtensionTool/ParticleCaloExtensionTool"}
 calo extension tool for muon track particle extrapolation to calo
SG::ReadHandleKey< xAOD::VertexContainer > m_VtxKey
SG::ReadHandleKey< xAOD::CaloClusterContainer > m_CaloClusterKey
SG::ReadHandleKey< xAOD::FlowElementContainer > m_PflowKey
IsoVector m_muon_isoTypes {}
 Isolation variables used by the muon working point.
IsoVector m_electron_isoTypes {}
 Isolation variables used by the electron working point.
IsoVector m_photon_isoTypes {}
 Isolation variables used by the photon working point.
bool m_has_nonTTVA {false}
 Switch whether a pile-up non robust TTVA working point is defined.
bool m_hasPflowIso {false}
 Switch whether a pflow isolation working point is defined.
bool m_hasEtConeIso {false}
 Switch whether a topoetcone isolation working point is defined.
bool m_isInitialised {false}
SelectionAccessor m_acc_quality {nullptr}
SelectionAccessor m_acc_passOR {nullptr}
SelectionDecorator m_dec_isoselection {nullptr}
IsoHelperMap m_isohelpers ATLAS_THREAD_SAFE
std::mutex m_isoHelpersMutex ATLAS_THREAD_SAFE
 Mutex to protect the map if the method with signature getCloseByCorrection(std::vector<float>& corrections, const xAOD::IParticle& par, const std::vector<xAOD::Iso::IsolationType>& types, const xAOD::IParticleContainer& closePar) is called.
StoreGateSvc_t m_evtStore
 Pointer to StoreGate (event store by default).
StoreGateSvc_t m_detStore
 Pointer to StoreGate (detector store by default).
std::vector< SG::VarHandleKeyArray * > m_vhka
bool m_varHandleArraysDeclared

Detailed Description

Definition at line 37 of file IsolationCloseByCorrectionTool.h.

Member Typedef Documentation

◆ caloDecorNames

using CP::IsolationCloseByCorrectionTool::caloDecorNames = std::array<std::string, 4>

Definition at line 45 of file IsolationCloseByCorrectionTool.h.

◆ IsoHelperMap

◆ PrimaryCollection

Helper struct to collect all relevant objects for the procedure.

Definition at line 84 of file IsolationCloseByCorrectionTool.h.

◆ StoreGateSvc_t

typedef ServiceHandle<StoreGateSvc> AthCommonDataStore< AthCommonMsg< AlgTool > >::StoreGateSvc_t
privateinherited

Definition at line 376 of file AthCommonDataStore.h.

Member Enumeration Documentation

◆ TopoConeCorrectionModel

Constructor & Destructor Documentation

◆ IsolationCloseByCorrectionTool()

CP::IsolationCloseByCorrectionTool::IsolationCloseByCorrectionTool ( const std::string & name)

Definition at line 42 of file IsolationCloseByCorrectionTool.cxx.

42: asg::AsgTool(toolName) {}

Member Function Documentation

◆ acceptCorrected()

asg::AcceptData CP::IsolationCloseByCorrectionTool::acceptCorrected ( const xAOD::IParticle & x,
const xAOD::IParticleContainer & closePar ) const
overridevirtual

Implements CP::IIsolationCloseByCorrectionTool.

Definition at line 932 of file IsolationCloseByCorrectionTool.cxx.

933 {
934 if (!m_isInitialised) { ATH_MSG_WARNING("The IsolationCloseByCorrectionTool was not initialised!!!"); }
935 assert(!m_selectorTool.empty());
936 const IsoVector& iso_types = getIsolationTypes(&x);
937 if (iso_types.empty()) {
938 // TODO: figure out if this is actually a valid situation
939 // or if we should just fail at this point.
940 ATH_MSG_WARNING("Could not cast particle for acceptCorrected. Will return false.");
941 static const asg::AcceptInfo dummyAcceptInfo = []() {
942 asg::AcceptInfo info;
943 info.addCut("castCut", "whether we managed to cast to a known type");
944 return info;
945 }();
946 if (m_dec_isoselection) (*m_dec_isoselection)(x) = false;
947 return asg::AcceptData(&dummyAcceptInfo);
948 }
949
950 if (closePar.empty()) return m_selectorTool->accept(x);
951 strObj strPar;
952 strPar.isolationValues.resize(numIsolationTypes);
953 strPar.pt = x.pt();
954 strPar.eta = x.eta();
955 strPar.type = x.type();
956 std::vector<float> corrections;
957 if (getCloseByCorrection(corrections, x, iso_types, closePar) == CorrectionCode::Error) {
958 ATH_MSG_WARNING("Could not calculate the corrections. acceptCorrected(x) is done without the corrections.");
959 if (m_dec_isoselection) (*m_dec_isoselection)(x) = bool(m_selectorTool->accept(x));
960 return m_selectorTool->accept(x);
961 }
962 for (unsigned int i = 0; i < iso_types.size(); ++i) {
963 strPar.isolationValues.at(iso_types[i]) = corrections.at(i);
964 const SG::Accessor<float>* acc = xAOD::getIsolationAccessor(iso_types[i]);
965 if (acc)[[likely]]{
966 float old = (*acc)(x);
967 ATH_MSG_DEBUG("Correcting " << toString(iso_types[i]) << " from " << old << " to " << corrections[i]);
968 }
969 }
970 auto accept = m_selectorTool->accept(strPar);
971 if (m_dec_isoselection) (*m_dec_isoselection)(x) = bool(accept);
972 return accept;
973 }
#define ATH_MSG_DEBUG(x,...)
#define ATH_MSG_WARNING(x,...)
#define x
@ Error
Some error happened during the object correction.
ToolHandle< CP::IIsolationSelectionTool > m_selectorTool
const IsoVector & getIsolationTypes(const xAOD::IParticle *particle) const
virtual CorrectionCode getCloseByCorrection(std::vector< float > &corrections, const xAOD::IParticle &par, const std::vector< xAOD::Iso::IsolationType > &types, const xAOD::IParticleContainer &closePar) const override
bool empty() const noexcept
Returns true if the collection is empty.
StatusCode accept(const xAOD::Muon *mu)
const SG::Accessor< float > * getIsolationAccessor(Iso::IsolationType type)
Get the Accessor object for a given isolation type.
std::string toString(const UncalibMeasType type)
Convert the measurement enum to a string.
static const SG::Accessor< ElementLink< IParticleContainer > > acc("originalObjectLink")
Object used for setting/getting the dynamic decoration in question.
#define likely(x)

◆ associateCluster()

void CP::IsolationCloseByCorrectionTool::associateCluster ( const xAOD::IParticle * particle,
float & eta,
float & phi,
float & energy ) const
overridevirtual

Retrieve the associated clusters from the Particle and calculate the average eta/phi/energy.

Remove super low energy clusters

Implements CP::IIsolationCloseByCorrectionTool.

Definition at line 864 of file IsolationCloseByCorrectionTool.cxx.

864 {
865 phi = particle->phi();
866 eta = particle->eta();
867 energy = -1.;
868 if (particle->type() == xAOD::Type::ObjectType::Muon) {
869 const xAOD::Muon* mu = static_cast<const xAOD::Muon*>(particle);
870 const xAOD::CaloCluster* cluster = mu->cluster();
871 if (!cluster) return;
872 energy = cluster->e();
873 // At the moment no cluster associated with muons is in the derivations
874 int nSample{0};
875 float etaT{0.f}, phiT{0.f}, dphiT{0.f};
876
877 for (unsigned int i = 0; i < CaloSampling::Unknown; ++i) {
879 if (cluster->hasSampling(s)) {
880 ATH_MSG_VERBOSE("Sampling: " << i << "eta-phi (" << cluster->etaSample(s) << ", " << cluster->phiSample(s) << ")");
881 etaT += cluster->etaSample(s);
882 if (!nSample)
883 phiT = cluster->phiSample(s);
884 else
885 dphiT += xAOD::P4Helpers::deltaPhi(cluster->phiSample(s), phiT);
886 ++nSample;
887 }
888 }
889 if (!nSample) return;
890 ATH_MSG_DEBUG("Eta, phi before sampling: " << eta << ", " << phi << " and after sampling: " << etaT / nSample << ", "
891 << phiT / nSample);
892 phi = xAOD::P4Helpers::deltaPhi(phiT + dphiT / nSample, 0);
893 eta = etaT / nSample;
894 ATH_MSG_VERBOSE("associateCluster: mu with pt: " << mu->pt() * MeVtoGeV << " GeV, eta: "
895 << mu->eta() << ", phi: " << mu->phi() << " energy, eta, phi " << energy << ", " << eta << ", " << phi
896 << ", et " << energy * mu->pt() / mu->e());
897 }
898 if (!isEgamma(particle)) return;
899 const xAOD::Egamma* egamm = static_cast<const xAOD::Egamma*>(particle);
900 eta = phi = energy = 0.;
901 for (unsigned int cl = 0; cl < egamm->nCaloClusters(); ++cl) {
902 const xAOD::CaloCluster* prim_cluster = egamm->caloCluster(cl);
903 if (!prim_cluster) {
904 ATH_MSG_DEBUG("Cluster " << cl << " is not defined " << egamm);
905 continue;
906 }
907 std::vector<const xAOD::CaloCluster*> constituents = xAOD::EgammaHelpers::getAssociatedTopoClusters(prim_cluster);
908 for (const xAOD::CaloCluster* cluster : constituents) {
909 if (!cluster) continue;
910 const float clus_e = clusterEtMinusTile(cluster);
912 if (clus_e < MinClusterEnergy) continue;
913 eta += cluster->eta() * clus_e;
914 phi += cluster->phi() * clus_e;
915 energy += clus_e;
916 ATH_MSG_VERBOSE("associateCluster: eg add in clus with e: " << clus_e * MeVtoGeV << " clus et " << cluster->pt() * MeVtoGeV << " GeV, eta: "
917 << cluster->eta() << ", phi: " << cluster->phi());
918 }
919 }
920 if (energy >= MinClusterEnergy) {
921 phi = xAOD::P4Helpers::deltaPhi(phi / energy, 0.);
922 eta /= energy;
923 ATH_MSG_VERBOSE("associateCluster: eg with pt: " << egamm->pt() * MeVtoGeV << " GeV, eta: "
924 << egamm->eta() << ", phi: " << egamm->phi() << " energy, eta, phi " << energy << ", " << eta << ", " << phi );
925 } else {
926 ATH_MSG_DEBUG("Average energy from the clusters is too low " << energy << " copy particle properties");
927 eta = egamm->eta();
928 phi = egamm->phi();
929 energy = egamm->e();
930 }
931 }
Scalar eta() const
pseudorapidity method
#define ATH_MSG_VERBOSE(x,...)
static bool isEgamma(const xAOD::IParticle *particle)
static float clusterEtMinusTile(const xAOD::CaloCluster *C)
virtual double pt() const
The transverse momentum ( ) of the particle (negative for negative-energy clusters).
float phiSample(const CaloSample sampling) const
Retrieve barycenter in a given sample.
virtual double eta() const
The pseudorapidity ( ) of the particle.
virtual double e() const
The total energy of the particle.
virtual double phi() const
The azimuthal angle ( ) of the particle.
float etaSample(const CaloSample sampling) const
Retrieve barycenter in a given sample.
bool hasSampling(const CaloSample s) const
Checks if certain smapling contributes to cluster.
virtual double pt() const override final
The transverse momentum ( ) of the particle.
Definition Egamma_v1.cxx:66
virtual double e() const override
The total energy of the particle.
Definition Egamma_v1.cxx:86
size_t nCaloClusters() const
Return the number of xAOD::CaloClusters that define the electron candidate.
virtual double eta() const override final
The pseudorapidity ( ) of the particle.
Definition Egamma_v1.cxx:71
virtual double phi() const override final
The azimuthal angle ( ) of the particle.
Definition Egamma_v1.cxx:76
const xAOD::CaloCluster * caloCluster(size_t index=0) const
Pointer to the xAOD::CaloCluster/s that define the electron candidate.
constexpr float MeVtoGeV
constexpr float MinClusterEnergy
constexpr ParticleHypothesis particle[PARTICLEHYPOTHESES]
the array of masses
cl
print [x.__class__ for x in toList(dqregion.getSubRegions()) ]
@ Muon
The object is a muon.
Definition ObjectType.h:48
std::vector< const xAOD::CaloCluster * > getAssociatedTopoClusters(const xAOD::CaloCluster *cluster)
Return a vector of all the topo clusters associated with the egamma cluster.
double deltaPhi(double phiA, double phiB)
delta Phi in range [-pi,pi[
CaloCluster_v1 CaloCluster
Define the latest version of the calorimeter cluster class.
Egamma_v1 Egamma
Definition of the current "egamma version".
Definition Egamma.h:17
Muon_v1 Muon
Reference the current persistent version:

◆ associateFlowElement()

void CP::IsolationCloseByCorrectionTool::associateFlowElement ( const EventContext & ctx,
const xAOD::IParticle * particle,
float & eta,
float & phi,
float & energy ) const
overridevirtual

Implements CP::IIsolationCloseByCorrectionTool.

Definition at line 840 of file IsolationCloseByCorrectionTool.cxx.

841 {
842 phi = eta = energy = 0.;
843 PflowSet flowCollection = getAssocFlowElements(ctx, particle);
844 if (flowCollection.empty()) {
845 phi = particle->phi();
846 eta = particle->eta();
847 return;
848 }
849 for (const FlowElementPtr& ele : flowCollection) {
850 const float flow_energy = ele->e() * ele.weight;
851 if (flow_energy < MinClusterEnergy) continue;
852 phi += ele->phi() * flow_energy;
853 eta += ele->eta() * flow_energy;
854 energy += flow_energy;
855 }
856 if (energy < MinClusterEnergy) {
857 phi = particle->phi();
858 eta = particle->eta();
859 return;
860 }
861 phi = xAOD::P4Helpers::deltaPhi(phi / energy, 0.);
862 eta /= energy;
863 }
void getAssocFlowElements(const EventContext &ctx, ObjectCache &cache) const
Retrieve all Flow elements associated with the particles in the cache.

◆ caloDecors()

const caloDecorNames & CP::IsolationCloseByCorrectionTool::caloDecors ( )
static

Returns an array with the calo cluster decoration names [0]-> eta, [1]->phi, [2]->energy. [3]->isDecorated.

Definition at line 27 of file IsolationCloseByCorrectionTool.cxx.

27 {
28 static const caloDecorNames names =
29 {"IsoCloseByCorr_assocClustEta", "IsoCloseByCorr_assocClustPhi", "IsoCloseByCorr_assocClustEnergy",
30 "IsoCloseByCorr_assocClustDecor"};
31 return names;
32 }
static const SG::Accessor< std::vector< std::string > > names("thrNames")
Accessor for the names of the passed thresholds.

◆ clusterEtMinusTile()

float CP::IsolationCloseByCorrectionTool::clusterEtMinusTile ( const xAOD::CaloCluster * C)
static

Definition at line 1064 of file IsolationCloseByCorrectionTool.cxx.

1064 {
1065 float Et{0.f};
1066 if (cluster) {
1067 try {
1068 Et = cluster->p4(xAOD::CaloCluster::State::UNCALIBRATED).Et();
1069 Et = Et - cluster->eSample(xAOD::CaloCluster::CaloSample::TileGap3) /
1070 std::cosh(cluster->p4(xAOD::CaloCluster::State::UNCALIBRATED).Eta());
1071 } catch (...) { Et = cluster->p4().Et(); }
1072 }
1073 return std::max(Et, 0.f);
1074 }

◆ coneSize()

float CP::IsolationCloseByCorrectionTool::coneSize ( const xAOD::IParticle * particle,
IsoType Cone ) const
private

Definition at line 990 of file IsolationCloseByCorrectionTool.cxx.

990 {
992 float ConeDR = coneSize(Cone);
994 const xAOD::IParticle* Reference = isoRefParticle(P);
995 float MiniIso = m_ptvarconeRadius / unCalibPt(Reference);
996 if (MiniIso < ConeDR) return MiniIso;
997 }
998 return ConeDR;
999 }
static Double_t P(Double_t *tt, Double_t *par)
const xAOD::IParticle * isoRefParticle(const xAOD::IParticle *particle) const override
Retrieve the reference particle to define the cone axis in which the track particles contributing to ...
float unCalibPt(const xAOD::IParticle *particle) const
static bool isVarTrackIso(xAOD::Iso::IsolationType type)
static bool isVarTrackIsoTTVA(xAOD::Iso::IsolationType Iso)
float coneSize(const xAOD::IParticle *particle, IsoType Cone) const
float coneSize(IsolationConeSize type)
convert Isolation Size into cone size

◆ copyIsoValuesForPartsNotSelected()

CorrectionCode CP::IsolationCloseByCorrectionTool::copyIsoValuesForPartsNotSelected ( const xAOD::IParticle * part) const
private

Definition at line 416 of file IsolationCloseByCorrectionTool.cxx.

416 {
417 const IsoVector& types = getIsolationTypes(part);
418
419 ATH_MSG_DEBUG("copyIsoValuesForPartsNotSelected " << part->type() << " " << part->pt() * MeVtoGeV << " GeV" << " eta: " << part->eta() << " phi: " << part->phi());
420
421 if (types.empty()) {
422 ATH_MSG_WARNING("No isolation types are defiend for " << particleName(part));
424 }
425 for (const IsolationType iso_type : types) {
426 float iso_variable{0.f};
427 std::lock_guard<std::mutex> guard{m_isoHelpersMutex};
428 if (m_isohelpers.at(iso_type)->getIsolation(part, iso_variable) == CorrectionCode::Error) {
429 ATH_MSG_ERROR("Cannot get value for " << toString(iso_type));
430 return CorrectionCode::Error;
431 }
432 ATH_MSG_DEBUG("copyIsoValuesForPartsNotSelected: Set pt, eta " << part->pt() << ", " << part->eta() << ", " << part->phi() << " for " << toString(iso_type) << " to " << iso_variable);
433 if (!std::isfinite(iso_variable)) {
434 ATH_MSG_WARNING("Copying non-finite " << toString(iso_type) << " = " << iso_variable << " of particle with pt: " << part->pt() * MeVtoGeV << " GeV eta: " << part->eta() << " phi: " << part->phi());
435 }
436 if (m_isohelpers.at(iso_type)->setIsolation(part, iso_variable, true) == CorrectionCode::Error) {
437 ATH_MSG_ERROR("Cannot set " << toString(iso_type) << " to " << iso_variable);
438 return CorrectionCode::Error;
439 }
440 }
441 return CorrectionCode::Ok;
442 }
#define ATH_MSG_ERROR(x,...)
static const std::vector< std::string > types
@ OutOfValidityRange
Input object is out of validity range.
@ Ok
The correction was done successfully.
static std::string particleName(const xAOD::IParticle *C)
IsolationType
Overall enumeration for isolation types in xAOD files.

◆ declareDependency()

void CP::IsolationCloseByCorrectionTool::declareDependency ( const std::vector< std::string > & containers,
const IsoVector & types )
private

Helper function to declare the data dependencies.

Definition at line 125 of file IsolationCloseByCorrectionTool.cxx.

125 {
126 for (const std::string& cont : containers) {
127 for (const IsoType iso : types) {
128 // define read accessor iso variable keys
129 m_isoVarKeys.emplace_back(cont + "." + std::string(toString(iso)));
130 // define write decorator iso variable keys - needed for MT, but we do not use handles for writing the decorators in isoHelpers
131 m_isoWriteDecVarKeys.emplace_back(cont + "." + std::string(toString(iso) + (m_isoDecSuffix.empty() ? "" : "_") + m_isoDecSuffix));
132 }
135 for (const std::string& decor : pflowDecors()) m_isoVarKeys.emplace_back(cont + "." + decor);
136 }
138 for (const std::string& decor : caloDecors()) m_isoVarKeys.emplace_back(cont + "." + decor + m_caloDecSuffix);
139 }
140 }
141 }
bool m_hasPflowIso
Switch whether a pflow isolation working point is defined.
bool m_hasEtConeIso
Switch whether a topoetcone isolation working point is defined.
static const caloDecorNames & caloDecors()
Returns an array with the calo cluster decoration names [0]-> eta, [1]->phi, [2]->energy....
SG::ReadDecorHandleKeyArray< xAOD::IParticleContainer > m_isoVarKeys
SG::WriteDecorHandleKeyArray< xAOD::IParticleContainer > m_isoWriteDecVarKeys
Gaudi::Property< int > m_caloModel
EXPERT PROPERTIES.

◆ declareGaudiProperty()

Gaudi::Details::PropertyBase & AthCommonDataStore< AthCommonMsg< AlgTool > >::declareGaudiProperty ( Gaudi::Property< T, V, H > & hndl,
const SG::VarHandleKeyType &  )
inlineprivateinherited

specialization for handling Gaudi::Property<SG::VarHandleKey>

Definition at line 156 of file AthCommonDataStore.h.

158 {
160 hndl.value(),
161 hndl.documentation());
162
163 }
Gaudi::Details::PropertyBase & declareProperty(Gaudi::Property< T, V, H > &t)

◆ declareProperty()

Gaudi::Details::PropertyBase & AthCommonDataStore< AthCommonMsg< AlgTool > >::declareProperty ( Gaudi::Property< T, V, H > & t)
inlineinherited

Definition at line 145 of file AthCommonDataStore.h.

145 {
146 typedef typename SG::HandleClassifier<T>::type htype;
148 }
Gaudi::Details::PropertyBase & declareGaudiProperty(Gaudi::Property< T, V, H > &hndl, const SG::VarHandleKeyType &)
specialization for handling Gaudi::Property<SG::VarHandleKey>

◆ deltaR2()

float CP::IsolationCloseByCorrectionTool::deltaR2 ( const xAOD::IParticle * particle,
const xAOD::IParticle * particle1,
bool AvgCalo = false ) const

Definition at line 1034 of file IsolationCloseByCorrectionTool.cxx.

1034 {
1035 if (isSame(P, P1)) return 0.;
1036 // Check if one of the objects is a CaloCluster or the Averaging over the clusters is requested.
1037 if (AvgCalo || (P->type() != P1->type() &&
1039 float phi1{0.f}, eta1{0.f}, eta2{0.f}, phi2{0.f};
1040 getExtrapEtaPhi(P, eta1, phi1);
1041 getExtrapEtaPhi(P1, eta2, phi2);
1042 return xAOD::P4Helpers::deltaR2(eta1, phi1, eta2, phi2);
1043 }
1044 float dPhi = xAOD::P4Helpers::deltaPhi(P, P1);
1045 float dEta = P->eta() - P1->eta();
1046 return dEta * dEta + dPhi * dPhi;
1047 }
bool getExtrapEtaPhi(const EventContext &ctx, const xAOD::TrackParticle *tp, float &eta, float &phi) const
helper to get eta,phi of muon extrap
bool isSame(const xAOD::IParticle *particle, const xAOD::IParticle *particle1) const
bool dPhi(const xAOD::TauJet &tau, const xAOD::CaloVertexedTopoCluster &cluster, float &out)
bool dEta(const xAOD::TauJet &tau, const xAOD::CaloVertexedTopoCluster &cluster, float &out)
@ CaloCluster
The object is a calorimeter cluster.
Definition ObjectType.h:39
double deltaR2(double rapidity1, double phi1, double rapidity2, double phi2)
from bare rapidity,phi
setEt setPhi setE277 setWeta2 eta1

◆ detStore()

const ServiceHandle< StoreGateSvc > & AthCommonDataStore< AthCommonMsg< AlgTool > >::detStore ( ) const
inlineinherited

The standard StoreGateSvc/DetectorStore Returns (kind of) a pointer to the StoreGateSvc.

Definition at line 95 of file AthCommonDataStore.h.

◆ evtStore()

ServiceHandle< StoreGateSvc > & AthCommonDataStore< AthCommonMsg< AlgTool > >::evtStore ( )
inlineinherited

The standard StoreGateSvc (event store) Returns (kind of) a pointer to the StoreGateSvc.

Definition at line 85 of file AthCommonDataStore.h.

◆ extraDeps_update_handler()

void AthCommonDataStore< AthCommonMsg< AlgTool > >::extraDeps_update_handler ( Gaudi::Details::PropertyBase & ExtraDeps)
protectedinherited

Add StoreName to extra input/output deps as needed.

use the logic of the VarHandleKey to parse the DataObjID keys supplied via the ExtraInputs and ExtraOuputs Properties to add the StoreName if it's not explicitly given

◆ getAssocFlowElements() [1/2]

PflowSet CP::IsolationCloseByCorrectionTool::getAssocFlowElements ( const EventContext & ctx,
const xAOD::IParticle * particle ) const
private

Loads the pflow elements associated with the primary IParticle.

Definition at line 186 of file IsolationCloseByCorrectionTool.cxx.

186 {
188 cache.prim_parts = {particle};
189 loadAssociatedObjects(ctx, cache);
190 return cache.flows;
191 }
void loadAssociatedObjects(const EventContext &ctx, ObjectCache &cache) const
Load all associated tracks / clusters / flow elements into the cache.
const IIntersectionCache * cache() const
Retrieve the associated cache block, if it exists.

◆ getAssocFlowElements() [2/2]

void CP::IsolationCloseByCorrectionTool::getAssocFlowElements ( const EventContext & ctx,
ObjectCache & cache ) const
private

Retrieve all Flow elements associated with the particles in the cache.

Definition at line 193 of file IsolationCloseByCorrectionTool.cxx.

193 {
194 if (m_PflowKey.empty()) return;
195 SG::ReadHandle<xAOD::FlowElementContainer> readHandle{m_PflowKey, ctx};
196 if (!readHandle.isValid()) return;
197 std::set<const xAOD::IParticle*> tombola{};
198 for (const xAOD::IParticle* p : cache.prim_parts) tombola.insert(p);
199 for (const TrackPtr& p : cache.tracks) tombola.insert(p);
200 for (const CaloClusterPtr& p : cache.clusters) tombola.insert(p);
201
202 for (const xAOD::FlowElement* flow : *readHandle) {
203 if (!flow) continue;
204 for (size_t ch = 0; ch < flow->nChargedObjects(); ++ch) {
205 const xAOD::IParticle* obj = flow->chargedObject(ch);
206 if (tombola.count(obj)) {
207 const std::vector<float>& weights = flow->chargedObjectWeights();
208 cache.flows.emplace(flow, ch < weights.size() ? weights[ch] : 1.f);
209 }
210 }
211 for (size_t ne = 0; ne < flow->nOtherObjects(); ++ne) {
212 const xAOD::IParticle* obj = flow->otherObject(ne);
213 if (tombola.count(obj)) {
214 const std::vector<float>& weights = flow->otherObjectWeights();
215 cache.flows.emplace(flow, ne < weights.size() ? weights[ne] : 1.f);
216 ATH_MSG_VERBOSE("getAssocFlowElements: neflow " << ne << ", " << obj->type() << ", " << obj->pt() << ", " << obj->eta() << ", " << obj->phi() << ", " << flow->pt() << ", " << flow->eta() << ", " << flow->phi());
217 }
218 }
219 }
220 }
SG::ReadHandleKey< xAOD::FlowElementContainer > m_PflowKey
virtual bool isValid() override final
Can the handle be successfully dereferenced?
int flow(const T &p, int i)
Definition Flow.h:15
FlowElement_v1 FlowElement
Definition of the current "pfo version".
Definition FlowElement.h:16

◆ getAssociatedClusters()

ClusterSet CP::IsolationCloseByCorrectionTool::getAssociatedClusters ( const EventContext & ctx,
const xAOD::IParticle * particle,
ObjectCache & cache ) const
private

Loads the topo clusters associated with the primary IParticle.

Definition at line 543 of file IsolationCloseByCorrectionTool.cxx.

544 {
545 // Remember topoclusters which are associated to an egamma object, electron or photon
546 // This will be used to avoid associating the same object to a muon
548 if (isEgamma(P)) {
549 const xAOD::Egamma* egamm = static_cast<const xAOD::Egamma*>(P);
550 for (size_t calo = 0; calo < egamm->nCaloClusters(); ++calo) {
551 const xAOD::CaloCluster* clust = egamm->caloCluster(calo);
552 if (!clust) continue;
553 std::vector<const xAOD::CaloCluster*> constituents = xAOD::EgammaHelpers::getAssociatedTopoClusters(clust);
554 for (const xAOD::CaloCluster* cluster : constituents) {
555 if (cluster && std::abs(cluster->eta()) < 7. && cluster->e() > MinClusterEnergy) {
556 clusters.emplace(cluster);
557 cache.eg_associated_clusters.insert(cluster); // set flag that this cluster is associated to an electron or photon
558 ATH_MSG_VERBOSE("getAssociatedClusters: " << P->type() << " has topo cluster with pt: " << cluster->pt() * MeVtoGeV << " GeV, eta: "
559 << cluster->eta() << ", phi: " << cluster->phi());
560 }
561 }
562 }
563 if (clusters.size()) return clusters;
564 }
565 if (m_CaloClusterKey.empty()) return clusters;
566 SG::ReadHandle<xAOD::CaloClusterContainer> topoClusters{m_CaloClusterKey, ctx};
567 if (!topoClusters.isValid()) return clusters;
568
569 if (P->type() == xAOD::Type::ObjectType::Muon) {
570 const xAOD::Muon* mu = static_cast<const xAOD::Muon*>(P);
571 const xAOD::CaloCluster* cl = mu->cluster();
572 bool foundMuonTopo = false;
573 if (cl) {
574 ATH_MSG_VERBOSE("getAssociatedClusters: muon has cluster with pt: " << cl->pt() * MeVtoGeV << " GeV, eta: "
575 << cl->eta() << ", phi: " << cl->phi());
576 std::vector<const xAOD::CaloCluster*> constituents = xAOD::EgammaHelpers::getAssociatedTopoClusters(cl);
577 for (const xAOD::CaloCluster* cluster : constituents) {
578 if (cluster && std::abs(cluster->eta()) < 7. && cluster->e() > MinClusterEnergy) {
579 // skip association if this cluster is already associated with an electron or photon - priority is given to egamma reco
580 if (!cache.eg_associated_clusters.contains(cluster)) {
581 clusters.emplace(cluster);
582 foundMuonTopo = true;
583 ATH_MSG_VERBOSE("getAssociatedClusters: muon has topo cluster with pt: " << cluster->pt() * MeVtoGeV << " GeV, eta: "
584 << cluster->eta() << ", phi: " << cluster->phi());
585 }
586 else {
587 ATH_MSG_VERBOSE("getAssociatedClusters: muon topo cluster already associated with an EG objet - cluster with pt: "
588 << cluster->pt() * MeVtoGeV << " GeV, eta: " << cluster->eta() << ", phi: " << cluster->phi());
589 }
590 }
591 }
592 }
593 if (!foundMuonTopo) {
594#ifndef XAOD_ANALYSIS
595 // extraploate muon to calo and look for matching topo cluster
596 const xAOD::TrackParticle* tp = mu->trackParticle(xAOD::Muon::InnerDetectorTrackParticle);
597 if (tp) {
598 ATH_MSG_VERBOSE("getAssociatedClusters: found mu tp " << " with pt: " << tp->pt() * MeVtoGeV << " GeV, eta: " << tp->eta() << ", phi: " << tp->phi());
599 float tpEtaAtCalo;
600 float tpPhiAtCalo;
601 if (getExtrapEtaPhi(ctx, tp, tpEtaAtCalo, tpPhiAtCalo)) {
602 ATH_MSG_VERBOSE("getAssociatedClusters: tp extrapolated - tpEtaAtCalo " << tpEtaAtCalo << ", tpPhiAtCalo " << tpPhiAtCalo);
603 for (const xAOD::CaloCluster* cluster : *topoClusters) {
604 if (cluster && std::abs(cluster->eta()) < 7. && cluster->e() > MinClusterEnergy &&
605 xAOD::P4Helpers::deltaR(tpEtaAtCalo, tpPhiAtCalo, cluster->eta(), cluster->phi()) < m_coreConeMu) {
606 clusters.emplace(cluster);
607 ATH_MSG_VERBOSE("getAssociatedClusters: for mu trkPart save clus " << " with pt: " << cluster->pt() * MeVtoGeV << " GeV, eta: " << cluster->eta() << ", phi: " << cluster->phi() << ", tpEtaAtCalo " << tpEtaAtCalo << ", tpPhiAtCalo " << tpPhiAtCalo);
608 }
609 }
610 }
611 }
612#endif
613 }
614 }
615
616 return clusters;
617 }
SG::ReadHandleKey< xAOD::CaloClusterContainer > m_CaloClusterKey
virtual double phi() const override final
The azimuthal angle ( ) of the particle (has range to .).
virtual double pt() const override final
The transverse momentum ( ) of the particle.
virtual double eta() const override final
The pseudorapidity ( ) of the particle.
double deltaR(double rapidity1, double phi1, double rapidity2, double phi2)
from bare bare rapidity,phi
TrackParticle_v1 TrackParticle
Reference the current persistent version:

◆ getAssociatedTracks() [1/2]

TrackSet CP::IsolationCloseByCorrectionTool::getAssociatedTracks ( const xAOD::IParticle * P) const
private

Retrieve all Inner detector tracks associated with the primary particle.

Definition at line 504 of file IsolationCloseByCorrectionTool.cxx.

504 {
505 TrackSet to_return{};
506 if (P->type() == xAOD::Type::Muon) {
507 const xAOD::Muon* mu = static_cast<const xAOD::Muon*>(P);
508 if (mu->muonType() != xAOD::Muon::MuonType::SiliconAssociatedForwardMuon)
509 to_return.emplace(mu->trackParticle(xAOD::Muon::TrackParticleType::InnerDetectorTrackParticle));
510 } else if (P->type() == xAOD::Type::TrackParticle) {
511 const xAOD::TrackParticle* trk = static_cast<const xAOD::TrackParticle*>(P);
512 to_return.emplace(trk);
513 } else if (isEgamma(P)) {
514 const xAOD::Egamma* EG = static_cast<const xAOD::Egamma*>(P);
515 std::set<const xAOD::TrackParticle*> trk_vec = xAOD::EgammaHelpers::getTrackParticles(EG, true, true);
516 for (const xAOD::TrackParticle* trk : trk_vec) {
517 ATH_MSG_VERBOSE("Adding egamma track with "
518 << trk->pt() * MeVtoGeV << " GeV, eta: " << trk->eta() << ", phi: " << trk->phi());
519 to_return.emplace(trk);
520 }
521 }
522 return to_return;
523 }
@ TrackParticle
The object is a charged track particle.
Definition ObjectType.h:43
std::set< const xAOD::TrackParticle * > getTrackParticles(const xAOD::Egamma *eg, bool useBremAssoc=true, bool allParticles=true)
Return a list of all or only the best TrackParticle associated to the object.

◆ getAssociatedTracks() [2/2]

TrackSet CP::IsolationCloseByCorrectionTool::getAssociatedTracks ( const xAOD::IParticle * P,
const xAOD::Vertex * vtx ) const
private

Retrieve the subset of tracks passing the isolation selection.

Definition at line 524 of file IsolationCloseByCorrectionTool.cxx.

524 {
525 const TrackSet assoc_tracks = getAssociatedTracks(P);
526 TrackSet to_ret{};
527 for (const TrackPtr trk : assoc_tracks) {
528 if (passFirstStage(trk, vtx)) to_ret.insert(trk);
529 }
530 return to_ret;
531 }
bool passFirstStage(const xAOD::TrackParticle *trk, const xAOD::Vertex *vtx) const
The Track particle has to pass the Track selection tool and the TTVA selection.
TrackSet getAssociatedTracks(const xAOD::IParticle *P) const
Retrieve all Inner detector tracks associated with the primary particle.

◆ getCloseByCorrection()

CorrectionCode CP::IsolationCloseByCorrectionTool::getCloseByCorrection ( std::vector< float > & corrections,
const xAOD::IParticle & par,
const std::vector< xAOD::Iso::IsolationType > & types,
const xAOD::IParticleContainer & closePar ) const
overridevirtual

Check first if all isolation types are known to the tool

Implements CP::IIsolationCloseByCorrectionTool.

Definition at line 445 of file IsolationCloseByCorrectionTool.cxx.

447 {
448
449 if (!m_isInitialised) {
450 ATH_MSG_ERROR("The IsolationCloseByCorrectionTool was not initialised!!!");
452 }
454 {
455 std::lock_guard<std::mutex> guard{m_isoHelpersMutex};
456 for (const IsolationType& t : types) {
457 IsoHelperMap::const_iterator Itr = m_isohelpers.find(t);
458 if (Itr != m_isohelpers.end()) { continue; }
459 Itr = m_isohelpers.insert(std::make_pair(t, std::make_unique<IsoVariableHelper>(t, m_backup_prefix, m_isoDecSuffix))).first;
460 }
461 }
462 corrections.assign(types.size(), 0);
464 loadPrimaryParticles(&closePar, cache);
465 const EventContext& ctx = Gaudi::Hive::currentContext();
466 loadAssociatedObjects(ctx, cache);
467 std::vector<float>::iterator Cone = corrections.begin();
468 for (const IsolationType& iso_type : types) {
469 {
470 std::lock_guard<std::mutex> guard{m_isoHelpersMutex};
471 IsoHelperMap::const_iterator Itr = m_isohelpers.find(iso_type);
472 if (Itr->second->backupIsolation(&par) == CP::CorrectionCode::Error) {
473 ATH_MSG_ERROR("Failed to backup isolation");
475 }
476 }
477 if (isTrackIso(iso_type)) {
478 if (getCloseByCorrectionTrackIso(&par, iso_type, cache, (*Cone)) == CorrectionCode::Error) {
479 ATH_MSG_ERROR("Failed to apply track correction");
481
482 }
483 }
484 else if (isTopoEtIso(iso_type)) {
485 if (getCloseByCorrectionTopoIso(ctx, &par, iso_type, cache, (*Cone)) == CorrectionCode::Error) {
486 ATH_MSG_ERROR("Failed to apply topo cluster correction");
488 }
489 }
490 else if (isPFlowIso(iso_type)) {
491 if (getCloseByCorrectionPflowIso(ctx, &par, iso_type, cache, (*Cone)) == CorrectionCode::Error) {
492 ATH_MSG_ERROR("Failed to apply pflow correction");
494 }
495 }
496 ++Cone;
497 }
498 return CorrectionCode::Ok;
499 }
CorrectionCode getCloseByCorrectionTopoIso(const EventContext &ctx, const xAOD::IParticle *primary, const IsoType type, ObjectCache &cache, float &isoValue) const
CorrectionCode getCloseByCorrectionTrackIso(const xAOD::IParticle *primary, const IsoType type, const ObjectCache &cache, float &isoValue) const
static bool isTrackIso(xAOD::Iso::IsolationType type)
void loadPrimaryParticles(const xAOD::IParticleContainer *container, ObjectCache &cache) const
Filter all electrons/muons/photons from the collection which pass the selection decoration.
CorrectionCode getCloseByCorrectionPflowIso(const EventContext &ctx, const xAOD::IParticle *primary, const IsoType type, const ObjectCache &cache, float &isoValue) const
static bool isTopoEtIso(xAOD::Iso::IsolationType type)
static bool isPFlowIso(xAOD::Iso::IsolationType type)

◆ getCloseByCorrectionPflowIso()

CorrectionCode CP::IsolationCloseByCorrectionTool::getCloseByCorrectionPflowIso ( const EventContext & ctx,
const xAOD::IParticle * primary,
const IsoType type,
const ObjectCache & cache,
float & isoValue ) const
private

Disable the correction of already isolated objects

Find the pflow elements associated with this primary

Definition at line 667 of file IsolationCloseByCorrectionTool.cxx.

669 {
670 if (!isPFlowIso(type)) {
671 ATH_MSG_ERROR("getCloseByCorrectionPflowIso() -- The isolation type is not a Pflow variable " << toString(type));
673 }
674 if (m_isohelpers.at(type)->getOriginalIsolation(primary, isoValue) == CorrectionCode::Error) {
675 ATH_MSG_ERROR("getCloseByCorrectionPflowIso() -- Could not retrieve the isolation variable.");
677 }
679 if (isoValue <= 0.) {
680 ATH_MSG_DEBUG("Pflow varible is already sufficiently isolated ");
681 return CorrectionCode::Ok;
682 }
683 const float coneDR = coneSize(primary, type);
684 float ref_eta{0.f}, ref_phi{0.f};
685 getExtrapEtaPhi(primary, ref_eta, ref_phi);
688 ATH_MSG_VERBOSE("getCloseByCorrectionPflowIso: " << toString(type) << " of " << particleName(primary) << " with pt: "
689 << primary->pt() * MeVtoGeV << " GeV, eta: " << primary->eta()
690 << ", phi: " << primary->phi() << " before correction: " << isoValue * MeVtoGeV << " GeV. ");
691 PflowSet assoc_coll = getAssocFlowElements(ctx, primary);
692 for (const FlowElementPtr& flow : cache.flows) {
693 ATH_MSG_VERBOSE("Loop over pflow element: " << flow->pt() << " GeV, eta: " << flow->eta() << " phi: " << flow->phi());
694
695 const float dR = xAOD::P4Helpers::deltaR(ref_eta,ref_phi, flow->eta(),flow->phi());
697 ATH_MSG_VERBOSE("Flow element is in core cone");
698 continue;
699 }
700 if (assoc_coll.count(flow)) {
701 ATH_MSG_VERBOSE("Flow element is directly associated with the object");
702 continue;
703 }
704 if (dR < coneDR) {
705 ATH_MSG_VERBOSE("Found overlapping pflow element: " << flow->pt() << " GeV, eta: " << flow->eta()
706 << " phi: " << flow->phi() << " dR: " << dR);
707 isoValue -= flow->pt() * flow.weight;
708 }
709 }
710 ATH_MSG_VERBOSE("getCloseByCorrectionPflowIso: " << toString(type) << " of " << particleName(primary) << " with pt: "
711 << primary->pt() * MeVtoGeV << " GeV, eta: " << primary->eta()
712 << ", phi: " << primary->phi() << " after correction: " << isoValue * MeVtoGeV << " GeV. ");
714 static const FloatAccessor acc_eta{pflowDecors()[0]};
715 static const FloatAccessor acc_phi{pflowDecors()[1]};
716 static const FloatAccessor acc_ene{pflowDecors()[2]};
717 static const CharAccessor acc_isDecor{pflowDecors()[3]};
718 for (const xAOD::IParticle* others : cache.prim_parts) {
719 if (others == primary) continue;
720 if (!acc_isDecor.isAvailable(*others) || !acc_isDecor(*others)) {
721 ATH_MSG_ERROR("The variable energy averaged pflow decorations are not available for "<<particleName(others)<<". Please check");
723 }
724 const float other_eta = acc_eta(*others);
725 const float other_phi = acc_phi(*others);
726 const float dR = xAOD::P4Helpers::deltaR(ref_eta,ref_phi,other_eta,other_phi);
727 if (dR > coneDR) continue;
728 if (dR< (primary->type() == xAOD::Type::ObjectType::Muon ? m_coreConeMu : m_coreConeEl)) continue;
729 isoValue -= acc_ene(*others);
730 }
731 } else {
732 ATH_MSG_ERROR("Unknown calo correction model "<<m_caloModel);
734 }
735 isoValue = std::max(0.f, isoValue);
736 return CorrectionCode::Ok;
737 }

◆ getCloseByCorrectionTopoIso()

CorrectionCode CP::IsolationCloseByCorrectionTool::getCloseByCorrectionTopoIso ( const EventContext & ctx,
const xAOD::IParticle * primary,
const IsoType type,
ObjectCache & cache,
float & isoValue ) const
private

Disable the correction of already isolated objects

Definition at line 739 of file IsolationCloseByCorrectionTool.cxx.

741 {
742 // check if the isolation can be loaded
743 if (!isTopoEtIso(type)) {
744 ATH_MSG_ERROR("getCloseByCorrectionTopoIso() -- The isolation type is not an et cone variable " << toString(type));
746 }
747 {
748 std::lock_guard<std::mutex> guard{m_isoHelpersMutex};
749 if (m_isohelpers.at(type)->getOriginalIsolation(primary, isoValue) == CorrectionCode::Error) {
750 ATH_MSG_WARNING("Could not retrieve the isolation variable.");
752 }
753 }
755 if (isoValue <= 0.) {
756 ATH_MSG_DEBUG("Topo et cone variable is already sufficiently isolated");
757 return CorrectionCode::Ok;
758 }
759 float ref_eta{0.f}, ref_phi{0.f};
760 getExtrapEtaPhi(primary, ref_eta, ref_phi);
761 ATH_MSG_VERBOSE("getCloseByCorrectionTopoIso: " << toString(type) << " of " << particleName(primary) << " with ref eta: " << ref_eta << ", ref phi " << ref_phi);
762
763 float MaxDR = coneSize(primary, type) * (primary->type() != xAOD::Type::ObjectType::Muon ? 1. : m_ConeSizeVariation.value());
765 ATH_MSG_VERBOSE("getCloseByCorrectionTopoIso: " << toString(type) << " of " << particleName(primary) << " with pt: "
766 << primary->pt() * MeVtoGeV << " GeV, eta: " << primary->eta()
767 << ", phi: " << primary->phi() << " before correction: " << isoValue * MeVtoGeV << " GeV. ");
768 ClusterSet assoc = getAssociatedClusters(ctx, primary, cache);
769 for (const CaloClusterPtr& calo : cache.clusters) {
770 const float dR = xAOD::P4Helpers::deltaR(ref_eta, ref_phi, calo->eta(), calo->phi());
771 ATH_MSG_VERBOSE("getCloseByCorrectionTopoIso: Loop over cluster: " << calo->pt() * MeVtoGeV << " GeV, eta: " << calo->eta() << " phi: " << calo->phi() << " dR: " << dR);
772 if (dR > MaxDR) continue;
773 // REMOVED CORE CUT SINCE TOPOCLUSTERS SHOULD BE ASSOCIATED TO THE ELECTRONS AND MUONS AND WILL BE CUT BY ASSOC CUT BELOW
774 if (assoc.count(calo)) {
775 ATH_MSG_VERBOSE("getCloseByCorrectionTopoIso: skip due to assoc " << assoc.count(calo));
776 continue;
777 }
778 float Polution = clusterEtMinusTile(calo) / (isoValue != 0 ? isoValue : 1.);
779 if (Polution < 0. || Polution > m_maxTopoPolution) {
780 ATH_MSG_VERBOSE("getCloseByCorrectionTopoIso: skip due to polution " << Polution << ", clus noTile " << clusterEtMinusTile(calo) * MeVtoGeV << " GeV");
781 continue;
782 }
783 ATH_MSG_VERBOSE("getCloseByCorrectionTopoIso: Found overlapping topocluster: " << calo->pt() * MeVtoGeV << " GeV, lessTile " << clusterEtMinusTile(calo) * MeVtoGeV << " GeV, eta: " << calo->eta()
784 << " phi: " << calo->phi() << " dR: " << dR);
785 isoValue -= clusterEtMinusTile(calo);
786 }
787 ATH_MSG_VERBOSE("getCloseByCorrectionTopoIso: " << toString(type) << " of " << particleName(primary) << " with pt: "
788 << primary->pt() * MeVtoGeV << " GeV, eta: " << primary->eta()
789 << ", phi: " << primary->phi() << " after correction: " << isoValue * MeVtoGeV << " GeV. ");
791 const FloatAccessor acc_eta{caloDecors()[0] + m_caloDecSuffix};
792 const FloatAccessor acc_phi{caloDecors()[1] + m_caloDecSuffix};
793 const FloatAccessor acc_ene{caloDecors()[2] + m_caloDecSuffix};
794 const CharAccessor acc_isDecor{caloDecors()[3] + m_caloDecSuffix};
795 for (const xAOD::IParticle* others : cache.prim_parts) {
796 if (others == primary) continue;
797 if (!acc_isDecor.isAvailable(*others) || !acc_isDecor(*others)) {
798 ATH_MSG_ERROR("The averaged calo cluster decorations are not available for "<<particleName(others)<<". Please check");
800 }
801 const float other_eta = acc_eta(*others);
802 const float other_phi = acc_phi(*others);
803 const float dR = xAOD::P4Helpers::deltaR(ref_eta,ref_phi,other_eta,other_phi);
804 if (dR > MaxDR) continue;
805 if (dR< (primary->type() == xAOD::Type::ObjectType::Muon ? m_coreConeMu : m_coreConeEl)) continue;
806 isoValue -= acc_ene(*others);
807 }
808 }
809 isoValue = std::max(0.f, isoValue);
810 return CorrectionCode::Ok;
811 }
ClusterSet getAssociatedClusters(const EventContext &ctx, const xAOD::IParticle *particle, ObjectCache &cache) const
Loads the topo clusters associated with the primary IParticle.

◆ getCloseByCorrectionTrackIso()

CorrectionCode CP::IsolationCloseByCorrectionTool::getCloseByCorrectionTrackIso ( const xAOD::IParticle * primary,
const IsoType type,
const ObjectCache & cache,
float & isoValue ) const
private

Only check the TTVA working point again if the tool has non-TTVA working points

Definition at line 624 of file IsolationCloseByCorrectionTool.cxx.

625 {
626 if (!isTrackIso(type)) {
627 ATH_MSG_ERROR("Invalid isolation type " << toString(type));
629 }
630 {
631 std::lock_guard<std::mutex> guard{m_isoHelpersMutex};
632 IsoHelperMap::const_iterator Itr = m_isohelpers.find(type);
633 if (Itr == m_isohelpers.end() || Itr->second->getOriginalIsolation(par, isoValue) == CorrectionCode::Error) {
634 ATH_MSG_WARNING(__func__<<"() -- "<<__LINE__<<" Could not retrieve the isolation variable " << toString(type));
636 } else if (cache.tracks.empty())
637 return CorrectionCode::Ok;
638 }
639
640 float MaxDR = coneSize(par, type);
641 const TrackSet ToExclude = getAssociatedTracks(par);
642
643 const xAOD::IParticle* Ref = isoRefParticle(par);
644 ATH_MSG_VERBOSE(toString(type) << " of " << particleName(par) << " with pt: " << par->pt() * MeVtoGeV << " GeV, eta: " << par->eta()
645 << ", phi: " << par->phi() << " before correction: " << isoValue * MeVtoGeV << " GeV. "
646 << ToExclude.size() << " tracks will be excluded.");
647
648 for (const TrackPtr& poluting_trk : cache.tracks) {
649 // Checks for the Pile-up robust isolation WP's
650 if (poluting_trk->pt() < trackPtCut(type)) continue;
652 if (isTrackIsoTTVA(type) && m_has_nonTTVA && !m_ttvaTool->isCompatible(*poluting_trk, *cache.prim_vtx)) continue;
653
654 if (overlap(Ref, poluting_trk, MaxDR) && !ToExclude.count(poluting_trk)) {
655 ATH_MSG_VERBOSE("Subtract track with "
656 << poluting_trk->pt() * MeVtoGeV << " GeV, eta: " << poluting_trk->eta() << ", phi: " << poluting_trk->phi()
657 << " with dR: " << std::sqrt(deltaR2(Ref, poluting_trk)) << " from the isolation cone " << toString(type)
658 << " " << (isoValue * MeVtoGeV) << " GeV.");
659 isoValue -= poluting_trk->pt();
660 }
661 }
662 isoValue = std::max(0.f, isoValue);
663 ATH_MSG_VERBOSE(toString(type) << " of " << particleName(par) << " with pt: " << par->pt() * MeVtoGeV << " GeV, eta: " << par->eta()
664 << ", phi: " << par->phi() << " after correction: " << isoValue * MeVtoGeV << " GeV");
665 return CorrectionCode::Ok;
666 }
bool m_has_nonTTVA
Switch whether a pile-up non robust TTVA working point is defined.
bool overlap(const xAOD::IParticle *particle, const xAOD::IParticle *particle1, float dR) const
ToolHandle< CP::ITrackVertexAssociationTool > m_ttvaTool
float deltaR2(const xAOD::IParticle *particle, const xAOD::IParticle *particle1, bool AvgCalo=false) const
static float trackPtCut(xAOD::Iso::IsolationType type)
static bool isTrackIsoTTVA(xAOD::Iso::IsolationType type)

◆ getCloseByIsoCorrection()

CorrectionCode CP::IsolationCloseByCorrectionTool::getCloseByIsoCorrection ( const EventContext & ctx,
const xAOD::ElectronContainer * Electrons,
const xAOD::MuonContainer * Muons,
const xAOD::PhotonContainer * Photons ) const
overridevirtual

Pick up first all objects that a considerable for the close-by correction

Implements CP::IIsolationCloseByCorrectionTool.

Definition at line 255 of file IsolationCloseByCorrectionTool.cxx.

259 {
260 if (!m_isInitialised) {
261 ATH_MSG_ERROR("The IsolationCloseByCorrectionTool was not initialised!!!");
263 }
266 loadPrimaryParticles(electrons, cache);
267 loadPrimaryParticles(muons, cache);
268 loadPrimaryParticles(photons, cache);
269
270 loadAssociatedObjects(ctx, cache);
271 CorrectionCode ret = performCloseByCorrection(ctx, cache);
275 return ret;
276 }
IsoVector m_electron_isoTypes
Isolation variables used by the electron working point.
IsoVector m_muon_isoTypes
Isolation variables used by the muon working point.
void lockDecorations(const xAOD::IParticleContainer *parts, const IsoVector &isoTypes) const
IsoVector m_photon_isoTypes
Isolation variables used by the photon working point.
CorrectionCode performCloseByCorrection(const EventContext &ctx, ObjectCache &cache) const

◆ getExtrapEtaPhi() [1/2]

bool CP::IsolationCloseByCorrectionTool::getExtrapEtaPhi ( const EventContext & ctx,
const xAOD::TrackParticle * tp,
float & eta,
float & phi ) const
private

helper to get eta,phi of muon extrap

try the extention in athena if it's not obtained from muon yet.

if still not got the updated eta & phi

Definition at line 223 of file IsolationCloseByCorrectionTool.cxx.

223 {
225 ATH_MSG_DEBUG("Geting calo extension caloExtension tool.");
226 // If we have an extension cache then it owns the extension, otherwise we own it
227 // Therefore we have to prepare both an owning and a non-owning pointer
228 std::unique_ptr<Trk::CaloExtension> caloExtension;
229 caloExtension = m_caloExtTool->caloExtension(ctx, *tp);
230 if(!caloExtension){
231 ATH_MSG_WARNING("Can not get caloExtension.");
232 return false;
233 };
234
235 const std::vector<Trk::CurvilinearParameters>& intersections = caloExtension->caloLayerIntersections();
236 if(!intersections.empty()){
237 Amg::Vector3D avePoint(0,0,0);
238 for (unsigned int i = 0; i < intersections.size(); ++i){
239 const Amg::Vector3D& point = intersections[i].position();
240 avePoint += point;
241 }
242 avePoint = (1./intersections.size())*avePoint;
243 eta = avePoint.eta();
244 phi = avePoint.phi();
245 return true;
246 } else {
247 ATH_MSG_WARNING("Muon Calo extension got no intersection!!!");
248 }
250 ATH_MSG_WARNING("Calo extension can not be obtained!!!");
251 return false;
252 }
ToolHandle< Trk::IParticleCaloExtensionTool > m_caloExtTool
calo extension tool for muon track particle extrapolation to calo
Eigen::Matrix< double, 3, 1 > Vector3D

◆ getExtrapEtaPhi() [2/2]

void CP::IsolationCloseByCorrectionTool::getExtrapEtaPhi ( const xAOD::IParticle * particlear,
float & eta,
float & phi ) const

Definition at line 812 of file IsolationCloseByCorrectionTool.cxx.

812 {
815 const CharAccessor acc_isDecor{caloDecors()[3] + m_caloDecSuffix};
816 if (par->type() != xAOD::Type::ObjectType::Muon) {
817 const xAOD::Egamma* egam = dynamic_cast<const xAOD::Egamma*>(par);
818 if( egam ) {
819 eta = egam->caloCluster()->eta();
820 phi = egam->caloCluster()->phi();
821 }
822 else {
823 eta = par->eta();
824 phi = par->phi();
825 }
826 } else if (acc_isDecor.isAvailable(*par) && acc_isDecor(*par)) {
827 eta = acc_assocEta(*par);
828 phi = acc_assocPhi(*par);
829 } else {
830 float assoc_ene{0.f};
833 const CharDecorator dec_isDecor{caloDecors()[3] + m_caloDecSuffix};
834 associateCluster(par,eta, phi, assoc_ene);
835 dec_assocEta(*par) = eta;
836 dec_assocPhi(*par) = phi;
837 dec_isDecor(*par) = true;
838 }
839 }
void associateCluster(const xAOD::IParticle *particle, float &eta, float &phi, float &energy) const override
Retrieve the associated clusters from the Particle and calculate the average eta/phi/energy.

◆ getIsolationTypes()

const IsoVector & CP::IsolationCloseByCorrectionTool::getIsolationTypes ( const xAOD::IParticle * particle) const
private

Definition at line 368 of file IsolationCloseByCorrectionTool.cxx.

368 {
369 static const IsoVector dummy{};
370 if (!particle) return dummy;
372 return m_electron_isoTypes;
373 else if (particle->type() == xAOD::Type::ObjectType::Muon)
374 return m_muon_isoTypes;
375 else if (particle->type() == xAOD::Type::ObjectType::Photon)
376 return m_photon_isoTypes;
377 return dummy;
378 }
@ Photon
The object is a photon.
Definition ObjectType.h:47
@ Electron
The object is an electron.
Definition ObjectType.h:46

◆ getKey()

SG::sgkey_t asg::AsgTool::getKey ( const void * ptr) const
inherited

Get the (hashed) key of an object that is in the event store.

This is a bit of a special one. StoreGateSvc and xAOD::Event both provide ways for getting the SG::sgkey_t key for an object that is in the store, based on a bare pointer. But they provide different interfaces for doing so.

In order to allow tools to efficiently perform this operation, they can use this helper function.

See also
asg::AsgTool::getName
Parameters
ptrThe bare pointer to the object that the event store should know about
Returns
The hashed key of the object in the store. If not found, an invalid (zero) key.

Definition at line 119 of file AsgTool.cxx.

119 {
120
121#ifdef XAOD_STANDALONE
122 // In case we use @c xAOD::Event, we have a direct function call
123 // for this.
124 return evtStore()->event()->getKey( ptr );
125#else
126 const SG::DataProxy* proxy = evtStore()->proxy( ptr );
127 return ( proxy == nullptr ? 0 : proxy->sgkey() );
128#endif // XAOD_STANDALONE
129 }
ServiceHandle< StoreGateSvc > & evtStore()

◆ getName()

const std::string & asg::AsgTool::getName ( const void * ptr) const
inherited

Get the name of an object that is / should be in the event store.

This is a bit of a special one. StoreGateSvc and xAOD::Event both provide ways for getting the std::string name for an object that is in the store, based on a bare pointer. But they provide different interfaces for doing so.

In order to allow tools to efficiently perform this operation, they can use this helper function.

See also
asg::AsgTool::getKey
Parameters
ptrThe bare pointer to the object that the event store should know about
Returns
The string name of the object in the store. If not found, an empty string.

Definition at line 106 of file AsgTool.cxx.

106 {
107
108#ifdef XAOD_STANDALONE
109 // In case we use @c xAOD::Event, we have a direct function call
110 // for this.
111 return evtStore()->event()->getName( ptr );
112#else
113 const SG::DataProxy* proxy = evtStore()->proxy( ptr );
114 static const std::string dummy = "";
115 return ( proxy == nullptr ? dummy : proxy->name() );
116#endif // XAOD_STANDALONE
117 }

◆ getOriginalIsolation() [1/2]

float CP::IsolationCloseByCorrectionTool::getOriginalIsolation ( const xAOD::IParticle & P,
IsoType type ) const
overridevirtual

Implements CP::IIsolationCloseByCorrectionTool.

Definition at line 1061 of file IsolationCloseByCorrectionTool.cxx.

1061 {
1062 return getOriginalIsolation(&particle, type);
1063 }
virtual float getOriginalIsolation(const xAOD::IParticle &P, IsoType type) const override

◆ getOriginalIsolation() [2/2]

float CP::IsolationCloseByCorrectionTool::getOriginalIsolation ( const xAOD::IParticle * particle,
IsoType type ) const
overridevirtual

Implements CP::IIsolationCloseByCorrectionTool.

Definition at line 1051 of file IsolationCloseByCorrectionTool.cxx.

1051 {
1052 std::lock_guard<std::mutex> guard{m_isoHelpersMutex};
1053 IsoHelperMap::const_iterator itr = m_isohelpers.find(isoVariable);
1054 float isovalue = 0;
1055 if (itr == m_isohelpers.end() || itr->second->getOriginalIsolation(particle, isovalue) == CorrectionCode::Error) {
1056 ATH_MSG_ERROR("Failed to retrieve the original isolation cone ");
1057 isovalue = FLT_MAX;
1058 }
1059 return isovalue;
1060 }

◆ getProperty()

template<class T>
const T * asg::AsgTool::getProperty ( const std::string & name) const
inherited

Get one of the tool's properties.

◆ getTrackCandidates()

TrackSet CP::IsolationCloseByCorrectionTool::getTrackCandidates ( const EventContext & ctx,
const xAOD::IParticle * particle ) const
overridevirtual

Load all TrackParticles associated with the particles in the Container. The particles have to pass the selection decoration flag.

Implements CP::IIsolationCloseByCorrectionTool.

Definition at line 532 of file IsolationCloseByCorrectionTool.cxx.

532 {
534 }
const xAOD::Vertex * retrieveIDBestPrimaryVertex(const EventContext &ctx) const

◆ initialize()

StatusCode CP::IsolationCloseByCorrectionTool::initialize ( void )
overridevirtual

Dummy implementation of the initialisation function.

It's here to allow the dual-use tools to skip defining an initialisation function. Since many are doing so...

Retrieve the isolation tool and load the isolation cones

Setup the data dependency

Same holds for the TTVA selection tool

Reimplemented from asg::AsgTool.

Definition at line 44 of file IsolationCloseByCorrectionTool.cxx.

44 {
46 ATH_CHECK(m_selectorTool.retrieve());
50
54 if (!m_isoDecSuffix.empty()) ATH_MSG_INFO("IsoDecSuffix set to " << m_isoDecSuffix);
55 if (!m_quality_name.empty()) ATH_MSG_INFO("SelectionDecorator set to " << m_quality_name);
56
57
58#ifndef XAOD_ANALYSIS
63 ATH_CHECK(m_isoVarKeys.initialize());
64 ATH_CHECK(m_isoWriteDecVarKeys.initialize());
65 if (!m_caloExtTool.empty()) ATH_CHECK(m_caloExtTool.retrieve());
66 else {
67 ATH_MSG_WARNING("The ParticleCaloExtensionTool was not configured. Pleease include it!!!");
68 }
69#endif
70
71 ATH_CHECK(m_VtxKey.initialize());
74
75 // set default properties of track selection tool, if the user hasn't configured it
76 if (m_trkselTool.empty()) {
77 asg::AsgToolConfig config{"InDet::InDetTrackSelectionTool/TrackParticleSelectionTool"};
78 ATH_MSG_INFO("No TrackSelectionTool provided, so I will create and configure my own, called: " << config.name());
79 // The z0 cut is checked in any case either by the
80 // track to vertex association tool or by the tracking tool
81 ATH_CHECK(config.setProperty("maxZ0SinTheta", 3.));
82 // The minimum Pt requirement is lowered to 500 MeV because
83 // the Loose ttva cone variables accept very low-pt tracks
84 // https://gitlab.cern.ch/atlas/athena/blob/21.2/Reconstruction/RecoAlgs/IsolationAlgs/python/IsoUpdatedTrackCones.py#L21
85 ATH_CHECK(config.setProperty("minPt", 500.));
86 ATH_CHECK(config.setProperty("CutLevel", "Loose"));
87 ATH_CHECK(config.makePrivateTool(m_trkselTool));
88 }
90 if (m_ttvaTool.empty()) {
91 asg::AsgToolConfig config{"CP::TrackVertexAssociationTool/ttva_selection_tool"};
92 ATH_CHECK(config.setProperty("WorkingPoint", "Nonprompt_All_MaxWeight"));
93 ATH_CHECK(config.makePrivateTool(m_ttvaTool));
94 }
95 ATH_CHECK(m_trkselTool.retrieve());
96 ATH_CHECK(m_ttvaTool.retrieve());
97
98 if (!m_quality_name.empty()) m_acc_quality = std::make_unique<CharAccessor>(m_quality_name);
99 if (!m_passOR_name.empty()) m_acc_passOR = std::make_unique<CharAccessor>(m_passOR_name);
100 if (!m_isoSelection_name.empty()) m_dec_isoselection = std::make_unique<CharDecorator>(m_isoSelection_name);
101 m_isInitialised = true;
102 return StatusCode::SUCCESS;
103 }
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_INFO(x,...)
void declareDependency(const std::vector< std::string > &containers, const IsoVector &types)
Helper function to declare the data dependencies.
Gaudi::Property< std::vector< std::string > > m_elecKeys
Declare the data dependencies of the Input containers.
Gaudi::Property< std::vector< std::string > > m_photKeys
void isoTypesFromWP(const std::vector< std::unique_ptr< IsolationWP > > &WP, IsoVector &types)
Helper function to load all Isolation types from the iso working points.
void printIsolationCones(const IsoVector &types, xAOD::Type::ObjectType T) const
Gaudi::Property< std::string > m_isoSelection_name
Gaudi::Property< std::vector< std::string > > m_muonKeys
SG::ReadHandleKey< xAOD::VertexContainer > m_VtxKey
ToolHandle< InDet::IInDetTrackSelectionTool > m_trkselTool

◆ inputHandles()

virtual std::vector< Gaudi::DataHandle * > AthCommonDataStore< AthCommonMsg< AlgTool > >::inputHandles ( ) const
overridevirtualinherited

Return this algorithm's input handles.

We override this to include handle instances from key arrays if they have not yet been declared. See comments on updateVHKA.

◆ isEgamma()

bool CP::IsolationCloseByCorrectionTool::isEgamma ( const xAOD::IParticle * particle)
static

Definition at line 535 of file IsolationCloseByCorrectionTool.cxx.

535 {
536 return P && (P->type() == xAOD::Type::ObjectType::Electron || P->type() == xAOD::Type::ObjectType::Photon);
537 }

◆ isFixedTrackIso()

bool CP::IsolationCloseByCorrectionTool::isFixedTrackIso ( xAOD::Iso::IsolationType type)
static

Definition at line 1084 of file IsolationCloseByCorrectionTool.cxx.

1084{ return IsolationFlavour::ptcone == isolationFlavour(type); }
IsolationFlavour isolationFlavour(IsolationType type)
convert Isolation Type into Isolation Flavour

◆ isFixedTrackIsoTTVA()

bool CP::IsolationCloseByCorrectionTool::isFixedTrackIsoTTVA ( xAOD::Iso::IsolationType type)
static

Definition at line 1090 of file IsolationCloseByCorrectionTool.cxx.

1090 {
1091 IsolationFlavour flavour = isolationFlavour(type);
1092 static const std::set<IsolationFlavour> ttvaFlavours{IsolationFlavour::ptcone_Nonprompt_All_MaxWeightTTVA_pt500,
1093 IsolationFlavour::ptcone_Nonprompt_All_MaxWeightTTVA_pt1000,
1094 IsolationFlavour::ptcone_Nonprompt_All_MaxWeightTTVALooseCone_pt500,
1095 IsolationFlavour::ptcone_Nonprompt_All_MaxWeightTTVALooseCone_pt1000};
1096 return ttvaFlavours.count(flavour);
1097 }
IsolationFlavour
Enumeration for different ways of calculating isolation in xAOD files.

◆ isoRefParticle()

const xAOD::IParticle * CP::IsolationCloseByCorrectionTool::isoRefParticle ( const xAOD::IParticle * particle) const
overridevirtual

Retrieve the reference particle to define the cone axis in which the track particles contributing to the isolation have to be.

Implements CP::IIsolationCloseByCorrectionTool.

Definition at line 1013 of file IsolationCloseByCorrectionTool.cxx.

1013 {
1014 if (!P) {
1015 ATH_MSG_ERROR("Nullptr given");
1016 return nullptr;
1017 }
1018 // Use for muons the associated ID track. Else the particle itself
1019 if (P->type() == xAOD::Type::ObjectType::Muon) {
1020 const xAOD::Muon* muon = static_cast<const xAOD::Muon*>(P);
1021 const xAOD::TrackParticle* idTrk = muon->trackParticle(xAOD::Muon::TrackParticleType::InnerDetectorTrackParticle);
1022 return idTrk ? idTrk : muon->trackParticle(xAOD::Muon::TrackParticleType::Primary);
1023 }
1024 return P;
1025 }

◆ isoTypesFromWP()

void CP::IsolationCloseByCorrectionTool::isoTypesFromWP ( const std::vector< std::unique_ptr< IsolationWP > > & WP,
IsoVector & types )
private

Helper function to load all Isolation types from the iso working points.

Definition at line 104 of file IsolationCloseByCorrectionTool.cxx.

104 {
105 types.clear();
106 for (const std::unique_ptr<IsolationWP>& W : WPs) {
107 for (const std::unique_ptr<IsolationCondition>& C : W->conditions()) {
108 for (unsigned int t = 0; t < C->num_types(); ++t) {
109 const IsoType iso_type = C->type(t);
110 if (std::find(types.begin(), types.end(), iso_type) == types.end()) types.emplace_back(iso_type);
111 if (m_isohelpers.find(iso_type) == m_isohelpers.end()) {
112 m_isohelpers.insert(std::make_pair(iso_type, std::make_unique<IsoVariableHelper>(iso_type, m_backup_prefix, m_isoDecSuffix)));
113 }
114 }
115 }
116 }
117 m_has_nonTTVA |= std::find_if(types.begin(), types.end(),
118 [](const IsolationType& t) { return isTrackIso(t) && !isTrackIsoTTVA(t); }) != types.end();
119 m_hasPflowIso |= std::find_if(types.begin(), types.end(),
120 [](const IsolationType& t) { return isPFlowIso(t); }) != types.end();
121 m_hasEtConeIso |= std::find_if(types.begin(), types.end(),
122 [](const IsolationType& t) { return isTopoEtIso(t); }) != types.end();
123 }
struct color C
@ W
FillWPartonHistory.

◆ isPFlowIso()

bool CP::IsolationCloseByCorrectionTool::isPFlowIso ( xAOD::Iso::IsolationType type)
static

Definition at line 1121 of file IsolationCloseByCorrectionTool.cxx.

1121{ return isolationFlavour(type) == IsolationFlavour::neflowisol; }

◆ isSame()

bool CP::IsolationCloseByCorrectionTool::isSame ( const xAOD::IParticle * particle,
const xAOD::IParticle * particle1 ) const

Definition at line 1026 of file IsolationCloseByCorrectionTool.cxx.

1026 {
1027 if (!P || !P1) {
1028 ATH_MSG_WARNING("Nullptr were given");
1029 return true;
1030 }
1031 return (P == P1);
1032 }

◆ isTopoEtIso()

bool CP::IsolationCloseByCorrectionTool::isTopoEtIso ( xAOD::Iso::IsolationType type)
static

Definition at line 1089 of file IsolationCloseByCorrectionTool.cxx.

1089{ return IsolationFlavour::topoetcone == isolationFlavour(type); }

◆ isTrackIso()

bool CP::IsolationCloseByCorrectionTool::isTrackIso ( xAOD::Iso::IsolationType type)
static

Definition at line 1086 of file IsolationCloseByCorrectionTool.cxx.

1086 {
1087 return isVarTrackIso(type) || isFixedTrackIso(type) || isTrackIsoTTVA(type);
1088 }
static bool isFixedTrackIso(xAOD::Iso::IsolationType type)

◆ isTrackIsoTTVA()

bool CP::IsolationCloseByCorrectionTool::isTrackIsoTTVA ( xAOD::Iso::IsolationType type)
static

Definition at line 1106 of file IsolationCloseByCorrectionTool.cxx.

1106{ return isFixedTrackIsoTTVA(type) || isVarTrackIsoTTVA(type); }
static bool isFixedTrackIsoTTVA(xAOD::Iso::IsolationType type)

◆ isVarTrackIso()

bool CP::IsolationCloseByCorrectionTool::isVarTrackIso ( xAOD::Iso::IsolationType type)
static

Definition at line 1085 of file IsolationCloseByCorrectionTool.cxx.

1085{ return IsolationFlavour::ptvarcone == isolationFlavour(type); }

◆ isVarTrackIsoTTVA()

bool CP::IsolationCloseByCorrectionTool::isVarTrackIsoTTVA ( xAOD::Iso::IsolationType Iso)
static

Definition at line 1098 of file IsolationCloseByCorrectionTool.cxx.

1098 {
1099 IsolationFlavour flavour = isolationFlavour(type);
1100 static const std::set<IsolationFlavour> ttvaFlavours{IsolationFlavour::ptvarcone_Nonprompt_All_MaxWeightTTVA_pt500,
1101 IsolationFlavour::ptvarcone_Nonprompt_All_MaxWeightTTVA_pt1000,
1102 IsolationFlavour::ptvarcone_Nonprompt_All_MaxWeightTTVALooseCone_pt500,
1103 IsolationFlavour::ptvarcone_Nonprompt_All_MaxWeightTTVALooseCone_pt1000};
1104 return ttvaFlavours.count(flavour);
1105 }

◆ loadAssociatedObjects()

void CP::IsolationCloseByCorrectionTool::loadAssociatedObjects ( const EventContext & ctx,
ObjectCache & cache ) const

Load all associated tracks / clusters / flow elements into the cache.

Definition at line 169 of file IsolationCloseByCorrectionTool.cxx.

169 {
170
171 // Use isLRT decoration for LLP particles to avoid looking for tracks from the primary vertex
172 static const CharAccessor isLRT("isLRT");
173
174 cache.prim_vtx = retrieveIDBestPrimaryVertex(ctx);
175 for (const xAOD::IParticle* prim : cache.prim_parts) {
176 // skip LRT leptons
177 if (!isLRT.isAvailable(*prim) || !isLRT(*prim) ) {
178 const TrackSet tracks = getAssociatedTracks(prim, cache.prim_vtx);
179 cache.tracks.insert(tracks.begin(), tracks.end());
180 }
181 const ClusterSet clusters = getAssociatedClusters(ctx, prim, cache);
182 cache.clusters.insert(clusters.begin(), clusters.end());
183 }
184 getAssocFlowElements(ctx, cache);
185 }

◆ loadPrimaryParticles()

void CP::IsolationCloseByCorrectionTool::loadPrimaryParticles ( const xAOD::IParticleContainer * container,
ObjectCache & cache ) const

Filter all electrons/muons/photons from the collection which pass the selection decoration.

Definition at line 143 of file IsolationCloseByCorrectionTool.cxx.

143 {
144 if (!container) return;
145 for (const xAOD::IParticle* particle : *container) {
146 if (m_dec_isoselection) (*m_dec_isoselection)(*particle) = true && m_selectorTool->accept(*particle);
147 const IsoVector& iso_types = getIsolationTypes(particle);
148 if (iso_types.empty()) { ATH_MSG_DEBUG("No isolation types have been defined for particle type " << particleName(particle)); }
149 for (const IsoType type : iso_types) {
150 std::lock_guard<std::mutex> guard{m_isoHelpersMutex};
151 IsoHelperMap::const_iterator Itr = m_isohelpers.find(type);
152 if (Itr == m_isohelpers.end() || Itr->second->backupIsolation(particle) == CorrectionCode::Error) {
153 ATH_MSG_WARNING("Failed to properly access the vanilla isolation variable "
154 << toString(type) << "for particle " << particleName(particle) << " with pT: "
155 << particle->pt() * MeVtoGeV << " GeV, eta: " << particle->eta() << ", phi: " << particle->phi());
156 }
157 }
158 // Save all particles to be sure to output the new iso decorated values
159 // They either pass or not the selection.
160 // The selected ones participate in the CloseBy and may have their isolation corrected.
161 if (!passSelectionQuality(particle)) {
162 cache.not_sel_parts.insert(particle);
163 }
164 else {
165 cache.prim_parts.insert(particle);
166 }
167 }
168 }
bool passSelectionQuality(const xAOD::IParticle *particle) const

◆ lockDecorations()

void CP::IsolationCloseByCorrectionTool::lockDecorations ( const xAOD::IParticleContainer * parts,
const IsoVector & isoTypes ) const
private

Definition at line 326 of file IsolationCloseByCorrectionTool.cxx.

327 {
328 if (!parts) return;
329
332 const CharDecorator dec_isDecor{caloDecors()[3] + m_caloDecSuffix};
333
334 std::lock_guard<std::mutex> guard{m_isoHelpersMutex};
335
336 if (parts->ownPolicy() == SG::VIEW_ELEMENTS) {
338 for (const xAOD::IParticle* part : *parts) {
339 const SG::AuxVectorData* c = part->container();
340 if (conts.insert(c).second) {
341 for (const IsoType t : isoTypes) {
342 auto it = m_isohelpers.find (t);
343 if (it != m_isohelpers.end())
344 it->second->lockDecorations(*part->container());
345 }
346 SG::AuxVectorData* c_nc ATLAS_THREAD_SAFE =
347 const_cast<SG::AuxVectorData*> (c);
348 c_nc->lockDecoration (dec_assocEta.auxid());
349 c_nc->lockDecoration (dec_assocPhi.auxid());
350 c_nc->lockDecoration (dec_isDecor.auxid());
351 }
352 }
353 }
354
355 else {
356 for (const IsoType t : isoTypes) {
357 auto it = m_isohelpers.find (t);
358 if (it != m_isohelpers.end())
359 it->second->lockDecorations(*parts);
360 }
361 SG::AuxVectorData* c_nc ATLAS_THREAD_SAFE =
362 const_cast<xAOD::IParticleContainer*> (parts);
363 c_nc->lockDecoration (dec_assocEta.auxid());
364 c_nc->lockDecoration (dec_assocPhi.auxid());
365 c_nc->lockDecoration (dec_isDecor.auxid());
366 }
367 }
std::unordered_set< const SG::AuxVectorData * > UnorderedContainerSet
@ VIEW_ELEMENTS
this data object is a view, it does not own its elmts
DataVector< IParticle > IParticleContainer
Simple convenience declaration of IParticleContainer.

◆ msg()

MsgStream & AthCommonMsg< AlgTool >::msg ( ) const
inlineinherited

Definition at line 24 of file AthCommonMsg.h.

24 {
25 return this->msgStream();
26 }

◆ msg_level_name()

const std::string & asg::AsgTool::msg_level_name ( ) const
inherited

A deprecated function for getting the message level's name.

Instead of using this, weirdly named function, user code should get the string name of the current minimum message level (in case they really need it...), with:

MSG::name( msg().level() )

This function's name doesn't follow the ATLAS coding rules, and as such will be removed in the not too distant future.

Returns
The string name of the current minimum message level that's printed

Definition at line 101 of file AsgTool.cxx.

101 {
102
103 return MSG::name( msg().level() );
104 }
MsgStream & msg() const
const std::string & name(Level lvl)
Convenience function for translating message levels to strings.
Definition MsgLevel.cxx:19

◆ msgLvl()

bool AthCommonMsg< AlgTool >::msgLvl ( const MSG::Level lvl) const
inlineinherited

Definition at line 30 of file AthCommonMsg.h.

30 {
31 return this->msgLevel(lvl);
32 }

◆ outputHandles()

virtual std::vector< Gaudi::DataHandle * > AthCommonDataStore< AthCommonMsg< AlgTool > >::outputHandles ( ) const
overridevirtualinherited

Return this algorithm's output handles.

We override this to include handle instances from key arrays if they have not yet been declared. See comments on updateVHKA.

◆ overlap()

bool CP::IsolationCloseByCorrectionTool::overlap ( const xAOD::IParticle * particle,
const xAOD::IParticle * particle1,
float dR ) const

Definition at line 1048 of file IsolationCloseByCorrectionTool.cxx.

1048 {
1049 return (!isSame(P, P1) && deltaR2(P, P1) < (dR * dR));
1050 }

◆ particleName() [1/2]

std::string CP::IsolationCloseByCorrectionTool::particleName ( const xAOD::IParticle * C)
static

Definition at line 1075 of file IsolationCloseByCorrectionTool.cxx.

1075{ return particleName(C->type()); }

◆ particleName() [2/2]

std::string CP::IsolationCloseByCorrectionTool::particleName ( xAOD::Type::ObjectType T)
static

Definition at line 1076 of file IsolationCloseByCorrectionTool.cxx.

1076 {
1077 if (T == xAOD::Type::ObjectType::Electron) return "Electron";
1078 if (T == xAOD::Type::ObjectType::Photon) return "Photon";
1079 if (T == xAOD::Type::ObjectType::Muon) return "Muon";
1080 if (T == xAOD::Type::ObjectType::TrackParticle) return "Track";
1081 if (T == xAOD::Type::ObjectType::CaloCluster) return "Cluster";
1082 return "Unknown";
1083 }

◆ passFirstStage()

bool CP::IsolationCloseByCorrectionTool::passFirstStage ( const xAOD::TrackParticle * trk,
const xAOD::Vertex * vtx ) const
private

The Track particle has to pass the Track selection tool and the TTVA selection.

The latter only applies if there's no WP floating around using the legacy ptcone variables

Definition at line 501 of file IsolationCloseByCorrectionTool.cxx.

501 {
502 return trk && vtx && m_trkselTool->accept(*trk, vtx) && (!m_has_nonTTVA || m_ttvaTool->isCompatible(*trk, *vtx));
503 }

◆ passSelectionQuality()

bool CP::IsolationCloseByCorrectionTool::passSelectionQuality ( const xAOD::IParticle * particle) const
private

Definition at line 618 of file IsolationCloseByCorrectionTool.cxx.

618 {
619 if (!P) return false;
620 if (m_acc_quality && (!m_acc_quality->isAvailable(*P) || !(*m_acc_quality)(*P))) return false;
621 if (m_acc_passOR && (!m_acc_passOR->isAvailable(*P) || !(*m_acc_passOR)(*P))) return false;
622 return true;
623 }

◆ performCloseByCorrection()

CorrectionCode CP::IsolationCloseByCorrectionTool::performCloseByCorrection ( const EventContext & ctx,
ObjectCache & cache ) const
private

Definition at line 277 of file IsolationCloseByCorrectionTool.cxx.

277 {
278 if (cache.prim_vtx) {
279 // require a primary vertex for isolation correction - expect that if there is not primary vertex, then we only need to assure that the cache.not_sel_parts are treated correctly below
280 for (const xAOD::IParticle* particle : cache.prim_parts) {
281 ATH_MSG_DEBUG("Correct the isolation of particle "<<particleName(particle)<< " with pt: " << particle->pt() * MeVtoGeV << " GeV"
282 << " eta: " << particle->eta()
283 << " phi: " << particle->phi());
284
285 if (subtractCloseByContribution(ctx, particle, cache) == CorrectionCode::Error) {
286 ATH_MSG_ERROR("Failed to correct the isolation of particle with pt: " << particle->pt() * MeVtoGeV << " GeV"
287 << " eta: " << particle->eta()
288 << " phi: " << particle->phi());
290 }
291 if (m_dec_isoselection) (*m_dec_isoselection)(*particle) = bool(m_selectorTool->accept(*particle));
292 ATH_MSG_DEBUG("Corrected the isolation of particle with pt: " << particle->pt() * MeVtoGeV << " GeV"
293 << " eta: " << particle->eta()
294 << " phi: " << particle->phi());
295
296 }
297 }
298 else {
299 // Missing primary vertex - need to copy the uncorrected iso values
300 for (const xAOD::IParticle* particle : cache.prim_parts) {
301 ATH_MSG_DEBUG("Copy isolation values of particle with pt: " << particle->pt() * MeVtoGeV << " GeV"
302 << " eta: " << particle->eta()
303 << " phi: " << particle->phi());
305 ATH_MSG_ERROR("Failed to copy the isolation of particle with pt: " << particle->pt() * MeVtoGeV << " GeV"
306 << " eta: " << particle->eta()
307 << " phi: " << particle->phi());
309 }
310 }
311 }
312 // Only need to copy the uncorrected iso values
313 for (const xAOD::IParticle* particle : cache.not_sel_parts) {
314 ATH_MSG_DEBUG("Copy isolation values of particle with pt: " << particle->pt() * MeVtoGeV << " GeV"
315 << " eta: " << particle->eta()
316 << " phi: " << particle->phi());
318 ATH_MSG_ERROR("Failed to copy the isolation of particle with pt: " << particle->pt() * MeVtoGeV << " GeV"
319 << " eta: " << particle->eta()
320 << " phi: " << particle->phi());
322 }
323 }
324 return CorrectionCode::Ok;
325 }
CorrectionCode subtractCloseByContribution(const EventContext &ctx, const xAOD::IParticle *P, ObjectCache &cache) const
CorrectionCode copyIsoValuesForPartsNotSelected(const xAOD::IParticle *part) const
setBGCode setTAP setLVL2ErrorBits bool

◆ pflowDecors()

const caloDecorNames & CP::IsolationCloseByCorrectionTool::pflowDecors ( )
static

Definition at line 33 of file IsolationCloseByCorrectionTool.cxx.

33 {
34 static const caloDecorNames names =
35 {"IsoCloseByCorr_assocPflowEta", "IsoCloseByCorr_assocPflowPhi", "IsoCloseByCorr_assocPflowEnergy",
36 "IsoCloseByCorr_assocPflowDecor"};
37 return names;
38 }

◆ print()

◆ printIsolationCones()

void CP::IsolationCloseByCorrectionTool::printIsolationCones ( const IsoVector & types,
xAOD::Type::ObjectType T ) const
private

Definition at line 1107 of file IsolationCloseByCorrectionTool.cxx.

1107 {
1108 ATH_MSG_INFO("The following isolation cones are considered for " << particleName(T));
1109 for (const IsoType& cone : types) { ATH_MSG_INFO(" --- " << toString(cone)); }
1110 }

◆ renounce()

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 > AthCommonDataStore< AthCommonMsg< AlgTool > >::renounce ( T & h)
inlineprotectedinherited

Definition at line 368 of file AthCommonDataStore.h.

369 {
370 h.renounce();
372 }
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)

◆ renounceArray()

void AthCommonDataStore< AthCommonMsg< AlgTool > >::renounceArray ( SG::VarHandleKeyArray & handlesArray)
inlineprotectedinherited

remove all handles from I/O resolution

Definition at line 352 of file AthCommonDataStore.h.

352 {
354 }

◆ retrieveIDBestPrimaryVertex()

const xAOD::Vertex * CP::IsolationCloseByCorrectionTool::retrieveIDBestPrimaryVertex ( const EventContext & ctx) const

Definition at line 974 of file IsolationCloseByCorrectionTool.cxx.

974 {
975 SG::ReadHandle<xAOD::VertexContainer> Verticies{m_VtxKey, ctx};
976 if (!Verticies.isValid() || !Verticies->size()) {
977 ATH_MSG_WARNING("Failed to load vertex collection " << m_VtxKey.key());
978 return nullptr;
979 }
980 for (const xAOD::Vertex* V : *Verticies) {
981 if (V->vertexType() == xAOD::VxType::VertexType::PriVtx) {
982 ATH_MSG_VERBOSE("retrieveIDBestPrimaryVertex: vertex found ");
983 return V;
984 }
985 }
986 ATH_MSG_VERBOSE("retrieveIDBestPrimaryVertex: no vertex found ");
987 return nullptr;
988 }
@ PriVtx
Primary vertex.
Vertex_v1 Vertex
Define the latest version of the vertex class.

◆ subtractCloseByContribution()

CorrectionCode CP::IsolationCloseByCorrectionTool::subtractCloseByContribution ( const EventContext & ctx,
const xAOD::IParticle * P,
ObjectCache & cache ) const
private

Definition at line 380 of file IsolationCloseByCorrectionTool.cxx.

382 {
383 const IsoVector& types = getIsolationTypes(par);
384 if (types.empty()) {
385 ATH_MSG_WARNING("No isolation types are defiend for " << particleName(par));
387 }
388 for (const IsolationType iso_type : types) {
389 float iso_variable{0.f};
390 if (isTrackIso(iso_type)) {
391 if (getCloseByCorrectionTrackIso(par, iso_type, cache, iso_variable) == CorrectionCode::Error) {
392 ATH_MSG_ERROR("Failed to apply track correction");
394 }
395 } else if (isTopoEtIso(iso_type)) {
396 if (getCloseByCorrectionTopoIso(ctx, par, iso_type, cache, iso_variable) == CorrectionCode::Error) {
397 ATH_MSG_ERROR("Failed to apply topo cluster correction");
399 }
400 } else if (isPFlowIso(iso_type)) {
401 if (getCloseByCorrectionPflowIso(ctx, par, iso_type, cache, iso_variable) == CorrectionCode::Error) {
402 ATH_MSG_ERROR("Failed to apply pflow correction");
404 }
405 }
406 ATH_MSG_DEBUG("subtractCloseByContribution: Set pt, eta, phi " << par->pt() << ", " << par->eta() << ", " << par->phi() << " for " << toString(iso_type) << " to " << iso_variable);
407 std::lock_guard<std::mutex> guard{m_isoHelpersMutex};
408 if (m_isohelpers.at(iso_type)->setIsolation(par, iso_variable) == CorrectionCode::Error) {
409 ATH_MSG_ERROR("Cannot set " << toString(iso_type) << " to " << iso_variable);
410 return CorrectionCode::Error;
411 }
412 }
413 return CorrectionCode::Ok;
414 }

◆ sysInitialize()

virtual StatusCode AthCommonDataStore< AthCommonMsg< AlgTool > >::sysInitialize ( )
overridevirtualinherited

Perform system initialization for an algorithm.

We override this to declare all the elements of handle key arrays at the end of initialization. See comments on updateVHKA.

Reimplemented in asg::AsgMetadataTool, AthCheckedComponent< AthAlgTool >, and AthCheckedComponent<::AthAlgTool >.

◆ sysStart()

virtual StatusCode AthCommonDataStore< AthCommonMsg< AlgTool > >::sysStart ( )
overridevirtualinherited

Handle START transition.

We override this in order to make sure that conditions handle keys can cache a pointer to the conditions container.

◆ trackPtCut()

float CP::IsolationCloseByCorrectionTool::trackPtCut ( xAOD::Iso::IsolationType type)
static

Definition at line 1111 of file IsolationCloseByCorrectionTool.cxx.

1111 {
1112 if (!isTrackIso(type)) return -1;
1113 IsolationFlavour flavour = isolationFlavour(type);
1114 static const std::set<IsolationFlavour> Pt1000_Flavours{IsolationFlavour::ptcone_Nonprompt_All_MaxWeightTTVA_pt1000,
1115 IsolationFlavour::ptcone_Nonprompt_All_MaxWeightTTVALooseCone_pt1000,
1116 IsolationFlavour::ptvarcone_Nonprompt_All_MaxWeightTTVA_pt1000,
1117 IsolationFlavour::ptvarcone_Nonprompt_All_MaxWeightTTVALooseCone_pt1000};
1118 if (Pt1000_Flavours.count(flavour)) return 1000;
1119 return 500;
1120 }

◆ unCalibPt()

float CP::IsolationCloseByCorrectionTool::unCalibPt ( const xAOD::IParticle * particle) const
private

Definition at line 1000 of file IsolationCloseByCorrectionTool.cxx.

1000 {
1001 if (!P) {
1002 ATH_MSG_WARNING("No partcile given. Return stupidly big number. ");
1003 return 1.e25;
1004 }
1005 const xAOD::IParticle* OR = xAOD::getOriginalObject(*P);
1006 if (!OR) {
1007 ATH_MSG_VERBOSE("No reference from the shallow copy container of " << particleName(P) << " could be found");
1008 return P->pt();
1009 }
1010 return OR->pt();
1011 }
const IParticle * getOriginalObject(const IParticle &copy)
This function can be used to conveniently get a pointer back to the original object from which a copy...

◆ updateVHKA()

void AthCommonDataStore< AthCommonMsg< AlgTool > >::updateVHKA ( Gaudi::Details::PropertyBase & )
inlineinherited

Definition at line 298 of file AthCommonDataStore.h.

298 {
299 for (auto &a : m_vhka) {
301 for (auto k : keys) {
302 k->setOwner(this);
303 }
304 }
305 }
std::vector< SG::VarHandleKeyArray * > m_vhka

Member Data Documentation

◆ ATLAS_THREAD_SAFE [1/2]

std::mutex m_isoHelpersMutex CP::IsolationCloseByCorrectionTool::ATLAS_THREAD_SAFE
mutableprivate

Mutex to protect the map if the method with signature getCloseByCorrection(std::vector<float>& corrections, const xAOD::IParticle& par, const std::vector<xAOD::Iso::IsolationType>& types, const xAOD::IParticleContainer& closePar) is called.

Definition at line 312 of file IsolationCloseByCorrectionTool.h.

◆ ATLAS_THREAD_SAFE [2/2]

IsoHelperMap m_isohelpers CP::IsolationCloseByCorrectionTool::ATLAS_THREAD_SAFE
mutableprivate

Definition at line 307 of file IsolationCloseByCorrectionTool.h.

◆ m_acc_passOR

SelectionAccessor CP::IsolationCloseByCorrectionTool::m_acc_passOR {nullptr}
private

Definition at line 303 of file IsolationCloseByCorrectionTool.h.

303{nullptr};

◆ m_acc_quality

SelectionAccessor CP::IsolationCloseByCorrectionTool::m_acc_quality {nullptr}
private

Definition at line 302 of file IsolationCloseByCorrectionTool.h.

302{nullptr};

◆ m_backup_prefix

Gaudi::Property<std::string> CP::IsolationCloseByCorrectionTool::m_backup_prefix
private
Initial value:
{
this, "BackupPrefix", "", "Prefix in front of the isolation variables, if the original cone values need to be backuped"}

Definition at line 220 of file IsolationCloseByCorrectionTool.h.

220 {
221 this, "BackupPrefix", "", "Prefix in front of the isolation variables, if the original cone values need to be backuped"};

◆ m_CaloClusterKey

SG::ReadHandleKey<xAOD::CaloClusterContainer> CP::IsolationCloseByCorrectionTool::m_CaloClusterKey
private
Initial value:
{this, "CaloClusterContainer", "CaloCalTopoClusters",
"Name of the primary calo cluster container"}

Definition at line 282 of file IsolationCloseByCorrectionTool.h.

282 {this, "CaloClusterContainer", "CaloCalTopoClusters",
283 "Name of the primary calo cluster container"};

◆ m_caloDecSuffix

Gaudi::Property<std::string> CP::IsolationCloseByCorrectionTool::m_caloDecSuffix
private
Initial value:
{
this, "CaloDecSuffix", "", "Suffix added to output cluster variable names for close by corrections"}

Definition at line 225 of file IsolationCloseByCorrectionTool.h.

225 {
226 this, "CaloDecSuffix", "", "Suffix added to output cluster variable names for close by corrections"};

◆ m_caloExtTool

ToolHandle<Trk::IParticleCaloExtensionTool> CP::IsolationCloseByCorrectionTool::m_caloExtTool {this, "ParticleCaloExtensionTool", "Trk::ParticleCaloExtensionTool/ParticleCaloExtensionTool"}
private

calo extension tool for muon track particle extrapolation to calo

Definition at line 274 of file IsolationCloseByCorrectionTool.h.

274{this, "ParticleCaloExtensionTool", "Trk::ParticleCaloExtensionTool/ParticleCaloExtensionTool"};

◆ m_caloModel

Gaudi::Property<int> CP::IsolationCloseByCorrectionTool::m_caloModel {this, "CaloCorrectionModel", TopoConeCorrectionModel::SubtractObjectsDirectly}
private

EXPERT PROPERTIES.

Definition at line 229 of file IsolationCloseByCorrectionTool.h.

229{this, "CaloCorrectionModel", TopoConeCorrectionModel::SubtractObjectsDirectly};

◆ m_ConeSizeVariation

Gaudi::Property<float> CP::IsolationCloseByCorrectionTool::m_ConeSizeVariation
private
Initial value:
{
this, "ExtrapolationConeSize", 1.2,
"Constant factor to be multiplied on top of the topo-etcone size if the reference particle is not a calorimeter particle in "
"order to account for extrapolation effects"}

Definition at line 252 of file IsolationCloseByCorrectionTool.h.

252 {
253 this, "ExtrapolationConeSize", 1.2,
254 "Constant factor to be multiplied on top of the topo-etcone size if the reference particle is not a calorimeter particle in "
255 "order to account for extrapolation effects"}; // Extend - shrink the cone size to account for extrapolation effects

◆ m_coreConeEl

Gaudi::Property<float> CP::IsolationCloseByCorrectionTool::m_coreConeEl
private
Initial value:
{this, "CoreConeElectrons", 0.1,
"This is the size of the core cone for the topoetcone variables."}

Definition at line 232 of file IsolationCloseByCorrectionTool.h.

232 {this, "CoreConeElectrons", 0.1,
233 "This is the size of the core cone for the topoetcone variables."};

◆ m_coreConeMu

Gaudi::Property<float> CP::IsolationCloseByCorrectionTool::m_coreConeMu {this, "CoreConeMuons", 0.05, "This is the size of the core cone for the topoetcone variables."}
private

Definition at line 237 of file IsolationCloseByCorrectionTool.h.

237{this, "CoreConeMuons", 0.05, "This is the size of the core cone for the topoetcone variables."};

◆ m_dec_isoselection

SelectionDecorator CP::IsolationCloseByCorrectionTool::m_dec_isoselection {nullptr}
private

Definition at line 304 of file IsolationCloseByCorrectionTool.h.

304{nullptr};

◆ m_declareCaloDecors

Gaudi::Property<bool> CP::IsolationCloseByCorrectionTool::m_declareCaloDecors {this, "declareCaloDecors", false, "If set to true, the data dependency on the calo/pflow decors will be declared"}
private

Definition at line 257 of file IsolationCloseByCorrectionTool.h.

257{this, "declareCaloDecors", false, "If set to true, the data dependency on the calo/pflow decors will be declared"};

◆ m_detStore

StoreGateSvc_t AthCommonDataStore< AthCommonMsg< AlgTool > >::m_detStore
privateinherited

Pointer to StoreGate (detector store by default).

Definition at line 381 of file AthCommonDataStore.h.

◆ m_elecKeys

Gaudi::Property<std::vector<std::string> > CP::IsolationCloseByCorrectionTool::m_elecKeys
private
Initial value:
{
this, "EleContainers", {}, "Pipe the list of electron containers given later to the tool"}

Declare the data dependencies of the Input containers.

The isolation variables used in the working point calculation are declared to the avalanche scheduler. This is not needed for the AthAnalysis nor AnalysisBase releases.

Definition at line 262 of file IsolationCloseByCorrectionTool.h.

262 {
263 this, "EleContainers", {}, "Pipe the list of electron containers given later to the tool"};

◆ m_electron_isoTypes

IsoVector CP::IsolationCloseByCorrectionTool::m_electron_isoTypes {}
private

Isolation variables used by the electron working point.

Definition at line 289 of file IsolationCloseByCorrectionTool.h.

289{};

◆ m_evtStore

StoreGateSvc_t AthCommonDataStore< AthCommonMsg< AlgTool > >::m_evtStore
privateinherited

Pointer to StoreGate (event store by default).

Definition at line 378 of file AthCommonDataStore.h.

◆ m_has_nonTTVA

bool CP::IsolationCloseByCorrectionTool::m_has_nonTTVA {false}
private

Switch whether a pile-up non robust TTVA working point is defined.

Definition at line 293 of file IsolationCloseByCorrectionTool.h.

293{false};

◆ m_hasEtConeIso

bool CP::IsolationCloseByCorrectionTool::m_hasEtConeIso {false}
private

Switch whether a topoetcone isolation working point is defined.

Definition at line 297 of file IsolationCloseByCorrectionTool.h.

297{false};

◆ m_hasPflowIso

bool CP::IsolationCloseByCorrectionTool::m_hasPflowIso {false}
private

Switch whether a pflow isolation working point is defined.

Definition at line 295 of file IsolationCloseByCorrectionTool.h.

295{false};

◆ m_isInitialised

bool CP::IsolationCloseByCorrectionTool::m_isInitialised {false}
private

Definition at line 300 of file IsolationCloseByCorrectionTool.h.

300{false};

◆ m_isoDecSuffix

Gaudi::Property<std::string> CP::IsolationCloseByCorrectionTool::m_isoDecSuffix
private
Initial value:
{
this, "IsoDecSuffix", "", "Suffix added to output isolation variable names for close by corrections"}

Definition at line 223 of file IsolationCloseByCorrectionTool.h.

223 {
224 this, "IsoDecSuffix", "", "Suffix added to output isolation variable names for close by corrections"};

◆ m_isoSelection_name

Gaudi::Property<std::string> CP::IsolationCloseByCorrectionTool::m_isoSelection_name {this, "IsolationSelectionDecorator", "", "Name of the final isolation decorator."}
private

Definition at line 218 of file IsolationCloseByCorrectionTool.h.

218{this, "IsolationSelectionDecorator", "", "Name of the final isolation decorator."};

◆ m_isoVarKeys

SG::ReadDecorHandleKeyArray<xAOD::IParticleContainer> CP::IsolationCloseByCorrectionTool::m_isoVarKeys
private
Initial value:
{
this, "IsoVarKeys", {}, "The list is filled during the initialization"}

Definition at line 268 of file IsolationCloseByCorrectionTool.h.

268 {
269 this, "IsoVarKeys", {}, "The list is filled during the initialization"};

◆ m_isoWriteDecVarKeys

SG::WriteDecorHandleKeyArray<xAOD::IParticleContainer> CP::IsolationCloseByCorrectionTool::m_isoWriteDecVarKeys
private
Initial value:
{
this, "IsoWriteDecVarKeys", {}, "The list is filled during the initialization"}

Definition at line 270 of file IsolationCloseByCorrectionTool.h.

270 {
271 this, "IsoWriteDecVarKeys", {}, "The list is filled during the initialization"};

◆ m_maxTopoPolution

Gaudi::Property<float> CP::IsolationCloseByCorrectionTool::m_maxTopoPolution
private
Initial value:
{
this, "MaxClusterFrac", 1.1,
"Maximum energy fraction a single cluster can make up to be considered as contributed to the isolation"}

Definition at line 248 of file IsolationCloseByCorrectionTool.h.

248 {
249 this, "MaxClusterFrac", 1.1,
250 "Maximum energy fraction a single cluster can make up to be considered as contributed to the isolation"};

◆ m_muon_isoTypes

IsoVector CP::IsolationCloseByCorrectionTool::m_muon_isoTypes {}
private

Isolation variables used by the muon working point.

Definition at line 287 of file IsolationCloseByCorrectionTool.h.

287{};

◆ m_muonKeys

Gaudi::Property<std::vector<std::string> > CP::IsolationCloseByCorrectionTool::m_muonKeys
private
Initial value:
{
this, "MuoContainers", {}, "Pipe the list of muon containers given later to the tool"}

Definition at line 264 of file IsolationCloseByCorrectionTool.h.

264 {
265 this, "MuoContainers", {}, "Pipe the list of muon containers given later to the tool"};

◆ m_passOR_name

Gaudi::Property<std::string> CP::IsolationCloseByCorrectionTool::m_passOR_name
private
Initial value:
{this, "PassoverlapDecorator", "",
"Does the particle also need to pass the overlap removal?"}

Definition at line 216 of file IsolationCloseByCorrectionTool.h.

216 {this, "PassoverlapDecorator", "",
217 "Does the particle also need to pass the overlap removal?"};

◆ m_PflowKey

SG::ReadHandleKey<xAOD::FlowElementContainer> CP::IsolationCloseByCorrectionTool::m_PflowKey
private
Initial value:
{this, "PflowContainer", "CHSNeutralParticleFlowObjects",
"Name of the neutral pflow elements"}

Definition at line 284 of file IsolationCloseByCorrectionTool.h.

284 {this, "PflowContainer", "CHSNeutralParticleFlowObjects",
285 "Name of the neutral pflow elements"};

◆ m_photKeys

Gaudi::Property<std::vector<std::string> > CP::IsolationCloseByCorrectionTool::m_photKeys
private
Initial value:
{
this, "PhoContainers", {}, "Pipe the list of photon containers given later to the tool"}

Definition at line 266 of file IsolationCloseByCorrectionTool.h.

266 {
267 this, "PhoContainers", {}, "Pipe the list of photon containers given later to the tool"};

◆ m_photon_isoTypes

IsoVector CP::IsolationCloseByCorrectionTool::m_photon_isoTypes {}
private

Isolation variables used by the photon working point.

Definition at line 291 of file IsolationCloseByCorrectionTool.h.

291{};

◆ m_ptvarconeRadius

Gaudi::Property<float> CP::IsolationCloseByCorrectionTool::m_ptvarconeRadius {this, "PtvarconeRadius", 1.e4, "This is the kT parameter for the ptvarcone variables."}
private

Definition at line 241 of file IsolationCloseByCorrectionTool.h.

241{this, "PtvarconeRadius", 1.e4, "This is the kT parameter for the ptvarcone variables."};

◆ m_quality_name

Gaudi::Property<std::string> CP::IsolationCloseByCorrectionTool::m_quality_name
private
Initial value:
{
this, "SelectionDecorator", "",
"Name of the char auxdata defining whether the particle shall be considered for iso correction"}

Definition at line 213 of file IsolationCloseByCorrectionTool.h.

213 {
214 this, "SelectionDecorator", "",
215 "Name of the char auxdata defining whether the particle shall be considered for iso correction"};

◆ m_selectorTool

ToolHandle<CP::IIsolationSelectionTool> CP::IsolationCloseByCorrectionTool::m_selectorTool
private
Initial value:
{this, "IsolationSelectionTool", "",
"Please give me your configured IsolationSelectionTool!"}

Definition at line 208 of file IsolationCloseByCorrectionTool.h.

208 {this, "IsolationSelectionTool", "",
209 "Please give me your configured IsolationSelectionTool!"};

◆ m_trkselTool

ToolHandle<InDet::IInDetTrackSelectionTool> CP::IsolationCloseByCorrectionTool::m_trkselTool
private
Initial value:
{
this, "TrackSelectionTool", "", "TrackSelectionTool to select tracks which made it actually into the isolation"}

Definition at line 204 of file IsolationCloseByCorrectionTool.h.

204 {
205 this, "TrackSelectionTool", "", "TrackSelectionTool to select tracks which made it actually into the isolation"};

◆ m_ttvaTool

ToolHandle<CP::ITrackVertexAssociationTool> CP::IsolationCloseByCorrectionTool::m_ttvaTool
private
Initial value:
{this, "TTVASelectionTool", "",
"TTVASelectionTool to correct for the pile-up robust WPs"}

Definition at line 206 of file IsolationCloseByCorrectionTool.h.

206 {this, "TTVASelectionTool", "",
207 "TTVASelectionTool to correct for the pile-up robust WPs"};

◆ m_varHandleArraysDeclared

bool AthCommonDataStore< AthCommonMsg< AlgTool > >::m_varHandleArraysDeclared
privateinherited

Definition at line 387 of file AthCommonDataStore.h.

◆ m_vhka

std::vector<SG::VarHandleKeyArray*> AthCommonDataStore< AthCommonMsg< AlgTool > >::m_vhka
privateinherited

Definition at line 386 of file AthCommonDataStore.h.

◆ m_VtxKey

SG::ReadHandleKey<xAOD::VertexContainer> CP::IsolationCloseByCorrectionTool::m_VtxKey
private
Initial value:
{this, "VertexContainer", "PrimaryVertices",
"Name of the primary vertex container"}

Definition at line 280 of file IsolationCloseByCorrectionTool.h.

280 {this, "VertexContainer", "PrimaryVertices",
281 "Name of the primary vertex container"};

The documentation for this class was generated from the following files: