CMS 3D CMS Logo

TrajSeedMatcher.cc
Go to the documentation of this file.
2 
7 
11 
15 
17 
20 
22 
24  cacheIDMagField_(0),
25  minNrHits_(pset.getParameter<std::vector<unsigned int> >("minNrHits")),
26  minNrHitsValidLayerBins_(pset.getParameter<std::vector<int> >("minNrHitsValidLayerBins"))
27 {
28  useRecoVertex_ = pset.getParameter<bool>("useRecoVertex");
29  navSchoolLabel_ = pset.getParameter<std::string>("navSchool");
30  detLayerGeomLabel_ = pset.getParameter<std::string>("detLayerGeom");
31  const auto cutsPSets=pset.getParameter<std::vector<edm::ParameterSet> >("matchingCuts");
32  for(const auto & cutPSet : cutsPSets){
33  matchingCuts_.push_back(MatchingCuts(cutPSet));
34  }
35 
36  if(minNrHitsValidLayerBins_.size()+1!=minNrHits_.size()){
37  throw cms::Exception("InvalidConfig")<<" minNrHitsValidLayerBins should be 1 less than minNrHits when its "<<minNrHitsValidLayerBins_.size()<<" vs "<<minNrHits_.size();
38  }
39 }
40 
42 {
44  desc.add<bool>("useRecoVertex",false);
45  desc.add<std::string>("navSchool","SimpleNavigationSchool");
46  desc.add<std::string>("detLayerGeom","hltESPGlobalDetLayerGeometry");
47  desc.add<std::vector<int> >("minNrHitsValidLayerBins",{4});
48  desc.add<std::vector<unsigned int> >("minNrHits",{2,3});
49 
50 
52  cutsDesc.add<double>("dPhiMax",0.04);
53  cutsDesc.add<double>("dRZMax",0.09);
54  cutsDesc.add<double>("dRZMaxLowEtThres",20.);
55  cutsDesc.add<std::vector<double> >("dRZMaxLowEtEtaBins",std::vector<double>{1.,1.5});
56  cutsDesc.add<std::vector<double> >("dRZMaxLowEt",std::vector<double>{0.09,0.15,0.09});
58  defaults.addParameter<double>("dPhiMax",0.04);
59  defaults.addParameter<double>("dRZMax",0.09);
60  defaults.addParameter<double>("dRZMaxLowEtThres",0.09);
61  defaults.addParameter<std::vector<double> >("dRZMaxLowEtEtaBins",std::vector<double>{1.,1.5});
62  defaults.addParameter<std::vector<double> >("dRZMaxLowEt",std::vector<double>{0.09,0.09,0.09});
63  desc.addVPSet("matchingCuts",cutsDesc,std::vector<edm::ParameterSet>{defaults,defaults,defaults});
64  return desc;
65 }
66 
68 {
70  iSetup.get<IdealMagneticFieldRecord>().get(magField_);
71  cacheIDMagField_=iSetup.get<IdealMagneticFieldRecord>().cacheIdentifier();
72  forwardPropagator_=std::make_unique<PropagatorWithMaterial>(alongMomentum,kElectronMass_,&*(magField_));
73  backwardPropagator_=std::make_unique<PropagatorWithMaterial>(oppositeToMomentum,kElectronMass_,&*(magField_));
74  }
77 }
78 
79 
80 std::vector<TrajSeedMatcher::SeedWithInfo>
82  const GlobalPoint & vprim, const float energy)
83 {
85  throw cms::Exception("LogicError") <<__FUNCTION__<<" can not make pixel seeds as event setup has not properly been called";
86  }
87 
88  clearCache();
89 
90  std::vector<SeedWithInfo> matchedSeeds;
91  for(const auto& seed : seeds) {
92  std::vector<HitInfo> matchedHitsNeg = processSeed(seed,candPos,vprim,energy,-1);
93  std::vector<HitInfo> matchedHitsPos = processSeed(seed,candPos,vprim,energy,+1);
94  int nrValidLayersPos = 0;
95  int nrValidLayersNeg = 0;
96  if(matchedHitsNeg.size()>=2){
97  nrValidLayersNeg = getNrValidLayersAlongTraj(matchedHitsNeg[0],
98  matchedHitsNeg[1],
99  candPos,vprim,energy,-1);
100  }
101  if(matchedHitsPos.size()>=2){
102  nrValidLayersPos = getNrValidLayersAlongTraj(matchedHitsPos[0],
103  matchedHitsPos[1],
104  candPos,vprim,energy,+1);
105  }
106 
107  int nrValidLayers = std::max(nrValidLayersNeg,nrValidLayersPos);
108  size_t nrHitsRequired = getNrHitsRequired(nrValidLayers);
109  //so we require the number of hits to exactly match, this is because we currently do not
110  //do any duplicate cleaning for the input seeds
111  //this means is a hit pair with a 3rd hit will appear twice (or however many hits it has)
112  //so if you did >=nrHitsRequired, you would get the same seed multiple times
113  //ideally we should fix this and clean our input seed collection so each seed is only in once
114  //also it should be studied what impact having a 3rd hit has on a GsfTrack
115  //ie will we get a significantly different result seeding with a hit pair
116  //and the same the hit pair with a 3rd hit added
117  //in that case, perhaps it should be >=
118  if(matchedHitsNeg.size()==nrHitsRequired ||
119  matchedHitsPos.size()==nrHitsRequired){
120  matchedSeeds.push_back({seed,matchedHitsPos,matchedHitsNeg,nrValidLayers});
121  }
122 
123 
124  }
125  return matchedSeeds;
126 }
127 
128 //checks if the hits of the seed match within requested selection
129 //matched hits are required to be consecutive, as soon as hit isnt matched,
130 //the function returns, it doesnt allow skipping hits
131 std::vector<TrajSeedMatcher::HitInfo>
133  const GlobalPoint & vprim, const float energy, const int charge )
134 {
135  const float candEta = candPos.eta();
136  const float candEt = energy*std::sin(candPos.theta());
137 
138  FreeTrajectoryState trajStateFromVtx = FTSFromVertexToPointFactory::get(*magField_, candPos, vprim, energy, charge);
140  TrajectoryStateOnSurface initialTrajState(trajStateFromVtx,*bpb(trajStateFromVtx.position(),
141  trajStateFromVtx.momentum()));
142 
143  std::vector<HitInfo> matchedHits;
144  HitInfo firstHit = matchFirstHit(seed,initialTrajState,vprim,*backwardPropagator_);
145  if(passesMatchSel(firstHit,0,candEt,candEta)){
146  matchedHits.push_back(firstHit);
147 
148  //now we can figure out the z vertex
149  double zVertex = useRecoVertex_ ? vprim.z() : getZVtxFromExtrapolation(vprim,firstHit.pos(),candPos);
150  GlobalPoint vertex(vprim.x(),vprim.y(),zVertex);
151 
152  FreeTrajectoryState firstHitFreeTraj = FTSFromVertexToPointFactory::get(*magField_, firstHit.pos(),
153  vertex, energy, charge) ;
154 
155  GlobalPoint prevHitPos = firstHit.pos();
156  for(size_t hitNr=1;hitNr<matchingCuts_.size() && hitNr<seed.nHits();hitNr++){
157  HitInfo hit = match2ndToNthHit(seed,firstHitFreeTraj,hitNr,prevHitPos,vertex,*forwardPropagator_);
158  if(passesMatchSel(hit,hitNr,candEt,candEta)){
159  matchedHits.push_back(hit);
160  prevHitPos = hit.pos();
161  }else break;
162  }
163  }
164  return matchedHits;
165 }
166 
167 // compute the z vertex from the candidate position and the found pixel hit
169  const GlobalPoint& candPos)
170 {
171  auto sq = [](float x){return x*x;};
172  auto calRDiff = [sq](const GlobalPoint& p1,const GlobalPoint& p2){
173  return std::sqrt(sq(p2.x()-p1.x()) + sq(p2.y()-p1.y()));
174  };
175  const double r1Diff = calRDiff(primeVtxPos,hitPos);
176  const double r2Diff = calRDiff(hitPos,candPos);
177  return hitPos.z() - r1Diff*(candPos.z()-hitPos.z())/r2Diff;
178 }
179 
180 bool TrajSeedMatcher::passTrajPreSel(const GlobalPoint& hitPos,const GlobalPoint& candPos)const
181 {
182  float dt = hitPos.x()*candPos.x()+hitPos.y()*candPos.y();
183  if (dt<0) return false;
184  if (dt<kPhiCut_*(candPos.perp()*hitPos.perp())) return false;
185  return true;
186 }
187 
189 {
190  auto& trajStateFromVtxCache = initialState.charge()==1 ? trajStateFromVtxPosChargeCache_ :
192 
193  auto key = hit.det()->gdetIndex();
194  auto res = trajStateFromVtxCache.find(key);
195  if(res!=trajStateFromVtxCache.end()) return res->second;
196  else{ //doesnt exist, need to make it
197  //FIXME: check for efficiency
198  auto val = trajStateFromVtxCache.emplace(key,propagator.propagate(initialState,hit.det()->surface()));
199  return val.first->second;
200  }
201 }
202 
204 {
205 
206  auto& trajStateFromPointCache = initialState.charge()==1 ? trajStateFromPointPosChargeCache_ :
208 
209  auto key = std::make_pair(hit.det()->gdetIndex(),point);
210  auto res = trajStateFromPointCache.find(key);
211  if(res!=trajStateFromPointCache.end()) return res->second;
212  else{ //doesnt exist, need to make it
213  //FIXME: check for efficiency
214  auto val = trajStateFromPointCache.emplace(key,propagator.propagate(initialState,hit.det()->surface()));
215  return val.first->second;
216  }
217 }
218 
220 {
221  const TrajectorySeed::range& hits = seed.recHits();
222  auto hitIt = hits.first;
223 
224  if(hitIt->isValid()){
225  const TrajectoryStateOnSurface& trajStateFromVtx = getTrajStateFromVtx(*hitIt,initialState,propagator);
226  if(trajStateFromVtx.isValid()) return HitInfo(vtxPos,trajStateFromVtx,*hitIt);
227  }
228  return HitInfo();
229 }
230 
232  const FreeTrajectoryState& initialState,
233  const size_t hitNr,
234  const GlobalPoint& prevHitPos,
235  const GlobalPoint& vtxPos,
237 {
238  const TrajectorySeed::range& hits = seed.recHits();
239  auto hitIt = hits.first+hitNr;
240 
241  if(hitIt->isValid()){
242  const TrajectoryStateOnSurface& trajState = getTrajStateFromPoint(*hitIt,initialState,prevHitPos,propagator);
243  if(trajState.isValid()){
244  return HitInfo(vtxPos,trajState,*hitIt);
245  }
246  }
247  return HitInfo();
248 
249 }
250 
252 {
257 }
258 
259 bool TrajSeedMatcher::passesMatchSel(const TrajSeedMatcher::HitInfo& hit,const size_t hitNr,float scEt,float scEta)const
260 {
261  if(hitNr<matchingCuts_.size()){
262  return matchingCuts_[hitNr](hit,scEt,scEta);
263  }else{
264  throw cms::Exception("LogicError") <<" Error, attempting to apply selection to hit "<<hitNr<<" but only cuts for "<<matchingCuts_.size()<<" defined";
265  }
266 
267 }
268 
270  const GlobalPoint& candPos,
271  const GlobalPoint & vprim,
272  const float energy, const int charge)
273 {
274  double zVertex = useRecoVertex_ ? vprim.z() : getZVtxFromExtrapolation(vprim,hit1.pos(),candPos);
275  GlobalPoint vertex(vprim.x(),vprim.y(),zVertex);
276 
278  vertex, energy, charge);
279  const TrajectoryStateOnSurface& secondHitTraj = getTrajStateFromPoint(*hit2.hit(),firstHitFreeTraj,hit1.pos(),*forwardPropagator_);
280  return getNrValidLayersAlongTraj(hit2.hit()->geographicalId(),secondHitTraj);
281 }
282 
284 {
285 
286  const DetLayer* detLayer = detLayerGeom_->idToLayer(hitId);
287  if(detLayer==nullptr) return 0;
288 
289  const FreeTrajectoryState& hitFreeState = *hitTrajState.freeState();
290  const std::vector<const DetLayer*> inLayers = navSchool_->compatibleLayers(*detLayer,hitFreeState,oppositeToMomentum);
291  const std::vector<const DetLayer*> outLayers = navSchool_->compatibleLayers(*detLayer,hitFreeState,alongMomentum);
292 
293  int nrValidLayers=1; //because our current hit is also valid and wont be included in the count otherwise
294  int nrPixInLayers=0;
295  int nrPixOutLayers=0;
296  for(auto layer : inLayers){
297  if(GeomDetEnumerators::isTrackerPixel(layer->subDetector())){
298  nrPixInLayers++;
299  if(layerHasValidHits(*layer,hitTrajState,*backwardPropagator_)) nrValidLayers++;
300  }
301  }
302  for(auto layer : outLayers){
303  if(GeomDetEnumerators::isTrackerPixel(layer->subDetector())){
304  nrPixOutLayers++;
305  if(layerHasValidHits(*layer,hitTrajState,*forwardPropagator_)) nrValidLayers++;
306  }
307  }
308  return nrValidLayers;
309 }
310 
312  const Propagator& propToLayerFromState)const
313 {
314  //FIXME: do not hardcode with werid magic numbers stolen from ancient tracking code
315  //its taken from https://cmssdt.cern.ch/dxr/CMSSW/source/RecoTracker/TrackProducer/interface/TrackProducerBase.icc#165
316  //which inspires this code
317  Chi2MeasurementEstimator estimator(30.,-3.0,0.5,2.0,0.5,1.e12); // same as defauts....
318 
319  const std::vector<GeometricSearchDet::DetWithState>& detWithState = layer.compatibleDets(hitSurState,propToLayerFromState,estimator);
320  if(detWithState.empty()) return false;
321  else{
322  DetId id = detWithState.front().first->geographicalId();
324  if(measDet.isActive()) return true;
325  else return false;
326  }
327 }
328 
329 
330 size_t TrajSeedMatcher::getNrHitsRequired(const int nrValidLayers)const
331 {
332  for(size_t binNr=0;binNr<minNrHitsValidLayerBins_.size();binNr++){
333  if(nrValidLayers<minNrHitsValidLayerBins_[binNr]) return minNrHits_[binNr];
334  }
335  return minNrHits_.back();
336 
337 }
338 
340  const TrajectoryStateOnSurface& trajState,
341  const TrackingRecHit& hit):
342  detId_(hit.geographicalId()),
343  pos_(hit.globalPosition()),
344  hit_(&hit)
345 {
346  EleRelPointPair pointPair(pos_,trajState.globalParameters().position(),vtxPos);
347  dRZ_ = detId_.subdetId()==PixelSubdetector::PixelBarrel ? pointPair.dZ() : pointPair.dPerp();
348  dPhi_ = pointPair.dPhi();
349 }
350 
351 
354  const std::vector<HitInfo>& posCharge,
355  const std::vector<HitInfo>& negCharge,
356  int nrValidLayers):
357  seed_(seed),nrValidLayers_(nrValidLayers)
358 {
359  size_t nrHitsMax = std::max(posCharge.size(),negCharge.size());
360  for(size_t hitNr=0;hitNr<nrHitsMax;hitNr++){
361  DetId detIdPos = hitNr<posCharge.size() ? posCharge[hitNr].detId() : DetId(0);
362  float dRZPos = hitNr<posCharge.size() ? posCharge[hitNr].dRZ() : std::numeric_limits<float>::max();
363  float dPhiPos = hitNr<posCharge.size() ? posCharge[hitNr].dPhi() : std::numeric_limits<float>::max();
364 
365  DetId detIdNeg = hitNr<negCharge.size() ? negCharge[hitNr].detId() : DetId(0);
366  float dRZNeg = hitNr<negCharge.size() ? negCharge[hitNr].dRZ() : std::numeric_limits<float>::max();
367  float dPhiNeg = hitNr<negCharge.size() ? negCharge[hitNr].dPhi() : std::numeric_limits<float>::max();
368 
369  if(detIdPos!=detIdNeg && (detIdPos.rawId()!=0 && detIdNeg.rawId()!=0)){
370  cms::Exception("LogicError")<<" error in "<<__FILE__<<", "<<__LINE__<<" hits to be combined have different detIDs, this should not be possible and nothing good will come of it";
371  }
372  DetId detId = detIdPos.rawId()!=0 ? detIdPos : detIdNeg;
373  matchInfo_.push_back(MatchInfo(detId,dRZPos,dRZNeg,dPhiPos,dPhiNeg));
374  }
375 }
376 
378  dPhiMax_(pset.getParameter<double>("dPhiMax")),
379  dRZMax_(pset.getParameter<double>("dRZMax")),
380  dRZMaxLowEtThres_(pset.getParameter<double>("dRZMaxLowEtThres")),
381  dRZMaxLowEtEtaBins_(pset.getParameter<std::vector<double> >("dRZMaxLowEtEtaBins")),
382  dRZMaxLowEt_(pset.getParameter<std::vector<double> >("dRZMaxLowEt"))
383 {
384  if(dRZMaxLowEtEtaBins_.size()+1!=dRZMaxLowEt_.size()){
385  throw cms::Exception("InvalidConfig")<<" dRZMaxLowEtEtaBins should be 1 less than dRZMaxLowEt when its "<<dRZMaxLowEtEtaBins_.size()<<" vs "<<dRZMaxLowEt_.size();
386  }
387 }
388 
389 bool TrajSeedMatcher::MatchingCuts::operator()(const TrajSeedMatcher::HitInfo& hit,const float scEt,const float scEta)const
390 {
391  if(dPhiMax_>=0 && std::abs(hit.dPhi()) > dPhiMax_) return false;
392 
393  const float dRZMax = getDRZCutValue(scEt,scEta);
394  if(dRZMax_>=0 && std::abs(hit.dRZ()) > dRZMax) return false;
395 
396  return true;
397 }
398 
399 float TrajSeedMatcher::MatchingCuts::getDRZCutValue(const float scEt,const float scEta)const
400 {
401  if(scEt>=dRZMaxLowEtThres_) return dRZMax_;
402  else{
403  const float absEta = std::abs(scEta);
404  for(size_t etaNr=0;etaNr<dRZMaxLowEtEtaBins_.size();etaNr++){
405  if(absEta<dRZMaxLowEtEtaBins_[etaNr]) return dRZMaxLowEt_[etaNr];
406  }
407  return dRZMaxLowEt_.back();
408  }
409 }
T getParameter(std::string const &) const
unsigned long long cacheIdentifier() const
std::unordered_map< std::pair< int, GlobalPoint >, TrajectoryStateOnSurface > trajStateFromPointNegChargeCache_
MeasurementDetWithData idToDet(const DetId &id) const
Previous MeasurementDetSystem interface.
void doEventSetup(const edm::EventSetup &iSetup)
float dt
Definition: AMPTWrapper.h:126
std::vector< TrajSeedMatcher::SeedWithInfo > compatibleSeeds(const TrajectorySeedCollection &seeds, const GlobalPoint &candPos, const GlobalPoint &vprim, const float energy)
std::unordered_map< int, TrajectoryStateOnSurface > trajStateFromVtxNegChargeCache_
static FreeTrajectoryState get(MagneticField const &magField, GlobalPoint const &xmeas, GlobalPoint const &xvert, float momentum, TrackCharge charge)
ParameterDescriptionBase * addVPSet(U const &iLabel, ParameterSetDescription const &validator, std::vector< ParameterSet > const &defaults)
T perp() const
Definition: PV3DBase.h:72
DetId detId(size_t hitNr) const
const TrajectoryStateOnSurface & getTrajStateFromVtx(const TrackingRecHit &hit, const TrajectoryStateOnSurface &initialState, const PropagatorWithMaterial &propagator)
int gdetIndex() const
Definition: GeomDet.h:103
std::unordered_map< int, TrajectoryStateOnSurface > trajStateFromVtxPosChargeCache_
Sin< T >::type sin(const T &t)
Definition: Sin.h:22
edm::ESHandle< DetLayerGeometry > detLayerGeom_
float dRZPos(size_t hitNr) const
bool passTrajPreSel(const GlobalPoint &hitPos, const GlobalPoint &candPos) const
std::unique_ptr< PropagatorWithMaterial > forwardPropagator_
T y() const
Definition: PV3DBase.h:63
const std::vector< int > minNrHitsValidLayerBins_
float getDRZCutValue(const float scEt, const float scEta) const
TrajSeedMatcher::HitInfo matchFirstHit(const TrajectorySeed &seed, const TrajectoryStateOnSurface &trajState, const GlobalPoint &vtxPos, const PropagatorWithMaterial &propagator)
TrackCharge charge() const
static float getZVtxFromExtrapolation(const GlobalPoint &primeVtxPos, const GlobalPoint &hitPos, const GlobalPoint &candPos)
const Plane & surface() const
The nominal surface of the GeomDet.
Definition: GeomDet.h:42
SeedWithInfo(const TrajectorySeed &seed, const std::vector< HitInfo > &posCharge, const std::vector< HitInfo > &negCharge, int nrValidLayers)
#define constexpr
virtual std::vector< DetWithState > compatibleDets(const TrajectoryStateOnSurface &startingState, const Propagator &prop, const MeasurementEstimator &est) const
Definition: Electron.h:4
MatchingCuts(const edm::ParameterSet &pset)
const TrajectoryStateOnSurface & getTrajStateFromPoint(const TrackingRecHit &hit, const FreeTrajectoryState &initialState, const GlobalPoint &point, const PropagatorWithMaterial &propagator)
Geom::Theta< T > theta() const
Definition: PV3DBase.h:75
uint32_t rawId() const
get the raw id
Definition: DetId.h:43
bool operator()(const HitInfo &hit, const float scEt, const float scEta) const
edm::ESHandle< NavigationSchool > navSchool_
unsigned long long cacheIDMagField_
std::unordered_map< std::pair< int, GlobalPoint >, TrajectoryStateOnSurface > trajStateFromPointPosChargeCache_
def defaults(locpath, dataType, var)
static edm::ParameterSetDescription makePSetDescription()
std::vector< TrajectorySeed > TrajectorySeedCollection
edm::ESHandle< MagneticField > magField_
const GeomDet * det() const
std::vector< MatchingCuts > matchingCuts_
T sqrt(T t)
Definition: SSEVec.h:18
TrajSeedMatcher::HitInfo match2ndToNthHit(const TrajectorySeed &seed, const FreeTrajectoryState &trajState, const size_t hitNr, const GlobalPoint &prevHitPos, const GlobalPoint &vtxPos, const PropagatorWithMaterial &propagator)
int getNrValidLayersAlongTraj(const HitInfo &hit1, const HitInfo &hit2, const GlobalPoint &candPos, const GlobalPoint &vprim, const float energy, const int charge)
std::vector< MatchInfo > matchInfo_
FreeTrajectoryState const * freeState(bool withErrors=true) const
T z() const
Definition: PV3DBase.h:64
std::vector< const DetLayer * > compatibleLayers(const DetLayer &detLayer, Args &&...args) const
Returns all layers compatible.
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
std::pair< const_iterator, const_iterator > range
float dPhiPos(size_t hitNr) const
ParameterDescriptionBase * add(U const &iLabel, T const &value)
int subdetId() const
get the contents of the subdetector field (not cast into any detector&#39;s numbering enum) ...
Definition: DetId.h:37
double p2[4]
Definition: TauolaWrapper.h:90
const std::vector< double > dRZMaxLowEtEtaBins_
size_t getNrHitsRequired(const int nrValidLayers) const
const GlobalPoint & pos() const
std::string navSchoolLabel_
Definition: DetId.h:18
const GlobalTrajectoryParameters & globalParameters() const
const T & get() const
Definition: EventSetup.h:56
edm::Handle< MeasurementTrackerEvent > measTkEvt_
static float kElectronMass_
bool passesMatchSel(const HitInfo &hit, const size_t hitNr, const float scEt, const float scEta) const
range recHits() const
TrajectoryStateOnSurface propagate(STA const &state, SUR const &surface) const
Definition: Propagator.h:53
bool isTrackerPixel(const GeomDetEnumerators::SubDetector m)
const TrackingRecHit * hit() const
T eta() const
Definition: PV3DBase.h:76
unsigned int nHits() const
double p1[4]
Definition: TauolaWrapper.h:89
const std::vector< double > dRZMaxLowEt_
TrajSeedMatcher(const edm::ParameterSet &pset)
std::vector< HitInfo > processSeed(const TrajectorySeed &seed, const GlobalPoint &candPos, const GlobalPoint &vprim, const float energy, const int charge)
std::string detLayerGeomLabel_
float dRZNeg(size_t hitNr) const
DetId geographicalId() const
bool isValid() const
Definition: ESHandle.h:47
virtual const DetLayer * idToLayer(const DetId &detId) const
T x() const
Definition: PV3DBase.h:62
std::unique_ptr< PropagatorWithMaterial > backwardPropagator_
bool layerHasValidHits(const DetLayer &layer, const TrajectoryStateOnSurface &hitSurState, const Propagator &propToLayerFromState) const
static float kPhiCut_
*vegas h *****************************************************used in the default bin number in original ***version of VEGAS is ***a higher bin number might help to derive a more precise ***grade subtle point
Definition: invegas.h:5
float dPhiNeg(size_t hitNr) const
const std::vector< unsigned int > minNrHits_