CMS 3D CMS Logo

List of all members | Public Member Functions | Private Types | Private Member Functions | Private Attributes
FinalTreeBuilder Class Reference

#include <FinalTreeBuilder.h>

Public Member Functions

RefCountedKinematicTree buildTree (const CachingVertex< 6 > &vtx, const std::vector< RefCountedKinematicParticle > &input) const
 
 FinalTreeBuilder ()
 
 ~FinalTreeBuilder ()
 

Private Types

typedef ReferenceCountingPointer< LinearizedTrackState< 6 > > RefCountedLinearizedTrackState
 
typedef ReferenceCountingPointer< RefittedTrackState< 6 > > RefCountedRefittedTrackState
 
typedef ReferenceCountingPointer< VertexTrack< 6 > > RefCountedVertexTrack
 

Private Member Functions

AlgebraicMatrix momentumPart (const CachingVertex< 6 > &vtx, const AlgebraicVector7 &par) const
 

Private Attributes

KinematicVertexFactorykvFactory
 
VirtualKinematicParticleFactorypFactory
 

Detailed Description

Class building a resulting output tree out of the information provided by KinematicParticleVertexFitter.

Definition at line 16 of file FinalTreeBuilder.h.

Member Typedef Documentation

Definition at line 29 of file FinalTreeBuilder.h.

Definition at line 30 of file FinalTreeBuilder.h.

Definition at line 28 of file FinalTreeBuilder.h.

Constructor & Destructor Documentation

FinalTreeBuilder::FinalTreeBuilder ( )
FinalTreeBuilder::~FinalTreeBuilder ( )

Definition at line 15 of file FinalTreeBuilder.cc.

References kvFactory, and pFactory.

16 {
17  delete kvFactory;
18  delete pFactory;
19 }
VirtualKinematicParticleFactory * pFactory
KinematicVertexFactory * kvFactory

Member Function Documentation

RefCountedKinematicTree FinalTreeBuilder::buildTree ( const CachingVertex< 6 > &  vtx,
const std::vector< RefCountedKinematicParticle > &  input 
) const

Definition at line 21 of file FinalTreeBuilder.cc.

References CachingVertex< N >::degreesOfFreedom(), mps_fire::i, KinematicRefittedTrackState::kinematicMomentumVector(), KinematicRefittedTrackState::kinematicParameters(), KinematicRefittedTrackState::kinematicParametersCovariance(), kvFactory, LogDebug, momentumPart(), KinematicTree::movePointerToTheTop(), nPart(), hcaldqm::flag::nState, VirtualKinematicParticleFactory::particle(), pFactory, CachingVertex< N >::position(), KinematicTree::replaceCurrentParticle(), mathSSE::sqrt(), CachingVertex< N >::totalChiSquared(), CachingVertex< N >::tracks(), KinematicVertexFactory::vertex(), PV3DBase< T, PVType, FrameType >::x(), PV3DBase< T, PVType, FrameType >::y(), and PV3DBase< T, PVType, FrameType >::z().

