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::IParticleisoRefParticle (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::VertexretrieveIDBestPrimaryVertex (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 caloDecorNamescaloDecors ()
 Returns an array with the calo cluster decoration names [0]-> eta, [1]->phi, [2]->energy. [3]->isDecorated.
static const caloDecorNamespflowDecors ()
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< StoreGateSvcStoreGateSvc_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 IsoVectorgetIsolationTypes (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::IInDetTrackSelectionToolm_trkselTool
ToolHandle< CP::ITrackVertexAssociationToolm_ttvaTool
ToolHandle< CP::IIsolationSelectionToolm_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< intm_caloModel {this, "CaloCorrectionModel", TopoConeCorrectionModel::SubtractObjectsDirectly}
 EXPERT PROPERTIES.
Gaudi::Property< floatm_coreConeEl
Gaudi::Property< floatm_coreConeMu {this, "CoreConeMuons", 0.05, "This is the size of the core cone for the topoetcone variables."}
Gaudi::Property< floatm_ptvarconeRadius {this, "PtvarconeRadius", 1.e4, "This is the kT parameter for the ptvarcone variables."}
Gaudi::Property< floatm_maxTopoPolution
Gaudi::Property< floatm_ConeSizeVariation
Gaudi::Property< boolm_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::IParticleContainerm_isoVarKeys
SG::WriteDecorHandleKeyArray< xAOD::IParticleContainerm_isoWriteDecVarKeys
ToolHandle< Trk::IParticleCaloExtensionToolm_caloExtTool {this, "ParticleCaloExtensionTool", "Trk::ParticleCaloExtensionTool/ParticleCaloExtensionTool"}
 calo extension tool for muon track particle extrapolation to calo
SG::ReadHandleKey< xAOD::VertexContainerm_VtxKey
SG::ReadHandleKey< xAOD::CaloClusterContainerm_CaloClusterKey
SG::ReadHandleKey< xAOD::FlowElementContainerm_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 388 of file AthCommonDataStore.h.

Member Enumeration Documentation

◆ TopoConeCorrectionModel

Constructor & Destructor Documentation

◆ IsolationCloseByCorrectionTool()

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

Definition at line 40 of file IsolationCloseByCorrectionTool.cxx.

40: 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 927 of file IsolationCloseByCorrectionTool.cxx.

928 {
929 if (!m_isInitialised) { ATH_MSG_WARNING("The IsolationCloseByCorrectionTool was not initialised!!!"); }
930 assert(!m_selectorTool.empty());
931 const IsoVector& iso_types = getIsolationTypes(&x);
932 if (iso_types.empty()) {
933 // TODO: figure out if this is actually a valid situation
934 // or if we should just fail at this point.
935 ATH_MSG_WARNING("Could not cast particle for acceptCorrected. Will return false.");
936 static const asg::AcceptInfo dummyAcceptInfo = []() {
937 asg::AcceptInfo info;
938 info.addCut("castCut", "whether we managed to cast to a known type");
939 return info;
940 }();
941 if (m_dec_isoselection) (*m_dec_isoselection)(x) = false;
942 return asg::AcceptData(&dummyAcceptInfo);
943 }
944
945 if (closePar.empty()) return m_selectorTool->accept(x);
946 strObj strPar;
947 strPar.isolationValues.resize(numIsolationTypes);
948 strPar.pt = x.pt();
949 strPar.eta = x.eta();
950 strPar.type = x.type();
951 std::vector<float> corrections;
952 if (getCloseByCorrection(corrections, x, iso_types, closePar) == CorrectionCode::Error) {
953 ATH_MSG_WARNING("Could not calculate the corrections. acceptCorrected(x) is done without the corrections.");
954 if (m_dec_isoselection) (*m_dec_isoselection)(x) = bool(m_selectorTool->accept(x));
955 return m_selectorTool->accept(x);
956 }
957 for (unsigned int i = 0; i < iso_types.size(); ++i) {
958 strPar.isolationValues[iso_types[i]] = corrections[i];
959 const SG::AuxElement::Accessor<float>* acc = xAOD::getIsolationAccessor(iso_types.at(i));
960 float old = (*acc)(x);
961 ATH_MSG_DEBUG("Correcting " << toString(iso_types.at(i)) << " from " << old << " to " << corrections[i]);
962 }
963 auto accept = m_selectorTool->accept(strPar);
964 if (m_dec_isoselection) (*m_dec_isoselection)(x) = bool(accept);
965 return accept;
966 }
#define ATH_MSG_WARNING(x)
#define ATH_MSG_DEBUG(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)
std::string toString(const IsoType &iso)
const SG::AuxElement::Accessor< float > * getIsolationAccessor(Iso::IsolationType type)
Get the Accessor object for a given isolation type.
static const SG::AuxElement::Accessor< ElementLink< IParticleContainer > > acc("originalObjectLink")
Object used for setting/getting the dynamic decoration in question.

◆ 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 859 of file IsolationCloseByCorrectionTool.cxx.

859 {
860 phi = particle->phi();
861 eta = particle->eta();
862 energy = -1.;
863 if (particle->type() == xAOD::Type::ObjectType::Muon) {
864 const xAOD::Muon* mu = static_cast<const xAOD::Muon*>(particle);
865 const xAOD::CaloCluster* cluster = mu->cluster();
866 if (!cluster) return;
867 energy = cluster->e();
868 // At the moment no cluster associated with muons is in the derivations
869 int nSample{0};
870 float etaT{0.f}, phiT{0.f}, dphiT{0.f};
871
872 for (unsigned int i = 0; i < CaloSampling::Unknown; ++i) {
874 if (cluster->hasSampling(s)) {
875 ATH_MSG_VERBOSE("Sampling: " << i << "eta-phi (" << cluster->etaSample(s) << ", " << cluster->phiSample(s) << ")");
876 etaT += cluster->etaSample(s);
877 if (!nSample)
878 phiT = cluster->phiSample(s);
879 else
880 dphiT += xAOD::P4Helpers::deltaPhi(cluster->phiSample(s), phiT);
881 ++nSample;
882 }
883 }
884 if (!nSample) return;
885 ATH_MSG_DEBUG("Eta, phi before sampling: " << eta << ", " << phi << " and after sampling: " << etaT / nSample << ", "
886 << phiT / nSample);
887 phi = xAOD::P4Helpers::deltaPhi(phiT + dphiT / nSample, 0);
888 eta = etaT / nSample;
889 ATH_MSG_VERBOSE("associateCluster: mu with pt: " << mu->pt() * MeVtoGeV << " GeV, eta: "
890 << mu->eta() << ", phi: " << mu->phi() << " energy, eta, phi " << energy << ", " << eta << ", " << phi
891 << ", et " << energy * mu->pt() / mu->e());
892 }
893 if (!isEgamma(particle)) return;
894 const xAOD::Egamma* egamm = static_cast<const xAOD::Egamma*>(particle);
895 eta = phi = energy = 0.;
896 for (unsigned int cl = 0; cl < egamm->nCaloClusters(); ++cl) {
897 const xAOD::CaloCluster* prim_cluster = egamm->caloCluster(cl);
898 if (!prim_cluster) {
899 ATH_MSG_DEBUG("Cluster " << cl << " is not defined " << egamm);
900 continue;
901 }
902 std::vector<const xAOD::CaloCluster*> constituents = xAOD::EgammaHelpers::getAssociatedTopoClusters(prim_cluster);
903 for (const xAOD::CaloCluster* cluster : constituents) {
904 if (!cluster) continue;
905 const float clus_e = clusterEtMinusTile(cluster);
907 if (clus_e < MinClusterEnergy) continue;
908 eta += cluster->eta() * clus_e;
909 phi += cluster->phi() * clus_e;
910 energy += clus_e;
911 ATH_MSG_VERBOSE("associateCluster: eg add in clus with e: " << clus_e * MeVtoGeV << " clus et " << cluster->pt() * MeVtoGeV << " GeV, eta: "
912 << cluster->eta() << ", phi: " << cluster->phi());
913 }
914 }
915 if (energy >= MinClusterEnergy) {
916 phi = xAOD::P4Helpers::deltaPhi(phi / energy, 0.);
917 eta /= energy;
918 ATH_MSG_VERBOSE("associateCluster: eg with pt: " << egamm->pt() * MeVtoGeV << " GeV, eta: "
919 << egamm->eta() << ", phi: " << egamm->phi() << " energy, eta, phi " << energy << ", " << eta << ", " << phi );
920 } else {
921 ATH_MSG_DEBUG("Average energy from the clusters is too low " << energy << " copy particle properties");
922 eta = egamm->eta();
923 phi = egamm->phi();
924 energy = egamm->e();
925 }
926 }
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 835 of file IsolationCloseByCorrectionTool.cxx.

836 {
837 phi = eta = energy = 0.;
838 PflowSet flowCollection = getAssocFlowElements(ctx, particle);
839 if (flowCollection.empty()) {
840 phi = particle->phi();
841 eta = particle->eta();
842 return;
843 }
844 for (const FlowElementPtr& ele : flowCollection) {
845 const float flow_energy = ele->e() * ele.weight;
846 if (flow_energy < MinClusterEnergy) continue;
847 phi += ele->phi() * flow_energy;
848 eta += ele->eta() * flow_energy;
849 energy += flow_energy;
850 }
851 if (energy < MinClusterEnergy) {
852 phi = particle->phi();
853 eta = particle->eta();
854 return;
855 }
856 phi = xAOD::P4Helpers::deltaPhi(phi / energy, 0.);
857 eta /= energy;
858 }
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 25 of file IsolationCloseByCorrectionTool.cxx.

25 {
26 static const caloDecorNames names =
27 {"IsoCloseByCorr_assocClustEta", "IsoCloseByCorr_assocClustPhi", "IsoCloseByCorr_assocClustEnergy",
28 "IsoCloseByCorr_assocClustDecor"};
29 return names;
30 }
static const SG::AuxElement::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 1057 of file IsolationCloseByCorrectionTool.cxx.

1057 {
1058 float Et{0.f};
1059 if (cluster) {
1060 try {
1061 Et = cluster->p4(xAOD::CaloCluster::State::UNCALIBRATED).Et();
1062 Et = Et - cluster->eSample(xAOD::CaloCluster::CaloSample::TileGap3) /
1063 std::cosh(cluster->p4(xAOD::CaloCluster::State::UNCALIBRATED).Eta());
1064 } catch (...) { Et = cluster->p4().Et(); }
1065 }
1066 return std::max(Et, 0.f);
1067 }

◆ coneSize()

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

Definition at line 983 of file IsolationCloseByCorrectionTool.cxx.

983 {
985 float ConeDR = coneSize(Cone);
987 const xAOD::IParticle* Reference = isoRefParticle(P);
988 float MiniIso = m_ptvarconeRadius / unCalibPt(Reference);
989 if (MiniIso < ConeDR) return MiniIso;
990 }
991 return ConeDR;
992 }
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 414 of file IsolationCloseByCorrectionTool.cxx.

414 {
415 const IsoVector& types = getIsolationTypes(part);
416
417 ATH_MSG_DEBUG("copyIsoValuesForPartsNotSelected " << part->type() << " " << part->pt() * MeVtoGeV << " GeV" << " eta: " << part->eta() << " phi: " << part->phi());
418
419 if (types.empty()) {
420 ATH_MSG_WARNING("No isolation types are defiend for " << particleName(part));
422 }
423 for (const IsolationType iso_type : types) {
424 float iso_variable{0.f};
425 std::lock_guard<std::mutex> guard{m_isoHelpersMutex};
426 if (m_isohelpers.at(iso_type)->getIsolation(part, iso_variable) == CorrectionCode::Error) {
427 ATH_MSG_ERROR("Cannot get value for " << toString(iso_type));
428 return CorrectionCode::Error;
429 }
430 ATH_MSG_DEBUG("copyIsoValuesForPartsNotSelected: Set pt, eta " << part->pt() << ", " << part->eta() << ", " << part->phi() << " for " << toString(iso_type) << " to " << iso_variable);
431 if (m_isohelpers.at(iso_type)->setIsolation(part, iso_variable) == CorrectionCode::Error) {
432 ATH_MSG_ERROR("Cannot set " << toString(iso_type) << " to " << iso_variable);
433 return CorrectionCode::Error;
434 }
435 }
436 return CorrectionCode::Ok;
437 }
#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 123 of file IsolationCloseByCorrectionTool.cxx.

123 {
124 for (const std::string& cont : containers) {
125 for (const IsoType iso : types) {
126 // define read accessor iso variable keys
127 m_isoVarKeys.emplace_back(cont + "." + std::string(toString(iso)));
128 // define write decorator iso variable keys - needed for MT, but we do not use handles for writing the decorators in isoHelpers
129 m_isoWriteDecVarKeys.emplace_back(cont + "." + std::string(toString(iso) + (m_isoDecSuffix.empty() ? "" : "_") + m_isoDecSuffix));
130 }
133 for (const std::string& decor : pflowDecors()) m_isoVarKeys.emplace_back(cont + "." + decor);
134 }
136 for (const std::string& decor : caloDecors()) m_isoVarKeys.emplace_back(cont + "." + decor + m_caloDecSuffix);
137 }
138 }
139 }
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 1027 of file IsolationCloseByCorrectionTool.cxx.

