ATLAS Offline Software
Loading...
Searching...
No Matches
PFSubtractionTool Class Reference

#include <PFSubtractionTool.h>

Inheritance diagram for PFSubtractionTool:
Collaboration diagram for PFSubtractionTool:

Public Member Functions

 PFSubtractionTool (const std::string &type, const std::string &name, const IInterface *parent)
 ~PFSubtractionTool ()
StatusCode initialize ()
void execute (eflowCaloObjectContainer *theEflowCaloObjectContainer, eflowRecTrackContainer *recTrackContainer, eflowRecClusterContainer *recClusterContainer) const
StatusCode finalize ()

Private Member Functions

unsigned int matchAndCreateEflowCaloObj (PFData &data) const
 This matches ID tracks and CaloClusters, and then creates eflowCaloObjects.
void performSubtraction (const unsigned int &startingPoint, PFData &data) const
void performSubtraction (eflowCaloObject &thisEflowCaloObject) const
void performTruthSubtraction (PFData &data) const
void performTruthSubtraction (eflowCaloObject &thisEflowCaloObject) const
bool isEOverPFail (double expectedEnergy, double sigma, double clusterEnergy) const
bool canAnnihilate (double expectedEnergy, double sigma, double clusterEnergy) const
void printAllClusters (const eflowRecClusterContainer &recClusterContainer) const
void addSubtractedCells (eflowCaloObject &thisEflowCaloObject, const std::vector< std::pair< xAOD::CaloCluster *, bool > > &clusterList) const

Static Private Member Functions

static std::string printTrack (const xAOD::TrackParticle *track)
static std::string printCluster (const xAOD::CaloCluster *cluster)

Private Attributes

ToolHandle< IEFlowCellEOverPToolm_theEOverPTool {this, "eflowCellEOverPTool", "eflowCellEOverPTool", "Energy Flow E/P Values and Shower Parameters Tool"}
 Tool for getting e/p values and hadronic shower cell ordering principle parameters.
std::unique_ptr< eflowEEtaBinnedParametersm_binnedParameters
std::unique_ptr< PFMatch::TrackEtaPhiInFixedLayersProviderm_trkpos
 Track position provider to be used to preselect clusters.
ToolHandle< PFTrackClusterMatchingToolm_theMatchingTool {this, "PFTrackClusterMatchingTool", "PFTrackClusterMatchingTool/CalObjBldMatchingTool", "The track-cluster matching tool"}
 Default track-cluster matching tool.
ToolHandle< PFTrackClusterMatchingToolm_theMatchingToolForPull_015 {this, "PFTrackClusterMatchingTool_015", "PFTrackClusterMatchingTool/PFPullMatchingTool_015", "The 0.15 track-cluster matching tool to calculate the pull"}
ToolHandle< PFTrackClusterMatchingToolm_theMatchingToolForPull_02 {this, "PFTrackClusterMatchingTool_02", "PFTrackClusterMatchingTool/PFPullMatchingTool_02", "The 0.2 track-cluster matching tool to calculate the pull"}
Gaudi::Property< bool > m_recoverSplitShowers {this,"RecoverSplitShowers",false,"Toggle whether we are recovering split showers or not"}
 Toggle whether we are recovering split showers or not.
Gaudi::Property< int > m_nClusterMatchesToUse {this, "nClusterMatchesToUse", 1, "Number of clusters to match to each track"}
 Number of clusters to match to each track if not doing recover split shower subtraction.
Gaudi::Property< bool > m_isHLLHC {this, "isHLLHC", false, "Toggle whether we have the HLLHC setup"}
 Toggle whether we have the HLLHC setup.
Gaudi::Property< bool > m_calcEOverP {this, "CalcEOverP", false, "Toggle EOverP algorithm mode, whereby no charged shower subtraction is performed"}
 Toggle EOverP algorithm mode, whereby no charged shower subtraction is performed.
Gaudi::Property< double > m_consistencySigmaCut {this, "ConsistencySigmaCut", 1.0, "Parameter that controls whether a track, in a track-cluster system, will be processed by the split shower recovery algorithm"}
 Parameter that controls whether a track, in a track-cluster system, will be processed by the split shower recovery algorithm.
Gaudi::Property< double > m_subtractionSigmaCut {this, "SubtractionSigmaCut", 1.5, "Parameter that controls whether to use retain remaining calorimeter energy in track-cluster system, after charged shower subtraction"}
 Parameter that controls whether to use retain remaining calorimeter energy in track-cluster system, after charged shower subtraction.
Gaudi::Property< bool > m_addCPData {this,"addCPData",false,"Toggle whether to decorate FlowElements with addutional data for Combined Performance studies "}
 Toggle whether to decorate eflowRecTrack with addutional data for Combined Performance studies.
PFSubtractionStatusSetter m_pfSubtractionStatusSetter {}
PFSubtractionEnergyRatioCalculator m_pfSubtractionEnergyRatioCalculator {}
eflowSubtract::Subtractor m_subtractor {}
ToolHandle< PFEnergyPredictorToolm_NNEnergyPredictorTool {this, "NNEnergyPredictorTool", "","Tool for getting predictiing the energy using an ONNX model "}
 Tool for getting predictiing the energy using an ONNX model.
Gaudi::Property< bool > m_useNNEnergy {this, "useNNEnergy", false, "Toggle whether we use the neural net energy"}
 Toggle whether we use the neural net energy.
Gaudi::Property< bool > m_useTruthMatching {this, "useTrackClusterTruthMatching", false, "Toggle whether to cheat and use truth information for track-cluster matching"}
 Toggle whether to cheat and use truth information for track-cluster matching - only for performance studies!
Gaudi::Property< bool > m_useTruthForChargedShowerSubtraction {this, "useTruthForChargedShowerSubtraction", false, "Toggle whether we use truth information for the charged shower subtraction or not"}
 Toggle whether we use truth information for the charged shower subtraction or not.
Gaudi::Property< bool > m_useFullCellTruthSubtraction {this,"useFullCellTruthSubtraction",true,"Toggle whether we fully remove a cell with a truth deposit or reweight it based on truth contribution"}
 Toggle whether we fully remove a cell with a truth deposit or reweight it based on truth contribution.
ToolHandle< PFSimulateTruthShowerToolm_theTruthShowerSimulator {this, "PFSimulateTruthShowerTool", "", "The truth shower simulator"}
SG::ReadDecorHandleKey< xAOD::CaloClusterContainerm_caloClusterReadDecorHandleKeyNLeadingTruthParticles {this,"CaloClusterReadDecorHandleKey_NLeadingTruthParticles",""}
 Read handle key to decorate CaloCluster with threeN leading truth particle uniqueID and energy.
Gaudi::Property< bool > m_useLegacyEBinIndex {this, "useLegacyEBinIndex", true, "Toggle whether we use the legacy energy bin index"}
 Further discussion about why this flag exists can be found in https://its.cern.ch/jira/browse/ATLJETMET-1692 and https://indico.cern.ch/event/1388633/contributions/5837876/attachments/2809591/4903439/PFlow_EOverP_Feb2024.pdf The Jira report discusses assorted problems with the treatment of energy bin indexes for the lookup of e/p values.

Detailed Description

Definition at line 31 of file PFSubtractionTool.h.

Constructor & Destructor Documentation

◆ PFSubtractionTool()

PFSubtractionTool::PFSubtractionTool ( const std::string & type,
const std::string & name,
const IInterface * parent )

Definition at line 23 of file PFSubtractionTool.cxx.

