CMS 3D CMS Logo

LeptonUpdater.cc
Go to the documentation of this file.
9 
14 
15 namespace pat {
16 
17 
18  template<typename T>
20 
21  public:
22 
23  explicit LeptonUpdater(const edm::ParameterSet & iConfig) :
24  src_(consumes<std::vector<T>>(iConfig.getParameter<edm::InputTag>("src"))),
25  vertices_(consumes<std::vector<reco::Vertex>>(iConfig.getParameter<edm::InputTag>("vertices"))),
26  beamLineToken_(consumes<reco::BeamSpot>(iConfig.getParameter<edm::InputTag>("beamspot"))),
27  computeMiniIso_(iConfig.getParameter<bool>("computeMiniIso")),
28  fixDxySign_(iConfig.getParameter<bool>("fixDxySign"))
29  {
30  //for mini-isolation calculation
31  if (computeMiniIso_) {
32  readMiniIsoParams(iConfig);
33  pcToken_ = consumes<pat::PackedCandidateCollection >(iConfig.getParameter<edm::InputTag>("pfCandsForMiniIso"));
34  }
36  if (typeid(T) == typeid(pat::Muon)) recomputeMuonBasicSelectors_ = iConfig.getParameter<bool>("recomputeMuonBasicSelectors");
37  produces<std::vector<T>>();
38  }
39 
40  ~LeptonUpdater() override {}
41 
42  void produce(edm::StreamID, edm::Event&, edm::EventSetup const&) const override ;
43 
44  static void fillDescriptions(edm::ConfigurationDescriptions & descriptions) {
46  desc.add<edm::InputTag>("src")->setComment("Lepton collection");
47  desc.add<edm::InputTag>("vertices")->setComment("Vertex collection");
48  desc.add<edm::InputTag>("beamspot", edm::InputTag("offlineBeamSpot"))->setComment("Beam spot");
49  desc.add<bool>("computeMiniIso", false)->setComment("Recompute miniIsolation");
50  desc.add<bool>("fixDxySign", false)->setComment("Fix the IP sign");
51  desc.addOptional<edm::InputTag>("pfCandsForMiniIso", edm::InputTag("packedPFCandidates"))->setComment("PackedCandidate collection used for miniIso");
52  if (typeid(T) == typeid(pat::Muon)) {
53  desc.add<bool>("recomputeMuonBasicSelectors",false)->setComment("Recompute basic cut-based muon selector flags");
54  desc.addOptional<std::vector<double>>("miniIsoParams")->setComment("Parameters used for miniIso (as in PATMuonProducer)");
55  descriptions.add("muonsUpdated", desc);
56  } else if (typeid(T) == typeid(pat::Electron)) {
57  desc.addOptional<std::vector<double>>("miniIsoParamsB")->setComment("Parameters used for miniIso in the barrel (as in PATElectronProducer)");
58  desc.addOptional<std::vector<double>>("miniIsoParamsE")->setComment("Parameters used for miniIso in the endcap (as in PATElectronProducer)");
59  descriptions.add("electronsUpdated", desc);
60  }
61  }
62 
63  void setDZ(T & lep, const reco::Vertex & pv) const {}
64 
65  void readMiniIsoParams(const edm::ParameterSet & iConfig) {
66  miniIsoParams_[0] = iConfig.getParameter<std::vector<double> >("miniIsoParams");
67  if(miniIsoParams_[0].size() != 9) throw cms::Exception("ParameterError", "miniIsoParams must have exactly 9 elements.\n");
68  }
69  const std::vector<double> & miniIsoParams(const T &lep) const { return miniIsoParams_[0]; }
70 
71  void recomputeMuonBasicSelectors(T &, const reco::Vertex &, const bool) const;
72 
73  private:
74  // configurables
81  std::vector<double> miniIsoParams_[2];
83  };
84 
85  // must do the specialization within the namespace otherwise gcc complains
86  //
87  template<>
89  auto track = anElectron.gsfTrack();
90  anElectron.setDB( track->dz(pv.position()), std::hypot(track->dzError(), pv.zError()), pat::Electron::PVDZ );
91  }
92 
93  template<>
95  auto track = aMuon.muonBestTrack();
96  aMuon.setDB( track->dz(pv.position()), std::hypot(track->dzError(), pv.zError()), pat::Muon::PVDZ );
97  }
98 
99  template<>
101  miniIsoParams_[0] = iConfig.getParameter<std::vector<double> >("miniIsoParamsB");
102  miniIsoParams_[1] = iConfig.getParameter<std::vector<double> >("miniIsoParamsE");
103  if(miniIsoParams_[0].size() != 9) throw cms::Exception("ParameterError", "miniIsoParamsB must have exactly 9 elements.\n");
104  if(miniIsoParams_[1].size() != 9) throw cms::Exception("ParameterError", "miniIsoParamsE must have exactly 9 elements.\n");
105  }
106  template<>
107  const std::vector<double> & LeptonUpdater<pat::Electron>::miniIsoParams(const pat::Electron &lep) const {
108  return miniIsoParams_[lep.isEE()];
109  }
110 
111  template<typename T>
112  void LeptonUpdater<T>::recomputeMuonBasicSelectors(T & lep, const reco::Vertex & pv, const bool do_hip_mitigation_2016) const {}
113 
114  template<>
115  void LeptonUpdater<pat::Muon>::recomputeMuonBasicSelectors(pat::Muon & lep, const reco::Vertex & pv, const bool do_hip_mitigation_2016) const {
116  muon::setCutBasedSelectorFlags(lep, &pv, do_hip_mitigation_2016);
117  }
118 
119 } // namespace
120 
121 template<typename T>
124  iEvent.getByToken(src_, src);
125 
127  iEvent.getByToken(vertices_, vertices);
128  const reco::Vertex & pv = vertices->front();
129 
131  if(computeMiniIso_) iEvent.getByToken(pcToken_, pc);
132 
133  edm::Handle<reco::BeamSpot> beamSpotHandle;
134  iEvent.getByToken(beamLineToken_, beamSpotHandle);
136  bool beamSpotIsValid = false;
137  if(beamSpotHandle.isValid()) {
138  beamSpot = *beamSpotHandle;
139  beamSpotIsValid = true;
140  } else {
141  edm::LogError("DataNotAvailable") << "No beam spot available \n";
142  }
143 
144  std::unique_ptr<std::vector<T>> out(new std::vector<T>(*src));
145 
146  const bool do_hip_mitigation_2016 = recomputeMuonBasicSelectors_ && (272728 <= iEvent.run() && iEvent.run() <= 278808);
147 
148  for (unsigned int i = 0, n = src->size(); i < n; ++i) {
149  T & lep = (*out)[i];
150  setDZ(lep, pv);
151  if (computeMiniIso_) {
152  const auto & params = miniIsoParams(lep);
153  pat::PFIsolation miniiso = pat::getMiniPFIsolation(pc.product(), lep.p4(),
154  params[0], params[1], params[2],
155  params[3], params[4], params[5],
156  params[6], params[7], params[8]);
157  lep.setMiniPFIsolation(miniiso);
158  }
159  if (recomputeMuonBasicSelectors_) recomputeMuonBasicSelectors(lep,pv,do_hip_mitigation_2016);
160  //Fixing the sign of impact parameters
161  if (fixDxySign_) {
162  float signPV = 1.;
163  float signBS = 1.;
164  if (beamSpotIsValid) {
165  signBS = copysign(1., lep.bestTrack()->dxy(beamSpot));
166  }
167  signPV = copysign(1., lep.bestTrack()->dxy(pv.position()));
168  lep.setDB(abs(lep.dB(T::PV2D)) * signPV, lep.edB(T::PV2D), T::PV2D);
169  lep.setDB(abs(lep.dB(T::BS2D)) * signBS, lep.edB(T::BS2D), T::BS2D);
170  }
171  }
172 
173  iEvent.put(std::move(out));
174 }
175 
176 
177 
180 
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:137
ParameterDescriptionBase * addOptional(U const &iLabel, T const &value)
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:579
double zError() const
error on z
Definition: Vertex.h:123
pat::LeptonUpdater< pat::Electron > PATElectronUpdater
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:17
LeptonUpdater(const edm::ParameterSet &iConfig)
void setCutBasedSelectorFlags(reco::Muon &muon, const reco::Vertex *vertex=0, bool run2016_hip_mitigation=false)
const Point & position() const
position
Definition: Vertex.h:109
edm::EDGetTokenT< std::vector< T > > src_
bool isEE() const
Definition: GsfElectron.h:353
pat::LeptonUpdater< pat::Muon > PATMuonUpdater
EDGetTokenT< ProductType > consumes(edm::InputTag const &tag)
Definition: HeavyIon.h:7
edm::EDGetTokenT< reco::BeamSpot > beamLineToken_
void setDB(double dB, double edB, IPTYPE type)
Set impact parameter of a certain type and its uncertainty.
int iEvent
Definition: GenABIO.cc:230
void setDB(double dB, double edB, IPTYPE type=PV2D)
Definition: Muon.h:244
bool recomputeMuonBasicSelectors_
~LeptonUpdater() override
RunNumber_t run() const
Definition: Event.h:109
def pv(vc)
Definition: MetAnalyzer.py:6
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
void setDZ(T &lep, const reco::Vertex &pv) const
ParameterDescriptionBase * add(U const &iLabel, T const &value)
bool isValid() const
Definition: HandleBase.h:74
void recomputeMuonBasicSelectors(T &, const reco::Vertex &, const bool) const
edm::EDGetTokenT< pat::PackedCandidateCollection > pcToken_
T const * product() const
Definition: Handle.h:81
Analysis-level electron class.
Definition: Electron.h:52
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:50
edm::EDGetTokenT< std::vector< reco::Vertex > > vertices_
def move(src, dest)
Definition: eostools.py:510