diff --git a/RecoLocalTracker/SiStripRecHitConverter/interface/StripCPEfromTrackAngle.h b/RecoLocalTracker/SiStripRecHitConverter/interface/StripCPEfromTrackAngle.h index 13b04123862e0..815243449bb38 100644 --- a/RecoLocalTracker/SiStripRecHitConverter/interface/StripCPEfromTrackAngle.h +++ b/RecoLocalTracker/SiStripRecHitConverter/interface/StripCPEfromTrackAngle.h @@ -20,6 +20,10 @@ class StripCPEfromTrackAngle : public StripCPE //Set to true if we are using the old error parameterization const bool useLegacyError; + //Clusters with charge/path > this cut will use old error parameterization + // (overridden by useLegacyError; negative value disables the cut) + const float maxChgOneMIP; + public: StripClusterParameterEstimator::LocalValues localParameters( const SiStripCluster&, const GeomDetUnit&, const LocalTrajectoryParameters&) const; @@ -36,6 +40,7 @@ class StripCPEfromTrackAngle : public StripCPE const SiStripLatency& latency) : StripCPE(conf, mag, geom, lorentz, backPlaneCorrection, confObj, latency ) , useLegacyError(conf.existsAs("useLegacyError") ? conf.getParameter("useLegacyError") : true) + , maxChgOneMIP(conf.existsAs("maxChgOneMIP") ? conf.getParameter("maxChgOneMIP") : -6000.) { mLC_P[0] = conf.existsAs("mLC_P0") ? conf.getParameter("mLC_P0") : -.326; mLC_P[1] = conf.existsAs("mLC_P1") ? conf.getParameter("mLC_P1") : .618; diff --git a/RecoLocalTracker/SiStripRecHitConverter/python/StripCPEfromTrackAngle_cfi.py b/RecoLocalTracker/SiStripRecHitConverter/python/StripCPEfromTrackAngle_cfi.py index cada6cf223584..ccad7ddc914a6 100644 --- a/RecoLocalTracker/SiStripRecHitConverter/python/StripCPEfromTrackAngle_cfi.py +++ b/RecoLocalTracker/SiStripRecHitConverter/python/StripCPEfromTrackAngle_cfi.py @@ -17,4 +17,5 @@ mTEC_P0 = cms.double(-1.885), mTEC_P1 = cms.double( .471), useLegacyError = cms.bool(True), + maxChgOneMIP = cms.double(-6000.) ) diff --git a/RecoLocalTracker/SiStripRecHitConverter/src/StripCPEfromTrackAngle.cc b/RecoLocalTracker/SiStripRecHitConverter/src/StripCPEfromTrackAngle.cc index 64bacb51ea5bb..7d37145e6c4cf 100644 --- a/RecoLocalTracker/SiStripRecHitConverter/src/StripCPEfromTrackAngle.cc +++ b/RecoLocalTracker/SiStripRecHitConverter/src/StripCPEfromTrackAngle.cc @@ -1,5 +1,6 @@ #include "RecoLocalTracker/SiStripRecHitConverter/interface/StripCPEfromTrackAngle.h" #include "Geometry/CommonTopologies/interface/StripTopology.h" +#include "DataFormats/SiStripCluster/interface/SiStripClusterTools.h" #include "vdt/vdtMath.h" @@ -38,7 +39,15 @@ localParameters( const SiStripCluster& cluster, const GeomDetUnit& det, const Lo const unsigned N = cluster.amplitudes().size(); const float fullProjection = p.coveredStrips( track+p.drift, ltp.position()); - const float uerr2 = useLegacyError || cluster.isMerged() ? legacyStripErrorSquared(N,std::abs(fullProjection)) : stripErrorSquared( N, std::abs(fullProjection),ssdid.subDetector() ); + float uerr2; + if (useLegacyError) { + uerr2 = legacyStripErrorSquared(N,std::abs(fullProjection)); + } else if (maxChgOneMIP < 0.0) { + uerr2 = cluster.isMerged() ? legacyStripErrorSquared(N,std::abs(fullProjection)) : stripErrorSquared( N, std::abs(fullProjection),ssdid.subDetector() ); + } else { + float dQdx = siStripClusterTools::chargePerCM(ssdid, cluster, ltp); + uerr2 = dQdx > maxChgOneMIP ? legacyStripErrorSquared(N,std::abs(fullProjection)) : stripErrorSquared( N, std::abs(fullProjection),ssdid.subDetector() ); + } const float strip = cluster.barycenter() - 0.5f*(1.f-p.backplanecorrection) * fullProjection + 0.5f*p.coveredStrips(track, ltp.position());