ATLAS Offline Software
Loading...
Searching...
No Matches
cfMassErr.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
3*/
4
5//Calculate mass and mass error for any subset of tracks
9#include <cmath>
10#include <array>
11#include <cfenv>
12
13namespace Trk {
14
15
16void cfmasserr(VKVertex * vk, const int *list, double *MASS, double *sigM)
17{
18 int NTRK=vk->TrackList.size();
19 //Deliberately not using make_unique
20 std::unique_ptr < double[] > deriv(new double[3*NTRK+3]);
21 double ptot[4]={0.};
22 std::vector< std::array<double,6> > pmom(NTRK);
23 double dm2dpx, dm2dpy, dm2dpz, ee, pt, px, py, pz, cth;
24
25 double fieldPos[3];
26 fieldPos[0]=vk->refIterV[0]+vk->fitV[0];
27 fieldPos[1]=vk->refIterV[1]+vk->fitV[1];
28 fieldPos[2]=vk->refIterV[2]+vk->fitV[2];
29 double vBx,vBy,vBz;
30 Trk::vkalMagFld::getMagFld(fieldPos[0], fieldPos[1], fieldPos[2],vBx,vBy,vBz,(vk->vk_fitterControl).get());
31
32 for(int it=0; it<NTRK; it++){
33 if (list[it]) {
34 auto trk=vk->TrackList[it].get();
35 double constBF = Trk::vkalMagFld::getEffField(vBx, vBy, vBz, trk->fitP[1], trk->fitP[0]) * vkalMagCnvCst ;
36 pmom[it][4] = pt = std::abs( constBF/trk->fitP[2] );
37 pmom[it][5] = cth = 1. /tan(trk->fitP[0]);
38 pmom[it][0] = px = pt * cos(trk->fitP[1]);
39 pmom[it][1] = py = pt * sin(trk->fitP[1]);
40 pmom[it][2] = pz = pt * cth;
41 double mmm=trk->getMass();
42 pmom[it][3] = sqrt(px*px + py*py + pz*pz + mmm*mmm);
43 ptot[0] += px;
44 ptot[1] += py;
45 ptot[2] += pz;
46 ptot[3] += pmom[it][3];
47 }
48 }
49
50 for(int it = 0; it < NTRK; ++it) {
51 if (list[it]) {
52 pt = pmom[it][4];
53 cth= pmom[it][5];
54 px = pmom[it][0];
55 py = pmom[it][1];
56 pz = pmom[it][2];
57 ee = pmom[it][3];
58 dm2dpx = (ptot[3] / ee * px - ptot[0]) * 2.;
59 dm2dpy = (ptot[3] / ee * py - ptot[1]) * 2.;
60 dm2dpz = (ptot[3] / ee * pz - ptot[2]) * 2.;
61 deriv[it*3 + 0] = dm2dpz * ((-pt) * (cth * cth + 1.)); /* d(M2)/d(Theta) */
62 deriv[it*3 + 1] = -dm2dpx * py + dm2dpy * px; /* d(M2)/d(Phi) */
63 deriv[it*3 + 2] = (-dm2dpx * px - dm2dpy*py - dm2dpz*pz)/vk->TrackList[it]->fitP[2]; /* d(M2)/d(Rho) */
64 } else {
65 deriv[it*3 + 0] = deriv[it*3 + 1] = deriv[it*3 + 2] = 0.;
66 }
67 }
68//----
69 double covM2=0.;
70 for(int i=0; i<NTRK*3; i++){
71 double tmp=0.;
72 for(int j=0; j<NTRK*3; j++){
73 tmp += ARR2D_FS(vk->ader, vkalNTrkM*3+3, i+3, j+3) *deriv[j];
74 }
75 tmp *= deriv[i];
76 if(std::isnan(tmp)) {tmp=0.;}
77 if(std::isinf(tmp)) {tmp=0.;}
78 covM2 += tmp;
79 }
80 std::feclearexcept(FE_ALL_EXCEPT);
81 if(covM2<1.e-10)covM2=1.e-10;
82//----
83 (*MASS) = (ptot[3]-ptot[2])*(ptot[3]+ptot[2])-ptot[1]*ptot[1]-ptot[0]*ptot[0];
84 if((*MASS)<1.e-10) (*MASS) = 1.e-10;
85 (*MASS) = sqrt(*MASS);
86 (*sigM) = sqrt(covM2) / 2. / (*MASS);
87}
88
89
90
91} /* End of namespace */
92
#define vkalMagCnvCst
Definition CommonPars.h:23
#define ARR2D_FS(name, N, i, j)
Definition CommonPars.h:29
#define vkalNTrkM
Definition CommonPars.h:22
std::vector< std::unique_ptr< VKTrack > > TrackList
double ader[(3 *vkalNTrkM+3) *(3 *vkalNTrkM+3)]
std::unique_ptr< VKalVrtControl > vk_fitterControl
static void getMagFld(const double, const double, const double, double &, double &, double &, const VKalVrtControlBase *)
static double getEffField(double bx, double by, double bz, double phi, double theta)
Definition VKalVrtBMag.h:60
Ensure that the ATLAS eigen extensions are properly loaded.
void cfmasserr(VKVertex *vk, const int *list, double *MASS, double *sigM)
Definition cfMassErr.cxx:16
@ pz
global momentum (cartesian)
Definition ParamDefs.h:61
@ px
Definition ParamDefs.h:59
@ py
Definition ParamDefs.h:60