23 {
24 //creating resulting kinematic particle
25  AlgebraicVector7 par;
26  AlgebraicMatrix cov(7,7,0);
27  par(0) = vtx.position().x();
28  par(1) = vtx.position().y();
29  par(2) = vtx.position().z();
30  double en = 0.;
31  int ch = 0;
32 
33 //new particle momentum calculation and refitted kinematic states
34  std::vector<KinematicRefittedTrackState *> rStates;
35  std::vector<RefCountedVertexTrack> refTracks = vtx.tracks();
36  for(std::vector<RefCountedVertexTrack>::const_iterator i = refTracks.begin();i !=refTracks.end();++i)
37  {
38  KinematicRefittedTrackState * rs = dynamic_cast<KinematicRefittedTrackState *>(&(*((*i)->refittedState())));
40  par(3) += f_mom(0);
41  par(4) += f_mom(1);
42  par(5) += f_mom(2);
43  en += sqrt(f_mom(1)*f_mom(1)+f_mom(2)*f_mom(2)+f_mom(3)*f_mom(3) + f_mom(0)*f_mom(0));
44  ch += (*i)->linearizedTrack()->charge();
45  rStates.push_back(rs);
46  }
47 
48 //math precision check (numerical stability)
49  double differ = en*en - (par(3)*par(3)+par(4)*par(4)+par(5)*par(5));
50  if(differ>0.)
51  {
52  par(6) = sqrt(differ);
53  }else{
54  LogDebug("FinalTreeBuilder")
55  << "Fit failed: Current precision does not allow to calculate the mass\n";
57  }
58 
59 // covariance matrix calculation: momentum-momentum components part (4x4)
60 // and position-momentum components part:
61  AlgebraicMatrix m_all = momentumPart(vtx,par);
62 
63 //position-position components part (3x3)
64  // AlgebraicMatrix x_X = vtx.error().matrix();
65 
66 //making new matrix itself
67  cov.sub(1,1,m_all);
68 
69 //covariance sym matrix
71  for(int i = 1; i<8; i++)
72  {
73  for(int j = 1; j<8; j++)
74  {
75  if(i<=j) sCov(i-1,j-1) = cov(i,j);
76  }
77  }
78 
79 //valid decay vertex for our resulting particle
81 
82 //invalid production vertex for our resulting particle
84 
85 //new born kinematic particle
86  KinematicParameters kPar(par);
87  KinematicParametersError kEr(sCov);
88  const MagneticField* field=input.front()->magneticField();
89  KinematicState nState(kPar, kEr, ch, field);
90 
91 //invalid previous particle and empty constraint:
92  KinematicParticle * zp = nullptr;
94 
95  float vChi = vtx.totalChiSquared();
96  float vNdf = vtx.degreesOfFreedom();
98 
99 //adding top particle to the tree
101  resTree->addParticle(pVrt,dVrt,nPart);
102 
103 //making refitted kinematic particles and putting them to the tree
104  std::vector<RefCountedKinematicParticle> rrP;
105 
106  std::vector<RefCountedKinematicParticle>::const_iterator j;
107  std::vector<RefCountedVertexTrack>::const_iterator i;
108  for(j=input.begin(), i=refTracks.begin(); j !=input.end() && i !=refTracks.end();++j, ++i)
109  {
110  RefCountedLinearizedTrackState lT = (*i)->linearizedTrack();
111  KinematicRefittedTrackState * rS= dynamic_cast<KinematicRefittedTrackState *>(&(*((*i)->refittedState())));
112 
113 // RefCountedRefittedTrackState rS = (*i)->refittedState();
115  KinematicParameters lkPar(lPar);
117  KinematicParametersError lkCov(lCov);
118  TrackCharge lch = lT->charge();
119  KinematicState nState(lkPar,lkCov,lch, field);
120  RefCountedKinematicParticle nPart = (*j)->refittedParticle(nState,vChi,vNdf);
121  rrP.push_back(nPart);
122  if((*j)->correspondingTree() != nullptr)
123  {
124 
125 //here are the particles having trees after them
126  KinematicTree * tree = (*j)->correspondingTree();
127  tree->movePointerToTheTop();
128  tree->replaceCurrentParticle(nPart);
129  RefCountedKinematicVertex cdVertex = resTree->currentDecayVertex();
130  resTree->addTree(cdVertex, tree);
131  }else{
132 
133 //here are just particles fitted to this tree
135  resTree->addParticle(dVrt,nV,nPart);
136  }
137  }
138  return resTree;
139 }
#define LogDebug(id)
void replaceCurrentParticle(RefCountedKinematicParticle newPart) const
AlgebraicVector4 kinematicMomentumVector() const
ReferenceCountingPointer< LinearizedTrackState< 6 > > RefCountedLinearizedTrackState
std::vector< RefCountedVertexTrack > tracks() const
RefCountedKinematicParticle particle(const KinematicState &kineState, float &chiSquared, float &degreesOfFr, ReferenceCountingPointer< KinematicParticle > previousParticle, KinematicConstraint *lastConstraint=0) const
T y() const
Definition: PV3DBase.h:63
VirtualKinematicParticleFactory * pFactory
AlgebraicSymMatrix77 kinematicParametersCovariance() const
static std::string const input
Definition: EdmProvDump.cc:48
ROOT::Math::SMatrix< double, 7, 7, ROOT::Math::MatRepSym< double, 7 > > AlgebraicSymMatrix77
Definition: Matrices.h:9
int TrackCharge
Definition: TrackCharge.h:4
ROOT::Math::SVector< double, 7 > AlgebraicVector7
Definition: Matrices.h:8
CLHEP::HepMatrix AlgebraicMatrix
T sqrt(T t)
Definition: SSEVec.h:18
T z() const
Definition: PV3DBase.h:64
void movePointerToTheTop() const
float totalChiSquared() const
float degreesOfFreedom() const
KinematicVertexFactory * kvFactory
TString nPart(Int_t part, TString string, TString delimit=";", Bool_t removerest=true)
AlgebraicVector7 kinematicParameters() const
GlobalPoint position() const
static RefCountedKinematicVertex vertex(const VertexState &state, float totalChiSq, float degreesOfFr)
Definition: tree.py:1
ROOT::Math::SVector< double, 4 > AlgebraicVector4
T x() const
Definition: PV3DBase.h:62
AlgebraicMatrix momentumPart(const CachingVertex< 6 > &vtx, const AlgebraicVector7 &par) const
AlgebraicMatrix FinalTreeBuilder::momentumPart ( const CachingVertex< 6 > &  vtx,
const AlgebraicVector7 par 
) const
private

