CMS 3D CMS Logo

RecoTauPhotonFilter.cc
Go to the documentation of this file.
1 /*
2  * ===========================================================================
3  *
4  * Filename: RecoTauPhotonFilter
5  *
6  * Description: Modify taus to recursively filter lowpt photons
7  *
8  * Author: Evan K. Friis (UC Davis)
9  *
10  * ===========================================================================
11  */
12 
15 
16 namespace reco::tau {
17 
18 // Filter photons
20  public:
22  ~RecoTauPhotonFilter() override {}
23  void operator()(PFTau&) const override;
24  private:
25  bool filter(const RecoTauPiZero* piZero,
26  const reco::Candidate::LorentzVector& tau) const;
29 };
30 
34  pset.getParameter<double>("minPtFractionSinglePhotons");
36  pset.getParameter<double>("minPtFractionPiZeroes");
37 }
38 
39 // Sort container of PiZero pointers by ascending Pt
40 namespace {
41 struct PiZeroPtSorter {
42  bool operator()(const RecoTauPiZero* A, const RecoTauPiZero* B) {
43  return (A->pt() < B->pt());
44  }
45 };
46 }
47 
48 // Decide if we should filter a pi zero or not.
51  if (piZero->numberOfDaughters() > 1)
52  return piZero->pt()/total.pt() < minPtFractionPiZeroes_;
53  return piZero->pt()/total.pt() < minPtFractionSinglePhotons_;
54 }
55 
56 
58  std::vector<const RecoTauPiZero*> signalPiZeros;
59  for(auto const& piZero : tau.signalPiZeroCandidates()) {
60  signalPiZeros.push_back(&piZero);
61  }
62  std::sort(signalPiZeros.begin(), signalPiZeros.end(), PiZeroPtSorter());
63  std::vector<const RecoTauPiZero*>::const_iterator wimp =
64  signalPiZeros.begin();
65 
66  // Loop until we have a sturdy enough pizero
67  reco::Candidate::LorentzVector totalP4 = tau.p4();
68  while(wimp != signalPiZeros.end() && filter(*wimp, totalP4)) {
69  totalP4 -= (*wimp)->p4();
70  ++wimp;
71  }
72 
73  if (wimp != signalPiZeros.begin()) {
74  // We filtered stuff, update our tau
75  double ptDifference = (totalP4 - tau.p4()).pt();
77  tau.isolationPFGammaCandsEtSum() + ptDifference);
78 
79  // Update four vector
80  tau.setP4(totalP4);
81 
82  std::vector<RecoTauPiZero> toMove;
83  std::vector<RecoTauPiZero> newSignal;
84  std::vector<RecoTauPiZero> newIsolation;
85 
86  // Build our new objects
87  for (std::vector<const RecoTauPiZero*>::const_iterator iter =
88  signalPiZeros.begin(); iter != wimp; ++iter) {
89  toMove.push_back(**iter);
90  }
91  for (std::vector<const RecoTauPiZero*>::const_iterator iter =
92  wimp; iter != signalPiZeros.end(); ++iter) {
93  newSignal.push_back(**iter);
94  }
95  // Build our new isolation collection
96  std::copy(toMove.begin(), toMove.end(), std::back_inserter(newIsolation));
98  tau.isolationPiZeroCandidates().end(),
99  std::back_inserter(newIsolation));
100 
101  // Set the collections in the taus.
102  tau.setsignalPiZeroCandidates(newSignal);
103  tau.setisolationPiZeroCandidates(newIsolation);
104 
105  // Now we need to deal with the gamma candidates underlying moved pizeros.
106  std::vector<CandidatePtr> pfcandsToMove = flattenPiZeros(toMove);
107 
108  // Copy the keys to move
109  std::set<size_t> keysToMove;
110  for(auto const& ptr : pfcandsToMove) {
111  keysToMove.insert(ptr.key());
112  }
113 
114  std::vector<CandidatePtr> newSignalGammas;
115  std::vector<CandidatePtr> newSignalCands;
116  std::vector<CandidatePtr> newIsolationGammas = tau.isolationGammaCands();
117  std::vector<CandidatePtr> newIsolationCands = tau.isolationCands();
118 
119  // Move the necessary signal pizeros - what a mess!
120  for(auto const& ptr : tau.signalCands()) {
121  if (keysToMove.count(ptr.key()))
122  newIsolationCands.push_back(ptr);
123  else
124  newSignalCands.push_back(ptr);
125  }
126 
127  for(auto const& ptr : tau.signalGammaCands()) {
128  if (keysToMove.count(ptr.key()))
129  newIsolationGammas.push_back(ptr);
130  else
131  newSignalGammas.push_back(ptr);
132  }
133 
134  tau.setsignalCands(newSignalCands);
135  tau.setsignalCands(newSignalGammas);
136  tau.setisolationGammaCands(newIsolationGammas);
137  tau.setisolationCands(newIsolationCands);
138  }
139 }
140 } // end namespace reco::tau
144  "RecoTauPhotonFilter");
T getParameter(std::string const &) const
void setisolationPiZeroCandidates(std::vector< RecoTauPiZero >)
Definition: PFTau.cc:264
float isolationPFGammaCandsEtSum() const
Definition: PFTau.cc:323
def copy(args, dbName)
double pt() const final
transverse momentum
const std::vector< reco::CandidatePtr > & signalGammaCands() const
Gamma candidates in signal region.
Definition: PFTau.cc:84
void setsignalPiZeroCandidates(std::vector< RecoTauPiZero >)
Definition: PFTau.cc:241
void setisolationPFGammaCandsEtSum(const float &)
Definition: PFTau.cc:324
const std::vector< reco::CandidatePtr > & isolationGammaCands() const
Gamma candidates in isolation region.
Definition: PFTau.cc:93
size_t numberOfDaughters() const override
number of daughters
std::vector< CandidatePtr > flattenPiZeros(const std::vector< RecoTauPiZero >::const_iterator &, const std::vector< RecoTauPiZero >::const_iterator &)
Flatten a list of pi zeros into a list of there constituent PFCandidates.
void operator()(PFTau &) const override
void setisolationCands(const std::vector< reco::CandidatePtr > &)
Definition: PFTau.cc:88
const std::vector< RecoTauPiZero > & signalPiZeroCandidates() const
Retrieve the association of signal region gamma candidates into candidate PiZeros.
Definition: PFTau.cc:230
const LorentzVector & p4() const final
four-momentum Lorentz vector
Definition: LeafCandidate.h:99
static const std::string B
void setsignalCands(const std::vector< reco::CandidatePtr > &)
Definition: PFTau.cc:79
const std::vector< RecoTauPiZero > & isolationPiZeroCandidates() const
Retrieve the association of isolation region gamma candidates into candidate PiZeros.
Definition: PFTau.cc:249
RecoTauPhotonFilter(const edm::ParameterSet &pset, edm::ConsumesCollector &&iC)
math::XYZTLorentzVector LorentzVector
Lorentz vector.
Definition: Candidate.h:37
void setisolationGammaCands(const std::vector< reco::CandidatePtr > &)
Definition: PFTau.cc:94
bool filter(const RecoTauPiZero *piZero, const reco::Candidate::LorentzVector &tau) const
const std::vector< reco::CandidatePtr > & isolationCands() const
Candidates in isolation region.
Definition: PFTau.cc:87
#define DEFINE_EDM_PLUGIN(factory, type, name)
const std::vector< reco::CandidatePtr > & signalCands() const
Candidates in signal region.
Definition: PFTau.cc:78
void setP4(const LorentzVector &p4) final
set 4-momentum
def move(src, dest)
Definition: eostools.py:511