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