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 
19 
20 template <class T> T sqr( T t) {return t*t;}
21 
23  TrajectorySeedCollection & seedCollection,
24  const SeedingHitSet & hits,
25  const TrackingRegion & region,
26  const edm::EventSetup& es,
27  const SeedComparitor *filter)
28 {
29  if ( hits.size() < 2) return 0;
30 
31  bool passesFilter = true;
32  GlobalTrajectoryParameters kine = initialKinematic(hits, region, es, filter, passesFilter);
33  if (!passesFilter) return 0;
34 
35  float sinTheta = sin(kine.momentum().theta());
36 
37  CurvilinearTrajectoryError error = initialError(region, sinTheta);
38  FreeTrajectoryState fts(kine, error);
39 
40  return buildSeed(seedCollection,hits,fts,es,filter);
41 }
42 
43 
45  const SeedingHitSet & hits,
46  const TrackingRegion & region,
47  const edm::EventSetup& es,
48  const SeedComparitor *filter,
49  bool &passesFilter) const
50 {
52  es.get<IdealMagneticFieldRecord>().get(bfield);
53 
55 
58  const GlobalPoint& vertexPos = region.origin();
59 
60  FastHelix helix(tth2->globalPosition(), tth1->globalPosition(), vertexPos, es);
61  if (helix.isValid()) {
62  kine = helix.stateAtVertex().parameters();
63  } else {
64  GlobalVector initMomentum(tth2->globalPosition() - vertexPos);
65  initMomentum *= (100./initMomentum.perp());
66  kine = GlobalTrajectoryParameters(vertexPos, initMomentum, 1, &*bfield);
67  }
68 
69  bool isBOFF = ( std::abs(bfield->inTesla(GlobalPoint(0,0,0)).z()) < 1e-3 );
70  if (isBOFF && (theBOFFMomentum > 0)) {
72  kine.momentum().unit() * theBOFFMomentum,
73  kine.charge(),
74  &*bfield);
75  }
76  passesFilter = (filter ? filter->compatible(hits, kine, helix, region) : true);
77  return kine;
78 }
79 
80 
81 
83  initialError( const TrackingRegion& region, float sinTheta) const
84 {
85  // Set initial uncertainty on track parameters, using only P.V. constraint and no hit
86  // information.
87  GlobalError vertexErr( sqr(region.originRBound()), 0, sqr(region.originRBound()),
88  0, 0, sqr(region.originZBound()));
89 
90  float ptMin = region.ptMin();
91 
92 
93  AlgebraicSymMatrix55 C = ROOT::Math::SMatrixIdentity();
94 
95 // FIXME: minC00. Prevent apriori uncertainty in 1/P from being too small,
96 // to avoid instabilities.
97 // N.B. This parameter needs optimising ...
98  float sin2th = sqr(sinTheta);
99  float minC00 = 1.0;
100  C[0][0] = std::max(sin2th/sqr(ptMin), minC00);
101  float zErr = vertexErr.czz();
102  float transverseErr = vertexErr.cxx(); // assume equal cxx cyy
103  C[3][3] = transverseErr;
104  C[4][4] = zErr*sin2th + transverseErr*(1-sin2th);
105 
106  return CurvilinearTrajectoryError(C);
107 }
108 
110  TrajectorySeedCollection & seedCollection,
111  const SeedingHitSet & hits,
112  const FreeTrajectoryState & fts,
113  const edm::EventSetup& es,
114  const SeedComparitor *filter) const
115 {
116  // get tracker
118  es.get<TrackerDigiGeometryRecord>().get(tracker);
119 
120  // get propagator
121  edm::ESHandle<Propagator> propagatorHandle;
122  es.get<TrackingComponentsRecord>().get(thePropagatorLabel, propagatorHandle);
123  const Propagator* propagator = &(*propagatorHandle);
124 
125  // get updator
126  KFUpdator updator;
127 
128  // Now update initial state track using information from seed hits.
129 
130  TrajectoryStateOnSurface updatedState;
132 
133  const TrackingRecHit* hit = 0;
134  for ( unsigned int iHit = 0; iHit < hits.size(); iHit++) {
135  hit = hits[iHit]->hit();
136  TrajectoryStateOnSurface state = (iHit==0) ?
137  propagator->propagate(fts,tracker->idToDet(hit->geographicalId())->surface())
138  : propagator->propagate(updatedState, tracker->idToDet(hit->geographicalId())->surface());
139  if (!state.isValid()) return 0;
140 
142 
143  TransientTrackingRecHit::RecHitPointer newtth = refitHit( tth, state);
144 
145  if (!checkHit(state,newtth,es,filter)) return 0;
146 
147  updatedState = updator.update(state, *newtth);
148  if (!updatedState.isValid()) return 0;
149 
150  seedHits.push_back(newtth->hit()->clone());
151  }
152 
153 
154  PTrajectoryStateOnDet const & PTraj =
156  TrajectorySeed seed(PTraj,std::move(seedHits),alongMomentum);
157  if (filter != 0 && !filter->compatible(seed)) return 0;
158  seedCollection.push_back(seed);
159  return &seedCollection.back();
160 }
161 
164  const TrajectoryStateOnSurface &state) const
165 {
166  return hit->clone(state);
167 }
168 
169 bool
171  const TrajectoryStateOnSurface &tsos,
173  const edm::EventSetup& es,
174  const SeedComparitor *filter) const
175 {
176  return (filter ? filter->compatible(tsos,hit) : true);
177 }
178 
virtual float ptMin() const =0
minimal pt of interest
virtual GlobalPoint origin() const =0
virtual TransientTrackingRecHit::RecHitPointer refitHit(const TransientTrackingRecHit::ConstRecHitPointer &hit, const TrajectoryStateOnSurface &state) const
Sin< T >::type sin(const T &t)
Definition: Sin.h:22
PTrajectoryStateOnDet persistentState(const TrajectoryStateOnSurface &ts, unsigned int detid)
#define abs(x)
Definition: mlp_lapack.h:159
ROOT::Math::SMatrix< double, 5, 5, ROOT::Math::MatRepSym< double, 5 > > AlgebraicSymMatrix55
virtual const TrajectorySeed * trajectorySeed(TrajectorySeedCollection &seedCollection, const SeedingHitSet &ordered, const TrackingRegion &region, const edm::EventSetup &es, const SeedComparitor *filter)
virtual bool compatible(const SeedingHitSet &hits, const TrackingRegion &region) const =0
virtual const TrajectorySeed * buildSeed(TrajectorySeedCollection &seedCollection, const SeedingHitSet &hits, const FreeTrajectoryState &fts, const edm::EventSetup &es, const SeedComparitor *filter) const
Geom::Theta< T > theta() const
Definition: PV3DBase.h:74
uint32_t rawId() const
get the raw id
Definition: DetId.h:45
virtual CurvilinearTrajectoryError initialError(const TrackingRegion &region, float sinTheta) const
void push_back(D *&d)
Definition: OwnVector.h:273
std::vector< TrajectorySeed > TrajectorySeedCollection
const T & max(const T &a, const T &b)
virtual TrajectoryStateOnSurface propagate(const FreeTrajectoryState &, const Surface &) const
Definition: Propagator.cc:12
Vector3DBase unit() const
Definition: Vector3DBase.h:57
const T & get() const
Definition: EventSetup.h:55
virtual float originRBound() const =0
bounds the particle vertex in the transverse plane
char state
Definition: procUtils.cc:75
TrajectoryStateOnSurface update(const TrajectoryStateOnSurface &, const TransientTrackingRecHit &) const
Definition: KFUpdator.cc:10
virtual float originZBound() const =0
bounds the particle vertex in the longitudinal plane
Square< F >::type sqr(const F &f)
Definition: Square.h:13
virtual bool checkHit(const TrajectoryStateOnSurface &tsos, const TransientTrackingRecHit::ConstRecHitPointer &hit, const edm::EventSetup &es, const SeedComparitor *filter) const
unsigned int size() const
Definition: SeedingHitSet.h:31
virtual GlobalTrajectoryParameters initialKinematic(const SeedingHitSet &hits, const TrackingRegion &region, const edm::EventSetup &es, const SeedComparitor *filter, bool &passesFilter) const
DetId geographicalId() const
long double T