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.
11 
12 #include <typeinfo>
16 
19  bool regional) :
20  MeasurementDet (gdet),
21  isRegional(regional),
22  empty(true),
23  activeThisEvent_(true), activeThisPeriod_(true),
24  theCPE(cpe)
25  {
26  theStripGDU = dynamic_cast<const StripGeomDetUnit*>(gdet);
27  if (theStripGDU == 0) {
28  throw MeasurementDetException( "TkStripMeasurementDet constructed with a GeomDet which is not a StripGeomDetUnit");
29  }
30 
31  //intialize the detId !
32  id_ = gdet->geographicalId().rawId();
33  //initalize the total number of strips
35  }
36 
37 std::vector<TrajectoryMeasurement>
40  const TrajectoryStateOnSurface& startingState,
41  const Propagator&,
42  const MeasurementEstimator& est) const
43 {
44  std::vector<TrajectoryMeasurement> result;
45 
46  if (isActive() == false) {
47  result.push_back( TrajectoryMeasurement( stateOnThisDet,
49  0.F));
50  // LogDebug("TkStripMeasurementDet") << " DetID " << id_ << " inactive";
51  return result;
52  }
53 
54  float utraj = theStripGDU->specificTopology().measurementPosition( stateOnThisDet.localPosition()).x();
55  float uerr;
56  // if (theClusterRange.first == theClusterRange.second) { // empty
57  if (empty == true){
58  //LogDebug("TkStripMeasurementDet") << " DetID " << id_ << " empty ";
59  if (stateOnThisDet.hasError()){
60  uerr= sqrt(theStripGDU->specificTopology().measurementError(stateOnThisDet.localPosition(),stateOnThisDet.localError().positionError()).uu());
61  if (testStrips(utraj,uerr)) {
62  result.push_back( TrajectoryMeasurement( stateOnThisDet, InvalidTransientRecHit::build(&geomDet(), TrackingRecHit::missing), 0.F));
63  } else {
64  result.push_back( TrajectoryMeasurement( stateOnThisDet, InvalidTransientRecHit::build(&geomDet(), TrackingRecHit::inactive), 0.F));
65  }
66  }else{
67  result.push_back( TrajectoryMeasurement( stateOnThisDet, InvalidTransientRecHit::build(&geomDet(), TrackingRecHit::missing), 0.F));
68  }
69  return result;
70  }
71 
72  if(!isRegional){//old implemetation with DetSet
73  new_const_iterator rightCluster =
74  std::find_if( detSet_.begin(), detSet_.end(), StripClusterAboveU( utraj)); //FIXME
75 
76  if ( rightCluster != detSet_.begin()) {
77  // there are hits on the left of the utraj
78  new_const_iterator leftCluster = rightCluster;
79  while ( --leftCluster >= detSet_.begin()) {
80  if (isMasked(*leftCluster)) continue;
81  SiStripClusterRef clusterref = edmNew::makeRefTo( handle_, leftCluster );
82  //TransientTrackingRecHit::RecHitPointer recHit = buildRecHit(clusterref,
83  // stateOnThisDet);
84  RecHitContainer recHits = buildRecHits(clusterref,stateOnThisDet);
85  bool isCompatible(false);
86  for(RecHitContainer::const_iterator recHit=recHits.begin();recHit!=recHits.end();++recHit){
87  std::pair<bool,double> diffEst = est.estimate(stateOnThisDet, **recHit);
88  if ( diffEst.first ) {
89  result.push_back( TrajectoryMeasurement( stateOnThisDet, *recHit,
90  diffEst.second));
91  isCompatible = true;
92  }
93  }
94  if(!isCompatible) break; // exit loop on first incompatible hit
95  }
96  }
97 
98  for ( ; rightCluster != detSet_.end(); rightCluster++) {
99  if (isMasked(*rightCluster)) continue;
100  SiStripClusterRef clusterref = edmNew::makeRefTo( handle_, rightCluster );
101  //TransientTrackingRecHit::RecHitPointer recHit = buildRecHit( clusterref,
102  // stateOnThisDet);
103  RecHitContainer recHits = buildRecHits(clusterref,stateOnThisDet);
104  bool isCompatible(false);
105  for(RecHitContainer::const_iterator recHit=recHits.begin();recHit!=recHits.end();++recHit){
106  std::pair<bool,double> diffEst = est.estimate(stateOnThisDet, **recHit);
107  if ( diffEst.first ) {
108  result.push_back( TrajectoryMeasurement( stateOnThisDet, *recHit,
109  diffEst.second));
110  isCompatible = true;
111  }
112  }
113  if(!isCompatible) break; // exit loop on first incompatible hit
114  }
115  }// end block with DetSet
116  else{
117  const_iterator rightCluster =
118  std::find_if( beginCluster, endCluster, StripClusterAboveU( utraj));
119 
120  if ( rightCluster != beginCluster) {
121  // there are hits on the left of the utraj
122  const_iterator leftCluster = rightCluster;
123  while ( --leftCluster >= beginCluster) {
124  if (isMasked(*leftCluster)) continue;
125  // TransientTrackingRecHit* recHit = buildRecHit( *leftCluster,
126  //std::cout << "=====making ref in fastMeas left " << std::endl;
127  SiStripRegionalClusterRef clusterref = edm::makeRefToLazyGetter(regionalHandle_,leftCluster-regionalHandle_->begin_record());
128  //TransientTrackingRecHit::RecHitPointer recHit = buildRecHit(clusterref,
129  // stateOnThisDet);
130  RecHitContainer recHits = buildRecHits(clusterref,stateOnThisDet);
131  bool isCompatible(false);
132  for(RecHitContainer::const_iterator recHit=recHits.begin();recHit!=recHits.end();++recHit){
133  std::pair<bool,double> diffEst = est.estimate(stateOnThisDet, **recHit);
134  if ( diffEst.first ) {
135  result.push_back( TrajectoryMeasurement( stateOnThisDet, *recHit,
136  diffEst.second));
137  isCompatible = true;
138  }
139  }
140  if(!isCompatible) break; // exit loop on first incompatible hit
141  }
142  }
143 
144  for ( ; rightCluster != endCluster; rightCluster++) {
145  if (isMasked(*rightCluster)) continue;
146  //std::cout << "=====making ref in fastMeas rigth " << std::endl;
147  SiStripRegionalClusterRef clusterref = edm::makeRefToLazyGetter(regionalHandle_,rightCluster-regionalHandle_->begin_record());
148  //TransientTrackingRecHit::RecHitPointer recHit = buildRecHit( clusterref,
149  // stateOnThisDet);
150  RecHitContainer recHits = buildRecHits(clusterref,stateOnThisDet);
151  bool isCompatible(false);
152  for(RecHitContainer::const_iterator recHit=recHits.begin();recHit!=recHits.end();++recHit){
153  std::pair<bool,double> diffEst = est.estimate(stateOnThisDet, **recHit);
154  if ( diffEst.first ) {
155  result.push_back( TrajectoryMeasurement( stateOnThisDet, *recHit,
156  diffEst.second));
157  isCompatible = true;
158  }
159  }
160  if(!isCompatible) break; // exit loop on first incompatible hit
161  }
162  }
163 
164 
165  if ( result.empty()) {
166  // create a TrajectoryMeasurement with an invalid RecHit and zero estimate
167  if (stateOnThisDet.hasError()){
168  uerr= sqrt(theStripGDU->specificTopology().measurementError(stateOnThisDet.localPosition(),stateOnThisDet.localError().positionError()).uu());
169  if (testStrips(utraj,uerr)) {
170  //LogDebug("TkStripMeasurementDet") << " DetID " << id_ << " empty after search, but active ";
171  result.push_back( TrajectoryMeasurement( stateOnThisDet, InvalidTransientRecHit::build(&geomDet(), TrackingRecHit::missing), 0.F));
172  } else {
173  //LogDebug("TkStripMeasurementDet") << " DetID " << id_ << " empty after search, and inactive ";
174  result.push_back( TrajectoryMeasurement( stateOnThisDet, InvalidTransientRecHit::build(&geomDet(), TrackingRecHit::inactive), 0.F));
175  }
176  }else{
177  result.push_back( TrajectoryMeasurement( stateOnThisDet, InvalidTransientRecHit::build(&geomDet(), TrackingRecHit::missing), 0.F));
178  }
179  }
180  else {
181  //LogDebug("TkStripMeasurementDet") << " DetID " << id_ << " full: " << (result.size()) << " compatible hits";
182  // sort results according to estimator value
183  if ( result.size() > 1) {
184  sort( result.begin(), result.end(), TrajMeasLessEstim());
185  }
186  }
187  return result;
188 }
189 
190 
193  const TrajectoryStateOnSurface& ltp) const
194 {
195  const GeomDetUnit& gdu( specificGeomDet());
196  LocalValues lv = theCPE->localParameters( *cluster, gdu, ltp);
197  return TSiStripRecHit2DLocalPos::build( lv.first, lv.second, &geomDet(), cluster, theCPE);
198 }
199 
202  const TrajectoryStateOnSurface& ltp) const
203 {
204  const GeomDetUnit& gdu( specificGeomDet());
205  LocalValues lv = theCPE->localParameters( *cluster, gdu, ltp);
206  return TSiStripRecHit2DLocalPos::build( lv.first, lv.second, &geomDet(), cluster, theCPE);
207 }
208 
209 
210 
213  const TrajectoryStateOnSurface& ltp) const
214 {
215  const GeomDetUnit& gdu( specificGeomDet());
216  VLocalValues vlv = theCPE->localParametersV( *cluster, gdu, ltp);
217  RecHitContainer res;
218  for(VLocalValues::const_iterator it=vlv.begin();it!=vlv.end();++it){
219  res.push_back(TSiStripRecHit2DLocalPos::build( it->first, it->second, &geomDet(), cluster, theCPE));
220  }
221  return res;
222 }
223 
224 
227  const TrajectoryStateOnSurface& ltp) const
228 {
229  const GeomDetUnit& gdu( specificGeomDet());
230  VLocalValues vlv = theCPE->localParametersV( *cluster, gdu, ltp);
231  RecHitContainer res;
232  for(VLocalValues::const_iterator it=vlv.begin();it!=vlv.end();++it){
233  res.push_back(TSiStripRecHit2DLocalPos::build( it->first, it->second, &geomDet(), cluster, theCPE));
234  }
235  return res;
236 }
237 
238 
239 
242 {
244  if (empty == true) return result;
245  if (isActive() == false) return result; // GIO
246 
247  if(!isRegional){//old implemetation with DetSet
248  result.reserve(detSet_.size());
249  for ( new_const_iterator ci = detSet_.begin(); ci != detSet_.end(); ++ ci ) {
250  if (isMasked(*ci)) continue;
251  // for ( ClusterIterator ci=theClusterRange.first; ci != theClusterRange.second; ci++) {
252  SiStripClusterRef cluster = edmNew::makeRefTo( handle_, ci );
253  result.push_back( buildRecHit( cluster, ts));
254  }
255  }else{
256  result.reserve(endCluster - beginCluster);
257  for (const_iterator ci = beginCluster ; ci != endCluster; ci++) {
258  if (isMasked(*ci)) continue;
260  result.push_back( buildRecHit( clusterRef, ts));
261  }
262  }
263  return result;
264 
265 }
266 
267 template<class ClusterRefT>
268 void
269 TkStripMeasurementDet::buildSimpleRecHit( const ClusterRefT& cluster,
270  const TrajectoryStateOnSurface& ltp,
271  std::vector<SiStripRecHit2D>& res ) const
272 {
273  const GeomDetUnit& gdu( specificGeomDet());
274  VLocalValues vlv = theCPE->localParametersV( *cluster, gdu, ltp);
275  for(VLocalValues::const_iterator it=vlv.begin();it!=vlv.end();++it){
276  res.push_back(SiStripRecHit2D( it->first, it->second, geomDet().geographicalId(), cluster));
277  }
278 }
279 
280 
281 void
282 TkStripMeasurementDet::simpleRecHits( const TrajectoryStateOnSurface& ts, std::vector<SiStripRecHit2D> &result) const
283 {
284  if (empty || !isActive()) return;
285 
286  if(!isRegional){//old implemetation with DetSet
287  result.reserve(detSet_.size());
288  for ( new_const_iterator ci = detSet_.begin(); ci != detSet_.end(); ++ ci ) {
289  if (isMasked(*ci)) continue;
290  // for ( ClusterIterator ci=theClusterRange.first; ci != theClusterRange.second; ci++) {
291  SiStripClusterRef cluster = edmNew::makeRefTo( handle_, ci );
292  buildSimpleRecHit( cluster, ts,result);
293  }
294  }else{
295  result.reserve(endCluster - beginCluster);
296  for (const_iterator ci = beginCluster ; ci != endCluster; ci++) {
297  if (isMasked(*ci)) continue;
299  buildSimpleRecHit( clusterRef, ts,result);
300  }
301  }
302 }
303 
304 
305 void
307  if (idx == -1) {
308  std::fill(bad128Strip_, bad128Strip_+6, !good);
309  hasAny128StripBad_ = !good;
310  } else {
311  bad128Strip_[idx] = !good;
312  if (good == false) {
313  hasAny128StripBad_ = false;
314  } else { // this should not happen, as usually you turn on all fibers
315  // and then turn off the bad ones, and not vice-versa,
316  // so I don't care if it's not optimized
317  hasAny128StripBad_ = true;
318  for (int i = 0; i < (totalStrips_ >> 7); i++) {
319  if (bad128Strip_[i] == false) hasAny128StripBad_ = false;
320  }
321  }
322  }
323 
324 }
325 
326 bool
327 TkStripMeasurementDet::testStrips(float utraj, float uerr) const {
328  int16_t start = (int16_t) std::max<float>(utraj - 3*uerr, 0);
329  int16_t end = (int16_t) std::min<float>(utraj + 3*uerr, totalStrips_);
330 
331  if (start >= end) { // which means either end <=0 or start >= totalStrips_
332  /* LogDebug("TkStripMeasurementDet") << "Testing module " << id_ <<","<<
333  " U = " << utraj << " +/- " << uerr <<
334  "; Range [" << (utraj - 3*uerr) << ", " << (utraj + 3*uerr) << "] " <<
335  ": YOU'RE COMPLETELY OFF THE MODULE."; */
336  //return false;
337  return true; // Wolfgang thinks this way is better
338  // and solves some problems with grouped ckf
339  }
340 
341  typedef std::vector<BadStripBlock>::const_iterator BSBIT;
342  BSBIT bsbc = badStripBlocks_.begin(), bsbe = badStripBlocks_.end();
343 
344  int16_t bad = 0, largestBadBlock = 0;
345  for (BSBIT bsbc = badStripBlocks_.begin(), bsbe = badStripBlocks_.end(); bsbc != bsbe; ++bsbc) {
346  if (bsbc->last < start) continue;
347  if (bsbc->first > end) break;
348  int16_t thisBad = std::min(bsbc->last, end) - std::max(bsbc->first, start);
349  if (thisBad > largestBadBlock) largestBadBlock = thisBad;
350  bad += thisBad;
351  }
352 
353  bool ok = (bad < (end-start)) &&
354  (uint16_t(bad) <= badStripCuts_.maxBad) &&
355  (uint16_t(largestBadBlock) <= badStripCuts_.maxConsecutiveBad);
356 
357 // if (bad) {
358 // edm::LogWarning("TkStripMeasurementDet") << "Testing module " << id_ <<" (subdet: "<< SiStripDetId(id_).subdetId() << ")" <<
359 // " U = " << utraj << " +/- " << uerr <<
360 // "; Range [" << (utraj - 3*uerr) << ", " << (utraj + 3*uerr) << "] " <<
361 // "= [" << start << "," << end << "]" <<
362 // " total strips:" << (end-start) << ", good:" << (end-start-bad) << ", bad:" << bad << ", largestBadBlock: " << largestBadBlock <<
363 // ". " << (ok ? "OK" : "NO");
364 // }
365  return ok;
366 }
367 
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)
virtual int nstrips() const =0
int i
Definition: DBlmapReader.cc:9
void buildSimpleRecHit(const ClusterRefT &cluster, const TrajectoryStateOnSurface &ltp, std::vector< SiStripRecHit2D > &res) const
static RecHitPointer build(const GeomDet *geom, Type type=TrackingRecHit::missing, const DetLayer *layer=0)
const StripClusterParameterEstimator * theCPE
virtual HitReturnType estimate(const TrajectoryStateOnSurface &ts, const TransientTrackingRecHit &hit) const =0
StripClusterParameterEstimator::VLocalValues VLocalValues
StripClusterParameterEstimator::LocalValues LocalValues
TransientTrackingRecHit::ConstRecHitContainer RecHitContainer
virtual const GeomDet & geomDet() const
#define min(a, b)
Definition: mlp_lapack.h:161
static RecHitPointer build(const GeomDet *geom, const SiStripRecHit2D *rh, const StripClusterParameterEstimator *cpe, float weight=1., float annealing=1., bool computeCoarseLocalPosition=false)
virtual RecHitContainer recHits(const TrajectoryStateOnSurface &) const
virtual const StripTopology & specificTopology() const
Returns a reference to the strip proxy topology.
TransientTrackingRecHit::RecHitPointer buildRecHit(const SiStripClusterRef &, const TrajectoryStateOnSurface &ltp) const
LocalError positionError() const
std::vector< SiStripCluster >::const_iterator beginCluster
bool isMasked(const SiStripCluster &cluster) const
int bad(Items const &cont)
uint32_t rawId() const
get the raw id
Definition: DetId.h:45
virtual LocalValues localParameters(const T &, const GeomDetUnit &) const =0
virtual VLocalValues localParametersV(const T &cluster, const GeomDetUnit &gd) const
virtual MeasurementError measurementError(const LocalPoint &, const LocalError &) const =0
std::vector< SiStripCluster >::const_iterator endCluster
virtual std::vector< TrajectoryMeasurement > fastMeasurements(const TrajectoryStateOnSurface &stateOnThisDet, const TrajectoryStateOnSurface &startingState, const Propagator &, const MeasurementEstimator &) const
const T & max(const T &a, const T &b)
T sqrt(T t)
Definition: SSEVec.h:28
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:525
TkStripMeasurementDet::RecHitContainer buildRecHits(const SiStripClusterRef &, const TrajectoryStateOnSurface &ltp) const
DetId geographicalId() const
The label of this GeomDet.
Definition: GeomDet.h:74
virtual MeasurementPoint measurementPosition(const LocalPoint &) const =0
#define end
Definition: vmac.h:38
const LocalTrajectoryError & localError() const
TkStripMeasurementDet(const GeomDet *gdet, const StripClusterParameterEstimator *cpe, bool regional)
std::vector< SiStripCluster >::const_iterator const_iterator
void set128StripStatus(bool good, int idx=-1)
Sets the status of a block of 128 strips (or all blocks if idx=-1)
std::vector< BadStripBlock > badStripBlocks_
edm::Handle< edmNew::DetSetVector< SiStripCluster > > handle_
const StripGeomDetUnit & specificGeomDet() const
const StripGeomDetUnit * theStripGDU
iterator end()
Definition: DetSetNew.h:59
void simpleRecHits(const TrajectoryStateOnSurface &ts, std::vector< SiStripRecHit2D > &result) const
detset::const_iterator new_const_iterator
bool testStrips(float utraj, float uerr) const
return true if there are &#39;enough&#39; good strips in the utraj +/- 3 uerr range.
bool isActive() const
Is this module active in reconstruction? It must be both &#39;setActiveThisEvent&#39; and &#39;setActive&#39;...
size_type size() const
Definition: DetSetNew.h:75
edm::Handle< edm::LazyGetter< SiStripCluster > > regionalHandle_
iterator begin()
Definition: DetSetNew.h:56