CMS 3D CMS Logo

FastPrimaryVertexProducer.cc
Go to the documentation of this file.
1 // -*- C++ -*-
2 //
3 // Package: FastPrimaryVertexProducer
4 // Class: FastPrimaryVertexProducer
5 //
13 //
14 // Original Author: Andrea RIZZI
15 // Created: Thu Dec 22 14:51:44 CET 2011
16 //
17 //
18 
19 // system include files
20 #include <memory>
21 #include <vector>
22 // user include files
28 
33 
36 
46 
50 
54 #define HaveMtv
55 #define HaveFsmw
56 #define HaveDivisive
57 #ifdef HaveMtv
59 #endif
60 #ifdef HaveFsmw
62 #endif
63 #ifdef HaveDivisive
65 #endif
66 
67 using namespace std;
68 
69 //
70 // class declaration
71 //
72 
74 public:
76 
77 private:
78  void produce(edm::StreamID, edm::Event&, const edm::EventSetup&) const override;
79 
85  double m_maxZ;
86  double m_maxSizeX;
87  double m_maxDeltaPhi;
89 };
90 
92  : m_geomToken(esConsumes()),
93  m_pixelCPEToken(esConsumes(edm::ESInputTag("", iConfig.getParameter<std::string>("pixelCPE")))) {
94  m_clusters = consumes<SiPixelClusterCollectionNew>(iConfig.getParameter<edm::InputTag>("clusters"));
95  m_jets = consumes<edm::View<reco::Jet> >(iConfig.getParameter<edm::InputTag>("jets"));
96  m_beamSpot = consumes<reco::BeamSpot>(iConfig.getParameter<edm::InputTag>("beamSpot"));
97  m_maxZ = iConfig.getParameter<double>("maxZ");
98  m_maxSizeX = iConfig.getParameter<double>("maxSizeX");
99  m_maxDeltaPhi = iConfig.getParameter<double>("maxDeltaPhi");
100  m_clusterLength = iConfig.getParameter<double>("clusterLength");
101  produces<reco::VertexCollection>();
102 }
103 
105  using namespace edm;
106  using namespace reco;
107  using namespace std;
108 
110  iEvent.getByToken(m_clusters, cH);
112 
114  iEvent.getByToken(m_jets, jH);
115  const edm::View<reco::Jet>& jets = *jH.product();
116 
118  for (edm::View<reco::Jet>::const_iterator it = jets.begin(); it != jets.end(); it++) {
119  if (it->pt() > 40 && fabs(it->eta()) < 1.6) {
120  const CaloJet* ca = dynamic_cast<const CaloJet*>(&(*it));
121  if (ca == nullptr)
122  abort();
123  selectedJets.push_back(*ca);
124  // std::cout << "Jet eta,phi,pt: "<< it->eta() << "," << it->phi() << "," << it->pt() << std::endl;
125  }
126  }
127 
129 
131  iEvent.getByToken(m_beamSpot, beamSpot);
132 
133  const TrackerGeometry* trackerGeometry = &iSetup.getData(m_geomToken);
134 
135  float lengthBmodule = 6.66; //cm
136  std::vector<float> zProjections;
137  for (CaloJetCollection::const_iterator jit = selectedJets.begin(); jit != selectedJets.end(); jit++) {
138  float px = jit->px();
139  float py = jit->py();
140  float pz = jit->pz();
141  float pt = jit->pt();
142 
143  float jetZOverRho = jit->momentum().Z() / jit->momentum().Rho();
144  int minSizeY = fabs(2. * jetZOverRho) - 1;
145  int maxSizeY = fabs(2. * jetZOverRho) + 2;
146  if (fabs(jit->eta()) > 1.6) {
147  minSizeY = 1;
148  }
149 
151  it++) //Loop on pixel modules with clusters
152  {
153  DetId id = it->detId();
154  const edmNew::DetSet<SiPixelCluster>& detset = (*it);
155  Point3DBase<float, GlobalTag> modulepos = trackerGeometry->idToDet(id)->position();
156  float zmodule = modulepos.z() -
157  ((modulepos.x() - beamSpot->x0()) * px + (modulepos.y() - beamSpot->y0()) * py) / pt * pz / pt;
158  if ((fabs(deltaPhi(jit->momentum().Phi(), modulepos.phi())) < m_maxDeltaPhi * 2) &&
159  (fabs(zmodule) < (m_maxZ + lengthBmodule / 2))) {
160  for (size_t j = 0; j < detset.size(); j++) // Loop on pixel clusters on this module
161  {
162  const SiPixelCluster& aCluster = detset[j];
163  if (aCluster.sizeX() < m_maxSizeX && aCluster.sizeY() >= minSizeY && aCluster.sizeY() <= maxSizeY) {
164  Point3DBase<float, GlobalTag> v = trackerGeometry->idToDet(id)->surface().toGlobal(
165  pp->localParametersV(aCluster, (*trackerGeometry->idToDetUnit(id)))[0].first);
166  GlobalPoint v_bs(v.x() - beamSpot->x0(), v.y() - beamSpot->y0(), v.z());
167  if (fabs(deltaPhi(jit->momentum().Phi(), v_bs.phi())) < m_maxDeltaPhi) {
168  float z = v.z() - ((v.x() - beamSpot->x0()) * px + (v.y() - beamSpot->y0()) * py) / pt * pz / pt;
169  if (fabs(z) < m_maxZ) {
170  zProjections.push_back(z);
171  }
172  }
173  } //if compatible cluster
174  } // loop on module hits
175  } // if compatible module
176  } // loop on pixel modules
177 
178  } // loop on selected jets
179  std::sort(zProjections.begin(), zProjections.end());
180 
181  std::vector<float>::iterator itCenter = zProjections.begin();
182  std::vector<float>::iterator itLeftSide = zProjections.begin();
183  std::vector<float>::iterator itRightSide = zProjections.begin();
184  std::vector<int> counts;
185  float zCluster = m_clusterLength / 2.0; //cm
186  int max = 0;
187  std::vector<float>::iterator left, right;
188  for (; itCenter != zProjections.end(); itCenter++) {
189  while (itLeftSide != zProjections.end() && (*itCenter - *itLeftSide) > zCluster)
190  itLeftSide++;
191  while (itRightSide != zProjections.end() && (*itRightSide - *itCenter) < zCluster)
192  itRightSide++;
193 
194  int n = itRightSide - itLeftSide;
195  // std::cout << "algo :"<< *itCenter << " " << itCenter-zProjections.begin() << " dists: " << (*itCenter - *itLeftSide) << " " << (*itRightSide - *itCenter) << " count: " << n << std::endl;
196  counts.push_back(n);
197  if (n > max) {
198  max = n;
199  left = itLeftSide;
200  }
201  if (n >= max) {
202  max = n;
203  right = itRightSide;
204  // std::cout << "algo :"<< i << " " << j << " " << *itCenter << " " << itCenter-zProjections.begin() << " dists: " << (*itCenter - *itLeftSide) << " " << (*itRightSide - *itCenter) << " count: " << n << std::endl;
205  }
206  }
207 
208  float res = 0;
209  if (!zProjections.empty()) {
210  res = *(left + (right - left) / 2);
211  // std::cout << "RES " << res << std::endl;
213  e(0, 0) = 0.0015 * 0.0015;
214  e(1, 1) = 0.0015 * 0.0015;
215  e(2, 2) = 1.5 * 1.5;
217  Vertex thePV(p, e, 1, 1, 0);
218  auto pOut = std::make_unique<reco::VertexCollection>();
219  pOut->push_back(thePV);
220  iEvent.put(std::move(pOut));
221  } else {
222  // std::cout << "DUMMY " << res << std::endl;
223 
225  e(0, 0) = 0.0015 * 0.0015;
226  e(1, 1) = 0.0015 * 0.0015;
227  e(2, 2) = 1.5 * 1.5;
229  Vertex thePV(p, e, 0, 0, 0);
230  auto pOut = std::make_unique<reco::VertexCollection>();
231  pOut->push_back(thePV);
232  iEvent.put(std::move(pOut));
233  }
234 }
235 
236 //define this as a plug-in
ESGetTokenH3DDVariant esConsumes(std::string const &Record, edm::ConsumesCollector &)
Definition: DeDxTools.cc:283
T getParameter(std::string const &) const
Definition: ParameterSet.h:303
Jets made from CaloTowers.
Definition: CaloJet.h:27
const TrackerGeomDet * idToDetUnit(DetId) const override
Return the pointer to the GeomDetUnit corresponding to a given DetId.
edm::EDGetTokenT< edm::View< reco::Jet > > m_jets
T z() const
Definition: PV3DBase.h:61
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
Geom::Phi< T > phi() const
Definition: PV3DBase.h:66
T const * product() const
Definition: Handle.h:70
math::Error< dimension >::type Error
covariance error matrix (3x3)
Definition: Vertex.h:44
int sizeY() const
Definition: Electron.h:6
edm::EDGetTokenT< SiPixelClusterCollectionNew > m_clusters
void produce(edm::StreamID, edm::Event &, const edm::EventSetup &) const override
T x() const
Definition: PV3DBase.h:59
T y() const
Definition: PV3DBase.h:60
int iEvent
Definition: GenABIO.cc:224
edm::ESGetToken< TrackerGeometry, TrackerDigiGeometryRecord > const m_geomToken
int sizeX() const
math::XYZPoint Point
point in the space
Definition: Vertex.h:40
FastPrimaryVertexProducer(const edm::ParameterSet &)
bool getData(T &iHolder) const
Definition: EventSetup.h:122
edm::EDGetTokenT< reco::BeamSpot > m_beamSpot
const TrackerGeomDet * idToDet(DetId) const override
GlobalPoint toGlobal(const Point2DBase< Scalar, LocalTag > lp) const
Definition: Surface.h:79
boost::transform_iterator< IterHelp, const_IdIter > const_iterator
Definition: DetId.h:17
edm::ESGetToken< PixelClusterParameterEstimator, TkPixelCPERecord > const m_pixelCPEToken
const Plane & surface() const
The nominal surface of the GeomDet.
Definition: GeomDet.h:37
const Surface::PositionType & position() const
The position (origin of the R.F.)
Definition: GeomDet.h:43
size_type size() const
Definition: DetSetNew.h:68
Pixel cluster – collection of neighboring pixels above threshold.
fixed size matrix
HLT enums.
boost::indirect_iterator< typename seq_t::const_iterator > const_iterator
Definition: View.h:86
def move(src, dest)
Definition: eostools.py:511
std::vector< CaloJet > CaloJetCollection
collection of CaloJet objects