CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
List of all members | Public Member Functions | Static Public Member Functions | Private Types | Private Member Functions | Private Attributes
MultiHitGeneratorFromChi2 Class Referencefinal

#include <MultiHitGeneratorFromChi2.h>

Inheritance diagram for MultiHitGeneratorFromChi2:
MultiHitGeneratorFromPairAndLayers

Public Member Functions

void hitSets (const TrackingRegion &region, OrderedMultiHits &trs, const edm::Event &ev, const edm::EventSetup &es, SeedingLayerSetsHits::SeedingLayerSet pairLayers, std::vector< SeedingLayerSetsHits::SeedingLayer > thirdLayers) override
 
void hitSets (const TrackingRegion &region, OrderedMultiHits &trs, const HitDoublets &doublets, const std::vector< SeedingLayerSetsHits::SeedingLayer > &thirdLayers, LayerCacheType &layerCache, cacheHits &refittedHitStorage)
 
void hitSets (const TrackingRegion &region, OrderedMultiHits &result, const HitDoublets &doublets, const RecHitsSortedInPhi **thirdHitMap, const std::vector< const DetLayer * > &thirdLayerDetLayer, const int nThirdLayers, cacheHits &refittedHitStorage)
 
void hitTriplets (const TrackingRegion &region, OrderedMultiHits &result, const HitDoublets &doublets, const RecHitsSortedInPhi **thirdHitMap, const std::vector< const DetLayer * > &thirdLayerDetLayer, const int nThirdLayers) override
 
void initES (const edm::EventSetup &es) override
 
 MultiHitGeneratorFromChi2 (const edm::ParameterSet &cfg, edm::ConsumesCollector &&iC)
 
 MultiHitGeneratorFromChi2 (const edm::ParameterSet &cfg, edm::ConsumesCollector &)
 
 ~MultiHitGeneratorFromChi2 () override
 
- Public Member Functions inherited from MultiHitGeneratorFromPairAndLayers
void clear ()
 
void init (std::unique_ptr< HitPairGeneratorFromLayerPair > &&pairGenerator, LayerCacheType *layerCache)
 
 MultiHitGeneratorFromPairAndLayers (const edm::ParameterSet &pset)
 
const
HitPairGeneratorFromLayerPair
pairGenerator () const
 
virtual ~MultiHitGeneratorFromPairAndLayers ()
 

Static Public Member Functions

static void fillDescriptions (edm::ParameterSetDescription &desc)
 
static const char * fillDescriptionsLabel ()
 
- Static Public Member Functions inherited from MultiHitGeneratorFromPairAndLayers
static void fillDescriptions (edm::ParameterSetDescription &desc)
 

Private Types

using HitOwnPtr = mayown_ptr< BaseTrackerRecHit >
 
typedef
CombinedMultiHitGenerator::LayerCacheType 
LayerCacheType
 

Private Member Functions

void refit2Hits (HitOwnPtr &hit0, HitOwnPtr &hit1, TrajectoryStateOnSurface &tsos0, TrajectoryStateOnSurface &tsos1, const TrackingRegion &region, float nomField, bool isDebug)
 

Private Attributes

const MagneticFieldbfield
 
TkTransientTrackingRecHitBuilder
const * 
builder
 
std::string builderName_
 
std::vector< double > chi2_cuts
 
bool chi2VsPtCut
 
TkClonerImpl cloner
 
edm::ESGetToken
< ClusterShapeHitFilter,
CkfComponentsRecord
clusterShapeHitFilterESToken_
 
std::vector< int > detIdsToDebug
 
float dphi
 
float extraHitRPhitolerance
 
float extraHitRZtolerance
 
float extraPhiKDBox
 
float extraRKDBox
 
float extraZKDBox
 
const ClusterShapeHitFilterfilter
 
std::string filterName_
 
double fnSigmaRZ
 
edm::ESGetToken< MagneticField,
IdealMagneticFieldRecord
magneticFieldESToken_
 
double maxChi2
 
std::string mfName_
 
float nomField
 
double nSigmaPhi
 
double nSigmaRZ
 
std::vector< double > pt_interv
 
bool refitHits
 
edm::ESGetToken
< TransientTrackingRecHitBuilder,
TransientRecHitRecord
transientTrackingRecHitBuilderESToken_
 
UniformMagneticField ufield = 0.
 
bool useFixedPreFiltering
 
bool useSimpleMF_
 

Additional Inherited Members

- Public Types inherited from MultiHitGeneratorFromPairAndLayers
typedef LayerHitMapCache LayerCacheType
 
- Protected Types inherited from MultiHitGeneratorFromPairAndLayers
using cacheHitPointer = std::unique_ptr< BaseTrackerRecHit >
 
using cacheHits = std::vector< cacheHitPointer >
 
- Protected Attributes inherited from MultiHitGeneratorFromPairAndLayers
cacheHits cache
 
LayerCacheTypetheLayerCache
 
const unsigned int theMaxElement
 
std::unique_ptr
< HitPairGeneratorFromLayerPair
thePairGenerator
 

Detailed Description

Definition at line 36 of file MultiHitGeneratorFromChi2.h.

Member Typedef Documentation

Definition at line 81 of file MultiHitGeneratorFromChi2.h.

Definition at line 37 of file MultiHitGeneratorFromChi2.h.

Constructor & Destructor Documentation

MultiHitGeneratorFromChi2::MultiHitGeneratorFromChi2 ( const edm::ParameterSet cfg,
edm::ConsumesCollector &&  iC 
)
inline

Definition at line 40 of file MultiHitGeneratorFromChi2.h.

41  : MultiHitGeneratorFromChi2(cfg, iC) {}
MultiHitGeneratorFromChi2(const edm::ParameterSet &cfg, edm::ConsumesCollector &&iC)
MultiHitGeneratorFromChi2::MultiHitGeneratorFromChi2 ( const edm::ParameterSet cfg,
edm::ConsumesCollector iC 
)

Definition at line 49 of file MultiHitGeneratorFromChi2.cc.

References bfield, builderName_, chi2_cuts, chi2VsPtCut, clusterShapeHitFilterESToken_, detIdsToDebug, dphi, edm::ConsumesCollector::esConsumes(), edm::ParameterSet::exists(), filter, filterName_, edm::ParameterSet::getParameter(), magneticFieldESToken_, mfName_, nomField, pt_interv, refitHits, AlCaHLTBitMon_QueryRunRegistry::string, transientTrackingRecHitBuilderESToken_, useFixedPreFiltering, and useSimpleMF_.

