CMS 3D CMS Logo

ClusterStorer.cc
Go to the documentation of this file.
2 
4 
13 // FastSim hits:
17 
19 
20 namespace helper {
21 
22  // -------------------------------------------------------------
23  //FIXME (push cluster pointers...)
25  TrackingRecHit &newHit = hits[index];
26  const std::type_info &hit_type = typeid(newHit);
27  if (hit_type == typeid(SiPixelRecHit)) {
28  //std::cout << "| It is a Pixel hit !!" << std::endl;
29  pixelClusterRecords_.push_back(PixelClusterHitRecord(static_cast<SiPixelRecHit &>(newHit), hits, index));
30  } else if (hit_type == typeid(SiStripRecHit1D)) {
31  //std::cout << "| It is a SiStripRecHit1D hit !!" << std::endl;
32  stripClusterRecords_.push_back(StripClusterHitRecord(static_cast<SiStripRecHit1D &>(newHit), hits, index));
33  } else if (hit_type == typeid(SiStripRecHit2D)) {
34  //std::cout << "| It is a SiStripRecHit2D hit !!" << std::endl;
35  stripClusterRecords_.push_back(StripClusterHitRecord(static_cast<SiStripRecHit2D &>(newHit), hits, index));
36  } else if (hit_type == typeid(SiStripMatchedRecHit2D)) {
37  //std::cout << "| It is a SiStripMatchedRecHit2D hit !!" << std::endl;
38  SiStripMatchedRecHit2D &mhit = static_cast<SiStripMatchedRecHit2D &>(newHit);
41  } else if (hit_type == typeid(ProjectedSiStripRecHit2D)) {
42  //std::cout << "| It is a ProjectedSiStripRecHit2D hit !!" << std::endl;
43  ProjectedSiStripRecHit2D &phit = static_cast<ProjectedSiStripRecHit2D &>(newHit);
45  } else if (hit_type == typeid(Phase2TrackerRecHit1D)) {
46  //FIXME:: this is just temporary solution for phase2,
47  //it is not really running in the phase2 tracking wf - yet...
48  phase2OTClusterRecords_.push_back(
49  Phase2OTClusterHitRecord(static_cast<Phase2TrackerRecHit1D &>(newHit), hits, index));
50  } else if (hit_type == typeid(VectorHit)) {
51  //FIXME:: this is just temporary solution for phase2,
52  //the VectorHit has 2 clusters but just a hit!
53  phase2OTClusterRecords_.push_back(Phase2OTClusterHitRecord(static_cast<VectorHit &>(newHit), hits, index));
54  } else {
55  if (hit_type == typeid(FastTrackerRecHit) || hit_type == typeid(FastProjectedTrackerRecHit) ||
56  hit_type == typeid(FastMatchedTrackerRecHit)) {
57  //std::cout << "| It is a " << hit_type.name() << " hit !!" << std::endl;
58  // FastSim hits: Do nothing instead of caring about FastSim clusters,
59  // not even sure whether these really exist.
60  // At least predecessor code in TrackSelector and MuonSelector
61  // did not treat them.
62  } else {
63  // through for unknown types
64  throw cms::Exception("UnknownHitType") << "helper::ClusterStorer::addCluster: "
65  << "Unknown hit type " << hit_type.name() << ".\n";
66  }
67  } // end 'switch' on hit type
68  }
69 
70  // -------------------------------------------------------------
72  pixelClusterRecords_.clear();
73  stripClusterRecords_.clear();
75  }
76 
77  // -------------------------------------------------------------
85  if (!pixelClusterRecords_.empty()) {
86  this->processClusters<SiPixelRecHit, SiPixelCluster>(pixelClusterRecords_, pixelDsvToFill, refPixelClusters);
87  }
88  if (!stripClusterRecords_.empty()) {
89  // All we need from the HitType 'SiStripRecHit2D' is the
90  // typedef for 'SiStripRecHit2D::ClusterRef'.
91  // The fact that rekey<SiStripRecHit2D> is called is irrelevant since
92  // ClusterHitRecord<typename SiStripRecHit2D::ClusterRef>::rekey<RecHitType>
93  // is specialised such that 'RecHitType' is not used...
94  this->processClusters<SiStripRecHit2D, SiStripCluster>(stripClusterRecords_, stripDsvToFill, refStripClusters);
95  }
96  if (!phase2OTClusterRecords_.empty()) {
97  this->processClusters<Phase2TrackerRecHit1D, Phase2TrackerCluster1D>(
98  phase2OTClusterRecords_, phase2OTDsvToFill, refPhase2OTClusters);
99  }
100  }
101 
102  //-------------------------------------------------------------
103  template <typename HitType, typename ClusterType>
107  std::sort(clusterRecords.begin(), clusterRecords.end()); // this sorts them by detid
108  typedef typename std::vector<ClusterHitRecord<typename HitType::ClusterRef> >::iterator RIT;
109  RIT it = clusterRecords.begin(), end = clusterRecords.end();
110  size_t clusters = 0;
111  while (it != end) {
112  RIT it2 = it;
113  uint32_t detid = it->detid();
114 
115  // first isolate all clusters on the same detid
116  while ((it2 != end) && (it2->detid() == detid)) {
117  ++it2;
118  }
119  // now [it, it2] bracket one detid
120 
121  // then prepare to copy the clusters
122  typename edmNew::DetSetVector<ClusterType>::FastFiller filler(dsvToFill, detid);
123  typename HitType::ClusterRef lastRef, newRef;
124  for (; it != it2; ++it) { // loop on the detid
125  // first check if we need to clone the hit
126  if (it->clusterRef() != lastRef) {
127  lastRef = it->clusterRef();
128  // clone cluster
129  filler.push_back(*lastRef);
130  // make new ref
131  newRef = typename HitType::ClusterRef(refprod, clusters++);
132  }
133  it->template rekey<HitType>(newRef);
134  } // end of the loop on a single detid
135 
136  } // end of the loop on all clusters
137  }
138 
139  //-------------------------------------------------------------
140  // helper classes
141  //-------------------------------------------------------------
142  // FIXME (migrate to new RTTI and interface)
143  // generic rekey (in practise for pixel only...)
144  template <typename ClusterRefType> // template for class
145  template <typename RecHitType> // template for member function
146  void ClusterStorer::ClusterHitRecord<ClusterRefType>::rekey(const ClusterRefType &newRef) {
147  TrackingRecHit &genericHit = (*hits_)[index_];
148  RecHitType *hit = nullptr;
149  if (genericHit.geographicalId().rawId() == detid_) { // a hit on this det, so it's simple
150  hit = dynamic_cast<RecHitType *>(&genericHit); //static_cast<RecHitType *>(&genericHit);
151  }
152  assert(hit != nullptr);
153  assert(hit->cluster() == ref_); // otherwise something went wrong
154  hit->setClusterRef(newRef);
155  }
156 
157  // -------------------------------------------------------------
158  // Specific rekey for class template ClusterRefType = SiStripRecHit2D::ClusterRef,
159  // RecHitType is not used.
160  template <>
161  template <typename RecHitType> // or template<> to specialise also here?
163  TrackingRecHit &genericHit = (*hits_)[index_];
164  const std::type_info &hit_type = typeid(genericHit);
165 
166  OmniClusterRef *cluRef = nullptr;
167  if (typeid(SiStripRecHit1D) == hit_type) {
168  cluRef = &static_cast<SiStripRecHit1D &>(genericHit).omniCluster();
169  } else if (typeid(SiStripRecHit2D) == hit_type) {
170  cluRef = &static_cast<SiStripRecHit2D &>(genericHit).omniCluster();
171  } else if (typeid(SiStripMatchedRecHit2D) == hit_type) {
172  SiStripMatchedRecHit2D &mhit = static_cast<SiStripMatchedRecHit2D &>(genericHit);
173  cluRef = (SiStripDetId(detid_).stereo() ? &mhit.stereoClusterRef() : &mhit.monoClusterRef());
174  } else if (typeid(ProjectedSiStripRecHit2D) == hit_type) {
175  cluRef = &static_cast<ProjectedSiStripRecHit2D &>(genericHit).originalHit().omniCluster();
176  }
177 
178  assert(cluRef != nullptr); // to catch missing RecHit types
179  assert(cluRef->key() == ref_.key()); // otherwise something went wrong
180  (*cluRef) = OmniClusterRef(newRef);
181  }
182 
183  // -------------------------------------------------------------
184  // Specific rekey for class template ClusterRefType = Phase2TrackerRecHit1D::ClusterRef
185  template <>
186  template <typename RecHitType>
188  const Phase2TrackerRecHit1D::ClusterRef &newRef) {
189  TrackingRecHit &genericHit = (*hits_)[index_];
190  const std::type_info &hit_type = typeid(genericHit);
191 
192  OmniClusterRef *cluRef = nullptr;
193  if (typeid(Phase2TrackerRecHit1D) == hit_type) {
194  cluRef = &static_cast<Phase2TrackerRecHit1D &>(genericHit).omniCluster();
195  } else if (typeid(VectorHit) == hit_type) {
196  VectorHit &vHit = static_cast<VectorHit &>(genericHit);
197  // FIXME: this essentially uses a hack
198  // https://github.com/cms-sw/cmssw/blob/master/DataFormats/TrackerCommon/interface/TrackerTopology.h#L291
199  cluRef = (SiStripDetId(detid_).stereo() ? &vHit.upperClusterRef() : &vHit.lowerClusterRef());
200  }
201 
202  assert(cluRef != nullptr); // to catch missing RecHit types
203  assert(cluRef->key() == ref_.key()); // otherwise something went wrong
204  (*cluRef) = OmniClusterRef(newRef);
205  }
206 
207 } // namespace helper
A struct for clusters associated to hits.
Definition: ClusterStorer.h:50
ClusterHitRecord< SiStripRecHit2D::ClusterRef > StripClusterHitRecord
Assuming that the ClusterRef is the same for all SiStripRecHit*:
Definition: ClusterStorer.h:80
SiStripRecHit2D stereoHit() const
Definition: helper.py:1
OmniClusterRef const upperClusterRef() const
Definition: VectorHit.h:94
OmniClusterRef const & stereoClusterRef() const
void addCluster(TrackingRecHitCollection &hits, size_t index)
add cluster of newHit to list (throws if hit is of unknown type)
assert(be >=bs)
OmniClusterRef const & monoClusterRef() const
uint32_t stereo() const
Definition: SiStripDetId.h:168
std::vector< Phase2OTClusterHitRecord > phase2OTClusterRecords_
Definition: ClusterStorer.h:97
ClusterHitRecord< SiPixelRecHit::ClusterRef > PixelClusterHitRecord
Definition: ClusterStorer.h:78
void processAllClusters(edmNew::DetSetVector< SiPixelCluster > &pixelDsvToFill, edm::RefProd< edmNew::DetSetVector< SiPixelCluster > > refPixelClusters, edmNew::DetSetVector< SiStripCluster > &stripDsvToFill, edm::RefProd< edmNew::DetSetVector< SiStripCluster > > refStripClusters, edmNew::DetSetVector< Phase2TrackerCluster1D > &phase2OTDsvToFill, edm::RefProd< edmNew::DetSetVector< Phase2TrackerCluster1D > > refPhase2OTClusters)
std::vector< PixelClusterHitRecord > pixelClusterRecords_
Definition: ClusterStorer.h:95
Detector identifier class for the strip tracker.
Definition: SiStripDetId.h:18
ClusterHitRecord< Phase2TrackerRecHit1D::ClusterRef > Phase2OTClusterHitRecord
Definition: ClusterStorer.h:83
DetId geographicalId() const
OmniClusterRef const lowerClusterRef() const
Definition: VectorHit.h:93
constexpr uint32_t rawId() const
get the raw id
Definition: DetId.h:57
void clear()
clear records
void processClusters(std::vector< ClusterHitRecord< typename HitType::ClusterRef > > &clusterRecords, edmNew::DetSetVector< ClusterType > &dsvToFill, edm::RefProd< edmNew::DetSetVector< ClusterType > > &refprod)
void rekey(const ClusterRefType &newRef)
SiStripRecHit2D originalHit() const
SiStripRecHit2D monoHit() const
unsigned int key() const
Our base class.
Definition: SiPixelRecHit.h:23
OmniClusterRef const & omniCluster() const
std::vector< StripClusterHitRecord > stripClusterRecords_
Definition: ClusterStorer.h:96