CMS 3D CMS Logo

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