51  useFixedPreFiltering(cfg.getParameter<bool>("useFixedPreFiltering")),
53  cfg.getParameter<double>("extraHitRZtolerance")), //extra window in ThirdHitRZPrediction range
55  "extraHitRPhitolerance")), //extra window in ThirdHitPredictionFromCircle range (divide by R to get phi)
57  cfg.getParameter<double>("extraZKDBox")), //extra windown in Z when building the KDTree box (used in barrel)
59  cfg.getParameter<double>("extraRKDBox")), //extra windown in R when building the KDTree box (used in endcap)
60  extraPhiKDBox(cfg.getParameter<double>("extraPhiKDBox")), //extra windown in Phi when building the KDTree box
61  fnSigmaRZ(cfg.getParameter<double>(
62  "fnSigmaRZ")), //this multiplies the max hit error on the layer when building the KDTree box
63  chi2VsPtCut(cfg.getParameter<bool>("chi2VsPtCut")),
64  maxChi2(cfg.getParameter<double>("maxChi2")),
65  refitHits(cfg.getParameter<bool>("refitHits")),
66  filterName_(cfg.getParameter<std::string>("ClusterShapeHitFilterName")),
67  builderName_(cfg.existsAs<std::string>("TTRHBuilder") ? cfg.getParameter<std::string>("TTRHBuilder")
68  : std::string("WithTrackAngle")),
69  useSimpleMF_(false),
70  mfName_("") {
72  dphi = cfg.getParameter<double>("phiPreFiltering");
73  if (chi2VsPtCut) {
74  pt_interv = cfg.getParameter<std::vector<double> >("pt_interv");
75  chi2_cuts = cfg.getParameter<std::vector<double> >("chi2_cuts");
76  }
77 #ifdef EDM_ML_DEBUG
78  detIdsToDebug = cfg.getParameter<std::vector<int> >("detIdsToDebug");
79  //if (detIdsToDebug.size()<3) //fixme
80 #else
81  detIdsToDebug.push_back(0);
82  detIdsToDebug.push_back(0);
83  detIdsToDebug.push_back(0);
84 #endif
85  // 2014/02/11 mia:
86  // we should get rid of the boolean parameter useSimpleMF,
87  // and use only a string magneticField [instead of SimpleMagneticField]
88  // or better an edm::ESInputTag (at the moment HLT does not handle ESInputTag)
89  if (cfg.exists("SimpleMagneticField")) {
90  useSimpleMF_ = true;
91  mfName_ = cfg.getParameter<std::string>("SimpleMagneticField");
92  }
93  filter = nullptr;
94  bfield = nullptr;
95  nomField = -1.;
96 
97  if (useSimpleMF_) {
99  } else {
101  }
102  if (refitHits) {
105  }
106 }
bool existsAs(std::string const &parameterName, bool trackiness=true) const
checks if a parameter exists as a given type
Definition: ParameterSet.h:171
const ClusterShapeHitFilter * filter
bool exists(std::string const &parameterName) const
checks if a parameter exists
edm::ESGetToken< TransientTrackingRecHitBuilder, TransientRecHitRecord > transientTrackingRecHitBuilderESToken_
edm::ESGetToken< ClusterShapeHitFilter, CkfComponentsRecord > clusterShapeHitFilterESToken_
MultiHitGeneratorFromPairAndLayers(const edm::ParameterSet &pset)
T getParameter(std::string const &) const
Definition: ParameterSet.h:303
edm::ESGetToken< MagneticField, IdealMagneticFieldRecord > magneticFieldESToken_
MultiHitGeneratorFromChi2::~MultiHitGeneratorFromChi2 ( )
override

Definition at line 108 of file MultiHitGeneratorFromChi2.cc.

108 {}

Member Function Documentation

void MultiHitGeneratorFromChi2::fillDescriptions ( edm::ParameterSetDescription desc)
static

Definition at line 110 of file MultiHitGeneratorFromChi2.cc.

References edm::ParameterSetDescription::add(), MultiHitGeneratorFromPairAndLayers::fillDescriptions(), and AlCaHLTBitMon_QueryRunRegistry::string.

Referenced by MultiHitFromChi2EDProducer::fillDescriptions().

110  {
112 
113  // fixed phi filtering
114  desc.add<bool>("useFixedPreFiltering", false);
115  desc.add<double>("phiPreFiltering", 0.3);
116 
117  // box properties
118  desc.add<double>("extraHitRPhitolerance", 0);
119  desc.add<double>("extraHitRZtolerance", 0);
120  desc.add<double>("extraZKDBox", 0.2);
121  desc.add<double>("extraRKDBox", 0.2);
122  desc.add<double>("extraPhiKDBox", 0.005);
123  desc.add<double>("fnSigmaRZ", 2.0);
124 
125  // refit&filter hits
126  desc.add<bool>("refitHits", true);
127  desc.add<std::string>("ClusterShapeHitFilterName", "ClusterShapeHitFilter");
128  desc.add<std::string>("TTRHBuilder", "WithTrackAngle");
129 
130  // chi2 cuts
131  desc.add<double>("maxChi2", 5.0);
132  desc.add<bool>("chi2VsPtCut", true);
133  desc.add<std::vector<double> >("pt_interv", std::vector<double>{{0.4, 0.7, 1.0, 2.0}});
134  desc.add<std::vector<double> >("chi2_cuts", std::vector<double>{{3.0, 4.0, 5.0, 5.0}});
135 
136  // debugging
137  desc.add<std::vector<int> >("detIdsToDebug", std::vector<int>{{0, 0, 0}});
138 }
ParameterDescriptionBase * add(U const &iLabel, T const &value)
static void fillDescriptions(edm::ParameterSetDescription &desc)
static const char* MultiHitGeneratorFromChi2::fillDescriptionsLabel ( )
inlinestatic

Definition at line 47 of file MultiHitGeneratorFromChi2.h.

Referenced by MultiHitFromChi2EDProducer::fillDescriptions().

47 { return "multiHitFromChi2"; }
void MultiHitGeneratorFromChi2::hitSets ( const TrackingRegion region,
OrderedMultiHits trs,
const edm::Event ev,
const edm::EventSetup es,
SeedingLayerSetsHits::SeedingLayerSet  pairLayers,
std::vector< SeedingLayerSetsHits::SeedingLayer thirdLayers 
)
overridevirtual

Implements MultiHitGeneratorFromPairAndLayers.

Definition at line 165 of file MultiHitGeneratorFromChi2.cc.

References cms::cuda::assert(), MultiHitGeneratorFromPairAndLayers::cache, HLT_FULL_cff::doublets, LogDebug, LogTrace, MultiHitGeneratorFromPairAndLayers::theLayerCache, and MultiHitGeneratorFromPairAndLayers::thePairGenerator.

Referenced by hitSets(), hitTriplets(), and MultiHitFromChi2EDProducer::produce().

170  {
171  LogDebug("MultiHitGeneratorFromChi2") << "pair: " << thePairGenerator->innerLayer(pairLayers).name() << "+"
172  << thePairGenerator->outerLayer(pairLayers).name()
173  << " 3rd lay size: " << thirdLayers.size();
174 
175  auto const& doublets = thePairGenerator->doublets(region, ev, es, pairLayers);
176  LogTrace("MultiHitGeneratorFromChi2") << "";
177  if (doublets.empty()) {
178  // LogDebug("MultiHitGeneratorFromChi2") << "empy pairs";
179  return;
180  }
181 
183  hitSets(region, result, doublets, thirdLayers, *theLayerCache, cache);
184 }
assert(be >=bs)
#define LogTrace(id)
tuple result
Definition: mps_fire.py:311
void hitSets(const TrackingRegion &region, OrderedMultiHits &trs, const edm::Event &ev, const edm::EventSetup &es, SeedingLayerSetsHits::SeedingLayerSet pairLayers, std::vector< SeedingLayerSetsHits::SeedingLayer > thirdLayers) override
std::unique_ptr< HitPairGeneratorFromLayerPair > thePairGenerator
#define LogDebug(id)
void MultiHitGeneratorFromChi2::hitSets ( const TrackingRegion region,
OrderedMultiHits trs,
const HitDoublets doublets,
const std::vector< SeedingLayerSetsHits::SeedingLayer > &  thirdLayers,
LayerCacheType layerCache,
cacheHits refittedHitStorage 
)

