CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
List of all members | Public Types | Public Member Functions
TwoBodyDecayLinearizationPointFinder Class Reference

#include <TwoBodyDecayLinearizationPointFinder.h>

Public Types

typedef
PerigeeLinearizedTrackState::RefCountedLinearizedTrackState 
RefCountedLinearizedTrackState
 

Public Member Functions

virtual
TwoBodyDecayLinearizationPointFinder
clone (void) const
 
virtual const
TwoBodyDecayParameters 
getLinearizationPoint (const std::vector< RefCountedLinearizedTrackState > &tracks, const double primaryMass, const double secondaryMass) const
 
 TwoBodyDecayLinearizationPointFinder (const edm::ParameterSet &config)
 
virtual ~TwoBodyDecayLinearizationPointFinder (void)
 

Detailed Description

Class TwoBodyDecayLinearizationPointFinder computes a rough estimate of the parameters of a decay. This serves as linearization point for TwoBodyDecayEstimator.

/author Edmund Widl

Definition at line 16 of file TwoBodyDecayLinearizationPointFinder.h.

Member Typedef Documentation

typedef PerigeeLinearizedTrackState::RefCountedLinearizedTrackState TwoBodyDecayLinearizationPointFinder::RefCountedLinearizedTrackState

Definition at line 21 of file TwoBodyDecayLinearizationPointFinder.h.

Constructor & Destructor Documentation

TwoBodyDecayLinearizationPointFinder::TwoBodyDecayLinearizationPointFinder ( const edm::ParameterSet config)
inline

Definition at line 23 of file TwoBodyDecayLinearizationPointFinder.h.

Referenced by clone().

23 {}
virtual TwoBodyDecayLinearizationPointFinder::~TwoBodyDecayLinearizationPointFinder ( void  )
inlinevirtual

Definition at line 25 of file TwoBodyDecayLinearizationPointFinder.h.

25 {}

Member Function Documentation

virtual TwoBodyDecayLinearizationPointFinder* TwoBodyDecayLinearizationPointFinder::clone ( void  ) const
inlinevirtual

Definition at line 32 of file TwoBodyDecayLinearizationPointFinder.h.

References TwoBodyDecayLinearizationPointFinder().

32 { return new TwoBodyDecayLinearizationPointFinder( *this ); }
TwoBodyDecayLinearizationPointFinder(const edm::ParameterSet &config)
const TwoBodyDecayParameters TwoBodyDecayLinearizationPointFinder::getLinearizationPoint ( const std::vector< RefCountedLinearizedTrackState > &  tracks,
const double  primaryMass,
const double  secondaryMass 
) const
virtual

Definition at line 7 of file TwoBodyDecayLinearizationPointFinder.cc.

References TwoBodyDecayParameters::dimension, TwoBodyDecayParameters::mass, AlCaHLTBitMon_ParallelJobs::p, p1, p2, perp2(), TwoBodyDecayParameters::phi, pi, TwoBodyDecayParameters::px, TwoBodyDecayParameters::py, TwoBodyDecayParameters::pz, TwoBodyDecayModel::rotationMatrix(), mathSSE::sqrt(), TwoBodyDecayParameters::theta, TwoBodyDecayParameters::x, PV3DBase< T, PVType, FrameType >::x(), TwoBodyDecayParameters::y, PV3DBase< T, PVType, FrameType >::y(), TwoBodyDecayParameters::z, and PV3DBase< T, PVType, FrameType >::z().

Referenced by TwoBodyDecayFitter::estimate().

10 {
11  GlobalPoint linPoint = tracks[0]->linearizationPoint();
12  PerigeeLinearizedTrackState* linTrack1 = dynamic_cast<PerigeeLinearizedTrackState*>( tracks[0].get() );
13  PerigeeLinearizedTrackState* linTrack2 = dynamic_cast<PerigeeLinearizedTrackState*>( tracks[1].get() );
14  if (!linTrack1 || !linTrack2) return TwoBodyDecayParameters();
15 
16  GlobalVector firstMomentum = linTrack1->predictedState().momentum();
17  GlobalVector secondMomentum = linTrack2->predictedState().momentum();
18 
19  AlgebraicVector secondaryMomentum1( 3 );
20  secondaryMomentum1[0] = firstMomentum.x();
21  secondaryMomentum1[1] = firstMomentum.y();
22  secondaryMomentum1[2] = firstMomentum.z();
23 
24  AlgebraicVector secondaryMomentum2( 3 );
25  secondaryMomentum2[0] = secondMomentum.x();
26  secondaryMomentum2[1] = secondMomentum.y();
27  secondaryMomentum2[2] = secondMomentum.z();
28 
29  AlgebraicVector primaryMomentum = secondaryMomentum1 + secondaryMomentum2;
30 
31  TwoBodyDecayModel decayModel( primaryMass, secondaryMass );
32  AlgebraicMatrix rotMat = decayModel.rotationMatrix( primaryMomentum[0], primaryMomentum[1], primaryMomentum[2] );
33  AlgebraicMatrix invRotMat = rotMat.T();
34 
35  double p = primaryMomentum.norm();
36  double pSquared = p*p;
37  double gamma = sqrt( pSquared + primaryMass*primaryMass )/primaryMass;
38  double betaGamma = p/primaryMass;
39  AlgebraicSymMatrix lorentzTransformation( 4, 1 );
40  lorentzTransformation[0][0] = gamma;
41  lorentzTransformation[3][3] = gamma;
42  lorentzTransformation[0][3] = -betaGamma;
43 
44  double p1 = secondaryMomentum1.norm();
45  AlgebraicVector boostedLorentzMomentum1( 4 );
46  boostedLorentzMomentum1[0] = sqrt( p1*p1 + secondaryMass*secondaryMass );
47  boostedLorentzMomentum1.sub( 2, invRotMat*secondaryMomentum1 );
48 
49  AlgebraicVector restFrameLorentzMomentum1 = lorentzTransformation*boostedLorentzMomentum1;
50  AlgebraicVector restFrameMomentum1 = restFrameLorentzMomentum1.sub( 2, 4 );
51  double perp1 = sqrt( restFrameMomentum1[0]*restFrameMomentum1[0] + restFrameMomentum1[1]*restFrameMomentum1[1] );
52  double theta1 = atan2( perp1, restFrameMomentum1[2] );
53  double phi1 = atan2( restFrameMomentum1[1], restFrameMomentum1[0] );
54 
55  double p2 = secondaryMomentum2.norm();
56  AlgebraicVector boostedLorentzMomentum2( 4 );
57  boostedLorentzMomentum2[0] = sqrt( p2*p2 + secondaryMass*secondaryMass );
58  boostedLorentzMomentum2.sub( 2, invRotMat*secondaryMomentum2 );
59 
60  AlgebraicVector restFrameLorentzMomentum2 = lorentzTransformation*boostedLorentzMomentum2;
61  AlgebraicVector restFrameMomentum2 = restFrameLorentzMomentum2.sub( 2, 4 );
62  double perp2 = sqrt( restFrameMomentum2[0]*restFrameMomentum2[0] + restFrameMomentum2[1]*restFrameMomentum2[1] );
63  double theta2 = atan2( perp2, restFrameMomentum2[2] );
64  double phi2 = atan2( restFrameMomentum2[1], restFrameMomentum2[0] );
65 
66  double pi = 3.141592654;
67  double relSign = -1.;
68 
69  if ( phi1 < 0 ) phi1 += 2*pi;
70  if ( phi2 < 0 ) phi2 += 2*pi;
71  if ( phi1 > phi2 ) relSign = 1.;
72 
73  double momentumSquared1 = secondaryMomentum1.normsq();
74  double energy1 = sqrt( secondaryMass*secondaryMass + momentumSquared1 );
75  double momentumSquared2 = secondaryMomentum2.normsq();
76  double energy2 = sqrt( secondaryMass*secondaryMass + momentumSquared2 );
77  double sumMomentaSquared = ( secondaryMomentum1 + secondaryMomentum2 ).normsq();
78  double sumEnergiesSquared = ( energy1 + energy2 )*( energy1 + energy2 );
79  double estimatedPrimaryMass = sqrt( sumEnergiesSquared - sumMomentaSquared );
80 
82  linParam[TwoBodyDecayParameters::x] = linPoint.x();
83  linParam[TwoBodyDecayParameters::y] = linPoint.y();
84  linParam[TwoBodyDecayParameters::z] = linPoint.z();
85  linParam[TwoBodyDecayParameters::px] = primaryMomentum[0];
86  linParam[TwoBodyDecayParameters::py] = primaryMomentum[1];
87  linParam[TwoBodyDecayParameters::pz] = primaryMomentum[2];
88  linParam[TwoBodyDecayParameters::theta] = 0.5*( theta1 - theta2 + pi ) ;
89  linParam[TwoBodyDecayParameters::phi] = 0.5*( phi1 + phi2 + relSign*pi );
90  linParam[TwoBodyDecayParameters::mass] = estimatedPrimaryMass;
91 
92  return TwoBodyDecayParameters( linParam );
93 }
T y() const
Definition: PV3DBase.h:63
const Double_t pi
CLHEP::HepMatrix AlgebraicMatrix
T sqrt(T t)
Definition: SSEVec.h:48
T z() const
Definition: PV3DBase.h:64
double p2[4]
Definition: TauolaWrapper.h:90
CLHEP::HepVector AlgebraicVector
tuple tracks
Definition: testEve_cfg.py:39
T perp2() const
Squared magnitude of transverse component.
double p1[4]
Definition: TauolaWrapper.h:89
CLHEP::HepSymMatrix AlgebraicSymMatrix
T x() const
Definition: PV3DBase.h:62