Go to the documentation of this file.00001 #include "RecoTracker/TkTrackingRegions/interface/GlobalTrackingRegion.h"
00002 #include <cmath>
00003 #include <sstream>
00004 #include "TrackingTools/DetLayers/interface/DetLayer.h"
00005 #include "RecoTracker/TkTrackingRegions/interface/HitEtaCheck.h"
00006 #include "RecoTracker/TkTrackingRegions/interface/HitRCheck.h"
00007 #include "RecoTracker/TkTrackingRegions/interface/HitZCheck.h"
00008
00009 #include "RecoTracker/TkMSParametrization/interface/PixelRecoUtilities.h"
00010 #include "RecoTracker/TkMSParametrization/interface/MultipleScatteringParametrisation.h"
00011 #include "RecoTracker/TkMSParametrization/interface/PixelRecoPointRZ.h"
00012 #include "RecoTracker/TkMSParametrization/interface/PixelRecoLineRZ.h"
00013 #include "Geometry/TrackerGeometryBuilder/interface/TrackerGeometry.h"
00014 #include "Geometry/Records/interface/TrackerDigiGeometryRecord.h"
00015
00016
00017 template <class T> T sqr( T t) {return t*t;}
00018
00019 using namespace GeomDetEnumerators;
00020
00021 std::string GlobalTrackingRegion::print() const {
00022 std::ostringstream str;
00023 str << TrackingRegionBase::print() << "precise: "<<thePrecise;
00024 return str.str();
00025 }
00026
00027 TrackingRegion::Hits GlobalTrackingRegion::hits(
00028 const edm::Event& ev,
00029 const edm::EventSetup& es,
00030 const ctfseeding::SeedingLayer* layer) const
00031 {
00032 return layer->hits(ev,es);
00033 }
00034
00035 HitRZCompatibility* GlobalTrackingRegion::checkRZ(const DetLayer* layer,
00036 const Hit& outerHit, const edm::EventSetup& iSetup) const
00037 {
00038
00039 bool isBarrel = (layer->location() == barrel);
00040 bool isPixel = (layer->subDetector() == PixelBarrel || layer->subDetector() == PixelEndcap);
00041
00042
00043 GlobalPoint ohit = outerHit->globalPosition();
00044 float outerred_r = sqrt( sqr(ohit.x()-origin().x())+sqr(ohit.y()-origin().y()) );
00045 PixelRecoPointRZ outerred(outerred_r, ohit.z());
00046
00047
00048 PixelRecoPointRZ vtxR = (outerred.z() > origin().z()+originZBound()) ?
00049 PixelRecoPointRZ(-originRBound(), origin().z()+originZBound())
00050 : PixelRecoPointRZ( originRBound(), origin().z()+originZBound());
00051 PixelRecoPointRZ vtxL = (outerred.z() < origin().z()-originZBound()) ?
00052 PixelRecoPointRZ(-originRBound(), origin().z()-originZBound())
00053 : PixelRecoPointRZ( originRBound(), origin().z()-originZBound());
00054
00055 if ((!thePrecise) &&(isPixel )) {
00056 double VcotMin = PixelRecoLineRZ( vtxR, outerred).cotLine();
00057 double VcotMax = PixelRecoLineRZ( vtxL, outerred).cotLine();
00058 return new HitEtaCheck(isBarrel, outerred, VcotMax, VcotMin);
00059 }
00060
00061 float nSigmaPhi = 3.;
00062 float errZ = nSigmaPhi*outerHit->errorGlobalZ();
00063 float errR = nSigmaPhi*outerHit->errorGlobalR();
00064
00065 PixelRecoPointRZ outerL, outerR;
00066
00067 if (layer->location() == barrel) {
00068 outerL = PixelRecoPointRZ(outerred.r(), outerred.z()-errZ);
00069 outerR = PixelRecoPointRZ(outerred.r(), outerred.z()+errZ);
00070 }
00071 else if (outerred.z() > 0) {
00072 outerL = PixelRecoPointRZ(outerred.r()+errR, outerred.z());
00073 outerR = PixelRecoPointRZ(outerred.r()-errR, outerred.z());
00074 }
00075 else {
00076 outerL = PixelRecoPointRZ(outerred.r()-errR, outerred.z());
00077 outerR = PixelRecoPointRZ(outerred.r()+errR, outerred.z());
00078 }
00079
00080 MultipleScatteringParametrisation iSigma(layer,iSetup);
00081 PixelRecoPointRZ vtxMean(0.,origin().z());
00082 float innerScatt = 3 * iSigma( ptMin(), vtxMean, outerred);
00083
00084
00085
00086
00087 PixelRecoLineRZ leftLine( vtxL, outerL);
00088 PixelRecoLineRZ rightLine( vtxR, outerR);
00089 HitRZConstraint rzConstraint(leftLine, rightLine);
00090 float cotTheta = PixelRecoLineRZ(vtxMean,outerred).cotLine();
00091
00092 if (isBarrel) {
00093 float sinTheta = 1/sqrt(1+sqr(cotTheta));
00094 float corrZ = innerScatt/sinTheta + errZ;
00095 return new HitZCheck(rzConstraint, HitZCheck::Margin(corrZ,corrZ));
00096 } else {
00097 float cosTheta = 1/sqrt(1+sqr(1/cotTheta));
00098 float corrR = innerScatt/cosTheta + errR;
00099 return new HitRCheck( rzConstraint, HitRCheck::Margin(corrR,corrR));
00100 }
00101 }