1027 {
1028 if (isSame(P, P1)) return 0.;
1029 // Check if one of the objects is a CaloCluster or the Averaging over the clusters is requested.
1030 if (AvgCalo || (P->type() != P1->type() &&
1032 float phi1{0.f}, eta1{0.f}, eta2{0.f}, phi2{0.f};
1033 getExtrapEtaPhi(P, eta1, phi1);
1034 getExtrapEtaPhi(P1, eta2, phi2);
1035 return xAOD::P4Helpers::deltaR2(eta1, phi1, eta2, phi2);
1036 }
1037 float dPhi = xAOD::P4Helpers::deltaPhi(P, P1);
1038 float dEta = P->eta() - P1->eta();
1039 return dEta * dEta + dPhi * dPhi;
1040 }
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 184 of file IsolationCloseByCorrectionTool.cxx.

184 {
185 ObjectCache cache{};
186 cache.prim_parts = {particle};
187 loadAssociatedObjects(ctx, cache);
188 return cache.flows;
189 }
void loadAssociatedObjects(const EventContext &ctx, ObjectCache &cache) const
Load all associated tracks / clusters / flow elements into the cache.

◆ 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 191 of file IsolationCloseByCorrectionTool.cxx.

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

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

499 {
500 TrackSet to_return{};
501 if (P->type() == xAOD::Type::Muon) {
502 const xAOD::Muon* mu = static_cast<const xAOD::Muon*>(P);
503 if (mu->muonType() != xAOD::Muon::SiliconAssociatedForwardMuon)
504 to_return.emplace(mu->trackParticle(xAOD::Muon::TrackParticleType::InnerDetectorTrackParticle));
505 } else if (P->type() == xAOD::Type::TrackParticle) {
506 const xAOD::TrackParticle* trk = static_cast<const xAOD::TrackParticle*>(P);
507 to_return.emplace(trk);
508 } else if (isEgamma(P)) {
509 const xAOD::Egamma* EG = static_cast<const xAOD::Egamma*>(P);
510 std::set<const xAOD::TrackParticle*> trk_vec = xAOD::EgammaHelpers::getTrackParticles(EG, true, true);
511 for (const xAOD::TrackParticle* trk : trk_vec) {
512 ATH_MSG_VERBOSE("Adding egamma track with "
513 << trk->pt() * MeVtoGeV << " GeV, eta: " << trk->eta() << ", phi: " << trk->phi());
514 to_return.emplace(trk);
515 }
516 }
517 return to_return;
518 }
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.
@ 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 519 of file IsolationCloseByCorrectionTool.cxx.

519 {
520 const TrackSet assoc_tracks = getAssociatedTracks(P);
521 TrackSet to_ret{};
522 for (const TrackPtr trk : assoc_tracks) {
523 if (passFirstStage(trk, vtx)) to_ret.insert(trk);
524 }
525 return to_ret;
526 }
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 440 of file IsolationCloseByCorrectionTool.cxx.

442 {
443
444 if (!m_isInitialised) {
445 ATH_MSG_ERROR("The IsolationCloseByCorrectionTool was not initialised!!!");
447 }
449 {
450 std::lock_guard<std::mutex> guard{m_isoHelpersMutex};
451 for (const IsolationType& t : types) {
452 IsoHelperMap::const_iterator Itr = m_isohelpers.find(t);
453 if (Itr != m_isohelpers.end()) { continue; }
454 Itr = m_isohelpers.insert(std::make_pair(t, std::make_unique<IsoVariableHelper>(t, m_backup_prefix, m_isoDecSuffix))).first;
455 }
456 }
457 corrections.assign(types.size(), 0);
458 ObjectCache cache{};
459 loadPrimaryParticles(&closePar, cache);
460 const EventContext& ctx = Gaudi::Hive::currentContext();
461 loadAssociatedObjects(ctx, cache);
462 std::vector<float>::iterator Cone = corrections.begin();
463 for (const IsolationType& iso_type : types) {
464 {
465 std::lock_guard<std::mutex> guard{m_isoHelpersMutex};
466 IsoHelperMap::const_iterator Itr = m_isohelpers.find(iso_type);
467 if (Itr->second->backupIsolation(&par) == CP::CorrectionCode::Error) {
468 ATH_MSG_ERROR("Failed to backup isolation");
470 }
471 }
472 if (isTrackIso(iso_type)) {
473 if (getCloseByCorrectionTrackIso(&par, iso_type, cache, (*Cone)) == CorrectionCode::Error) {
474 ATH_MSG_ERROR("Failed to apply track correction");
476
477 }
478 }
479 else if (isTopoEtIso(iso_type)) {
480 if (getCloseByCorrectionTopoIso(ctx, &par, iso_type, cache, (*Cone)) == CorrectionCode::Error) {
481 ATH_MSG_ERROR("Failed to apply topo cluster correction");
483 }
484 }
485 else if (isPFlowIso(iso_type)) {
486 if (getCloseByCorrectionPflowIso(ctx, &par, iso_type, cache, (*Cone)) == CorrectionCode::Error) {
487 ATH_MSG_ERROR("Failed to apply pflow correction");
489 }
490 }
491 ++Cone;
492 }
493 return CorrectionCode::Ok;
494 }
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 662 of file IsolationCloseByCorrectionTool.cxx.

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

◆ 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 734 of file IsolationCloseByCorrectionTool.cxx.

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

620 {
621 if (!isTrackIso(type)) {
622 ATH_MSG_ERROR("Invalid isolation type " << toString(type));
624 }
625 {
626 std::lock_guard<std::mutex> guard{m_isoHelpersMutex};
627 IsoHelperMap::const_iterator Itr = m_isohelpers.find(type);
628 if (Itr == m_isohelpers.end() || Itr->second->getOriginalIsolation(par, isoValue) == CorrectionCode::Error) {
629 ATH_MSG_WARNING(__func__<<"() -- "<<__LINE__<<" Could not retrieve the isolation variable " << toString(type));
631 } else if (cache.tracks.empty())
632 return CorrectionCode::Ok;
633 }
634
635 float MaxDR = coneSize(par, type);
636 const TrackSet ToExclude = getAssociatedTracks(par);
637
638 const xAOD::IParticle* Ref = isoRefParticle(par);
639 ATH_MSG_VERBOSE(toString(type) << " of " << particleName(par) << " with pt: " << par->pt() * MeVtoGeV << " GeV, eta: " << par->eta()
640 << ", phi: " << par->phi() << " before correction: " << isoValue * MeVtoGeV << " GeV. "
641 << ToExclude.size() << " tracks will be excluded.");
642
643 for (const TrackPtr& poluting_trk : cache.tracks) {
644 // Checks for the Pile-up robust isolation WP's
645 if (poluting_trk->pt() < trackPtCut(type)) continue;
647 if (isTrackIsoTTVA(type) && m_has_nonTTVA && !m_ttvaTool->isCompatible(*poluting_trk, *cache.prim_vtx)) continue;
648
649 if (overlap(Ref, poluting_trk, MaxDR) && !ToExclude.count(poluting_trk)) {
650 ATH_MSG_VERBOSE("Subtract track with "
651 << poluting_trk->pt() * MeVtoGeV << " GeV, eta: " << poluting_trk->eta() << ", phi: " << poluting_trk->phi()
652 << " with dR: " << std::sqrt(deltaR2(Ref, poluting_trk)) << " from the isolation cone " << toString(type)
653 << " " << (isoValue * MeVtoGeV) << " GeV.");
654 isoValue -= poluting_trk->pt();
655 }
656 }
657 isoValue = std::max(0.f, isoValue);
658 ATH_MSG_VERBOSE(toString(type) << " of " << particleName(par) << " with pt: " << par->pt() * MeVtoGeV << " GeV, eta: " << par->eta()
659 << ", phi: " << par->phi() << " after correction: " << isoValue * MeVtoGeV << " GeV");
660 return CorrectionCode::Ok;
661 }
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 253 of file IsolationCloseByCorrectionTool.cxx.

257 {
258 if (!m_isInitialised) {
259 ATH_MSG_ERROR("The IsolationCloseByCorrectionTool was not initialised!!!");
261 }
262 ObjectCache cache{};
264 loadPrimaryParticles(electrons, cache);
265 loadPrimaryParticles(muons, cache);
266 loadPrimaryParticles(photons, cache);
267
268 loadAssociatedObjects(ctx, cache);
269 CorrectionCode ret = performCloseByCorrection(ctx, cache);
273 return ret;
274 }
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 221 of file IsolationCloseByCorrectionTool.cxx.

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

807 {
810 const CharAccessor acc_isDecor{caloDecors()[3] + m_caloDecSuffix};
811 if (par->type() != xAOD::Type::ObjectType::Muon) {
812 const xAOD::Egamma* egam = dynamic_cast<const xAOD::Egamma*>(par);
813 if( egam ) {
814 eta = egam->caloCluster()->eta();
815 phi = egam->caloCluster()->phi();
816 }
817 else {
818 eta = par->eta();
819 phi = par->phi();
820 }
821 } else if (acc_isDecor.isAvailable(*par) && acc_isDecor(*par)) {
822 eta = acc_assocEta(*par);
823 phi = acc_assocPhi(*par);
824 } else {
825 float assoc_ene{0.f};
828 const CharDecorator dec_isDecor{caloDecors()[3] + m_caloDecSuffix};
829 associateCluster(par,eta, phi, assoc_ene);
830 dec_assocEta(*par) = eta;
831 dec_assocPhi(*par) = phi;
832 dec_isDecor(*par) = true;
833 }
834 }
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 366 of file IsolationCloseByCorrectionTool.cxx.

366 {
367 static const IsoVector dummy{};
368 if (!particle) return dummy;
370 return m_electron_isoTypes;
371 else if (particle->type() == xAOD::Type::ObjectType::Muon)
372 return m_muon_isoTypes;
373 else if (particle->type() == xAOD::Type::ObjectType::Photon)
374 return m_photon_isoTypes;
375 return dummy;
376 }
@ 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::TEvent 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::TEvent, 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::TEvent 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::TEvent, 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 1054 of file IsolationCloseByCorrectionTool.cxx.

1054 {
1055 return getOriginalIsolation(&particle, type);
1056 }
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 1044 of file IsolationCloseByCorrectionTool.cxx.

1044 {
1045 std::lock_guard<std::mutex> guard{m_isoHelpersMutex};
1046 IsoHelperMap::const_iterator itr = m_isohelpers.find(isoVariable);
1047 float isovalue = 0;
1048 if (itr == m_isohelpers.end() || itr->second->getOriginalIsolation(particle, isovalue) == CorrectionCode::Error) {
1049 ATH_MSG_ERROR("Failed to retrieve the original isolation cone ");
1050 isovalue = FLT_MAX;
1051 }
1052 return isovalue;
1053 }

◆ 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 527 of file IsolationCloseByCorrectionTool.cxx.

527 {
529 }
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 42 of file IsolationCloseByCorrectionTool.cxx.

42 {
44 ATH_CHECK(m_selectorTool.retrieve());
48
52 if (!m_isoDecSuffix.empty()) ATH_MSG_INFO("IsoDecSuffix set to " << m_isoDecSuffix);
53 if (!m_quality_name.empty()) ATH_MSG_INFO("SelectionDecorator set to " << m_quality_name);
54
55
56#ifndef XAOD_ANALYSIS
61 ATH_CHECK(m_isoVarKeys.initialize());
62 ATH_CHECK(m_isoWriteDecVarKeys.initialize());
63 if (!m_caloExtTool.empty()) ATH_CHECK(m_caloExtTool.retrieve());
64 else {
65 ATH_MSG_WARNING("The ParticleCaloExtensionTool was not configured. Pleease include it!!!");
66 }
67#endif
68
69 ATH_CHECK(m_VtxKey.initialize());
72
73 // set default properties of track selection tool, if the user hasn't configured it
74 if (m_trkselTool.empty()) {
75 asg::AsgToolConfig config{"InDet::InDetTrackSelectionTool/TrackParticleSelectionTool"};
76 ATH_MSG_INFO("No TrackSelectionTool provided, so I will create and configure my own, called: " << config.name());
77 // The z0 cut is checked in any case either by the
78 // track to vertex association tool or by the tracking tool
79 ATH_CHECK(config.setProperty("maxZ0SinTheta", 3.));
80 // The minimum Pt requirement is lowered to 500 MeV because
81 // the Loose ttva cone variables accept very low-pt tracks
82 // https://gitlab.cern.ch/atlas/athena/blob/21.2/Reconstruction/RecoAlgs/IsolationAlgs/python/IsoUpdatedTrackCones.py#L21
83 ATH_CHECK(config.setProperty("minPt", 500.));
84 ATH_CHECK(config.setProperty("CutLevel", "Loose"));
85 ATH_CHECK(config.makePrivateTool(m_trkselTool));
86 }
88 if (m_ttvaTool.empty()) {
89 asg::AsgToolConfig config{"CP::TrackVertexAssociationTool/ttva_selection_tool"};
90 ATH_CHECK(config.setProperty("WorkingPoint", "Nonprompt_All_MaxWeight"));
91 ATH_CHECK(config.makePrivateTool(m_ttvaTool));
92 }
93 ATH_CHECK(m_trkselTool.retrieve());
94 ATH_CHECK(m_ttvaTool.retrieve());
95
96 if (!m_quality_name.empty()) m_acc_quality = std::make_unique<CharAccessor>(m_quality_name);
97 if (!m_passOR_name.empty()) m_acc_passOR = std::make_unique<CharAccessor>(m_passOR_name);
98 if (!m_isoSelection_name.empty()) m_dec_isoselection = std::make_unique<CharDecorator>(m_isoSelection_name);
99 m_isInitialised = true;
100 return StatusCode::SUCCESS;
101 }
#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 530 of file IsolationCloseByCorrectionTool.cxx.

530 {
531 return P && (P->type() == xAOD::Type::ObjectType::Electron || P->type() == xAOD::Type::ObjectType::Photon);
532 }

◆ isFixedTrackIso()

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

Definition at line 1077 of file IsolationCloseByCorrectionTool.cxx.

1077{ 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 1083 of file IsolationCloseByCorrectionTool.cxx.

1083 {
1084 IsolationFlavour flavour = isolationFlavour(type);
1085 static const std::set<IsolationFlavour> ttvaFlavours{IsolationFlavour::ptcone_Nonprompt_All_MaxWeightTTVA_pt500,
1086 IsolationFlavour::ptcone_Nonprompt_All_MaxWeightTTVA_pt1000,
1087 IsolationFlavour::ptcone_Nonprompt_All_MaxWeightTTVALooseCone_pt500,
1088 IsolationFlavour::ptcone_Nonprompt_All_MaxWeightTTVALooseCone_pt1000};
1089 return ttvaFlavours.count(flavour);
1090 }
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 1006 of file IsolationCloseByCorrectionTool.cxx.

1006 {
1007 if (!P) {
1008 ATH_MSG_ERROR("Nullptr given");
1009 return nullptr;
1010 }
1011 // Use for muons the associated ID track. Else the particle itself
1012 if (P->type() == xAOD::Type::ObjectType::Muon) {
1013 const xAOD::Muon* muon = static_cast<const xAOD::Muon*>(P);
1014 const xAOD::TrackParticle* idTrk = muon->trackParticle(xAOD::Muon::TrackParticleType::InnerDetectorTrackParticle);
1015 return idTrk ? idTrk : muon->primaryTrackParticle();
1016 }
1017 return P;
1018 }

◆ 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 102 of file IsolationCloseByCorrectionTool.cxx.

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

◆ isPFlowIso()

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

Definition at line 1114 of file IsolationCloseByCorrectionTool.cxx.

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

◆ isSame()

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

Definition at line 1019 of file IsolationCloseByCorrectionTool.cxx.

1019 {
1020 if (!P || !P1) {
1021 ATH_MSG_WARNING("Nullptr were given");
1022 return true;
1023 }
1024 return (P == P1);
1025 }

◆ isTopoEtIso()

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

Definition at line 1082 of file IsolationCloseByCorrectionTool.cxx.

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

◆ isTrackIso()

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

Definition at line 1079 of file IsolationCloseByCorrectionTool.cxx.

1079 {
1080 return isVarTrackIso(type) || isFixedTrackIso(type) || isTrackIsoTTVA(type);
1081 }
static bool isFixedTrackIso(xAOD::Iso::IsolationType type)

◆ isTrackIsoTTVA()

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

Definition at line 1099 of file IsolationCloseByCorrectionTool.cxx.

1099{ 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 1078 of file IsolationCloseByCorrectionTool.cxx.

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

◆ isVarTrackIsoTTVA()

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

Definition at line 1091 of file IsolationCloseByCorrectionTool.cxx.

1091 {
1092 IsolationFlavour flavour = isolationFlavour(type);
1093 static const std::set<IsolationFlavour> ttvaFlavours{IsolationFlavour::ptvarcone_Nonprompt_All_MaxWeightTTVA_pt500,
1094 IsolationFlavour::ptvarcone_Nonprompt_All_MaxWeightTTVA_pt1000,
1095 IsolationFlavour::ptvarcone_Nonprompt_All_MaxWeightTTVALooseCone_pt500,
1096 IsolationFlavour::ptvarcone_Nonprompt_All_MaxWeightTTVALooseCone_pt1000};
1097 return ttvaFlavours.count(flavour);
1098 }

◆ loadAssociatedObjects()

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

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

Definition at line 167 of file IsolationCloseByCorrectionTool.cxx.

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

◆ 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 141 of file IsolationCloseByCorrectionTool.cxx.

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

◆ lockDecorations()

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

Definition at line 324 of file IsolationCloseByCorrectionTool.cxx.

325 {
326 if (!parts) return;
327
330 const CharDecorator dec_isDecor{caloDecors()[3] + m_caloDecSuffix};
331
332 std::lock_guard<std::mutex> guard{m_isoHelpersMutex};
333
334 if (parts->ownPolicy() == SG::VIEW_ELEMENTS) {
336 for (const xAOD::IParticle* part : *parts) {
337 const SG::AuxVectorData* c = part->container();
338 if (conts.insert(c).second) {
339 for (const IsoType t : isoTypes) {
340 auto it = m_isohelpers.find (t);
341 if (it != m_isohelpers.end())
342 it->second->lockDecorations(*part->container());
343 }
344 SG::AuxVectorData* c_nc ATLAS_THREAD_SAFE =
345 const_cast<SG::AuxVectorData*> (c);
346 c_nc->lockDecoration (dec_assocEta.auxid());
347 c_nc->lockDecoration (dec_assocPhi.auxid());
348 c_nc->lockDecoration (dec_isDecor.auxid());
349 }
350 }
351 }
352
353 else {
354 for (const IsoType t : isoTypes) {
355 auto it = m_isohelpers.find (t);
356 if (it != m_isohelpers.end())
357 it->second->lockDecorations(*parts);
358 }
359 SG::AuxVectorData* c_nc ATLAS_THREAD_SAFE =
360 const_cast<xAOD::IParticleContainer*> (parts);
361 c_nc->lockDecoration (dec_assocEta.auxid());
362 c_nc->lockDecoration (dec_assocPhi.auxid());
363 c_nc->lockDecoration (dec_isDecor.auxid());
364 }
365 }
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 1041 of file IsolationCloseByCorrectionTool.cxx.

1041 {
1042 return (!isSame(P, P1) && deltaR2(P, P1) < (dR * dR));
1043 }

◆ particleName() [1/2]

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

Definition at line 1068 of file IsolationCloseByCorrectionTool.cxx.

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

◆ particleName() [2/2]

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

Definition at line 1069 of file IsolationCloseByCorrectionTool.cxx.

1069 {
1070 if (T == xAOD::Type::ObjectType::Electron) return "Electron";
1071 if (T == xAOD::Type::ObjectType::Photon) return "Photon";
1072 if (T == xAOD::Type::ObjectType::Muon) return "Muon";
1073 if (T == xAOD::Type::ObjectType::TrackParticle) return "Track";
1074 if (T == xAOD::Type::ObjectType::CaloCluster) return "Cluster";
1075 return "Unknown";
1076 }

◆ 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 496 of file IsolationCloseByCorrectionTool.cxx.

496 {
497 return trk && vtx && m_trkselTool->accept(*trk, vtx) && (!m_has_nonTTVA || m_ttvaTool->isCompatible(*trk, *vtx));
498 }

◆ passSelectionQuality()

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

Definition at line 613 of file IsolationCloseByCorrectionTool.cxx.

613 {
614 if (!P) return false;
615 if (m_acc_quality && (!m_acc_quality->isAvailable(*P) || !(*m_acc_quality)(*P))) return false;
616 if (m_acc_passOR && (!m_acc_passOR->isAvailable(*P) || !(*m_acc_passOR)(*P))) return false;
617 return true;
618 }

◆ performCloseByCorrection()

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

Definition at line 275 of file IsolationCloseByCorrectionTool.cxx.

275 {
276 if (cache.prim_vtx) {
277 // 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
278 for (const xAOD::IParticle* particle : cache.prim_parts) {
279 ATH_MSG_DEBUG("Correct the isolation of particle "<<particleName(particle)<< " with pt: " << particle->pt() * MeVtoGeV << " GeV"
280 << " eta: " << particle->eta()
281 << " phi: " << particle->phi());
282
283 if (subtractCloseByContribution(ctx, particle, cache) == CorrectionCode::Error) {
284 ATH_MSG_ERROR("Failed to correct the isolation of particle with pt: " << particle->pt() * MeVtoGeV << " GeV"
285 << " eta: " << particle->eta()
286 << " phi: " << particle->phi());
288 }
289 if (m_dec_isoselection) (*m_dec_isoselection)(*particle) = bool(m_selectorTool->accept(*particle));
290 ATH_MSG_DEBUG("Corrected the isolation of particle with pt: " << particle->pt() * MeVtoGeV << " GeV"
291 << " eta: " << particle->eta()
292 << " phi: " << particle->phi());
293
294 }
295 }
296 else {
297 // Missing primary vertex - need to copy the uncorrected iso values
298 for (const xAOD::IParticle* particle : cache.prim_parts) {
299 ATH_MSG_DEBUG("Copy isolation values of particle with pt: " << particle->pt() * MeVtoGeV << " GeV"
300 << " eta: " << particle->eta()
301 << " phi: " << particle->phi());
303 ATH_MSG_ERROR("Failed to copy the isolation of particle with pt: " << particle->pt() * MeVtoGeV << " GeV"
304 << " eta: " << particle->eta()
305 << " phi: " << particle->phi());
307 }
308 }
309 }
310 // Only need to copy the uncorrected iso values
311 for (const xAOD::IParticle* particle : cache.not_sel_parts) {
312 ATH_MSG_DEBUG("Copy isolation values of particle with pt: " << particle->pt() * MeVtoGeV << " GeV"
313 << " eta: " << particle->eta()
314 << " phi: " << particle->phi());
316 ATH_MSG_ERROR("Failed to copy the isolation of particle with pt: " << particle->pt() * MeVtoGeV << " GeV"
317 << " eta: " << particle->eta()
318 << " phi: " << particle->phi());
320 }
321 }
322 return CorrectionCode::Ok;
323 }
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 31 of file IsolationCloseByCorrectionTool.cxx.

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

◆ print()

◆ printIsolationCones()

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

Definition at line 1100 of file IsolationCloseByCorrectionTool.cxx.

1100 {
1101 ATH_MSG_INFO("The following isolation cones are considered for " << particleName(T));
1102 for (const IsoType& cone : types) { ATH_MSG_INFO(" --- " << toString(cone)); }
1103 }

◆ 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 380 of file AthCommonDataStore.h.

381 {
382 h.renounce();
384 }
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 364 of file AthCommonDataStore.h.

364 {
366 }

◆ retrieveIDBestPrimaryVertex()

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

Definition at line 967 of file IsolationCloseByCorrectionTool.cxx.

967 {
968 SG::ReadHandle<xAOD::VertexContainer> Verticies{m_VtxKey, ctx};
969 if (!Verticies.isValid() || !Verticies->size()) {
970 ATH_MSG_WARNING("Failed to load vertex collection " << m_VtxKey.key());
971 return nullptr;
972 }
973 for (const xAOD::Vertex* V : *Verticies) {
974 if (V->vertexType() == xAOD::VxType::VertexType::PriVtx) {
975 ATH_MSG_VERBOSE("retrieveIDBestPrimaryVertex: vertex found ");
976 return V;
977 }
978 }
979 ATH_MSG_VERBOSE("retrieveIDBestPrimaryVertex: no vertex found ");
980 return nullptr;
981 }
@ 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 378 of file IsolationCloseByCorrectionTool.cxx.

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

◆ 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 >, AthCheckedComponent<::AthAlgTool >, and DerivationFramework::CfAthAlgTool.

◆ 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 1104 of file IsolationCloseByCorrectionTool.cxx.

1104 {
1105 if (!isTrackIso(type)) return -1;
1106 IsolationFlavour flavour = isolationFlavour(type);
1107 static const std::set<IsolationFlavour> Pt1000_Flavours{IsolationFlavour::ptcone_Nonprompt_All_MaxWeightTTVA_pt1000,
1108 IsolationFlavour::ptcone_Nonprompt_All_MaxWeightTTVALooseCone_pt1000,
1109 IsolationFlavour::ptvarcone_Nonprompt_All_MaxWeightTTVA_pt1000,
1110 IsolationFlavour::ptvarcone_Nonprompt_All_MaxWeightTTVALooseCone_pt1000};
1111 if (Pt1000_Flavours.count(flavour)) return 1000;
1112 return 500;
1113 }

◆ unCalibPt()

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

Definition at line 993 of file IsolationCloseByCorrectionTool.cxx.

993 {
994 if (!P) {
995 ATH_MSG_WARNING("No partcile given. Return stupidly big number. ");
996 return 1.e25;
997 }
998 const xAOD::IParticle* OR = xAOD::getOriginalObject(*P);
999 if (!OR) {
1000 ATH_MSG_VERBOSE("No reference from the shallow copy container of " << particleName(P) << " could be found");
1001 return P->pt();
1002 }
1003 return OR->pt();
1004 }
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 308 of file AthCommonDataStore.h.

308 {
309 // debug() << "updateVHKA for property " << p.name() << " " << p.toString()
310 // << " size: " << m_vhka.size() << endmsg;
311 for (auto &a : m_vhka) {
313 for (auto k : keys) {
314 k->setOwner(this);
315 }
316 }
317 }
std::vector< SG::VarHandleKeyArray * > m_vhka

Member Data Documentation

◆ ATLAS_THREAD_SAFE [1/2]

IsoHelperMap m_isohelpers CP::IsolationCloseByCorrectionTool::ATLAS_THREAD_SAFE
mutableprivate

Definition at line 307 of file IsolationCloseByCorrectionTool.h.

◆ ATLAS_THREAD_SAFE [2/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.

◆ 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 393 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 390 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 399 of file AthCommonDataStore.h.

◆ m_vhka

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

Definition at line 398 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: