11 #include <analysis/ClusterUtility/ClusterUtils.h>
12 #include <framework/logging/Logger.h>
38 TVector3 direction = cluster->getClusterPosition() - vertex;
42 const double E = cluster->getEnergy(hypo);
43 const double px = E * sin(direction.Theta()) * cos(direction.Phi());
44 const double py = E * sin(direction.Theta()) * sin(direction.Phi());
45 const double pz = E * cos(direction.Theta());
47 const TLorentzVector l(px, py, pz, E);
64 TMatrixDSym covmatecl = cluster->getCovarianceMatrix3x3();
67 TMatrixDSym covmatcombined(6);
68 for (
int i = 0; i < 3; i++) {
69 for (
int j = 0; j <= i ; j++) {
70 covmatcombined(i, j) = covmatcombined(j, i) = covmatecl(i, j);
71 covmatcombined(i + 3, j + 3) = covmatcombined(j + 3, i + 3) = covmatvertex(i, j);
78 TMatrixD jacobian(4, 6);
80 const double R = cluster->getR();
81 const double energy = cluster->getEnergy(hypo);
82 const double theta = cluster->getTheta();
83 const double phi = cluster->getPhi();
85 const double st = sin(theta);
86 const double ct = cos(theta);
87 const double sp = sin(phi);
88 const double cp = cos(phi);
90 const double clx = R * st * cp;
91 const double cly = R * st * sp;
92 const double clz = R * ct;
94 const double vx = vertex.X();
95 const double vy = vertex.Y();
96 const double vz = vertex.Z();
98 const double dx = clx - vx;
99 const double dy = cly - vy;
100 const double dz = clz - vz;
101 const double dx2 = dx * dx;
102 const double dy2 = dy * dy;
103 const double dz2 = dz * dz;
105 const double r2 = (dx * dx + dy * dy + dz * dz);
106 const double r12 = sqrt(r2);
107 const double r32 = pow(r2, 1.5);
110 jacobian(0, 0) = dx / r12;
111 jacobian(0, 1) = -energy * R * ((dx * dy * cp) + ((dy2 + dz2) * sp)) * st / (r32);
112 jacobian(0, 2) = energy * R * (((dy2 + dz2) * cp * ct) - (dx * dy * ct * sp) + (dx * dz * st)) / (r32);
113 jacobian(0, 3) = -energy * (dy2 + dz2) / (r32);
114 jacobian(0, 4) = energy * dx * dy / (r32);
115 jacobian(0, 5) = energy * dx * dz / (r32);
118 jacobian(1, 0) = dy / r12;
119 jacobian(1, 1) = energy * R * (((dx2 + dz2) * cp) + (dx * dy * sp)) * st / (r32);
120 jacobian(1, 2) = energy * R * ((-dx * dy * cp * ct) + ((dx2 + dz2) * ct * sp) + (dy * dz * st)) / (r32);
121 jacobian(1, 3) = energy * dx * dy / (r32);
122 jacobian(1, 4) = -energy * (dx2 + dz2) / (r32);
123 jacobian(1, 5) = energy * dy * dz / (r32);
126 jacobian(2, 0) = dz / r12;
127 jacobian(2, 1) = energy * R * dz * (-dy * cp + dx * sp) * st / (r32);
128 jacobian(2, 2) = -energy * R * ((dx * dz * cp * ct) + (dy * dz * ct * sp) + (dx2 + dy2) * st) / (r32);
129 jacobian(2, 3) = energy * dx * dz / (r32);
130 jacobian(2, 4) = energy * dy * dz / (r32);
131 jacobian(2, 5) = -energy * (dx2 + dy2) / (r32);
134 jacobian(3, 0) = 1.0;
135 jacobian(3, 1) = 0.0;
136 jacobian(3, 2) = 0.0;
137 jacobian(3, 3) = 0.0;
138 jacobian(3, 4) = 0.0;
139 jacobian(3, 5) = 0.0;
141 TMatrixDSym covmatCart(4);
142 covmatCart = covmatcombined.Similarity(jacobian);
161 TMatrixDSym covmatCart(7);
164 for (
int i = 0; i < 4; i++) {
165 for (
int j = 0; j <= i ; j++) {
166 covmatCart(i, j) = covmatCart(j, i) = covmat4x4(i, j);
171 for (
int i = 0; i < 3; i++) {
172 for (
int j = 0; j <= i ; j++) {
173 covmatCart(i + 4, j + 4) = covmatCart(j + 4, i + 4) = covmatvertex(i, j);
185 B2WARNING(
"Beamspot not available, using (0, 0, 0) as IP position instead.");
186 return TVector3(0.0, 0.0, 0.0);
194 B2WARNING(
"Beam parameters not available, using ((1, 0, 0), (0, 1, 0), (0, 0, 1)) as IP covariance matrix instead.");
196 TMatrixDSym covmat(3);
197 for (
int i = 0; i < 3; ++i) {