diff --git a/FastSimulation/Tracking/plugins/BuildFile.xml b/FastSimulation/Tracking/plugins/BuildFile.xml index da4d566f8b313..d5512cbdec418 100644 --- a/FastSimulation/Tracking/plugins/BuildFile.xml +++ b/FastSimulation/Tracking/plugins/BuildFile.xml @@ -18,6 +18,7 @@ + @@ -25,6 +26,7 @@ + diff --git a/FastSimulation/Tracking/plugins/TrajectorySeedProducer.cc b/FastSimulation/Tracking/plugins/TrajectorySeedProducer.cc index c0b1b95578a60..ed07cb9ff4b5d 100644 --- a/FastSimulation/Tracking/plugins/TrajectorySeedProducer.cc +++ b/FastSimulation/Tracking/plugins/TrajectorySeedProducer.cc @@ -49,7 +49,10 @@ #include "RecoTracker/Record/interface/CkfComponentsRecord.h" #include "RecoTracker/TkHitPairs/interface/HitPairGeneratorFromLayerPair.h" #include "RecoTracker/TkHitPairs/interface/RecHitsSortedInPhi.h" - +#include "RecoPixelVertexing/PixelTriplets/interface/HitTripletGeneratorFromPairAndLayers.h" +#include "RecoPixelVertexing/PixelTriplets/interface/HitTripletGeneratorFromPairAndLayersFactory.h" +#include "RecoTracker/TkSeedGenerator/interface/MultiHitGeneratorFromPairAndLayers.h" +#include "RecoTracker/TkSeedGenerator/interface/MultiHitGeneratorFromPairAndLayersFactory.h" // geometry #include "Geometry/Records/interface/TrackerTopologyRcd.h" @@ -80,21 +83,33 @@ class TrajectorySeedProducer bool skipSeedFinderSelector; + std::unique_ptr pixelTripletGenerator; + std::unique_ptr MultiHitGenerator; public: - TrajectorySeedProducer(const edm::ParameterSet& conf); virtual void produce(edm::Event& e, const edm::EventSetup& es); }; + template class SeedingTree; template class SeedingNode; TrajectorySeedProducer::TrajectorySeedProducer(const edm::ParameterSet& conf) { - - // produces + if(conf.exists("pixelTripletGeneratorFactory")) + { + const edm::ParameterSet & tripletConfig = conf.getParameter("pixelTripletGeneratorFactory"); + auto iC = consumesCollector(); + pixelTripletGenerator.reset(HitTripletGeneratorFromPairAndLayersFactory::get()->create(tripletConfig.getParameter("ComponentName"),tripletConfig,iC)); + } + if(conf.exists("MultiHitGeneratorFactory")) + { + const edm::ParameterSet & tripletConfig = conf.getParameter("MultiHitGeneratorFactory"); + //auto iC = consumesCollector(); + MultiHitGenerator.reset(MultiHitGeneratorFromPairAndLayersFactory::get()->create(tripletConfig.getParameter("ComponentName"),tripletConfig)); + } produces(); // consumes @@ -173,51 +188,66 @@ void TrajectorySeedProducer::produce(edm::Event& e, const edm::EventSetup& es) return; } - // pointer to selected region + // pointers for selector function TrackingRegion * selectedTrackingRegion = 0; + auto pixelTripletGeneratorPtr = pixelTripletGenerator.get(); + auto MultiHitGeneratorPtr = MultiHitGenerator.get(); + if(MultiHitGenerator) + { + MultiHitGenerator->initES(es); + } + std::unique_ptr hitDoublets; // define a lambda function // to select hit pairs, triplets, ... compatible with the region - SeedFinder::Selector selectorFunction = [&es,&measurementTracker,&selectedTrackingRegion](const std::vector& hits) -> bool + SeedFinder::Selector selectorFunction = [&es,&measurementTracker,&selectedTrackingRegion,&pixelTripletGeneratorPtr,&MultiHitGeneratorPtr,&hitDoublets](const std::vector& hits) mutable -> bool { // criteria for hit pairs // based on HitPairGeneratorFromLayerPair::doublets( const TrackingRegion& region, const edm::Event & iEvent, const edm::EventSetup& iSetup, Layers layers) - if (hits.size()==2) + if(hits.size()==2) { - const FastTrackerRecHit * innerHit = hits[0]; - const FastTrackerRecHit * outerHit = hits[1]; + const FastTrackerRecHit * firstHit = hits[0]; + const FastTrackerRecHit * secondHit = hits[1]; - const DetLayer * innerLayer = measurementTracker->geometricSearchTracker()->detLayer(innerHit->det()->geographicalId()); - const DetLayer * outerLayer = measurementTracker->geometricSearchTracker()->detLayer(outerHit->det()->geographicalId()); + const DetLayer * firstLayer = measurementTracker->geometricSearchTracker()->detLayer(firstHit->det()->geographicalId()); + const DetLayer * secondLayer = measurementTracker->geometricSearchTracker()->detLayer(secondHit->det()->geographicalId()); - std::vector innerHits(1,(const BaseTrackerRecHit*) innerHit->hit()); - std::vector outerHits(1,(const BaseTrackerRecHit*) outerHit->hit()); - - const RecHitsSortedInPhi* ihm=new RecHitsSortedInPhi (innerHits, selectedTrackingRegion->origin(), innerLayer); - const RecHitsSortedInPhi* ohm=new RecHitsSortedInPhi (outerHits, selectedTrackingRegion->origin(), outerLayer); - - HitDoublets result(*ihm,*ohm); - HitPairGeneratorFromLayerPair::doublets(*selectedTrackingRegion,*innerLayer,*outerLayer,*ihm,*ohm,es,0,result); - - if(result.size()!=0) - { - return true; - } - else - { - return false; - } + std::vector firstHits(1,(const BaseTrackerRecHit*) firstHit->hit()); + std::vector secondHits(1,(const BaseTrackerRecHit*) secondHit->hit()); + + const RecHitsSortedInPhi* fhm=new RecHitsSortedInPhi (firstHits, selectedTrackingRegion->origin(), firstLayer); + const RecHitsSortedInPhi* shm=new RecHitsSortedInPhi (secondHits, selectedTrackingRegion->origin(), secondLayer); + hitDoublets.reset(new HitDoublets(*fhm,*shm)); + HitPairGeneratorFromLayerPair::doublets(*selectedTrackingRegion,*firstLayer,*secondLayer,*fhm,*shm,es,0,*hitDoublets); + return hitDoublets->size()!=0; } - else - { - // no criteria for hit combinations that are not pairs + else if((pixelTripletGeneratorPtr||MultiHitGeneratorPtr)&& hits.size()==3 && hitDoublets->size()!=0) + { + + const FastTrackerRecHit * thirdHit = hits[2]; + const DetLayer * thirdLayer = measurementTracker->geometricSearchTracker()->detLayer(thirdHit->det()->geographicalId()); + std::vector thirdLayerDetLayer(1,thirdLayer); + std::vector thirdHits(1,(const BaseTrackerRecHit*) thirdHit->hit()); + const RecHitsSortedInPhi* thm=new RecHitsSortedInPhi (thirdHits, selectedTrackingRegion->origin(), thirdLayer); + if(pixelTripletGeneratorPtr){ + OrderedHitTriplets Tripletresult; + pixelTripletGeneratorPtr->hitTriplets(*selectedTrackingRegion,Tripletresult,es,*hitDoublets,&thm,thirdLayerDetLayer,1); + return Tripletresult.size()!=0; + } + if(MultiHitGeneratorPtr){ + OrderedMultiHits Tripletresult; + MultiHitGeneratorPtr->hitTriplets(*selectedTrackingRegion,Tripletresult,es,*hitDoublets,&thm,thirdLayerDetLayer,1); + return Tripletresult.size()!=0; + } return true; } + + return true; }; - + if(skipSeedFinderSelector) - { + { selectedTrackingRegion = regions[0].get(); selectorFunction = [](const std::vector& hits) -> bool { diff --git a/FastSimulation/Tracking/python/DetachedTripletStep_cff.py b/FastSimulation/Tracking/python/DetachedTripletStep_cff.py index 88bfead09e6b8..e397fc6c6e494 100644 --- a/FastSimulation/Tracking/python/DetachedTripletStep_cff.py +++ b/FastSimulation/Tracking/python/DetachedTripletStep_cff.py @@ -13,15 +13,17 @@ minLayersCrossed = 3, layerList = _detachedTripletStep.detachedTripletStepSeedLayers.layerList.value(), RegionFactoryPSet = _detachedTripletStep.detachedTripletStepSeeds.RegionFactoryPSet, - hitMasks = cms.InputTag("detachedTripletStepMasks"), + pixelTripletGeneratorFactory = _detachedTripletStep.detachedTripletStepSeeds.OrderedHitsFactoryPSet.GeneratorPSet, + hitMasks = cms.InputTag("detachedTripletStepMasks") ) +#del detachedTripletStepSeeds.pixelTripletGeneratorFactory.SeedComparitorPSet # track candidates import FastSimulation.Tracking.TrackCandidateProducer_cfi detachedTripletStepTrackCandidates = FastSimulation.Tracking.TrackCandidateProducer_cfi.trackCandidateProducer.clone( src = cms.InputTag("detachedTripletStepSeeds"), MinNumberOfCrossedLayers = 3, - hitMasks = cms.InputTag("detachedTripletStepMasks"), + hitMasks = cms.InputTag("detachedTripletStepMasks") ) # tracks diff --git a/FastSimulation/Tracking/python/InitialStep_cff.py b/FastSimulation/Tracking/python/InitialStep_cff.py index 7c878df5613bc..f241dbfad9748 100644 --- a/FastSimulation/Tracking/python/InitialStep_cff.py +++ b/FastSimulation/Tracking/python/InitialStep_cff.py @@ -9,9 +9,10 @@ minLayersCrossed = 3, layerList = RecoTracker.IterativeTracking.InitialStep_cff.initialStepSeedLayers.layerList.value(), RegionFactoryPSet = RecoTracker.IterativeTracking.InitialStep_cff.initialStepSeeds.RegionFactoryPSet, - MeasurementTrackerEvent = cms.InputTag("MeasurementTrackerEvent") + MeasurementTrackerEvent = cms.InputTag("MeasurementTrackerEvent"), + pixelTripletGeneratorFactory = RecoTracker.IterativeTracking.InitialStep_cff.initialStepSeeds.OrderedHitsFactoryPSet.GeneratorPSet, ) - +initialStepSeeds.pixelTripletGeneratorFactory.SeedComparitorPSet=cms.PSet( ComponentName = cms.string( "none" ) ) # track candidates import FastSimulation.Tracking.TrackCandidateProducer_cfi initialStepTrackCandidates = FastSimulation.Tracking.TrackCandidateProducer_cfi.trackCandidateProducer.clone( diff --git a/FastSimulation/Tracking/python/LowPtTripletStep_cff.py b/FastSimulation/Tracking/python/LowPtTripletStep_cff.py index 355272912deb2..d4b895b445c4a 100644 --- a/FastSimulation/Tracking/python/LowPtTripletStep_cff.py +++ b/FastSimulation/Tracking/python/LowPtTripletStep_cff.py @@ -12,11 +12,12 @@ import FastSimulation.Tracking.TrajectorySeedProducer_cfi lowPtTripletStepSeeds = FastSimulation.Tracking.TrajectorySeedProducer_cfi.trajectorySeedProducer.clone( minLayersCrossed = 3, - layerList = RecoTracker.IterativeTracking.InitialStep_cff.initialStepSeedLayers.layerList.value(), - RegionFactoryPSet = RecoTracker.IterativeTracking.InitialStep_cff.initialStepSeeds.RegionFactoryPSet, + layerList = RecoTracker.IterativeTracking.LowPtTripletStep_cff.lowPtTripletStepSeedLayers.layerList.value(), + RegionFactoryPSet = RecoTracker.IterativeTracking.LowPtTripletStep_cff.lowPtTripletStepSeeds.RegionFactoryPSet, hitMasks = cms.InputTag("lowPtTripletStepMasks"), + pixelTripletGeneratorFactory = RecoTracker.IterativeTracking.LowPtTripletStep_cff.lowPtTripletStepSeeds.OrderedHitsFactoryPSet.GeneratorPSet ) - +lowPtTripletStepSeeds.pixelTripletGeneratorFactory.SeedComparitorPSet=cms.PSet( ComponentName = cms.string( "none" ) ) # track candidates import FastSimulation.Tracking.TrackCandidateProducer_cfi lowPtTripletStepTrackCandidates = FastSimulation.Tracking.TrackCandidateProducer_cfi.trackCandidateProducer.clone( diff --git a/FastSimulation/Tracking/python/MixedTripletStep_cff.py b/FastSimulation/Tracking/python/MixedTripletStep_cff.py index 6d7137589393d..27c816233262a 100644 --- a/FastSimulation/Tracking/python/MixedTripletStep_cff.py +++ b/FastSimulation/Tracking/python/MixedTripletStep_cff.py @@ -14,18 +14,20 @@ minLayersCrossed = 3, layerList = RecoTracker.IterativeTracking.MixedTripletStep_cff.mixedTripletStepSeedLayersA.layerList.value(), RegionFactoryPSet = RecoTracker.IterativeTracking.MixedTripletStep_cff.mixedTripletStepSeedsA.RegionFactoryPSet, - hitMasks = cms.InputTag("mixedTripletStepMasks"), + pixelTripletGeneratorFactory = RecoTracker.IterativeTracking.MixedTripletStep_cff.mixedTripletStepSeedsA.OrderedHitsFactoryPSet.GeneratorPSet, + hitMasks = cms.InputTag("mixedTripletStepMasks") ) - +#del mixedTripletStepSeedsA.pixelTripletGeneratorFactory.SeedComparitorPSet ### import FastSimulation.Tracking.TrajectorySeedProducer_cfi mixedTripletStepSeedsB = FastSimulation.Tracking.TrajectorySeedProducer_cfi.trajectorySeedProducer.clone( minLayersCrossed = 3, layerList = RecoTracker.IterativeTracking.MixedTripletStep_cff.mixedTripletStepSeedLayersB.layerList.value(), RegionFactoryPSet = RecoTracker.IterativeTracking.MixedTripletStep_cff.mixedTripletStepSeedsB.RegionFactoryPSet, - hitMasks = cms.InputTag("mixedTripletStepMasks"), + pixelTripletGeneratorFactory = RecoTracker.IterativeTracking.MixedTripletStep_cff.mixedTripletStepSeedsB.OrderedHitsFactoryPSet.GeneratorPSet, + hitMasks = cms.InputTag("mixedTripletStepMasks") ) - +#del mixedTripletStepSeedsB.pixelTripletGeneratorFactory.SeedComparitorPSet mixedTripletStepSeeds = RecoTracker.IterativeTracking.MixedTripletStep_cff.mixedTripletStepSeeds.clone() #track candidates diff --git a/FastSimulation/Tracking/python/PixelLessStep_cff.py b/FastSimulation/Tracking/python/PixelLessStep_cff.py index 5c31ddffb744b..1afb94875e512 100644 --- a/FastSimulation/Tracking/python/PixelLessStep_cff.py +++ b/FastSimulation/Tracking/python/PixelLessStep_cff.py @@ -14,8 +14,10 @@ layerList = RecoTracker.IterativeTracking.PixelLessStep_cff.pixelLessStepSeedLayers.layerList.value(), RegionFactoryPSet = RecoTracker.IterativeTracking.PixelLessStep_cff.pixelLessStepSeeds.RegionFactoryPSet, hitMasks = cms.InputTag("pixelLessStepMasks"), +MultiHitGeneratorFactory = RecoTracker.IterativeTracking.PixelLessStep_cff.pixelLessStepSeeds.OrderedHitsFactoryPSet.GeneratorPSet ) - +pixelLessStepSeeds.MultiHitGeneratorFactory.SeedComparitorPSet=cms.PSet( ComponentName = cms.string( "none" ) ) +pixelLessStepSeeds.MultiHitGeneratorFactory.refitHits = False # track candidates import FastSimulation.Tracking.TrackCandidateProducer_cfi pixelLessStepTrackCandidates = FastSimulation.Tracking.TrackCandidateProducer_cfi.trackCandidateProducer.clone( diff --git a/FastSimulation/Tracking/python/TobTecStep_cff.py b/FastSimulation/Tracking/python/TobTecStep_cff.py index 8d8ebc3511b29..f6ae656b011c5 100644 --- a/FastSimulation/Tracking/python/TobTecStep_cff.py +++ b/FastSimulation/Tracking/python/TobTecStep_cff.py @@ -14,8 +14,10 @@ layerList = RecoTracker.IterativeTracking.TobTecStep_cff.tobTecStepSeedLayersTripl.layerList.value(), RegionFactoryPSet = RecoTracker.IterativeTracking.TobTecStep_cff.tobTecStepSeedsTripl.RegionFactoryPSet, hitMasks = cms.InputTag("tobTecStepMasks"), + MultiHitGeneratorFactory = RecoTracker.IterativeTracking.TobTecStep_cff.tobTecStepSeedsTripl.OrderedHitsFactoryPSet.GeneratorPSet ) - +tobTecStepSeedsTripl.MultiHitGeneratorFactory.SeedComparitorPSet=cms.PSet( ComponentName = cms.string( "none" ) ) +tobTecStepSeedsTripl.MultiHitGeneratorFactory.refitHits = False #pair seeds import FastSimulation.Tracking.TrajectorySeedProducer_cfi tobTecStepSeedsPair = FastSimulation.Tracking.TrajectorySeedProducer_cfi.trajectorySeedProducer.clone( diff --git a/RecoPixelVertexing/PixelTriplets/interface/HitTripletGeneratorFromPairAndLayers.h b/RecoPixelVertexing/PixelTriplets/interface/HitTripletGeneratorFromPairAndLayers.h index 12960016f2adc..c9422b5231a4b 100644 --- a/RecoPixelVertexing/PixelTriplets/interface/HitTripletGeneratorFromPairAndLayers.h +++ b/RecoPixelVertexing/PixelTriplets/interface/HitTripletGeneratorFromPairAndLayers.h @@ -33,6 +33,17 @@ class HitTripletGeneratorFromPairAndLayers { const edm::Event & ev, const edm::EventSetup& es, const SeedingLayerSetsHits::SeedingLayerSet& pairLayers, const std::vector& thirdLayers) = 0; + + virtual void hitTriplets( + const TrackingRegion& region, + OrderedHitTriplets & result, + const edm::EventSetup & es, + const HitDoublets & doublets, + const RecHitsSortedInPhi ** thirdHitMap, + const std::vector & thirdLayerDetLayer, + const int nThirdLayers) + {}; + protected: std::unique_ptr thePairGenerator; LayerCacheType *theLayerCache; diff --git a/RecoPixelVertexing/PixelTriplets/plugins/PixelTripletHLTGenerator.cc b/RecoPixelVertexing/PixelTriplets/plugins/PixelTripletHLTGenerator.cc index 5c8bca0e53063..9e1ffe29e1aa9 100644 --- a/RecoPixelVertexing/PixelTriplets/plugins/PixelTripletHLTGenerator.cc +++ b/RecoPixelVertexing/PixelTriplets/plugins/PixelTripletHLTGenerator.cc @@ -60,51 +60,62 @@ void PixelTripletHLTGenerator::hitTriplets(const TrackingRegion& region, const SeedingLayerSetsHits::SeedingLayerSet& pairLayers, const std::vector& thirdLayers) { + if (theComparitor) theComparitor->init(ev, es); + + auto const & doublets = thePairGenerator->doublets(region,ev,es, pairLayers); + + if (doublets.empty()) return; + + int size = thirdLayers.size(); + const RecHitsSortedInPhi * thirdHitMap[size]; + vector thirdLayerDetLayer(size,0); + for (int il=0; ilinit(ev, es); - - auto const & doublets = thePairGenerator->doublets(region,ev,es, pairLayers); - - if (doublets.empty()) return; - - auto outSeq = doublets.detLayer(HitDoublets::outer)->seqNum(); - +void PixelTripletHLTGenerator::hitTriplets( + const TrackingRegion& region, + OrderedHitTriplets & result, + const edm::EventSetup & es, + const HitDoublets & doublets, + const RecHitsSortedInPhi ** thirdHitMap, + const std::vector & thirdLayerDetLayer, + const int nThirdLayers) +{ + auto outSeq = doublets.detLayer(HitDoublets::outer)->seqNum(); - // std::cout << "pairs " << doublets.size() << std::endl; - - float regOffset = region.origin().perp(); //try to take account of non-centrality (?) - int size = thirdLayers.size(); - - declareDynArray(ThirdHitRZPrediction, size, preds); - declareDynArray(ThirdHitCorrection, size, corrections); + float regOffset = region.origin().perp(); //try to take account of non-centrality (?) + + declareDynArray(ThirdHitRZPrediction, nThirdLayers, preds); + declareDynArray(ThirdHitCorrection, nThirdLayers, corrections); - const RecHitsSortedInPhi * thirdHitMap[size]; - typedef RecHitsSortedInPhi::Hit Hit; + typedef RecHitsSortedInPhi::Hit Hit; using NodeInfo = KDTreeNodeInfo; std::vector layerTree; // re-used throughout std::vector foundNodes; // re-used thoughout foundNodes.reserve(100); - declareDynArray(KDTreeLinkerAlgo,size, hitTree); - float rzError[size]; //save maximum errors - + declareDynArray(KDTreeLinkerAlgo,nThirdLayers, hitTree); + float rzError[nThirdLayers]; //save maximum errors const float maxDelphi = region.ptMin() < 0.3f ? float(M_PI)/4.f : float(M_PI)/8.f; // FIXME move to config?? const float maxphi = M_PI+maxDelphi, minphi = -maxphi; // increase to cater for any range const float safePhi = M_PI-maxDelphi; // sideband - // fill the prediction vector - for (int il=0; il & pred = preds[il]; - pred.initLayer(thirdLayers[il].detLayer()); + pred.initLayer(thirdLayerDetLayer[il]); pred.initTolerance(extraHitRZtolerance); corrections[il].init(es, region.ptMin(), *doublets.detLayer(HitDoublets::inner), *doublets.detLayer(HitDoublets::outer), - *thirdLayers[il].detLayer(), useMScat, useBend); + *thirdLayerDetLayer[il], useMScat, useBend); layerTree.clear(); float minv=999999.0f, maxv= -minv; // Initialise to extreme values in case no hits @@ -125,7 +136,7 @@ void PixelTripletHLTGenerator::hitTriplets(const TrackingRegion& region, //add fudge factors in case only one hit and also for floating-point inaccuracy hitTree[il].build(layerTree, phiZ); // make KDtree rzError[il] = maxErr; //save error - // std::cout << "layer " << thirdLayers[il].detLayer()->seqNum() << " " << layerTree.size() << std::endl; + // std::cout << "layer " << thirdLayerDetLayer[il]->seqNum() << " " << layerTree.size() << std::endl; } float imppar = region.originRBound(); @@ -158,8 +169,8 @@ void PixelTripletHLTGenerator::hitTriplets(const TrackingRegion& region, // std::cout << ip << ": " << point1.r() << ","<< point1.z() << " " // << point2.r() << ","<< point2.z() <isBarrel(); if ( (!barrelLayer) & (toPos != std::signbit(layer->position().z())) ) continue; @@ -258,7 +269,7 @@ void PixelTripletHLTGenerator::hitTriplets(const TrackingRegion& region, hitTree[il].search(phiZ, foundNodes); } - // std::cout << ip << ": " << thirdLayers[il].detLayer()->seqNum() << " " << foundNodes.size() << " " << prmin << " " << prmax << std::endl; + // std::cout << ip << ": " << thirdLayerDetLayer[il]->seqNum() << " " << foundNodes.size() << " " << prmin << " " << prmax << std::endl; // int kk=0; diff --git a/RecoPixelVertexing/PixelTriplets/plugins/PixelTripletHLTGenerator.h b/RecoPixelVertexing/PixelTriplets/plugins/PixelTripletHLTGenerator.h index 438e26f433f46..98a8b341559bc 100644 --- a/RecoPixelVertexing/PixelTriplets/plugins/PixelTripletHLTGenerator.h +++ b/RecoPixelVertexing/PixelTriplets/plugins/PixelTripletHLTGenerator.h @@ -31,6 +31,15 @@ typedef CombinedHitTripletGenerator::LayerCacheType LayerCacheType; const SeedingLayerSetsHits::SeedingLayerSet& pairLayers, const std::vector& thirdLayers) override; + void hitTriplets( + const TrackingRegion& region, + OrderedHitTriplets & result, + const edm::EventSetup & es, + const HitDoublets & doublets, + const RecHitsSortedInPhi ** thirdHitMap, + const std::vector & thirdLayerDetLayer, + const int nThirdLayers); + private: const bool useFixedPreFiltering; const float extraHitRZtolerance; diff --git a/RecoPixelVertexing/PixelTriplets/plugins/PixelTripletLargeTipGenerator.cc b/RecoPixelVertexing/PixelTriplets/plugins/PixelTripletLargeTipGenerator.cc index 823447041bcb7..cdaf504b6debe 100644 --- a/RecoPixelVertexing/PixelTriplets/plugins/PixelTripletLargeTipGenerator.cc +++ b/RecoPixelVertexing/PixelTriplets/plugins/PixelTripletLargeTipGenerator.cc @@ -77,6 +77,29 @@ void PixelTripletLargeTipGenerator::hitTriplets(const TrackingRegion& region, const SeedingLayerSetsHits::SeedingLayerSet& pairLayers, const std::vector& thirdLayers) { + auto const & doublets = thePairGenerator->doublets(region,ev,es, pairLayers); + + if (doublets.empty()) return; + + int size = thirdLayers.size(); + const RecHitsSortedInPhi * thirdHitMap[size]; + vector thirdLayerDetLayer(size,0); + for (int il=0; il & thirdLayerDetLayer, + const int nThirdLayers) +{ edm::ESHandle tracker; es.get().get(tracker); @@ -85,38 +108,28 @@ void PixelTripletLargeTipGenerator::hitTriplets(const TrackingRegion& region, es.get().get(tTopoHand); const TrackerTopology *tTopo=tTopoHand.product(); - auto const & doublets = thePairGenerator->doublets(region,ev,es, pairLayers); - if (doublets.empty()) return; - auto outSeq = doublets.detLayer(HitDoublets::outer)->seqNum(); - - int size = thirdLayers.size(); - - using NodeInfo = KDTreeNodeInfo; std::vector layerTree; // re-used throughout std::vector foundNodes; // re-used throughout foundNodes.reserve(100); - declareDynArray(KDTreeLinkerAlgo, size, hitTree); - declareDynArray(LayerRZPredictions, size, mapPred); + declareDynArray(KDTreeLinkerAlgo, nThirdLayers, hitTree); + declareDynArray(LayerRZPredictions, nThirdLayers, mapPred); - float rzError[size]; //save maximum errors + float rzError[nThirdLayers]; //save maximum errors const float maxDelphi = region.ptMin() < 0.3f ? float(M_PI)/4.f : float(M_PI)/8.f; // FIXME move to config?? const float maxphi = M_PI+maxDelphi, minphi = -maxphi; // increase to cater for any range const float safePhi = M_PI-maxDelphi; // sideband - - const RecHitsSortedInPhi * thirdHitMap[size]; - - for(int il = 0; il < size; il++) { - thirdHitMap[il] = &(*theLayerCache)(thirdLayers[il], region, ev, es); + for(int il = 0; il < nThirdLayers; il++) { + auto const & hits = *thirdHitMap[il]; - const DetLayer *layer = thirdLayers[il].detLayer(); + const DetLayer *layer = thirdLayerDetLayer[il]; LayerRZPredictions &predRZ = mapPred[il]; predRZ.line.initLayer(layer); predRZ.helix1.initLayer(layer); @@ -125,7 +138,7 @@ void PixelTripletLargeTipGenerator::hitTriplets(const TrackingRegion& region, predRZ.helix1.initTolerance(extraHitRZtolerance); predRZ.helix2.initTolerance(extraHitRZtolerance); predRZ.rzPositionFixup = MatchedHitRZCorrectionFromBending(layer,tTopo); - predRZ.correction.init(es, region.ptMin(), *doublets.detLayer(HitDoublets::inner), *doublets.detLayer(HitDoublets::outer), *thirdLayers[il].detLayer(), useMScat, false); + predRZ.correction.init(es, region.ptMin(), *doublets.detLayer(HitDoublets::inner), *doublets.detLayer(HitDoublets::outer), *thirdLayerDetLayer[il], useMScat, false); layerTree.clear(); @@ -172,9 +185,9 @@ void PixelTripletLargeTipGenerator::hitTriplets(const TrackingRegion& region, Range generalCurvature = predictionRPhi.curvature(region.originRBound()); if (!intersect(generalCurvature, Range(-curv, curv))) continue; - for(int il = 0; il < size; il++) { + for(int il = 0; il < nThirdLayers; il++) { if (hitTree[il].empty()) continue; // Don't bother if no hits - const DetLayer *layer = thirdLayers[il].detLayer(); + const DetLayer *layer = thirdLayerDetLayer[il]; bool barrelLayer = layer->isBarrel(); if ( (!barrelLayer) & (toPos != std::signbit(layer->position().z())) ) continue; @@ -317,7 +330,6 @@ void PixelTripletLargeTipGenerator::hitTriplets(const TrackingRegion& region, MatchedHitRZCorrectionFromBending l2rzFixup(doublets.hit(ip,HitDoublets::outer)->det()->geographicalId(), tTopo); MatchedHitRZCorrectionFromBending l3rzFixup = predRZ.rzPositionFixup; - thirdHitMap[il] = &(*theLayerCache)(thirdLayers[il], region, ev, es); auto const & hits = *thirdHitMap[il]; for (auto KDdata : foundNodes) { GlobalPoint p3 = hits.gp(KDdata); diff --git a/RecoPixelVertexing/PixelTriplets/plugins/PixelTripletLargeTipGenerator.h b/RecoPixelVertexing/PixelTriplets/plugins/PixelTripletLargeTipGenerator.h index 79505a6400686..98a80d28b2440 100644 --- a/RecoPixelVertexing/PixelTriplets/plugins/PixelTripletLargeTipGenerator.h +++ b/RecoPixelVertexing/PixelTriplets/plugins/PixelTripletLargeTipGenerator.h @@ -30,6 +30,15 @@ typedef CombinedHitTripletGenerator::LayerCacheType LayerCacheType; const SeedingLayerSetsHits::SeedingLayerSet& pairLayers, const std::vector& thirdLayers) override; + void hitTriplets( + const TrackingRegion& region, + OrderedHitTriplets & result, + const edm::EventSetup & es, + const HitDoublets & doublets, + const RecHitsSortedInPhi ** thirdHitMap, + const std::vector & thirdLayerDetLayer, + const int nThirdLayers)override; + private: const bool useFixedPreFiltering; const float extraHitRZtolerance; diff --git a/RecoTracker/TkSeedGenerator/interface/MultiHitGeneratorFromPairAndLayers.h b/RecoTracker/TkSeedGenerator/interface/MultiHitGeneratorFromPairAndLayers.h index 2bec6444ab97a..27a5942bae235 100644 --- a/RecoTracker/TkSeedGenerator/interface/MultiHitGeneratorFromPairAndLayers.h +++ b/RecoTracker/TkSeedGenerator/interface/MultiHitGeneratorFromPairAndLayers.h @@ -33,6 +33,16 @@ class MultiHitGeneratorFromPairAndLayers { SeedingLayerSetsHits::SeedingLayerSet pairLayers, std::vector thirdLayers) = 0; + virtual void hitTriplets( + const TrackingRegion& region, + OrderedMultiHits & result, + const edm::EventSetup & es, + const HitDoublets & doublets, + const RecHitsSortedInPhi ** thirdHitMap, + const std::vector & thirdLayerDetLayer, + const int nThirdLayers) + {}; + const HitPairGeneratorFromLayerPair& pairGenerator() const { return *thePairGenerator; } void clear(); diff --git a/RecoTracker/TkSeedGenerator/plugins/MultiHitGeneratorFromChi2.cc b/RecoTracker/TkSeedGenerator/plugins/MultiHitGeneratorFromChi2.cc index cbaa16f06f028..762c8047f1a6e 100644 --- a/RecoTracker/TkSeedGenerator/plugins/MultiHitGeneratorFromChi2.cc +++ b/RecoTracker/TkSeedGenerator/plugins/MultiHitGeneratorFromChi2.cc @@ -118,14 +118,17 @@ void MultiHitGeneratorFromChi2::initES(const edm::EventSetup& es) bfield = bfield_h.product(); nomField = bfield->nominalValue(); - edm::ESHandle filterHandle_; - es.get().get(filterName_, filterHandle_); - filter = filterHandle_.product(); - - edm::ESHandle builderH; - es.get().get(builderName_, builderH); - builder = (TkTransientTrackingRecHitBuilder const *)(builderH.product()); - cloner = (*builder).cloner(); + if(refitHits) + { + edm::ESHandle filterHandle_; + es.get().get(filterName_, filterHandle_); + filter = filterHandle_.product(); + + edm::ESHandle builderH; + es.get().get(builderName_, builderH); + builder = (TkTransientTrackingRecHitBuilder const *)(builderH.product()); + cloner = (*builder).cloner(); + } } @@ -149,47 +152,61 @@ void MultiHitGeneratorFromChi2::hitSets(const TrackingRegion& region, const edm::EventSetup& es, SeedingLayerSetsHits::SeedingLayerSet pairLayers, std::vector thirdLayers) -{ - unsigned int debug_Id0 = detIdsToDebug[0]; - unsigned int debug_Id1 = detIdsToDebug[1]; - unsigned int debug_Id2 = detIdsToDebug[2]; - +{ LogDebug("MultiHitGeneratorFromChi2") << "pair: " << thePairGenerator->innerLayer(pairLayers).name() << "+" << thePairGenerator->outerLayer(pairLayers).name() << " 3rd lay size: " << thirdLayers.size(); - //gc: first get the pairs - OrderedHitPairs pairs; - pairs.reserve(30000); - thePairGenerator->hitPairs(region,pairs,ev,es, pairLayers); + auto const & doublets = thePairGenerator->doublets(region,ev,es, pairLayers); LogTrace("MultiHitGeneratorFromChi2") << ""; - if (pairs.empty()) { - // LogDebug("MultiHitGeneratorFromChi2") << "empy pairs"; + if (doublets.empty()) { + // LogDebug("MultiHitGeneratorFromChi2") << "empy pairs"; return; } + int size = thirdLayers.size(); + const RecHitsSortedInPhi * thirdHitMap[size]; + vector thirdLayerDetLayer(size,0); + for (int il=0; il & thirdLayerDetLayer, + const int nThirdLayers) +{ + + unsigned int debug_Id0 = detIdsToDebug[0]; + unsigned int debug_Id1 = detIdsToDebug[1]; + unsigned int debug_Id2 = detIdsToDebug[2]; //gc: these are all the layers compatible with the layer pairs (as defined in the config file) - int size = thirdLayers.size(); //gc: initialize a KDTree per each 3rd layer std::vector > layerTree; // re-used throughout std::vector foundNodes; // re-used thoughout foundNodes.reserve(100); - declareDynArray(KDTreeLinkerAlgo,size, hitTree); - float rzError[size]; //save maximum errors + declareDynArray(KDTreeLinkerAlgo,nThirdLayers, hitTree); + declareDynArray(LayerRZPredictions, nThirdLayers, mapPred); + float rzError[nThirdLayers]; //save maximum errors const float maxDelphi = region.ptMin() < 0.3f ? float(M_PI)/4.f : float(M_PI)/8.f; // FIXME move to config?? const float maxphi = M_PI+maxDelphi, minphi = -maxphi; // increase to cater for any range const float safePhi = M_PI-maxDelphi; // sideband - std::map mapPred;//need to use the name as map key since we may have more than one SeedingLayer per DetLayer (e.g. TID and MTID) - const RecHitsSortedInPhi * thirdHitMap[size];//gc: this comes from theLayerCache - + //std::map mapPred;//need to use the name as map key since we may have more than one SeedingLayer per DetLayer (e.g. TID and MTID) //gc: loop over each layer - for(int il = 0; il < size; il++) { - thirdHitMap[il] = &(*theLayerCache)(thirdLayers[il], region, ev, es); - LogTrace("MultiHitGeneratorFromChi2") << "considering third layer: " << thirdLayers[il].name() << " with hits: " << thirdHitMap[il]->all().second-thirdHitMap[il]->all().first; - const DetLayer *layer = thirdLayers[il].detLayer(); - LayerRZPredictions &predRZ = mapPred[thirdLayers[il].name()]; + for(int il = 0; il < nThirdLayers; il++) { + LogTrace("MultiHitGeneratorFromChi2") << "considering third layer: with hits: " << thirdHitMap[il]->all().second-thirdHitMap[il]->all().first; + const DetLayer *layer = thirdLayerDetLayer[il]; + LayerRZPredictions &predRZ = mapPred[il]; predRZ.line.initLayer(layer); predRZ.line.initTolerance(extraHitRZtolerance); @@ -198,7 +215,7 @@ void MultiHitGeneratorFromChi2::hitSets(const TrackingRegion& region, layerTree.clear(); float minz=999999.0f, maxz= -minz; // Initialise to extreme values in case no hits float maxErr=0.0f; - bool barrelLayer = (thirdLayers[il].detLayer()->location() == GeomDetEnumerators::barrel); + bool barrelLayer = (thirdLayerDetLayer[il]->location() == GeomDetEnumerators::barrel); if (hitRange.first != hitRange.second) { minz = barrelLayer? hitRange.first->hit()->globalPosition().z() : hitRange.first->hit()->globalPosition().perp(); maxz = minz; //In case there's only one hit on the layer @@ -231,18 +248,18 @@ void MultiHitGeneratorFromChi2::hitSets(const TrackingRegion& region, //gc: this sets the minPt of the triplet auto curv = PixelRecoUtilities::curvature(1. / region.ptMin(), es); - LogTrace("MultiHitGeneratorFromChi2") << "pair size=" << pairs.size() << std::endl; + LogTrace("MultiHitGeneratorFromChi2") << "doublet size=" << doublets.size() << std::endl; //gc: now we loop over all pairs - for (OrderedHitPairs::const_iterator ip = pairs.begin(); ip != pairs.end(); ++ip) { + for (std::size_t ip =0; ip!=doublets.size(); ip++) { int foundTripletsFromPair = 0; bool usePair = false; cacheHitPointer bestH2; float minChi2 = std::numeric_limits::max(); - SeedingHitSet::ConstRecHitPointer oriHit0 = ip->inner(); - SeedingHitSet::ConstRecHitPointer oriHit1 = ip->outer(); + SeedingHitSet::ConstRecHitPointer oriHit0 =doublets.hit(ip,HitDoublets::inner); + SeedingHitSet::ConstRecHitPointer oriHit1 =doublets.hit(ip,HitDoublets::outer); HitOwnPtr hit0(*oriHit0); HitOwnPtr hit1(*oriHit1); @@ -250,7 +267,7 @@ void MultiHitGeneratorFromChi2::hitSets(const TrackingRegion& region, GlobalPoint gp1 = hit1->globalPosition(); #ifdef EDM_ML_DEBUG - bool debugPair = ip->inner()->rawId()==debug_Id0 && ip->outer()->rawId()==debug_Id1; + bool debugPair = oriHit0->rawId()==debug_Id0 && oriHit01->rawId()==debug_Id1; #endif IfLogTrace(debugPair, "MultiHitGeneratorFromChi2") << endl << endl << "found new pair with ids "<location(); + IfLogTrace(debugPair, "MultiHitGeneratorFromChi2") << "cosider layer:" << " for this pair. Location: " << thirdLayerDetLayer[il]->location(); if (hitTree[il].empty()) { IfLogTrace(debugPair, "MultiHitGeneratorFromChi2") << "empty hitTree"; @@ -347,13 +364,13 @@ void MultiHitGeneratorFromChi2::hitSets(const TrackingRegion& region, cacheHitPointer bestL2; float chi2FromThisLayer = std::numeric_limits::max(); - const DetLayer *layer = thirdLayers[il].detLayer(); + const DetLayer *layer = thirdLayerDetLayer[il]; bool barrelLayer = layer->location() == GeomDetEnumerators::barrel; if ( (!barrelLayer) & (toPos != std::signbit(layer->position().z())) ) continue; - LayerRZPredictions &predRZ = mapPred.find(thirdLayers[il].name())->second; + LayerRZPredictions &predRZ = mapPred[il]; predRZ.line.initPropagator(&line); //gc: this takes the z at R-thick/2 and R+thick/2 according to @@ -377,7 +394,7 @@ void MultiHitGeneratorFromChi2::hitSets(const TrackingRegion& region, if (useFixedPreFiltering) { //gc: in this case it takes as range the phi of the outer // hit +/- the phiPreFiltering value from cfg - float phi0 = ip->outer()->globalPosition().phi(); + float phi0 = oriHit0->globalPosition().phi(); phiRange = Range(phi0 - dphi, phi0 + dphi); } else { //gc: predictionRPhi uses the cosine rule to find the phi of the 3rd point at radius, assuming the pairCurvature range [-c,+c] @@ -616,7 +633,7 @@ void MultiHitGeneratorFromChi2::hitSets(const TrackingRegion& region, //push back only (max) once per pair IfLogTrace(debugPair, "MultiHitGeneratorFromChi2") << "Done seed #" << result.size(); - if (usePair) result.push_back(SeedingHitSet(ip->inner(), ip->outer())); + if (usePair) result.push_back(SeedingHitSet(oriHit0, oriHit1)); else { assert(1==foundTripletsFromPair); assert(bestH2); diff --git a/RecoTracker/TkSeedGenerator/plugins/MultiHitGeneratorFromChi2.h b/RecoTracker/TkSeedGenerator/plugins/MultiHitGeneratorFromChi2.h index 7d64cc99a9c26..647afb3aa9c3c 100644 --- a/RecoTracker/TkSeedGenerator/plugins/MultiHitGeneratorFromChi2.h +++ b/RecoTracker/TkSeedGenerator/plugins/MultiHitGeneratorFromChi2.h @@ -40,6 +40,14 @@ typedef CombinedMultiHitGenerator::LayerCacheType LayerCacheType; SeedingLayerSetsHits::SeedingLayerSet pairLayers, std::vector thirdLayers); + void hitTriplets( + const TrackingRegion& region, + OrderedMultiHits & result, + const edm::EventSetup & es, + const HitDoublets & doublets, + const RecHitsSortedInPhi ** thirdHitMap, + const std::vector & thirdLayerDetLayer, + const int nThirdLayers); private: using HitOwnPtr = mayown_ptr;