CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
TkStripMeasurementDet.cc
Go to the documentation of this file.
10 
11 #include <typeinfo>
14 #include<cassert>
15 
16 TkStripMeasurementDet::TkStripMeasurementDet( const GeomDet* gdet, StMeasurementConditionSet & conditions ) :
17  MeasurementDet (gdet), index_(-1), theDetConditions(&conditions)
18  {
19  if (dynamic_cast<const StripGeomDetUnit*>(gdet) == 0) {
20  throw MeasurementDetException( "TkStripMeasurementDet constructed with a GeomDet which is not a StripGeomDetUnit");
21  }
22  }
23 
24 TkStripMeasurementDet::RecHitContainer
25 TkStripMeasurementDet::recHits( const TrajectoryStateOnSurface& ts, const MeasurementTrackerEvent & data) const
26 {
27  RecHitContainer result;
28  if ( (!isActive(data)) || isEmpty(data.stripData())) return result;
29  if(!isRegional()){//old implemetation with DetSet
30  const detset & detSet = data.stripData().detSet(index());
31  result.reserve(detSet.size());
32  for ( new_const_iterator ci = detSet.begin(); ci != detSet.end(); ++ ci ) {
33  if (isMasked(*ci)) continue;
34  // for ( ClusterIterator ci=theClusterRange.first; ci != theClusterRange.second; ci++) {
35  SiStripClusterRef cluster = edmNew::makeRefTo( data.stripData().handle(), ci );
36  if (accept(cluster, data.stripClustersToSkip()))
37  result.push_back( buildRecHit( cluster, ts));
38  else LogDebug("TkStripMeasurementDet")<<"skipping this str from last iteration on"<<rawId()<<" key: "<<cluster.key();
39  }
40  }else{
41  unsigned int ci = beginClusterI(data.stripData()), ce = endClusterI(data.stripData());
42  result.reserve(ce-ci);
43  for (; ci != ce; ++ci){
44  SiStripRegionalClusterRef clusterRef = edm::makeRefToLazyGetter(data.stripData().regionalHandle(),ci);
45  if (isMasked(*clusterRef)) continue;
46  if (accept(clusterRef, data.stripClustersToSkip()))
47  result.push_back( buildRecHit( clusterRef, ts));
48  else LogDebug("TkStripMeasurementDet")<<"skipping this reg str from last iteration on"<<rawId()<<" key: "<<clusterRef.key();
49  }
50  }
51  return result;
52 
53 }
54 
55 
56 bool
57 TkStripMeasurementDet::recHits( const TrajectoryStateOnSurface& stateOnThisDet, const MeasurementEstimator& est, const MeasurementTrackerEvent & data,
58  RecHitContainer & result, std::vector<float> & diffs ) const {
59  if ( (!isActive(data)) || isEmpty(data.stripData())) return false;
60 
61  auto oldSize = result.size();
62 
63  float utraj = specificGeomDet().specificTopology().measurementPosition( stateOnThisDet.localPosition()).x();
64  if(!isRegional()){//old implemetation with DetSet
65 
66  const detset & detSet = data.stripData().detSet(index());
67  auto rightCluster =
68  std::find_if( detSet.begin(), detSet.end(), [utraj](const SiStripCluster& hit) { return hit.barycenter() > utraj; });
69 
70  if ( rightCluster != detSet.begin()) {
71  // there are hits on the left of the utraj
72  auto leftCluster = rightCluster;
73  while ( --leftCluster >= detSet.begin()) {
74  SiStripClusterRef clusterref = edmNew::makeRefTo( data.stripData().handle(), leftCluster );
75  bool isCompatible = filteredRecHits(clusterref, stateOnThisDet, est, data.stripClustersToSkip(), result, diffs);
76  if(!isCompatible) break; // exit loop on first incompatible hit
77  }
78  }
79  for ( ; rightCluster != detSet.end(); rightCluster++) {
80  SiStripClusterRef clusterref = edmNew::makeRefTo( data.stripData().handle(), rightCluster );
81  bool isCompatible = filteredRecHits(clusterref, stateOnThisDet, est, data.stripClustersToSkip(), result,diffs);
82  if(!isCompatible) break; // exit loop on first incompatible hit
83  }
84 
85  }// end block with DetSet
86  else{
87 
88  LogDebug("TkStripMeasurementDet")<<" finding left/ right";
89  unsigned int rightCluster = beginClusterI(data.stripData());
90  unsigned int endCluster = endClusterI(data.stripData());
91  result.reserve(endCluster-rightCluster);
92  for (; rightCluster!= endCluster;++rightCluster){
93  SiStripRegionalClusterRef clusterref = edm::makeRefToLazyGetter(data.stripData().regionalHandle(),rightCluster);
94  if (clusterref->barycenter() > utraj) break;
95  }
96 
97  unsigned int leftCluster = 1;
98  for (unsigned int iReadBackWard=1; iReadBackWard<=(rightCluster-beginClusterI(data.stripData())) ; ++iReadBackWard){
99  leftCluster=rightCluster-iReadBackWard;
100  SiStripRegionalClusterRef clusterref = edm::makeRefToLazyGetter(data.stripData().regionalHandle(),leftCluster);
101  bool isCompatible = filteredRecHits( clusterref, stateOnThisDet, est, data.stripClustersToSkip(), result,diffs);
102  if(!isCompatible) break; // exit loop on first incompatible hit
103  }
104  for ( ; rightCluster != endCluster; ++rightCluster) {
105  SiStripRegionalClusterRef clusterref = edm::makeRefToLazyGetter(data.stripData().regionalHandle(),rightCluster);
106  bool isCompatible = filteredRecHits( clusterref, stateOnThisDet, est, data.stripClustersToSkip(), result,diffs);
107  if(!isCompatible) break; // exit loop on first incompatible hit
108  }
109  }
110  return result.size()>oldSize;
111 }
112 
113 bool TkStripMeasurementDet::measurements( const TrajectoryStateOnSurface& stateOnThisDet,
114  const MeasurementEstimator& est, const MeasurementTrackerEvent & data,
115  TempMeasurements & result) const {
116 
117  if (!isActive(data)) {
118  LogDebug("TkStripMeasurementDet")<<" found an inactive module "<<rawId();
119  result.add(InvalidTransientRecHit::build(&geomDet(), TrackingRecHit::inactive), 0.F);
120  return true;
121  }
122 
123  if (!isEmpty(data.stripData())){
124  LogDebug("TkStripMeasurementDet")<<" found hit on this module "<<rawId();
125  RecHitContainer rechits;
126  std::vector<float> diffs;
127  if (recHits(stateOnThisDet,est,data,result.hits,result.distances)) return true;
128  }
129 
130 
131  // create a TrajectoryMeasurement with an invalid RecHit and zero estimate
132 
133  if (!stateOnThisDet.hasError()) {
134  result.add(InvalidTransientRecHit::build(&fastGeomDet(), TrackingRecHit::missing), 0.F);
135  return false;
136  }
137 
138  float utraj = specificGeomDet().specificTopology().measurementPosition( stateOnThisDet.localPosition()).x();
139  float uerr= sqrt(specificGeomDet().specificTopology().measurementError(stateOnThisDet.localPosition(),stateOnThisDet.localError().positionError()).uu());
140  if (testStrips(utraj,uerr)) {
141  //LogDebug("TkStripMeasurementDet") << " DetID " << id_ << " empty after search, but active ";
142  result.add(InvalidTransientRecHit::build(&fastGeomDet(), TrackingRecHit::missing), 0.F);
143  return false;
144  }
145 
146  //LogDebug("TkStripMeasurementDet") << " DetID " << id_ << " empty after search, and inactive ";
147  result.add(InvalidTransientRecHit::build(&fastGeomDet(), TrackingRecHit::inactive), 0.F);
148  return true;
149 
150 }
151 
152 
153 
154 
155 
156 
157 
158 void
159 TkStripMeasurementDet::simpleRecHits( const TrajectoryStateOnSurface& ts, const MeasurementTrackerEvent & data, std::vector<SiStripRecHit2D> &result) const
160 {
161  if (isEmpty(data.stripData()) || !isActive(data)) return;
162 
163  if(!isRegional()){//old implemetation with DetSet
164  const detset & detSet = data.stripData().detSet(index());
165  result.reserve(detSet.size());
166  for ( new_const_iterator ci = detSet.begin(); ci != detSet.end(); ++ ci ) {
167  if (isMasked(*ci)) continue;
168  // for ( ClusterIterator ci=theClusterRange.first; ci != theClusterRange.second; ci++) {
169  SiStripClusterRef cluster = edmNew::makeRefTo( data.stripData().handle(), ci );
170  if (accept(cluster, data.stripClustersToSkip()))
171  buildSimpleRecHit( cluster, ts,result);
172  else LogDebug("TkStripMeasurementDet")<<"skipping this str from last iteration on"<<rawId()<<" key: "<<cluster.key();
173  }
174  }else{
175  unsigned int ci = beginClusterI(data.stripData()), ce = endClusterI(data.stripData());
176  result.reserve(ce-ci);
177  for (;ci != ce;++ci){
178  SiStripRegionalClusterRef clusterRef = edm::makeRefToLazyGetter(data.stripData().regionalHandle(),ci);
179  if (isMasked(*clusterRef)) continue;
180  if (accept(clusterRef, data.stripClustersToSkip()))
181  buildSimpleRecHit( clusterRef, ts,result);
182  else LogDebug("TkStripMeasurementDet")<<"skipping this reg str from last iteration on"<<rawId()<<" key: "<<clusterRef.key();
183  }
184  }
185 }
186 
187 
188 
189 bool
190 TkStripMeasurementDet::testStrips(float utraj, float uerr) const {
191  int16_t start = (int16_t) std::max<float>(utraj - 3.f*uerr, 0);
192  int16_t end = (int16_t) std::min<float>(utraj + 3.f*uerr, totalStrips());
193 
194  if (start >= end) { // which means either end <=0 or start >= totalStrips_
195  /* LogDebug("TkStripMeasurementDet") << "Testing module " << id_ <<","<<
196  " U = " << utraj << " +/- " << uerr <<
197  "; Range [" << (utraj - 3*uerr) << ", " << (utraj + 3*uerr) << "] " <<
198  ": YOU'RE COMPLETELY OFF THE MODULE."; */
199  //return false;
200  return true; // Wolfgang thinks this way is better
201  // and solves some problems with grouped ckf
202  }
203 
204  typedef std::vector<BadStripBlock>::const_iterator BSBIT;
205 
206  int16_t bad = 0, largestBadBlock = 0;
207  for (BSBIT bsbc = badStripBlocks().begin(), bsbe = badStripBlocks().end(); bsbc != bsbe; ++bsbc) {
208  if (bsbc->last < start) continue;
209  if (bsbc->first > end) break;
210  int16_t thisBad = std::min(bsbc->last, end) - std::max(bsbc->first, start);
211  if (thisBad > largestBadBlock) largestBadBlock = thisBad;
212  bad += thisBad;
213  }
214 
215  bool ok = (bad < (end-start)) &&
216  (uint16_t(bad) <= badStripCuts().maxBad) &&
217  (uint16_t(largestBadBlock) <= badStripCuts().maxConsecutiveBad);
218 
219 // if (bad) {
220 // edm::LogWarning("TkStripMeasurementDet") << "Testing module " << id_ <<" (subdet: "<< SiStripDetId(id_).subdetId() << ")" <<
221 // " U = " << utraj << " +/- " << uerr <<
222 // "; Range [" << (utraj - 3*uerr) << ", " << (utraj + 3*uerr) << "] " <<
223 // "= [" << start << "," << end << "]" <<
224 // " total strips:" << (end-start) << ", good:" << (end-start-bad) << ", bad:" << bad << ", largestBadBlock: " << largestBadBlock <<
225 // ". " << (ok ? "OK" : "NO");
226 // }
227  return ok;
228 }
229 
#define LogDebug(id)
edm::Ref< typename HandleT::element_type, typename HandleT::element_type::value_type::value_type > makeRefTo(const HandleT &iHandle, typename HandleT::element_type::value_type::const_iterator itIter)
tuple start
Check for commandline option errors.
Definition: dqm_diff.py:58
const StripDetset & detSet(int i) const
edm::Handle< edm::LazyGetter< SiStripCluster > > & regionalHandle()
const StMeasurementDetSet & stripData() const
bool accept(const edm::Event &event, const edm::TriggerResults &triggerTable, const std::string &triggerPath)
Definition: TopDQMHelpers.h:26
const std::vector< bool > & stripClustersToSkip() const
LocalError positionError() const
int bad(Items const &cont)
const T & max(const T &a, const T &b)
T sqrt(T t)
Definition: SSEVec.h:48
tuple result
Definition: query.py:137
Ref< LazyGetter< T >, T, FindValue< T > > makeRefToLazyGetter(const Handle< LazyGetter< T > > &handle, const uint32_t index)
Definition: LazyGetter.h:545
double f[11][100]
#define end
Definition: vmac.h:37
const LocalTrajectoryError & localError() const
char data[epos_bytes_allocation]
Definition: EPOS_Wrapper.h:82
edm::Handle< edmNew::DetSetVector< SiStripCluster > > & handle()
Definition: DDAxes.h:10
static uInt32 F(BLOWFISH_CTX *ctx, uInt32 x)
Definition: blowfish.cc:281