CMS 3D CMS Logo

SeedFromNuclearInteraction.cc
Go to the documentation of this file.
1 #include <memory>
2 
4 
7 
11 
13 
15  const TrackerGeometry* geom,
16  const edm::ParameterSet& iConfig)
17  : ptMin(iConfig.getParameter<double>("ptMin")), thePropagator(prop), theTrackerGeom(geom) {
18  isValid_ = true;
19  initialTSOS_ = std::make_shared<TrajectoryStateOnSurface>();
20  updatedTSOS_ = std::make_shared<TrajectoryStateOnSurface>();
21  freeTS_ = std::make_shared<FreeTrajectoryState>();
22 }
23 
24 //----------------------------------------------------------------------
26  ConstRecHitPointer ihit,
27  ConstRecHitPointer ohit) {
28  // delete pointer to TrackingRecHits
29  theHits.clear();
30 
31  // get the inner and outer transient TrackingRecHits
32  innerHit_ = ihit;
33  outerHit_ = ohit;
34 
35  //theHits.push_back( inner_TM.recHit() ); // put temporarily - TODO: remove this line
36  theHits.push_back(outerHit_);
37 
38  initialTSOS_.reset(new TrajectoryStateOnSurface(inner_TSOS));
39 
40  // calculate the initial FreeTrajectoryState.
41  freeTS_.reset(stateWithError());
42 
43  // check transverse momentum
44  if (freeTS_->momentum().perp() < ptMin) {
45  isValid_ = false;
46  } else {
47  // convert freeTS_ into a persistent TSOS on the outer surface
48  isValid_ = construct();
49  }
50 }
51 //----------------------------------------------------------------------
53  const TSOS& inner_TSOS,
54  ConstRecHitPointer ihit,
55  ConstRecHitPointer ohit) {
56  // delete pointer to TrackingRecHits
57  theHits.clear();
58 
59  // get the inner and outer transient TrackingRecHits
60  innerHit_ = ihit;
61  outerHit_ = ohit;
62 
63  GlobalPoint innerPos =
64  theTrackerGeom->idToDet(innerHit_->geographicalId())->surface().toGlobal(innerHit_->localPosition());
65  GlobalPoint outerPos =
66  theTrackerGeom->idToDet(outerHit_->geographicalId())->surface().toGlobal(outerHit_->localPosition());
67 
68  TangentHelix helix(thePrimaryHelix, outerPos, innerPos);
69 
70  theHits.push_back(innerHit_);
71  theHits.push_back(outerHit_);
72 
73  initialTSOS_.reset(new TrajectoryStateOnSurface(inner_TSOS));
74 
75  // calculate the initial FreeTrajectoryState from the inner and outer TM assuming that the helix equation is already known.
76  freeTS_.reset(stateWithError(helix));
77 
78  if (freeTS_->momentum().perp() < ptMin) {
79  isValid_ = false;
80  } else {
81  // convert freeTS_ into a persistent TSOS on the outer surface
82  isValid_ = construct();
83  }
84 }
85 //----------------------------------------------------------------------
87  // Calculation of the helix assuming that the secondary track has the same direction
88  // than the primary track and pass through the inner and outer hits.
89  GlobalVector direction = initialTSOS_->globalDirection();
90  GlobalPoint inner = initialTSOS_->globalPosition();
92 
93  return stateWithError(helix);
94 }
95 //----------------------------------------------------------------------
97  // typedef TkRotation<float> Rotation;
98 
99  GlobalVector dirAtVtx = helix.directionAtVertex();
100  const MagneticField& mag = initialTSOS_->globalParameters().magneticField();
101 
102  // Get the global parameters of the trajectory
103  // we assume that the magnetic field at the vertex is equal to the magnetic field at the inner TM.
105  helix.vertexPoint(), dirAtVtx, helix.charge(mag.inTesla(helix.vertexPoint()).z()) / helix.rho(), 0, &mag);
106 
107  // Error matrix in a frame where z is in the direction of the track at the vertex
108  AlgebraicSymMatrix66 primaryError(initialTSOS_->cartesianError().matrix());
109  double p_max = initialTSOS_->globalParameters().momentum().mag();
110  AlgebraicMatrix33 rot = this->rotationMatrix(dirAtVtx);
111 
112  AlgebraicMatrix66 globalRotation;
113  globalRotation.Place_at(rot, 0, 0);
114  globalRotation.Place_at(rot, 3, 3);
115  AlgebraicSymMatrix66 primaryErrorInNewFrame = ROOT::Math::Similarity(globalRotation, primaryError);
116 
117  AlgebraicSymMatrix66 secondaryErrorInNewFrame = AlgebraicMatrixID();
118  double p_perp_max = 2; // energy max of a secondary track emited perpendicularly to the
119  // primary track is +/- 2 GeV
120  secondaryErrorInNewFrame(0, 0) = primaryErrorInNewFrame(0, 0) + helix.vertexError() * p_perp_max / p_max;
121  secondaryErrorInNewFrame(1, 1) = primaryErrorInNewFrame(1, 1) + helix.vertexError() * p_perp_max / p_max;
122  secondaryErrorInNewFrame(2, 2) = helix.vertexError() * helix.vertexError();
123  secondaryErrorInNewFrame(3, 3) = p_perp_max * p_perp_max;
124  secondaryErrorInNewFrame(4, 4) = p_perp_max * p_perp_max;
125  secondaryErrorInNewFrame(5, 5) = p_max * p_max;
126 
127  AlgebraicSymMatrix66 secondaryError = ROOT::Math::SimilarityT(globalRotation, secondaryErrorInNewFrame);
128 
129  return new FreeTrajectoryState(gtp, CartesianTrajectoryError(secondaryError));
130 }
131 
132 //----------------------------------------------------------------------
134  // loop on all hits in theHits
135  KFUpdator theUpdator;
136 
137  const TrackingRecHit* hit = nullptr;
138 
139  LogDebug("NuclearSeedGenerator") << "Seed ** initial state " << freeTS_->cartesianError().matrix();
140 
141  for (unsigned int iHit = 0; iHit < theHits.size(); iHit++) {
142  hit = theHits[iHit]->hit();
144  (iHit == 0)
145  ? thePropagator->propagate(*freeTS_, theTrackerGeom->idToDet(hit->geographicalId())->surface())
146  : thePropagator->propagate(*updatedTSOS_, theTrackerGeom->idToDet(hit->geographicalId())->surface());
147 
148  if (!state.isValid())
149  return false;
150 
152  updatedTSOS_.reset(new TrajectoryStateOnSurface(theUpdator.update(state, *tth)));
153  }
154 
155  LogDebug("NuclearSeedGenerator") << "Seed ** updated state " << updatedTSOS_->cartesianError().matrix();
156 
158  return true;
159 }
160 
161 //----------------------------------------------------------------------
163  recHitContainer _hits;
164  for (ConstRecHitContainer::const_iterator it = theHits.begin(); it != theHits.end(); it++) {
165  _hits.push_back(it->get()->hit()->clone());
166  }
167  return _hits;
168 }
169 //----------------------------------------------------------------------
172 
173  // z axis coincides with perp
174  GlobalVector zAxis = perp.unit();
175 
176  // x axis has no global Z component
178  if (zAxis.x() != 0 || zAxis.y() != 0) {
179  // precision is not an issue here, just protect against divizion by zero
180  xAxis = GlobalVector(-zAxis.y(), zAxis.x(), 0).unit();
181  } else { // perp coincides with global Z
182  xAxis = GlobalVector(1, 0, 0);
183  }
184 
185  // y axis obtained by cross product
186  GlobalVector yAxis(zAxis.cross(xAxis));
187 
188  result(0, 0) = xAxis.x();
189  result(0, 1) = xAxis.y();
190  result(0, 2) = xAxis.z();
191  result(1, 0) = yAxis.x();
192  result(1, 1) = yAxis.y();
193  result(1, 2) = yAxis.z();
194  result(2, 0) = zAxis.x();
195  result(2, 1) = zAxis.y();
196  result(2, 2) = zAxis.z();
197  return result;
198 }
Vector3DBase
Definition: Vector3DBase.h:8
SeedFromNuclearInteraction.h
TrackerGeometry::idToDet
const TrackerGeomDet * idToDet(DetId) const override
Definition: TrackerGeometry.cc:193
SeedFromNuclearInteraction::setMeasurements
void setMeasurements(const TSOS &tsosAtInteractionPoint, ConstRecHitPointer ihit, ConstRecHitPointer ohit)
Fill all data members from 2 TM's where the first one is supposed to be at the interaction point.
Definition: SeedFromNuclearInteraction.cc:25
KFUpdator::update
TrajectoryStateOnSurface update(const TrajectoryStateOnSurface &, const TrackingRecHit &) const override
Definition: KFUpdator.cc:177
SeedFromNuclearInteraction::theHits
ConstRecHitContainer theHits
Definition: SeedFromNuclearInteraction.h:74
MessageLogger.h
SeedFromNuclearInteraction::outerHit_
ConstRecHitPointer outerHit_
Definition: SeedFromNuclearInteraction.h:78
SeedFromNuclearInteraction::rotationMatrix
AlgebraicMatrix33 rotationMatrix(const GlobalVector &perp) const
Definition: SeedFromNuclearInteraction.cc:170
TangentHelix::vertexError
double vertexError()
Definition: TangentHelix.h:47
trajectoryStateTransform::persistentState
PTrajectoryStateOnDet persistentState(const TrajectoryStateOnSurface &ts, unsigned int detid)
Definition: TrajectoryStateTransform.cc:14
ptMin
constexpr float ptMin
Definition: PhotonIDValueMapProducer.cc:155
TangentHelix::charge
int charge(float magz)
Definition: TangentHelix.h:41
SeedFromNuclearInteraction::theTrackerGeom
const TrackerGeometry * theTrackerGeom
Definition: SeedFromNuclearInteraction.h:93
AlgebraicMatrix33
ROOT::Math::SMatrix< double, 3, 3, ROOT::Math::MatRepStd< double, 3, 3 > > AlgebraicMatrix33
Definition: AlgebraicROOTObjects.h:41
GlobalVector
Global3DVector GlobalVector
Definition: GlobalVector.h:10
SeedFromNuclearInteraction::SeedFromNuclearInteraction
SeedFromNuclearInteraction(const Propagator *prop, const TrackerGeometry *geom, const edm::ParameterSet &iConfig)
Definition: SeedFromNuclearInteraction.cc:14
perp
T perp() const
Magnitude of transverse component.
Definition: Basic3DVectorLD.h:133
TangentHelix::vertexPoint
GlobalPoint vertexPoint() const
Definition: TangentHelix.h:35
TangentHelix::rho
double rho() const
Definition: TangentHelix.h:43
AlgebraicMatrixID
ROOT::Math::SMatrixIdentity AlgebraicMatrixID
Definition: AlgebraicROOTObjects.h:72
SeedFromNuclearInteraction::updatedTSOS_
std::shared_ptr< TSOS > updatedTSOS_
Definition: SeedFromNuclearInteraction.h:80
Propagator
Definition: Propagator.h:44
TrajectoryStateOnSurface
Definition: TrajectoryStateOnSurface.h:16
SeedFromNuclearInteraction::thePropagator
const Propagator * thePropagator
Definition: SeedFromNuclearInteraction.h:92
SeedFromNuclearInteraction::direction
PropagationDirection direction() const
Definition: SeedFromNuclearInteraction.h:47
SurfaceOrientation::inner
Definition: Surface.h:19
AlgebraicSymMatrix66
ROOT::Math::SMatrix< double, 6, 6, ROOT::Math::MatRepSym< double, 6 > > AlgebraicSymMatrix66
Definition: AlgebraicROOTObjects.h:24
DDAxes::z
HLT_FULL_cff.zAxis
zAxis
Definition: HLT_FULL_cff.py:46206
relativeConstraints.geom
geom
Definition: relativeConstraints.py:72
GlobalTrajectoryParameters
Definition: GlobalTrajectoryParameters.h:15
SeedFromNuclearInteraction::construct
bool construct()
Definition: SeedFromNuclearInteraction.cc:133
Point3DBase< float, GlobalTag >
SeedFromNuclearInteraction::innerHit_
ConstRecHitPointer innerHit_
Definition: SeedFromNuclearInteraction.h:77
SeedFromNuclearInteraction::hits
recHitContainer hits() const
Definition: SeedFromNuclearInteraction.cc:162
TrackerDigiGeometryRecord.h
SeedFromNuclearInteraction::pTraj
PTrajectoryStateOnDet pTraj
Definition: SeedFromNuclearInteraction.h:86
GeomDet::toGlobal
GlobalPoint toGlobal(const Local2DPoint &lp) const
Conversion to the global R.F. from the R.F. of the GeomDet.
Definition: GeomDet.h:49
KFUpdator.h
LogDebug
#define LogDebug(id)
Definition: MessageLogger.h:223
edm::ParameterSet
Definition: ParameterSet.h:47
SeedFromNuclearInteraction::outerHitPosition
GlobalPoint outerHitPosition() const
Definition: SeedFromNuclearInteraction.h:59
SeedFromNuclearInteraction::outerHitDetId
DetId outerHitDetId() const
Definition: SeedFromNuclearInteraction.h:63
HLT_FULL_cff.yAxis
yAxis
Definition: HLT_FULL_cff.py:46207
TrackingRecHit::ConstRecHitPointer
std::shared_ptr< TrackingRecHit const > ConstRecHitPointer
Definition: TrackingRecHit.h:25
SeedFromNuclearInteraction::initialTSOS_
std::shared_ptr< TSOS > initialTSOS_
Definition: SeedFromNuclearInteraction.h:82
SeedFromNuclearInteraction::freeTS_
std::shared_ptr< FreeTrajectoryState > freeTS_
Definition: SeedFromNuclearInteraction.h:84
MagneticField.h
Propagator::propagate
TrajectoryStateOnSurface propagate(STA const &state, SUR const &surface) const
Definition: Propagator.h:50
unit
Basic3DVector unit() const
Definition: Basic3DVectorLD.h:162
TrackingRecHit
Definition: TrackingRecHit.h:21
CartesianTrajectoryError
Definition: CartesianTrajectoryError.h:15
mag
T mag() const
The vector magnitude. Equivalent to sqrt(vec.mag2())
Definition: Basic3DVectorLD.h:127
SeedFromNuclearInteraction::ConstRecHitPointer
TransientTrackingRecHit::ConstRecHitPointer ConstRecHitPointer
Definition: SeedFromNuclearInteraction.h:24
AlgebraicMatrix66
ROOT::Math::SMatrix< double, 6, 6, ROOT::Math::MatRepStd< double, 6, 6 > > AlgebraicMatrix66
Definition: AlgebraicROOTObjects.h:62
RunInfoPI::state
state
Definition: RunInfoPayloadInspectoHelper.h:16
FreeTrajectoryState
Definition: FreeTrajectoryState.h:27
SeedFromNuclearInteraction::ptMin
double ptMin
Definition: SeedFromNuclearInteraction.h:90
TrackingComponentsRecord.h
HLT_FULL_cff.xAxis
xAxis
Definition: HLT_FULL_cff.py:46205
makeMuonMisalignmentScenario.rot
rot
Definition: makeMuonMisalignmentScenario.py:322
SeedFromNuclearInteraction::isValid_
bool isValid_
Definition: SeedFromNuclearInteraction.h:72
TrajectoryStateTransform.h
edm::OwnVector::push_back
void push_back(D *&d)
Definition: OwnVector.h:326
TangentHelix
Definition: TangentHelix.h:6
mps_fire.result
result
Definition: mps_fire.py:311
SeedFromNuclearInteraction::stateWithError
FreeTrajectoryState * stateWithError() const
Definition: SeedFromNuclearInteraction.cc:86
MagneticField
Definition: MagneticField.h:19
KFUpdator
Definition: KFUpdator.h:32
hit
Definition: SiStripHitEffFromCalibTree.cc:88
edm::OwnVector< TrackingRecHit >
TrackerGeometry
Definition: TrackerGeometry.h:14
TangentHelix::directionAtVertex
GlobalVector directionAtVertex()
Definition: TangentHelix.cc:17