Definition at line 143 of file FinalTreeBuilder.cc.

References a, funct::cos(), Exception, ResonanceBuilder::mass, phi, CachingVertex< N >::position(), rho, funct::sin(), findQualityFiles::size, mathSSE::sqrt(), funct::tan(), theta(), CachingVertex< N >::tkToTkCovariance(), CachingVertex< N >::tracks(), and z.

Referenced by buildTree().

145 {
146  std::vector<RefCountedVertexTrack> refTracks = vtx.tracks();
147  int size = refTracks.size();
148  AlgebraicMatrix cov(7+4*(size-1),7+4*(size-1));
149  AlgebraicMatrix jac(7,7+4*(size-1));
150  jac(1,1) = 1.;
151  jac(2,2) = 1.;
152  jac(3,3) = 1.;
153 
154  double energy_total = sqrt(par(3)*par(3)+par(6)*par(6) + par(5)*par(5)+par(4)*par(4));
155 
156  std::vector<RefCountedVertexTrack>::const_iterator rt_i;
157  int i_int = 0;
158  for(rt_i = refTracks.begin(); rt_i != refTracks.end(); rt_i++)
159  {
160  double a;
161  AlgebraicVector6 param = (**rt_i).refittedState()->parameters(); // rho, theta, phi,tr_im, z_im, mass
162  double rho = param[0];
163  double theta = param[1];
164  double phi = param[2];
165  double mass = param[5];
166 
167  if ((**rt_i).linearizedTrack()->charge()!=0) {
168  a = -(**rt_i).refittedState()->freeTrajectoryState().parameters().magneticFieldInInverseGeV(vtx.position()).z()
169  * (**rt_i).refittedState()->freeTrajectoryState().parameters ().charge();
170  if (a==0.) throw cms::Exception("FinalTreeBuilder", "Field is 0");
171  } else {
172  a = 1;
173  }
174 
175  AlgebraicMatrix jc_el(4,4,0);
176  jc_el(1,1) = -a*cos(phi)/(rho*rho); //dpx/d rho
177  jc_el(2,1) = -a*sin(phi)/(rho*rho); //dpy/d rho
178  jc_el(3,1) = -a/(rho*rho*tan(theta)); //dpz/d rho
179 
180  jc_el(3,2) = -a/(rho*sin(theta)*sin(theta)); //dpz/d theta
181 
182  jc_el(1,3) = -a*sin(phi)/rho; //dpx/d phi
183  jc_el(2,3) = a*cos(phi)/rho; //dpy/d
184 
185 //non-trival elements: mass correlations:
186  double energy_local = sqrt(a*a/(rho*rho)*(1+1/(tan(theta)*tan(theta))) + mass*mass);
187 
188  jc_el(4,4) = energy_total*mass/(par(6)*energy_local); // dm/dm
189 
190  jc_el(4,1) = (-(energy_total/energy_local*a*a/(rho*rho*rho*sin(theta)*sin(theta)) )
191  + par(3)*a/(rho*rho)*cos(phi) + par(4)*a/(rho*rho)*sin(phi)
192  + par(5)*a/(rho*rho*tan(theta)) )/par(6); //dm / drho
193 
194  jc_el(4,2) = (-(energy_total/energy_local*a*a/(rho*rho*sin(theta)*sin(theta)*tan(theta)) )
195  + par(5)*a/(rho*sin(theta)*sin(theta)) )/par(6);//dm d theta
196 
197  jc_el(4,3) = ( par(3)*sin(phi) - par(4)*cos(phi) )*a/(rho*par(6)); //dm/dphi
198 
199  jac.sub(4,i_int*4+4,jc_el);
200 
201 //top left corner elements
202  if(i_int == 0) {
203  cov.sub(1,1,asHepMatrix<7>((**rt_i).fullCovariance()));
204  } else {
205 //4-momentum corellatons: diagonal elements of the matrix
206  AlgebraicMatrix fullCovMatrix(asHepMatrix<7>((**rt_i).fullCovariance()));
207  AlgebraicMatrix m_m_cov = fullCovMatrix.sub(4,7,4,7);
208  AlgebraicMatrix x_p_cov = fullCovMatrix.sub(1,3,4,7);
209  AlgebraicMatrix p_x_cov = fullCovMatrix.sub(4,7,1,3);
210 
211 // cout << "Full covariance: \n"<< (**rt_i).fullCovariance()<<endl;
212 // cout << "Full m_m_cov: "<< m_m_cov<<endl;
213 // cout<<"p_x_cov"<< p_x_cov<<endl;
214 // cout<<"x_p_cov"<< x_p_cov<<endl;
215 
216 //putting everything to the joint covariance matrix:
217 //diagonal momentum-momentum elements:
218  cov.sub(i_int*4 + 4, i_int*4 + 4,m_m_cov);
219 
220 //position momentum elements:
221  cov.sub(1,i_int*4 + 4,x_p_cov);
222  cov.sub(i_int*4 + 4,1,p_x_cov);
223 
224 //off diagonal elements: corellations
225 // track momentum - track momentum
226  }
227  int j_int = 0;
228  for(std::vector<RefCountedVertexTrack>::const_iterator rt_j = refTracks.begin(); rt_j != refTracks.end(); rt_j++)
229  {
230  if(i_int < j_int)
231  {
232  AlgebraicMatrix i_k_cov_m = asHepMatrix<4,4>(vtx.tkToTkCovariance((*rt_i),(*rt_j)));
233 // cout<<"i_k_cov_m"<<i_k_cov_m <<endl;
234  cov.sub(i_int*4 + 4, j_int*4 + 4,i_k_cov_m);
235  cov.sub(j_int*4 + 4, i_int*4 + 4,i_k_cov_m.T());
236  }
237  j_int++;
238  }
239  i_int++;
240  }
241 // cout<<"jac"<<jac<<endl;
242 // cout<<"cov"<<cov<<endl;
243 // cout << "final result new"<<jac*cov*jac.T()<<endl;
244 
245  return jac*cov*jac.T();
246 }
size
Write out results.
std::vector< RefCountedVertexTrack > tracks() const
Sin< T >::type sin(const T &t)
Definition: Sin.h:22
Geom::Theta< T > theta() const
ROOT::Math::SVector< double, 6 > AlgebraicVector6
CLHEP::HepMatrix AlgebraicMatrix
T sqrt(T t)
Definition: SSEVec.h:18
Cos< T >::type cos(const T &t)
Definition: Cos.h:22
Tan< T >::type tan(const T &t)
Definition: Tan.h:22
AlgebraicMatrixMM tkToTkCovariance(const RefCountedVertexTrack t1, const RefCountedVertexTrack t2) const
GlobalPoint position() const
double a
Definition: hdecay.h:121

Member Data Documentation

KinematicVertexFactory* FinalTreeBuilder::kvFactory
private

Definition at line 36 of file FinalTreeBuilder.h.

Referenced by buildTree(), FinalTreeBuilder(), and ~FinalTreeBuilder().

VirtualKinematicParticleFactory* FinalTreeBuilder::pFactory
private

Definition at line 37 of file FinalTreeBuilder.h.

Referenced by buildTree(), FinalTreeBuilder(), and ~FinalTreeBuilder().