23 : base_class(type, name, parent),
24 m_binnedParameters(std::make_unique<eflowEEtaBinnedParameters>())
25{
26}
std::unique_ptr< eflowEEtaBinnedParameters > m_binnedParameters

◆ ~PFSubtractionTool()

PFSubtractionTool::~PFSubtractionTool ( )
default

Member Function Documentation

◆ addSubtractedCells()

void PFSubtractionTool::addSubtractedCells ( eflowCaloObject & thisEflowCaloObject,
const std::vector< std::pair< xAOD::CaloCluster *, bool > > & clusterList ) const
private

Definition at line 604 of file PFSubtractionTool.cxx.

604 {
605
606 unsigned int numTracks = thisEflowCaloObject.nTracks();
607
608 for (unsigned int iTrack = 0; iTrack < numTracks; ++iTrack){
609 eflowRecTrack* thisTrack = thisEflowCaloObject.efRecTrack(iTrack);
610 for (auto thisPair : clusterList){
611 xAOD::CaloCluster* thisCluster = thisPair.first;
612 const CaloClusterCellLink* theCellLink = thisCluster->getCellLinks();
613 CaloClusterCellLink::const_iterator theCell = theCellLink->begin();
614 CaloClusterCellLink::const_iterator lastCell = theCellLink->end();
615 for (; theCell != lastCell; ++theCell) thisTrack->addSubtractedCaloCell(ElementLink<CaloCellContainer>("AllCalo",theCell.index()),theCell.weight()/numTracks);
616 }
617 }
618}
const eflowRecTrack * efRecTrack(int i) const
unsigned nTracks() const
void addSubtractedCaloCell(ElementLink< CaloCellContainer > theCellLink, const double &weight)
const CaloClusterCellLink * getCellLinks() const
Get a pointer to the CaloClusterCellLink object (const version)
CaloCluster_v1 CaloCluster
Define the latest version of the calorimeter cluster class.

◆ canAnnihilate()

bool PFSubtractionTool::canAnnihilate ( double expectedEnergy,
double sigma,
double clusterEnergy ) const
private

Definition at line 572 of file PFSubtractionTool.cxx.

573{
574 return clusterEnergy - expectedEnergy < m_subtractionSigmaCut * sigma;
575}
Gaudi::Property< double > m_subtractionSigmaCut
Parameter that controls whether to use retain remaining calorimeter energy in track-cluster system,...

◆ execute()

void PFSubtractionTool::execute ( eflowCaloObjectContainer * theEflowCaloObjectContainer,
eflowRecTrackContainer * recTrackContainer,
eflowRecClusterContainer * recClusterContainer ) const

Definition at line 66 of file PFSubtractionTool.cxx.

67{
68
69 ATH_MSG_DEBUG("Executing");
70
71 PFData data;
72 data.caloObjects = theEflowCaloObjectContainer;
73 const PFTrackFiller pfTrackFiller;
76
77 const PFClusterFiller pfClusterFiller;
80
81 ATH_MSG_DEBUG("This event has " << data.tracks.size() << " tracks " << data.clusters.size() << " clusters ");
82
83 unsigned int numMatches = matchAndCreateEflowCaloObj(data);
84
85 if (msgLvl(MSG::DEBUG)) printAllClusters(*recClusterContainer);
86
87 if (!m_calcEOverP){
90 else performSubtraction(numMatches,data);
91 }
93 }
94 //eoverp mode calculation has been moved to a dedicated PFBaseTool.
95
96}
#define ATH_MSG_DEBUG(x)
char data[hepevt_bytes_allocation_ATLAS]
Definition HepEvt.cxx:11
static void fillClustersToRecover(PFData &data)
static void fillClustersToConsider(PFData &data, eflowRecClusterContainer &recClusterContainer)
void performTruthSubtraction(PFData &data) const
void printAllClusters(const eflowRecClusterContainer &recClusterContainer) const
void performSubtraction(const unsigned int &startingPoint, PFData &data) const
unsigned int matchAndCreateEflowCaloObj(PFData &data) const
This matches ID tracks and CaloClusters, and then creates eflowCaloObjects.
Gaudi::Property< bool > m_calcEOverP
Toggle EOverP algorithm mode, whereby no charged shower subtraction is performed.
Gaudi::Property< bool > m_useTruthForChargedShowerSubtraction
Toggle whether we use truth information for the charged shower subtraction or not.
Gaudi::Property< bool > m_recoverSplitShowers
Toggle whether we are recovering split showers or not.
static void fillTracksToConsider(PFData &data, eflowRecTrackContainer &recTrackContainer)
static void fillTracksToRecover(PFData &data)

◆ finalize()

StatusCode PFSubtractionTool::finalize ( )

Definition at line 620 of file PFSubtractionTool.cxx.

620{ return StatusCode::SUCCESS; }

◆ initialize()

StatusCode PFSubtractionTool::initialize ( )

Definition at line 31 of file PFSubtractionTool.cxx.

32{
33
34 ATH_CHECK(m_theEOverPTool.retrieve());
35
36 ATH_CHECK(m_theEOverPTool->fillBinnedParameters(m_binnedParameters.get()));
37
38 m_trkpos.reset(dynamic_cast<PFMatch::TrackEtaPhiInFixedLayersProvider *>(PFMatch::TrackPositionFactory::Get("EM2EtaPhi").release()));
39 if (!m_trkpos)
40 {
41 ATH_MSG_ERROR("Failed to get TrackPositionProvider for cluster preselection!");
42 return StatusCode::FAILURE;
43 }
44
45 //Retrieve track-cluster matching tools
46 ATH_CHECK(m_theMatchingTool.retrieve());
49
51
52 //Set the level of the helpers to the same as the tool here
53 m_pfSubtractionStatusSetter.msg().setLevel(this->msg().level());
54 m_pfSubtractionEnergyRatioCalculator.msg().setLevel(this->msg().level());
55 m_subtractor.m_facilitator.msg().setLevel(this->msg().level());
56
59 }
60
62
63 return StatusCode::SUCCESS;
64}
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_ERROR(x)
static std::unique_ptr< IPositionProvider > Get(const std::string &positionType)
std::unique_ptr< PFMatch::TrackEtaPhiInFixedLayersProvider > m_trkpos
Track position provider to be used to preselect clusters.
PFSubtractionEnergyRatioCalculator m_pfSubtractionEnergyRatioCalculator
ToolHandle< IEFlowCellEOverPTool > m_theEOverPTool
Tool for getting e/p values and hadronic shower cell ordering principle parameters.
ToolHandle< PFTrackClusterMatchingTool > m_theMatchingTool
Default track-cluster matching tool.
ToolHandle< PFEnergyPredictorTool > m_NNEnergyPredictorTool
Tool for getting predictiing the energy using an ONNX model.
eflowSubtract::Subtractor m_subtractor
SG::ReadDecorHandleKey< xAOD::CaloClusterContainer > m_caloClusterReadDecorHandleKeyNLeadingTruthParticles
Read handle key to decorate CaloCluster with threeN leading truth particle uniqueID and energy.
PFSubtractionStatusSetter m_pfSubtractionStatusSetter
ToolHandle< PFSimulateTruthShowerTool > m_theTruthShowerSimulator
ToolHandle< PFTrackClusterMatchingTool > m_theMatchingToolForPull_02
ToolHandle< PFTrackClusterMatchingTool > m_theMatchingToolForPull_015
static std::string release
Definition computils.h:50
MsgStream & msg
Definition testRead.cxx:32

◆ isEOverPFail()