Definition at line 186 of file MultiHitGeneratorFromChi2.cc.

References hitSets(), and findQualityFiles::size.

191  {
192  int size = thirdLayers.size();
193  const RecHitsSortedInPhi* thirdHitMap[size];
194  vector<const DetLayer*> thirdLayerDetLayer(size, nullptr);
195  for (int il = 0; il < size; ++il) {
196  thirdHitMap[il] = &layerCache(thirdLayers[il], region);
197 
198  thirdLayerDetLayer[il] = thirdLayers[il].detLayer();
199  }
200  hitSets(region, result, doublets, thirdHitMap, thirdLayerDetLayer, size, refittedHitStorage);
201 }
tuple result
Definition: mps_fire.py:311
void hitSets(const TrackingRegion &region, OrderedMultiHits &trs, const edm::Event &ev, const edm::EventSetup &es, SeedingLayerSetsHits::SeedingLayerSet pairLayers, std::vector< SeedingLayerSetsHits::SeedingLayer > thirdLayers) override
tuple size
Write out results.
void MultiHitGeneratorFromChi2::hitSets ( const TrackingRegion region,
OrderedMultiHits result,
const HitDoublets doublets,
const RecHitsSortedInPhi **  thirdHitMap,
const std::vector< const DetLayer * > &  thirdLayerDetLayer,
const int  nThirdLayers,
cacheHits refittedHitStorage 
)

Definition at line 212 of file MultiHitGeneratorFromChi2.cc.

References RecHitsSortedInPhi::all(), angle(), cms::cuda::assert(), bfield, TrajectoryStateOnSurface::charge(), RZLine::chi2(), HLT_FULL_cff::chi2, chi2_cuts, chi2VsPtCut, cloner, runTheMatrix::const, PixelRecoUtilities::curvature(), ThirdHitPredictionFromCircle::curvature(), declareDynArray, detIdsToDebug, DeadROC_duringRun::dir, dphi, relativeConstraints::empty, mayown_ptr< T, N >::empty(), PV3DBase< T, PVType, FrameType >::eta(), extraHitRPhitolerance, extraHitRZtolerance, extraPhiKDBox, extraRKDBox, extraZKDBox, validate-o2o-wbm::f, filter, fnSigmaRZ, TrajectoryStateOnSurface::globalMomentum(), HitDoublets::gp(), runTauDisplay::gp, hh, HitDoublets::hit(), mps_fire::i, IfLogTrace, HitDoublets::inner, HitDoublets::innerLayer(), RecHitsSortedInPhi::isBarrel, ClusterShapeHitFilter::isCompatible(), edm::isNotFinite(), mayown_ptr< T, N >::isOwn(), GetRecoTauVFromDQM_MC_cff::kk, phase1PixelTopology::layer, geometryCSVtoXML::line, LogTrace, M_PI, SiStripPI::max, maxChi2, gpuPixelDoublets::maxz, gpuPixelDoublets::minz, SiStripMatchedRecHit2D::monoCluster(), SiStripMatchedRecHit2D::monoId(), eostools::move(), nomField, normalizedPhi(), ProjectedSiStripRecHit2D::originalHit(), TrackingRegion::originRBound(), HitDoublets::outer, HitDoublets::outerLayer(), PV3DBase< T, PVType, FrameType >::perp(), ThirdHitPredictionFromCircle::phi(), PV3DBase< T, PVType, FrameType >::phi(), GeometricSearchDet::position(), proxim(), DiDispStaMuonMonitor_cfi::pt, pt_interv, TrackingRegion::ptMin(), CosmicsPD_Skims::radius, refit2Hits(), refitHits, mayown_ptr< T, N >::release(), mayown_ptr< T, N >::reset(), rho, FastCircle::rho(), OrderedMultiHits::size(), HitDoublets::size(), SiStripMatchedRecHit2D::stereoCluster(), SiStripMatchedRecHit2D::stereoId(), MultiHitGeneratorFromPairAndLayers::theMaxElement, SiStripDetId::TIB, SiStripDetId::TID, Geom::twoPi(), ufield, useFixedPreFiltering, and PV3DBase< T, PVType, FrameType >::z().

