CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
L1TkFastVertexProducer.cc
Go to the documentation of this file.
1 // -*- C++ -*-
2 //
3 //
4 // Original Author: Emmanuelle Perez,40 1-A28,+41227671915,
5 // Created: Tue Nov 12 17:03:19 CET 2013
6 // $Id$
7 //
8 //
9 // system include files
10 #include <memory>
11 #include <string>
12 
13 // user include files
16 
23 
25 
27 // DETECTOR GEOMETRY HEADERS
29 
32 
34 
36 // HepMC products
40 
41 #include "TH1F.h"
42 
43 using namespace l1t;
44 
45 //
46 // class declaration
47 //
48 
50 public:
52  typedef std::vector<L1TTTrackType> L1TTTrackCollectionType;
53 
55  ~L1TkFastVertexProducer() override;
56 
57  static void fillDescriptions(edm::ConfigurationDescriptions& descriptions);
58 
59 private:
60  void produce(edm::StreamID, edm::Event&, const edm::EventSetup&) const override;
61 
62  // ----------member data ---------------------------
63 
64  float zMax_; // in cm
65  float DeltaZ; // in cm
66  float chi2Max_;
67  float pTMinTra_; // in GeV
68 
69  float pTMax_; // in GeV, saturation / truncation value
70  int highPtTracks_; // saturate or truncate
71 
72  int nVtx_; // the number of vertices to return
73  int nStubsmin_; // minimum number of stubs
74  int nStubsPSmin_; // minimum number of stubs in PS modules
75 
76  int nBinning_; // number of bins used in the temp histogram
77 
79  //const StackedTrackerGeometry* theStackedGeometry;
80 
81  bool doPtComp_;
85 
86  int weight_; // weight (power) of pT 0 , 1, 2
87 
88  constexpr static float xmin_ = -30;
89  constexpr static float xmax_ = +30;
90 
95 };
96 
97 //
98 // constants, enums and typedefs
99 //
100 
101 //
102 // static data member definitions
103 //
104 
105 //
106 // constructors and destructor
107 //
109  : hepmcToken_(consumes<edm::HepMCProduct>(iConfig.getParameter<edm::InputTag>("HepMCInputTag"))),
110  genparticleToken_(
111  consumes<std::vector<reco::GenParticle> >(iConfig.getParameter<edm::InputTag>("GenParticleInputTag"))),
112  trackToken_(consumes<std::vector<TTTrack<Ref_Phase2TrackerDigi_> > >(
113  iConfig.getParameter<edm::InputTag>("L1TrackInputTag"))),
114  topoToken_(esConsumes<TrackerTopology, TrackerTopologyRcd>(edm::ESInputTag("", ""))) {
115  zMax_ = (float)iConfig.getParameter<double>("ZMAX");
116  chi2Max_ = (float)iConfig.getParameter<double>("CHI2MAX");
117  pTMinTra_ = (float)iConfig.getParameter<double>("PTMINTRA");
118 
119  pTMax_ = (float)iConfig.getParameter<double>("PTMAX");
120  highPtTracks_ = iConfig.getParameter<int>("HighPtTracks");
121 
122  nVtx_ = iConfig.getParameter<int>("nVtx");
123  nStubsmin_ = iConfig.getParameter<int>("nStubsmin");
124  nStubsPSmin_ = iConfig.getParameter<int>("nStubsPSmin");
125  nBinning_ = iConfig.getParameter<int>("nBinning");
126 
127  monteCarloVertex_ = iConfig.getParameter<bool>("MonteCarloVertex");
128  doPtComp_ = iConfig.getParameter<bool>("doPtComp");
129  doTightChi2_ = iConfig.getParameter<bool>("doTightChi2");
130  trkPtTightChi2_ = (float)iConfig.getParameter<double>("trk_ptTightChi2");
131  trkChi2dofTightChi2_ = (float)iConfig.getParameter<double>("trk_chi2dofTightChi2");
132 
133  weight_ = iConfig.getParameter<int>("WEIGHT");
134 
135  produces<TkPrimaryVertexCollection>();
136 }
137 
139  // do anything here that needs to be done at desctruction time
140  // (e.g. close files, deallocate resources etc.)
141 }
142 
143 //
144 // member functions
145 //
146 
147 // ------------ method called to produce the data ------------
149  using namespace edm;
150 
151  auto result = std::make_unique<TkPrimaryVertexCollection>();
152 
153  // Tracker Topology
154  const TrackerTopology& tTopo = iSetup.getData(topoToken_);
155 
156  TH1F htmp("htmp", ";z (cm); Tracks", nBinning_, xmin_, xmax_);
157  TH1F htmp_weight("htmp_weight", ";z (cm); Tracks", nBinning_, xmin_, xmax_);
158 
159  // ----------------------------------------------------------------------
160 
161  if (monteCarloVertex_) {
162  // MC info ... retrieve the zvertex
164  iEvent.getByToken(hepmcToken_, HepMCEvt);
165 
166  edm::Handle<std::vector<reco::GenParticle> > GenParticleHandle;
167  iEvent.getByToken(genparticleToken_, GenParticleHandle);
168 
169  const double mm = 0.1;
170  float zvtx_gen = -999;
171 
172  if (HepMCEvt.isValid()) {
173  // using HepMCEvt
174 
175  const HepMC::GenEvent* MCEvt = HepMCEvt->GetEvent();
176  for (HepMC::GenEvent::vertex_const_iterator ivertex = MCEvt->vertices_begin(); ivertex != MCEvt->vertices_end();
177  ++ivertex) {
178  bool hasParentVertex = false;
179 
180  // Loop over the parents looking to see if they are coming from a production vertex
181  for (HepMC::GenVertex::particle_iterator iparent = (*ivertex)->particles_begin(HepMC::parents);
182  iparent != (*ivertex)->particles_end(HepMC::parents);
183  ++iparent)
184  if ((*iparent)->production_vertex()) {
185  hasParentVertex = true;
186  break;
187  }
188 
189  // Reject those vertices with parent vertices
190  if (hasParentVertex)
191  continue;
192  // Get the position of the vertex
193  HepMC::FourVector pos = (*ivertex)->position();
194  zvtx_gen = pos.z() * mm;
195  break; // there should be one single primary vertex
196  } // end loop over gen vertices
197 
198  } else if (GenParticleHandle.isValid()) {
199  for (const auto& genpart : *GenParticleHandle) {
200  int status = genpart.status();
201  if (status != 3)
202  continue;
203  if (genpart.numberOfMothers() == 0)
204  continue; // the incoming hadrons
205  float part_zvertex = genpart.vz();
206  zvtx_gen = part_zvertex;
207  break; //
208  }
209  } else {
210  throw cms::Exception("L1TkFastVertexProducer")
211  << "\nerror: try to retrieve the MC vertex (monteCarloVertex_ = True) "
212  << "\nbut the input file contains neither edm::HepMCProduct> nor vector<reco::GenParticle>. Exit"
213  << std::endl;
214  }
215 
216  TkPrimaryVertex genvtx(zvtx_gen, -999.);
217 
218  result->push_back(genvtx);
219  iEvent.put(std::move(result));
220  return;
221  }
222 
223  edm::Handle<L1TTTrackCollectionType> L1TTTrackHandle;
224  iEvent.getByToken(trackToken_, L1TTTrackHandle);
225 
226  if (!L1TTTrackHandle.isValid()) {
227  throw cms::Exception("L1TkFastVertexProducer")
228  << "\nWarning: L1TkTrackCollection with not found in the event. Exit" << std::endl;
229  return;
230  }
231 
232  for (const auto& track : *L1TTTrackHandle) {
233  float z = track.POCA().z();
234  float chi2 = track.chi2();
235  float pt = track.momentum().perp();
236  float eta = track.momentum().eta();
237 
238  //..............................................................
239  float wt = pow(pt, weight_); // calculating the weight for tks in as pt^0,pt^1 or pt^2 based on weight_
240 
241  if (std::abs(z) > zMax_)
242  continue;
243  if (chi2 > chi2Max_)
244  continue;
245  if (pt < pTMinTra_)
246  continue;
247 
248  // saturation or truncation :
249  if (pTMax_ > 0 && pt > pTMax_) {
250  if (highPtTracks_ == 0)
251  continue; // ignore this track
252  if (highPtTracks_ == 1)
253  pt = pTMax_; // saturate
254  }
255 
256  // get the number of stubs and the number of stubs in PS layers
257  float nPS = 0.; // number of stubs in PS modules
258  float nstubs = 0;
259 
260  // get pointers to stubs associated to the L1 track
261  const std::vector<edm::Ref<edmNew::DetSetVector<TTStub<Ref_Phase2TrackerDigi_> >, TTStub<Ref_Phase2TrackerDigi_> > >&
262  theStubs = track.getStubRefs();
263 
264  int tmp_trk_nstub = (int)theStubs.size();
265  if (tmp_trk_nstub < 0) {
266  LogTrace("L1TkFastVertexProducer")
267  << " ... could not retrieve the vector of stubs in L1TkFastVertexProducer::SumPtVertex " << std::endl;
268  continue;
269  }
270 
271  // loop over the stubs
272  for (const auto& stub : theStubs) {
273  nstubs++;
274  bool isPS = false;
275  DetId detId(stub->getDetId());
276  if (detId.det() == DetId::Detector::Tracker) {
277  if (detId.subdetId() == StripSubdetector::TOB && tTopo.tobLayer(detId) <= 3)
278  isPS = true;
279  else if (detId.subdetId() == StripSubdetector::TID && tTopo.tidRing(detId) <= 9)
280  isPS = true;
281  }
282  if (isPS)
283  nPS++;
284  } // end loop over stubs
285  if (nstubs < nStubsmin_)
286  continue;
287  if (nPS < nStubsPSmin_)
288  continue;
289 
290  // quality cuts from Louise S, based on the pt-stub compatibility (June 20, 2014)
291  int trk_nstub = (int)track.getStubRefs().size();
292  float chi2dof = chi2 / (2 * trk_nstub - 4);
293 
294  if (doPtComp_) {
295  float trk_consistency = track.stubPtConsistency();
296  if (trk_nstub == 4) {
297  if (std::abs(eta) < 2.2 && trk_consistency > 10)
298  continue;
299  else if (std::abs(eta) > 2.2 && chi2dof > 5.0)
300  continue;
301  }
302  }
303  if (doTightChi2_) {
304  if (pt > trkPtTightChi2_ && chi2dof > trkChi2dofTightChi2_)
305  continue;
306  }
307 
308  htmp.Fill(z);
309  htmp_weight.Fill(z, wt); // changed from "pt" to "wt" which is some power of pt (0,1 or 2)
310 
311  } // end loop over tracks
312 
313  // sliding windows... maximize bin i + i-1 + i+1
314 
315  float zvtx_sliding;
316  float sigma_max;
317  int imax;
318  int nb = htmp.GetNbinsX();
319  std::vector<int> found;
320  found.reserve(nVtx_);
321  for (int ivtx = 0; ivtx < nVtx_; ivtx++) {
322  zvtx_sliding = -999;
323  sigma_max = -999;
324  imax = -999;
325  for (int i = 2; i <= nb - 1; i++) {
326  float a0 = htmp_weight.GetBinContent(i - 1);
327  float a1 = htmp_weight.GetBinContent(i);
328  float a2 = htmp_weight.GetBinContent(i + 1);
329  float sigma = a0 + a1 + a2;
330  if ((sigma > sigma_max) && (find(found.begin(), found.end(), i) == found.end())) {
331  sigma_max = sigma;
332  imax = i;
333  float z0 = htmp_weight.GetBinCenter(i - 1);
334  float z1 = htmp_weight.GetBinCenter(i);
335  float z2 = htmp_weight.GetBinCenter(i + 1);
336  zvtx_sliding = (a0 * z0 + a1 * z1 + a2 * z2) / sigma;
337  }
338  }
339  found.push_back(imax);
340  TkPrimaryVertex vtx4(zvtx_sliding, sigma_max);
341  result->push_back(vtx4);
342  }
343 
344  iEvent.put(std::move(result));
345 }
346 
347 // ------------ method fills 'descriptions' with the allowed parameters for the module ------------
349  //The following says we do not know what parameters are allowed so do no validation
350  // Please change this to state exactly what you do use, even if it is no parameters
352  desc.setUnknown();
353  descriptions.addDefault(desc);
354 }
355 
356 //define this as a plug-in
TTTrack< Ref_Phase2TrackerDigi_ > L1TTTrackType
OrphanHandle< PROD > put(std::unique_ptr< PROD > product)
Put a new product.
Definition: Event.h:133
TPRegexp parents
Definition: eve_filter.cc:21
const edm::ESGetToken< TrackerTopology, TrackerTopologyRcd > topoToken_
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:539
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
void produce(edm::StreamID, edm::Event &, const edm::EventSetup &) const override
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
list status
Definition: mps_update.py:107
static constexpr float xmin_
void find(edm::Handle< EcalRecHitCollection > &hits, DetId thisDet, std::vector< EcalRecHitCollection::const_iterator > &hit, bool debug=false)
Definition: FindCaloHit.cc:19
#define LogTrace(id)
tuple result
Definition: mps_fire.py:311
L1TkFastVertexProducer(const edm::ParameterSet &)
bool getData(T &iHolder) const
Definition: EventSetup.h:128
int iEvent
Definition: GenABIO.cc:224
void addDefault(ParameterSetDescription const &psetDescription)
def move
Definition: eostools.py:511
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
static constexpr auto TOB
bool isValid() const
Definition: HandleBase.h:70
Class to store the L1 Track Trigger stubs.
Definition: TTStub.h:22
const edm::EDGetTokenT< std::vector< TTTrack< Ref_Phase2TrackerDigi_ > > > trackToken_
static constexpr float xmax_
Definition: DetId.h:17
const edm::EDGetTokenT< std::vector< reco::GenParticle > > genparticleToken_
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
static constexpr float a0
Class to store the L1 Track Trigger tracks.
Definition: TTTrack.h:29
T getParameter(std::string const &) const
Definition: ParameterSet.h:303
const edm::EDGetTokenT< edm::HepMCProduct > hepmcToken_
static constexpr auto TID
ESGetTokenH3DDVariant esConsumes(std::string const &Reccord, edm::ConsumesCollector &)
Definition: DeDxTools.cc:283
Power< A, B >::type pow(const A &a, const B &b)
Definition: Power.h:29
std::vector< L1TTTrackType > L1TTTrackCollectionType