bool PFSubtractionTool::isEOverPFail ( double expectedEnergy,
double sigma,
double clusterEnergy ) const
private

Definition at line 566 of file PFSubtractionTool.cxx.

567{
568 if ((expectedEnergy == 0) && (clusterEnergy > 0)) return false;
569 return clusterEnergy < expectedEnergy - m_consistencySigmaCut * sigma;
570}
Gaudi::Property< double > m_consistencySigmaCut
Parameter that controls whether a track, in a track-cluster system, will be processed by the split sh...

◆ matchAndCreateEflowCaloObj()

unsigned int PFSubtractionTool::matchAndCreateEflowCaloObj ( PFData & data) const
private

This matches ID tracks and CaloClusters, and then creates eflowCaloObjects.

No point to do anything if e/p reference bin does not exist

Add cluster matches needed for pull calculation (in eflowCaloObject::simulateShowers) which is used to determine whether to run the charged shower subtraction or not. / Clusters in both a cone of 0.15 and 0.2 are needed for this. / The clusters in a cone of 0.2 are also used as the matched cluster list for recover split showers mode.

Start loop from nCaloObj, which should be zero on a first pass

Definition at line 98 of file PFSubtractionTool.cxx.

98 {
99
100 //Counts up how many tracks found at least 1 calorimeter cluster matched to it.
101 unsigned int nMatches(0);
102
103 /* Cache the original number of eflowCaloObjects, if there were any */
104 const unsigned int nCaloObj = data.caloObjects->size();
105 const EventContext &ctx = Gaudi::Hive::currentContext();
106
107 /* loop tracks in data.tracks and do matching */
108 for (auto *thisEfRecTrack : data.tracks)
109 {
111 if (!thisEfRecTrack->hasBin()) {
112 std::unique_ptr<eflowCaloObject> thisEflowCaloObject = std::make_unique<eflowCaloObject>();
113 thisEflowCaloObject->addTrack(thisEfRecTrack);
114 data.caloObjects->push_back(std::move(thisEflowCaloObject));
115 continue;
116 }
117
118 if (msgLvl(MSG::DEBUG))
119 {
120 const xAOD::TrackParticle *track = thisEfRecTrack->getTrack();
121 ATH_MSG_DEBUG("Matching track with e,pt, eta and phi " << track->e() << ", " << track->pt() << ", " << track->eta() << " and " << track->phi());
122 }
123
124 std::vector<eflowTrackClusterLink*> bestClusters;
125 std::vector<float> deltaRPrime;
126
128
129 const xAOD::TruthParticle* trackMatchedTruthParticle = nullptr;
130 typedef ElementLink<xAOD::TruthParticleContainer> TruthLink;
131
132 const static SG::AuxElement::Accessor<TruthLink> truthLinkAccessor("truthParticleLink");
133
134 TruthLink truthLink = truthLinkAccessor(*(thisEfRecTrack->getTrack()));
135 //if not valid don't print a WARNING because this is an expected condition as discussed here:
136 //https://indico.cern.ch/event/795039/contributions/3391771/attachments/1857138/3050771/TruthTrackFTAGWS.pdf
137 if (truthLink.isValid()) trackMatchedTruthParticle = *truthLink;
138
139 if (trackMatchedTruthParticle){
140 double uniqueID = HepMC::uniqueID(trackMatchedTruthParticle);
141
142 SG::ReadDecorHandle<xAOD::CaloClusterContainer, std::vector< std::pair<unsigned int, double> > > caloClusterReadDecorHandleNLeadingTruthParticles(m_caloClusterReadDecorHandleKeyNLeadingTruthParticles);
143 if (!caloClusterReadDecorHandleNLeadingTruthParticles.isValid()){
144 ATH_MSG_WARNING("Failed to retrieve CaloCluster decoration with key " << caloClusterReadDecorHandleNLeadingTruthParticles.key());
145 }
146
147 for (auto * thisCluster : data.clusters){
148 //accessor for decoration
149 //split key into substring to get the name of the decoration
150
151 std::string decorHandleName = m_caloClusterReadDecorHandleKeyNLeadingTruthParticles.key();
152 std::string::size_type pos = decorHandleName.find(".");
153 std::string decorName = decorHandleName.substr(pos+1);
154
156
157 std::vector<std::pair<unsigned int, double > > uniqueIDTruthPairs = accessor(*(thisCluster->getCluster()));
158
159 for (auto &uniqueIDTruthPair : uniqueIDTruthPairs){
160 if (uniqueIDTruthPair.first == uniqueID){
161 eflowTrackClusterLink* thisLink = eflowTrackClusterLink::getInstance(thisEfRecTrack, thisCluster, ctx);
162 bestClusters.push_back(thisLink);
163 break;
164 }
165 }//loop over calocluster truth pair decorations
166 }//loop over caloclusters
167
168 }//if have truth particle matched to track
169 else ATH_MSG_VERBOSE("Track with pt, eta and phi " << thisEfRecTrack->getTrack()->pt() << ", " << thisEfRecTrack->getTrack()->eta() << " and " << thisEfRecTrack->getTrack()->phi() << " does not have a valid truth pointer");
170 }
171 else if (!m_recoverSplitShowers){
176 std::vector<std::pair<eflowRecCluster *, float>> bestClusters_02 = m_theMatchingToolForPull_02->doMatches(thisEfRecTrack, data.clusters, -1);
177 for (auto &matchpair : bestClusters_02)
178 {
179 eflowRecCluster *theCluster = matchpair.first;
180 float distancesq = matchpair.second;
181 eflowTrackClusterLink *trackClusterLink = eflowTrackClusterLink::getInstance(thisEfRecTrack, theCluster, ctx);
182 if (distancesq < 0.15 * 0.15)
183 {
184 // Narrower cone is a subset of the selected clusters
185 // Distance returned is deltaR^2
186 thisEfRecTrack->addAlternativeClusterMatch(trackClusterLink, "cone_015");
187 }
188 thisEfRecTrack->addAlternativeClusterMatch(trackClusterLink, "cone_02");
189 }//loop over bestClusters_02
190
191 //This matching scheme is used to match the calorimeter cluster(s) to be used in the charged showers subtraction for this track.
192 std::vector<std::pair<eflowRecCluster *, float>> matchedClusters = m_theMatchingTool->doMatches(thisEfRecTrack, data.clusters,m_nClusterMatchesToUse);
193 for (auto thePair : matchedClusters) {
194 bestClusters.push_back(eflowTrackClusterLink::getInstance(thisEfRecTrack, thePair.first, ctx));
195 if (m_addCPData) deltaRPrime.push_back(std::sqrt(thePair.second));
196 }
197 }
198 else {
199 const std::vector<eflowTrackClusterLink*>* matchedClusters_02 = thisEfRecTrack->getAlternativeClusterMatches("cone_02");
200 if (!matchedClusters_02) continue;
201 else bestClusters = *matchedClusters_02;
202 }
203
204 if (bestClusters.empty()) continue;
205
206 if (msgLvl(MSG::DEBUG))
207 {
208 for (auto *thisClusterLink : bestClusters ) {
209 xAOD::CaloCluster* thisCluster = thisClusterLink->getCluster()->getCluster();
210 ATH_MSG_DEBUG("Matched this track to cluster with e,pt, eta and phi " << thisCluster->e() << ", " << thisCluster->pt() << ", " << thisCluster->eta() << " and " << thisCluster->phi());
211 }
212 }
213
214 nMatches++;
215
216 //loop over the matched calorimeter clusters and associate tracks and clusters to each other as needed.
217 unsigned int linkIndex = 0;
218 for (auto *trkClusLink : bestClusters){
219
220 eflowRecCluster *thisEFRecCluster = trkClusLink->getCluster();
221
223 // Look up whether this cluster is intended for recovery
224 if (std::find(data.clusters.begin(), data.clusters.end(), trkClusLink->getCluster()) == data.clusters.end()) {
225 linkIndex++;
226 continue;
227 }
228 }
229
230 eflowTrackClusterLink *trackClusterLink = eflowTrackClusterLink::getInstance(thisEfRecTrack, thisEFRecCluster, ctx);
231 thisEfRecTrack->addClusterMatch(trackClusterLink);
233 thisEfRecTrack->addDeltaRPrime(deltaRPrime[linkIndex]);
234 }
235 thisEFRecCluster->addTrackMatch(trackClusterLink);
236 }
237 linkIndex++;
238 }
239
240 /* Create 3 types eflowCaloObjects: track-only, cluster-only, track-cluster-link */
241 std::vector<eflowRecCluster *> clusters(data.clusters.begin(), data.clusters.end());
242 if (m_recoverSplitShowers) std::sort(clusters.begin(), clusters.end(), eflowRecCluster::SortDescendingPt());
243 unsigned int nCaloObjects = eflowCaloObjectMaker::makeTrkCluCaloObjects(data.tracks, clusters, data.caloObjects);
244 ATH_MSG_DEBUG("Created " << nCaloObjects << " eflowCaloObjects.");
245 if (msgLvl(MSG::DEBUG)){
246 for (auto thisEFlowCaloObject : *(data.caloObjects)){
247 ATH_MSG_DEBUG("This eflowCaloObject has " << thisEFlowCaloObject->nTracks() << " tracks and " << thisEFlowCaloObject->nClusters() << " clusters ");
248 for (unsigned int count = 0; count < thisEFlowCaloObject->nTracks(); count++){
249 const xAOD::TrackParticle* thisTrack = thisEFlowCaloObject->efRecTrack(count)->getTrack();
250 ATH_MSG_DEBUG("Have track with e, pt, eta and phi of " << thisTrack->e() << ", " << thisTrack->pt() << ", " << thisTrack->eta() << " and " << thisTrack->phi());
251 }
252 for (unsigned int count = 0; count < thisEFlowCaloObject->nClusters(); count++){
253 const xAOD::CaloCluster* thisCluster = thisEFlowCaloObject->efRecCluster(count)->getCluster();
254 ATH_MSG_DEBUG("Have cluster with e, pt, eta and phi of " << thisCluster->e() << ", " << thisCluster->pt() << ", " << thisCluster->eta() << " and " << thisCluster->phi());
255 }
256 }
257 }
258
259 const double gaussianRadius = 0.032;
260 const double gaussianRadiusError = 1.0e-3;
261 const double maximumRadiusSigma = 3.0;
262
263 eflowLayerIntegrator integrator(gaussianRadius, gaussianRadiusError, maximumRadiusSigma, m_isHLLHC);
264
266 if (!m_recoverSplitShowers && 0 != nCaloObj) ATH_MSG_WARNING("Not in Split Showers Mode and already have " << nCaloObj << " eflowCaloObjects");
267
268 //For each eflowCaloObject we calculate the expected energy deposit in the calorimeter and cell ordering for subtraction.
269 for (unsigned int iCalo = nCaloObj; iCalo < data.caloObjects->size(); ++iCalo) {
270 eflowCaloObject* thisEflowCaloObject = data.caloObjects->at(iCalo);
271 thisEflowCaloObject->simulateShower(&integrator, m_binnedParameters.get(), m_useNNEnergy ? &(*m_NNEnergyPredictorTool) : nullptr, m_useLegacyEBinIndex);
272 if (m_useTruthForChargedShowerSubtraction) m_theTruthShowerSimulator->simulateShower(*thisEflowCaloObject);
273
274 }
275
276 if (!m_recoverSplitShowers) return nMatches;
277 else return nCaloObj;
278}
#define ATH_MSG_VERBOSE(x)
#define ATH_MSG_WARNING(x)
ElementLink< xAOD::TruthParticleContainer > TruthLink
Gaudi::Property< bool > m_useNNEnergy
Toggle whether we use the neural net energy.
Gaudi::Property< int > m_nClusterMatchesToUse
Number of clusters to match to each track if not doing recover split shower subtraction.
Gaudi::Property< bool > m_useTruthMatching
Toggle whether to cheat and use truth information for track-cluster matching - only for performance s...
Gaudi::Property< bool > m_addCPData
Toggle whether to decorate eflowRecTrack with addutional data for Combined Performance studies.
Gaudi::Property< bool > m_useLegacyEBinIndex
Further discussion about why this flag exists can be found in https://its.cern.ch/jira/browse/ATLJETM...
Gaudi::Property< bool > m_isHLLHC
Toggle whether we have the HLLHC setup.
SG::Accessor< T, ALLOC > Accessor
Definition AuxElement.h:572
static unsigned int makeTrkCluCaloObjects(eflowRecTrackContainer *eflowTrackContainer, eflowRecClusterContainer *eflowClusterContainer, eflowCaloObjectContainer *caloObjectContainer)
void simulateShower(eflowLayerIntegrator *integrator, const eflowEEtaBinnedParameters *binnedParameters, const PFEnergyPredictorTool *energyP, bool useLegacyEnergyBinIndexing)
void addTrackMatch(eflowTrackClusterLink *trackMatch)
virtual double pt() const
The transverse momentum ( ) of the particle (negative for negative-energy clusters)
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.
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.
virtual double e() const override final
The total energy of the particle.
int count(std::string s, const std::string &regx)
count how many occurances of a regx are in a string
Definition hcg.cxx:146
int uniqueID(const T &p)
@ linkIndex
link index for multiple track and vertex matches
void sort(typename DataModel_detail::iterator< DVL > beg, typename DataModel_detail::iterator< DVL > end)
Specialization of sort for DataVector/List.
const AccessorWrapper< T > * accessor(xAOD::JetAttribute::AttributeID id)
Returns an attribute accessor corresponding to an AttributeID.
TrackParticle_v1 TrackParticle
Reference the current persistent version:
TruthParticle_v1 TruthParticle
Typedef to implementation.

