CMS 3D CMS Logo

/data/doxygen/doxygen-1.7.3/gen/CMSSW_4_2_8/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         if (accept(clusterref)){
00083         RecHitContainer recHits = buildRecHits(clusterref,stateOnThisDet); 
00084         bool isCompatible(false);
00085         for(RecHitContainer::const_iterator recHit=recHits.begin();recHit!=recHits.end();++recHit){       
00086           std::pair<bool,double> diffEst = est.estimate(stateOnThisDet, **recHit);
00087           if ( diffEst.first ) {
00088             result.push_back( TrajectoryMeasurement( stateOnThisDet, *recHit, 
00089                                                      diffEst.second));
00090             isCompatible = true;
00091           }
00092         }
00093         if(!isCompatible) break; // exit loop on first incompatible hit
00094         }
00095         else LogDebug("TkStripMeasurementDet")<<"skipping this str from last iteration on"<<geomDet().geographicalId().rawId()<<" key: "<<clusterref.key();
00096       }
00097     }
00098     
00099     for ( ; rightCluster != detSet_.end(); rightCluster++) {
00100       if (isMasked(*rightCluster)) continue;
00101       SiStripClusterRef clusterref = edmNew::makeRefTo( handle_, rightCluster ); 
00102       if (accept(clusterref)){
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       else LogDebug("TkStripMeasurementDet")<<"skipping this str from last iteration on"<<geomDet().geographicalId().rawId()<<" key: "<<clusterref.key();
00116     }
00117   }// end block with DetSet
00118   else{
00119     result.reserve(size());
00120     uint rightCluster = beginClusterI_;
00121     for (; rightCluster!= endClusterI_;++rightCluster){
00122       SiStripRegionalClusterRef clusterref = edm::makeRefToLazyGetter(regionalHandle_,rightCluster);
00123       if (clusterref->barycenter() > utraj) break;
00124     }
00125 
00126     uint leftCluster = 1;
00127     for (uint iReadBackWard=1; iReadBackWard<=(rightCluster-beginClusterI_) ; ++iReadBackWard){
00128         leftCluster=rightCluster-iReadBackWard;
00129         SiStripRegionalClusterRef clusterref = edm::makeRefToLazyGetter(regionalHandle_,leftCluster);
00130         if (isMasked(*clusterref)) continue;
00131         if (accept(clusterref)){
00132         RecHitContainer recHits = buildRecHits(clusterref,stateOnThisDet); 
00133         bool isCompatible(false);
00134         for(RecHitContainer::const_iterator recHit=recHits.begin();recHit!=recHits.end();++recHit){       
00135           std::pair<bool,double> diffEst = est.estimate(stateOnThisDet, **recHit);
00136           if ( diffEst.first ) {
00137             result.push_back( TrajectoryMeasurement( stateOnThisDet, *recHit, 
00138                                                      diffEst.second));
00139             isCompatible = true;
00140           }
00141         }
00142         if(!isCompatible) break; // exit loop on first incompatible hit
00143         }
00144         else LogDebug("TkStripMeasurementDet")<<"skipping this reg str from last iteration on"<<geomDet().geographicalId().rawId()<<" key: "<<clusterref.key();
00145     }
00146     
00147     for ( ; rightCluster != endClusterI_; ++rightCluster) {
00148       SiStripRegionalClusterRef clusterref = edm::makeRefToLazyGetter(regionalHandle_,rightCluster);
00149       if (isMasked(*clusterref)) continue;
00150       if (accept(clusterref)){
00151       RecHitContainer recHits = buildRecHits(clusterref,stateOnThisDet); 
00152       bool isCompatible(false);
00153       for(RecHitContainer::const_iterator recHit=recHits.begin();recHit!=recHits.end();++recHit){         
00154         std::pair<bool,double> diffEst = est.estimate(stateOnThisDet, **recHit);
00155         if ( diffEst.first ) {
00156           result.push_back( TrajectoryMeasurement( stateOnThisDet, *recHit, 
00157                                                    diffEst.second));
00158           isCompatible = true;
00159         }
00160       }
00161       if(!isCompatible) break; // exit loop on first incompatible hit
00162       }
00163       else LogDebug("TkStripMeasurementDet")<<"skipping this reg str from last iteration on"<<geomDet().geographicalId().rawId()<<" key: "<<clusterref.key();
00164     }
00165   }
00166 
00167 
00168   if ( result.empty()) {
00169     // create a TrajectoryMeasurement with an invalid RecHit and zero estimate
00170     if (stateOnThisDet.hasError()){
00171     uerr= sqrt(theStripGDU->specificTopology().measurementError(stateOnThisDet.localPosition(),stateOnThisDet.localError().positionError()).uu());
00172      if (testStrips(utraj,uerr)) {
00173        //LogDebug("TkStripMeasurementDet") << " DetID " << id_ << " empty after search, but active ";
00174        result.push_back( TrajectoryMeasurement( stateOnThisDet, InvalidTransientRecHit::build(&geomDet(), TrackingRecHit::missing), 0.F));
00175      } else { 
00176        //LogDebug("TkStripMeasurementDet") << " DetID " << id_ << " empty after search, and inactive ";
00177        result.push_back( TrajectoryMeasurement( stateOnThisDet, InvalidTransientRecHit::build(&geomDet(), TrackingRecHit::inactive), 0.F));
00178      }
00179     }else{
00180       result.push_back( TrajectoryMeasurement( stateOnThisDet, InvalidTransientRecHit::build(&geomDet(), TrackingRecHit::missing), 0.F));
00181     }
00182   }
00183   else {
00184     //LogDebug("TkStripMeasurementDet") << " DetID " << id_ << " full: " << (result.size()) << " compatible hits";
00185     // sort results according to estimator value
00186     if ( result.size() > 1) {
00187       sort( result.begin(), result.end(), TrajMeasLessEstim());
00188     }
00189   }
00190   return result;
00191 }
00192 
00193 
00194 TransientTrackingRecHit::RecHitPointer
00195 TkStripMeasurementDet::buildRecHit( const SiStripClusterRef& cluster,
00196                                     const TrajectoryStateOnSurface& ltp) const
00197 {
00198   const GeomDetUnit& gdu( specificGeomDet());
00199   LocalValues lv = theCPE->localParameters( *cluster, gdu, ltp);
00200   return TSiStripRecHit2DLocalPos::build( lv.first, lv.second, &geomDet(), cluster, theCPE);
00201 }
00202 
00203 TransientTrackingRecHit::RecHitPointer
00204 TkStripMeasurementDet::buildRecHit( const SiStripRegionalClusterRef& cluster,
00205                                     const TrajectoryStateOnSurface& ltp) const
00206 {
00207   const GeomDetUnit& gdu( specificGeomDet());
00208   LocalValues lv = theCPE->localParameters( *cluster, gdu, ltp);
00209   return TSiStripRecHit2DLocalPos::build( lv.first, lv.second, &geomDet(), cluster, theCPE);
00210 }
00211 
00212 
00213 
00214 TkStripMeasurementDet::RecHitContainer 
00215 TkStripMeasurementDet::buildRecHits( const SiStripClusterRef& cluster,
00216                                      const TrajectoryStateOnSurface& ltp) const
00217 {
00218   const GeomDetUnit& gdu( specificGeomDet());
00219   VLocalValues vlv = theCPE->localParametersV( *cluster, gdu, ltp);
00220   RecHitContainer res;
00221   for(VLocalValues::const_iterator it=vlv.begin();it!=vlv.end();++it){
00222     res.push_back(TSiStripRecHit2DLocalPos::build( it->first, it->second, &geomDet(), cluster, theCPE));
00223   }
00224   return res; 
00225 }
00226 
00227 
00228 TkStripMeasurementDet::RecHitContainer 
00229 TkStripMeasurementDet::buildRecHits( const SiStripRegionalClusterRef& cluster,
00230                                      const TrajectoryStateOnSurface& ltp) const
00231 {
00232   const GeomDetUnit& gdu( specificGeomDet());
00233   VLocalValues vlv = theCPE->localParametersV( *cluster, gdu, ltp);
00234   RecHitContainer res;
00235   for(VLocalValues::const_iterator it=vlv.begin();it!=vlv.end();++it){
00236     res.push_back(TSiStripRecHit2DLocalPos::build( it->first, it->second, &geomDet(), cluster, theCPE));
00237   }
00238   return res; 
00239 }
00240 
00241 
00242 
00243 TkStripMeasurementDet::RecHitContainer 
00244 TkStripMeasurementDet::recHits( const TrajectoryStateOnSurface& ts) const
00245 {
00246   RecHitContainer result;
00247   if (empty == true) return result;
00248   if (isActive() == false) return result; // GIO
00249 
00250   if(!isRegional){//old implemetation with DetSet
00251     result.reserve(detSet_.size());
00252     for ( new_const_iterator ci = detSet_.begin(); ci != detSet_.end(); ++ ci ) {
00253       if (isMasked(*ci)) continue;
00254       // for ( ClusterIterator ci=theClusterRange.first; ci != theClusterRange.second; ci++) {
00255       SiStripClusterRef  cluster = edmNew::makeRefTo( handle_, ci ); 
00256       if (accept(cluster))
00257         result.push_back( buildRecHit( cluster, ts));
00258       else LogDebug("TkStripMeasurementDet")<<"skipping this str from last iteration on"<<geomDet().geographicalId().rawId()<<" key: "<<cluster.key();
00259     }
00260   }else{
00261     result.reserve(size());
00262     for (uint ci = beginClusterI_ ; ci!= endClusterI_;++ci){
00263       SiStripRegionalClusterRef clusterRef = edm::makeRefToLazyGetter(regionalHandle_,ci);
00264       if (isMasked(*clusterRef)) continue;
00265       if (accept(clusterRef))
00266         result.push_back( buildRecHit( clusterRef, ts));
00267       else LogDebug("TkStripMeasurementDet")<<"skipping this reg str from last iteration on"<<geomDet().geographicalId().rawId()<<" key: "<<clusterRef.key();
00268       }
00269   }
00270   return result;
00271 
00272 }
00273 
00274 template<class ClusterRefT>
00275 void
00276 TkStripMeasurementDet::buildSimpleRecHit( const ClusterRefT& cluster,
00277                                           const TrajectoryStateOnSurface& ltp,
00278                                           std::vector<SiStripRecHit2D>& res ) const
00279 {
00280   const GeomDetUnit& gdu( specificGeomDet());
00281   VLocalValues vlv = theCPE->localParametersV( *cluster, gdu, ltp);
00282   for(VLocalValues::const_iterator it=vlv.begin();it!=vlv.end();++it){
00283     res.push_back(SiStripRecHit2D( it->first, it->second, geomDet().geographicalId(), cluster));
00284   }
00285 }
00286 
00287 
00288 void 
00289 TkStripMeasurementDet::simpleRecHits( const TrajectoryStateOnSurface& ts, std::vector<SiStripRecHit2D> &result) const
00290 {
00291   if (empty || !isActive()) return;
00292 
00293   if(!isRegional){//old implemetation with DetSet
00294     result.reserve(detSet_.size());
00295     for ( new_const_iterator ci = detSet_.begin(); ci != detSet_.end(); ++ ci ) {
00296       if (isMasked(*ci)) continue;
00297       // for ( ClusterIterator ci=theClusterRange.first; ci != theClusterRange.second; ci++) {
00298       SiStripClusterRef  cluster = edmNew::makeRefTo( handle_, ci ); 
00299       if (accept(cluster))
00300         buildSimpleRecHit( cluster, ts,result);
00301       else LogDebug("TkStripMeasurementDet")<<"skipping this str from last iteration on"<<geomDet().geographicalId().rawId()<<" key: "<<cluster.key();
00302     }
00303   }else{
00304     result.reserve(size());
00305     for (uint ci = beginClusterI_ ; ci!= endClusterI_;++ci){
00306       SiStripRegionalClusterRef clusterRef = edm::makeRefToLazyGetter(regionalHandle_,ci);
00307       if (isMasked(*clusterRef)) continue;
00308       if (accept(clusterRef))
00309         buildSimpleRecHit( clusterRef, ts,result);
00310       else LogDebug("TkStripMeasurementDet")<<"skipping this reg str from last iteration on"<<geomDet().geographicalId().rawId()<<" key: "<<clusterRef.key();
00311     }
00312   }
00313 }
00314 
00315 
00316 void
00317 TkStripMeasurementDet::set128StripStatus(bool good, int idx) { 
00318    if (idx == -1) {
00319        std::fill(bad128Strip_, bad128Strip_+6, !good);
00320        hasAny128StripBad_ = !good;
00321    } else {
00322        bad128Strip_[idx] = !good;
00323        if (good == false) {
00324             hasAny128StripBad_ = false;
00325        } else { // this should not happen, as usually you turn on all fibers
00326                 // and then turn off the bad ones, and not vice-versa,
00327                 // so I don't care if it's not optimized
00328             hasAny128StripBad_ = true;
00329             for (int i = 0; i < (totalStrips_ >> 7); i++) {
00330                 if (bad128Strip_[i] == false) hasAny128StripBad_ = false;
00331             }
00332        }    
00333    }
00334     
00335 }
00336 
00337 bool
00338 TkStripMeasurementDet::testStrips(float utraj, float uerr) const {
00339     int16_t start = (int16_t) std::max<float>(utraj - 3*uerr, 0);
00340     int16_t end   = (int16_t) std::min<float>(utraj + 3*uerr, totalStrips_);
00341 
00342     if (start >= end) { // which means either end <=0 or start >= totalStrips_
00343         /* LogDebug("TkStripMeasurementDet") << "Testing module " << id_ <<","<<
00344             " U = " << utraj << " +/- " << uerr << 
00345             "; Range [" << (utraj - 3*uerr) << ", " << (utraj + 3*uerr) << "] " << 
00346             ": YOU'RE COMPLETELY OFF THE MODULE."; */
00347         //return false; 
00348         return true;  // Wolfgang thinks this way is better
00349                       // and solves some problems with grouped ckf
00350     } 
00351 
00352     typedef std::vector<BadStripBlock>::const_iterator BSBIT;
00353     BSBIT bsbc = badStripBlocks_.begin(), bsbe = badStripBlocks_.end();
00354 
00355     int16_t bad = 0, largestBadBlock = 0;
00356     for (BSBIT bsbc = badStripBlocks_.begin(), bsbe = badStripBlocks_.end(); bsbc != bsbe; ++bsbc) {
00357         if (bsbc->last  < start) continue;
00358         if (bsbc->first > end)   break;
00359         int16_t thisBad = std::min(bsbc->last, end) - std::max(bsbc->first, start);
00360         if (thisBad > largestBadBlock) largestBadBlock = thisBad;
00361         bad += thisBad;
00362     }
00363 
00364     bool ok = (bad < (end-start)) && 
00365               (uint16_t(bad) <= badStripCuts_.maxBad) && 
00366               (uint16_t(largestBadBlock) <= badStripCuts_.maxConsecutiveBad);
00367 
00368 //    if (bad) {   
00369 //       edm::LogWarning("TkStripMeasurementDet") << "Testing module " << id_ <<" (subdet: "<< SiStripDetId(id_).subdetId() << ")" <<
00370 //            " U = " << utraj << " +/- " << uerr << 
00371 //            "; Range [" << (utraj - 3*uerr) << ", " << (utraj + 3*uerr) << "] " << 
00372 //            "= [" << start << "," << end << "]" <<
00373 //            " total strips:" << (end-start) << ", good:" << (end-start-bad) << ", bad:" << bad << ", largestBadBlock: " << largestBadBlock << 
00374 //            ". " << (ok ? "OK" : "NO"); 
00375 //    }
00376     return ok;
00377 }
00378