ATLAS Offline Software
Public Member Functions | Private Member Functions | Static Private Member Functions | Private Attributes | List of all members
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. More...
 
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. More...
 
std::unique_ptr< eflowEEtaBinnedParametersm_binnedParameters
 
std::unique_ptr< PFMatch::TrackEtaPhiInFixedLayersProviderm_trkpos
 Track position provider to be used to preselect clusters. More...
 
ToolHandle< PFTrackClusterMatchingToolm_theMatchingTool {this, "PFTrackClusterMatchingTool", "PFTrackClusterMatchingTool/CalObjBldMatchingTool", "The track-cluster matching tool"}
 Default track-cluster matching tool. More...
 
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. More...
 
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. More...
 
Gaudi::Property< bool > m_isHLLHC {this, "isHLLHC", false, "Toggle whether we have the HLLHC setup"}
 Toggle whether we have the HLLHC setup. More...
 
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. More...
 
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. More...
 
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. More...
 
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. More...
 
PFCalcRadialEnergyProfiles m_pfCalc {}
 
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. More...
 
Gaudi::Property< bool > m_useNNEnergy {this, "useNNEnergy", false, "Toggle whether we use the neural net energy"}
 Toggle whether we use the neural net energy. More...
 
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! More...
 
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. More...
 
Gaudi::Property< bool > m_useFullCellTruthSubtraction {this,"useFullCellTruthSubtraction",false,"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. More...
 
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 barcode and energy. More...
 
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. More...
 

Detailed Description

Definition at line 34 of file PFSubtractionTool.h.

Constructor & Destructor Documentation

◆ PFSubtractionTool()

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

Definition at line 19 of file PFSubtractionTool.cxx.

19  : base_class(type, name, parent),
20  m_binnedParameters(std::make_unique<eflowEEtaBinnedParameters>())
21 {
22 }

◆ ~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 592 of file PFSubtractionTool.cxx.

592  {
593 
594  unsigned int numTracks = thisEflowCaloObject.nTracks();
595 
596  for (unsigned int iTrack = 0; iTrack < numTracks; ++iTrack){
597  eflowRecTrack* thisTrack = thisEflowCaloObject.efRecTrack(iTrack);
598  for (auto thisPair : clusterList){
599  xAOD::CaloCluster* thisCluster = thisPair.first;
600  const CaloClusterCellLink* theCellLink = thisCluster->getCellLinks();
601  CaloClusterCellLink::const_iterator theCell = theCellLink->begin();
602  CaloClusterCellLink::const_iterator lastCell = theCellLink->end();
603  for (; theCell != lastCell; theCell++) thisTrack->addSubtractedCaloCell(ElementLink<CaloCellContainer>("AllCalo",theCell.index()),1./numTracks);
604  }
605  }
606 }

◆ canAnnihilate()

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

Definition at line 560 of file PFSubtractionTool.cxx.

561 {
562  return clusterEnergy - expectedEnergy < m_subtractionSigmaCut * sigma;
563 }

◆ execute()

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

Definition at line 63 of file PFSubtractionTool.cxx.

64 {
65 
66  ATH_MSG_DEBUG("Executing");
67 
68  PFData data;
69  data.caloObjects = theEflowCaloObjectContainer;
70  const PFTrackFiller pfTrackFiller;
73 
74  const PFClusterFiller pfClusterFiller;
77 
78  ATH_MSG_DEBUG("This event has " << data.tracks.size() << " tracks " << data.clusters.size() << " clusters ");
79 
80  unsigned int numMatches = matchAndCreateEflowCaloObj(data);
81 
82  if (msgLvl(MSG::DEBUG)) printAllClusters(*recClusterContainer);
83 
84  if (!m_calcEOverP){
87  else performSubtraction(numMatches,data);
88  }
90  }
91  else{
93  }
94 
95 }

◆ finalize()

StatusCode PFSubtractionTool::finalize ( )

Definition at line 608 of file PFSubtractionTool.cxx.

608 { return StatusCode::SUCCESS; }

◆ initialize()

StatusCode PFSubtractionTool::initialize ( )

Definition at line 27 of file PFSubtractionTool.cxx.

28 {
29 
30  ATH_CHECK(m_theEOverPTool.retrieve());
31 
32  ATH_CHECK(m_theEOverPTool->fillBinnedParameters(m_binnedParameters.get()));
33 
35  if (!m_trkpos)
36  {
37  ATH_MSG_ERROR("Failed to get TrackPositionProvider for cluster preselection!");
38  return StatusCode::FAILURE;
39  }
40 
41  //Retrieve track-cluster matching tools
42  ATH_CHECK(m_theMatchingTool.retrieve());
45 
47 
48  //Set the level of the helpers to the same as the tool here
49  m_pfCalc.msg().setLevel(this->msg().level());
50  m_pfSubtractionStatusSetter.msg().setLevel(this->msg().level());
51  m_pfSubtractionEnergyRatioCalculator.msg().setLevel(this->msg().level());
52  m_subtractor.m_facilitator.msg().setLevel(this->msg().level());
53 
56  }
57 
59 
60  return StatusCode::SUCCESS;
61 }

◆ isEOverPFail()

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

Definition at line 554 of file PFSubtractionTool.cxx.

555 {
556  if ((expectedEnergy == 0) && (clusterEnergy > 0)) return false;
557  return clusterEnergy < expectedEnergy - m_consistencySigmaCut * sigma;
558 }

◆ 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 97 of file PFSubtractionTool.cxx.

