32#include <TObjString.h>
45#include <reconstruction/calibration/BeamSpotBoostInvMass/BeamSpotStandAlone.h>
46#include <reconstruction/calibration/BeamSpotBoostInvMass/Splitter.h>
47#include <reconstruction/calibration/BeamSpotBoostInvMass/tools.h>
49#include <BeamSpotStandAlone.h>
60namespace Belle2::BeamSpotCalib {
63 inline double sqrS(
double x) {
return x >= 0 ? x * x : -x * x; }
64 inline double sqrtS(
double x) {
return x >= 0 ?
sqrt(x) : -
sqrt(-x); }
66 MatrixXd getRotatedSizeMatrix(
const std::vector<double>& xySize,
double zzSize,
double kX,
double kY);
98 SpotParam(
const std::vector<double>& vals,
const std::vector<double>& errs,
const std::vector<std::vector<double>>& spls,
101 auto getSize = [order](
const std::vector<double>& sp) {
106 B2ASSERT(
"There must be least one node at this place", sp.size() >= 1);
107 return int(sp.size() + 1);
108 }
else if (order == 1) {
109 B2ASSERT(
"Must be at least two nodes in lin. spline", sp.size() >= 2);
110 return int(sp.size());
112 B2FATAL(
"Unknown order");
117 int nx = getSize(spls[0]);
118 int ny = getSize(spls[1]);
121 x.vals =
slice(vals, 0, nx);
122 y.vals =
slice(vals, nx, ny);
123 x.errs =
slice(errs, 0, nx);
124 y.errs =
slice(errs, nx, ny);
126 if (spls.size() >= 4) {
127 int nkx = getSize(spls[2]);
128 int nky = getSize(spls[3]);
131 kX.vals =
slice(vals, nx + ny, nkx);
132 kY.vals =
slice(vals, nx + ny + nkx, nky);
134 kX.errs =
slice(errs, nx + ny, nkx);
135 kY.errs =
slice(errs, nx + ny + nkx, nky);
137 if (spls.size() >= 5) {
138 int nz = getSize(spls[4]);
140 z.vals =
slice(vals, nx + ny + nkx + nky, nz);
141 z.errs =
slice(errs, nx + ny + nkx + nky, nz);
153 void add(
const Spline& spl) {
spls.push_back(spl); }
160 int nNd =
spls[0].vals.size();
161 for (
int k = 0; k < nNd; ++k) {
162 double s = 0, ss = 0;
163 for (
unsigned i = 0; i <
spls.size(); ++i) {
164 s +=
spls[i].vals[k];
168 for (
unsigned i = 0; i <
spls.size(); ++i) {
169 ss += (
spls[i].vals[k] - s) * (
spls[i].vals[k] - s);
188 Spline sLim =
spls[0];
190 double indx = (
spls.size() - 1) * v;
191 int nNd =
spls[0].vals.size();
192 for (
int k = 0; k < nNd; ++k) {
193 std::vector<double> vals;
194 for (
unsigned i = 0; i <
spls.size(); ++i) {
195 vals.push_back(
spls[i].vals[k]);
197 sort(vals.begin(), vals.end());
201 sLim.
vals[k] = vals[I] * (1 - r) + vals[I + 1] * r;
220 B2ASSERT(
"Must be at least one replica",
vars.size() >= 1);
221 return accumulate(
vars.begin(),
vars.end(), 0.) /
vars.size();
227 B2ASSERT(
"Must be at least one replica",
vars.size() >= 1);
231 s += (x - m) * (x - m);
241 B2ASSERT(
"Must be at least one replica",
vars.size() >= 1);
242 double indx = (
vars.size() - 1) * v;
246 return vars[I] * (1 - r) +
vars[I + 1] * r;
252 B2ASSERT(
"Must be at least one replica",
vars.size() >= 1);
271 double getAngle(
double SizeX,
double SizeY,
double SizeXY)
273 double C = sqrS(SizeXY);
276 double angle = 1. / 2 * atan2(2 * C, ((SizeX * SizeX) - (SizeY * SizeY)));
287 std::pair<double, double> getSizeMinMax(
double SizeX,
double SizeY,
double SizeXY)
289 double A = (SizeX * SizeX) + (SizeY * SizeY);
290 double B = (SizeX * SizeX) * (SizeY * SizeY) - (SizeXY * SizeXY * SizeXY * SizeXY);
291 double D = A * A - 4 * B;
294 B2FATAL(
"Problem with D value : " << D);
297 double Size2Min = 2 * B / (A +
sqrt(D));
298 if (abs(Size2Min) < 1e-7) Size2Min = 0;
300 B2FATAL(
"Negative BS eigen size : " << Size2Min);
302 double Size2Max = (A +
sqrt(D)) / 2;
303 return {sqrtS(Size2Min), sqrtS(Size2Max)};
313 double getSize2MinMat(
double SizeXX,
double SizeYY,
double SizeXY)
315 double A = SizeXX + SizeYY;
316 double B = SizeXX * SizeYY - (SizeXY * SizeXY);
317 double D = A * A - 4 * B;
320 B2FATAL(
"Problem with D value : " << D);
323 double Size2Min = 2 * B / (A +
sqrt(D));
359 void add(
const SpotParam& sPar,
double SizeX,
double SizeY,
double SizeXY,
double SizeZ)
375 double SizeMin, SizeMax;
376 std::tie(SizeMin, SizeMax) = getSizeMinMax(SizeX, SizeY, SizeXY);
382 double angle = 1e3 * getAngle(SizeX, SizeY, SizeXY);
388 MatrixXd matSize = getRotatedSizeMatrix({sqrS(SizeX), sqrS(SizeY), sqrS(SizeXY)}, sqrS(SizeZ), sPar.
kX.
val(sPar.
kX.
center()),
392 matXX.add(sqrtS(matSize(0, 0)));
393 matYY.add(sqrtS(matSize(1, 1)));
394 matZZ.add(sqrtS(matSize(2, 2)));
395 matXY.add(sqrtS(matSize(0, 1)));
397 matXZ.add(sqrtS(matSize(0, 2)));
398 matYZ.add(sqrtS(matSize(1, 2)));
402 double crossAngleVal = 1e3 * 2 * sqrtS(matSize(0, 0)) / sqrtS(matSize(2, 2));
409 x.getMeanSigma().print(
"x");
410 y.getMeanSigma().print(
"y");
411 kX.getMeanSigma().print(
"kX");
412 kY.getMeanSigma().print(
"kY");
413 z.getMeanSigma().print(
"z");
415 sizeX.printStat(
"sizeX");
416 sizeY.printStat(
"sizeY");
417 sizeXY.printStat(
"sizeXY");
423 sizeZ.printStat(
"sizeZ");
427 matXX.printStat(
"matXX");
428 matYY.printStat(
"matYY");
429 matZZ.printStat(
"matZZ");
430 matXY.printStat(
"matXY");
431 matXZ.printStat(
"matXZ");
432 matYZ.printStat(
"matYZ");
436 void getOutput(std::vector<VectorXd>& vtxPos, std::vector<MatrixXd>& vtxErr, MatrixXd& sizeMat)
439 int nVals =
x.spls[0].vals.size();
444 const double toCm = 1e-4;
446 for (
int i = 0; i < nVals; ++i) {
448 Vector3d vtx(
x.spls[0].vals[i]*toCm,
y.spls[0].vals[i]*toCm,
z.spls[0].vals[i]*toCm);
451 Matrix3d mS = Matrix3d::Zero();
452 mS(0, 0) = sqrS(
x.spls[0].errs[i] * toCm);
453 mS(1, 1) = sqrS(
y.spls[0].errs[i] * toCm);
454 mS(2, 2) = sqrS(
z.spls[0].errs[i] * toCm);
456 vtxPos.push_back(vtx);
457 vtxErr.push_back(mS);
462 sizeMat.resize(3, 3);
463 sizeMat(0, 0) = sqrS(
matXX.vars[0] * toCm);
464 sizeMat(1, 1) = sqrS(
matYY.vars[0] * toCm);
465 sizeMat(2, 2) = sqrS(
matZZ.vars[0] * toCm);
467 sizeMat(0, 1) = sqrS(
matXY.vars[0] * toCm);
468 sizeMat(0, 2) = sqrS(
matXZ.vars[0] * toCm);
469 sizeMat(1, 2) = sqrS(
matYZ.vars[0] * toCm);
471 sizeMat(1, 0) = sizeMat(0, 1);
472 sizeMat(2, 0) = sizeMat(0, 2);
473 sizeMat(2, 1) = sizeMat(1, 2);
478 static void setBranchVal(TTree* T, std::vector<double>* vec, TString n)
480 T->Branch(n, &vec->at(0), n +
"/D");
481 T->Branch(n +
"_low", &vec->at(1), n +
"_low/D");
482 T->Branch(n +
"_high", &vec->at(2), n +
"_high/D");
488 T->Branch(n +
"_nodes", &spl->
nodes);
489 T->Branch(n +
"_vals", &spl->
vals);
490 T->Branch(n +
"_errs", &spl->
errs);
499 TTree* T =
new TTree(
"runs",
"beam conditions of runs");
502 T->Branch(
"run", &run,
"run/I");
504 Spline xAvg =
x.getMeanSigma();
506 Spline yAvg =
y.getMeanSigma();
508 Spline zAvg =
z.getMeanSigma();
511 Spline kxAvg =
kX.getMeanSigma();
513 Spline kyAvg =
kY.getMeanSigma();
516 std::vector<double> sizeXVar =
sizeX.getStats();
518 std::vector<double> sizeYVar =
sizeY.getStats();
520 std::vector<double> sizeXYVar =
sizeXY.getStats();
522 std::vector<double> sizeZVar =
sizeZ.getStats();
525 std::vector<double> sizeMinVar =
sizeMin.getStats();
527 std::vector<double> sizeMaxVar =
sizeMax.getStats();
529 std::vector<double> xyAngleVar =
xyAngle.getStats();
532 std::vector<double> crossAngleVar =
crossAngle.getStats();
536 std::vector<double> matXXVar =
matXX.getStats();
537 std::vector<double> matYYVar =
matYY.getStats();
538 std::vector<double> matZZVar =
matZZ.getStats();
539 std::vector<double> matXYVar =
matXY.getStats();
540 std::vector<double> matXZVar =
matXZ.getStats();
541 std::vector<double> matYZVar =
matYZ.getStats();
567 double getZIPest(
const Track& tr,
double t,
const SpotParam& spotPar,
int nestMax = 5,
int nest = 0)
570 if (nest < nestMax) {
571 double zIP = getZIPest(tr, t, spotPar, nestMax, nest + 1);
573 x0 = spotPar.x.val(t) + spotPar.kX.val(t) * (zIP - spotPar.z.val(t));
574 y0 = spotPar.y.val(t) + spotPar.kY.val(t) * (zIP - spotPar.z.val(t));
576 x0 = spotPar.x.val(t);
577 y0 = spotPar.y.val(t);
580 double f0 = tr.tanlambda * (x0 * cos(tr.phi0) + y0 * sin(tr.phi0));
592 double getCorrD(
const Track& tr,
double t,
const SpotParam& spotPar)
594 double zIP = getZIPest(tr, t, spotPar);
596 double x0 = spotPar.x.val(t) + spotPar.kX.val(t) * (zIP - spotPar.z.val(t));
597 double y0 = spotPar.y.val(t) + spotPar.kY.val(t) * (zIP - spotPar.z.val(t));
599 double f0 = x0 * sin(tr.phi0) - y0 * cos(tr.phi0);
605 double getDtimeConst(
const Track& tr,
double t,
const SpotParam& spotPar)
607 double zIP = getZIPest(tr, t, spotPar);
608 double zIPM = getZIPest(tr, spotPar.z.center(), spotPar);
610 double x0 = spotPar.x.val(t) + spotPar.kX.val(t) * (zIP - spotPar.z.val(t));
611 double y0 = spotPar.y.val(t) + spotPar.kY.val(t) * (zIP - spotPar.z.val(t));
613 double xM = spotPar.x.val(spotPar.x.center()) + spotPar.kX.val(spotPar.kX.center()) * (zIPM - spotPar.z.val(spotPar.z.center()));
614 double yM = spotPar.y.val(spotPar.y.center()) + spotPar.kY.val(spotPar.kY.center()) * (zIPM - spotPar.z.val(spotPar.z.center()));
617 double f0 = (x0 - xM) * sin(tr.phi0) - (y0 - yM) * cos(tr.phi0);
629 double getCorrZ(
const Track& tr,
double t,
const SpotParam& spotPar)
631 double zIP = getZIPest(tr, t, spotPar);
633 double x0 = spotPar.x.val(t) + spotPar.kX.val(t) * (zIP - spotPar.z.val(t));
634 double y0 = spotPar.y.val(t) + spotPar.kY.val(t) * (zIP - spotPar.z.val(t));
635 double z0 = spotPar.z.val(t);
637 double f0 = z0 - tr.tanlambda * (x0 * cos(tr.phi0) + y0 * sin(tr.phi0));
650 std::pair<double, double> getStartStop(
const std::vector<Event>& evts)
652 double minT = 1e20, maxT = -1e20;
653 for (
const auto& ev : evts) {
654 minT = std::min(minT, ev.t);
655 maxT = std::max(maxT, ev.t);
661 std::vector<TString> extractFileNames(TString str)
663 std::vector<TString> files;
664 auto tempVec = str.Tokenize(
",");
665 for (
int i = 0; i < tempVec->GetEntries(); ++i) {
666 TString s = (
static_cast<TObjString*
>(tempVec->At(i)))->GetString();
667 files.push_back(s.Strip());
673 std::vector<Event> getEvents(TTree* tr)
676 std::vector<Event> events;
677 events.reserve(tr->GetEntries());
681 tr->SetBranchAddress(
"run", &evt.run);
682 tr->SetBranchAddress(
"exp", &evt.exp);
683 tr->SetBranchAddress(
"event", &evt.evtNo);
684 tr->SetBranchAddress(
"mu0_d0", &evt.mu0.d0);
685 tr->SetBranchAddress(
"mu1_d0", &evt.mu1.d0);
686 tr->SetBranchAddress(
"mu0_z0", &evt.mu0.z0);
687 tr->SetBranchAddress(
"mu1_z0", &evt.mu1.z0);
689 tr->SetBranchAddress(
"mu0_tanlambda", &evt.mu0.tanlambda);
690 tr->SetBranchAddress(
"mu1_tanlambda", &evt.mu1.tanlambda);
693 tr->SetBranchAddress(
"mu0_phi0", &evt.mu0.phi0);
694 tr->SetBranchAddress(
"mu1_phi0", &evt.mu1.phi0);
696 tr->SetBranchAddress(
"time", &evt.t);
699 for (
int i = 0; i < tr->GetEntries(); ++i) {
705 events.push_back(evt);
709 sort(events.begin(), events.end(), [](
const Event & e1,
const Event & e2) {return e1.t < e2.t;});
716 void bootStrap(std::vector<Event>& evts)
719 e.nBootStrap = gRandom->Poisson(1);
730 VectorXd linearFit(MatrixXd mat, VectorXd r)
732 MatrixXd matT = mat.transpose();
733 MatrixXd A = matT * mat;
735 VectorXd v = matT * r;
736 MatrixXd Ainv = A.inverse();
749 std::pair<std::vector<double>, std::vector<double>> linearFitErr(MatrixXd m, VectorXd r,
double& err2Mean,
double& err2press,
750 double& err2pressErr)
752 MatrixXd mT = m.transpose();
753 MatrixXd mat = mT * m;
756 MatrixXd A = mat * mT;
757 VectorXd res = A * r;
758 VectorXd dataH = m * res;
762 double err2 = (dataH - r).squaredNorm() / (r.rows() - res.rows());
770 for (
int i = 0; i < r.rows(); ++i) {
772 for (
int k = 0; k < m.cols(); ++k)
773 Ahat += m(i, k) * A(k, i);
775 double v = ((r(i) - dataH(i)) / (1 - Ahat)) * ((r(i) - dataH(i)) / (1 - Ahat));
780 press2 /= (r.rows() - 1);
783 err2pressErr =
sqrt((press2 - press * press) / r.rows()) /
sqrt(r.rows());
788 MatrixXd AT = A.transpose();
789 MatrixXd errMat = err2 * A * AT;
790 VectorXd errs2(errMat.rows());
791 for (
int i = 0; i < errs2.rows(); ++i)
792 errs2(i) = errMat(i, i);
808 VectorXd linearFitPos(MatrixXd mat, VectorXd r)
810 const double s2MinLimit = 0.0025;
811 B2ASSERT(
"Matrix size for size fit should be 3", mat.cols() == 3);
812 MatrixXd matT = mat.transpose();
813 MatrixXd A = matT * mat;
814 VectorXd v = matT * r;
815 MatrixXd Ainv = A.inverse();
817 VectorXd pars = Ainv * v;
820 double s2Min = getSize2MinMat(pars[0], pars[1], pars[2]);
821 if (pars[0] >= 0 && pars[1] >= 0 && s2Min >= s2MinLimit)
828 int nDf = r.rows() - 3;
830 double err2 = (mat * pars - r).squaredNorm() / nDf;
832 MatrixXd wMat = Ainv * matT;
833 MatrixXd wMatT = wMat.transpose();
835 MatrixXd covMat = err2 * wMat * wMatT;
836 MatrixXd covMatI = covMat.inverse();
843 TF2 fEig(
rn(), [covMatI, pars, s2MinLimit](
const double * x,
const double*) {
845 double eig2 = s2MinLimit;
851 xVec[0] = eig1 * c * c + eig2 * s * s;
852 xVec[1] = eig1 * s * s + eig2 * c * c;
853 xVec[2] = s * c * (eig1 - eig2);
856 double res = (xVec - pars).transpose() * covMatI * (xVec - pars);
858 }, s2MinLimit, 400, 0, 2 * M_PI, 0);
861 fEig.GetMinimumXY(eigHigh, phi);
863 const double cPhi = cos(phi);
864 const double sPhi = sin(phi);
866 pars[0] = eigHigh * (cPhi * cPhi) + s2MinLimit * (sPhi * sPhi);
867 pars[1] = eigHigh * (sPhi * sPhi) + s2MinLimit * (cPhi * cPhi);
868 pars[2] = sPhi * cPhi * (eigHigh - s2MinLimit);
879 TH1D* getResolution(TH2D* hRes)
881 TH1D* hSigmaAll =
new TH1D(
rn(),
"", 50, -M_PI, M_PI);
882 for (
int i = 1; i <= hRes->GetNbinsX(); ++i) {
883 TH1D* hProj = hRes->ProjectionY(
rn(), i, i);
884 double rms = hProj->GetRMS();
885 double rmsErr = hProj->GetRMSError();
886 hSigmaAll->SetBinContent(i, rms * rms);
887 hSigmaAll->SetBinError(i, 2 * abs(rms)*rmsErr);
893 TH1D* getMean(
const TH2D* hRes)
895 TH1D* hMean =
new TH1D(
rn(),
"", 50, -M_PI, M_PI);
896 for (
int i = 1; i <= hRes->GetNbinsX(); ++i) {
897 TH1D* hProj = hRes->ProjectionY(
rn(), i, i);
898 double mean = hProj->GetMean();
899 double meanErr = hProj->GetMeanError();
900 hMean->SetBinContent(i, mean);
901 hMean->SetBinError(i, meanErr);
907 double getD12th(
const Event& e,
const std::vector<double>& sizesXY)
909 double sxx = sizesXY[0];
910 double syy = sizesXY[1];
911 double sxy = sizesXY[2];
913 double cc = cos(e.mu0.phi0) * cos(e.mu1.phi0);
914 double ss = sin(e.mu0.phi0) * sin(e.mu1.phi0);
915 double sc = -(sin(e.mu0.phi0) * cos(e.mu1.phi0) + sin(e.mu1.phi0) * cos(e.mu0.phi0));
917 return ss * sxx + cc * syy + sc * sxy;
921 double getZ12th(
const Event& e,
const std::vector<double>& sizesXY)
923 double sxx = sizesXY[0];
924 double syy = sizesXY[1];
926 double corr = e.mu0.tanlambda * e.mu1.tanlambda * (sxx * cos(e.mu0.phi0) * cos(e.mu1.phi0) + syy * sin(e.mu0.phi0) * sin(
928 + (sin(e.mu0.phi0) * cos(e.mu1.phi0) + cos(e.mu0.phi0) * sin(e.mu1.phi0)));
938 void plotSpotPositionFit(
const std::vector<Event>& evts,
const SpotParam& par, TString fName)
940 TGraph* gr =
new TGraph();
941 TProfile* dProf =
new TProfile(
rn(),
"dProf", 100, -M_PI, M_PI,
"S");
942 TProfile* dProfRes =
new TProfile(
rn(),
"dProfRes", 100, -M_PI, M_PI,
"S");
944 for (
auto e : evts) {
945 if (!e.isSig)
continue;
947 double d1 = getDtimeConst(e.mu0, e.t, par);
948 double d2 = getDtimeConst(e.mu1, e.t, par);
950 gr->SetPoint(gr->GetN(), e.mu0.phi0, d1);
951 gr->SetPoint(gr->GetN(), e.mu1.phi0, d2);
953 dProf->Fill(e.mu0.phi0, d1);
954 dProf->Fill(e.mu1.phi0, d2);
957 double d1c = getCorrD(e.mu0, e.t, par);
958 double d2c = getCorrD(e.mu1, e.t, par);
960 dProfRes->Fill(e.mu0.phi0, d1c);
961 dProfRes->Fill(e.mu1.phi0, d2c);
963 TF1* f =
new TF1(
rn(),
"[0]*sin(x) - [1]*cos(x)", -M_PI, M_PI);
964 f->SetParameters(par.x.val(par.x.center()), par.y.val(par.y.center()));
966 TCanvas* c =
new TCanvas(
rn(),
"");
968 gr->GetXaxis()->SetRangeUser(-M_PI, M_PI);
969 gr->SetMaximum(+1.3 * f->GetMaximum());
970 gr->SetMinimum(-1.3 * f->GetMaximum());
972 gr->GetXaxis()->SetTitle(
"#phi_{0} [rad]");
973 gr->GetYaxis()->SetTitle(
"d_{0} [#mum]");
976 c->SaveAs(fName +
"_dots.pdf");
979 TCanvas* d =
new TCanvas(
rn(),
"");
980 gStyle->SetOptStat(0);
982 dProf->GetXaxis()->SetRangeUser(-M_PI, M_PI);
983 dProf->SetMaximum(+1.3 * f->GetMaximum());
984 dProf->SetMinimum(-1.3 * f->GetMaximum());
986 dProf->GetXaxis()->SetTitle(
"#phi_{0} [rad]");
987 dProf->GetYaxis()->SetTitle(
"d_{0} [#mum]");
991 B2INFO(
"Saving " << fName <<
" prof ");
992 d->SaveAs(fName +
"_prof.pdf");
995 TCanvas* e =
new TCanvas(
rn(),
"");
996 gStyle->SetOptStat(0);
998 dProfRes->GetXaxis()->SetRangeUser(-M_PI, M_PI);
1000 dProfRes->GetXaxis()->SetTitle(
"#phi_{0} [rad]");
1001 dProfRes->GetYaxis()->SetTitle(
"d_{0} res [#mum]");
1003 TH1D* errP =
new TH1D(
rn(),
"dErrP", 100, -M_PI, M_PI);
1004 TH1D* errM =
new TH1D(
rn(),
"dErrM", 100, -M_PI, M_PI);
1005 for (
int i = 1; i <= errP->GetNbinsX(); ++i) {
1006 errP->SetBinContent(i, dProfRes->GetBinError(i));
1007 errM->SetBinContent(i, -dProfRes->GetBinError(i));
1010 errP->Draw(
"hist same");
1011 errM->Draw(
"hist same");
1013 f->SetParameters(0, 0);
1016 B2INFO(
"Saving " << fName <<
" profRes ");
1017 e->SaveAs(fName +
"_profRes.pdf");
1023 void plotSpotZPositionFit(
const std::vector<Event>& evts,
const SpotParam& par, TString fName)
1025 TProfile* zProf =
new TProfile(
rn(),
"dProf", 100, -M_PI, M_PI,
"S");
1026 TGraph* gr =
new TGraph();
1027 for (
auto e : evts) {
1028 if (!e.isSig)
continue;
1031 double z1ip = getZIPest(e.mu0, e.t, par);
1032 double z2ip = getZIPest(e.mu1, e.t, par);
1034 double zipT = par.z.val(e.t);
1035 double zipM = par.z.val(par.z.center());
1037 double val1 = z1ip - (zipT - zipM);
1038 double val2 = z2ip - (zipT - zipM);
1040 gr->SetPoint(gr->GetN(), e.mu0.phi0, val1);
1041 gr->SetPoint(gr->GetN(), e.mu1.phi0, val2);
1043 zProf->Fill(e.mu0.phi0, val1);
1044 zProf->Fill(e.mu1.phi0, val2);
1046 TF1* f =
new TF1(
rn(),
"[0]", -M_PI, M_PI);
1047 f->SetParameter(0, par.z.val(par.z.center()));
1049 TCanvas* c =
new TCanvas(
rn(),
"");
1050 c->SetLeftMargin(0.12);
1052 gr->GetXaxis()->SetRangeUser(-M_PI, M_PI);
1053 gr->SetMaximum(1000);
1054 gr->SetMinimum(-1000);
1056 gr->GetXaxis()->SetTitle(
"#phi_{0} [rad]");
1057 gr->GetYaxis()->SetTitle(
"z_{IP} estimate [#mum]");
1060 c->SaveAs(fName +
"_dots.pdf");
1063 TCanvas* d =
new TCanvas(
rn(),
"");
1064 gStyle->SetOptStat(0);
1065 d->SetLeftMargin(0.12);
1067 zProf->GetXaxis()->SetRangeUser(-M_PI, M_PI);
1068 zProf->SetMaximum(1000);
1069 zProf->SetMinimum(-1000);
1071 zProf->GetXaxis()->SetTitle(
"#phi_{0} [rad]");
1072 zProf->GetYaxis()->SetTitle(
"z_{IP} estimate [#mum]");
1075 d->SaveAs(fName + +
"_prof.pdf");
1084 void plotSpotPositionPull(
const std::vector<Event>& evts,
const SpotParam& par, TString fName,
double cut = 70)
1086 TH1D* hPull =
new TH1D(
rn(),
"", 200, -200, 200);
1088 for (
const auto& e : evts) {
1089 if (!e.isSig)
continue;
1091 double d0 = getCorrD(e.mu0, e.t, par);
1092 double d1 = getCorrD(e.mu1, e.t, par);
1098 TCanvas* c =
new TCanvas(
rn(),
"");
1099 gStyle->SetOptStat(2210);
1102 hPull->GetXaxis()->SetTitle(
"pull [#mum]");
1103 hPull->GetYaxis()->SetTitle(
"#tracks");
1105 TLine* l =
new TLine;
1106 l->SetLineColor(kRed);
1107 l->DrawLine(-cut, 0, -cut, 500);
1108 l->DrawLine(+cut, 0, +cut, 500);
1110 c->SaveAs(fName +
".pdf");
1115 void plotKxKyFit(
const std::vector<Event>& evts,
const SpotParam& par, TString fName)
1117 TProfile* profRes =
new TProfile(
rn(),
"dProf", 100, -800, 800,
"S");
1118 TProfile* profResKx =
new TProfile(
rn(),
"dProfKx", 100, -800, 800,
"S");
1119 TProfile* profResKy =
new TProfile(
rn(),
"dProfKy", 100, -800, 800,
"S");
1124 parNoKy.kY.vals = {0};
1125 parNoKx.kX.nodes = {};
1126 parNoKy.kY.nodes = {};
1128 for (
const auto& e : evts) {
1129 if (!e.isSig)
continue;
1131 double zDiff1 = getZIPest(e.mu0, e.t, par) - par.z.val(e.t);
1132 double zDiff2 = getZIPest(e.mu1, e.t, par) - par.z.val(e.t);
1135 double d1 = getCorrD(e.mu0, e.t, par);
1136 double d2 = getCorrD(e.mu1, e.t, par);
1138 double d1KX = getCorrD(e.mu0, e.t, parNoKx);
1139 double d2KX = getCorrD(e.mu1, e.t, parNoKx);
1142 profResKx->Fill(zDiff1 * sin(e.mu0.phi0), d1KX);
1143 profResKx->Fill(zDiff2 * sin(e.mu1.phi0), d2KX);
1145 double d1KY = getCorrD(e.mu0, e.t, parNoKy);
1146 double d2KY = getCorrD(e.mu1, e.t, parNoKy);
1147 profResKy->Fill(-zDiff1 * cos(e.mu0.phi0), d1KY);
1148 profResKy->Fill(-zDiff2 * cos(e.mu1.phi0), d2KY);
1150 profRes->Fill(zDiff1, d1);
1151 profRes->Fill(zDiff2, d2);
1156 TCanvas* cX =
new TCanvas(
rn(),
"");
1157 gStyle->SetOptStat(0);
1160 profResKx->GetXaxis()->SetTitle(
"(z_{IP} - z_{IP}^{0}) sin #phi_{0} [#mum]");
1161 profResKx->GetYaxis()->SetTitle(
"d_{0} res [#mum]");
1163 TF1* f =
new TF1(
rn(),
"[0]*x", -800, 800);
1164 f->SetParameter(0, par.kX.val(par.kX.center()));
1167 cX->SaveAs(fName +
"_kX.pdf");
1169 TCanvas* cY =
new TCanvas(
rn(),
"");
1170 gStyle->SetOptStat(0);
1173 profResKy->GetXaxis()->SetTitle(
"-(z_{IP} - z_{IP}^{0}) cos #phi_{0} [#mum]");
1174 profResKy->GetYaxis()->SetTitle(
"d_{0} res [#mum]");
1176 f->SetParameter(0, par.kY.val(par.kY.center()));
1179 cY->SaveAs(fName +
"_kY.pdf");
1185 void plotXYtimeDep(
const std::vector<Event>& evts,
const SpotParam& par, TString fName)
1187 TProfile* profRes =
new TProfile(
rn(),
"dProf", 50, -0.5, 0.5);
1188 TProfile* profResTx =
new TProfile(
rn(),
"dProfTx", 50, -0.5, 0.5);
1189 TProfile* profResTy =
new TProfile(
rn(),
"dProfTy", 50, -0.5, 0.5);
1194 parNoTx.x.vals = {par.x.val(par.x.center())};
1195 parNoTy.y.nodes = {};
1196 parNoTy.y.vals = {par.y.val(par.y.center())};
1198 for (
const auto& e : evts) {
1199 if (!e.isSig)
continue;
1201 double tDiff = (e.t - par.x.val(par.x.center()));
1205 double d1 = getCorrD(e.mu0, e.t, par);
1206 double d2 = getCorrD(e.mu1, e.t, par);
1208 double d1TX = getCorrD(e.mu0, e.t, parNoTx);
1209 double d2TX = getCorrD(e.mu1, e.t, parNoTx);
1211 profResTx->Fill(tDiff * sin(e.mu0.phi0), d1TX);
1212 profResTx->Fill(tDiff * sin(e.mu1.phi0), d2TX);
1214 double d1TY = getCorrD(e.mu0, e.t, parNoTy);
1215 double d2TY = getCorrD(e.mu1, e.t, parNoTy);
1217 profResTy->Fill(-tDiff * cos(e.mu0.phi0), d1TY);
1218 profResTy->Fill(-tDiff * cos(e.mu1.phi0), d2TY);
1221 profRes->Fill(tDiff * sin(e.mu0.phi0), d1);
1222 profRes->Fill(tDiff * sin(e.mu1.phi0), d2);
1227 TCanvas* cX =
new TCanvas(
rn(),
"");
1228 gStyle->SetOptStat(0);
1232 TF1* f =
new TF1(
rn(),
"[0]*x", -1, 1);
1233 f->SetParameter(0, (par.x.val(1) - par.x.val(0)));
1235 B2INFO(
"Table value " << par.x.val(1) - par.x.val(0));
1237 cX->SaveAs(fName +
"_tX.pdf");
1247 void plotSpotZpositionPull(
const std::vector<Event>& evts,
const SpotParam& par, TString fName,
double cut = 1000)
1249 TH1D* hPull =
new TH1D(
rn(),
"", 200, -2000, 2000);
1251 for (
const auto& e : evts) {
1252 if (!e.isSig)
continue;
1254 double z0 = getCorrZ(e.mu0, e.t, par);
1255 double z1 = getCorrZ(e.mu1, e.t, par);
1261 gStyle->SetOptStat(2210);
1262 TCanvas* c =
new TCanvas(
rn(),
"");
1265 hPull->GetXaxis()->SetTitle(
"pull [#mum]");
1266 hPull->GetYaxis()->SetTitle(
"#tracks");
1268 TLine* l =
new TLine;
1269 l->SetLineColor(kRed);
1270 l->DrawLine(-cut, 0, -cut, 500);
1271 l->DrawLine(+cut, 0, +cut, 500);
1273 c->SaveAs(fName +
".pdf");
1278 void removeSpotPositionOutliers(std::vector<Event>& evts,
const SpotParam& par,
double cut = 70)
1282 for (
auto& e : evts) {
1283 if (!e.isSig)
continue;
1285 double d0 = getCorrD(e.mu0, e.t, par);
1286 double d1 = getCorrD(e.mu1, e.t, par);
1288 e.isSig = abs(d0) < cut && abs(d1) < cut;
1292 B2INFO(
"Removed fraction Position " << nRem / (nAll + 0.));
1297 void removeSpotZpositionOutliers(std::vector<Event>& evts,
const SpotParam& par,
double cut = 1000)
1301 for (
auto& e : evts) {
1302 if (!e.isSig)
continue;
1304 double z0 = getCorrZ(e.mu0, e.t, par);
1305 double z1 = getCorrZ(e.mu1, e.t, par);
1307 e.isSig = abs(z0) < cut && abs(z1) < cut;
1311 B2INFO(
"Removed fraction Position " << nRem / (nAll + 0.));
1317 std::vector<std::vector<double>> fillSplineBasesLinear(
const std::vector<Event>& evts,
const std::vector<double>& spl,
1318 std::function<
double(
Track,
double)> fun)
1321 if (n == 0 || (n == 2 && spl[0] > spl[1]))
1324 std::vector<std::vector<double>> vecs(n);
1327 for (
const auto& e : evts) {
1328 for (
int i = 0; i < e.nBootStrap * e.isSig; ++i) {
1329 vecs[0].push_back(1 * fun(e.mu0, e.t));
1330 vecs[0].push_back(1 * fun(e.mu1, e.t));
1334 for (
int k = 0; k < n; ++k) {
1335 double xCnt = spl[k];
1336 double xLow = (k == 0) ? spl[0] : spl[k - 1];
1337 double xHigh = (k == n - 1) ? spl[n - 1] : spl[k + 1];
1339 for (
const auto& e : evts) {
1342 if (xLow <= x && x < xCnt)
1343 v = (x - xLow) / (xCnt - xLow);
1344 else if (xCnt < x && x <= xHigh)
1345 v = (xHigh - x) / (xHigh - xCnt);
1348 for (
int i = 0; i < e.nBootStrap * e.isSig; ++i) {
1349 vecs[k].push_back(v * fun(e.mu0, e.t));
1350 vecs[k].push_back(v * fun(e.mu1, e.t));
1361 std::vector<std::vector<double>> fillSplineBasesZero(
const std::vector<Event>& evts,
const std::vector<double>& spl,
1362 std::function<
double(
Track,
double)> fun)
1364 int n = spl.size() + 1;
1366 std::vector<std::vector<double>> vecs(n);
1369 for (
const auto& e : evts) {
1370 for (
int i = 0; i < e.nBootStrap * e.isSig; ++i) {
1371 vecs[0].push_back(1 * fun(e.mu0, e.t));
1372 vecs[0].push_back(1 * fun(e.mu1, e.t));
1376 for (
int k = 0; k < n; ++k) {
1377 double xLow = -1e30;
1378 double xHigh = +1e30;
1382 }
else if (k == n - 1) {
1389 for (
const auto& e : evts) {
1392 if (xLow <= x && x < xHigh)
1395 for (
int i = 0; i < e.nBootStrap * e.isSig; ++i) {
1396 vecs[k].push_back(v * fun(e.mu0, e.t));
1397 vecs[k].push_back(v * fun(e.mu1, e.t));
1412 double compareSplines(
const Spline& spl1,
const Spline& spl2)
1416 double step = 0.001;
1417 for (
double x = 0; x <= 1 + step / 2; x += step) {
1418 double v1 = spl1.val(x);
1419 double e1 = spl1.err(x);
1420 double v2 = spl2.val(x);
1421 double e2 = spl2.err(x);
1423 const double maxe = std::max(e1, e2);
1424 double d = (v2 - v1) * (v2 - v1) / (maxe * maxe);
1431 double fitSpotZwidth(
const std::vector<Event>& evts,
const SpotParam& spotPar,
const std::vector<double>& sizesXY)
1434 std::vector<double> dataVec;
1435 std::vector<double> zzVec;
1438 for (
const auto& e : evts) {
1439 double z0 = getCorrZ(e.mu0, e.t, spotPar);
1440 double z1 = getCorrZ(e.mu1, e.t, spotPar);
1442 double corr = getZ12th(e, sizesXY);
1443 double z0z1Corr = z0 * z1 - corr;
1446 for (
int i = 0; i < e.nBootStrap * e.isSig; ++i) {
1447 dataVec.push_back(z0z1Corr);
1454 std::vector<double> pars, err2;
1455 double err2Mean, err2press, err2pressErr;
1456 std::tie(pars, err2) = linearFitErr(mat,
vec2vec(dataVec), err2Mean, err2press, err2pressErr);
1466 SpotParam fitSpotPositionSplines(
const std::vector<Event>& evts,
const std::vector<double>& splX,
const std::vector<double>& splY,
1467 const std::vector<double>& splKX,
const std::vector<double>& splKY)
1469 std::vector<std::vector<double>> basesX = fillSplineBasesZero(evts, splX, [](
const Track & tr,
double) {
return sin(tr.phi0);});
1470 std::vector<std::vector<double>> basesY = fillSplineBasesZero(evts, splY, [](
const Track & tr,
double) {
return -cos(tr.phi0);});
1472 std::vector<std::vector<double>> basesKX = fillSplineBasesZero(evts, splKX, [](
const Track & tr,
double) {
return sin(tr.phi0) * tr.z0;});
1473 std::vector<std::vector<double>> basesKY = fillSplineBasesZero(evts, splKY, [](
const Track & tr,
double) {
return -cos(tr.phi0) * tr.z0;});
1476 std::vector<double> dataVec;
1477 for (
const auto& e : evts) {
1478 for (
int i = 0; i < e.nBootStrap * e.isSig; ++i) {
1479 dataVec.push_back(e.mu0.d0);
1480 dataVec.push_back(e.mu1.d0);
1484 std::vector<std::vector<double>> allVecs =
merge({basesX, basesY, basesKX, basesKY});
1489 VectorXd vData =
vec2vec(dataVec);
1491 std::vector<double> pars(A.cols()), err2(A.cols());
1492 double err2Mean, err2press, err2pressErr;
1493 std::tie(pars, err2) = linearFitErr(A, vData, err2Mean, err2press, err2pressErr);
1495 for (
auto& e : err2) e =
sqrt(e);
1496 return SpotParam(pars, err2, {splX, splY, splKX, splKY});
1500 SpotParam fitSpotPositionSplines(
const std::vector<Event>& evts,
const std::vector<double>& splX,
const std::vector<double>& splY,
1501 const std::vector<double>& splKX,
const std::vector<double>& splKY,
const SpotParam& spotPars)
1503 std::vector<std::vector<double>> basesX = fillSplineBasesZero(evts, splX, [](
const Track & tr,
double) {
return sin(tr.phi0);});
1504 std::vector<std::vector<double>> basesY = fillSplineBasesZero(evts, splY, [](
const Track & tr,
double) {
return -cos(tr.phi0);});
1506 std::vector<std::vector<double>> basesKX = fillSplineBasesZero(evts, splKX, [ = ](
const Track & tr,
double t) {
return sin(tr.phi0) * (getZIPest(tr, t, spotPars) - spotPars.z.val(t));});
1507 std::vector<std::vector<double>> basesKY = fillSplineBasesZero(evts, splKY, [ = ](
const Track & tr,
double t) {
return -cos(tr.phi0) * (getZIPest(tr, t, spotPars) - spotPars.z.val(t));});
1510 std::vector<double> dataVec;
1511 for (
const auto& e : evts) {
1512 for (
int i = 0; i < e.nBootStrap * e.isSig; ++i) {
1513 dataVec.push_back(e.mu0.d0);
1514 dataVec.push_back(e.mu1.d0);
1518 std::vector<std::vector<double>> allVecs =
merge({basesX, basesY, basesKX, basesKY});
1523 VectorXd vData =
vec2vec(dataVec);
1525 std::vector<double> pars(A.cols()), err2(A.cols());
1526 double err2Mean, err2press, err2pressErr;
1527 std::tie(pars, err2) = linearFitErr(A, vData, err2Mean, err2press, err2pressErr);
1529 for (
auto& e : err2) e =
sqrt(e);
1530 auto res =
SpotParam(pars, err2, {splX, splY, splKX, splKY});
1540 SpotParam fitSpotPositionSplines(
const std::vector<Event>& evts,
const std::vector<double>& splX,
const std::vector<double>& splY)
1542 std::vector<std::vector<double>> basesX = fillSplineBasesZero(evts, splX, [](
const Track & tr,
double) {
return sin(tr.phi0);});
1543 std::vector<std::vector<double>> basesY = fillSplineBasesZero(evts, splY, [](
const Track & tr,
double) {
return -cos(tr.phi0);});
1545 std::vector<double> dataVec;
1546 for (
const auto& e : evts) {
1547 for (
int i = 0; i < e.nBootStrap * e.isSig; ++i) {
1548 dataVec.push_back(e.mu0.d0);
1549 dataVec.push_back(e.mu1.d0);
1553 std::vector<std::vector<double>> allVecs =
merge({basesX, basesY});
1557 VectorXd vData =
vec2vec(dataVec);
1559 std::vector<double> pars(A.cols()), err2(A.cols());
1560 double err2Mean, err2press, err2pressErr;
1561 std::tie(pars, err2) = linearFitErr(A, vData, err2Mean, err2press, err2pressErr);
1563 for (
auto& e : err2) e =
sqrt(e);
1564 return SpotParam(pars, err2, {splX, splY});
1573 SpotParam fitZpositionSplines(
const std::vector<Event>& evts,
const std::vector<double>& splX,
const std::vector<double>& splY,
1574 const std::vector<double>& splKX,
const std::vector<double>& splKY,
1575 const std::vector<double>& splZ)
1577 std::vector<std::vector<double>> basesX = fillSplineBasesZero(evts, splX, [](
const Track & tr,
double) {
return -tr.tanlambda * cos(tr.phi0);});
1578 std::vector<std::vector<double>> basesY = fillSplineBasesZero(evts, splY, [](
const Track & tr,
double) {
return -tr.tanlambda * sin(tr.phi0);});
1580 std::vector<std::vector<double>> basesKX = fillSplineBasesZero(evts, splKX, [](
const Track & tr,
double) {
return -tr.z0 * tr.tanlambda * cos(tr.phi0);});
1581 std::vector<std::vector<double>> basesKY = fillSplineBasesZero(evts, splKY, [](
const Track & tr,
double) {
return -tr.z0 * tr.tanlambda * sin(tr.phi0);});
1583 std::vector<std::vector<double>> basesZ = fillSplineBasesZero(evts, splZ, [](
Track,
double) {
return 1;});
1586 std::vector<double> dataVec;
1587 for (
const auto& e : evts) {
1588 for (
int i = 0; i < e.nBootStrap * e.isSig; ++i) {
1589 dataVec.push_back(e.mu0.z0);
1590 dataVec.push_back(e.mu1.z0);
1594 std::vector<std::vector<double>> allVecs =
merge({basesX, basesY, basesKX, basesKY, basesZ});
1598 VectorXd vData =
vec2vec(dataVec);
1600 std::vector<double> pars(A.cols()), err2(A.cols());
1601 double err2Mean, err2press, err2pressErr;
1602 std::tie(pars, err2) = linearFitErr(A, vData, err2Mean, err2press, err2pressErr);
1604 for (
auto& e : err2) e =
sqrt(e);
1605 return SpotParam(pars, err2, {splX, splY, splKX, splKY, splZ});
1611 SpotParam fitZpositionSplinesSimple(
const std::vector<Event>& evts,
const std::vector<double>& splZ,
const SpotParam& spotPars)
1613 std::vector<std::vector<double>> basesZ = fillSplineBasesZero(evts, splZ, [](
Track,
double) {
return 1;});
1615 std::vector<double> dataVec;
1616 for (
const auto& e : evts) {
1617 for (
int i = 0; i < e.nBootStrap * e.isSig; ++i) {
1618 double z1 = getZIPest(e.mu0, e.t, spotPars);
1619 double z2 = getZIPest(e.mu1, e.t, spotPars);
1620 dataVec.push_back(z1);
1621 dataVec.push_back(z2);
1627 VectorXd vData =
vec2vec(dataVec);
1629 std::vector<double> pars(A.cols()), err2(A.cols());
1630 double err2Mean, err2press, err2pressErr;
1631 std::tie(pars, err2) = linearFitErr(A, vData, err2Mean, err2press, err2pressErr);
1633 for (
auto& e : err2) e =
sqrt(e);
1636 parsUpd.
z.
vals = pars;
1637 parsUpd.z.errs = err2;
1638 parsUpd.z.nodes = splZ;
1646 std::vector<double> fitSpotWidthCMS(
const std::vector<Event>& evts,
const SpotParam& spotPar)
1649 std::vector<double> dataVec, ccVec, ssVec, scVec;
1652 for (
const auto& e : evts) {
1653 double d0 = getCorrD(e.mu0, e.t, spotPar);
1654 double d1 = getCorrD(e.mu1, e.t, spotPar);
1656 for (
int i = 0; i < e.nBootStrap * e.isSig; ++i) {
1657 dataVec.push_back(d0 * d1);
1659 ccVec.push_back(cos(e.mu0.phi0)*cos(e.mu1.phi0));
1660 ssVec.push_back(sin(e.mu0.phi0)*sin(e.mu1.phi0));
1661 scVec.push_back(-(sin(e.mu0.phi0)*cos(e.mu1.phi0) + sin(e.mu1.phi0)*cos(e.mu0.phi0)));
1666 MatrixXd mat =
vecs2mat({ssVec, ccVec, scVec});
1669 VectorXd resPhys = linearFitPos(mat,
vec2vec(dataVec));
1671 return {resPhys(0), resPhys(1), resPhys(2)};
1676 void plotSpotSizePull(
const std::vector<Event>& evts,
const SpotParam& spotPar,
const std::vector<double>& sizesXY)
1678 TH1D* hPull =
new TH1D(
rn(),
"", 100, -2000, 2000);
1679 for (
const auto& e : evts) {
1680 if (!e.isSig)
continue;
1682 double d0 = getCorrD(e.mu0, e.t, spotPar);
1683 double d1 = getCorrD(e.mu1, e.t, spotPar);
1685 double d12Th = getD12th(e, sizesXY);
1687 hPull->Fill(d0 * d1 - d12Th);
1689 TCanvas* c =
new TCanvas(
rn(),
"");
1691 c->SaveAs(
"pullsSize.pdf");
1696 void plotSpotSizeZPull(
const std::vector<Event>& evts,
const SpotParam& spotPar,
const std::vector<double>& sizesXY,
double sizeZZ)
1698 TH1D* hPull =
new TH1D(
rn(),
"", 100, -300e3, 600e3);
1699 for (
const auto& e : evts) {
1700 if (!e.isSig)
continue;
1702 double z0 = getCorrZ(e.mu0, e.t, spotPar);
1703 double z1 = getCorrZ(e.mu1, e.t, spotPar);
1705 double corr = getZ12th(e, sizesXY);
1706 double res = z0 * z1 - corr - sizeZZ;
1711 gStyle->SetOptStat(2210);
1712 TCanvas* c =
new TCanvas(
rn(),
"");
1714 B2INFO(
"zSizeFit mean " << hPull->GetMean());
1715 B2INFO(
"zSizeFit rms " << hPull->GetRMS());
1717 c->SaveAs(
"pullsZSize.pdf");
1724 void plotSpotSizeFit(
const std::vector<Event>& evts,
const SpotParam& par,
const std::vector<double>& sizeXY)
1726 double sxx = sizeXY[0];
1727 double syy = sizeXY[1];
1728 double sxy = sizeXY[2];
1730 gStyle->SetOptStat(0);
1732 TProfile* profSxx =
new TProfile(
rn(),
"", 50, -1, 1);
1733 TProfile* profSyy =
new TProfile(
rn(),
"", 50, -1, 1);
1734 TProfile* profSxy =
new TProfile(
rn(),
"", 50, -1, 1);
1735 for (
const auto& e : evts) {
1736 if (!e.isSig)
continue;
1738 double cc = cos(e.mu0.phi0) * cos(e.mu1.phi0);
1739 double ss = sin(e.mu0.phi0) * sin(e.mu1.phi0);
1740 double sc = - (sin(e.mu0.phi0) * cos(e.mu1.phi0) + sin(e.mu1.phi0) * cos(e.mu0.phi0));
1742 double d0 = getCorrD(e.mu0, e.t, par);
1743 double d1 = getCorrD(e.mu1, e.t, par);
1745 double data = d0 * d1;
1747 profSxx->Fill(ss, data - syy * cc - sxy * sc);
1748 profSyy->Fill(cc, data - sxx * ss - sxy * sc);
1749 profSxy->Fill(sc, data - syy * cc - sxx * ss);
1752 TCanvas* c =
new TCanvas(
rn(),
"", 1200, 500);
1756 profSxx->GetXaxis()->SetTitle(
"sin #phi_{1} sin #phi_{2}");
1757 profSxx->GetYaxis()->SetTitle(
"#LTd_{1} d_{2}#GT - corr_{xx} [#mum^{2}]");
1758 TF1* fxx =
new TF1(
rn(),
"[0]*x", -1, 1);
1759 fxx->SetParameter(0, sxx);
1764 profSyy->GetXaxis()->SetTitle(
"cos #phi_{1} cos #phi_{2}");
1765 profSyy->GetYaxis()->SetTitle(
"#LTd_{1} d_{2}#GT - corr_{yy} [#mum^{2}]");
1766 TF1* fyy =
new TF1(
rn(),
"[0]*x", -1, 1);
1767 fyy->SetParameter(0, syy);
1772 profSxy->GetXaxis()->SetTitle(
"-(sin #phi_{1} cos #phi_{2} + sin #phi_{2} cos #phi_{1})");
1773 profSxy->GetYaxis()->SetTitle(
"#LTd_{1} d_{2}#GT - corr_{xy} [#mum^{2}]");
1774 TF1* fxy =
new TF1(
rn(),
"[0]*x", -1, 1);
1775 fxy->SetParameter(0, sxy);
1778 c->SaveAs(
"SizeFit.pdf");
1783 void plotSpotZSizeFit(
const std::vector<Event>& evts,
const SpotParam& par,
const std::vector<double>& sizesXY,
double sizeZZ)
1786 gStyle->SetOptStat(0);
1789 TProfile* zzProfPhi =
new TProfile(
rn(),
"", 100, -M_PI, M_PI);
1790 TProfile* zzProfXX =
new TProfile(
rn(),
"", 100, -M_PI / 4, 2 * M_PI);
1791 TProfile* zzProfYY =
new TProfile(
rn(),
"", 100, -M_PI / 4, 2 * M_PI);
1792 TProfile* zzProfXY =
new TProfile(
rn(),
"", 100, -2 * M_PI, 2 * M_PI);
1793 TProfile* zzProfXZ =
new TProfile(
rn(),
"", 100, -2 * M_PI, 2 * M_PI);
1794 TProfile* zzProfYZ =
new TProfile(
rn(),
"", 100, -2 * M_PI, 2 * M_PI);
1797 for (
const auto& e : evts) {
1799 double z0 = getCorrZ(e.mu0, e.t, par);
1800 double z1 = getCorrZ(e.mu1, e.t, par);
1802 double corr = getZ12th(e, sizesXY);
1803 double z0z1Corr = z0 * z1 - corr;
1805 double xx = e.mu0.tanlambda * e.mu1.tanlambda * cos(e.mu0.phi0) * cos(e.mu1.phi0);
1806 double yy = e.mu0.tanlambda * e.mu1.tanlambda * sin(e.mu0.phi0) * sin(e.mu1.phi0);
1807 double xy = e.mu0.tanlambda * e.mu1.tanlambda * (sin(e.mu0.phi0) * cos(e.mu1.phi0) + cos(e.mu0.phi0) * sin(e.mu1.phi0));
1808 double xz = - (e.mu0.tanlambda * cos(e.mu0.phi0) + e.mu1.tanlambda * cos(e.mu1.phi0));
1809 double yz = - (e.mu0.tanlambda * sin(e.mu0.phi0) + e.mu1.tanlambda * sin(e.mu1.phi0));
1812 zzProfPhi->Fill(e.mu0.phi0, z0z1Corr);
1813 zzProfPhi->Fill(e.mu1.phi0, z0z1Corr);
1814 zzProfXX->Fill(xx, z0z1Corr);
1815 zzProfYY->Fill(yy, z0z1Corr);
1816 zzProfXY->Fill(xy, z0z1Corr);
1817 zzProfXZ->Fill(xz, z0z1Corr);
1818 zzProfYZ->Fill(yz, z0z1Corr);
1822 TF1* f =
new TF1(
rn(),
"[0]", -2 * M_PI, 2 * M_PI);
1823 f->SetParameter(0, sizeZZ);
1825 TCanvas* c =
new TCanvas(
rn(),
"", 1200, 500);
1829 zzProfPhi->GetXaxis()->SetTitle(
"#phi_{0} [rad]");
1830 zzProfPhi->GetYaxis()->SetTitle(
"#LTz_{1} z_{2}#GT - corr [#mum^{2}]");
1835 zzProfXX->GetXaxis()->SetTitle(
"xx sensitive");
1836 zzProfXX->GetYaxis()->SetTitle(
"#LTz_{1} z_{2}#GT - corr [#mum^{2}]");
1841 zzProfYY->GetXaxis()->SetTitle(
"yy sensitive");
1842 zzProfYY->GetYaxis()->SetTitle(
"#LTz_{1} z_{2}#GT - corr [#mum^{2}]");
1847 zzProfXY->GetXaxis()->SetTitle(
"xy sensitive");
1848 zzProfXY->GetYaxis()->SetTitle(
"#LTz_{1} z_{2}#GT - corr [#mum^{2}]");
1853 zzProfXZ->GetXaxis()->SetTitle(
"xz sensitive");
1854 zzProfXZ->GetYaxis()->SetTitle(
"#LTz_{1} z_{2}#GT - corr [#mum^{2}]");
1859 zzProfYZ->GetXaxis()->SetTitle(
"yz sensitive");
1860 zzProfYZ->GetYaxis()->SetTitle(
"#LTz_{1} z_{2}#GT - corr [#mum^{2}]");
1863 c->SaveAs(
"SizeZFit.pdf");
1869 void removeSpotSizeOutliers(std::vector<Event>& evts,
const SpotParam& spotPar,
const std::vector<double>& sizesXY,
1875 for (
auto& e : evts) {
1876 if (!e.isSig)
continue;
1878 double d0 = getCorrD(e.mu0, e.t, spotPar);
1879 double d1 = getCorrD(e.mu1, e.t, spotPar);
1880 double d12Th = getD12th(e, sizesXY);
1882 e.isSig = abs(d0 * d1 - d12Th) < cut;
1886 B2INFO(
"Removed fraction Size " << nRem / (nAll + 0.));
1891 void removeSpotSizeZOutliers(std::vector<Event>& evts,
const SpotParam& spotPar,
const std::vector<double>& sizesXY,
double sizeZZ,
1892 double cut = 150000)
1897 for (
auto& e : evts) {
1898 if (!e.isSig)
continue;
1900 double z0 = getCorrZ(e.mu0, e.t, spotPar);
1901 double z1 = getCorrZ(e.mu1, e.t, spotPar);
1903 double corr = getZ12th(e, sizesXY);
1904 double res = z0 * z1 - corr - sizeZZ;
1907 e.isSig = abs(res) < cut;
1911 B2INFO(
"Removed fraction Size " << nRem / (nAll + 0.));
1916 MatrixXd toMat(TRotation rot)
1918 MatrixXd rotM(3, 3);
1919 rotM(0, 0) = rot.XX();
1920 rotM(0, 1) = rot.XY();
1921 rotM(0, 2) = rot.XZ();
1922 rotM(1, 0) = rot.YX();
1923 rotM(1, 1) = rot.YY();
1924 rotM(1, 2) = rot.YZ();
1925 rotM(2, 0) = rot.ZX();
1926 rotM(2, 1) = rot.ZY();
1927 rotM(2, 2) = rot.ZZ();
1940 MatrixXd getRotatedSizeMatrix(
const std::vector<double>& xySize,
double zzSize,
double kX,
double kY)
1946 MatrixXd rotM = toMat(rot);
1947 MatrixXd rotMT = rotM.transpose();
1949 Matrix3d eigenMat = Matrix3d::Zero();
1950 eigenMat(0, 0) = xySize[0];
1951 eigenMat(1, 1) = xySize[1];
1952 eigenMat(0, 1) = xySize[2];
1953 eigenMat(1, 0) = xySize[2];
1954 eigenMat(2, 2) = zzSize;
1956 return (rotM * eigenMat * rotMT);
1966 std::tuple<std::vector<VectorXd>, std::vector<MatrixXd>, MatrixXd> runBeamSpotAnalysis(std::vector<Event> evts,
1967 const std::vector<double>& splitPoints)
1969 const double xyPosLimit = 70;
1970 const double xySize2Limit = 1600;
1971 const double zPosLimit = 1200;
1974 std::vector<double> indX = splitPoints;
1975 std::vector<double> indY = splitPoints;
1976 std::vector<double> indZ = splitPoints;
1979 std::vector<double> indKX = {};
1980 std::vector<double> indKY = {};
1986 for (
int k = 0; k < 1; ++k) {
1987 for (
auto& e : evts) e.isSig =
true;
1988 if (k != 0) bootStrap(evts);
1992 auto resTemp = fitSpotPositionSplines(evts, indX, indY);
1994 const int kPlot = -1;
1996 plotSpotPositionFit(evts, resTemp,
"positionFitSimpe");
1997 plotSpotPositionPull(evts, resTemp,
"pullsPositionSimple", xyPosLimit);
1999 removeSpotPositionOutliers(evts, resTemp, xyPosLimit);
2002 auto resFin = fitSpotPositionSplines(evts, indX, indY);
2004 plotSpotPositionFit(evts, resFin,
"positionFitSimpleC");
2005 plotSpotPositionPull(evts, resFin,
"pullsPositionSimpleC", xyPosLimit);
2006 plotXYtimeDep(evts, resFin,
"simplePosTimeDep");
2010 auto resZmy = fitZpositionSplinesSimple(evts, indZ, resFin);
2012 plotSpotZPositionFit(evts, resZmy,
"positionFitSimpleZ");
2013 plotSpotZpositionPull(evts, resZmy,
"zPositionPull", zPosLimit);
2016 removeSpotZpositionOutliers(evts, resZmy, zPosLimit);
2019 resZmy = fitZpositionSplinesSimple(evts, indZ, resZmy);
2023 auto resNew = fitSpotPositionSplines(evts, indX, indY, indKX, indKY, resZmy);
2025 plotSpotPositionFit(evts, resNew,
"positionFitFull");
2026 plotKxKyFit(evts, resNew,
"slopes");
2030 resZmy = fitZpositionSplinesSimple(evts, indZ, resNew);
2031 if (k == kPlot) plotSpotZPositionFit(evts, resZmy,
"positionFitSimpleZLast");
2035 resNew = fitSpotPositionSplines(evts, indX, indY, indKX, indKY, resZmy);
2038 resZmy = fitZpositionSplinesSimple(evts, indZ, resNew);
2039 resNew = fitSpotPositionSplines(evts, indX, indY, indKX, indKY, resZmy);
2043 auto vecXY = fitSpotWidthCMS(evts, resNew);
2044 if (k == kPlot) plotSpotSizePull(evts, resNew, vecXY);
2045 removeSpotSizeOutliers(evts, resNew, vecXY, xySize2Limit);
2046 vecXY = fitSpotWidthCMS(evts, resNew);
2047 if (k == kPlot) plotSpotSizeFit(evts, resNew, vecXY);
2051 double sizeZZ = fitSpotZwidth(evts, resNew, vecXY);
2054 plotSpotZSizeFit(evts, resNew, vecXY, sizeZZ);
2055 plotSpotSizeZPull(evts, resNew, vecXY, sizeZZ);
2061 allPars.add(resNew, sqrtS(vecXY[0]), sqrtS(vecXY[1]), sqrtS(vecXY[2]), sqrtS(sizeZZ));
2068 std::vector<VectorXd> vtxPos;
2069 std::vector<MatrixXd> vtxErr;
2072 allPars.
getOutput(vtxPos, vtxErr, sizeMat);
2074 return std::make_tuple(vtxPos, vtxErr, sizeMat);
Class that bundles various TrackFitResults.
double sqrt(double a)
sqrt for double
Eigen::MatrixXd vecs2mat(const std::vector< std::vector< double > > &vecs)
merge columns (from std::vectors) into ROOT matrix
std::vector< Atom > slice(std::vector< Atom > vec, int s, int e)
Slice the vector to contain only elements with indexes s .. e (included)
std::vector< std::vector< double > > merge(const std::vector< std::vector< std::vector< double > > > &toMerge)
merge { vector<double> a, vector<double> b} into {a, b}
Eigen::VectorXd vec2vec(const std::vector< double > &vec)
std vector -> ROOT vector
TString rn()
Get random string.
Event containing two tracks.
structure containing most of the beam spot parameters
void print()
Print BeamSpot parameters.
Spline z
spline for BS center position as a function of time (z coordinate)
Spline x
spline for BS center position as a function of time (x coordinate)
SpotParam(const std::vector< double > &vals, const std::vector< double > &errs, const std::vector< std::vector< double > > &spls, int order=0)
Constructor based output of the linear regression, assuming zero-order splines vals,...
Spline kX
spline for BS angle in the xz plane as a function of time
Spline kY
spline for BS angle in the yz plane as a function of time
Spline y
spline for BS center position as a function of time (y coordinate)
track parameters (neglecting curvature)
Spline with uncertainty obtained from the boot-strap replicas.
void add(const Spline &spl)
add boot-strap replica
std::vector< Spline > spls
vector with replicas
Spline getMeanSigma()
Get mean and 1-sigma errors of the spline values.
Spline getLimit(double v)
quantile of all points in spline, v=0.5 : median, v=0.16: lower 68% bound, v=0.84 : upper 68% bound
variable with uncertainty from boot-strap replicas
std::vector< double > getStats()
Get basic stats.
std::vector< double > vars
vector of variable values for all replicas
double getMean()
Get mean value.
double getLimit(double v)
Get quantile (v=0.5 -> median, v=0.16,v=0.84 68% confidence interval)
void add(double x)
add value to the replicas
double getSigma()
Get standard deviation.
void printStat(TString n)
Print variable of name n with stat-info.
structure including all variables of interest with uncertainties from boot-strap
UnknowSpline kY
BS angle in yz plane.
UnknowVar crossAngle
derived value of the crossing angle of the HER & LER beams
UnknowVar matZZ
ZZ element of BS size cov matrix.
UnknowVar sizeMin
smallest eigenvalue of the BS size cov matrix (similar to sizeY)
void printStat()
Print interesting statistics from boot-strap.
UnknowVar matYY
YY element of BS size cov matrix.
UnknowVar sizeZ
BS size in z direction.
UnknowSpline z
BS position (z coordinate)
UnknowVar sizeY
BS size in y direction.
UnknowVar matXZ
XZ element of BS size cov matrix.
void getOutput(std::vector< VectorXd > &vtxPos, std::vector< MatrixXd > &vtxErr, MatrixXd &sizeMat)
get output in Belle2-like format
UnknowVar matXY
XY element of BS size cov matrix.
UnknowSpline y
BS position (y coordinate)
UnknowVar sizeX
BS size in x direction.
static void setBranchVal(TTree *T, std::vector< double > *vec, TString n)
save bootstrap variable to TTree
UnknowVar matXX
XX element of BS size cov matrix.
void save2tree(TString fName)
save everything to TTree
UnknowVar sizeMax
middle eigenvalue of the BS size cov matrix (similar to sizeX)
static void setBranchSpline(TTree *T, Spline *spl, TString n)
save bootstrap spline to TTree
void add(const SpotParam &sPar, double SizeX, double SizeY, double SizeXY, double SizeZ)
add next boot-strap replica of the BS parameters
UnknowVar sizeXY
off-diagonal component of BS size cov matrix in frame where z' is aligned with z
UnknowSpline x
BS position (x coordinate)
UnknowVar xyAngle
angle of the BS in xy plane when z' is aligned with z
UnknowVar matYZ
YZ element of BS size cov matrix.
UnknowSpline kX
BS angle in xz plane.
double val(double x) const
get value of spline at point x
std::vector< double > nodes
vector of spline nodes
std::vector< double > errs
vector of spline errors
std::vector< double > vals
vector of spline values
double center() const
Get center of the spline domain.