ATLAS Offline Software
PFSubtractionTool.cxx
Go to the documentation of this file.
2 
11 #include "eflowRec/PFTrackFiller.h"
12 
16 
17 using namespace eflowSubtract;
18 
19 PFSubtractionTool::PFSubtractionTool(const std::string &type, const std::string &name, const IInterface *parent) : base_class(type, name, parent),
20  m_binnedParameters(std::make_unique<eflowEEtaBinnedParameters>())
21 {
22 }
23 
25 = default;
26 
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 }
62 
63 void PFSubtractionTool::execute(eflowCaloObjectContainer *theEflowCaloObjectContainer, eflowRecTrackContainer *recTrackContainer, eflowRecClusterContainer *recClusterContainer) const
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 }
96 
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 }
278 
279 void PFSubtractionTool::performSubtraction(const unsigned int& startingPoint,PFData &data) const{
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 }
286 
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 }
487 
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 }
500 
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 }
553 
554 bool PFSubtractionTool::isEOverPFail(double expectedEnergy, double sigma, double clusterEnergy) const
555 {
556  if ((expectedEnergy == 0) && (clusterEnergy > 0)) return false;
557  return clusterEnergy < expectedEnergy - m_consistencySigmaCut * sigma;
558 }
559 
560 bool PFSubtractionTool::canAnnihilate(double expectedEnergy, double sigma, double clusterEnergy) const
561 {
562  return clusterEnergy - expectedEnergy < m_subtractionSigmaCut * sigma;
563 }
564 
566  std::stringstream result;
567  result << " track with E, eta and phi "<< track->e() << ", " << track->eta() << " and " << track->phi();
568  return result.str();
569 }
570 
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 }
576 
577 void PFSubtractionTool::printAllClusters(const eflowRecClusterContainer& recClusterContainer) const {
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 }
591 
592 void PFSubtractionTool::addSubtractedCells(eflowCaloObject& thisEflowCaloObject, const std::vector<std::pair<xAOD::CaloCluster *, bool> >& clusterList) const{
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 }
607 
608 StatusCode PFSubtractionTool::finalize() { return StatusCode::SUCCESS; }
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
CaloClusterKineHelper.h
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
eflowEEtaBinnedParameters
Inherits from eflowEEtaBinBase.
Definition: eflowEEtaBinnedParameters.h:56
pdg_comparison.sigma
sigma
Definition: pdg_comparison.py:324
IEFlowCellEOverPTool.h
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
eflowSubtract
Definition: eflowSubtractor.h:27
eflowRecTrack::isInDenseEnvironment
bool isInDenseEnvironment() const
Definition: eflowRecTrack.h:103
make_unique
std::unique_ptr< T > make_unique(Args &&... args)
Definition: SkimmingToolEXOT5.cxx:23
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
TruthParticleContainer.h
eflowRecClusterContainer
Definition: eflowRecCluster.h:275
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.h
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
eflowCaloObjectMaker.h
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
eflowLayerIntegrator.h
eflowRecTrack.h
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::execute
void execute(eflowCaloObjectContainer *theEflowCaloObjectContainer, eflowRecTrackContainer *recTrackContainer, eflowRecClusterContainer *recClusterContainer) const
Definition: PFSubtractionTool.cxx:63
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
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
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::initialize
StatusCode initialize()
Definition: PFSubtractionTool.cxx:27
PFSubtractionTool::PFSubtractionTool
PFSubtractionTool(const std::string &type, const std::string &name, const IInterface *parent)
Definition: PFSubtractionTool.cxx:19
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
PFSubtractionTool::~PFSubtractionTool
~PFSubtractionTool()
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
eflowCaloObject.h
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
eflowRecTrackContainer
Definition: eflowRecTrack.h:191
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
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
ReadDecorHandle.h
Handle class for reading a decoration on an object.
PFSubtractionTool::finalize
StatusCode finalize()
Definition: PFSubtractionTool.cxx:608
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
PFClusterFiller.h
PFTrackFiller.h
eflowCaloObjectContainer
Definition: eflowCaloObject.h:100
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
eflowEEtaBinnedParameters.h
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