97  {
98 
99  //Counts up how many tracks found at least 1 calorimeter cluster matched to it.
100  unsigned int nMatches(0);
101 
102  /* Cache the original number of eflowCaloObjects, if there were any */
103  const unsigned int nCaloObj = data.caloObjects->size();
104  const EventContext &ctx = Gaudi::Hive::currentContext();
105 
106  /* loop tracks in data.tracks and do matching */
107  for (auto *thisEfRecTrack : data.tracks)
108  {
110  if (!thisEfRecTrack->hasBin()) {
111  std::unique_ptr<eflowCaloObject> thisEflowCaloObject = std::make_unique<eflowCaloObject>();
112  thisEflowCaloObject->addTrack(thisEfRecTrack);
113  data.caloObjects->push_back(std::move(thisEflowCaloObject));
114  continue;
115  }
116 
117  if (msgLvl(MSG::DEBUG))
118  {
119  const xAOD::TrackParticle *track = thisEfRecTrack->getTrack();
120  ATH_MSG_DEBUG("Matching track with e,pt, eta and phi " << track->e() << ", " << track->pt() << ", " << track->eta() << " and " << track->phi());
121  }
122 
123  std::vector<eflowTrackClusterLink*> bestClusters;
124  std::vector<float> deltaRPrime;
125 
126  if (m_useTruthMatching){
127 
128  const xAOD::TruthParticle* trackMatchedTruthParticle = nullptr;
130 
131  const static SG::AuxElement::Accessor<TruthLink> truthLinkAccessor("truthParticleLink");
132 
133  TruthLink truthLink = truthLinkAccessor(*(thisEfRecTrack->getTrack()));
134  //if not valid don't print a WARNING because this is an expected condition as discussed here:
135  //https://indico.cern.ch/event/795039/contributions/3391771/attachments/1857138/3050771/TruthTrackFTAGWS.pdf
136  if (truthLink.isValid()) trackMatchedTruthParticle = *truthLink;
137 
138  if (trackMatchedTruthParticle){
139  double barcode = trackMatchedTruthParticle->barcode(); // FIXME barcode-based
140 
142  if (!caloClusterReadDecorHandleNLeadingTruthParticles.isValid()){
143  ATH_MSG_WARNING("Failed to retrieve CaloCluster decoration with key " << caloClusterReadDecorHandleNLeadingTruthParticles.key());
144  }
145 
146  for (auto * thisCluster : data.clusters){
147  //accessor for decoration
148  //split key into substring to get the name of the decoration
149 
150  std::string decorHandleName = m_caloClusterReadDecorHandleKeyNLeadingTruthParticles.key();
151  std::string::size_type pos = decorHandleName.find(".");
152  std::string decorName = decorHandleName.substr(pos+1);
153 
155 
156  std::vector<std::pair<unsigned int, double > > barCodeTruthPairs = accessor(*(thisCluster->getCluster())); // FIXME barcode-based
157 
158  for (auto &barCodeTruthPair : barCodeTruthPairs){ // FIXME barcode-based
159  if (barCodeTruthPair.first == barcode){ // FIXME barcode-based
160  eflowTrackClusterLink* thisLink = eflowTrackClusterLink::getInstance(thisEfRecTrack, thisCluster, ctx);
161  bestClusters.push_back(thisLink);
162  break;
163  }
164  }//loop over calocluster truth pair decorations
165  }//loop over caloclusters
166 
167  }//if have truth particle matched to track
168  else ATH_MSG_WARNING("Track with pt, eta and phi " << thisEfRecTrack->getTrack()->pt() << ", " << thisEfRecTrack->getTrack()->eta() << " and " << thisEfRecTrack->getTrack()->phi() << " does not have a valid truth pointer");
169  }
170  else if (!m_recoverSplitShowers){
175  std::vector<std::pair<eflowRecCluster *, float>> bestClusters_02 = m_theMatchingToolForPull_02->doMatches(thisEfRecTrack, data.clusters, -1);
176  for (auto &matchpair : bestClusters_02)
177  {
178  eflowRecCluster *theCluster = matchpair.first;
179  float distancesq = matchpair.second;
180  eflowTrackClusterLink *trackClusterLink = eflowTrackClusterLink::getInstance(thisEfRecTrack, theCluster, ctx);
181  if (distancesq < 0.15 * 0.15)
182  {
183  // Narrower cone is a subset of the selected clusters
184  // Distance returned is deltaR^2
185  thisEfRecTrack->addAlternativeClusterMatch(trackClusterLink, "cone_015");
186  }
187  thisEfRecTrack->addAlternativeClusterMatch(trackClusterLink, "cone_02");
188  }//loop over bestClusters_02
189 
190  //This matching scheme is used to match the calorimeter cluster(s) to be used in the charged showers subtraction for this track.
191  std::vector<std::pair<eflowRecCluster *, float>> matchedClusters = m_theMatchingTool->doMatches(thisEfRecTrack, data.clusters,m_nClusterMatchesToUse);
192  for (auto thePair : matchedClusters) {
193  bestClusters.push_back(eflowTrackClusterLink::getInstance(thisEfRecTrack, thePair.first, ctx));
194  if (m_addCPData) deltaRPrime.push_back(std::sqrt(thePair.second));
195  }
196  }
197  else {
198  const std::vector<eflowTrackClusterLink*>* matchedClusters_02 = thisEfRecTrack->getAlternativeClusterMatches("cone_02");
199  if (!matchedClusters_02) continue;
200  else bestClusters = *matchedClusters_02;
201  }
202 
203  if (bestClusters.empty()) continue;
204 
205  if (msgLvl(MSG::DEBUG))
206  {
207  for (auto *thisClusterLink : bestClusters ) {
208  xAOD::CaloCluster* thisCluster = thisClusterLink->getCluster()->getCluster();
209  ATH_MSG_DEBUG("Matched this track to cluster with e,pt, eta and phi " << thisCluster->e() << ", " << thisCluster->pt() << ", " << thisCluster->eta() << " and " << thisCluster->phi());
210  }
211  }
212 
213  nMatches++;
214 
215  //loop over the matched calorimeter clusters and associate tracks and clusters to each other as needed.
216  unsigned int linkIndex = 0;
217  for (auto *trkClusLink : bestClusters){
218 
219  eflowRecCluster *thisEFRecCluster = trkClusLink->getCluster();
220 
222  // Look up whether this cluster is intended for recovery
223  if (std::find(data.clusters.begin(), data.clusters.end(), trkClusLink->getCluster()) == data.clusters.end()) {
224  linkIndex++;
225  continue;
226  }
227  }
228 
229  eflowTrackClusterLink *trackClusterLink = eflowTrackClusterLink::getInstance(thisEfRecTrack, thisEFRecCluster, ctx);
230  thisEfRecTrack->addClusterMatch(trackClusterLink);
232  thisEfRecTrack->addDeltaRPrime(deltaRPrime[linkIndex]);
233  }
234  thisEFRecCluster->addTrackMatch(trackClusterLink);
235  }
236  linkIndex++;
237  }
238 
239  /* Create 3 types eflowCaloObjects: track-only, cluster-only, track-cluster-link */
240  std::vector<eflowRecCluster *> clusters(data.clusters.begin(), data.clusters.end());
242  unsigned int nCaloObjects = eflowCaloObjectMaker::makeTrkCluCaloObjects(data.tracks, clusters, data.caloObjects);
243  ATH_MSG_DEBUG("Created " << nCaloObjects << " eflowCaloObjects.");
244  if (msgLvl(MSG::DEBUG)){
245  for (auto thisEFlowCaloObject : *(data.caloObjects)){
246  ATH_MSG_DEBUG("This eflowCaloObject has " << thisEFlowCaloObject->nTracks() << " tracks and " << thisEFlowCaloObject->nClusters() << " clusters ");
247  for (unsigned int count = 0; count < thisEFlowCaloObject->nTracks(); count++){
248  const xAOD::TrackParticle* thisTrack = thisEFlowCaloObject->efRecTrack(count)->getTrack();
249  ATH_MSG_DEBUG("Have track with e, pt, eta and phi of " << thisTrack->e() << ", " << thisTrack->pt() << ", " << thisTrack->eta() << " and " << thisTrack->phi());
250  }
251  for (unsigned int count = 0; count < thisEFlowCaloObject->nClusters(); count++){
252  const xAOD::CaloCluster* thisCluster = thisEFlowCaloObject->efRecCluster(count)->getCluster();
253  ATH_MSG_DEBUG("Have cluster with e, pt, eta and phi of " << thisCluster->e() << ", " << thisCluster->pt() << ", " << thisCluster->eta() << " and " << thisCluster->phi());
254  }
255  }
256  }
257 
258  const double gaussianRadius = 0.032;
259  const double gaussianRadiusError = 1.0e-3;
260  const double maximumRadiusSigma = 3.0;
261 
262  eflowLayerIntegrator integrator(gaussianRadius, gaussianRadiusError, maximumRadiusSigma, m_isHLLHC);
263 
265  if (!m_recoverSplitShowers && 0 != nCaloObj) ATH_MSG_WARNING("Not in Split Showers Mode and already have " << nCaloObj << " eflowCaloObjects");
266 
267  //For each eflowCaloObject we calculate the expected energy deposit in the calorimeter and cell ordering for subtraction.
268  for (unsigned int iCalo = nCaloObj; iCalo < data.caloObjects->size(); ++iCalo) {
269  eflowCaloObject* thisEflowCaloObject = data.caloObjects->at(iCalo);
270  thisEflowCaloObject->simulateShower(&integrator, m_binnedParameters.get(), m_useNNEnergy ? &(*m_NNEnergyPredictorTool) : nullptr, m_useLegacyEBinIndex);
271  if (m_useTruthForChargedShowerSubtraction) m_theTruthShowerSimulator->simulateShower(*thisEflowCaloObject);
272 
273  }
274 
275  if (!m_recoverSplitShowers) return nMatches;
276  else return nCaloObj;
277 }

