6 #include <TMatrixTUtils.h>
19 std::cout <<
" AtTools::AtKinematics: Initializing Kinematical Fit matrices "
22 auto alpha0 = std::make_unique<TMatrixD>(4 * fNumParticles, 1);
23 fAlphaP.push_back(std::move(alpha0));
25 for (
auto i = 0; i < fNumParticles; ++i) {
26 auto alpha = std::make_unique<TMatrixD>(4, 1);
27 fAlphaP.push_back(std::move(alpha));
34 const Double_t M_Ener = M * 931.49401 / 1000.0;
35 Double_t p = brho * Z * (2.99792458 / 10.0);
36 Double_t E = TMath::Sqrt(TMath::Power(p, 2) + TMath::Power(M_Ener, 2)) - M_Ener;
38 std::cout <<
" Brho : " << brho <<
" - p : " << p <<
" - E : " << E <<
"\n";
39 return std::make_tuple(p, E);
43 Double_t thetalab, Double_t K_eject)
46 double Et1 = K_proj + m1;
48 double Et3 = K_eject + m3;
50 double m4_ex, Ex, theta_cm;
53 s = pow(m1, 2) + pow(m2, 2) + 2 * m2 * Et1;
54 u = pow(m2, 2) + pow(m3, 2) - 2 * m2 * Et3;
56 m4_ex = sqrt((cos(thetalab) * omega(s, pow(m1, 2), pow(m2, 2)) * omega(u, pow(m2, 2), pow(m3, 2)) -
57 (s - pow(m1, 2) - pow(m2, 2)) * (pow(m2, 2) + pow(m3, 2) - u)) /
77 return sqrt(x * x +
y *
y + z * z - 2 * x *
y - 2 *
y * z - 2 * x * z);
86 std::vector<Double_t> parOut;
88 Int_t rowDim = fAlphaP[0]->GetNrows();
89 std::cout <<
" Row dimension " << rowDim <<
"\n";
90 if (rowDim != fNumParticles * 4 || rowDim != parameters.size()) {
91 std::cerr <<
" Wrong matrix/parameter dimension. Aborting... "
98 for (
auto i = 0; i < fNumParticles; ++i) {
99 for (
auto j = 0; j < 4; ++j) {
100 (*fAlphaP.at(i + 1))[j][0] = parameters[i * 4 + j];
102 (*fAlphaP.at(0)).SetSub(i * 4, 0, (*fAlphaP.at(i + 1)));
106 TMatrixD dalpha(4 * fNumParticles, 1);
108 alpha = fAlphaP.at(0).get();
115 TMatrixD Cov = CalculateCovariance();
117 double weighting = 0.05;
119 for (
auto i = 0; i < fNumIterations; i++) {
121 TMatrixD D = CalculateD(alpha);
124 TMatrixD Vd = D * Cov * Dt;
126 Cov = Cov - Cov * Dt * Vd * D * Cov * weighting;
129 TMatrixD d = Calculated(alpha);
130 TMatrixD temp1 = (d + D * dalpha);
131 TMatrixD lambda = Vd * temp1;
134 TMatrixD lambdaT = lambda;
135 chi2 = lambdaT.T() * temp1;
138 *alpha = *fAlphaP.at(0).get() - weighting * Cov * Dt * lambda;
139 dalpha = *alpha - *fAlphaP.at(0).get();
140 *fAlphaP.at(0).get() = *alpha;
144 if (fabs(chi2[0][0]) < 1.0)
148 for (
auto i = 0; i < 4 * fNumParticles; ++i)
149 parOut.push_back((*alpha)[i][0]);
154 TMatrixD AtTools::AtKinematics::Calculated(TMatrixD *alpha)
158 double mt = fTargetMass * 931.494;
166 for (
auto i = 1; i < fNumParticles; ++i) {
167 mout1 += (*alpha)[4 * i][0];
168 mout2 += (*alpha)[4 * i + 1][0];
169 mout3 += (*alpha)[4 * i + 2][0];
170 mout4 += (*alpha)[4 * i + 3][0];
174 double h1 = (*alpha)[0][0] - mout1;
175 double h2 = (*alpha)[1][0] - mout2;
176 double h3 = (*alpha)[2][0] - mout3;
177 double h4 = (*alpha)[3][0] + mt - mout4;
189 TMatrixD AtTools::AtKinematics::CalculateD(TMatrixD *alpha)
192 TMatrixD Dval(4, 4 * fNumParticles);
195 for (
auto i = 0; i < fNumParticles; ++i) {
200 for (
int j = 1; j < 4; j++)
203 Dval.SetSub(0, i * 4, Dsub);
211 TMatrixD AtTools::AtKinematics::CalculateCovariance()
213 TMatrixD Vval(4 * fNumParticles, 4 * fNumParticles);
216 for (
auto i = 0; i < fNumParticles; ++i) {
220 for (
int j = 0; j < 4; j++)
223 Vval.SetSub(i * 4, i * 4, Vsub);
231 void AtTools::AtKinematics::ResetMatrices()
233 for (
auto &alpha : fAlphaP)
237 void AtTools::AtKinematics::PrintMatrices()
239 for (
auto &alpha : fAlphaP)
251 double num = KE * KE + 2 * (m1 + m2) * (KE + m1);
252 double denom = 2 * m1 * (KE + m1 + m2);
261 return GetBeta(gamma) * TMath::C() * 1e-7;
269 return std::sqrt(gamma * gamma - 1) / gamma;
276 return p / std::sqrt(p * p + m * m);
285 assert(beta >= 0 && beta <= 1);
286 return 1 / std::sqrt(1 - beta * beta);
294 return std::sqrt(gamma * gamma - 1) * mass;