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
00032 id_ = gdet->geographicalId().rawId();
00033
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
00051 return result;
00052 }
00053
00054 float utraj = theStripGDU->specificTopology().measurementPosition( stateOnThisDet.localPosition()).x();
00055 float uerr;
00056
00057 if (empty == true){
00058
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){
00073 new_const_iterator rightCluster =
00074 std::find_if( detSet_.begin(), detSet_.end(), StripClusterAboveU( utraj));
00075
00076 if ( rightCluster != detSet_.begin()) {
00077
00078 new_const_iterator leftCluster = rightCluster;
00079 while ( --leftCluster >= detSet_.begin()) {
00080 if (isMasked(*leftCluster)) continue;
00081 SiStripClusterRef clusterref = edmNew::makeRefTo( handle_, leftCluster );
00082
00083
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;
00095 }
00096 }
00097
00098 for ( ; rightCluster != detSet_.end(); rightCluster++) {
00099 if (isMasked(*rightCluster)) continue;
00100 SiStripClusterRef clusterref = edmNew::makeRefTo( handle_, rightCluster );
00101
00102
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;
00114 }
00115 }
00116 else{
00117 const_iterator rightCluster =
00118 std::find_if( beginCluster, endCluster, StripClusterAboveU( utraj));
00119
00120 if ( rightCluster != beginCluster) {
00121
00122 const_iterator leftCluster = rightCluster;
00123 while ( --leftCluster >= beginCluster) {
00124 if (isMasked(*leftCluster)) continue;
00125
00126
00127 SiStripRegionalClusterRef clusterref = edm::makeRefToLazyGetter(regionalHandle_,leftCluster-regionalHandle_->begin_record());
00128
00129
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;
00141 }
00142 }
00143
00144 for ( ; rightCluster != endCluster; rightCluster++) {
00145 if (isMasked(*rightCluster)) continue;
00146
00147 SiStripRegionalClusterRef clusterref = edm::makeRefToLazyGetter(regionalHandle_,rightCluster-regionalHandle_->begin_record());
00148
00149
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;
00161 }
00162 }
00163
00164
00165 if ( result.empty()) {
00166
00167 if (stateOnThisDet.hasError()){
00168 uerr= sqrt(theStripGDU->specificTopology().measurementError(stateOnThisDet.localPosition(),stateOnThisDet.localError().positionError()).uu());
00169 if (testStrips(utraj,uerr)) {
00170
00171 result.push_back( TrajectoryMeasurement( stateOnThisDet, InvalidTransientRecHit::build(&geomDet(), TrackingRecHit::missing), 0.F));
00172 } else {
00173
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
00182
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;
00246
00247 if(!isRegional){
00248 result.reserve(detSet_.size());
00249 for ( new_const_iterator ci = detSet_.begin(); ci != detSet_.end(); ++ ci ) {
00250 if (isMasked(*ci)) continue;
00251
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){
00287 result.reserve(detSet_.size());
00288 for ( new_const_iterator ci = detSet_.begin(); ci != detSet_.end(); ++ ci ) {
00289 if (isMasked(*ci)) continue;
00290
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 {
00315
00316
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) {
00332
00333
00334
00335
00336
00337 return true;
00338
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
00358
00359
00360
00361
00362
00363
00364
00365 return ok;
00366 }
00367