◆ performSubtraction() [1/2]

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

Definition at line 279 of file PFSubtractionTool.cxx.

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

◆ performSubtraction() [2/2]

void PFSubtractionTool::performSubtraction ( eflowCaloObject thisEflowCaloObject) const
private

Definition at line 287 of file PFSubtractionTool.cxx.

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

◆ performTruthSubtraction() [1/2]

void PFSubtractionTool::performTruthSubtraction ( eflowCaloObject thisEflowCaloObject) const
private

Definition at line 501 of file PFSubtractionTool.cxx.

501  {
502 
503  for (unsigned iTrack = 0; iTrack < thisEflowCaloObject.nTracks(); ++iTrack){
504  eflowRecTrack *thisEfRecTrack = thisEflowCaloObject.efRecTrack(iTrack);
505 
506  //although we are subtracting the truth, to be consistent we only do it if a reco
507  //e/p lookup bin exists for this track
508  if (!thisEfRecTrack->hasBin()) continue;
509 
510  //Similarly we skip tracks in a dense environment
511  if (thisEfRecTrack->isInDenseEnvironment()) continue;
512 
513  thisEfRecTrack->setSubtracted();
514 
515  //get the set of matched clusters
516  std::vector<eflowTrackClusterLink *> links = thisEfRecTrack->getClusterMatches();
517 
518  for (auto thisLink : links){
519  xAOD::CaloCluster *thisCluster = thisLink->getCluster()->getCluster();
520  CaloClusterCellLink* theCellLinks = thisCluster->getOwnCellLinks();
521  CaloClusterCellLink::iterator theCell = theCellLinks->begin();
522  CaloClusterCellLink::iterator lastCell = theCellLinks->end();
523 
524  //loop over the cells in this cluster and subtract shower using truth information
525  //We can either remove a cell entireley if it has any truth deposit (closer to what the real
526  //reco algorithm does) or reweight the cells contribution based on subtracting the truth
527  //energy from the reco cell energy
528 
529  for (; theCell != lastCell; theCell++){
530  //get the truth energy for this cell
531  double truthEnergy = thisEfRecTrack->getCellTruthEnergy(*theCell);
532  //reweight the cell such that energy*weight gives the new energy
533  double oldCellEnergy = theCell->energy()*(theCell.weight());
534  double subtractedCellWeight = (oldCellEnergy - truthEnergy)/oldCellEnergy;
535 
536  if (0.0 != truthEnergy && m_useFullCellTruthSubtraction) thisCluster->removeCell(*theCell);
537  else if (!m_useFullCellTruthSubtraction) theCell.reweight(subtractedCellWeight);
538  }//cell loop
539 
540  float oldEnergy = thisCluster->e();
541  CaloClusterKineHelper::calculateKine(thisCluster, true, true);
542  if (0.0 != oldEnergy) {
543  float energyAdjustment = thisCluster->e() / oldEnergy;
544  thisCluster->setRawE(thisCluster->rawE() * energyAdjustment);
545  thisCluster->setRawEta(thisCluster->eta());
546  thisCluster->setRawPhi(thisCluster->phi());
547  }
548  }
549 
550  }//eflowCaloObject track loop
551 
552 }

