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 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;
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;
00114 }
00115 else LogDebug("TkStripMeasurementDet")<<"skipping this str from last iteration on"<<geomDet().geographicalId().rawId()<<" key: "<<clusterref.key();
00116 }
00117 }
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;
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;
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
00170 if (stateOnThisDet.hasError()){
00171 uerr= sqrt(theStripGDU->specificTopology().measurementError(stateOnThisDet.localPosition(),stateOnThisDet.localError().positionError()).uu());
00172 if (testStrips(utraj,uerr)) {
00173
00174 result.push_back( TrajectoryMeasurement( stateOnThisDet, InvalidTransientRecHit::build(&geomDet(), TrackingRecHit::missing), 0.F));
00175 } else {
00176
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
00185
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;
00249
00250 if(!isRegional){
00251 result.reserve(detSet_.size());
00252 for ( new_const_iterator ci = detSet_.begin(); ci != detSet_.end(); ++ ci ) {
00253 if (isMasked(*ci)) continue;
00254
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){
00294 result.reserve(detSet_.size());
00295 for ( new_const_iterator ci = detSet_.begin(); ci != detSet_.end(); ++ ci ) {
00296 if (isMasked(*ci)) continue;
00297
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 {
00326
00327
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) {
00343
00344
00345
00346
00347
00348 return true;
00349
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
00369
00370
00371
00372
00373
00374
00375
00376 return ok;
00377 }
00378