CMS 3D CMS Logo

ClusterShapeSeedComparitor.cc
Go to the documentation of this file.
20 #include <cstdio>
21 #include <cassert>
22 
23 #include<iostream>
24 
26  public:
29  virtual void init(const edm::Event& ev, const edm::EventSetup& es) override ;
30  virtual bool compatible(const SeedingHitSet &hits) const override { return true; }
31  virtual bool compatible(const TrajectoryStateOnSurface &,
32  SeedingHitSet::ConstRecHitPointer hit) const override ;
33  virtual bool compatible(const SeedingHitSet &hits,
34  const GlobalTrajectoryParameters &helixStateAtVertex,
35  const FastHelix &helix) const override ;
36 
37  private:
38  bool compatibleHit(const TrackingRecHit &hit, const GlobalVector &direction) const ;
39 
44  const bool filterAtHelixStage_;
46 };
47 
48 
50  filterName_(cfg.getParameter<std::string>("ClusterShapeHitFilterName")),
52  filterAtHelixStage_(cfg.getParameter<bool>("FilterAtHelixStage")),
53  filterPixelHits_(cfg.getParameter<bool>("FilterPixelHits")),
54  filterStripHits_(cfg.getParameter<bool>("FilterStripHits"))
55 {
56  if(filterPixelHits_) {
58  }
59 }
60 
62 {
63 }
64 
65 void
68  if(filterPixelHits_) {
72  }
73 }
74 
75 
76 bool
79 {
80  if (filterAtHelixStage_) return true;
81  assert(hit->isValid() && tsos.isValid());
82  return compatibleHit(*hit, tsos.globalDirection());
83 }
84 
85 bool
87  const GlobalTrajectoryParameters &helixStateAtVertex,
88  const FastHelix &helix) const
89 {
90  if (!filterAtHelixStage_) return true;
91 
92  if(!helix.isValid()) edm::LogWarning("InvalidHelix") << "PixelClusterShapeSeedComparitor helix is not valid, result is bad";
93 
94  float xc = helix.circle().x0(), yc = helix.circle().y0();
95 
96  GlobalPoint vertex = helixStateAtVertex.position();
97  GlobalVector momvtx = helixStateAtVertex.momentum();
98  float x0 = vertex.x(), y0 = vertex.y();
99  for (unsigned int i = 0, n = hits.size(); i < n; ++i) {
100  auto const & hit = *hits[i];
101  GlobalPoint pos = hit.globalPosition();
102  float x1 = pos.x(), y1 = pos.y(), dx1 = x1 - xc, dy1 = y1 - yc;
103 
104  // now figure out the proper tangent vector
105  float perpx = -dy1, perpy = dx1;
106  if (perpx * (x1-x0) + perpy * (y1 - y0) < 0) {
107  perpy = -perpy; perpx = -perpx;
108  }
109 
110  // now normalize (perpx, perpy, 1.0) to momentum (px, py, pz)
111  float perp2 = perpx*perpx + perpy*perpy;
112  float pmom2 = momvtx.x()*momvtx.x() + momvtx.y()*momvtx.y(), momz2 = momvtx.z()*momvtx.z(), mom2 = pmom2 + momz2;
113  float perpscale = sqrt(pmom2/mom2 / perp2), zscale = sqrt((1-pmom2/mom2));
114  GlobalVector gdir(perpx*perpscale, perpy*perpscale, (momvtx.z() > 0 ? zscale : -zscale));
115 
116  if (!compatibleHit(hit, gdir)) {
117  return false; // not yet
118  }
119  }
120  return true;
121 }
122 
123 bool
125 {
126  if (hit.geographicalId().subdetId() <= 2) {
127  if (!filterPixelHits_) return true;
128  const SiPixelRecHit *pixhit = dynamic_cast<const SiPixelRecHit *>(&hit);
129  if (pixhit == 0) throw cms::Exception("LogicError", "Found a valid hit on the pixel detector which is not a SiPixelRecHit\n");
130  //printf("Cheching hi hit on detid %10d, local direction is x = %9.6f, y = %9.6f, z = %9.6f\n", hit.geographicalId().rawId(), direction.x(), direction.y(), direction.z());
131  return filterHandle_->isCompatible(*pixhit, direction, *pixelClusterShapeCache_);
132  } else {
133  if (!filterStripHits_) return true;
134  const std::type_info &tid = typeid(*&hit);
135  if (tid == typeid(SiStripMatchedRecHit2D)) {
136  const SiStripMatchedRecHit2D* matchedHit = dynamic_cast<const SiStripMatchedRecHit2D *>(&hit);
137  assert(matchedHit != 0);
138  return (filterHandle_->isCompatible(DetId(matchedHit->monoId()), matchedHit->monoCluster(), direction) &&
139  filterHandle_->isCompatible(DetId(matchedHit->stereoId()), matchedHit->stereoCluster(), direction));
140  } else if (tid == typeid(SiStripRecHit2D)) {
141  const SiStripRecHit2D* recHit = dynamic_cast<const SiStripRecHit2D *>(&hit);
142  assert(recHit != 0);
143  return filterHandle_->isCompatible(*recHit, direction);
144  } else if (tid == typeid(ProjectedSiStripRecHit2D)) {
145  const ProjectedSiStripRecHit2D* precHit = dynamic_cast<const ProjectedSiStripRecHit2D *>(&hit);
146  assert(precHit != 0);
147  return filterHandle_->isCompatible(precHit->originalHit(), direction);
148  } else {
149  //printf("Questo e' un %s, che ci fo?\n", tid.name());
150  return true;
151  }
152  }
153 }
154 
155 DEFINE_EDM_PLUGIN(SeedComparitorFactory, PixelClusterShapeSeedComparitor, "PixelClusterShapeSeedComparitor");
EDGetTokenT< ProductType > consumes(edm::InputTag const &tag)
T getParameter(std::string const &) const
bool isValid() const
Definition: FastHelix.h:63
unsigned int stereoId() const
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:460
double x0() const
Definition: FastCircle.h:50
PixelClusterShapeSeedComparitor(const edm::ParameterSet &cfg, edm::ConsumesCollector &iC)
SiStripCluster const & monoCluster() const
T y() const
Definition: PV3DBase.h:63
bool ev
edm::ESHandle< ClusterShapeHitFilter > filterHandle_
virtual bool compatible(const SeedingHitSet &hits) const override
const FastCircle & circle() const
Definition: FastHelix.h:67
#define nullptr
BaseTrackerRecHit const * ConstRecHitPointer
Definition: SeedingHitSet.h:11
edm::EDGetTokenT< SiPixelClusterShapeCache > pixelClusterShapeCacheToken_
T sqrt(T t)
Definition: SSEVec.h:18
T z() const
Definition: PV3DBase.h:64
int subdetId() const
get the contents of the subdetector field (not cast into any detector&#39;s numbering enum) ...
Definition: DetId.h:37
bool isCompatible(const SiPixelRecHit &recHit, const LocalVector &ldir, const SiPixelClusterShapeCache &clusterShapeCache, PixelData const *pd=0) const
SiStripRecHit2D originalHit() const
Definition: DetId.h:18
T const * product() const
Definition: Handle.h:81
const T & get() const
Definition: EventSetup.h:55
T perp2() const
Squared magnitude of transverse component.
double y0() const
Definition: FastCircle.h:52
SiStripCluster const & stereoCluster() const
unsigned int size() const
Definition: SeedingHitSet.h:46
bool compatibleHit(const TrackingRecHit &hit, const GlobalVector &direction) const
#define DEFINE_EDM_PLUGIN(factory, type, name)
unsigned int monoId() const
const SiPixelClusterShapeCache * pixelClusterShapeCache_
DetId geographicalId() const
T x() const
Definition: PV3DBase.h:62
virtual void init(const edm::Event &ev, const edm::EventSetup &es) override
GlobalVector globalDirection() const
Our base class.
Definition: SiPixelRecHit.h:23