◆ performSubtraction() [1/2]

void PFSubtractionTool::performSubtraction ( const unsigned int & startingPoint,
PFData & data ) const
private

Definition at line 280 of file PFSubtractionTool.cxx.

280 {
281 unsigned int nEFCaloObs = data.caloObjects->size();
282 for (unsigned int iCalo = startingPoint; iCalo < nEFCaloObs; ++iCalo) {
283 eflowCaloObject* thisEflowCaloObject = data.caloObjects->at(iCalo);
284 this->performSubtraction(*thisEflowCaloObject);
285 }
286}

◆ performSubtraction() [2/2]

void PFSubtractionTool::performSubtraction ( eflowCaloObject & thisEflowCaloObject) const
private

Definition at line 288 of file PFSubtractionTool.cxx.

288 {
289
290 ATH_MSG_DEBUG("In performSubtraction");
291
292 unsigned int nClusters = thisEflowCaloObject.nClusters();
293 unsigned int nTrackMatches = thisEflowCaloObject.nTracks();
294
295 ATH_MSG_DEBUG("Have got an eflowCaloObject with " << nClusters << " clusters and " << nTrackMatches << " track matches");
296
297 if (msgLevel(MSG::DEBUG)){
298 for (unsigned int iTrack = 0; iTrack < nTrackMatches; ++iTrack){
299 eflowRecTrack* thisTrack = thisEflowCaloObject.efRecTrack(iTrack);
300 ATH_MSG_DEBUG("eflowCaloObject has track with E, pt and eta " << thisTrack->getTrack()->e() << ", " << thisTrack->getTrack()->pt() << " and " << thisTrack->getTrack()->eta());
301 }
302 }
303
304 //To keep historical behaviour when in recover split showers mode allow tracks with no cluster matches to proceed.
305 if (!m_recoverSplitShowers && nClusters < 1) return;
306
307 //Need at least one track in this eflowCaloObject to continue.
308 if (nTrackMatches < 1) return;
309
310 double expectedEnergy = thisEflowCaloObject.getExpectedEnergy();
311 double clusterEnergy = thisEflowCaloObject.getClusterEnergy();
312 double expectedSigma = sqrt(thisEflowCaloObject.getExpectedVariance());
313
314 /* Check e/p, if on first pass - return if e/p not consistent with expected e/p */
316 if (isEOverPFail(expectedEnergy, expectedSigma, clusterEnergy)) return;
317 }
318
319 const std::vector<std::pair<eflowTrackClusterLink *, std::pair<float, float>>> &matchedTrackList = thisEflowCaloObject.efRecLink();
320
321 ATH_MSG_DEBUG("Matched Track List has size " << matchedTrackList.size());
322
323 if (msgLevel(MSG::DEBUG))
324 {
325 for (unsigned int iTrack = 0; iTrack < nTrackMatches; ++iTrack)
326 {
327 const xAOD::TrackParticle *thisTrack = thisEflowCaloObject.efRecTrack(iTrack)->getTrack();
328 ATH_MSG_DEBUG("eflowCaloObject has track match with E, pt and eta " << thisTrack->e() << ", " << thisTrack->pt() << " and " << thisTrack->eta());
329 }
330 }
331
332 ATH_MSG_DEBUG("About to perform subtraction for this eflowCaloObject");
333
334 bool wasAnnihilated = false;
335
336 //First deal with non-split showers mode
338 /* Check if we can annihilate right away - true if matched cluster has only the expected energy deposit */
339 if (canAnnihilate(expectedEnergy, expectedSigma, clusterEnergy)){
340
341 wasAnnihilated = true;
342
343 std::vector<std::pair<xAOD::CaloCluster *, bool>> clusterList;
344 std::map<xAOD::CaloCluster *, double> clusterEnergyMap;
345 unsigned nCluster = thisEflowCaloObject.nClusters();
346 for (unsigned iCluster = 0; iCluster < nCluster; ++iCluster){
347 clusterList.emplace_back(thisEflowCaloObject.efRecCluster(iCluster)->getCluster(), false);
348 }
349
350 ATH_MSG_DEBUG("We are going to annihilate. ExpectedEnergy, expectedSigma and clusterEnergy are " << expectedEnergy << ", " << expectedSigma << " and " << clusterEnergy);
351 if (msgLevel(MSG::DEBUG))
352 for (auto thisPair : clusterList)
353 ATH_MSG_DEBUG("Annihilating cluster with E and eta " << thisPair.first->e() << " and " << thisPair.first->eta());
354
355 m_pfSubtractionStatusSetter.markAllTracksAnnihStatus(thisEflowCaloObject);
356
357 //before we remove all the cells, we create a list of the removed cells if in doCPData mode
358 if (m_addCPData) this->addSubtractedCells(thisEflowCaloObject, clusterList);
359
361
362 if (msgLevel(MSG::DEBUG))
363 for (auto thisPair : clusterList)
364 ATH_MSG_DEBUG("Have Annihilated cluster with E and eta " << thisPair.first->e() << " and " << thisPair.first->eta());
365
366 /* Flag all tracks in this system as subtracted */
367 for (unsigned iTrack = 0; iTrack < thisEflowCaloObject.nTracks(); ++iTrack){
368 eflowRecTrack *thisEfRecTrack = (matchedTrackList[iTrack].first)->getTrack();
369 if (!thisEfRecTrack->isSubtracted()) thisEfRecTrack->setSubtracted();
370 }
371
372 }//if can annihilate this track-cluster systems matched cluster
373 }//split shower recovery mode or regular mode where above annihilation was not triggered
374 if (m_recoverSplitShowers || !wasAnnihilated){
375
376 for (unsigned iTrack = 0; iTrack < thisEflowCaloObject.nTracks(); ++iTrack){
377
378 eflowRecTrack *thisEfRecTrack = thisEflowCaloObject.efRecTrack(iTrack);
379
380 ATH_MSG_DEBUG("About to subtract track with e, pt, eta and phi of " << thisEfRecTrack->getTrack()->e() << ", " << thisEfRecTrack->getTrack()->pt() << ", " << thisEfRecTrack->getTrack()->eta() << " and "
381 << thisEfRecTrack->getTrack()->eta());
382
383 if (!thisEfRecTrack->hasBin()) continue;
384
385 ATH_MSG_DEBUG("Have bin for this eflowCaloObject");
386
387 if (thisEfRecTrack->isInDenseEnvironment() && !m_recoverSplitShowers) continue;
388
389 ATH_MSG_DEBUG("Am not in dense environment for this eflowCaloObject");
390
391 /* Get matched cluster via Links */
392 std::vector<eflowRecCluster *> matchedClusters;
393 std::vector<eflowTrackClusterLink *> links = thisEfRecTrack->getClusterMatches();
394 matchedClusters.reserve(links.size());
395 for (auto* thisEFlowTrackClusterLink : links)
396 matchedClusters.push_back(thisEFlowTrackClusterLink->getCluster());
398 std::sort(matchedClusters.begin(),
399 matchedClusters.end(),
400 eflowRecCluster::SortDescendingPt());
401
402 if (msgLvl(MSG::DEBUG)) {
403 for (auto* thisClus : matchedClusters)
405 "Haved matched cluster "
406 << thisClus->getCluster()->index() << " with e,pt, eta and phi of "
407 << thisClus->getCluster()->e() << ", "
408 << thisClus->getCluster()->pt() << ", "
409 << thisClus->getCluster()->eta() << " and "
410 << thisClus->getCluster()->phi() << " will be subtracted");
411 }
412
413 /* Do subtraction */
414 std::vector<std::pair<xAOD::CaloCluster *, bool>> clusterSubtractionList;
415 clusterSubtractionList.reserve(matchedClusters.size());
416 std::map<xAOD::CaloCluster *, double> clusterEnergyMap;
417 for (auto *thisEFlowRecCluster : matchedClusters){
418 xAOD::CaloCluster *thisCluster = thisEFlowRecCluster->getCluster();
419 clusterSubtractionList.emplace_back(thisCluster, false);
420 clusterEnergyMap[thisCluster] = thisCluster->e();
421 }
422
423 ATH_MSG_DEBUG("Have filled clusterSubtractionList for this eflowCaloObject");
424
425 unsigned int trackIndex = thisEfRecTrack->getTrack()->index();
426
427 //Previously we only checked this in recover split showers, but makes sense to check it in both passes.
428 auto sumClusEnergy = [](double accumulator, std::pair<xAOD::CaloCluster *, bool> thisPair){ return accumulator += thisPair.first->e();};
429 double totalClusterEnergy = std::accumulate(clusterSubtractionList.begin(),clusterSubtractionList.end(),0.0,sumClusEnergy);
430
431 /* Check if we can annihilate right away - true if matched cluster has only the expected energy deposit */
432 if(canAnnihilate(thisEfRecTrack->getEExpect(),sqrt(thisEfRecTrack->getVarEExpect()),totalClusterEnergy)){
433
434 if (msgLevel(MSG::DEBUG))
435 for (auto thisPair : clusterSubtractionList)
436 ATH_MSG_DEBUG("Annihilating cluster with E and eta " << thisPair.first->e() << " and " << thisPair.first->eta());
437
438 //before we remove all the cells, we create a list of the removed cells if in doCPData mode
439 if (m_addCPData) this->addSubtractedCells(thisEflowCaloObject, clusterSubtractionList);
440
441 Subtractor::annihilateClusters(clusterSubtractionList);
442 //Now we should mark all of these clusters as being subtracted
443 //Now need to mark which clusters were modified in the subtraction procedure
444 std::vector<std::pair<float, float>> clusterSubtractedEnergyRatios;
445 m_pfSubtractionEnergyRatioCalculator.calculateSubtractedEnergyRatiosForAnnih(clusterSubtractionList, clusterEnergyMap, clusterSubtractedEnergyRatios);
446 m_pfSubtractionStatusSetter.markSubtractionStatus(clusterSubtractionList, clusterSubtractedEnergyRatios, thisEflowCaloObject, trackIndex);
447 }
448 else
449 {
450
451 /* Subtract the track from all matched clusters */
452 m_subtractor.subtractTracksFromClusters(thisEfRecTrack, clusterSubtractionList, m_addCPData);
453
454 //recalculate total cluster energy from the clusters afer subtraction
455 totalClusterEnergy = std::accumulate(clusterSubtractionList.begin(),clusterSubtractionList.end(),0.0,sumClusEnergy);
456
457 /* Annihilate the cluster(s) if the remnant is small (i.e. below k*sigma) */
458 if (canAnnihilate(0.0,sqrt(thisEfRecTrack->getVarEExpect()), totalClusterEnergy)){
459
460 if (msgLevel(MSG::DEBUG))
461 for (auto thisPair : clusterSubtractionList){
462 ATH_MSG_DEBUG("Annihilating remnant cluster with E and eta " << thisPair.first->e() << " and " << thisPair.first->eta());
463 }
464 eflowSubtract::Subtractor::annihilateClusters(clusterSubtractionList);
465 //Now we should mark all of these clusters as being subtracted
466 std::vector<std::pair<float, float>> clusterSubtractedEnergyRatios;
467 m_pfSubtractionEnergyRatioCalculator.calculateSubtractedEnergyRatiosForAnnih(clusterSubtractionList, clusterEnergyMap, clusterSubtractedEnergyRatios);
468 m_pfSubtractionStatusSetter.markSubtractionStatus(clusterSubtractionList, clusterSubtractedEnergyRatios, thisEflowCaloObject, trackIndex);
469 }//if remove the remnant after cell by cell subtraction
470 else
471 {
472 std::vector<std::pair<float, float>> clusterSubtractedEnergyRatios;
473 m_pfSubtractionEnergyRatioCalculator.calculateSubtractedEnergyRatios(clusterSubtractionList, clusterEnergyMap, clusterSubtractedEnergyRatios);
474 m_pfSubtractionStatusSetter.markSubtractionStatus(clusterSubtractionList, clusterSubtractedEnergyRatios, thisEflowCaloObject, trackIndex);
475 }//if don't remove the remnant after cell by cell subtraction
476
477 }//if not annihilating, and instead subtracting cell by cell
478
479 ATH_MSG_DEBUG("Have subtracted charged shower for this eflowRecTrack");
480
481 /* Flag tracks as subtracted */
482 if (!thisEfRecTrack->isSubtracted()) thisEfRecTrack->setSubtracted();
483
484 }//loop over tracks in eflowCaloObject
485 }//cell by cell subtraction
486
487}
void addSubtractedCells(eflowCaloObject &thisEflowCaloObject, const std::vector< std::pair< xAOD::CaloCluster *, bool > > &clusterList) const
bool canAnnihilate(double expectedEnergy, double sigma, double clusterEnergy) const
bool isEOverPFail(double expectedEnergy, double sigma, double clusterEnergy) const
size_t index() const
Return the index of this element within its container.
double getExpectedVariance() const
double getClusterEnergy() const
unsigned nClusters() const
const std::vector< std::pair< eflowTrackClusterLink *, std::pair< float, float > > > & efRecLink() const
double getExpectedEnergy() const
const eflowRecCluster * efRecCluster(int i) const
xAOD::CaloCluster * getCluster()
double getEExpect() const
const std::vector< eflowTrackClusterLink * > & getClusterMatches() const
bool isSubtracted() const
const xAOD::TrackParticle * getTrack() const
bool hasBin() const
bool isInDenseEnvironment() const
double getVarEExpect() const
static void annihilateClusters(std::vector< std::pair< xAOD::CaloCluster *, bool > > &clusters)

