CMS 3D CMS Logo

ClusterCompatibilityProducer.cc
Go to the documentation of this file.
1 //
2 // Derived from HLTrigger/special/src/HLTPixelClusterShapeFilter.cc
3 // at version 7_5_0_pre3
4 //
5 // Original Author (of Derivative Producer): Eric Appelt
6 // Created: Mon Apr 27, 2015
7 
8 #include <iostream>
9 
18 
25 
31 
32 
33 //
34 // class declaration
35 //
36 
38 
39  public:
42 
43  void produce(edm::Event&, const edm::EventSetup&) override;
44 
45  private:
46 
48  edm::InputTag inputTag_; // input tag identifying product containing pixel clusters
49  double minZ_; // beginning z-vertex position
50  double maxZ_; // end z-vertex position
51  double zStep_; // size of steps in z-vertex test
52 
53  struct VertexHit
54  {
55  float z;
56  float r;
57  float w;
58  };
59 
61  {
62  float z0;
63  int nHit;
64  float chi;
65  };
66 
67  ContainedHits getContainedHits(const std::vector<VertexHit> &hits, double z0) const;
68 
69 };
70 
72  inputTag_ (config.getParameter<edm::InputTag>("inputTag")),
73  minZ_ (config.getParameter<double>("minZ")),
74  maxZ_ (config.getParameter<double>("maxZ")),
75  zStep_ (config.getParameter<double>("zStep"))
76 {
77  inputToken_ = consumes<SiPixelRecHitCollection>(inputTag_);
78  LogDebug("") << "Using the " << inputTag_ << " input collection";
79  produces<reco::ClusterCompatibility>();
80 }
81 
83 
84 void
86 {
87  auto creco = std::make_unique<reco::ClusterCompatibility>();
88 
89  // get hold of products from Event
91  iEvent.getByToken(inputToken_, hRecHits);
92 
93  // get tracker geometry
94  if (hRecHits.isValid()) {
95  edm::ESHandle<TrackerGeometry> trackerHandle;
96  iSetup.get<TrackerDigiGeometryRecord>().get(trackerHandle);
97  const TrackerGeometry *tgeo = trackerHandle.product();
98  const SiPixelRecHitCollection *hits = hRecHits.product();
99 
100  // loop over pixel rechits
101  int nPxlHits=0;
102  std::vector<VertexHit> vhits;
104  end = hits->data().end(); hit != end; ++hit) {
105  if (!hit->isValid())
106  continue;
107  ++nPxlHits;
108  DetId id(hit->geographicalId());
109  if(id.subdetId() != int(PixelSubdetector::PixelBarrel))
110  continue;
111  const PixelGeomDetUnit *pgdu = static_cast<const PixelGeomDetUnit*>(tgeo->idToDet(id));
112  const PixelTopology *pixTopo = &(pgdu->specificTopology());
113  std::vector<SiPixelCluster::Pixel> pixels(hit->cluster()->pixels());
114  bool pixelOnEdge = false;
115  for(std::vector<SiPixelCluster::Pixel>::const_iterator pixel = pixels.begin();
116  pixel != pixels.end(); ++pixel) {
117  int pixelX = pixel->x;
118  int pixelY = pixel->y;
119  if(pixTopo->isItEdgePixelInX(pixelX) || pixTopo->isItEdgePixelInY(pixelY)) {
120  pixelOnEdge = true;
121  break;
122  }
123  }
124  if (pixelOnEdge)
125  continue;
126 
127  LocalPoint lpos = LocalPoint(hit->localPosition().x(),
128  hit->localPosition().y(),
129  hit->localPosition().z());
130  GlobalPoint gpos = pgdu->toGlobal(lpos);
131  VertexHit vh;
132  vh.z = gpos.z();
133  vh.r = gpos.perp();
134  vh.w = hit->cluster()->sizeY();
135  vhits.push_back(vh);
136  }
137 
138  creco->setNValidPixelHits(nPxlHits);
139 
140  // append cluster compatibility for each z-position
141  for(double z0 = minZ_; z0 <= maxZ_; z0 += zStep_)
142  {
143  ContainedHits c = getContainedHits(vhits, z0);
144  creco->append(c.z0, c.nHit, c.chi);
145  }
146 
147  }
148  iEvent.put(std::move(creco));
149 
150 }
151 
152 
154 {
155 
156  // Calculate number of hits contained in v-shaped window in cluster y-width vs. z-position.
157  int n = 0;
158  double chi = 0.;
159 
160  for(std::vector<VertexHit>::const_iterator hit = hits.begin(); hit!= hits.end(); hit++) {
161  // the calculation of the predicted cluster width p was
162  // marked 'FIXME' in the HLTPixelClusterShapeFilter. It should
163  // be revisited but is retained as it was for compatibility with the
164  // older filter.
165  double p = 2 * fabs(hit->z - z0)/hit->r + 0.5;
166  if(fabs(p - hit->w) <= 1.) {
167  chi += fabs(p - hit->w);
168  n++;
169  }
170  }
172  output.z0 = z0;
173  output.nHit = n;
174  output.chi = chi;
175  return output;
176 }
177 
178 //define this as a plug-in
#define LogDebug(id)
boost::transform_iterator< IterHelp, const_IdIter > const_iterator
OrphanHandle< PROD > put(std::unique_ptr< PROD > product)
Put a new product.
Definition: Event.h:127
Point3DBase< Scalar, LocalTag > LocalPoint
Definition: Definitions.h:32
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:508
virtual bool isItEdgePixelInX(int ixbin) const =0
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:17
GlobalPoint toGlobal(const Local2DPoint &lp) const
Conversion to the global R.F. from the R.F. of the GeomDet.
Definition: GeomDet.h:54
virtual bool isItEdgePixelInY(int iybin) const =0
Definition: config.py:1
int iEvent
Definition: GenABIO.cc:230
ClusterCompatibilityProducer(const edm::ParameterSet &)
ContainedHits getContainedHits(const std::vector< VertexHit > &hits, double z0) const
data_type const * data(size_t cell) const
#define end
Definition: vmac.h:37
Definition: DetId.h:18
const T & get() const
Definition: EventSetup.h:55
virtual const PixelTopology & specificTopology() const
Returns a reference to the pixel proxy topology.
edm::EDGetTokenT< SiPixelRecHitCollection > inputToken_
HLT enums.
const TrackerGeomDet * idToDet(DetId) const override
void produce(edm::Event &, const edm::EventSetup &) override
T const * product() const
Definition: ESHandle.h:86
def move(src, dest)
Definition: eostools.py:510