16 #include <Eigen/Dense>
20 #include <tracking/calibration/InvariantMassStandAlone.h>
21 #include <tracking/calibration/Splitter.h>
22 #include <tracking/calibration/tools.h>
24 #include <InvariantMassStandAlone.h>
29 using Eigen::MatrixXd;
30 using Eigen::VectorXd;
40 namespace InvariantMassCalib {
45 vector<Event> getEvents(TTree* tr)
49 events.reserve(tr->GetEntries());
53 tr->SetBranchAddress(
"run", &evt.run);
54 tr->SetBranchAddress(
"exp", &evt.exp);
55 tr->SetBranchAddress(
"event", &evt.evtNo);
57 TVector3* p0 =
nullptr;
58 TVector3* p1 =
nullptr;
60 tr->SetBranchAddress(
"mu0_p", &p0);
61 tr->SetBranchAddress(
"mu1_p", &p1);
63 tr->SetBranchAddress(
"mu0_pid", &evt.mu0.pid);
64 tr->SetBranchAddress(
"mu1_pid", &evt.mu1.pid);
67 tr->SetBranchAddress(
"time", &evt.t);
70 for (
int i = 0; i < tr->GetEntries(); ++i) {
78 events.push_back(evt);
82 sort(events.begin(), events.end(), [](Event e1, Event e2) {return e1.t < e2.t;});
90 vector<double> getInvMassPars(
const vector<Event>& )
99 tuple<vector<VectorXd>, vector<MatrixXd>, MatrixXd> runInvariantMassAnalysis(vector<Event> evts,
100 const vector<double>& splitPoints)
102 int n = splitPoints.size() + 1;
104 B2ASSERT(
"No split points for InvariantMass calibration", n == 1);
105 vector<VectorXd> invMassVec(n);
106 vector<MatrixXd> invMassVecUnc(n);
107 MatrixXd invMassVecSpred;
109 invMassVec[0].resize(1);
110 invMassVecUnc[0].resize(1, 1);
111 invMassVecSpred.resize(1, 1);
113 auto res = getInvMassPars(evts);
114 invMassVec[0](0) = res[0];
115 invMassVecUnc[0](0, 0) = res[1];
116 invMassVecSpred(0, 0) = res[2];
119 return make_tuple(invMassVec, invMassVecUnc, invMassVecSpred);