CMS 3D CMS Logo

All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
SeedFromConsecutiveHitsCreator.cc
Go to the documentation of this file.
3 
17 
18 namespace {
19 
20  template <class T>
21  inline T sqr(T t) {
22  return t * t;
23  }
24 
25 } // namespace
26 
28 
30  desc.add<std::string>("propagator", "PropagatorWithMaterialParabolicMf");
31  desc.add<double>("SeedMomentumForBOFF", 5.0);
32  desc.add<double>("OriginTransverseErrorMultiplier", 1.0);
33  desc.add<double>("MinOneOverPtError", 1.0);
34  desc.add<std::string>("TTRHBuilder", "WithTrackAngle");
35  desc.add<std::string>("magneticField", "ParabolicMf");
36  desc.add<bool>("forceKinematicWithRegionDirection", false);
37 }
38 
40  const edm::EventSetup& es,
41  const SeedComparitor* ifilter) {
42  region = &iregion;
43  filter = ifilter;
44  // get tracker
46  // get propagator
48  // mag field
50  // edm::ESInputTag mfESInputTag(mfName_);
51  // es.get<IdealMagneticFieldRecord>().get(mfESInputTag, bfield);
53  isBOFF = (0 == nomField);
54 
56  es.get<TransientRecHitRecord>().get(TTRHBuilder, builderH);
57  auto builder = (TkTransientTrackingRecHitBuilder const*)(builderH.product());
58  cloner = (*builder).cloner();
59 }
60 
62  if (hits.size() < 2)
63  return;
64 
66  if (!initialKinematic(kine, hits))
67  return;
68 
69  auto sin2Theta = kine.momentum().perp2() / kine.momentum().mag2();
70 
72  FreeTrajectoryState fts(kine, error);
73 
74  if (region->direction().x() != 0 &&
75  forceKinematicWithRegionDirection_) // a direction was given, check if it is an etaPhi region
76  {
77  const RectangularEtaPhiTrackingRegion* etaPhiRegion = dynamic_cast<const RectangularEtaPhiTrackingRegion*>(region);
78  if (etaPhiRegion) {
79  //the following completely reset the kinematics, perhaps it makes no sense and newKine=kine would do better
80  GlobalVector direction = region->direction() / region->direction().mag();
81  GlobalVector momentum = direction * fts.momentum().mag();
82  GlobalPoint position = region->origin() + 5 * direction;
83  GlobalTrajectoryParameters newKine(position, momentum, fts.charge(), &fts.parameters().magneticField());
84 
85  auto ptMin = region->ptMin();
86  CurvilinearTrajectoryError newError; //zeroed
87  auto& C = newError.matrix();
88  constexpr float minC00 = 0.4f;
89  C[0][0] = std::max(sin2Theta / sqr(ptMin), minC00);
90  auto zErr = sqr(region->originZBound());
91  auto transverseErr = sqr(region->originRBound()); // assume equal cxx cyy
92  auto twiceDeltaLambda =
93  std::atan(etaPhiRegion->tanLambdaRange().first) - std::atan(etaPhiRegion->tanLambdaRange().second);
94  auto twiceDeltaPhi = etaPhiRegion->phiMargin().right() + etaPhiRegion->phiMargin().left();
95  C[1][1] = twiceDeltaLambda * twiceDeltaLambda; //2 sigma of what given in input
96  C[2][2] = twiceDeltaPhi * twiceDeltaPhi;
97  C[3][3] = transverseErr;
98  C[4][4] = zErr * sin2Theta + transverseErr * (1.f - sin2Theta);
99  fts = FreeTrajectoryState(newKine, newError);
100  }
101  }
102 
103  buildSeed(seedCollection, hits, fts);
104 }
105 
107  const SeedingHitSet& hits) const {
108  SeedingHitSet::ConstRecHitPointer tth1 = hits[0];
109  SeedingHitSet::ConstRecHitPointer tth2 = hits[1];
110 
111  const GlobalPoint& vertexPos = region->origin();
112 
113  FastHelix helix(tth2->globalPosition(), tth1->globalPosition(), vertexPos, nomField, &*bfield);
114  if (helix.isValid()) {
115  kine = helix.stateAtVertex();
116  } else {
117  GlobalVector initMomentum(tth2->globalPosition() - vertexPos);
118  initMomentum *= (100.f / initMomentum.perp());
119  kine = GlobalTrajectoryParameters(vertexPos, initMomentum, 1, &*bfield);
120  }
121 
122  if
123  UNLIKELY(isBOFF && (theBOFFMomentum > 0)) {
125  kine.position(), kine.momentum().unit() * theBOFFMomentum, kine.charge(), &*bfield);
126  }
127  return (filter ? filter->compatible(hits, kine, helix) : true);
128 }
129 
131  // Set initial uncertainty on track parameters, using only P.V. constraint and no hit
132  // information.
133  CurvilinearTrajectoryError newError; // zeroed
134  auto& C = newError.matrix();
135 
136  // FIXME: minC00. Prevent apriori uncertainty in 1/P from being too small,
137  // to avoid instabilities.
138  // N.B. This parameter needs optimising ...
139  // Probably OK based on quick study: KS 22/11/12.
140  auto sin2th = sin2Theta;
141  auto minC00 = sqr(theMinOneOverPtError);
142  C[0][0] = std::max(sin2th / sqr(region->ptMin()), minC00);
143  auto zErr = sqr(region->originZBound());
144  auto transverseErr = sqr(theOriginTransverseErrorMultiplier * region->originRBound());
145  C[1][1] = C[2][2] = 1.; // no good reason. no bad reason....
146  C[3][3] = transverseErr;
147  C[4][4] = zErr * sin2th + transverseErr * (1.f - sin2th);
148 
149  return newError;
150 }
151 
153  const SeedingHitSet& hits,
154  const FreeTrajectoryState& fts) const {
155  const Propagator* propagator = &(*propagatorHandle);
156 
157  // get updator
159 
160  // Now update initial state track using information from seed hits.
161 
164 
165  const TrackingRecHit* hit = nullptr;
166  for (unsigned int iHit = 0; iHit < hits.size(); iHit++) {
167  hit = hits[iHit]->hit();
169  (iHit == 0) ? propagator->propagate(fts, tracker->idToDet(hit->geographicalId())->surface())
170  : propagator->propagate(updatedState, tracker->idToDet(hit->geographicalId())->surface());
171  if (!state.isValid())
172  return;
173 
174  SeedingHitSet::ConstRecHitPointer tth = hits[iHit];
175 
176  std::unique_ptr<BaseTrackerRecHit> newtth(refitHit(tth, state));
177 
178  if (!checkHit(state, &*newtth))
179  return;
180 
181  updatedState = updator.update(state, *newtth);
182  if (!updatedState.isValid())
183  return;
184 
185  seedHits.push_back(newtth.release());
186  }
187 
188  if (!hit)
189  return;
190 
191  PTrajectoryStateOnDet const& PTraj =
193  seedCollection.emplace_back(PTraj, std::move(seedHits), alongMomentum);
194 }
195 
197  const TrajectoryStateOnSurface& state) const {
198  return (SeedingHitSet::RecHitPointer)(cloner(*hit, state));
199 }
200 
203  return (filter ? filter->compatible(tsos, hit) : true);
204 }
float originRBound() const
bounds the particle vertex in the transverse plane
T mag2() const
Definition: PV3DBase.h:63
void makeSeed(TrajectorySeedCollection &seedCollection, const SeedingHitSet &hits) final
GlobalPoint const & origin() const
const GlobalTrajectoryParameters & parameters() const
int nominalValue() const
The nominal field value for this map in kGauss.
Definition: MagneticField.h:49
edm::ESHandle< Propagator > propagatorHandle
void buildSeed(TrajectorySeedCollection &seedCollection, const SeedingHitSet &hits, const FreeTrajectoryState &fts) const
constexpr uint32_t rawId() const
get the raw id
Definition: DetId.h:57
PTrajectoryStateOnDet persistentState(const TrajectoryStateOnSurface &ts, unsigned int detid)
virtual bool initialKinematic(GlobalTrajectoryParameters &kine, const SeedingHitSet &hits) const
T perp2() const
Definition: PV3DBase.h:68
TrackCharge charge() const
CurvilinearTrajectoryError initialError(float sin2Theta) const
GlobalVector const & direction() const
the direction around which region is constructed
void push_back(D *&d)
Definition: OwnVector.h:326
TrajectoryStateOnSurface update(const TrajectoryStateOnSurface &, const TrackingRecHit &) const override
Definition: KFUpdator.cc:177
BaseTrackerRecHit const * ConstRecHitPointer
Definition: SeedingHitSet.h:10
T mag() const
Definition: PV3DBase.h:64
std::vector< TrajectorySeed > TrajectorySeedCollection
SeedingHitSet::RecHitPointer refitHit(SeedingHitSet::ConstRecHitPointer hit, const TrajectoryStateOnSurface &state) const
virtual bool compatible(const SeedingHitSet &hits) const =0
ParameterDescriptionBase * add(U const &iLabel, T const &value)
GlobalVector momentum() const
float originZBound() const
bounds the particle vertex in the longitudinal plane
Vector3DBase unit() const
Definition: Vector3DBase.h:54
void init(const TrackingRegion &region, const edm::EventSetup &es, const SeedComparitor *filter) final
edm::ESHandle< TrackerGeometry > tracker
float ptMin() const
minimal pt of interest
TrajectoryStateOnSurface propagate(STA const &state, SUR const &surface) const
Definition: Propagator.h:50
const AlgebraicSymMatrix55 & matrix() const
Square< F >::type sqr(const F &f)
Definition: Square.h:14
static int position[264][3]
Definition: ReadPGInfo.cc:289
T get() const
Definition: EventSetup.h:73
unsigned int size() const
Definition: SeedingHitSet.h:41
const TrackerGeomDet * idToDet(DetId) const override
const MagneticField & magneticField() const
DetId geographicalId() const
#define UNLIKELY(x)
Definition: Likely.h:21
static void fillDescriptions(edm::ParameterSetDescription &desc)
long double T
edm::ESHandle< MagneticField > bfield
T x() const
Definition: PV3DBase.h:59
T const * product() const
Definition: ESHandle.h:86
def move(src, dest)
Definition: eostools.py:511
#define constexpr
bool checkHit(const TrajectoryStateOnSurface &tsos, SeedingHitSet::ConstRecHitPointer hit) const