◆ performTruthSubtraction() [2/2]

void PFSubtractionTool::performTruthSubtraction ( PFData data) const
private

Definition at line 488 of file PFSubtractionTool.cxx.

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

◆ printAllClusters()

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

Definition at line 577 of file PFSubtractionTool.cxx.

577  {
578 
579  for ( const auto *thisEFRecCluster : recClusterContainer){
580  if (thisEFRecCluster->getTrackMatches().empty()) {
581  ATH_MSG_DEBUG("Isolated" << printCluster(thisEFRecCluster->getCluster()));
582  } else {
583  ATH_MSG_DEBUG("Matched" << printCluster(thisEFRecCluster->getCluster()));
584  std::vector<eflowTrackClusterLink*> theTrackLinks = thisEFRecCluster->getTrackMatches();
585  for ( auto *thisTrack : theTrackLinks){
586  ATH_MSG_DEBUG("Matched" << printTrack(thisTrack->getTrack()->getTrack()));
587  }
588  }
589  }
590 }

◆ printCluster()

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

Definition at line 571 of file PFSubtractionTool.cxx.

571  {
572  std::stringstream result;
573  result << " cluster with E, eta and phi of " << cluster->e() << ", " << cluster->eta() << " and " << cluster->phi();
574  return result.str();
575 }

◆ printTrack()

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

Definition at line 565 of file PFSubtractionTool.cxx.

565  {
566  std::stringstream result;
567  result << " track with E, eta and phi "<< track->e() << ", " << track->eta() << " and " << track->phi();
568  return result.str();
569 }

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 99 of file PFSubtractionTool.h.

◆ m_binnedParameters

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

Definition at line 68 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 90 of file PFSubtractionTool.h.

◆ m_caloClusterReadDecorHandleKeyNLeadingTruthParticles

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

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

Definition at line 126 of file PFSubtractionTool.h.

◆ 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 93 of file PFSubtractionTool.h.

◆ 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 87 of file PFSubtractionTool.h.

◆ 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 84 of file PFSubtractionTool.h.

◆ 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 108 of file PFSubtractionTool.h.

◆ m_pfCalc

PFCalcRadialEnergyProfiles PFSubtractionTool::m_pfCalc {}
private

Definition at line 102 of file PFSubtractionTool.h.

◆ m_pfSubtractionEnergyRatioCalculator

PFSubtractionEnergyRatioCalculator PFSubtractionTool::m_pfSubtractionEnergyRatioCalculator {}
private

Definition at line 104 of file PFSubtractionTool.h.

◆ m_pfSubtractionStatusSetter

PFSubtractionStatusSetter PFSubtractionTool::m_pfSubtractionStatusSetter {}
private

Definition at line 103 of file PFSubtractionTool.h.

◆ 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 81 of file PFSubtractionTool.h.

◆ 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 96 of file PFSubtractionTool.h.

◆ m_subtractor

eflowSubtract::Subtractor PFSubtractionTool::m_subtractor {}
private

Definition at line 105 of file PFSubtractionTool.h.

◆ 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 66 of file PFSubtractionTool.h.

◆ 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 74 of file PFSubtractionTool.h.

◆ 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 77 of file PFSubtractionTool.h.

◆ 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 78 of file PFSubtractionTool.h.

◆ m_theTruthShowerSimulator

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

Definition at line 123 of file PFSubtractionTool.h.

◆ m_trkpos

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

Track position provider to be used to preselect clusters.

