CMS 3D CMS Logo

LeptonUpdater.cc
Go to the documentation of this file.
9 
14 
15 namespace pat {
16 
17  template <typename T>
19  public:
20  explicit LeptonUpdater(const edm::ParameterSet &iConfig)
21  : src_(consumes<std::vector<T>>(iConfig.getParameter<edm::InputTag>("src"))),
22  vertices_(consumes<std::vector<reco::Vertex>>(iConfig.getParameter<edm::InputTag>("vertices"))),
23  computeMiniIso_(iConfig.getParameter<bool>("computeMiniIso")) {
24  //for mini-isolation calculation
25  if (computeMiniIso_) {
26  readMiniIsoParams(iConfig);
27  pcToken_ = consumes<pat::PackedCandidateCollection>(iConfig.getParameter<edm::InputTag>("pfCandsForMiniIso"));
28  }
30  if (typeid(T) == typeid(pat::Muon))
31  recomputeMuonBasicSelectors_ = iConfig.getParameter<bool>("recomputeMuonBasicSelectors");
32  produces<std::vector<T>>();
33  }
34 
35  ~LeptonUpdater() override {}
36 
37  void produce(edm::StreamID, edm::Event &, edm::EventSetup const &) const override;
38 
39  static void fillDescriptions(edm::ConfigurationDescriptions &descriptions) {
41  desc.add<edm::InputTag>("src")->setComment("Lepton collection");
42  desc.add<edm::InputTag>("vertices")->setComment("Vertex collection");
43  desc.add<bool>("computeMiniIso", false)->setComment("Recompute miniIsolation");
44  desc.addOptional<edm::InputTag>("pfCandsForMiniIso", edm::InputTag("packedPFCandidates"))
45  ->setComment("PackedCandidate collection used for miniIso");
46  if (typeid(T) == typeid(pat::Muon)) {
47  desc.add<bool>("recomputeMuonBasicSelectors", false)
48  ->setComment("Recompute basic cut-based muon selector flags");
49  desc.addOptional<std::vector<double>>("miniIsoParams")
50  ->setComment("Parameters used for miniIso (as in PATMuonProducer)");
51  descriptions.add("muonsUpdated", desc);
52  } else if (typeid(T) == typeid(pat::Electron)) {
53  desc.addOptional<std::vector<double>>("miniIsoParamsB")
54  ->setComment("Parameters used for miniIso in the barrel (as in PATElectronProducer)");
55  desc.addOptional<std::vector<double>>("miniIsoParamsE")
56  ->setComment("Parameters used for miniIso in the endcap (as in PATElectronProducer)");
57  descriptions.add("electronsUpdated", desc);
58  }
59  }
60 
61  void setDZ(T &lep, const reco::Vertex &pv) const {}
62 
63  void readMiniIsoParams(const edm::ParameterSet &iConfig) {
64  miniIsoParams_[0] = iConfig.getParameter<std::vector<double>>("miniIsoParams");
65  if (miniIsoParams_[0].size() != 9)
66  throw cms::Exception("ParameterError", "miniIsoParams must have exactly 9 elements.\n");
67  }
68  const std::vector<double> &miniIsoParams(const T &lep) const { return miniIsoParams_[0]; }
69 
70  void recomputeMuonBasicSelectors(T &, const reco::Vertex &, const bool) const;
71 
72  private:
73  // configurables
78  std::vector<double> miniIsoParams_[2];
80  };
81 
82  // must do the specialization within the namespace otherwise gcc complains
83  //
84  template <>
86  auto track = anElectron.gsfTrack();
87  anElectron.setDB(track->dz(pv.position()), std::hypot(track->dzError(), pv.zError()), pat::Electron::PVDZ);
88  }
89 
90  template <>
92  auto track = aMuon.muonBestTrack();
93  aMuon.setDB(track->dz(pv.position()), std::hypot(track->dzError(), pv.zError()), pat::Muon::PVDZ);
94  }
95 
96  template <>
98  miniIsoParams_[0] = iConfig.getParameter<std::vector<double>>("miniIsoParamsB");
99  miniIsoParams_[1] = iConfig.getParameter<std::vector<double>>("miniIsoParamsE");
100  if (miniIsoParams_[0].size() != 9)
101  throw cms::Exception("ParameterError", "miniIsoParamsB must have exactly 9 elements.\n");
102  if (miniIsoParams_[1].size() != 9)
103  throw cms::Exception("ParameterError", "miniIsoParamsE must have exactly 9 elements.\n");
104  }
105  template <>
106  const std::vector<double> &LeptonUpdater<pat::Electron>::miniIsoParams(const pat::Electron &lep) const {
107  return miniIsoParams_[lep.isEE()];
108  }
109 
110  template <typename T>
112  const reco::Vertex &pv,
113  const bool do_hip_mitigation_2016) const {}
114 
115  template <>
117  const reco::Vertex &pv,
118  const bool do_hip_mitigation_2016) const {
119  lep.setSelectors(muon::makeSelectorBitset(lep, &pv, do_hip_mitigation_2016));
120  }
121 
122 } // namespace pat
123 
124 template <typename T>
127  iEvent.getByToken(src_, src);
128 
130  iEvent.getByToken(vertices_, vertices);
131  const reco::Vertex &pv = vertices->front();
132 
134  if (computeMiniIso_)
135  iEvent.getByToken(pcToken_, pc);
136 
137  std::unique_ptr<std::vector<T>> out(new std::vector<T>(*src));
138 
139  const bool do_hip_mitigation_2016 =
140  recomputeMuonBasicSelectors_ && (272728 <= iEvent.run() && iEvent.run() <= 278808);
141 
142  for (unsigned int i = 0, n = src->size(); i < n; ++i) {
143  T &lep = (*out)[i];
144  setDZ(lep, pv);
145  if (computeMiniIso_) {
146  const auto &params = miniIsoParams(lep);
148  lep.p4(),
149  params[0],
150  params[1],
151  params[2],
152  params[3],
153  params[4],
154  params[5],
155  params[6],
156  params[7],
157  params[8]);
158  lep.setMiniPFIsolation(miniiso);
159  }
161  recomputeMuonBasicSelectors(lep, pv, do_hip_mitigation_2016);
162  }
163 
164  iEvent.put(std::move(out));
165 }
166 
169 
size
Write out results.
T getParameter(std::string const &) const
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
OrphanHandle< PROD > put(std::unique_ptr< PROD > product)
Put a new product.
Definition: Event.h:131
ParameterDescriptionBase * addOptional(U const &iLabel, T const &value)
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:525
double zError() const
error on z
Definition: Vertex.h:127
pat::LeptonUpdater< pat::Electron > PATElectronUpdater
LeptonUpdater(const edm::ParameterSet &iConfig)
const Point & position() const
position
Definition: Vertex.h:113
edm::EDGetTokenT< std::vector< T > > src_
bool isEE() const
Definition: GsfElectron.h:329
pat::LeptonUpdater< pat::Muon > PATMuonUpdater
EDGetTokenT< ProductType > consumes(edm::InputTag const &tag)
Definition: HeavyIon.h:7
void setDB(double dB, double edB, IPTYPE type)
Set impact parameter of a certain type and its uncertainty.
int iEvent
Definition: GenABIO.cc:224
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
void setDB(double dB, double edB, IPTYPE type=PV2D)
Definition: Muon.h:245
bool recomputeMuonBasicSelectors_
void setSelectors(uint64_t selectors)
Definition: Muon.h:240
~LeptonUpdater() override
RunNumber_t run() const
Definition: Event.h:107
def pv(vc)
Definition: MetAnalyzer.py:7
void setDZ(T &lep, const reco::Vertex &pv) const
ParameterDescriptionBase * add(U const &iLabel, T const &value)
void recomputeMuonBasicSelectors(T &, const reco::Vertex &, const bool) const
reco::Muon::Selector makeSelectorBitset(reco::Muon const &muon, reco::Vertex const *vertex=0, bool run2016_hip_mitigation=false)
edm::EDGetTokenT< pat::PackedCandidateCollection > pcToken_
T const * product() const
Definition: Handle.h:69
Analysis-level electron class.
Definition: Electron.h:51
void add(std::string const &label, ParameterSetDescription const &psetDescription)
const std::vector< double > & miniIsoParams(const T &lep) const
void readMiniIsoParams(const edm::ParameterSet &iConfig)
fixed size matrix
HLT enums.
PFIsolation getMiniPFIsolation(const pat::PackedCandidateCollection *pfcands, const math::XYZTLorentzVector &p4, float mindr=0.05, float maxdr=0.2, float kt_scale=10.0, float ptthresh=0.5, float deadcone_ch=0.0001, float deadcone_pu=0.01, float deadcone_ph=0.01, float deadcone_nh=0.01, float dZ_cut=0.0)
reco::TrackRef muonBestTrack() const override
Track selected to be the best measurement of the muon parameters (including PFlow global information)...
void produce(edm::StreamID, edm::Event &, edm::EventSetup const &) const override
std::vector< double > miniIsoParams_[2]
reco::GsfTrackRef gsfTrack() const override
override the reco::GsfElectron::gsfTrack method, to access the internal storage of the supercluster ...
long double T
Analysis-level muon class.
Definition: Muon.h:51
edm::EDGetTokenT< std::vector< reco::Vertex > > vertices_
def move(src, dest)
Definition: eostools.py:511