CMS 3D CMS Logo

L1TkElectronTrackProducer.cc
Go to the documentation of this file.
1 // -*- C++ -*-
2 //
10 //
11 // system include files
12 #include <memory>
13 
14 // user include files
17 
22 
27 
30 
32 
35 
36 // Matching Algorithm
40 
43 
44 #include <string>
45 
46 static constexpr float EB_MaxEta = 0.9;
47 
48 using namespace l1t;
49 
50 //
51 // class declaration
52 //
53 
55 public:
57  typedef std::vector<L1TTTrackType> L1TTTrackCollectionType;
58 
60  ~L1TkElectronTrackProducer() override;
61 
62  static void fillDescriptions(edm::ConfigurationDescriptions& descriptions);
63 
64 private:
65  //void beginJob() override;
66  void produce(edm::Event&, const edm::EventSetup&) override;
67  //void endJob() override;
68 
69  float isolation(const edm::Handle<L1TTTrackCollectionType>& trkHandle, int match_index);
70  double getPtScaledCut(double pt, std::vector<double>& parameters);
71  bool selectMatchedTrack(double& d_r, double& d_phi, double& d_eta, double& tk_pt, float& eg_eta);
72 
73  // ----------member data ---------------------------
75 
76  float etMin_; // min ET in GeV of L1EG objects
77 
78  float dRMin_;
79  float dRMax_;
80  float pTMinTra_;
82  unsigned int minNStubsIsoTracks_;
83 
84  bool primaryVtxConstrain_; // use the primary vertex (default = false)
85  float deltaZ_; // | z_track - z_ref_track | < deltaZ_ in cm.
86  // Used only when primaryVtxConstrain_ = True.
87  float isoCut_;
89 
93  std::vector<double> dPhiCutoff_;
94  std::vector<double> dRCutoff_;
95  std::vector<double> dEtaCutoff_;
97 
101 };
102 
103 //
104 // constructors and destructor
105 //
107  : egToken_(consumes<EGammaBxCollection>(iConfig.getParameter<edm::InputTag>("L1EGammaInputTag"))),
108  trackToken_(consumes<std::vector<TTTrack<Ref_Phase2TrackerDigi_> > >(
109  iConfig.getParameter<edm::InputTag>("L1TrackInputTag"))),
110  geomToken_(esConsumes<TrackerGeometry, TrackerDigiGeometryRecord>()) {
111  // label of the collection produced
112  // e.g. EG or IsoEG if all objects are kept
113  // EGIsoTrk or IsoEGIsoTrk if only the EG or IsoEG
114  // objects that pass a cut RelIso < isoCut_ are written
115  // in the new collection.
116  label = iConfig.getParameter<std::string>("label");
117 
118  etMin_ = (float)iConfig.getParameter<double>("ETmin");
119 
120  // parameters for the calculation of the isolation :
121  pTMinTra_ = (float)iConfig.getParameter<double>("PTMINTRA");
122  dRMin_ = (float)iConfig.getParameter<double>("DRmin");
123  dRMax_ = (float)iConfig.getParameter<double>("DRmax");
124  deltaZ_ = (float)iConfig.getParameter<double>("DeltaZ");
125  maxChi2IsoTracks_ = iConfig.getParameter<double>("maxChi2IsoTracks");
126  minNStubsIsoTracks_ = iConfig.getParameter<int>("minNStubsIsoTracks");
127  // cut applied on the isolation (if this number is <= 0, no cut is applied)
128  isoCut_ = (float)iConfig.getParameter<double>("IsoCut");
129  relativeIsolation_ = iConfig.getParameter<bool>("RelativeIsolation");
130 
131  // parameters to select tracks to match with L1EG
132  trkQualityChi2_ = (float)iConfig.getParameter<double>("TrackChi2");
133  trkQualityPtMin_ = (float)iConfig.getParameter<double>("TrackMinPt");
134  useTwoStubsPT_ = iConfig.getParameter<bool>("useTwoStubsPT");
135  dPhiCutoff_ = iConfig.getParameter<std::vector<double> >("TrackEGammaDeltaPhi");
136  dRCutoff_ = iConfig.getParameter<std::vector<double> >("TrackEGammaDeltaR");
137  dEtaCutoff_ = iConfig.getParameter<std::vector<double> >("TrackEGammaDeltaEta");
138  matchType_ = iConfig.getParameter<std::string>("TrackEGammaMatchType");
139 
140  produces<TkElectronCollection>(label);
141 }
142 
144 
145 // ------------ method called to produce the data ------------
147  std::unique_ptr<TkElectronCollection> result(new TkElectronCollection);
148 
149  // geometry needed to call pTFrom2Stubs
151  const TrackerGeometry* tGeom = geomHandle.product();
152 
153  // the L1EGamma objects
154  edm::Handle<EGammaBxCollection> eGammaHandle;
155  iEvent.getByToken(egToken_, eGammaHandle);
156  EGammaBxCollection eGammaCollection = (*eGammaHandle.product());
158 
159  // the L1Tracks
160  edm::Handle<L1TTTrackCollectionType> L1TTTrackHandle;
161  iEvent.getByToken(trackToken_, L1TTTrackHandle);
162  L1TTTrackCollectionType::const_iterator trackIter;
163 
164  if (!eGammaHandle.isValid()) {
165  throw cms::Exception("L1TkElectronTrackProducer")
166  << "\nWarning: L1EmCollection not found in the event. Exit" << std::endl;
167  return;
168  }
169  if (!L1TTTrackHandle.isValid()) {
170  throw cms::Exception("TkEmProducer") << "\nWarning: L1TTTrackCollectionType not found in the event. Exit."
171  << std::endl;
172  return;
173  }
174 
175  int ieg = 0;
176  for (egIter = eGammaCollection.begin(0); egIter != eGammaCollection.end(0); ++egIter) { // considering BX = only
177  edm::Ref<EGammaBxCollection> EGammaRef(eGammaHandle, ieg);
178  ieg++;
179 
180  float e_ele = egIter->energy();
181  float eta_ele = egIter->eta();
182  float et_ele = 0;
183  float cosh_eta_ele = cosh(eta_ele);
184  if (cosh_eta_ele > 0.0)
185  et_ele = e_ele / cosh_eta_ele;
186  else
187  et_ele = -1.0;
188  if (etMin_ > 0.0 && et_ele <= etMin_)
189  continue;
190  // match the L1EG object with a L1Track
191  float drmin = 999;
192  int itr = 0;
193  int itrack = -1;
194  for (trackIter = L1TTTrackHandle->begin(); trackIter != L1TTTrackHandle->end(); ++trackIter) {
195  edm::Ptr<L1TTTrackType> L1TrackPtr(L1TTTrackHandle, itr);
196  double trkPt_fit = trackIter->momentum().perp();
197  double trkPt_stubs = pTFrom2Stubs::pTFrom2(trackIter, tGeom);
198  double trkPt = trkPt_fit;
199  if (useTwoStubsPT_)
200  trkPt = trkPt_stubs;
201 
202  if (trkPt > trkQualityPtMin_ && trackIter->chi2() < trkQualityChi2_) {
203  double dPhi = 99.;
204  double dR = 99.;
205  double dEta = 99.;
206  L1TkElectronTrackMatchAlgo::doMatch(egIter, L1TrackPtr, dPhi, dR, dEta);
207  if (dR < drmin && selectMatchedTrack(dR, dPhi, dEta, trkPt, eta_ele)) {
208  drmin = dR;
209  itrack = itr;
210  }
211  }
212  itr++;
213  }
214  if (itrack >= 0) {
215  edm::Ptr<L1TTTrackType> matchedL1TrackPtr(L1TTTrackHandle, itrack);
216 
217  const math::XYZTLorentzVector P4 = egIter->p4();
218  float trkisol = isolation(L1TTTrackHandle, itrack);
219  if (relativeIsolation_ && et_ele > 0.0) { // relative isolation
220  trkisol = trkisol / et_ele;
221  }
222 
223  TkElectron trkEm(P4, EGammaRef, matchedL1TrackPtr, trkisol);
224 
225  trkEm.setTrackCurvature(matchedL1TrackPtr->rInv()); // should this have npars? 4? 5?
226 
227  //std::cout<<matchedL1TrackPtr->rInv()<<" "<<matchedL1TrackPtr->rInv(4)<<" "<<matchedL1TrackPtr->rInv()<<std::endl;
228 
229  if (isoCut_ <= 0) {
230  // write the L1TkEm particle to the collection,
231  // irrespective of its relative isolation
232  result->push_back(trkEm);
233  } else {
234  // the object is written to the collection only
235  // if it passes the isolation cut
236  if (trkisol <= isoCut_)
237  result->push_back(trkEm);
238  }
239  }
240 
241  } // end loop over EGamma objects
242 
243  iEvent.put(std::move(result), label);
244 }
245 
246 // ------------ method called once each job just before starting event loop ------------
247 //void L1TkElectronTrackProducer::beginJob() {}
248 
249 // ------------ method called once each job just after ending the event loop ------------
250 //void L1TkElectronTrackProducer::endJob() {}
251 
252 // ------------ method called when starting to processes a run ------------
253 /*
254 void
255 L1TkElectronTrackProducer::beginRun(edm::Run& iRun, edm::EventSetup const& iSetup)
256 {
257 }
258 */
259 
260 // ------------ method called when ending the processing of a run ------------
261 /*
262 void
263 L1TkElectronTrackProducer::endRun(edm::Run&, edm::EventSetup const&)
264 {
265 }
266 */
267 
268 // ------------ method called when starting to processes a luminosity block ------------
269 /*
270 void
271 L1TkElectronTrackProducer::beginLuminosityBlock(edm::LuminosityBlock&, edm::EventSetup const&)
272 {
273 }
274 */
275 
276 // ------------ method called when ending the processing of a luminosity block ------------
277 /*
278 void
279 L1TkElectronTrackProducer::endLuminosityBlock(edm::LuminosityBlock&, edm::EventSetup const&)
280 {
281 }
282 */
283 
284 // ------------ method fills 'descriptions' with the allowed parameters for the module ------------
286  //The following says we do not know what parameters are allowed so do no validation
287  // Please change this to state exactly what you do use, even if it is no parameters
289  desc.setUnknown();
290  descriptions.addDefault(desc);
291 }
292 // method to calculate isolation
294  edm::Ptr<L1TTTrackType> matchedTrkPtr(trkHandle, match_index);
295  L1TTTrackCollectionType::const_iterator trackIter;
296 
297  float sumPt = 0.0;
298  int itr = 0;
299 
300  float dRMin2 = dRMin_ * dRMin_;
301  float dRMax2 = dRMax_ * dRMax_;
302 
303  for (trackIter = trkHandle->begin(); trackIter != trkHandle->end(); ++trackIter) {
304  if (itr++ != match_index) {
305  if (trackIter->chi2() > maxChi2IsoTracks_ || trackIter->momentum().perp() <= pTMinTra_ ||
306  trackIter->getStubRefs().size() < minNStubsIsoTracks_) {
307  continue;
308  }
309 
310  float dZ = std::abs(trackIter->POCA().z() - matchedTrkPtr->POCA().z());
311 
312  float phi1 = trackIter->momentum().phi();
313  float phi2 = matchedTrkPtr->momentum().phi();
314  float dPhi = reco::deltaPhi(phi1, phi2);
315  float dEta = (trackIter->momentum().eta() - matchedTrkPtr->momentum().eta());
316  float dR2 = (dPhi * dPhi + dEta * dEta);
317 
318  if (dR2 > dRMin2 && dR2 < dRMax2 && dZ < deltaZ_ && trackIter->momentum().perp() > pTMinTra_) {
319  sumPt += trackIter->momentum().perp();
320  }
321  }
322  }
323 
324  return sumPt;
325 }
326 double L1TkElectronTrackProducer::getPtScaledCut(double pt, std::vector<double>& parameters) {
327  return (parameters[0] + parameters[1] * exp(parameters[2] * pt));
328 }
330  double& d_r, double& d_phi, double& d_eta, double& tk_pt, float& eg_eta) {
331  if (matchType_ == "PtDependentCut") {
332  if (std::abs(d_phi) < getPtScaledCut(tk_pt, dPhiCutoff_) && d_r < getPtScaledCut(tk_pt, dRCutoff_))
333  return true;
334  } else {
335  double deta_max = dEtaCutoff_[0];
336  if (std::abs(eg_eta) < EB_MaxEta)
337  deta_max = dEtaCutoff_[1];
338  double dphi_max = dPhiCutoff_[0];
339  if ((d_eta / deta_max) * (d_eta / deta_max) + (d_phi / dphi_max) * (d_phi / dphi_max) < 1)
340  return true;
341  }
342  return false;
343 }
344 //define this as a plug-in
l1t::TkElectron
Definition: TkElectron.h:24
edm::ESHandle::product
T const * product() const
Definition: ESHandle.h:86
L1TkElectronTrackProducer::etMin_
float etMin_
Definition: L1TkElectronTrackProducer.cc:76
Handle.h
dqmMemoryStats.float
float
Definition: dqmMemoryStats.py:127
L1TkElectronTrackProducer::trkQualityChi2_
float trkQualityChi2_
Definition: L1TkElectronTrackProducer.cc:90
TrackerGeometry.h
L1TkElectronTrackProducer::pTMinTra_
float pTMinTra_
Definition: L1TkElectronTrackProducer.cc:80
edm::Handle::product
T const * product() const
Definition: Handle.h:70
TTTrack::momentum
GlobalVector momentum() const
Track momentum.
Definition: TTTrack.h:281
L1TkElectronTrackProducer::selectMatchedTrack
bool selectMatchedTrack(double &d_r, double &d_phi, double &d_eta, double &tk_pt, float &eg_eta)
Definition: L1TkElectronTrackProducer.cc:329
L1TkElectronTrackProducer::~L1TkElectronTrackProducer
~L1TkElectronTrackProducer() override
Definition: L1TkElectronTrackProducer.cc:143
ESHandle.h
L1TkElectronEtComparator.h
DiDispStaMuonMonitor_cfi.pt
pt
Definition: DiDispStaMuonMonitor_cfi.py:39
L1TkElectronTrackProducer::isolation
float isolation(const edm::Handle< L1TTTrackCollectionType > &trkHandle, int match_index)
Definition: L1TkElectronTrackProducer.cc:293
reco::deltaPhi
constexpr double deltaPhi(double phi1, double phi2)
Definition: deltaPhi.h:26
edm::EDGetTokenT< EGammaBxCollection >
L1TkElectronTrackProducer::maxChi2IsoTracks_
float maxChi2IsoTracks_
Definition: L1TkElectronTrackProducer.cc:81
BXVector::const_iterator
std::vector< T >::const_iterator const_iterator
Definition: BXVector.h:18
edm
HLT enums.
Definition: AlignableModifier.h:19
L1TkElectronTrackProducer::dPhiCutoff_
std::vector< double > dPhiCutoff_
Definition: L1TkElectronTrackProducer.cc:93
L1TkElectronTrackProducer::primaryVtxConstrain_
bool primaryVtxConstrain_
Definition: L1TkElectronTrackProducer.cc:84
edm::ParameterSetDescription
Definition: ParameterSetDescription.h:52
L1TkElectronTrackMatchAlgo.h
TTTrack
Class to store the L1 Track Trigger tracks.
Definition: TTTrack.h:26
EDProducer.h
L1TkElectronTrackProducer::matchType_
std::string matchType_
Definition: L1TkElectronTrackProducer.cc:96
L1TkElectronTrackProducer::trkQualityPtMin_
float trkQualityPtMin_
Definition: L1TkElectronTrackProducer.cc:92
edm::Handle
Definition: AssociativeIterator.h:50
TTTrack::rInv
double rInv() const
Track curvature.
Definition: TTTrack.h:286
ESGetToken.h
L1TkElectronTrackProducer::dEtaCutoff_
std::vector< double > dEtaCutoff_
Definition: L1TkElectronTrackProducer.cc:95
L1TkElectronTrackProducer::isoCut_
float isoCut_
Definition: L1TkElectronTrackProducer.cc:87
L1TkElectronTrackProducer::L1TTTrackType
TTTrack< Ref_Phase2TrackerDigi_ > L1TTTrackType
Definition: L1TkElectronTrackProducer.cc:56
HLT_2018_cff.dEta
dEta
Definition: HLT_2018_cff.py:12289
L1TkElectronTrackProducer::getPtScaledCut
double getPtScaledCut(double pt, std::vector< double > &parameters)
Definition: L1TkElectronTrackProducer.cc:326
edm::Ref
Definition: AssociativeIterator.h:58
TtFullHadEvtBuilder_cfi.sumPt
sumPt
Definition: TtFullHadEvtBuilder_cfi.py:38
parameters
parameters
Definition: BeamSpot_PayloadInspector.cc:14
L1TkElectronTrackProducer::L1TkElectronTrackProducer
L1TkElectronTrackProducer(const edm::ParameterSet &)
Definition: L1TkElectronTrackProducer.cc:106
PV3DBase::z
T z() const
Definition: PV3DBase.h:61
BXVector
Definition: BXVector.h:15
L1TkElectronTrackProducer::egToken_
const edm::EDGetTokenT< EGammaBxCollection > egToken_
Definition: L1TkElectronTrackProducer.cc:98
TTTrack::POCA
GlobalPoint POCA() const
POCA.
Definition: TTTrack.h:316
MakerMacros.h
DEFINE_FWK_MODULE
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
L1TkElectronTrackProducer
Definition: L1TkElectronTrackProducer.cc:54
EGamma.h
l1t::EGammaRef
edm::Ref< EGammaBxCollection > EGammaRef
Definition: TkEGTau.h:35
TrackerDigiGeometryRecord
Definition: TrackerDigiGeometryRecord.h:15
fillDescriptions
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
HLT_2018_cff.dPhi
dPhi
Definition: HLT_2018_cff.py:12290
edm::ESHandle< TrackerGeometry >
L1TkElectronTrackMatchAlgo::doMatch
void doMatch(BXVector< l1t::EGamma >::const_iterator egIter, const edm::Ptr< L1TTTrackType > &pTrk, double &dph, double &dr, double &deta)
L1TkElectronTrackProducer::dRMax_
float dRMax_
Definition: L1TkElectronTrackProducer.cc:79
L1TkElectronTrackProducer::fillDescriptions
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
Definition: L1TkElectronTrackProducer.cc:285
BXVector::begin
const_iterator begin(int bx) const
edm::ConfigurationDescriptions
Definition: ConfigurationDescriptions.h:28
AlCaHLTBitMon_QueryRunRegistry.string
string
Definition: AlCaHLTBitMon_QueryRunRegistry.py:256
L1TkElectronTrackProducer::minNStubsIsoTracks_
unsigned int minNStubsIsoTracks_
Definition: L1TkElectronTrackProducer.cc:82
TrackerDigiGeometryRecord.h
BXVector::end
const_iterator end(int bx) const
HLT_2018_cff.InputTag
InputTag
Definition: HLT_2018_cff.py:79016
edm::ParameterSet
Definition: ParameterSet.h:36
Event.h
L1TkElectronTrackProducer::L1TTTrackCollectionType
std::vector< L1TTTrackType > L1TTTrackCollectionType
Definition: L1TkElectronTrackProducer.cc:57
l1t::TkElectronCollection
std::vector< TkElectron > TkElectronCollection
Definition: TkElectronFwd.h:15
l1t
delete x;
Definition: CaloConfig.h:22
pTFrom2Stubs::pTFrom2
float pTFrom2(std::vector< TTTrack< Ref_Phase2TrackerDigi_ > >::const_iterator trk, const TrackerGeometry *tkGeometry)
Definition: pTFrom2Stubs.cc:72
PV3DBase::eta
T eta() const
Definition: PV3DBase.h:73
LorentzVector.h
iEvent
int iEvent
Definition: GenABIO.cc:224
edm::EventSetup::getHandle
ESHandle< T > getHandle(const ESGetToken< T, R > &iToken) const
Definition: EventSetup.h:141
L1TkElectronTrackProducer::label
std::string label
Definition: L1TkElectronTrackProducer.cc:74
edm::stream::EDProducer
Definition: EDProducer.h:38
edm::ParameterSetDescription::setUnknown
void setUnknown()
Definition: ParameterSetDescription.cc:39
edm::EventSetup
Definition: EventSetup.h:57
itr
std::vector< std::pair< float, float > >::iterator itr
Definition: HGCDigitizer.cc:28
L1TkElectronTrackProducer::trackToken_
const edm::EDGetTokenT< std::vector< TTTrack< Ref_Phase2TrackerDigi_ > > > trackToken_
Definition: L1TkElectronTrackProducer.cc:99
edm::ESGetToken< TrackerGeometry, TrackerDigiGeometryRecord >
L1TkElectronTrackProducer::deltaZ_
float deltaZ_
Definition: L1TkElectronTrackProducer.cc:85
L1TkElectronTrackProducer::dRMin_
float dRMin_
Definition: L1TkElectronTrackProducer.cc:78
InputTag.h
l1t::TkElectron::setTrackCurvature
void setTrackCurvature(double trackCurvature)
Definition: TkElectron.h:46
edm::Ptr
Definition: AssociationVector.h:31
edm::ParameterSet::getParameter
T getParameter(std::string const &) const
TkElectron.h
L1TkElectronTrackProducer::geomToken_
const edm::ESGetToken< TrackerGeometry, TrackerDigiGeometryRecord > geomToken_
Definition: L1TkElectronTrackProducer.cc:100
eostools.move
def move(src, dest)
Definition: eostools.py:511
std
Definition: JetResolutionObject.h:76
TkElectronFwd.h
L1TkElectronTrackProducer::produce
void produce(edm::Event &, const edm::EventSetup &) override
Definition: L1TkElectronTrackProducer.cc:146
Frameworkfwd.h
math::XYZTLorentzVector
XYZTLorentzVectorD XYZTLorentzVector
Lorentz vector with cylindrical internal representation using pseudorapidity.
Definition: LorentzVector.h:29
Exception
Definition: hltDiff.cc:246
EventSetup.h
L1TkElectronTrackProducer::useTwoStubsPT_
bool useTwoStubsPT_
Definition: L1TkElectronTrackProducer.cc:91
mps_fire.result
result
Definition: mps_fire.py:303
funct::abs
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
HGC3DClusterGenMatchSelector_cfi.dR
dR
Definition: HGC3DClusterGenMatchSelector_cfi.py:7
ParameterSet.h
JetChargeProducer_cfi.exp
exp
Definition: JetChargeProducer_cfi.py:6
edm::HandleBase::isValid
bool isValid() const
Definition: HandleBase.h:70
L1TkElectronTrackProducer::relativeIsolation_
bool relativeIsolation_
Definition: L1TkElectronTrackProducer.cc:88
edm::Event
Definition: Event.h:73
edm::ConfigurationDescriptions::addDefault
void addDefault(ParameterSetDescription const &psetDescription)
Definition: ConfigurationDescriptions.cc:99
PV3DBase::phi
Geom::Phi< T > phi() const
Definition: PV3DBase.h:66
pTFrom2Stubs.h
isolation
double isolation
Definition: AssociatedVariableMaxCutCandRefSelector.cc:25
deltaPhi.h
EB_MaxEta
static constexpr float EB_MaxEta
Definition: L1TkElectronTrackProducer.cc:46
L1TkElectronTrackProducer::dRCutoff_
std::vector< double > dRCutoff_
Definition: L1TkElectronTrackProducer.cc:94
TrackerGeometry
Definition: TrackerGeometry.h:14