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
00014 #include "FWCore/Framework/interface/Event.h"
00015 #include "FWCore/Framework/interface/EventSetup.h"
00016 #include "RecoTracker/TkSeedingLayers/interface/SeedingLayer.h"
00017
00018 using namespace GeomDetEnumerators;
00019 using namespace ctfseeding;
00020 using namespace std;
00021
00022 typedef PixelRecoRange<float> Range;
00023
00024 namespace {
00025 template<class T> inline T sqr( T t) {return t*t;}
00026 }
00027
00028
00029 #include "TrackingTools/TransientTrackingRecHit/interface/TransientTrackingRecHitBuilder.h"
00030 #include "TrackingTools/Records/interface/TransientRecHitRecord.h"
00031 #include "Geometry/TrackerGeometryBuilder/interface/TrackerGeometry.h"
00032 #include "RecoTracker/Record/interface/TrackerRecoGeometryRecord.h"
00033 #include "FWCore/Framework/interface/ESHandle.h"
00034
00035 HitPairGeneratorFromLayerPair::HitPairGeneratorFromLayerPair(
00036 const Layer& inner,
00037 const Layer& outer,
00038 LayerCacheType* layerCache,
00039 unsigned int nSize,
00040 unsigned int max)
00041 : HitPairGenerator(nSize),
00042 theLayerCache(*layerCache), theOuterLayer(outer), theInnerLayer(inner)
00043 {
00044 theMaxElement=max;
00045 }
00046
00047
00048
00049 #include<tuple>
00050 namespace {
00051
00052 template<typename Algo>
00053 struct Kernel {
00054 using Base = HitRZCompatibility;
00055 void set(Base const * a) {
00056 assert( a->algo()==Algo::me);
00057 checkRZ=reinterpret_cast<Algo const *>(a);
00058 }
00059
00060 void operator()(int b, int e, const RecHitsSortedInPhi & innerHitsMap, bool * ok) const {
00061 constexpr float nSigmaRZ = std::sqrt(12.f);
00062 for (int i=b; i!=e; ++i) {
00063 Range allowed = checkRZ->range(innerHitsMap.u[i]);
00064 float vErr = nSigmaRZ * innerHitsMap.dv[i];
00065 Range hitRZ(innerHitsMap.v[i]-vErr, innerHitsMap.v[i]+vErr);
00066 Range crossRange = allowed.intersection(hitRZ);
00067 ok[i-b] = ! crossRange.empty() ;
00068 }
00069 }
00070 Algo const * checkRZ;
00071
00072 };
00073
00074
00075 template<typename ... Args> using Kernels = std::tuple<Kernel<Args>...>;
00076
00077 }
00078
00079
00080
00081 void HitPairGeneratorFromLayerPair::hitPairs(
00082 const TrackingRegion & region, OrderedHitPairs & result,
00083 const edm::Event& iEvent, const edm::EventSetup& iSetup) {
00084
00085 auto const & ds = doublets(region,iEvent,iSetup);
00086 for (std::size_t i=0; i!=ds.size(); ++i) {
00087 result.push_back( OrderedHitPair( ds.hit(i,HitDoublets::inner),ds.hit(i,HitDoublets::outer) ));
00088 }
00089 if (theMaxElement!=0 && result.size() >= theMaxElement){
00090 result.clear();
00091 edm::LogError("TooManyPairs")<<"number of pairs exceed maximum, no pairs produced";
00092 }
00093 }
00094
00095
00096 HitDoublets HitPairGeneratorFromLayerPair::doublets( const TrackingRegion& region,
00097 const edm::Event & iEvent, const edm::EventSetup& iSetup) {
00098
00099 typedef OrderedHitPair::InnerRecHit InnerHit;
00100 typedef OrderedHitPair::OuterRecHit OuterHit;
00101 typedef RecHitsSortedInPhi::Hit Hit;
00102
00103 const RecHitsSortedInPhi & innerHitsMap = theLayerCache(&theInnerLayer, region, iEvent, iSetup);
00104 if (innerHitsMap.empty()) return HitDoublets(innerHitsMap,innerHitsMap);
00105
00106 const RecHitsSortedInPhi& outerHitsMap = theLayerCache(&theOuterLayer, region, iEvent, iSetup);
00107 if (outerHitsMap.empty()) return HitDoublets(innerHitsMap,outerHitsMap);
00108
00109 HitDoublets result(innerHitsMap,outerHitsMap); result.reserve(std::max(innerHitsMap.size(),outerHitsMap.size()));
00110
00111 InnerDeltaPhi deltaPhi(*theOuterLayer.detLayer(), *theInnerLayer.detLayer(), region, iSetup);
00112
00113
00114
00115
00116 constexpr float nSigmaPhi = 3.f;
00117 for (int io = 0; io!=int(outerHitsMap.theHits.size()); ++io) {
00118 Hit const & ohit = outerHitsMap.theHits[io].hit();
00119 PixelRecoRange<float> phiRange = deltaPhi(outerHitsMap.x[io],
00120 outerHitsMap.y[io],
00121 outerHitsMap.z[io],
00122 nSigmaPhi*outerHitsMap.drphi[io]
00123 );
00124
00125 if (phiRange.empty()) continue;
00126
00127 const HitRZCompatibility *checkRZ = region.checkRZ(theInnerLayer.detLayer(), ohit, iSetup,theOuterLayer.detLayer(),
00128 outerHitsMap.rv(io),outerHitsMap.z[io],
00129 outerHitsMap.isBarrel ? outerHitsMap.du[io] : outerHitsMap.dv[io],
00130 outerHitsMap.isBarrel ? outerHitsMap.dv[io] : outerHitsMap.du[io]
00131 );
00132 if(!checkRZ) continue;
00133
00134 Kernels<HitZCheck,HitRCheck,HitEtaCheck> kernels;
00135
00136 auto innerRange = innerHitsMap.doubleRange(phiRange.min(), phiRange.max());
00137 LogDebug("HitPairGeneratorFromLayerPair")<<
00138 "preparing for combination of: "<< innerRange[1]-innerRange[0]+innerRange[3]-innerRange[2]
00139 <<" inner and: "<< outerHitsMap.theHits.size()<<" outter";
00140 for(int j=0; j<3; j+=2) {
00141 auto b = innerRange[j]; auto e=innerRange[j+1];
00142 bool ok[e-b];
00143 switch (checkRZ->algo()) {
00144 case (HitRZCompatibility::zAlgo) :
00145 std::get<0>(kernels).set(checkRZ);
00146 std::get<0>(kernels)(b,e,innerHitsMap, ok);
00147 break;
00148 case (HitRZCompatibility::rAlgo) :
00149 std::get<1>(kernels).set(checkRZ);
00150 std::get<1>(kernels)(b,e,innerHitsMap, ok);
00151 break;
00152 case (HitRZCompatibility::etaAlgo) :
00153 std::get<2>(kernels).set(checkRZ);
00154 std::get<2>(kernels)(b,e,innerHitsMap, ok);
00155 break;
00156 }
00157 for (int i=0; i!=e-b; ++i) {
00158 if (!ok[i]) continue;
00159 if (theMaxElement!=0 && result.size() >= theMaxElement){
00160 result.clear();
00161 edm::LogError("TooManyPairs")<<"number of pairs exceed maximum, no pairs produced";
00162 delete checkRZ;
00163 return result;
00164 }
00165 result.add(b+i,io);
00166 }
00167 }
00168 delete checkRZ;
00169 }
00170 LogDebug("HitPairGeneratorFromLayerPair")<<" total number of pairs provided back: "<<result.size();
00171 return result;
00172 }
00173
00174