67 int xmax = histo->FindLastBinAbove(0.0);
68 int xmin = histo->FindFirstBinAbove(0.0);
71 std::cout <<
"Initial Integral: " << initialIntegral << std::endl;
72 std::cout <<
"Cut variable: " << cutvariable << std::endl;
73 std::cout <<
"Cut fraction: " << cutFraction << std::endl;
78 cutvalue = histo->GetXaxis()->GetBinLowEdge(xmin);
79 while(histo->Integral(xmin,xmax) > initialIntegral*(1.0-cutFraction)){
81 cutvalue = histo->GetXaxis()->GetBinLowEdge(xmin);
85 cutvalue = histo->GetXaxis()->GetBinUpEdge(xmax);
86 while(histo->Integral(xmin,xmax) > initialIntegral*(1.0-cutFraction)){
88 cutvalue = histo->GetXaxis()->GetBinUpEdge(xmax);
119 addHisto1d(
"impact_parameter_up_h",
"recon_z [mm]", 450, -20.0, 70.0);
120 addHisto1d(
"impact_parameter_down_h",
"recon_z [mm]", 450, -20.0, 70.0);
122 TH1F* down_h = (TH1F*)
histos1d[
m_name+
"_impact_parameter_down_h"];
124 for(
int i=0; i < hh->GetNbinsX(); i++){
126 TH1F* projy = (TH1F*)hh->ProjectionY((
"projy_bin_"+std::to_string(i+1)).c_str(),i+1,i+1);
127 if(projy->GetEntries() < 1)
continue;
130 int start_bin = projy->FindBin(0.0);
131 int end_bin = projy->FindLastBinAbove(0.0);
132 double refIntegral = projy->Integral(start_bin,end_bin);
133 int cutz0_bin = start_bin;
134 double testIntegral = refIntegral;
135 while(testIntegral > (1.0-alpha)*refIntegral && cutz0_bin < end_bin-1){
136 cutz0_bin = cutz0_bin + 1;
137 testIntegral = projy->Integral(cutz0_bin, end_bin);
140 double cutz0_up = projy->GetXaxis()->GetBinLowEdge(cutz0_bin);
141 for(
int j=0; j<(int)refIntegral; j++){
142 up_h->Fill(hh->GetXaxis()->GetBinCenter(i+1),cutz0_up/refIntegral);
146 end_bin = projy->FindFirstBinAbove(0.0);
147 start_bin = projy->FindBin(0.0);
148 refIntegral = projy->Integral(end_bin, start_bin);
149 cutz0_bin = start_bin;
150 testIntegral = refIntegral;
151 while(testIntegral > (1.0-alpha)*refIntegral && cutz0_bin > end_bin+1){
152 cutz0_bin = cutz0_bin - 1;
153 testIntegral = projy->Integral(end_bin, cutz0_bin);
156 double cutz0_down = projy->GetXaxis()->GetBinUpEdge(cutz0_bin);
157 for(
int j=0; j<(int)refIntegral; j++){
158 down_h->Fill(hh->GetXaxis()->GetBinCenter(i+1),cutz0_down/refIntegral);
162 TF1* fitFunc =
new TF1(
"linear_fit",
"[0]*(x-[1])",5.0,70.0);
163 TFitResultPtr fitResult = (TFitResultPtr)up_h->Fit(
"linear_fit",
"QS",
"",5.0,70.0);
165 double m_p = fitResult->GetParams()[0];
166 double a_p = fitResult->GetParams()[1];
168 fitResult = (TFitResultPtr)down_h->Fit(
"linear_fit",
"QS",
"",5.0,70.0);
170 double m_d = fitResult->GetParams()[0];
171 double a_d = fitResult->GetParams()[1];
176 while(std::abs((m_p*(x-a_p) - (m_d*(x-a_d)))) < diff ){
178 diff = std::abs((m_p*(x-a_p)) - (m_d*(x-a_d)));
181 double beta = .5*((m_p*(x-a_p)) + (m_p*(x-a_d)));
182 std::vector<double> params {m_p,a_p,m_d,a_d, beta, x};
401 std::string histoname =
m_name+
"_"+histogramName+
"_h";
404 if(
histos1d[histoname]->GetEntries() < 1){
405 std::cout <<
"[ZBiHistos]::WARNING: Background Model is NULL: " <<
406 histogramName <<
" distribution is empty and could not be fit!" << std::endl;
409 double originalXmin =
histos1d[histoname]->GetXaxis()->GetXmin();
410 double originalXmax =
histos1d[histoname]->GetXaxis()->GetXmax();
413 int lastbin =
histos1d[histoname]->FindLastBinAbove(0.0);
414 if(
histos1d[histoname]->Integral() < start_nevents)
415 start_nevents =
histos1d[histoname]->GetBinContent(
histos1d[histoname]->GetMaximumBin());
416 int firstbin = lastbin - 1;
417 double test_integral = 0.0;
418 while(test_integral < start_nevents &&
histos1d[histoname]->GetBinLowEdge(firstbin) > 0.0){
419 test_integral =
histos1d[histoname]->Integral(firstbin, lastbin);
420 firstbin = firstbin - 1;
423 double xmin =
histos1d[histoname]->GetBinLowEdge(firstbin);
424 double xmax =
histos1d[histoname]->GetBinLowEdge(lastbin+1);
425 histos1d[histoname]->GetXaxis()->SetRangeUser(xmin,xmax);
428 double best_seed_chi2 = 9999999.9;
432 TF1* fitFunc_seed =
new TF1(
"fitFunc_seed",
"[0]*exp([1]*x)", xmin, xmax);
434 TFitResultPtr fitResult = (TFitResultPtr)
histos1d[histoname]->Fit(fitFunc_seed,
"QSIM",
"", xmin,xmax);
435 seed_0 = fitResult->Parameter(0);
436 seed_1 = fitResult->Parameter(1);
437 if(fitResult->Ndf() > 0){
438 best_seed_chi2 = fitResult->Chi2()/fitResult->Ndf();
441 TRandom3* ran =
new TRandom3();
444 best_seed_chi2 = 999999.9;
445 for(
int i=0; i < 50; i++){
446 fitFunc_seed->SetParameters(std::abs(ran->Gaus((
double)start_nevents,3.0)), -std::abs(ran->Uniform(0.01,1.0)));
447 fitResult = (TFitResultPtr)
histos1d[histoname]->Fit(fitFunc_seed,
"QSIM",
"", xmin,xmax);
449 if(fitResult->Ndf() <= 0)
452 if(fitResult->Chi2()/fitResult->Ndf() < best_seed_chi2){
453 if(fitResult->Parameter(0) < 1000.0)
455 best_seed_chi2 = fitResult->Chi2()/fitResult->Ndf();
456 seed_0 = fitResult->Parameter(0);
457 seed_1 = fitResult->Parameter(1);
461 double best_chi2 = 99999.9;
466 TF1* fitFunc =
new TF1(
"fitFunc",
" (x<[2])*([0]*exp([1]*x)) + (x>=[2])*(-[3]*x)", xmin, xmax);
467 fitFunc->FixParameter(0, seed_0);
468 fitFunc->FixParameter(1, seed_1);
469 for(
int i=0; i < 1000; i++){
470 fitFunc->FixParameter(2, (
double)i /10.0);
477 fitFunc_seed->FixParameter(0, seed_0);
478 fitFunc_seed->FixParameter(1, seed_1);
479 double seed_3 = fitFunc_seed->Eval(
histos1d[histoname]->GetBinCenter(
histos1d[histoname]->FindLastBinAbove(0.0)));
483 fitResult = (TFitResultPtr)
histos1d[histoname]->Fit(fitFunc,
"QSIM",
"", xmin,xmax);
485 if(fitResult->Ndf() <= 0)
490 if(fitResult->Chi2()/fitResult->Ndf() < best_chi2){
491 best_chi2 = fitResult->Chi2()/fitResult->Ndf();
492 param_2 = fitResult->Parameter(2);
493 best_seed_3 = seed_3;
500 fitFunc->FixParameter(0, seed_0);
501 fitFunc->FixParameter(1, seed_1);
502 fitFunc->FixParameter(2, param_2);
503 fitFunc->FixParameter(3, best_seed_3);
505 fitResult = (TFitResultPtr)
histos1d[histoname]->Fit(fitFunc,
"QSIM",
"", xmin,xmax);
509 histos1d[histoname]->GetXaxis()->SetRangeUser(originalXmin,originalXmax);
518 std::string histoname =
m_name+
"_"+histogramName+
"_h";
521 if(
histos1d[histoname]->GetEntries() < 1){
522 std::cout <<
"[ZBiHistos]::WARNING: Background Model is NULL: " <<
523 histogramName <<
" distribution is empty and could not be fit!" << std::endl;
526 double originalXmin =
histos1d[histoname]->GetXaxis()->GetXmin();
527 double originalXmax =
histos1d[histoname]->GetXaxis()->GetXmax();
530 int lastbin =
histos1d[histoname]->FindLastBinAbove(0.0);
531 if(
histos1d[histoname]->Integral() < start_nevents)
532 start_nevents =
histos1d[histoname]->GetBinContent(
histos1d[histoname]->GetMaximumBin());
533 int firstbin = lastbin - 1;
534 double test_integral = 0.0;
535 while(test_integral < start_nevents &&
histos1d[histoname]->GetBinLowEdge(firstbin) > 0.0){
536 test_integral =
histos1d[histoname]->Integral(firstbin, lastbin);
537 firstbin = firstbin - 1;
540 double xmin =
histos1d[histoname]->GetBinLowEdge(firstbin);
541 double xmax =
histos1d[histoname]->GetBinLowEdge(lastbin+1);
542 histos1d[histoname]->GetXaxis()->SetRangeUser(xmin,xmax);
545 double best_seed_chi2 = 9999999.9;
549 TF1* fitFunc =
new TF1(
"fitFunc",
"[0]*exp([1]*x)", xmin, xmax);
550 TFitResultPtr fitResult = (TFitResultPtr)
histos1d[histoname]->Fit(fitFunc,
"QSIM",
"", xmin,xmax);
551 seed_0 = fitResult->Parameter(0);
552 seed_1 = fitResult->Parameter(1);
553 if(fitResult->Ndf() > 0){
554 best_seed_chi2 = fitResult->Chi2()/fitResult->Ndf();
557 TRandom3* ran =
new TRandom3();
561 for(
int i=0; i < 30; i++){
562 fitFunc->SetParameters(std::abs(ran->Gaus((
double)start_nevents,3.0)), -std::abs(ran->Uniform(0.01,1.0)));
563 fitResult = (TFitResultPtr)
histos1d[histoname]->Fit(fitFunc,
"QSIM",
"", xmin,xmax);
565 if(fitResult->Ndf() <= 0)
567 if(fitFunc->GetProb() < 0.001)
570 if(fitResult->Chi2()/fitResult->Ndf() < best_seed_chi2){
571 if(fitResult->Parameter(0) < 1000.0)
573 best_seed_chi2 = fitResult->Chi2()/fitResult->Ndf();
574 seed_0 = fitResult->Parameter(0);
575 seed_1 = fitResult->Parameter(1);
579 double param_0 = seed_0;
580 double param_1 = seed_1;
581 for(
int i=0; i < 30; i++){
582 fitFunc->SetParameters(ran->Gaus(seed_0,1.0), -std::abs(ran->Gaus(seed_1,1.0)));
583 fitResult = (TFitResultPtr)
histos1d[histoname]->Fit(fitFunc,
"QSIM",
"", xmin,xmax);
584 if(fitResult->Ndf() <= 0)
586 if(fitFunc->GetProb() < 0.001)
589 if(fitResult->Chi2()/fitResult->Ndf() < best_seed_chi2){
590 if(fitResult->Parameter(0) < 1000.0)
592 best_seed_chi2 = fitResult->Chi2()/fitResult->Ndf();
593 param_0 = fitResult->Parameter(0);
594 param_1 = fitResult->Parameter(1);
598 fitFunc->FixParameter(0, param_0);
599 fitFunc->FixParameter(1, param_1);
600 fitResult = (TFitResultPtr)
histos1d[histoname]->Fit(fitFunc,
"QSIM",
"", xmin,xmax);
604 histos1d[histoname]->GetXaxis()->SetRangeUser(originalXmin,originalXmax);
615 std::string histoname =
m_name+
"_"+histogramName+
"_h";
618 if(
histos1d[histoname]->GetEntries() < 1){
619 std::cout <<
"[ZBiHistos]::WARNING: Background Model is NULL: " <<
620 histogramName <<
" distribution is empty and could not be fit!" << std::endl;
623 double originalXmin =
histos1d[histoname]->GetXaxis()->GetXmin();
624 double originalXmax =
histos1d[histoname]->GetXaxis()->GetXmax();
627 int lastbin =
histos1d[histoname]->FindLastBinAbove(0.0);
628 if(
histos1d[histoname]->Integral() < start_nevents)
629 start_nevents =
histos1d[histoname]->GetBinContent(
histos1d[histoname]->GetMaximumBin());
630 int firstbin = lastbin - 1;
631 double test_integral = 0.0;
632 while(test_integral < start_nevents &&
histos1d[histoname]->GetBinLowEdge(firstbin) > 0.0){
633 test_integral =
histos1d[histoname]->Integral(firstbin, lastbin);
634 firstbin = firstbin - 1;
637 double xmin =
histos1d[histoname]->GetBinLowEdge(firstbin);
638 double xmax =
histos1d[histoname]->GetBinLowEdge(lastbin+1);
639 histos1d[histoname]->GetXaxis()->SetRangeUser(xmin,xmax);
642 double best_seed_chi2 = 9999999.9;
646 TF1* fitFunc_seed =
new TF1(
"fitFunc_seed",
"[0]*exp([1]*x)", xmin, xmax);
648 TFitResultPtr fitResult = (TFitResultPtr)
histos1d[histoname]->Fit(fitFunc_seed,
"QSIM",
"", xmin,xmax);
649 seed_0 = fitResult->Parameter(0);
650 seed_1 = fitResult->Parameter(1);
651 if(fitResult->Ndf() > 0 && fitFunc_seed->GetProb() > 0.001){
652 best_seed_chi2 = fitResult->Chi2()/fitResult->Ndf();
655 TRandom3* ran =
new TRandom3();
659 for(
int i=0; i < 30; i++){
660 fitFunc_seed->SetParameters(std::abs(ran->Gaus((
double)start_nevents,3.0)), -std::abs(ran->Uniform(0.01,1.0)));
661 fitResult = (TFitResultPtr)
histos1d[histoname]->Fit(fitFunc_seed,
"QSIM",
"", xmin,xmax);
663 if(fitResult->Ndf() <= 0)
665 if(fitFunc_seed->GetProb() < 0.001)
668 if(fitResult->Chi2()/fitResult->Ndf() < best_seed_chi2){
669 if(fitResult->Parameter(0) < 1000.0)
671 best_seed_chi2 = fitResult->Chi2()/fitResult->Ndf();
672 seed_0 = fitResult->Parameter(0);
673 seed_1 = fitResult->Parameter(1);
677 double best_chi2 = 99999.9;
679 TF1* fitFunc =
new TF1(
"fitFunc",
" (x<[2])*([0]*exp([1]*x)) + (x>=[2])*([0]*exp([1]*[2]))", xmin, xmax);
680 fitFunc->FixParameter(0, seed_0);
681 fitFunc->FixParameter(1, seed_1);
682 for(
int i=0; i < 1000; i++){
683 fitFunc->FixParameter(2, (
double)i /10.0);
684 fitResult = (TFitResultPtr)
histos1d[histoname]->Fit(fitFunc,
"QSIM",
"", xmin,xmax);
686 if(fitResult->Ndf() <= 0)
688 if(fitFunc->GetProb() < 0.001)
691 if(fitResult->Chi2()/fitResult->Ndf() < best_chi2){
692 best_chi2 = fitResult->Chi2()/fitResult->Ndf();
693 param_2 = fitResult->Parameter(2);
699 fitFunc->FixParameter(0, seed_0);
700 fitFunc->FixParameter(1, seed_1);
701 fitFunc->FixParameter(2, param_2);
702 fitResult = (TFitResultPtr)
histos1d[histoname]->Fit(fitFunc,
"QSIM",
"", xmin,xmax);
706 histos1d[histoname]->GetXaxis()->SetRangeUser(originalXmin,originalXmax);
1046 TF1* fitFunc =
new TF1(
"fitfunc",
"[0]* exp( (x<=([1]+[3]))*(-0.5*((x-[1])^2)/([2]^2)) + (x>=[1]+[3])*(-0.5*([3]^2/[2]^2)-(x-[1]-[3])/[4]) )", -100.0, 100.0);
1048 std::string histoname =
m_name+
"_tritrig_zVtx_"+cutname+
"_h";
1049 if(
histos1d[histoname]->GetEntries() < 1){
1050 std::cout <<
"WARNING: Background Model is NULL: " <<
1051 cutname <<
" tritrig zVtx distribution was empty and could not be fit!" << std::endl;
1055 TFitResultPtr gausResult = (TFitResultPtr)
histos1d[histoname]->Fit(
"gaus",
"QS");
1056 double gaus0 = gausResult->GetParams()[0];
1057 double gaus1 = gausResult->GetParams()[1];
1058 double gaus2 = gausResult->GetParams()[2];
1060 gausResult =
histos1d[histoname]->Fit(
"gaus",
"QS",
"",gaus1-2.5*gaus2, gaus1+10.0*gaus2);
1061 gaus0 = gausResult->GetParams()[0];
1062 gaus1 = gausResult->GetParams()[1];
1063 gaus2 = gausResult->GetParams()[2];
1064 double xmin = gaus1 - 2.5*gaus2;
1065 double xmax =
histos1d[histoname]->GetBinCenter(
histos1d[histoname]->FindLastBinAbove(0.0)+1);
1069 double tailZ = gaus1 + 3.0*gaus2;
1070 double tail_l = 50.0;
1071 TRandom3* ran =
new TRandom3();
1074 double best_chi2 = 9999999.9;
1077 double best_gaus0, best_gaus1, best_gaus2;
1082 for(
int i =10; i < iteration; i=i+2){
1083 tailZ = gaus1 +(double)(iteration/10.0)*gaus2;
1084 fitFunc->SetParameters(gaus0, gaus1, gaus2, tailZ, tail_l);
1085 TFitResultPtr fitResult = (TFitResultPtr)
histos1d[histoname]->Fit(fitFunc,
"QLSIM",
"", xmin,xmax);
1086 if(fitResult->Ndf() <= 0)
1088 if(fitResult->Chi2()/fitResult->Ndf() < best_chi2){
1089 best_chi2 = fitResult->Chi2()/fitResult->Ndf();
1090 best_gaus0 = fitResult->Parameter(0);
1091 best_gaus1 = fitResult->Parameter(1);
1092 best_gaus2 = fitResult->Parameter(2);
1093 best_tailZ = fitResult->Parameter(3);
1094 best_tail_l = fitResult->Parameter(4);
1095 tail_l = fitResult->Parameter(4);
1099 fitFunc->SetParameters(best_gaus0, best_gaus1, best_gaus2, best_tailZ, best_tail_l);
1100 TFitResultPtr fitResult = (TFitResultPtr)
histos1d[histoname]->Fit(fitFunc,
"LSIM",
"", xmin, xmax);
1102 std::cout <<
"Finished fitting ztail" << std::endl;
1109 TF1* fitFunc =
new TF1(
"fitfunc",
"[0]* exp( (x<=([1]+[3]))*(-0.5*((x-[1])^2)/([2]^2)) + (x>=[1]+[3])*(-0.5*([3]^2/[2]^2)-(x-[1]-[3])/[4]) )", -100.0, 100.0);
1111 std::string histoname =
m_name+
"_tritrig_zVtx_"+cutname+
"_h";
1112 if(
histos1d[histoname]->GetEntries() < 1)
1115 TFitResultPtr gausResult = (TFitResultPtr)
histos1d[histoname]->Fit(
"gaus",
"QS");
1116 double gaus0 = gausResult->GetParams()[0];
1117 double gaus1 = gausResult->GetParams()[1];
1118 double gaus2 = gausResult->GetParams()[2];
1119 gausResult =
histos1d[histoname]->Fit(
"gaus",
"QS",
"",gaus1-3.0*gaus2, gaus1+10.0*gaus2);
1120 gaus0 = gausResult->GetParams()[0];
1121 gaus1 = gausResult->GetParams()[1];
1122 gaus2 = gausResult->GetParams()[2];
1123 double xmin = gaus1 - 2.5*gaus2;
1124 double xmax =
histos1d[histoname]->GetBinCenter(
histos1d[histoname]->FindLastBinAbove(0.0)+1);
1128 double tailZ = gaus1 + 3.0*gaus2;
1129 double tail_l = 50.0;
1130 TRandom3* ran =
new TRandom3();
1133 double best_chi2 = 99999.9;
1136 double best_gaus0, best_gaus1, best_gaus2;
1139 for(
int i =10; i < iteration; i=i+2){
1141 tailZ = gaus1 +(double)(iteration/10.0)*gaus2;
1142 fitFunc->SetParameters(gaus0, gaus1, gaus2, tailZ, tail_l);
1143 TFitResultPtr fitResult = (TFitResultPtr)
histos1d[histoname]->Fit(fitFunc,
"LSIM",
"", xmin,xmax);
1144 if(fitResult->Ndf() <= 0)
1146 if(fitResult->Chi2() < best_chi2){
1147 best_chi2 = fitResult->Chi2()/fitResult->Ndf();
1148 best_gaus0 = fitResult->Parameter(0);
1149 best_gaus1 = fitResult->Parameter(1);
1150 best_gaus2 = fitResult->Parameter(2);
1151 best_tailZ = fitResult->Parameter(3);
1152 best_tail_l = fitResult->Parameter(4);
1156 fitFunc->SetParameters(best_gaus0, best_gaus1, best_gaus2, best_tailZ, best_tail_l);
1157 TFitResultPtr fitResult = (TFitResultPtr)
histos1d[histoname]->Fit(fitFunc,
"LSIM",
"", xmin, xmax);
1160 double testIntegral = fitFunc->Integral(zcut, 100.0);
1161 while(testIntegral > max_tail_events){
1163 testIntegral = fitFunc->Integral(zcut, 100.0);
1171 TF1* fitFunc =
new TF1(
"fitfunc",
"[0]*exp( (((x-[1])/[2])<[3])*(-0.5*(x-[1])^2/[2]^2) + (((x-[1])/[2])>=[3])*(0.5*[3]^2-[3]*(x-[1])/[2]))", -100.0, 100.0);
1173 std::string histoname =
m_name+
"_"+zVtxHistoname;
1174 if(
histos1d[histoname]->GetEntries() < 1)
1176 TFitResultPtr gausResult = (TFitResultPtr)
histos1d[histoname]->Fit(
"gaus",
"QS");
1177 double gaus1 = gausResult->GetParams()[1];
1178 double gaus2 = gausResult->GetParams()[2];
1179 gausResult =
histos1d[histoname]->Fit(
"gaus",
"QS",
"",gaus1-3.0*gaus2, gaus1+10.0*gaus2);
1180 gaus1 = gausResult->GetParams()[1];
1181 gaus2 = gausResult->GetParams()[2];
1182 double tailZ = gaus1 + 3.0*gaus2;
1184 fitFunc->SetParameters(gausResult->GetParams()[0], gaus1, gaus2, 3.0);
1185 TFitResultPtr fitResult = (TFitResultPtr)
histos1d[histoname]->Fit(fitFunc,
"LSIM",
"", gaus1-2.0*gaus2, gaus1+10.0*gaus2);
1188 double testIntegral = fitFunc->Integral(zcut, 90.0);
1189 while(testIntegral > max_tail_events){
1191 testIntegral = fitFunc->Integral(zcut, 90.0);