◆ performTruthSubtraction() [1/2]

void PFSubtractionTool::performTruthSubtraction ( eflowCaloObject & thisEflowCaloObject) const
private

Definition at line 502 of file PFSubtractionTool.cxx.

502 {
503
504 for (unsigned iTrack = 0; iTrack < thisEflowCaloObject.nTracks(); ++iTrack){
505 eflowRecTrack *thisEfRecTrack = thisEflowCaloObject.efRecTrack(iTrack);
506
507 //although we are subtracting the truth, to be consistent we only do it if a reco
508 //e/p lookup bin exists for this track
509 if (!thisEfRecTrack->hasBin()) continue;
510
511 //Similarly we skip tracks in a dense environment
512 if (thisEfRecTrack->isInDenseEnvironment()) continue;
513
514 thisEfRecTrack->setSubtracted();
515
516 //get the set of matched clusters
517 std::vector<eflowTrackClusterLink *> links = thisEfRecTrack->getClusterMatches();
518
519 for (auto thisLink : links){
520 xAOD::CaloCluster *thisCluster = thisLink->getCluster()->getCluster();
521 CaloClusterCellLink* theCellLinks = thisCluster->getOwnCellLinks();
522 CaloClusterCellLink::iterator theCell = theCellLinks->begin();
523 CaloClusterCellLink::iterator lastCell = theCellLinks->end();
524
525 //loop over the cells in this cluster and subtract shower using truth information
526 //We can either remove a cell entireley if it has any truth deposit (closer to what the real
527 //reco algorithm does) or reweight the cells contribution based on subtracting the truth
528 //energy from the reco cell energy
529 //We only advance the iterator, theCell, if we *dont* call removeCell to avoid issues with
530 //invalid iterators
531 //We also have to reset the lastCell iterator after each call to ensure the loop exits at the end,
532 //instead of being stuck in an infinite loop.
533 for (; theCell != lastCell;){
534 //get the truth energy for this cell
535 double truthEnergy = thisEfRecTrack->getCellTruthEnergy(*theCell);
536 //reweight the cell such that energy*weight gives the new energy
537 double oldCellEnergy = theCell->energy()*(theCell.weight());
538 double subtractedCellWeight = (oldCellEnergy - truthEnergy)/oldCellEnergy;
539
540 if (0.0 != truthEnergy && m_useFullCellTruthSubtraction) {
541 thisCluster->removeCell(*theCell);
542 lastCell = theCellLinks->end();
543 }
545 theCell.reweight(subtractedCellWeight);
546 ++theCell;
547 }
548 else ++theCell;
549
550 }//cell loop
551
552 float oldEnergy = thisCluster->e();
553 CaloClusterKineHelper::calculateKine(thisCluster, true, true);
554 if (0.0 != oldEnergy) {
555 float energyAdjustment = thisCluster->e() / oldEnergy;
556 thisCluster->setRawE(thisCluster->rawE() * energyAdjustment);
557 thisCluster->setRawEta(thisCluster->eta());
558 thisCluster->setRawPhi(thisCluster->phi());
559 }
560 }
561
562 }//eflowCaloObject track loop
563
564}
double energy() const
get energy (data member)
Definition CaloCell.h:327
static void calculateKine(xAOD::CaloCluster *clu, const bool useweight=true, const bool updateLayers=true, const bool useGPUCriteria=false)
Helper class to calculate cluster kinematics based on cells.
Gaudi::Property< bool > m_useFullCellTruthSubtraction
Toggle whether we fully remove a cell with a truth deposit or reweight it based on truth contribution...
double getCellTruthEnergy(const CaloCell *cell) const
void setRawEta(flt_t)
Set for signal state UNCALIBRATED.
flt_t rawE() const
void setRawPhi(flt_t)
Set for signal state UNCALIBRATED.
void setRawE(flt_t)
Set Energy for signal state UNCALIBRATED.
CaloClusterCellLink * getOwnCellLinks()
Get a pointer to the owned CaloClusterCellLink object (non-const version)
bool removeCell(const CaloCell *ptr)
Method to remove a cell to the cluster (slow!) (Beware: Kinematics not updated!)

