CMS 3D CMS Logo

/afs/cern.ch/work/a/aaltunda/public/www/CMSSW_6_2_7/src/RecoTracker/TkHitPairs/src/HitPairGeneratorFromLayerPair.cc

Go to the documentation of this file.
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 // devirtualizer
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   // std::cout << "layers " << theInnerLayer.detLayer()->seqNum()  << " " << theOuterLayer.detLayer()->seqNum() << std::endl;
00114 
00115   // constexpr float nSigmaRZ = std::sqrt(12.f);
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