CMS 3D CMS Logo

HIPixelMedianVtxProducer.cc
Go to the documentation of this file.
2 
7 
10 
11 #include <fstream>
12 #include <iostream>
13 #include <vector>
14 #include <algorithm>
15 
16 #include "TROOT.h"
17 #include "TH1F.h"
18 #include "TF1.h"
19 #include "TMinuitMinimizer.h"
20 
21 /*****************************************************************************/
23  theTrackCollection(consumes<reco::TrackCollection>(ps.getParameter<edm::InputTag>("TrackCollection"))),
24  thePtMin(ps.getParameter<double>("PtMin")),
25  thePeakFindThresh(ps.getParameter<unsigned int>("PeakFindThreshold")),
26  thePeakFindMaxZ(ps.getParameter<double>("PeakFindMaxZ")),
27  thePeakFindBinning(ps.getParameter<int>("PeakFindBinsPerCm")),
28  theFitThreshold(ps.getParameter<int>("FitThreshold")),
29  theFitMaxZ(ps.getParameter<double>("FitMaxZ")),
30  theFitBinning(ps.getParameter<int>("FitBinsPerCm"))
31 {
32  produces<reco::VertexCollection>();
33 
34  //In order to make fitting ROOT histograms thread safe
35  // one must call this undocumented function
36  TMinuitMinimizer::UseStaticMinuit(false);
37 }
38 
39 /*****************************************************************************/
42 {
43  // Get pixel tracks
45  ev.getByToken(theTrackCollection, trackCollection);
46  const reco::TrackCollection tracks_ = *(trackCollection.product());
47 
48  // Select tracks above minimum pt
49  std::vector<const reco::Track *> tracks;
50  for (unsigned int i=0; i<tracks_.size(); i++) {
51  if (tracks_[i].pt() < thePtMin && std::fabs(tracks_[i].vz()) < 100000.) continue;
52  reco::TrackRef recTrack(trackCollection, i);
53  tracks.push_back( &(*recTrack));
54  }
55 
56  LogTrace("MinBiasTracking")
57  << " [VertexProducer] selected tracks: "
58  << tracks.size() << " (out of " << tracks_.size()
59  << ") above pt = " << thePtMin;
60 
61  // Output vertex collection
62  auto vertices = std::make_unique<reco::VertexCollection>();
63 
64  // No tracks -> return empty collection
65  if(tracks.empty()) {
66  ev.put(std::move(vertices));
67  return;
68  }
69 
70  // Sort tracks according to vertex z position
71  std::sort(tracks.begin(), tracks.end(), ComparePairs());
72 
73  // Calculate median vz
74  float med;
75  if(tracks.size() % 2 == 0)
76  med = (tracks[tracks.size()/2-1]->vz() + tracks[tracks.size()/2]->vz())/2;
77  else
78  med = tracks[tracks.size()/2 ]->vz();
79 
80  LogTrace("MinBiasTracking")
81  << " [vertex position] median = " << med << " cm";
82 
83  // In high multiplicity events, fit around most probable position
84  if(tracks.size() > thePeakFindThresh) {
85 
86  // Find maximum bin
87  TH1F hmax("hmax","hmax",thePeakFindBinning*2.0*thePeakFindMaxZ,-1.0*thePeakFindMaxZ,thePeakFindMaxZ);
88 
89  for(std::vector<const reco::Track *>::const_iterator
90  track = tracks.begin(); track!= tracks.end(); track++)
91  if(fabs((*track)->vz()) < thePeakFindMaxZ)
92  hmax.Fill((*track)->vz());
93 
94  int maxBin = hmax.GetMaximumBin();
95 
96  LogTrace("MinBiasTracking")
97  << " [vertex position] most prob = "
98  << hmax.GetBinCenter(maxBin) << " cm";
99 
100  // Find 3-bin weighted average
101  float num=0.0, denom=0.0;
102  for(int i=-1; i<=1; i++) {
103  num += hmax.GetBinContent(maxBin+i)*hmax.GetBinCenter(maxBin+i);
104  denom += hmax.GetBinContent(maxBin+i);
105  }
106 
107  if(denom==0)
108  {
110  err(2,2) = 0.1 * 0.1;
111  reco::Vertex ver(reco::Vertex::Point(0,0,99999.),
112  err, 0, 0, 1);
113  vertices->push_back(ver);
114  ev.put(std::move(vertices));
115  return;
116  }
117 
118  float nBinAvg = num/denom;
119 
120  // Center fit at 3-bin weighted average around max bin
121  med = nBinAvg;
122 
123  LogTrace("MinBiasTracking")
124  << " [vertex position] 3-bin weighted average = "
125  << nBinAvg << " cm";
126  }
127 
128  // Bin vz-values around most probable value (or median) for fitting
129  TH1F histo("histo","histo", theFitBinning*2.0*theFitMaxZ,-1.0*theFitMaxZ,theFitMaxZ);
130  histo.Sumw2();
131 
132  for(std::vector<const reco::Track *>::const_iterator
133  track = tracks.begin(); track!= tracks.end(); track++)
134  if(fabs((*track)->vz() - med) < theFitMaxZ)
135  histo.Fill((*track)->vz() - med);
136 
137  LogTrace("MinBiasTracking")
138  << " [vertex position] most prob for fit = "
139  << med + histo.GetBinCenter(histo.GetMaximumBin()) << " cm";
140 
141  // If there are very few entries, don't do the fit
142  if(histo.GetEntries() <= theFitThreshold) {
143 
144  LogTrace("MinBiasTracking")
145  << " [vertex position] Fewer than" << theFitThreshold
146  << " entries in fit histogram. Returning median.";
147 
149  err(2,2) = 0.1 * 0.1;
150  reco::Vertex ver(reco::Vertex::Point(0,0,med),
151  err, 0, 1, 1);
152  vertices->push_back(ver);
153  ev.put(std::move(vertices));
154  return;
155  }
156 
157  // Otherwise, there are enough entries to refine the estimate with a fit
158  TF1 f1("f1","[0]*exp(-0.5 * ((x-[1])/[2])^2) + [3]");
159  f1.SetParameters(10.,0.,0.02,0.002*tracks.size());
160  f1.SetParLimits(1,-0.1,0.1);
161  f1.SetParLimits(2,0.001,0.05);
162  f1.SetParLimits(3,0.0,0.005*tracks.size());
163 
164  histo.Fit(&f1,"QN SERIAL");
165 
166  LogTrace("MinBiasTracking")
167  << " [vertex position] fitted = "
168  << med + f1.GetParameter(1) << " +- " << f1.GetParError(1) << " cm";
169 
171  err(2,2) = f1.GetParError(1) * f1.GetParError(1);
172  reco::Vertex ver(reco::Vertex::Point(0,0,med + f1.GetParameter(1)),
173  err, 0, 1, 1);
174  vertices->push_back(ver);
175 
176  ev.put(std::move(vertices));
177  return;
178 
179 }
180 
OrphanHandle< PROD > put(std::unique_ptr< PROD > product)
Put a new product.
Definition: Event.h:137
const std::vector< reco::PFCandidatePtr > & tracks_
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:579
std::vector< Track > TrackCollection
collection of Tracks
Definition: TrackFwd.h:15
math::Error< dimension >::type Error
covariance error matrix (3x3)
Definition: Vertex.h:43
bool ev
math::XYZPoint Point
point in the space
Definition: Vertex.h:39
#define LogTrace(id)
void produce(edm::Event &ev, const edm::EventSetup &es) override
T const * product() const
Definition: Handle.h:81
HIPixelMedianVtxProducer(const edm::ParameterSet &ps)
fixed size matrix
HLT enums.
def move(src, dest)
Definition: eostools.py:510
edm::EDGetTokenT< reco::TrackCollection > theTrackCollection