◆ performTruthSubtraction() [2/2]

void PFSubtractionTool::performTruthSubtraction ( PFData & data) const
private

Definition at line 489 of file PFSubtractionTool.cxx.

489 {
490
491 ATH_MSG_DEBUG("In performTruthSubtraction");
492
493 unsigned int nEFCaloObs = data.caloObjects->size();
494
495 for (unsigned int iCalo = 0; iCalo < nEFCaloObs; ++iCalo) {
496 eflowCaloObject* thisEflowCaloObject = data.caloObjects->at(iCalo);
497 this->performTruthSubtraction(*thisEflowCaloObject);
498 }
499
500}

◆ printAllClusters()

void PFSubtractionTool::printAllClusters ( const eflowRecClusterContainer & recClusterContainer) const
private

Definition at line 589 of file PFSubtractionTool.cxx.

589 {
590
591 for ( const auto *thisEFRecCluster : recClusterContainer){
592 if (thisEFRecCluster->getTrackMatches().empty()) {
593 ATH_MSG_DEBUG("Isolated" << printCluster(thisEFRecCluster->getCluster()));
594 } else {
595 ATH_MSG_DEBUG("Matched" << printCluster(thisEFRecCluster->getCluster()));
596 std::vector<eflowTrackClusterLink*> theTrackLinks = thisEFRecCluster->getTrackMatches();
597 for ( auto *thisTrack : theTrackLinks){
598 ATH_MSG_DEBUG("Matched" << printTrack(thisTrack->getTrack()->getTrack()));
599 }
600 }
601 }
602}
static std::string printCluster(const xAOD::CaloCluster *cluster)
static std::string printTrack(const xAOD::TrackParticle *track)