Definition at line 71 of file PFSubtractionTool.h.

◆ m_useFullCellTruthSubtraction

Gaudi::Property<bool> PFSubtractionTool::m_useFullCellTruthSubtraction {this,"useFullCellTruthSubtraction",false,"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 121 of file PFSubtractionTool.h.

◆ 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 133 of file PFSubtractionTool.h.

◆ 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 111 of file PFSubtractionTool.h.

◆ 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 118 of file PFSubtractionTool.h.

◆ 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 115 of file PFSubtractionTool.h.


The documentation for this class was generated from the following files:
eflowRecCluster
This class extends the information about a xAOD::CaloCluster.
Definition: eflowRecCluster.h:40
xAOD::CaloCluster_v1::phi
virtual double phi() const
The azimuthal angle ( ) of the particle.
Definition: CaloCluster_v1.cxx:256
eflowRecCluster::SortDescendingPt
Definition: eflowRecCluster.h:124
xAOD::TrackParticle_v1::pt
virtual double pt() const override final
The transverse momentum ( ) of the particle.
Definition: TrackParticle_v1.cxx:73
xAOD::CaloCluster_v1::rawE
flt_t rawE() const
eflowCaloObject::nClusters
unsigned nClusters() const
Definition: eflowCaloObject.h:59
data
char data[hepevt_bytes_allocation_ATLAS]
Definition: HepEvt.cxx:11
PFSubtractionTool::performTruthSubtraction
void performTruthSubtraction(PFData &data) const
Definition: PFSubtractionTool.cxx:488
eflowCaloObject::getExpectedEnergy
double getExpectedEnergy() const
Definition: eflowCaloObject.cxx:40
pdg_comparison.sigma
sigma
Definition: pdg_comparison.py:324
eflowLayerIntegrator
This class calculates the LHED (Layer of Highest Energy Density) in a cluster or group of clusters.
Definition: eflowLayerIntegrator.h:35
get_generator_info.result
result
Definition: get_generator_info.py:21
eflowCaloObject::efRecLink
const std::vector< std::pair< eflowTrackClusterLink *, std::pair< float, float > > > & efRecLink() const
Definition: eflowCaloObject.h:64
PFSubtractionTool::m_isHLLHC
Gaudi::Property< bool > m_isHLLHC
Toggle whether we have the HLLHC setup.
Definition: PFSubtractionTool.h:87
find
std::string find(const std::string &s)
return a remapped string
Definition: hcg.cxx:135
PFSubtractionTool::m_useTruthMatching
Gaudi::Property< bool > m_useTruthMatching
Toggle whether to cheat and use truth information for track-cluster matching - only for performance s...
Definition: PFSubtractionTool.h:115
PFSubtractionTool::m_subtractor
eflowSubtract::Subtractor m_subtractor
Definition: PFSubtractionTool.h:105
SG::Accessor
Helper class to provide type-safe access to aux data.
Definition: Control/AthContainers/AthContainers/Accessor.h:68
eflowRecTrack::isInDenseEnvironment
bool isInDenseEnvironment() const
Definition: eflowRecTrack.h:103
PFClusterFiller::fillClustersToRecover
static void fillClustersToRecover(PFData &data)
Definition: PFClusterFiller.cxx:5
eflowRecCluster::addTrackMatch
void addTrackMatch(eflowTrackClusterLink *trackMatch)
Definition: eflowRecCluster.h:69
PFSubtractionEnergyRatioCalculator::calculateSubtractedEnergyRatios
void calculateSubtractedEnergyRatios(const std::vector< std::pair< xAOD::CaloCluster *, bool >> &clusterSubtractionList, std::map< xAOD::CaloCluster *, double > &clusterEnergyMap, std::vector< std::pair< float, float >> &clusterSubtractedEnergyRatios) const
For each xAOD::CaloCluster in clusterSubtractionList we calculate the ratio of new to old energy afte...
Definition: PFSubtractionEnergyRatioCalculator.cxx:13
xAOD::TrackParticle_v1::eta
virtual double eta() const override final
The pseudorapidity ( ) of the particle.
Definition: TrackParticle_v1.cxx:77
PFSubtractionTool::m_NNEnergyPredictorTool
ToolHandle< PFEnergyPredictorTool > m_NNEnergyPredictorTool
Tool for getting predictiing the energy using an ONNX model.
Definition: PFSubtractionTool.h:108
PFSubtractionStatusSetter::markAllTracksAnnihStatus
void markAllTracksAnnihStatus(eflowCaloObject &thisEflowCaloObject) const
Set the ratio of new to old cluster energy, to zero, for all cluster matched to all tracks attached t...
Definition: PFSubtractionStatusSetter.cxx:71
eflowRecTrack::getCellTruthEnergy
double getCellTruthEnergy(const CaloCell *cell) const
Definition: eflowRecTrack.cxx:95
accumulate
bool accumulate(AccumulateMap &map, std::vector< module_t > const &modules, FPGATrackSimMatrixAccumulator const &acc)
Accumulates an accumulator (e.g.
Definition: FPGATrackSimMatrixAccumulator.cxx:22
TruthLink
ElementLink< xAOD::TruthParticleContainer > TruthLink
Definition: TruthRelatedMuonPlotOrganizer.cxx:12
PFSubtractionTool::m_consistencySigmaCut
Gaudi::Property< double > m_consistencySigmaCut
Parameter that controls whether a track, in a track-cluster system, will be processed by the split sh...
Definition: PFSubtractionTool.h:93
PFSubtractionTool::m_useTruthForChargedShowerSubtraction
Gaudi::Property< bool > m_useTruthForChargedShowerSubtraction
Toggle whether we use truth information for the charged shower subtraction or not.
Definition: PFSubtractionTool.h:118
eflowRecTrack::hasBin
bool hasBin() const
Definition: eflowRecTrack.h:74
PFSubtractionTool::m_trkpos
std::unique_ptr< PFMatch::TrackEtaPhiInFixedLayersProvider > m_trkpos
Track position provider to be used to preselect clusters.
Definition: PFSubtractionTool.h:71
PFSubtractionTool::matchAndCreateEflowCaloObj
unsigned int matchAndCreateEflowCaloObj(PFData &data) const
This matches ID tracks and CaloClusters, and then creates eflowCaloObjects.
Definition: PFSubtractionTool.cxx:97
eflowCaloObject
An internal EDM object which stores information about systems of associated tracks and calorimeter cl...
Definition: eflowCaloObject.h:33
eflowSubtract::Subtractor::subtractTracksFromClusters
void subtractTracksFromClusters(eflowRecTrack *efRecTrack, std::vector< std::pair< xAOD::CaloCluster *, bool >> &clusterSubtractionList, const bool &addCPData) const
Definition: eflowSubtractor.cxx:27
XMLtoHeader.count
count
Definition: XMLtoHeader.py:85
PFMatch::TrackPositionFactory::Get
static std::unique_ptr< IPositionProvider > Get(const std::string &positionType)
Definition: PFMatchPositions.h:95
python.iconfTool.models.loaders.level
level
Definition: loaders.py:20
CaloCell::energy
double energy() const
get energy (data member)
Definition: CaloCell.h:311
eflowRecTrack::addSubtractedCaloCell
void addSubtractedCaloCell(ElementLink< CaloCellContainer > theCellLink, const double &weight)
Definition: eflowRecTrack.h:115
eflowCaloObject::getExpectedVariance
double getExpectedVariance() const
Definition: eflowCaloObject.cxx:48
eflowCaloObject::addTrack
void addTrack(eflowRecTrack *track)
Definition: eflowCaloObject.h:39
eflowRecTrack
This class extends the information about a xAOD::Track.
Definition: eflowRecTrack.h:46
PFTrackFiller
Definition: PFTrackFiller.h:7
PFSubtractionTool::m_pfSubtractionStatusSetter
PFSubtractionStatusSetter m_pfSubtractionStatusSetter
Definition: PFSubtractionTool.h:103
eflowRecTrack::setSubtracted
void setSubtracted()
Definition: eflowRecTrack.cxx:100
eflowRecTrack::getClusterMatches
const std::vector< eflowTrackClusterLink * > & getClusterMatches() const
Definition: eflowRecTrack.h:67
PFSubtractionTool::m_theEOverPTool
ToolHandle< IEFlowCellEOverPTool > m_theEOverPTool
Tool for getting e/p values and hadronic shower cell ordering principle parameters.
Definition: PFSubtractionTool.h:66
PFSubtractionTool::m_useNNEnergy
Gaudi::Property< bool > m_useNNEnergy
Toggle whether we use the neural net energy.
Definition: PFSubtractionTool.h:111
xAOD::CaloCluster_v1
Description of a calorimeter cluster.
Definition: CaloCluster_v1.h:59
eflowCaloObject::efRecTrack
const eflowRecTrack * efRecTrack(int i) const
Definition: eflowCaloObject.h:51
PFSubtractionTool::m_nClusterMatchesToUse
Gaudi::Property< int > m_nClusterMatchesToUse
Number of clusters to match to each track if not doing recover split shower subtraction.
Definition: PFSubtractionTool.h:84
xAOD::CaloCluster_v1::setRawE
void setRawE(flt_t)
Set Energy for signal state UNCALIBRATED.
Definition: CaloCluster_v1.cxx:284
PFSubtractionTool::printAllClusters
void printAllClusters(const eflowRecClusterContainer &recClusterContainer) const
Definition: PFSubtractionTool.cxx:577
ATH_MSG_ERROR
#define ATH_MSG_ERROR(x)
Definition: AthMsgStreamMacros.h:33
xAOD::CaloCluster_v1::removeCell
bool removeCell(const CaloCell *ptr)
Method to remove a cell to the cluster (slow!) (Beware: Kinematics not updated!)
Definition: CaloCluster_v1.cxx:923
SG::ReadDecorHandle
Handle class for reading a decoration on an object.
Definition: StoreGate/StoreGate/ReadDecorHandle.h:94
PFSubtractionTool::isEOverPFail
bool isEOverPFail(double expectedEnergy, double sigma, double clusterEnergy) const
Definition: PFSubtractionTool.cxx:554
xAOD::CaloCluster_v1::eta
virtual double eta() const
The pseudorapidity ( ) of the particle.
Definition: CaloCluster_v1.cxx:251
PFSubtractionTool::m_pfCalc
PFCalcRadialEnergyProfiles m_pfCalc
Definition: PFSubtractionTool.h:102
PFSubtractionTool::performSubtraction
void performSubtraction(const unsigned int &startingPoint, PFData &data) const
Definition: PFSubtractionTool.cxx:279
eflowRecTrack::isSubtracted
bool isSubtracted() const
Definition: eflowRecTrack.h:80
DMTest::links
links
Definition: CLinks_v1.cxx:22
ATH_MSG_DEBUG
#define ATH_MSG_DEBUG(x)
Definition: AthMsgStreamMacros.h:29
HepMC::barcode
int barcode(const T *p)
Definition: Barcode.h:16
xAOD::TruthParticle_v1
Class describing a truth particle in the MC record.
Definition: TruthParticle_v1.h:37
PFSubtractionTool::m_theMatchingToolForPull_02
ToolHandle< PFTrackClusterMatchingTool > m_theMatchingToolForPull_02
Definition: PFSubtractionTool.h:78
PFClusterFiller
Definition: PFClusterFiller.h:7
PFCalcRadialEnergyProfiles::calculate
void calculate(const PFData &data) const
Definition: PFCalcRadialEnergyProfiles.cxx:11
PFSubtractionStatusSetter::markSubtractionStatus
void markSubtractionStatus(const std::vector< std::pair< xAOD::CaloCluster *, bool >> &clusterList, std::vector< std::pair< float, float >> &clusterSubtractedEnergyRatios, eflowCaloObject &thisEflowCaloObject, unsigned int trackIndex) const
Set the ratio of new to old cluster energy for each cluster matched to a track with trackIndex.
Definition: PFSubtractionStatusSetter.cxx:17
PFSubtractionEnergyRatioCalculator::calculateSubtractedEnergyRatiosForAnnih
void calculateSubtractedEnergyRatiosForAnnih(const std::vector< std::pair< xAOD::CaloCluster *, bool >> &clusterSubtractionList, std::map< xAOD::CaloCluster *, double > &clusterEnergyMap, std::vector< std::pair< float, float >> &clusterSubtractedEnergyRatios) const
If we have decided to annihiliate all clusters in clusterSubtractionList we use this function to set ...
Definition: PFSubtractionEnergyRatioCalculator.cxx:49
eflowRecTrack::getEExpect
double getEExpect() const
Definition: eflowRecTrack.h:84
asg::AsgMessaging::msg
MsgStream & msg() const
The standard message stream.
Definition: AsgMessaging.cxx:49
PFSubtractionTool::m_calcEOverP
Gaudi::Property< bool > m_calcEOverP
Toggle EOverP algorithm mode, whereby no charged shower subtraction is performed.
Definition: PFSubtractionTool.h:90
test_pyathena.parent
parent
Definition: test_pyathena.py:15
xAOD::CaloCluster_v1::setRawEta
void setRawEta(flt_t)
Set for signal state UNCALIBRATED.
Definition: CaloCluster_v1.cxx:289
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
eflowRecCluster::getCluster
xAOD::CaloCluster * getCluster()
Definition: eflowRecCluster.h:49
eflowCaloObject::nTracks
unsigned nTracks() const
Definition: eflowCaloObject.h:53
SG::AuxElement::index
size_t index() const
Return the index of this element within its container.
xAOD::TruthParticle_v1::barcode
int barcode() const
Barcode.
eflowSubtract::Subtractor::m_facilitator
eflowCellSubtractionFacilitator m_facilitator
Definition: eflowSubtractor.h:56
PFData
Definition: PFData.h:11
xAOD::CaloCluster_v1::getCellLinks
const CaloClusterCellLink * getCellLinks() const
Get a pointer to the CaloClusterCellLink object (const version)
Definition: CaloCluster_v1.cxx:905
PFSubtractionTool::m_pfSubtractionEnergyRatioCalculator
PFSubtractionEnergyRatioCalculator m_pfSubtractionEnergyRatioCalculator
Definition: PFSubtractionTool.h:104
PFSubtractionTool::m_recoverSplitShowers
Gaudi::Property< bool > m_recoverSplitShowers
Toggle whether we are recovering split showers or not.
Definition: PFSubtractionTool.h:81
PFSubtractionTool::m_useLegacyEBinIndex
Gaudi::Property< bool > m_useLegacyEBinIndex
Further discussion about why this flag exists can be found in https://its.cern.ch/jira/browse/ATLJETM...
Definition: PFSubtractionTool.h:133
PFSubtractionTool::printTrack
static std::string printTrack(const xAOD::TrackParticle *track)
Definition: PFSubtractionTool.cxx:565
xAOD::CaloCluster_v1::pt
virtual double pt() const
The transverse momentum ( ) of the particle (negative for negative-energy clusters)
Definition: CaloCluster_v1.cxx:247
eflowRecTrack::getTrack
const xAOD::TrackParticle * getTrack() const
Definition: eflowRecTrack.h:54
python.EventInfoMgtInit.release
release
Definition: EventInfoMgtInit.py:24
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:221
PFSubtractionTool::m_caloClusterReadDecorHandleKeyNLeadingTruthParticles
SG::ReadDecorHandleKey< xAOD::CaloClusterContainer > m_caloClusterReadDecorHandleKeyNLeadingTruthParticles
Read handle key to decorate CaloCluster with threeN leading truth particle barcode and energy.
Definition: PFSubtractionTool.h:126
eflowCaloObjectMaker::makeTrkCluCaloObjects
static unsigned int makeTrkCluCaloObjects(eflowRecTrackContainer *eflowTrackContainer, eflowRecClusterContainer *eflowClusterContainer, eflowCaloObjectContainer *caloObjectContainer)
Definition: eflowCaloObjectMaker.cxx:25
PFSubtractionTool::addSubtractedCells
void addSubtractedCells(eflowCaloObject &thisEflowCaloObject, const std::vector< std::pair< xAOD::CaloCluster *, bool > > &clusterList) const
Definition: PFSubtractionTool.cxx:592
PFSubtractionTool::m_subtractionSigmaCut
Gaudi::Property< double > m_subtractionSigmaCut
Parameter that controls whether to use retain remaining calorimeter energy in track-cluster system,...
Definition: PFSubtractionTool.h:96
PFClusterFiller::fillClustersToConsider
static void fillClustersToConsider(PFData &data, eflowRecClusterContainer &recClusterContainer)
Definition: PFClusterFiller.cxx:25
xAOD::TrackParticle_v1::e
virtual double e() const override final
The total energy of the particle.
Definition: TrackParticle_v1.cxx:109
PFSubtractionTool::canAnnihilate
bool canAnnihilate(double expectedEnergy, double sigma, double clusterEnergy) const
Definition: PFSubtractionTool.cxx:560
xAOD::JetAttributeAccessor::accessor
const AccessorWrapper< T > * accessor(xAOD::JetAttribute::AttributeID id)
Returns an attribute accessor corresponding to an AttributeID.
Definition: JetAccessorMap.h:26
python.LumiBlobConversion.pos
pos
Definition: LumiBlobConversion.py:18
PFSubtractionTool::m_useFullCellTruthSubtraction
Gaudi::Property< bool > m_useFullCellTruthSubtraction
Toggle whether we fully remove a cell with a truth deposit or reweight it based on truth contribution...
Definition: PFSubtractionTool.h:121
PFTrackFiller::fillTracksToConsider
static void fillTracksToConsider(PFData &data, eflowRecTrackContainer &recTrackContainer)
Definition: PFTrackFiller.cxx:57
PFSubtractionTool::m_theMatchingTool
ToolHandle< PFTrackClusterMatchingTool > m_theMatchingTool
Default track-cluster matching tool.
Definition: PFSubtractionTool.h:74
PFSubtractionTool::printCluster
static std::string printCluster(const xAOD::CaloCluster *cluster)
Definition: PFSubtractionTool.cxx:571
std::sort
void sort(typename std::reverse_iterator< DataModel_detail::iterator< DVL > > beg, typename std::reverse_iterator< DataModel_detail::iterator< DVL > > end, const Compare &comp)
Specialization of sort for DataVector/List.
Definition: DVL_algorithms.h:623
ATH_MSG_WARNING
#define ATH_MSG_WARNING(x)
Definition: AthMsgStreamMacros.h:32
eflowCaloObject::efRecCluster
const eflowRecCluster * efRecCluster(int i) const
Definition: eflowCaloObject.h:57
PFSubtractionTool::m_theTruthShowerSimulator
ToolHandle< PFSimulateTruthShowerTool > m_theTruthShowerSimulator
Definition: PFSubtractionTool.h:123
eflowRecTrack::getVarEExpect
double getVarEExpect() const
Definition: eflowRecTrack.h:85
python.CaloScaleNoiseConfig.type
type
Definition: CaloScaleNoiseConfig.py:78
xAOD::CaloCluster_v1::getOwnCellLinks
CaloClusterCellLink * getOwnCellLinks()
Get a pointer to the owned CaloClusterCellLink object (non-const version)
Definition: CaloCluster_v1.h:762
DEBUG
#define DEBUG
Definition: page_access.h:11
RunTileMonitoring.clusters
clusters
Definition: RunTileMonitoring.py:133
PFMatch::TrackEtaPhiInFixedLayersProvider
Definition: PFMatchPositions.h:76
CaloClusterKineHelper::calculateKine
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.
Definition: CaloClusterKineHelper.cxx:223
PFSubtractionTool::m_binnedParameters
std::unique_ptr< eflowEEtaBinnedParameters > m_binnedParameters
Definition: PFSubtractionTool.h:68
PFSubtractionTool::m_theMatchingToolForPull_015
ToolHandle< PFTrackClusterMatchingTool > m_theMatchingToolForPull_015
Definition: PFSubtractionTool.h:77
eflowCaloObject::getClusterEnergy
double getClusterEnergy() const
Definition: eflowCaloObject.cxx:56
egammaParameters::linkIndex
@ linkIndex
link index for multiple track and vertex matches
Definition: egammaParamDefs.h:574
xAOD::track
@ track
Definition: TrackingPrimitives.h:512
xAOD::TrackParticle_v1
Class describing a TrackParticle.
Definition: TrackParticle_v1.h:43
PFTrackFiller::fillTracksToRecover
static void fillTracksToRecover(PFData &data)
Definition: PFTrackFiller.cxx:5
PFSubtractionTool::m_addCPData
Gaudi::Property< bool > m_addCPData
Toggle whether to decorate eflowRecTrack with addutional data for Combined Performance studies.
Definition: PFSubtractionTool.h:99
python.AutoConfigFlags.msg
msg
Definition: AutoConfigFlags.py:7
xAOD::CaloCluster_v1::e
virtual double e() const
The total energy of the particle.
Definition: CaloCluster_v1.cxx:265
eflowCaloObject::simulateShower
void simulateShower(eflowLayerIntegrator *integrator, const eflowEEtaBinnedParameters *binnedParameters, const PFEnergyPredictorTool *energyP, bool useLegacyEnergyBinIndexing)
Definition: eflowCaloObject.cxx:64
xAOD::TrackParticle_v1::phi
virtual double phi() const override final
The azimuthal angle ( ) of the particle (has range to .)
xAOD::CaloCluster_v1::setRawPhi
void setRawPhi(flt_t)
Set for signal state UNCALIBRATED.
Definition: CaloCluster_v1.cxx:294
eflowSubtract::Subtractor::annihilateClusters
static void annihilateClusters(std::vector< std::pair< xAOD::CaloCluster *, bool >> &clusters)
Definition: eflowSubtractor.cxx:78