CMS 3D CMS Logo

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