◆ printCluster()

std::string PFSubtractionTool::printCluster ( const xAOD::CaloCluster * cluster)
staticprivate

Definition at line 583 of file PFSubtractionTool.cxx.

583 {
584 std::stringstream result;
585 result << " cluster with E, eta and phi of " << cluster->e() << ", " << cluster->eta() << " and " << cluster->phi();
586 return result.str();
587}

◆ printTrack()

std::string PFSubtractionTool::printTrack ( const xAOD::TrackParticle * track)
staticprivate

Definition at line 577 of file PFSubtractionTool.cxx.

577 {
578 std::stringstream result;
579 result << " track with E, eta and phi "<< track->e() << ", " << track->eta() << " and " << track->phi();
580 return result.str();
581}

Member Data Documentation

◆ m_addCPData

Gaudi::Property<bool> PFSubtractionTool::m_addCPData {this,"addCPData",false,"Toggle whether to decorate FlowElements with addutional data for Combined Performance studies "}
private

Toggle whether to decorate eflowRecTrack with addutional data for Combined Performance studies.

Definition at line 96 of file PFSubtractionTool.h.

96{this,"addCPData",false,"Toggle whether to decorate FlowElements with addutional data for Combined Performance studies "};

◆ m_binnedParameters

std::unique_ptr<eflowEEtaBinnedParameters> PFSubtractionTool::m_binnedParameters
private

Definition at line 65 of file PFSubtractionTool.h.

◆ m_calcEOverP

Gaudi::Property<bool> PFSubtractionTool::m_calcEOverP {this, "CalcEOverP", false, "Toggle EOverP algorithm mode, whereby no charged shower subtraction is performed"}
private

Toggle EOverP algorithm mode, whereby no charged shower subtraction is performed.

Definition at line 87 of file PFSubtractionTool.h.

87{this, "CalcEOverP", false, "Toggle EOverP algorithm mode, whereby no charged shower subtraction is performed"};

◆ m_caloClusterReadDecorHandleKeyNLeadingTruthParticles

SG::ReadDecorHandleKey<xAOD::CaloClusterContainer> PFSubtractionTool::m_caloClusterReadDecorHandleKeyNLeadingTruthParticles {this,"CaloClusterReadDecorHandleKey_NLeadingTruthParticles",""}
private

Read handle key to decorate CaloCluster with threeN leading truth particle uniqueID and energy.

Definition at line 122 of file PFSubtractionTool.h.

122{this,"CaloClusterReadDecorHandleKey_NLeadingTruthParticles",""};

◆ m_consistencySigmaCut

Gaudi::Property<double> PFSubtractionTool::m_consistencySigmaCut {this, "ConsistencySigmaCut", 1.0, "Parameter that controls whether a track, in a track-cluster system, will be processed by the split shower recovery algorithm"}
private

Parameter that controls whether a track, in a track-cluster system, will be processed by the split shower recovery algorithm.

Definition at line 90 of file PFSubtractionTool.h.

90{this, "ConsistencySigmaCut", 1.0, "Parameter that controls whether a track, in a track-cluster system, will be processed by the split shower recovery algorithm"};

◆ m_isHLLHC

Gaudi::Property<bool> PFSubtractionTool::m_isHLLHC {this, "isHLLHC", false, "Toggle whether we have the HLLHC setup"}
private

Toggle whether we have the HLLHC setup.

Definition at line 84 of file PFSubtractionTool.h.

84{this, "isHLLHC", false, "Toggle whether we have the HLLHC setup"};

◆ m_nClusterMatchesToUse

Gaudi::Property<int> PFSubtractionTool::m_nClusterMatchesToUse {this, "nClusterMatchesToUse", 1, "Number of clusters to match to each track"}
private

Number of clusters to match to each track if not doing recover split shower subtraction.

Definition at line 81 of file PFSubtractionTool.h.

81{this, "nClusterMatchesToUse", 1, "Number of clusters to match to each track"};

◆ m_NNEnergyPredictorTool

ToolHandle<PFEnergyPredictorTool> PFSubtractionTool::m_NNEnergyPredictorTool {this, "NNEnergyPredictorTool", "","Tool for getting predictiing the energy using an ONNX model "}
private

Tool for getting predictiing the energy using an ONNX model.

Definition at line 104 of file PFSubtractionTool.h.

