00001 #include "RecoTracker/TkHitPairs/interface/HitPairGeneratorFromLayerPair.h"
00002 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00003
00004 #include "TrackingTools/DetLayers/interface/DetLayer.h"
00005 #include "TrackingTools/DetLayers/interface/BarrelDetLayer.h"
00006 #include "TrackingTools/DetLayers/interface/ForwardDetLayer.h"
00007
00008 #include "RecoTracker/TkTrackingRegions/interface/HitRZCompatibility.h"
00009 #include "RecoTracker/TkTrackingRegions/interface/TrackingRegion.h"
00010 #include "RecoTracker/TkTrackingRegions/interface/TrackingRegionBase.h"
00011 #include "RecoTracker/TkHitPairs/interface/OrderedHitPairs.h"
00012 #include "RecoTracker/TkHitPairs/src/InnerDeltaPhi.h"
00013 #include "RecoTracker/TkHitPairs/interface/LayerHitMapLoop.h"
00014 #include "RecoTracker/TkHitPairs/src/RecHitsSortedInPhi.h"
00015
00016 #include "FWCore/Framework/interface/Event.h"
00017 #include "FWCore/Framework/interface/EventSetup.h"
00018 #include "RecoTracker/TkSeedingLayers/interface/SeedingLayer.h"
00019 #include "RecoTracker/TkSeedingLayers/interface/SeedingHit.h"
00020
00021 using namespace GeomDetEnumerators;
00022 using namespace ctfseeding;
00023 using namespace std;
00024
00025 typedef PixelRecoRange<float> Range;
00026 template <class T> T sqr( T t) {return t*t;}
00027
00028
00029
00030 #include "TrackingTools/TransientTrackingRecHit/interface/TransientTrackingRecHitBuilder.h"
00031 #include "TrackingTools/Records/interface/TransientRecHitRecord.h"
00032 #include "Geometry/TrackerGeometryBuilder/interface/TrackerGeometry.h"
00033 #include "RecoTracker/Record/interface/TrackerRecoGeometryRecord.h"
00034 #include "FWCore/Framework/interface/ESHandle.h"
00035
00036 HitPairGeneratorFromLayerPair::HitPairGeneratorFromLayerPair(
00037 const Layer& inner, const Layer& outer, LayerCacheType* layerCache, unsigned int nSize)
00038 : HitPairGenerator(nSize),
00039 theLayerCache(*layerCache), theOuterLayer(outer), theInnerLayer(inner)
00040 { }
00041
00042 void HitPairGeneratorFromLayerPair::hitPairs(
00043 const TrackingRegion & region, OrderedHitPairs & result,
00044 const edm::Event& iEvent, const edm::EventSetup& iSetup)
00045 {
00046
00047 if (theInnerLayer.detLayer()->subDetector() != PixelBarrel &&
00048 theInnerLayer.detLayer()->location() == barrel ){
00049 hitPairsWithErrors(region,result,iEvent,iSetup);
00050 return;
00051 }
00052
00053 typedef OrderedHitPair::InnerHit InnerHit;
00054 typedef OrderedHitPair::OuterHit OuterHit;
00055
00056 const LayerHitMap & innerHitsMap = theLayerCache(&theInnerLayer, region, iEvent, iSetup);
00057 if (innerHitsMap.empty()) return;
00058
00059 const LayerHitMap & outerHitsMap = theLayerCache(&theOuterLayer, region, iEvent, iSetup);
00060 if (outerHitsMap.empty()) return;
00061
00062 const DetLayer * innerlay = theInnerLayer.detLayer();
00063 const DetLayer * outerlay = theOuterLayer.detLayer();
00064
00065 float outerHitErrorRPhi = (outerlay->location() == barrel) ?
00066 TrackingRegionBase::hitErrRPhi(
00067 dynamic_cast<const BarrelDetLayer*>(outerlay) )
00068 : TrackingRegionBase::hitErrRPhi(
00069 dynamic_cast<const ForwardDetLayer*>(outerlay) ) ;
00070
00071 InnerDeltaPhi deltaPhi(*innerlay, region, iSetup);
00072
00073 float rzLayer1, rzLayer2;
00074 if (innerlay->location() == barrel) {
00075 const BarrelDetLayer& bl =
00076 dynamic_cast<const BarrelDetLayer&>(*innerlay);
00077 float halfThickness = bl.surface().bounds().thickness()/2;
00078 float radius = bl.specificSurface().radius();
00079 rzLayer1 = radius-halfThickness;
00080 rzLayer2 = radius+halfThickness;
00081 }
00082 else {
00083 float halfThickness = innerlay->surface().bounds().thickness()/2;
00084 float zLayer = innerlay->position().z() ;
00085 rzLayer1 = zLayer-halfThickness;
00086 rzLayer2 = zLayer+halfThickness;
00087 }
00088
00089 const SeedingHit * oh;
00090 LayerHitMapLoop outerHits = outerHitsMap.loop();
00091
00092 while ( (oh=outerHits.getHit()) ) {
00093
00094 PixelRecoRange<float> phiRange = deltaPhi( oh->r(), oh->phi(), oh->z(), outerHitErrorRPhi);
00095 if (phiRange.empty()) continue;
00096
00097 const HitRZCompatibility *checkRZ = region.checkRZ(&(*innerlay), *oh, iSetup);
00098 if(!checkRZ) continue;
00099
00100 LayerHitMapLoop innerHits = innerHitsMap.loop(phiRange, Range(-100.,100.));
00101 const SeedingHit * ih;
00102 while ( (ih=innerHits.getHit()) ) {
00103 float ih_x = ih->r() * cos(ih->phi());
00104 float ih_y = ih->r() * sin(ih->phi());
00105 float r_reduced = sqrt( sqr(ih_x-region.origin().x())+sqr(ih_y-region.origin().y()));
00106
00107 if ( (*checkRZ)( r_reduced, ih->z()) ) {
00108 result.push_back( OrderedHitPair( *ih, *oh) );
00109 }
00110 }
00111 delete checkRZ;
00112 }
00113 }
00114
00115
00116 void HitPairGeneratorFromLayerPair::
00117 hitPairsWithErrors( const TrackingRegion& region,
00118 OrderedHitPairs & result,
00119 const edm::Event & iEvent,
00120 const edm::EventSetup& iSetup)
00121 {
00122 const TransientTrackingRecHitBuilder * TTRHbuilder = 0;
00123 const TrackerGeometry * trackerGeometry = 0;
00124
00125 edm::ESHandle<TransientTrackingRecHitBuilder> theBuilderHandle;
00126 iSetup.get<TransientRecHitRecord>().get("WithoutRefit",theBuilderHandle);
00127 TTRHbuilder = theBuilderHandle.product();
00128
00129
00130 edm::ESHandle<TrackerGeometry> tracker;
00131 iSetup.get<TrackerDigiGeometryRecord>().get(tracker);
00132 trackerGeometry = tracker.product();
00133
00134
00135
00136 typedef OrderedHitPair::InnerHit InnerHit;
00137 typedef OrderedHitPair::OuterHit OuterHit;
00138
00139 vector<SeedingHit> oSHits(region.hits(iEvent,iSetup,&theOuterLayer));
00140 vector<const TrackingRecHit*> outerHits;
00141 typedef vector<SeedingHit>::const_iterator ISH;
00142 for (ISH it=oSHits.begin(); it != oSHits.end(); ++it) outerHits.push_back( *it);
00143 vector<SeedingHit> iSHits(theInnerLayer.hits(iEvent,iSetup));
00144 vector<const TrackingRecHit*> innerHits;
00145 for (ISH it=iSHits.begin(); it != iSHits.end(); ++it) innerHits.push_back( *it);
00146 RecHitsSortedInPhi innerSortedHits(innerHits,trackerGeometry);
00147
00148
00149 InnerDeltaPhi deltaPhi(
00150 *(theInnerLayer.detLayer()), region, iSetup);
00151
00152 typedef vector<const TrackingRecHit*>::const_iterator HI;
00153 float nSigmaRZ = sqrt(12.);
00154 float nSigmaPhi = 3.;
00155 for (HI oh=outerHits.begin(); oh!= outerHits.end(); oh++) {
00156 TransientTrackingRecHit::RecHitPointer recHit = TTRHbuilder->build(*oh);
00157 GlobalPoint hitPos = recHit->globalPosition();
00158 float phiErr = nSigmaPhi * sqrt(recHit->globalPositionError().phierr(hitPos));
00159 float dphi = deltaPhi( hitPos.perp(), hitPos.z(), hitPos.perp()*phiErr);
00160 float phiHit = hitPos.phi();
00161
00162 vector<const TrackingRecHit*> innerCandid = innerSortedHits.hits(phiHit-dphi,phiHit+dphi);
00163 const HitRZCompatibility *checkRZ = region.checkRZ(theInnerLayer.detLayer(), *oh,iSetup);
00164 if(!checkRZ) continue;
00165
00166 for (HI ih = innerCandid.begin(); ih != innerCandid.end(); ih++) {
00167 TransientTrackingRecHit::RecHitPointer recHit = TTRHbuilder->build(&(**ih));
00168 GlobalPoint innPos = recHit->globalPosition();
00169 Range allowed = checkRZ->range(innPos.perp());
00170 Range hitRZ;
00171 if (theInnerLayer.detLayer()->location() == barrel) {
00172 float zErr = nSigmaRZ * sqrt(recHit->globalPositionError().czz());
00173 hitRZ = Range(innPos.z()-zErr, innPos.z()+zErr);
00174 } else {
00175 float rErr = nSigmaRZ * sqrt(recHit->globalPositionError().rerr(innPos));
00176 hitRZ = Range(innPos.perp()-rErr, innPos.perp()+rErr);
00177 }
00178 Range crossRange = allowed.intersection(hitRZ);
00179 if (! crossRange.empty() ) {
00180 result.push_back( OrderedHitPair( SeedingHit(*ih,theInnerLayer,iSetup), SeedingHit(*oh,theOuterLayer, iSetup) ) );
00181 }
00182 }
00183 delete checkRZ;
00184 }
00185 }
00186