20 const std::vector<RefCountedKinematicParticle>&
input)
const {
31 std::vector<KinematicRefittedTrackState*> rStates;
32 std::vector<RefCountedVertexTrack> refTracks = vtx.
tracks();
33 for (std::vector<RefCountedVertexTrack>::const_iterator
i = refTracks.begin();
i != refTracks.end(); ++
i) {
39 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));
40 ch += (*i)->linearizedTrack()->charge();
41 rStates.push_back(rs);
45 double differ = en * en - (par(3) * par(3) + par(4) * par(4) + par(5) * par(5));
47 par(6) =
sqrt(differ);
49 LogDebug(
"FinalTreeBuilder") <<
"Fit failed: Current precision does not allow to calculate the mass\n";
65 for (
int i = 1;
i < 8;
i++) {
66 for (
int j = 1;
j < 8;
j++) {
68 sCov(
i - 1,
j - 1) = cov(
i,
j);
94 resTree->addParticle(pVrt, dVrt, nPart);
97 std::vector<RefCountedKinematicParticle> rrP;
99 std::vector<RefCountedKinematicParticle>::const_iterator
j;
100 std::vector<RefCountedVertexTrack>::const_iterator
i;
101 for (j = input.begin(), i = refTracks.begin(); j != input.end() && i != refTracks.end(); ++
j, ++
i) {
113 rrP.push_back(nPart);
114 if ((*j)->correspondingTree() !=
nullptr) {
120 resTree->addTree(cdVertex, tree);
124 resTree->addParticle(dVrt, nV, nPart);
133 std::vector<RefCountedVertexTrack> refTracks = vtx.
tracks();
134 int size = refTracks.size();
141 double energy_total =
sqrt(par(3) * par(3) + par(6) * par(6) + par(5) * par(5) + par(4) * par(4));
143 std::vector<RefCountedVertexTrack>::const_iterator rt_i;
145 for (rt_i = refTracks.begin(); rt_i != refTracks.end(); rt_i++) {
148 double rho = param[0];
149 double theta = param[1];
150 double phi = param[2];
151 double mass = param[5];
153 if ((**rt_i).linearizedTrack()->charge() != 0) {
154 a = -(**rt_i).refittedState()->freeTrajectoryState().parameters().magneticFieldInInverseGeV(vtx.
position()).
z() *
155 (**rt_i).refittedState()->freeTrajectoryState().parameters().charge();
163 jc_el(1, 1) = -a *
cos(phi) / (rho *
rho);
164 jc_el(2, 1) = -a *
sin(phi) / (rho *
rho);
165 jc_el(3, 1) = -a / (rho * rho *
tan(theta));
167 jc_el(3, 2) = -a / (rho *
sin(theta) *
sin(theta));
169 jc_el(1, 3) = -a *
sin(phi) /
rho;
170 jc_el(2, 3) = a *
cos(phi) /
rho;
173 double energy_local =
sqrt(a * a / (rho * rho) * (1 + 1 / (
tan(theta) *
tan(theta))) + mass * mass);
175 jc_el(4, 4) = energy_total * mass / (par(6) * energy_local);
177 jc_el(4, 1) = (-(energy_total / energy_local * a * a / (rho * rho * rho *
sin(theta) *
sin(theta))) +
178 par(3) * a / (rho *
rho) *
cos(phi) + par(4) * a / (rho *
rho) *
sin(phi) +
179 par(5) * a / (rho * rho *
tan(theta))) /
182 jc_el(4, 2) = (-(energy_total / energy_local * a * a / (rho * rho *
sin(theta) *
sin(theta) *
tan(theta))) +
183 par(5) * a / (rho *
sin(theta) *
sin(theta))) /
186 jc_el(4, 3) = (par(3) *
sin(phi) - par(4) *
cos(phi)) * a / (rho * par(6));
188 jac.sub(4, i_int * 4 + 4, jc_el);
192 cov.sub(1, 1, asHepMatrix<7>((**rt_i).fullCovariance()));
195 AlgebraicMatrix fullCovMatrix(asHepMatrix<7>((**rt_i).fullCovariance()));
207 cov.sub(i_int * 4 + 4, i_int * 4 + 4, m_m_cov);
210 cov.sub(1, i_int * 4 + 4, x_p_cov);
211 cov.sub(i_int * 4 + 4, 1, p_x_cov);
217 for (std::vector<RefCountedVertexTrack>::const_iterator rt_j = refTracks.begin(); rt_j != refTracks.end(); rt_j++) {
221 cov.sub(i_int * 4 + 4, j_int * 4 + 4, i_k_cov_m);
222 cov.sub(j_int * 4 + 4, i_int * 4 + 4, i_k_cov_m.T());
232 return jac * cov * jac.T();
void replaceCurrentParticle(RefCountedKinematicParticle newPart) const
AlgebraicVector4 kinematicMomentumVector() const
std::vector< RefCountedVertexTrack > tracks() const
RefCountedKinematicTree buildTree(const CachingVertex< 6 > &vtx, const std::vector< RefCountedKinematicParticle > &input) const
Sin< T >::type sin(const T &t)
ROOT::Math::SVector< double, 7 > AlgebraicVector7
Geom::Theta< T > theta() const
VirtualKinematicParticleFactory * pFactory
AlgebraicSymMatrix77 kinematicParametersCovariance() const
static std::string const input
CLHEP::HepMatrix AlgebraicMatrix
Cos< T >::type cos(const T &t)
void movePointerToTheTop() const
RefCountedKinematicParticle particle(const KinematicState &kineState, float &chiSquared, float °reesOfFr, ReferenceCountingPointer< KinematicParticle > previousParticle, KinematicConstraint *lastConstraint=nullptr) const
float totalChiSquared() const
Tan< T >::type tan(const T &t)
float degreesOfFreedom() const
ROOT::Math::SVector< double, 4 > AlgebraicVector4
KinematicVertexFactory * kvFactory
TString nPart(Int_t part, TString string, TString delimit=";", Bool_t removerest=true)
AlgebraicMatrixMM tkToTkCovariance(const RefCountedVertexTrack t1, const RefCountedVertexTrack t2) const
AlgebraicVector7 kinematicParameters() const
GlobalPoint position() const
ROOT::Math::SMatrix< double, 7, 7, ROOT::Math::MatRepSym< double, 7 > > AlgebraicSymMatrix77
ROOT::Math::SVector< double, 6 > AlgebraicVector6
static RefCountedKinematicVertex vertex(const VertexState &state, float totalChiSq, float degreesOfFr)
tuple size
Write out results.
AlgebraicMatrix momentumPart(const CachingVertex< 6 > &vtx, const AlgebraicVector7 &par) const