104{this, "NNEnergyPredictorTool", "","Tool for getting predictiing the energy using an ONNX model "};

◆ m_pfSubtractionEnergyRatioCalculator

PFSubtractionEnergyRatioCalculator PFSubtractionTool::m_pfSubtractionEnergyRatioCalculator {}
private

Definition at line 100 of file PFSubtractionTool.h.

100{};

◆ m_pfSubtractionStatusSetter

PFSubtractionStatusSetter PFSubtractionTool::m_pfSubtractionStatusSetter {}
private

Definition at line 99 of file PFSubtractionTool.h.

99{};

◆ m_recoverSplitShowers

Gaudi::Property<bool> PFSubtractionTool::m_recoverSplitShowers {this,"RecoverSplitShowers",false,"Toggle whether we are recovering split showers or not"}
private

Toggle whether we are recovering split showers or not.

Definition at line 78 of file PFSubtractionTool.h.

78{this,"RecoverSplitShowers",false,"Toggle whether we are recovering split showers or not"};

◆ m_subtractionSigmaCut

Gaudi::Property<double> PFSubtractionTool::m_subtractionSigmaCut {this, "SubtractionSigmaCut", 1.5, "Parameter that controls whether to use retain remaining calorimeter energy in track-cluster system, after charged shower subtraction"}
private

Parameter that controls whether to use retain remaining calorimeter energy in track-cluster system, after charged shower subtraction.

Definition at line 93 of file PFSubtractionTool.h.

93{this, "SubtractionSigmaCut", 1.5, "Parameter that controls whether to use retain remaining calorimeter energy in track-cluster system, after charged shower subtraction"};

◆ m_subtractor

eflowSubtract::Subtractor PFSubtractionTool::m_subtractor {}
private

Definition at line 101 of file PFSubtractionTool.h.

101{};

◆ m_theEOverPTool

ToolHandle<IEFlowCellEOverPTool> PFSubtractionTool::m_theEOverPTool {this, "eflowCellEOverPTool", "eflowCellEOverPTool", "Energy Flow E/P Values and Shower Parameters Tool"}
private

Tool for getting e/p values and hadronic shower cell ordering principle parameters.

Definition at line 63 of file PFSubtractionTool.h.

63{this, "eflowCellEOverPTool", "eflowCellEOverPTool", "Energy Flow E/P Values and Shower Parameters Tool"};

◆ m_theMatchingTool

ToolHandle<PFTrackClusterMatchingTool> PFSubtractionTool::m_theMatchingTool {this, "PFTrackClusterMatchingTool", "PFTrackClusterMatchingTool/CalObjBldMatchingTool", "The track-cluster matching tool"}
private

Default track-cluster matching tool.

Definition at line 71 of file PFSubtractionTool.h.

71{this, "PFTrackClusterMatchingTool", "PFTrackClusterMatchingTool/CalObjBldMatchingTool", "The track-cluster matching tool"};

◆ m_theMatchingToolForPull_015

ToolHandle<PFTrackClusterMatchingTool> PFSubtractionTool::m_theMatchingToolForPull_015 {this, "PFTrackClusterMatchingTool_015", "PFTrackClusterMatchingTool/PFPullMatchingTool_015", "The 0.15 track-cluster matching tool to calculate the pull"}
private

Definition at line 74 of file PFSubtractionTool.h.

74{this, "PFTrackClusterMatchingTool_015", "PFTrackClusterMatchingTool/PFPullMatchingTool_015", "The 0.15 track-cluster matching tool to calculate the pull"};

◆ m_theMatchingToolForPull_02

ToolHandle<PFTrackClusterMatchingTool> PFSubtractionTool::m_theMatchingToolForPull_02 {this, "PFTrackClusterMatchingTool_02", "PFTrackClusterMatchingTool/PFPullMatchingTool_02", "The 0.2 track-cluster matching tool to calculate the pull"}
private

Definition at line 75 of file PFSubtractionTool.h.

75{this, "PFTrackClusterMatchingTool_02", "PFTrackClusterMatchingTool/PFPullMatchingTool_02", "The 0.2 track-cluster matching tool to calculate the pull"};

◆ m_theTruthShowerSimulator

ToolHandle<PFSimulateTruthShowerTool> PFSubtractionTool::m_theTruthShowerSimulator {this, "PFSimulateTruthShowerTool", "", "The truth shower simulator"}
private

Definition at line 119 of file PFSubtractionTool.h.

119{this, "PFSimulateTruthShowerTool", "", "The truth shower simulator"};

◆ m_trkpos

std::unique_ptr<PFMatch::TrackEtaPhiInFixedLayersProvider> PFSubtractionTool::m_trkpos
private

Track position provider to be used to preselect clusters.

Definition at line 68 of file PFSubtractionTool.h.

◆ m_useFullCellTruthSubtraction

Gaudi::Property<bool> PFSubtractionTool::m_useFullCellTruthSubtraction {this,"useFullCellTruthSubtraction",true,"Toggle whether we fully remove a cell with a truth deposit or reweight it based on truth contribution"}
private

Toggle whether we fully remove a cell with a truth deposit or reweight it based on truth contribution.

Definition at line 117 of file PFSubtractionTool.h.

117{this,"useFullCellTruthSubtraction",true,"Toggle whether we fully remove a cell with a truth deposit or reweight it based on truth contribution"};

◆ m_useLegacyEBinIndex

Gaudi::Property<bool> PFSubtractionTool::m_useLegacyEBinIndex {this, "useLegacyEBinIndex", true, "Toggle whether we use the legacy energy bin index"}
private

Further discussion about why this flag exists can be found in https://its.cern.ch/jira/browse/ATLJETMET-1692 and https://indico.cern.ch/event/1388633/contributions/5837876/attachments/2809591/4903439/PFlow_EOverP_Feb2024.pdf The Jira report discusses assorted problems with the treatment of energy bin indexes for the lookup of e/p values.

In order to not change the behaviour of produciton code a legacy option is introduced to allow us to fix the problem in future iterations of e/p derivations.s

Definition at line 129 of file PFSubtractionTool.h.

129{this, "useLegacyEBinIndex", true, "Toggle whether we use the legacy energy bin index"};

◆ m_useNNEnergy

Gaudi::Property<bool> PFSubtractionTool::m_useNNEnergy {this, "useNNEnergy", false, "Toggle whether we use the neural net energy"}
private

Toggle whether we use the neural net energy.

Definition at line 107 of file PFSubtractionTool.h.

107{this, "useNNEnergy", false, "Toggle whether we use the neural net energy"};

◆ m_useTruthForChargedShowerSubtraction

Gaudi::Property<bool> PFSubtractionTool::m_useTruthForChargedShowerSubtraction {this, "useTruthForChargedShowerSubtraction", false, "Toggle whether we use truth information for the charged shower subtraction or not"}
private

Toggle whether we use truth information for the charged shower subtraction or not.

Definition at line 114 of file PFSubtractionTool.h.

114{this, "useTruthForChargedShowerSubtraction", false, "Toggle whether we use truth information for the charged shower subtraction or not"};

◆ m_useTruthMatching

Gaudi::Property<bool> PFSubtractionTool::m_useTruthMatching {this, "useTrackClusterTruthMatching", false, "Toggle whether to cheat and use truth information for track-cluster matching"}
private

Toggle whether to cheat and use truth information for track-cluster matching - only for performance studies!

Definition at line 111 of file PFSubtractionTool.h.

111{this, "useTrackClusterTruthMatching", false, "Toggle whether to cheat and use truth information for track-cluster matching"};

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