CMS 3D CMS Logo

/data/refman/pasoursint/CMSSW_4_1_8_patch13/src/RecoTracker/MeasurementDet/src/TkStripMeasurementDet.cc

Go to the documentation of this file.
00001 #include "RecoTracker/MeasurementDet/interface/TkStripMeasurementDet.h"
00002 #include "TrackingTools/TransientTrackingRecHit/interface/InvalidTransientRecHit.h"
00003 #include "Geometry/CommonTopologies/interface/StripTopology.h"
00004 #include "TrackingTools/MeasurementDet/interface/MeasurementDetException.h"
00005 #include "TrackingTools/PatternTools/interface/TrajectoryMeasurement.h"
00006 #include "RecoTracker/MeasurementDet/interface/StripClusterAboveU.h"
00007 #include "RecoTracker/TransientTrackingRecHit/interface/TSiStripRecHit2DLocalPos.h"
00008 #include "DataFormats/TrackerRecHit2D/interface/SiStripRecHit2D.h"
00009 #include "TrackingTools/PatternTools/interface/MeasurementEstimator.h"
00010 #include "TrackingTools/PatternTools/interface/TrajMeasLessEstim.h"
00011 
00012 #include <typeinfo>
00013 #include "TrackingTools/KalmanUpdators/interface/Chi2MeasurementEstimator.h"
00014 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00015 #include "DataFormats/SiStripDetId/interface/SiStripDetId.h"
00016 
00017 TkStripMeasurementDet::TkStripMeasurementDet( const GeomDet* gdet,
00018                                               const StripClusterParameterEstimator* cpe,
00019                                               bool regional) : 
00020     MeasurementDet (gdet),
00021     isRegional(regional),
00022     empty(true),
00023     activeThisEvent_(true), activeThisPeriod_(true),
00024     theCPE(cpe)
00025   {
00026     theStripGDU = dynamic_cast<const StripGeomDetUnit*>(gdet);
00027     if (theStripGDU == 0) {
00028       throw MeasurementDetException( "TkStripMeasurementDet constructed with a GeomDet which is not a StripGeomDetUnit");
00029     }
00030 
00031     //intialize the detId !
00032     id_ = gdet->geographicalId().rawId();
00033     //initalize the total number of strips
00034     totalStrips_ =  specificGeomDet().specificTopology().nstrips();
00035   }
00036 
00037 std::vector<TrajectoryMeasurement> 
00038 TkStripMeasurementDet::
00039 fastMeasurements( const TrajectoryStateOnSurface& stateOnThisDet, 
00040                   const TrajectoryStateOnSurface& startingState, 
00041                   const Propagator&, 
00042                   const MeasurementEstimator& est) const
00043 { 
00044   std::vector<TrajectoryMeasurement> result;
00045 
00046   if (isActive() == false) {
00047     result.push_back( TrajectoryMeasurement( stateOnThisDet, 
00048                 InvalidTransientRecHit::build(&geomDet(), TrackingRecHit::inactive), 
00049                 0.F));
00050     //    LogDebug("TkStripMeasurementDet") << " DetID " << id_ << " inactive";
00051     return result;
00052   }
00053  
00054   float utraj =  theStripGDU->specificTopology().measurementPosition( stateOnThisDet.localPosition()).x();
00055   float uerr;
00056   //  if (theClusterRange.first == theClusterRange.second) { // empty
00057   if (empty  == true){
00058     //LogDebug("TkStripMeasurementDet") << " DetID " << id_ << " empty ";
00059     if (stateOnThisDet.hasError()){
00060     uerr= sqrt(theStripGDU->specificTopology().measurementError(stateOnThisDet.localPosition(),stateOnThisDet.localError().positionError()).uu());
00061      if (testStrips(utraj,uerr)) {
00062         result.push_back( TrajectoryMeasurement( stateOnThisDet, InvalidTransientRecHit::build(&geomDet(), TrackingRecHit::missing), 0.F));
00063      } else { 
00064         result.push_back( TrajectoryMeasurement( stateOnThisDet, InvalidTransientRecHit::build(&geomDet(), TrackingRecHit::inactive), 0.F));
00065      }
00066     }else{
00067       result.push_back( TrajectoryMeasurement( stateOnThisDet, InvalidTransientRecHit::build(&geomDet(), TrackingRecHit::missing), 0.F));
00068     }
00069     return result;
00070   }
00071   
00072   if(!isRegional){//old implemetation with DetSet
00073     new_const_iterator rightCluster = 
00074       std::find_if( detSet_.begin(), detSet_.end(), StripClusterAboveU( utraj)); //FIXME
00075 
00076     if ( rightCluster != detSet_.begin()) {
00077       // there are hits on the left of the utraj
00078       new_const_iterator leftCluster = rightCluster;
00079       while ( --leftCluster >=  detSet_.begin()) {
00080         if (isMasked(*leftCluster)) continue;
00081         SiStripClusterRef clusterref = edmNew::makeRefTo( handle_, leftCluster ); 
00082         //TransientTrackingRecHit::RecHitPointer recHit = buildRecHit(clusterref, 
00083         //                                                          stateOnThisDet);
00084         RecHitContainer recHits = buildRecHits(clusterref,stateOnThisDet); 
00085         bool isCompatible(false);
00086         for(RecHitContainer::const_iterator recHit=recHits.begin();recHit!=recHits.end();++recHit){       
00087           std::pair<bool,double> diffEst = est.estimate(stateOnThisDet, **recHit);
00088           if ( diffEst.first ) {
00089             result.push_back( TrajectoryMeasurement( stateOnThisDet, *recHit, 
00090                                                      diffEst.second));
00091             isCompatible = true;
00092           }
00093         }
00094         if(!isCompatible) break; // exit loop on first incompatible hit
00095       }
00096     }
00097     
00098     for ( ; rightCluster != detSet_.end(); rightCluster++) {
00099       if (isMasked(*rightCluster)) continue;
00100       SiStripClusterRef clusterref = edmNew::makeRefTo( handle_, rightCluster ); 
00101       //TransientTrackingRecHit::RecHitPointer recHit = buildRecHit( clusterref, 
00102       //                                                                   stateOnThisDet);
00103       RecHitContainer recHits = buildRecHits(clusterref,stateOnThisDet); 
00104       bool isCompatible(false);
00105       for(RecHitContainer::const_iterator recHit=recHits.begin();recHit!=recHits.end();++recHit){         
00106         std::pair<bool,double> diffEst = est.estimate(stateOnThisDet, **recHit);
00107         if ( diffEst.first ) {
00108           result.push_back( TrajectoryMeasurement( stateOnThisDet, *recHit, 
00109                                                    diffEst.second));
00110           isCompatible = true;
00111         }
00112       }
00113       if(!isCompatible) break; // exit loop on first incompatible hit
00114     }
00115   }// end block with DetSet
00116   else{
00117     const_iterator rightCluster = 
00118       std::find_if( beginCluster, endCluster, StripClusterAboveU( utraj));
00119 
00120     if ( rightCluster != beginCluster) {
00121       // there are hits on the left of the utraj
00122       const_iterator leftCluster = rightCluster;
00123       while ( --leftCluster >=  beginCluster) {
00124         if (isMasked(*leftCluster)) continue;
00125         //      TransientTrackingRecHit* recHit = buildRecHit( *leftCluster, 
00126         //std::cout << "=====making ref in fastMeas left " << std::endl;
00127         SiStripRegionalClusterRef clusterref = edm::makeRefToLazyGetter(regionalHandle_,leftCluster-regionalHandle_->begin_record());
00128         //TransientTrackingRecHit::RecHitPointer recHit = buildRecHit(clusterref, 
00129         //                                                          stateOnThisDet);
00130         RecHitContainer recHits = buildRecHits(clusterref,stateOnThisDet); 
00131         bool isCompatible(false);
00132         for(RecHitContainer::const_iterator recHit=recHits.begin();recHit!=recHits.end();++recHit){       
00133           std::pair<bool,double> diffEst = est.estimate(stateOnThisDet, **recHit);
00134           if ( diffEst.first ) {
00135             result.push_back( TrajectoryMeasurement( stateOnThisDet, *recHit, 
00136                                                      diffEst.second));
00137             isCompatible = true;
00138           }
00139         }
00140         if(!isCompatible) break; // exit loop on first incompatible hit
00141       }
00142     }
00143     
00144     for ( ; rightCluster != endCluster; rightCluster++) {
00145       if (isMasked(*rightCluster)) continue;
00146       //std::cout << "=====making ref in fastMeas rigth " << std::endl;
00147       SiStripRegionalClusterRef clusterref = edm::makeRefToLazyGetter(regionalHandle_,rightCluster-regionalHandle_->begin_record());
00148       //TransientTrackingRecHit::RecHitPointer recHit = buildRecHit( clusterref, 
00149       //                                                                   stateOnThisDet);
00150       RecHitContainer recHits = buildRecHits(clusterref,stateOnThisDet); 
00151       bool isCompatible(false);
00152       for(RecHitContainer::const_iterator recHit=recHits.begin();recHit!=recHits.end();++recHit){         
00153         std::pair<bool,double> diffEst = est.estimate(stateOnThisDet, **recHit);
00154         if ( diffEst.first ) {
00155           result.push_back( TrajectoryMeasurement( stateOnThisDet, *recHit, 
00156                                                    diffEst.second));
00157           isCompatible = true;
00158         }
00159       }
00160       if(!isCompatible) break; // exit loop on first incompatible hit
00161     }
00162   }
00163 
00164 
00165   if ( result.empty()) {
00166     // create a TrajectoryMeasurement with an invalid RecHit and zero estimate
00167     if (stateOnThisDet.hasError()){
00168     uerr= sqrt(theStripGDU->specificTopology().measurementError(stateOnThisDet.localPosition(),stateOnThisDet.localError().positionError()).uu());
00169      if (testStrips(utraj,uerr)) {
00170        //LogDebug("TkStripMeasurementDet") << " DetID " << id_ << " empty after search, but active ";
00171        result.push_back( TrajectoryMeasurement( stateOnThisDet, InvalidTransientRecHit::build(&geomDet(), TrackingRecHit::missing), 0.F));
00172      } else { 
00173        //LogDebug("TkStripMeasurementDet") << " DetID " << id_ << " empty after search, and inactive ";
00174        result.push_back( TrajectoryMeasurement( stateOnThisDet, InvalidTransientRecHit::build(&geomDet(), TrackingRecHit::inactive), 0.F));
00175      }
00176     }else{
00177       result.push_back( TrajectoryMeasurement( stateOnThisDet, InvalidTransientRecHit::build(&geomDet(), TrackingRecHit::missing), 0.F));
00178     }
00179   }
00180   else {
00181     //LogDebug("TkStripMeasurementDet") << " DetID " << id_ << " full: " << (result.size()) << " compatible hits";
00182     // sort results according to estimator value
00183     if ( result.size() > 1) {
00184       sort( result.begin(), result.end(), TrajMeasLessEstim());
00185     }
00186   }
00187   return result;
00188 }
00189 
00190 
00191 TransientTrackingRecHit::RecHitPointer
00192 TkStripMeasurementDet::buildRecHit( const SiStripClusterRef& cluster,
00193                                     const TrajectoryStateOnSurface& ltp) const
00194 {
00195   const GeomDetUnit& gdu( specificGeomDet());
00196   LocalValues lv = theCPE->localParameters( *cluster, gdu, ltp);
00197   return TSiStripRecHit2DLocalPos::build( lv.first, lv.second, &geomDet(), cluster, theCPE);
00198 }
00199 
00200 TransientTrackingRecHit::RecHitPointer
00201 TkStripMeasurementDet::buildRecHit( const SiStripRegionalClusterRef& cluster,
00202                                     const TrajectoryStateOnSurface& ltp) const
00203 {
00204   const GeomDetUnit& gdu( specificGeomDet());
00205   LocalValues lv = theCPE->localParameters( *cluster, gdu, ltp);
00206   return TSiStripRecHit2DLocalPos::build( lv.first, lv.second, &geomDet(), cluster, theCPE);
00207 }
00208 
00209 
00210 
00211 TkStripMeasurementDet::RecHitContainer 
00212 TkStripMeasurementDet::buildRecHits( const SiStripClusterRef& cluster,
00213                                      const TrajectoryStateOnSurface& ltp) const
00214 {
00215   const GeomDetUnit& gdu( specificGeomDet());
00216   VLocalValues vlv = theCPE->localParametersV( *cluster, gdu, ltp);
00217   RecHitContainer res;
00218   for(VLocalValues::const_iterator it=vlv.begin();it!=vlv.end();++it){
00219     res.push_back(TSiStripRecHit2DLocalPos::build( it->first, it->second, &geomDet(), cluster, theCPE));
00220   }
00221   return res; 
00222 }
00223 
00224 
00225 TkStripMeasurementDet::RecHitContainer 
00226 TkStripMeasurementDet::buildRecHits( const SiStripRegionalClusterRef& cluster,
00227                                      const TrajectoryStateOnSurface& ltp) const
00228 {
00229   const GeomDetUnit& gdu( specificGeomDet());
00230   VLocalValues vlv = theCPE->localParametersV( *cluster, gdu, ltp);
00231   RecHitContainer res;
00232   for(VLocalValues::const_iterator it=vlv.begin();it!=vlv.end();++it){
00233     res.push_back(TSiStripRecHit2DLocalPos::build( it->first, it->second, &geomDet(), cluster, theCPE));
00234   }
00235   return res; 
00236 }
00237 
00238 
00239 
00240 TkStripMeasurementDet::RecHitContainer 
00241 TkStripMeasurementDet::recHits( const TrajectoryStateOnSurface& ts) const
00242 {
00243   RecHitContainer result;
00244   if (empty == true) return result;
00245   if (isActive() == false) return result; // GIO
00246 
00247   if(!isRegional){//old implemetation with DetSet
00248     result.reserve(detSet_.size());
00249     for ( new_const_iterator ci = detSet_.begin(); ci != detSet_.end(); ++ ci ) {
00250       if (isMasked(*ci)) continue;
00251       // for ( ClusterIterator ci=theClusterRange.first; ci != theClusterRange.second; ci++) {
00252       SiStripClusterRef  cluster = edmNew::makeRefTo( handle_, ci ); 
00253       result.push_back( buildRecHit( cluster, ts));
00254     }
00255   }else{
00256     result.reserve(endCluster - beginCluster);
00257     for (const_iterator ci = beginCluster ; ci != endCluster; ci++) {      
00258       if (isMasked(*ci)) continue;
00259       SiStripRegionalClusterRef clusterRef = edm::makeRefToLazyGetter(regionalHandle_,ci-regionalHandle_->begin_record());     
00260       result.push_back( buildRecHit( clusterRef, ts));
00261     }
00262   }
00263   return result;
00264 
00265 }
00266 
00267 template<class ClusterRefT>
00268 void
00269 TkStripMeasurementDet::buildSimpleRecHit( const ClusterRefT& cluster,
00270                                           const TrajectoryStateOnSurface& ltp,
00271                                           std::vector<SiStripRecHit2D>& res ) const
00272 {
00273   const GeomDetUnit& gdu( specificGeomDet());
00274   VLocalValues vlv = theCPE->localParametersV( *cluster, gdu, ltp);
00275   for(VLocalValues::const_iterator it=vlv.begin();it!=vlv.end();++it){
00276     res.push_back(SiStripRecHit2D( it->first, it->second, geomDet().geographicalId(), cluster));
00277   }
00278 }
00279 
00280 
00281 void 
00282 TkStripMeasurementDet::simpleRecHits( const TrajectoryStateOnSurface& ts, std::vector<SiStripRecHit2D> &result) const
00283 {
00284   if (empty || !isActive()) return;
00285 
00286   if(!isRegional){//old implemetation with DetSet
00287     result.reserve(detSet_.size());
00288     for ( new_const_iterator ci = detSet_.begin(); ci != detSet_.end(); ++ ci ) {
00289       if (isMasked(*ci)) continue;
00290       // for ( ClusterIterator ci=theClusterRange.first; ci != theClusterRange.second; ci++) {
00291       SiStripClusterRef  cluster = edmNew::makeRefTo( handle_, ci ); 
00292       buildSimpleRecHit( cluster, ts,result);
00293     }
00294   }else{
00295     result.reserve(endCluster - beginCluster);
00296     for (const_iterator ci = beginCluster ; ci != endCluster; ci++) {      
00297       if (isMasked(*ci)) continue;
00298       SiStripRegionalClusterRef clusterRef = edm::makeRefToLazyGetter(regionalHandle_,ci-regionalHandle_->begin_record());     
00299       buildSimpleRecHit( clusterRef, ts,result);
00300     }
00301   }
00302 }
00303 
00304 
00305 void
00306 TkStripMeasurementDet::set128StripStatus(bool good, int idx) { 
00307    if (idx == -1) {
00308        std::fill(bad128Strip_, bad128Strip_+6, !good);
00309        hasAny128StripBad_ = !good;
00310    } else {
00311        bad128Strip_[idx] = !good;
00312        if (good == false) {
00313             hasAny128StripBad_ = false;
00314        } else { // this should not happen, as usually you turn on all fibers
00315                 // and then turn off the bad ones, and not vice-versa,
00316                 // so I don't care if it's not optimized
00317             hasAny128StripBad_ = true;
00318             for (int i = 0; i < (totalStrips_ >> 7); i++) {
00319                 if (bad128Strip_[i] == false) hasAny128StripBad_ = false;
00320             }
00321        }    
00322    }
00323     
00324 }
00325 
00326 bool
00327 TkStripMeasurementDet::testStrips(float utraj, float uerr) const {
00328     int16_t start = (int16_t) std::max<float>(utraj - 3*uerr, 0);
00329     int16_t end   = (int16_t) std::min<float>(utraj + 3*uerr, totalStrips_);
00330 
00331     if (start >= end) { // which means either end <=0 or start >= totalStrips_
00332         /* LogDebug("TkStripMeasurementDet") << "Testing module " << id_ <<","<<
00333             " U = " << utraj << " +/- " << uerr << 
00334             "; Range [" << (utraj - 3*uerr) << ", " << (utraj + 3*uerr) << "] " << 
00335             ": YOU'RE COMPLETELY OFF THE MODULE."; */
00336         //return false; 
00337         return true;  // Wolfgang thinks this way is better
00338                       // and solves some problems with grouped ckf
00339     } 
00340 
00341     typedef std::vector<BadStripBlock>::const_iterator BSBIT;
00342     BSBIT bsbc = badStripBlocks_.begin(), bsbe = badStripBlocks_.end();
00343 
00344     int16_t bad = 0, largestBadBlock = 0;
00345     for (BSBIT bsbc = badStripBlocks_.begin(), bsbe = badStripBlocks_.end(); bsbc != bsbe; ++bsbc) {
00346         if (bsbc->last  < start) continue;
00347         if (bsbc->first > end)   break;
00348         int16_t thisBad = std::min(bsbc->last, end) - std::max(bsbc->first, start);
00349         if (thisBad > largestBadBlock) largestBadBlock = thisBad;
00350         bad += thisBad;
00351     }
00352 
00353     bool ok = (bad < (end-start)) && 
00354               (uint16_t(bad) <= badStripCuts_.maxBad) && 
00355               (uint16_t(largestBadBlock) <= badStripCuts_.maxConsecutiveBad);
00356 
00357 //    if (bad) {   
00358 //       edm::LogWarning("TkStripMeasurementDet") << "Testing module " << id_ <<" (subdet: "<< SiStripDetId(id_).subdetId() << ")" <<
00359 //            " U = " << utraj << " +/- " << uerr << 
00360 //            "; Range [" << (utraj - 3*uerr) << ", " << (utraj + 3*uerr) << "] " << 
00361 //            "= [" << start << "," << end << "]" <<
00362 //            " total strips:" << (end-start) << ", good:" << (end-start-bad) << ", bad:" << bad << ", largestBadBlock: " << largestBadBlock << 
00363 //            ". " << (ok ? "OK" : "NO"); 
00364 //    }
00365     return ok;
00366 }
00367