218  {
219 #ifdef EDM_ML_DEBUG
220  unsigned int debug_Id0 = detIdsToDebug[0];
221  unsigned int debug_Id1 = detIdsToDebug[1];
222  unsigned int debug_Id2 = detIdsToDebug[2];
223 #endif
224 
225  std::array<bool, 3> bl;
226  bl[0] = doublets.innerLayer().isBarrel;
227  bl[1] = doublets.outerLayer().isBarrel;
228 
229  //gc: these are all the layers compatible with the layer pairs (as defined in the config file)
230 
231  //gc: initialize a KDTree per each 3rd layer
232  std::vector<KDTreeNodeInfo<RecHitsSortedInPhi::HitIter, 2> > layerTree; // re-used throughout
233  std::vector<RecHitsSortedInPhi::HitIter> foundNodes; // re-used thoughout
234  foundNodes.reserve(100);
236  declareDynArray(LayerRZPredictions, nThirdLayers, mapPred);
237  float rzError[nThirdLayers]; //save maximum errors
238 
239  const float maxDelphi = region.ptMin() < 0.3f ? float(M_PI) / 4.f : float(M_PI) / 8.f; // FIXME move to config??
240  const float maxphi = M_PI + maxDelphi, minphi = -maxphi; // increase to cater for any range
241  const float safePhi = M_PI - maxDelphi; // sideband
242 
243  //gc: loop over each layer
244  for (int il = 0; il < nThirdLayers; il++) {
245  LogTrace("MultiHitGeneratorFromChi2")
246  << "considering third layer: with hits: " << thirdHitMap[il]->all().second - thirdHitMap[il]->all().first;
247  const DetLayer* layer = thirdLayerDetLayer[il];
248  LayerRZPredictions& predRZ = mapPred[il];
249  predRZ.line.initLayer(layer);
250  predRZ.line.initTolerance(extraHitRZtolerance);
251 
252  //gc: now we take all hits in the layer and fill the KDTree
253  auto const& layer3 = *thirdHitMap[il]; // Get iterators
254  layerTree.clear();
255  float minz = 999999.0f, maxz = -minz; // Initialise to extreme values in case no hits
256  float maxErr = 0.0f;
257  if (!layer3.empty()) {
258  minz = layer3.v[0];
259  maxz = minz; //In case there's only one hit on the layer
260  for (auto i = 0U; i < layer3.size(); ++i) {
261  auto hi = layer3.theHits.begin() + i;
262  auto angle = layer3.phi(i);
263  auto myz = layer3.v[i];
264 #ifdef EDM_ML_DEBUG
265  IfLogTrace(hi->hit()->rawId() == debug_Id2, "MultiHitGeneratorFromChi2")
266  << "filling KDTree with hit in id=" << debug_Id2 << " with pos: " << hi->hit()->globalPosition()
267  << " phi=" << hi->hit()->globalPosition().phi() << " z=" << hi->hit()->globalPosition().z()
268  << " r=" << hi->hit()->globalPosition().perp();
269 #endif
270  //use (phi,r) for endcaps rather than (phi,z)
271  if (myz < minz) {
272  minz = myz;
273  } else {
274  if (myz > maxz) {
275  maxz = myz;
276  }
277  }
278  auto myerr = layer3.dv[i];
279  if (myerr > maxErr) {
280  maxErr = myerr;
281  }
282  layerTree.push_back(KDTreeNodeInfo<RecHitsSortedInPhi::HitIter, 2>(hi, angle, myz)); // save it
283  // populate side-bands
284  if (angle > safePhi)
285  layerTree.push_back(
287  else if (angle < -safePhi)
288  layerTree.push_back(
290  }
291  }
292  KDTreeBox phiZ(minphi, maxphi, minz - 0.01f, maxz + 0.01f); // declare our bounds
293  //add fudge factors in case only one hit and also for floating-point inaccuracy
294  hitTree[il].build(layerTree, phiZ); // make KDtree
295  rzError[il] = maxErr; //save error
296  }
297  //gc: now we have initialized the KDTrees and we are out of the layer loop
298 
299  //gc: this sets the minPt of the triplet
300  auto curv = PixelRecoUtilities::curvature(1. / region.ptMin(), *bfield);
301 
302  LogTrace("MultiHitGeneratorFromChi2") << "doublet size=" << doublets.size() << std::endl;
303 
304  //fixme add pixels
305  auto filterHit = [&](TrackingRecHit const* hit, GlobalVector const& dir) -> bool {
306  auto hh = reinterpret_cast<BaseTrackerRecHit const*>(hit);
307  if ( //hh->geographicalId().subdetId() > 2
308  hh->geographicalId().subdetId() == SiStripDetId::TIB || hh->geographicalId().subdetId() == SiStripDetId::TID
309  //|| hh->geographicalId().subdetId()==SiStripDetId::TOB
310  //|| hh->geographicalId().subdetId()==SiStripDetId::TEC
311  ) {
312  // carefull " for matched and projected local of tsos != local for individual clusters...
313  if (hh->isMatched()) {
314  const SiStripMatchedRecHit2D* matchedHit = reinterpret_cast<const SiStripMatchedRecHit2D*>(hh);
315  if (filter->isCompatible(DetId(matchedHit->monoId()), matchedHit->monoCluster(), dir) == 0 ||
316  filter->isCompatible(DetId(matchedHit->stereoId()), matchedHit->stereoCluster(), dir) == 0)
317  return false;
318  } else if (hh->isProjected()) {
319  const ProjectedSiStripRecHit2D* precHit = reinterpret_cast<const ProjectedSiStripRecHit2D*>(hh);
320  if (filter->isCompatible(precHit->originalHit(), dir) == 0)
321  return false; //FIXME??
322  } else if (hh->isSingle()) {
323  const SiStripRecHit2D* recHit = reinterpret_cast<const SiStripRecHit2D*>(hh);
324  if (filter->isCompatible(*recHit, dir) == 0)
325  return false;
326  }
327  }
328  return true;
329  };
330 
331  //gc: now we loop over all pairs
332  for (std::size_t ip = 0; ip != doublets.size(); ip++) {
333  int foundTripletsFromPair = 0;
334  bool usePair = false;
335  cacheHitPointer bestH2;
336  float minChi2 = std::numeric_limits<float>::max();
337 
340 
341  HitOwnPtr hit0(*oriHit0);
342  HitOwnPtr hit1(*oriHit1);
343  GlobalPoint gp0 = doublets.gp(ip, HitDoublets::inner);
344  GlobalPoint gp1 = doublets.gp(ip, HitDoublets::outer);
345 
346 #ifdef EDM_ML_DEBUG
347  bool debugPair = oriHit0->rawId() == debug_Id0 && oriHit1->rawId() == debug_Id1;
348 #endif
349  IfLogTrace(debugPair, "MultiHitGeneratorFromChi2") << endl
350  << endl
351  << "found new pair with ids " << oriHit0->rawId() << " "
352  << oriHit1->rawId() << " with pos: " << gp0 << " " << gp1;
353 
354  if (refitHits) {
355  TrajectoryStateOnSurface tsos0, tsos1;
356  assert(!hit0.isOwn());
357  assert(!hit1.isOwn());
358 #ifdef EDM_ML_DEBUG
359  refit2Hits(hit0, hit1, tsos0, tsos1, region, nomField, debugPair);
360 #else
361  refit2Hits(hit0, hit1, tsos0, tsos1, region, nomField, false);
362 #endif
363 
364  bool passFilterHit0 = filterHit(hit0->hit(), tsos0.globalMomentum());
365  IfLogTrace(debugPair && !passFilterHit0, "MultiHitGeneratorFromChi2") << "hit0 did not pass cluster shape filter";
366  if (!passFilterHit0)
367  continue;
368  bool passFilterHit1 = filterHit(hit1->hit(), tsos1.globalMomentum());
369  IfLogTrace(debugPair && !passFilterHit1, "MultiHitGeneratorFromChi2") << "hit1 did not pass cluster shape filter";
370  if (!passFilterHit1)
371  continue;
372  // refit hits
373  hit0.reset((SeedingHitSet::RecHitPointer)(cloner(*hit0, tsos0)));
374  hit1.reset((SeedingHitSet::RecHitPointer)(cloner(*hit1, tsos1)));
375 
376 #ifdef EDM_ML_DEBUG
377  IfLogTrace(debugPair, "MultiHitGeneratorFromChi2")
378  << "charge=" << tsos0.charge() << std::endl
379  << "state1 pt=" << tsos0.globalMomentum().perp() << " eta=" << tsos0.globalMomentum().eta()
380  << " phi=" << tsos0.globalMomentum().phi() << std::endl
381  << "state2 pt=" << tsos1.globalMomentum().perp() << " eta=" << tsos1.globalMomentum().eta()
382  << " phi=" << tsos1.globalMomentum().phi() << std::endl
383  << "positions after refitting: " << hit0->globalPosition() << " " << hit1->globalPosition();
384 #endif
385  } else {
386  // not refit clone anyhow
387  hit0.reset((BaseTrackerRecHit*)hit0->clone());
388  hit1.reset((BaseTrackerRecHit*)hit1->clone());
389  }
390 
391  assert(hit0.isOwn());
392  assert(hit1.isOwn());
393 
394  //gc: create the RZ line for the pair
395  SimpleLineRZ line(PixelRecoPointRZ(gp0.perp(), gp0.z()), PixelRecoPointRZ(gp1.perp(), gp1.z()));
396  ThirdHitPredictionFromCircle predictionRPhi(gp0, gp1, extraHitRPhitolerance);
397 
398  auto toPos = std::signbit(gp1.z() - gp0.z());
399 
400  //gc: this is the curvature of the two hits assuming the region
401  Range pairCurvature = predictionRPhi.curvature(region.originRBound());
402  //gc: intersect not only returns a bool but may change pairCurvature to intersection with curv
403  if (!intersect(pairCurvature, Range(-curv, curv))) {
404  IfLogTrace(debugPair, "MultiHitGeneratorFromChi2")
405  << "curvature cut: curv=" << curv << " gc=(" << pairCurvature.first << ", " << pairCurvature.second << ")";
406  continue;
407  }
408 
409  std::array<GlobalPoint, 3> gp;
410  std::array<GlobalError, 3> ge;
411  gp[0] = hit0->globalPosition();
412  ge[0] = hit0->globalPositionError();
413  gp[1] = hit1->globalPosition();
414  ge[1] = hit1->globalPositionError();
415 
416  //gc: loop over all third layers compatible with the pair
417  for (int il = 0; (il < nThirdLayers) & (!usePair); il++) {
418  IfLogTrace(debugPair, "MultiHitGeneratorFromChi2")
419  << "cosider layer:"
420  << " for this pair. Location: " << thirdLayerDetLayer[il]->location();
421 
422  if (hitTree[il].empty()) {
423  IfLogTrace(debugPair, "MultiHitGeneratorFromChi2") << "empty hitTree";
424  continue; // Don't bother if no hits
425  }
426 
427  cacheHitPointer bestL2;
428  float chi2FromThisLayer = std::numeric_limits<float>::max();
429 
430  const DetLayer* layer = thirdLayerDetLayer[il];
431  // bool barrelLayer = layer->location() == GeomDetEnumerators::barrel;
432  auto const& layer3 = *thirdHitMap[il];
433  bool barrelLayer = layer3.isBarrel;
434  bl[2] = layer3.isBarrel;
435 
436  if ((!barrelLayer) & (toPos != std::signbit(layer->position().z())))
437  continue;
438 
439  LayerRZPredictions& predRZ = mapPred[il];
440  predRZ.line.initPropagator(&line);
441 
442  //gc: this takes the z at R-thick/2 and R+thick/2 according to
443  // the line from the two points and the adds the extra tolerance
444  Range rzRange = predRZ.line();
445 
446  if (rzRange.first >= rzRange.second) {
447  IfLogTrace(debugPair, "MultiHitGeneratorFromChi2") << "rzRange empty";
448  continue;
449  }
450  //gc: check that rzRange is compatible with detector bounds
451  // note that intersect may change rzRange to intersection with bounds
452  if (!intersect(rzRange, predRZ.line.detSize())) { // theDetSize = Range(-maxZ, maxZ);
453  IfLogTrace(debugPair, "MultiHitGeneratorFromChi2") << "rzRange and detector do not intersect";
454  continue;
455  }
456  Range radius = barrelLayer ? predRZ.line.detRange() : rzRange;
457 
458  //gc: define the phi range of the hits
459  Range phiRange;
460  if (useFixedPreFiltering) {
461  //gc: in this case it takes as range the phi of the outer
462  // hit +/- the phiPreFiltering value from cfg
463  float phi0 = oriHit0->globalPosition().phi();
464  phiRange = Range(phi0 - dphi, phi0 + dphi);
465  } else {
466  //gc: predictionRPhi uses the cosine rule to find the phi of the 3rd point at radius, assuming the pairCurvature range [-c,+c]
467  if (pairCurvature.first < 0. && pairCurvature.second < 0.) {
468  radius.swap();
469  } else if (pairCurvature.first >= 0. && pairCurvature.second >= 0.) {
470  ;
471  } else {
472  radius.first = radius.second;
473  }
474  auto phi12 = predictionRPhi.phi(pairCurvature.first, radius.first);
475  auto phi22 = predictionRPhi.phi(pairCurvature.second, radius.second);
476  phi12 = normalizedPhi(phi12);
477  phi22 = proxim(phi22, phi12);
478  phiRange = Range(phi12, phi22);
479  phiRange.sort();
480  }
481 
482  float prmin = phiRange.min(), prmax = phiRange.max();
483 
484  if (prmax - prmin > maxDelphi) {
485  auto prm = phiRange.mean();
486  prmin = prm - 0.5f * maxDelphi;
487  prmax = prm + 0.5f * maxDelphi;
488  }
489 
490  //gc: this is the place where hits in the compatible region are put in the foundNodes
492  foundNodes.clear(); // Now recover hits in bounding box...
493 
494  IfLogTrace(debugPair, "MultiHitGeneratorFromChi2") << "defining kd tree box";
495 
496  if (barrelLayer) {
497  KDTreeBox phiZ(prmin - extraPhiKDBox,
498  prmax + extraPhiKDBox,
499  float(rzRange.min() - fnSigmaRZ * rzError[il] - extraZKDBox),
500  float(rzRange.max() + fnSigmaRZ * rzError[il] + extraZKDBox));
501  hitTree[il].search(phiZ, foundNodes);
502 
503  IfLogTrace(debugPair, "MultiHitGeneratorFromChi2")
504  << "kd tree box bounds, phi: " << prmin - extraPhiKDBox << "," << prmax + extraPhiKDBox
505  << " z: " << rzRange.min() - fnSigmaRZ * rzError[il] - extraZKDBox << ","
506  << rzRange.max() + fnSigmaRZ * rzError[il] + extraZKDBox << " rzRange: " << rzRange.min() << ","
507  << rzRange.max();
508 
509  } else {
510  KDTreeBox phiR(prmin - extraPhiKDBox,
511  prmax + extraPhiKDBox,
512  float(rzRange.min() - fnSigmaRZ * rzError[il] - extraRKDBox),
513  float(rzRange.max() + fnSigmaRZ * rzError[il] + extraRKDBox));
514  hitTree[il].search(phiR, foundNodes);
515 
516  IfLogTrace(debugPair, "MultiHitGeneratorFromChi2")
517  << "kd tree box bounds, phi: " << prmin - extraPhiKDBox << "," << prmax + extraPhiKDBox
518  << " r: " << rzRange.min() - fnSigmaRZ * rzError[il] - extraRKDBox << ","
519  << rzRange.max() + fnSigmaRZ * rzError[il] + extraRKDBox << " rzRange: " << rzRange.min() << ","
520  << rzRange.max();
521  }
522 
523  IfLogTrace(debugPair, "MultiHitGeneratorFromChi2") << "kd tree box size: " << foundNodes.size();
524 
525  //gc: now we loop over the hits in the box for this layer
526  for (std::vector<RecHitsSortedInPhi::HitIter>::iterator ih = foundNodes.begin();
527  ih != foundNodes.end() && !usePair;
528  ++ih) {
529  IfLogTrace(debugPair, "MultiHitGeneratorFromChi2") << endl << "triplet candidate";
530 
531  const RecHitsSortedInPhi::HitIter KDdata = *ih;
532 
533  auto oriHit2 = KDdata->hit();
534  auto kk = KDdata - layer3.theHits.begin();
535  cacheHitPointer hit2;
536  auto gp2 = layer3.gp(kk);
537  if (refitHits) { //fixme
538 
539  //fitting all 3 hits takes too much time... do it quickly only for 3rd hit
540  GlobalVector initMomentum(gp2 - gp1);
541  initMomentum /= initMomentum.perp(); //set pT=1
542 
543  //fixme add pixels
544  bool passFilterHit2 = filterHit(oriHit2->hit(), initMomentum);
545  if (!passFilterHit2)
546  continue;
548  *oriHit2->surface());
549  hit2.reset((SeedingHitSet::RecHitPointer)(cloner(*oriHit2, state)));
550 
551  } else {
552  // not refit clone anyhow
553  hit2.reset((BaseTrackerRecHit*)oriHit2->clone());
554  }
555 
556  //gc: add the chi2 cut
557  gp[2] = hit2->globalPosition();
558  ge[2] = hit2->globalPositionError();
559  RZLine rzLine(gp, ge, bl);
560  float chi2 = rzLine.chi2();
561 
562 #ifdef EDM_ML_DEBUG
563  bool debugTriplet = debugPair && hit2->rawId() == debug_Id2;
564 #endif
565  IfLogTrace(debugTriplet, "MultiHitGeneratorFromChi2")
566  << endl
567  << "triplet candidate in debug id" << std::endl
568  << "hit in id=" << hit2->rawId() << " (from KDTree) with pos: " << KDdata->hit()->globalPosition()
569  << " refitted: " << hit2->globalPosition() << " chi2: " << chi2;
570  // should fix nan
571  if ((chi2 > maxChi2) | edm::isNotFinite(chi2))
572  continue;
573 
574  if (chi2VsPtCut) {
575  FastCircle theCircle(gp[2], gp[1], gp[0]);
576  float tesla0 = 0.1f * nomField;
577  float rho = theCircle.rho();
578  float cm2GeV = 0.01f * 0.3f * tesla0;
579  float pt = cm2GeV * rho;
580  IfLogTrace(debugTriplet, "MultiHitGeneratorFromChi2") << "triplet pT=" << pt;
581  if (pt < region.ptMin())
582  continue;
583 
584  if (chi2_cuts.size() == 4) {
585  if ((pt > pt_interv[0] && pt <= pt_interv[1] && chi2 > chi2_cuts[0]) ||
586  (pt > pt_interv[1] && pt <= pt_interv[2] && chi2 > chi2_cuts[1]) ||
587  (pt > pt_interv[2] && pt <= pt_interv[3] && chi2 > chi2_cuts[2]) ||
588  (pt > pt_interv[3] && chi2 > chi2_cuts[3]))
589  continue;
590  }
591 
592  // apparently this takes too much time...
593  // if (chi2_cuts.size()>1) {
594  // int ncuts = chi2_cuts.size();
595  // if ( pt<=pt_interv[0] && chi2 > chi2_cuts[0] ) continue;
596  // bool pass = true;
597  // for (int icut=1; icut<ncuts-1; icut++){
598  // if ( pt>pt_interv[icut-1] && pt<=pt_interv[icut] && chi2 > chi2_cuts[icut] ) pass=false;
599  // }
600  // if (!pass) continue;
601  // if ( pt>pt_interv[ncuts-2] && chi2 > chi2_cuts[ncuts-1] ) continue;
602  // if (hit0->rawId()==debug_Id0 && hit1->rawId()==debug_Id1 && hit2->rawId()==debug_Id2) {
603  // LogTrace("MultiHitGeneratorFromChi2") << "triplet passed chi2 vs pt cut" << std::endl;
604  // }
605  // }
606  }
607 
608  if (theMaxElement != 0 && result.size() >= theMaxElement) {
609  result.clear();
610  edm::LogError("TooManyTriplets") << " number of triples exceed maximum. no triplets produced.";
611  return;
612  }
613  IfLogTrace(debugPair, "MultiHitGeneratorFromChi2") << "triplet made";
614  //result.push_back(SeedingHitSet(hit0, hit1, hit2));
615  /* no refit so keep only hit2
616  assert(tripletFromThisLayer.empty());
617  assert(hit0.isOwn()); assert(hit1.isOwn());assert(hit2.isOwn());
618  tripletFromThisLayer.emplace_back(std::move(hit0));
619  tripletFromThisLayer.emplace_back(std::move(hit1));
620  tripletFromThisLayer.emplace_back(std::move(hit2));
621  assert(hit0.isEmpty()); assert(hit1.isEmpty());assert(hit2.isEmpty());
622  */
623  bestL2 = std::move(hit2);
624  chi2FromThisLayer = chi2;
625  foundTripletsFromPair++;
626  if (foundTripletsFromPair >= 2) {
627  usePair = true;
628  IfLogTrace(debugPair, "MultiHitGeneratorFromChi2") << "using pair";
629  break;
630  }
631  } //loop over hits in KDTree
632 
633  if (usePair)
634  break;
635  else {
636  //if there is one triplet in more than one layer, try picking the one with best chi2
637  if (chi2FromThisLayer < minChi2) {
638  bestH2 = std::move(bestL2);
639  minChi2 = chi2FromThisLayer;
640  }
641  /*
642  else {
643  if (!bestH2 && foundTripletsFromPair>0)
644  LogTrace("MultiHitGeneratorFromChi2") << "what?? " << minChi2 << ' ' << chi2FromThisLayer;
645  }
646  */
647  }
648 
649  } //loop over layers
650 
651  if (foundTripletsFromPair == 0)
652  continue;
653 
654  //push back only (max) once per pair
655  IfLogTrace(debugPair, "MultiHitGeneratorFromChi2") << "Done seed #" << result.size();
656  if (usePair)
657  result.push_back(SeedingHitSet(oriHit0, oriHit1));
658  else {
659  assert(1 == foundTripletsFromPair);
660  assert(bestH2);
661  result.emplace_back(&*hit0, &*hit1, &*bestH2);
662  assert(hit0.isOwn());
663  assert(hit1.isOwn());
664  refittedHitStorage.emplace_back(const_cast<BaseTrackerRecHit*>(hit0.release()));
665  refittedHitStorage.emplace_back(const_cast<BaseTrackerRecHit*>(hit1.release()));
666  refittedHitStorage.emplace_back(std::move(bestH2));
667  assert(hit0.empty());
668  assert(hit1.empty());
669  assert(!bestH2);
670  }
671  // LogTrace("MultiHitGeneratorFromChi2") << (usePair ? "pair " : "triplet ") << minChi2 <<' ' << refittedHitStorage.size();
672 
673  } //loop over pairs
674  LogTrace("MultiHitGeneratorFromChi2") << "triplet size=" << result.size();
675  // std::cout << "MultiHitGeneratorFromChi2 " << "triplet size=" << result.size() << std::endl;
676 }
float originRBound() const
bounds the particle vertex in the transverse plane
unsigned int size() const override
std::size_t size() const
unsigned int stereoId() const
T perp() const
Definition: PV3DBase.h:69
std::unique_ptr< BaseTrackerRecHit > cacheHitPointer
HitLayer const & innerLayer() const
#define IfLogTrace(cond, cat)
constexpr bool isNotFinite(T x)
Definition: isFinite.h:9
PixelRecoRange< float > Range
static constexpr auto TID
Definition: SiStripDetId.h:38
SiStripCluster const & monoCluster() const
const ClusterShapeHitFilter * filter
constexpr T normalizedPhi(T phi)
Definition: normalizedPhi.h:8
Geom::Phi< T > phi() const
Definition: PV3DBase.h:66
Log< level::Error, false > LogError
assert(be >=bs)
T curvature(T InversePt, const MagneticField &field)
#define LogTrace(id)
constexpr T proxim(T b, T a)
Definition: normalizedPhi.h:14
constexpr std::array< uint8_t, layerIndexSize > layer
__constant__ float const minz[nPairs]
HitLayer const & outerLayer() const
BaseTrackerRecHit const * ConstRecHitPointer
Definition: SeedingHitSet.h:10
std::vector< HitWithPhi >::const_iterator HitIter
T z() const
Definition: PV3DBase.h:61
def move
Definition: eostools.py:511
GlobalPoint gp(int i, layer l) const
BaseTrackerRecHit const * Hit
#define M_PI
Definition: RZLine.h:12
SiStripRecHit2D originalHit() const
Definition: DetId.h:17
__constant__ float const maxz[nPairs]
virtual const Surface::PositionType & position() const
Returns position of the surface.
float ptMin() const
minimal pt of interest
static constexpr auto TIB
Definition: SiStripDetId.h:37
T eta() const
Definition: PV3DBase.h:73
mayown_ptr< BaseTrackerRecHit > HitOwnPtr
Hit const & hit(int i, layer l) const
SiStripCluster const & stereoCluster() const
bool isCompatible(const SiPixelRecHit &recHit, const LocalVector &ldir, const SiPixelClusterShapeCache &clusterShapeCache, PixelData const *pd=nullptr) const
GlobalVector globalMomentum() const
#define declareDynArray(T, n, x)
Definition: DynArray.h:91
unsigned int monoId() const
constexpr double twoPi()
Definition: Pi.h:32
auto const & hh
void refit2Hits(HitOwnPtr &hit0, HitOwnPtr &hit1, TrajectoryStateOnSurface &tsos0, TrajectoryStateOnSurface &tsos1, const TrackingRegion &region, float nomField, bool isDebug)
T angle(T x1, T y1, T z1, T x2, T y2, T z2)
Definition: angle.h:11
void MultiHitGeneratorFromChi2::hitTriplets ( const TrackingRegion region,
OrderedMultiHits result,
const HitDoublets doublets,
const RecHitsSortedInPhi **  thirdHitMap,
const std::vector< const DetLayer * > &  thirdLayerDetLayer,
const int  nThirdLayers 
)
overridevirtual

Implements MultiHitGeneratorFromPairAndLayers.

Definition at line 203 of file MultiHitGeneratorFromChi2.cc.

References MultiHitGeneratorFromPairAndLayers::cache, and hitSets().

208  {
209  hitSets(region, result, doublets, thirdHitMap, thirdLayerDetLayer, nThirdLayers, cache);
210 }
void hitSets(const TrackingRegion &region, OrderedMultiHits &trs, const edm::Event &ev, const edm::EventSetup &es, SeedingLayerSetsHits::SeedingLayerSet pairLayers, std::vector< SeedingLayerSetsHits::SeedingLayer > thirdLayers) override
void MultiHitGeneratorFromChi2::initES ( const edm::EventSetup es)
overridevirtual

Implements MultiHitGeneratorFromPairAndLayers.

Definition at line 140 of file MultiHitGeneratorFromChi2.cc.

References bfield, builder, cloner, clusterShapeHitFilterESToken_, filter, edm::EventSetup::getData(), magneticFieldESToken_, nomField, MagneticField::nominalValue(), refitHits, UniformMagneticField::set(), transientTrackingRecHitBuilderESToken_, and ufield.

Referenced by MultiHitFromChi2EDProducer::produce().

140  {
143  ufield.set(nomField); // more than enough (never actually used)
144 
145  if (refitHits) {
147  auto const& builderRef = es.getData(transientTrackingRecHitBuilderESToken_);
148  builder = (TkTransientTrackingRecHitBuilder const*)(&builderRef);
149  cloner = (*builder).cloner();
150  }
151 }
int nominalValue() const
The nominal field value for this map in kGauss.
Definition: MagneticField.h:49
TkTransientTrackingRecHitBuilder const * builder
const ClusterShapeHitFilter * filter
edm::ESGetToken< TransientTrackingRecHitBuilder, TransientRecHitRecord > transientTrackingRecHitBuilderESToken_
bool getData(T &iHolder) const
Definition: EventSetup.h:128
edm::ESGetToken< ClusterShapeHitFilter, CkfComponentsRecord > clusterShapeHitFilterESToken_
void set(GlobalVector value)
edm::ESGetToken< MagneticField, IdealMagneticFieldRecord > magneticFieldESToken_
void MultiHitGeneratorFromChi2::refit2Hits ( HitOwnPtr hit0,
HitOwnPtr hit1,
TrajectoryStateOnSurface tsos0,
TrajectoryStateOnSurface tsos1,
const TrackingRegion region,
float  nomField,
bool  isDebug 
)
private

Definition at line 678 of file MultiHitGeneratorFromChi2.cc.

References IfLogTrace, nomField, TrackingRegion::origin(), fireworks::p1, fireworks::p2, PV3DBase< T, PVType, FrameType >::perp(), DiDispStaMuonMonitor_cfi::pt, submitPVResolutionJobs::q, rho, FastCircle::rho(), edm::swap(), ufield, PV3DBase< T, PVType, FrameType >::x(), FastCircle::x0(), y, PV3DBase< T, PVType, FrameType >::y(), FastCircle::y0(), PV3DBase< T, PVType, FrameType >::z(), and gpuVertexFinder::zv.

Referenced by hitSets().

684  {
685  //these need to be sorted in R
686  const GlobalPoint& gp0 = region.origin();
687  GlobalPoint gp1 = hit1->globalPosition();
688  GlobalPoint gp2 = hit2->globalPosition();
689 
690  IfLogTrace(isDebug, "MultiHitGeneratorFromChi2")
691  << "positions before refitting: " << hit1->globalPosition() << " " << hit2->globalPosition();
692 
693  FastCircle theCircle(gp2, gp1, gp0);
694  GlobalPoint cc(theCircle.x0(), theCircle.y0(), 0);
695  float tesla0 = 0.1f * nomField;
696  float rho = theCircle.rho();
697  float cm2GeV = 0.01f * 0.3f * tesla0;
698  float pt = cm2GeV * rho;
699 
700  GlobalVector vec20 = gp2 - gp0;
701  //if (isDebug) { cout << "vec20.eta=" << vec20.eta() << endl; }
702 
703  GlobalVector p0(gp0.y() - cc.y(), -gp0.x() + cc.x(), 0.);
704  p0 = p0 * pt / p0.perp();
705  GlobalVector p1(gp1.y() - cc.y(), -gp1.x() + cc.x(), 0.);
706  p1 = p1 * pt / p1.perp();
707  GlobalVector p2(gp2.y() - cc.y(), -gp2.x() + cc.x(), 0.);
708  p2 = p2 * pt / p2.perp();
709 
710  //check sign according to scalar product
711  if ((p0.x() * (gp1.x() - gp0.x()) + p0.y() * (gp1.y() - gp0.y())) < 0) {
712  p0 *= -1.;
713  p1 *= -1.;
714  p2 *= -1.;
715  }
716 
717  //now set z component
718  auto zv = vec20.z() / vec20.perp();
719  p0 = GlobalVector(p0.x(), p0.y(), p0.perp() * zv);
720  p1 = GlobalVector(p1.x(), p1.y(), p1.perp() * zv);
721  p2 = GlobalVector(p2.x(), p2.y(), p2.perp() * zv);
722 
723  //get charge from vectorial product
724  TrackCharge q = 1;
725  if ((gp1 - cc).x() * p1.y() - (gp1 - cc).y() * p1.x() > 0)
726  q = -q;
727 
728  TrajectoryStateOnSurface(GlobalTrajectoryParameters(gp1, p1, q, &ufield), *hit1->surface()).swap(state1);
729  // hit1.reset((SeedingHitSet::RecHitPointer)(cloner(*hit1,state1)));
730 
731  TrajectoryStateOnSurface(GlobalTrajectoryParameters(gp2, p2, q, &ufield), *hit2->surface()).swap(state2);
732  // hit2.reset((SeedingHitSet::RecHitPointer)(cloner(*hit2,state2)));
733 }
T perp() const
Definition: PV3DBase.h:69
GlobalPoint const & origin() const
const TString p2
Definition: fwPaths.cc:13
#define IfLogTrace(cond, cat)
float *__restrict__ zv
T y() const
Definition: PV3DBase.h:60
void swap(Association< C > &lhs, Association< C > &rhs)
Definition: Association.h:117
int TrackCharge
Definition: TrackCharge.h:4
T z() const
Definition: PV3DBase.h:61
const TString p1
Definition: fwPaths.cc:12
T x() const
Definition: PV3DBase.h:59
Global3DVector GlobalVector
Definition: GlobalVector.h:10

Member Data Documentation

const MagneticField* MultiHitGeneratorFromChi2::bfield
private

Definition at line 111 of file MultiHitGeneratorFromChi2.h.

Referenced by hitSets(), initES(), and MultiHitGeneratorFromChi2().

TkTransientTrackingRecHitBuilder const* MultiHitGeneratorFromChi2::builder
private

Definition at line 101 of file MultiHitGeneratorFromChi2.h.

Referenced by initES().

std::string MultiHitGeneratorFromChi2::builderName_
private

Definition at line 121 of file MultiHitGeneratorFromChi2.h.

Referenced by MultiHitGeneratorFromChi2().

std::vector<double> MultiHitGeneratorFromChi2::chi2_cuts
private

Definition at line 118 of file MultiHitGeneratorFromChi2.h.

Referenced by hitSets(), and MultiHitGeneratorFromChi2().

bool MultiHitGeneratorFromChi2::chi2VsPtCut
private

Definition at line 115 of file MultiHitGeneratorFromChi2.h.

Referenced by hitSets(), and MultiHitGeneratorFromChi2().

TkClonerImpl MultiHitGeneratorFromChi2::cloner
private

Definition at line 102 of file MultiHitGeneratorFromChi2.h.

Referenced by hitSets(), and initES().

edm::ESGetToken<ClusterShapeHitFilter, CkfComponentsRecord> MultiHitGeneratorFromChi2::clusterShapeHitFilterESToken_
private

Definition at line 129 of file MultiHitGeneratorFromChi2.h.

Referenced by initES(), and MultiHitGeneratorFromChi2().

std::vector<int> MultiHitGeneratorFromChi2::detIdsToDebug
private

Definition at line 126 of file MultiHitGeneratorFromChi2.h.

Referenced by hitSets(), and MultiHitGeneratorFromChi2().

float MultiHitGeneratorFromChi2::dphi
private

Definition at line 110 of file MultiHitGeneratorFromChi2.h.

Referenced by hitSets(), and MultiHitGeneratorFromChi2().

float MultiHitGeneratorFromChi2::extraHitRPhitolerance
private

Definition at line 106 of file MultiHitGeneratorFromChi2.h.

Referenced by hitSets().

float MultiHitGeneratorFromChi2::extraHitRZtolerance
private

Definition at line 105 of file MultiHitGeneratorFromChi2.h.

Referenced by hitSets().

float MultiHitGeneratorFromChi2::extraPhiKDBox
private

Definition at line 109 of file MultiHitGeneratorFromChi2.h.

Referenced by hitSets().

float MultiHitGeneratorFromChi2::extraRKDBox
private

Definition at line 108 of file MultiHitGeneratorFromChi2.h.

Referenced by hitSets().

float MultiHitGeneratorFromChi2::extraZKDBox
private

Definition at line 107 of file MultiHitGeneratorFromChi2.h.

Referenced by hitSets().

const ClusterShapeHitFilter* MultiHitGeneratorFromChi2::filter
private

Definition at line 100 of file MultiHitGeneratorFromChi2.h.

Referenced by hitSets(), initES(), and MultiHitGeneratorFromChi2().

std::string MultiHitGeneratorFromChi2::filterName_
private

Definition at line 120 of file MultiHitGeneratorFromChi2.h.

Referenced by MultiHitGeneratorFromChi2().

double MultiHitGeneratorFromChi2::fnSigmaRZ
private

Definition at line 114 of file MultiHitGeneratorFromChi2.h.

Referenced by hitSets().

edm::ESGetToken<MagneticField, IdealMagneticFieldRecord> MultiHitGeneratorFromChi2::magneticFieldESToken_
private

Definition at line 128 of file MultiHitGeneratorFromChi2.h.

Referenced by initES(), and MultiHitGeneratorFromChi2().

double MultiHitGeneratorFromChi2::maxChi2
private

Definition at line 116 of file MultiHitGeneratorFromChi2.h.

Referenced by hitSets().

std::string MultiHitGeneratorFromChi2::mfName_
private

Definition at line 124 of file MultiHitGeneratorFromChi2.h.

Referenced by MultiHitGeneratorFromChi2().

float MultiHitGeneratorFromChi2::nomField
private
double MultiHitGeneratorFromChi2::nSigmaPhi
private

Definition at line 114 of file MultiHitGeneratorFromChi2.h.

double MultiHitGeneratorFromChi2::nSigmaRZ
private

Definition at line 114 of file MultiHitGeneratorFromChi2.h.

std::vector<double> MultiHitGeneratorFromChi2::pt_interv
private

Definition at line 117 of file MultiHitGeneratorFromChi2.h.

Referenced by hitSets(), and MultiHitGeneratorFromChi2().

bool MultiHitGeneratorFromChi2::refitHits
private

Definition at line 119 of file MultiHitGeneratorFromChi2.h.

Referenced by hitSets(), initES(), and MultiHitGeneratorFromChi2().

edm::ESGetToken<TransientTrackingRecHitBuilder, TransientRecHitRecord> MultiHitGeneratorFromChi2::transientTrackingRecHitBuilderESToken_
private

Definition at line 130 of file MultiHitGeneratorFromChi2.h.

Referenced by initES(), and MultiHitGeneratorFromChi2().

UniformMagneticField MultiHitGeneratorFromChi2::ufield = 0.
private

Definition at line 112 of file MultiHitGeneratorFromChi2.h.

Referenced by hitSets(), initES(), and refit2Hits().

bool MultiHitGeneratorFromChi2::useFixedPreFiltering
private

Definition at line 104 of file MultiHitGeneratorFromChi2.h.

Referenced by hitSets(), and MultiHitGeneratorFromChi2().

bool MultiHitGeneratorFromChi2::useSimpleMF_
private

Definition at line 123 of file MultiHitGeneratorFromChi2.h.

Referenced by MultiHitGeneratorFromChi2().