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;