32 #include <THnSparse.h> 35 #include <TObjString.h> 36 #include <Riostream.h> 40 #include <TGraphAsymmErrors.h> 44 #include <THashList.h> 45 #include <TParameter.h> 105 TString fileNameData =
"AnalysisResults.root",
106 TString fileNameSave =
"efficiency_new.root")
110 gObjNameExtension = objNameExtension;
145 printf(
"plotting efficiency versus %s...\n", var.Data());
148 if (var ==
"centrality") xDim = 1;
149 else if (var ==
"pt") xDim = 2;
150 else if (var ==
"y") xDim = 3;
151 else if (var ==
"phi") xDim = 4;
152 else if (var ==
"charge") xDim = 5;
154 printf(
"incorrect variable. Choices are centrality, pt, y, phi and charge.\n");
159 TFile *
file =
new TFile(fileNameData.Data(),
"read");
160 if (!file || !file->IsOpen()) {
161 printf(
"cannot open file %s \n",fileNameData.Data());
164 TList *listTT =
static_cast<TList*
>(file->FindObjectAny(Form(
"TotalTracksPerChamber%s", gObjNameExtension.Data())));
165 TList *listTD =
static_cast<TList*
>(file->FindObjectAny(Form(
"TracksDetectedPerChamber%s", gObjNameExtension.Data())));
166 THnSparse *TT =
static_cast<THnSparse*
>(listTT->At(10));
167 THnSparse *TD =
static_cast<THnSparse*
>(listTD->At(10));
171 TString nameAdd[3] = {
"",
"Low",
"Up"};
172 TString titleAdd[3] = {
"",
" - lower limit",
" - upper limit"};
173 for (
Int_t i = 0; i < 1 || (saveEdges && i < 3); ++i) {
174 effVsX[i] =
CreateGraph(Form(
"trackingEffVs%s%s",var.Data(),nameAdd[i].Data()),
175 Form(
"Measured tracking efficiency versus %s%s",var.Data(),titleAdd[i].Data()));
187 for (
Int_t ix = 1; ix <= TT->GetAxis(xDim)->GetNbins(); ix++) {
189 if (print) cout << var.Data() <<
" " << TT->GetAxis(xDim)->GetBinLowEdge(ix) <<
"-" << TT->GetAxis(xDim)->GetBinUpEdge(ix) <<
":" << endl;
192 TT->GetAxis(xDim)->SetRange(ix, ix);
193 TD->GetAxis(xDim)->SetRange(ix, ix);
200 GetTrackingEfficiency(chEff, chEffErr, dummy, effVsX, ix-1, TT->GetAxis(xDim)->GetBinCenter(ix), print);
205 effVsX[0]->SetPoint(ix-1,TT->GetAxis(xDim)->GetBinCenter(ix),1.);
206 effVsX[0]->SetPointError(ix-1,0.,0.,1.,0.);
211 effVsX[1]->SetPoint(ix-1,TT->GetAxis(xDim)->GetBinCenter(ix),0.);
212 effVsX[1]->SetPointError(ix-1,0.,0.,0.,0.);
215 effVsX[2]->SetPoint(ix-1,TT->GetAxis(xDim)->GetBinCenter(ix),1.);
216 effVsX[2]->SetPointError(ix-1,0.,0.,0.,0.);
228 for (
Int_t i = 0; i < 1 || (saveEdges && i < 3); ++i)
BeautifyGraph(*effVsX[i], var.Data(),
"efficiency");
231 new TCanvas(Form(
"cTrackingEffVs%s",var.Data()), Form(
"Measured tracking efficiency versus %s",var.Data()),1000,400);
232 effVsX[0]->DrawClone(
"ap");
236 file =
new TFile(fileNameSave.Data(),
"update");
237 for (
Int_t i = 0; i < 1 || (saveEdges && i < 3); ++i) effVsX[i]->Write(0x0, TObject::kOverwrite);
241 for (
Int_t i = 0; i < 1 || (saveEdges && i < 3); ++i)
delete effVsX[i];
252 printf(
"plotting integrated efficiency versus %s...\n", var.Data());
257 printf(
"Cannot compute integrated efficiency without run-by-run weights\n");
262 ifstream inFile(runList.Data());
263 if (!inFile.is_open()) {
264 printf(
"cannot open file %s\n",runList.Data());
270 Form(
"Integrated tracking efficiency versus %s",var.Data()));
279 while (!inFile.eof()) {
283 currRun.ReadLine(inFile,kTRUE);
284 if(currRun.IsNull() || !currRun.IsDec())
continue;
285 Int_t run = currRun.Atoi();
287 printf(
"run %d: ", run);
290 TString dataFile = Form(
"runs/%d/%s", run, fileNameData.Data());
291 TString outFile = Form(
"runs/%d/%s", run, fileNameSave.Data());
297 printf(
"weight not found for run %s\n", currRun.Data());
304 TFile *
file =
new TFile(outFile.Data(),
"read");
305 if (!file || !file->IsOpen()) {
306 printf(
"cannot open file\n");
310 effVsX[0] =
static_cast<TGraphAsymmErrors*
>(file->FindObjectAny(Form(
"trackingEffVs%sLow",var.Data())));
311 effVsX[1] =
static_cast<TGraphAsymmErrors*
>(file->FindObjectAny(Form(
"trackingEffVs%sUp",var.Data())));
312 if (!effVsX[0] || !effVsX[1]) {
313 printf(
"trackingEffVs%sLow(Up) object not found\n", var.Data());
319 n = effVsX[0]->GetN();
320 x.Set(n, effVsX[0]->GetX());
321 for (
Int_t i = 0; i < 2; ++i) {
325 }
else if (n != effVsX[0]->GetN()) {
326 printf(
"number of points in graph trackingEffVs%sLow(Up) for run %d is different than from previous runs\n", var.Data(), run);
332 for (
Int_t ix = 0; ix < n; ++ix) {
333 Double_t ieffErr[2] = {effVsX[0]->GetErrorYlow(ix), effVsX[1]->GetErrorYhigh(ix)};
334 for (
Int_t i = 0; i < 2; ++i) {
335 rec[i][ix] += w*effVsX[i]->GetY()[ix];
336 effErr[i][ix] += w2*ieffErr[i]*ieffErr[i];
350 for (
Int_t ix = 0; ix < n; ++ix) {
352 intEffVsX->SetPoint(ix, x[ix], rec[1][ix]/gen);
353 intEffVsX->SetPointError(ix, 0., 0., (rec[1][ix]-rec[0][ix]+TMath::Sqrt(effErr[0][ix]))/gen, TMath::Sqrt(effErr[1][ix])/gen);
359 for (
Int_t ix = 0; ix < n; ++ix) {
361 printf(
"impossible to integrate, all weights = 0 or unknown ?!?\n");
363 intEffVsX->SetPoint(ix, x[ix], -1.);
364 intEffVsX->SetPointError(ix, 0., 0., 0., 0.);
374 new TCanvas(Form(
"cIntegratedTrackingEffVs%s",var.Data()), Form(
"Integrated tracking efficiency versus %s",var.Data()),1000,400);
375 intEffVsX->DrawClone(
"ap");
379 TFile *
file =
new TFile(fileNameSave.Data(),
"update");
380 intEffVsX->Write(0x0, TObject::kOverwrite);
394 printf(
"plotting efficiency versus %s/%s...\n", xVar.Data(), yVar.Data());
397 if (xVar ==
"centrality") xDim = 1;
398 else if (xVar ==
"pt") xDim = 2;
399 else if (xVar ==
"y") xDim = 3;
400 else if (xVar ==
"phi") xDim = 4;
401 else if (xVar ==
"charge") xDim = 5;
403 printf(
"incorrect variable. Choices are centrality, pt, y, phi and charge.\n");
407 if (yVar ==
"centrality") yDim = 1;
408 else if (yVar ==
"pt") yDim = 2;
409 else if (yVar ==
"y") yDim = 3;
410 else if (yVar ==
"phi") yDim = 4;
411 else if (yVar ==
"charge") yDim = 5;
413 printf(
"incorrect variable. Choices are centrality, pt, y, phi and charge.\n");
418 TFile *
file =
new TFile(fileNameData.Data(),
"read");
419 if (!file || !file->IsOpen()) {
420 printf(
"cannot open file %s\n",fileNameData.Data());
423 TList *listTT =
static_cast<TList*
>(file->FindObjectAny(Form(
"TotalTracksPerChamber%s", gObjNameExtension.Data())));
424 TList *listTD =
static_cast<TList*
>(file->FindObjectAny(Form(
"TracksDetectedPerChamber%s", gObjNameExtension.Data())));
425 THnSparse *TT =
static_cast<THnSparse*
>(listTT->At(10));
426 THnSparse *TD =
static_cast<THnSparse*
>(listTD->At(10));
429 Int_t nxBins = TT->GetAxis(xDim)->GetNbins();
430 Int_t nyBins = TT->GetAxis(yDim)->GetNbins();
431 TH2F *effVsXY =
new TH2F(Form(
"trackingEffVs%s-%s",xVar.Data(),yVar.Data()),
432 Form(
"Measured tracking efficiency versus %s and %s",xVar.Data(),yVar.Data()),
433 nxBins, TT->GetAxis(xDim)->GetBinLowEdge(1), TT->GetAxis(xDim)->GetBinUpEdge(nxBins),
434 nyBins, TT->GetAxis(yDim)->GetBinLowEdge(1), TT->GetAxis(yDim)->GetBinUpEdge(nyBins));
435 effVsXY->SetDirectory(0);
446 for (
Int_t ix = 1; ix <= nxBins; ++ix) {
449 TT->GetAxis(xDim)->SetRange(ix, ix);
450 TD->GetAxis(xDim)->SetRange(ix, ix);
452 for (
Int_t iy = 1; iy <= nyBins; ++iy) {
455 TT->GetAxis(yDim)->SetRange(iy, iy);
456 TD->GetAxis(yDim)->SetRange(iy, iy);
466 effVsXY->Fill(TT->GetAxis(xDim)->GetBinCenter(ix),TT->GetAxis(yDim)->GetBinCenter(iy),chEff[0]);
467 effVsXY->SetBinError(ix,iy,TMath::Max(chEffErr[0][0], chEffErr[1][0]));
472 effVsXY->Fill(TT->GetAxis(xDim)->GetBinCenter(ix),TT->GetAxis(yDim)->GetBinCenter(iy),0.);
473 effVsXY->SetBinError(ix,iy,1.);
485 effVsXY->GetXaxis()->SetTitle(xVar.Data());
486 effVsXY->GetXaxis()->CenterTitle(kTRUE);
487 effVsXY->GetXaxis()->SetLabelFont(22);
488 effVsXY->GetXaxis()->SetTitleFont(22);
489 effVsXY->GetYaxis()->SetTitle(yVar.Data());
490 effVsXY->GetYaxis()->CenterTitle(kTRUE);
491 effVsXY->GetYaxis()->SetLabelFont(22);
492 effVsXY->GetYaxis()->SetTitleFont(22);
493 effVsXY->GetZaxis()->SetTitle(
"efficiency");
494 effVsXY->GetZaxis()->SetLabelFont(22);
495 effVsXY->GetZaxis()->SetTitleFont(22);
498 new TCanvas(Form(
"cTrackingEffVs%s-%s",xVar.Data(),yVar.Data()), Form(
"Measured tracking efficiency versus %s and %s",xVar.Data(),yVar.Data()),700,600);
499 effVsXY->DrawClone(
"surf1");
503 file =
new TFile(fileNameSave.Data(),
"update");
504 effVsXY->Write(0x0, TObject::kOverwrite);
507 if (yDim == 3 && rap) {
510 TString rapName = Form(
"trackingEffVs%s-%sRapBins", xVar.Data(), yVar.Data());
511 TString rapTitle = Form(
"Measured tracking efficiency versus %s and %s", xVar.Data(), yVar.Data());
512 effVsXYrap->SetTitle(rapTitle.Data());
513 effVsXYrap->SetName(rapName.Data());
516 for (
Int_t xbin = 0; xbin <= nxBins; ++xbin)
517 xBinEdge[xbin] = effVsXY->GetXaxis()->GetBinLowEdge(xbin+1);
520 for (
Int_t ybin = 0; ybin <= nyBins; ++ybin)
521 yBinEdge[ybin] = 2*TMath::ATan(TMath::Exp((effVsXY->GetYaxis()->GetBinLowEdge(ybin+1))));
523 effVsXYrap->SetBins(nxBins, xBinEdge, nyBins, yBinEdge);
525 for (
Int_t xbin = 1; xbin <= nxBins; ++xbin)
526 for (
Int_t ybin = 1; ybin <= nyBins; ++ybin)
527 effVsXYrap->SetBinContent(xbin, ybin, effVsXY->GetBinContent(xbin,ybin));
529 effVsXYrap->Write(0x0, TObject::kOverwrite);
548 printf(
"plotting efficiency...\n");
551 TFile *
file =
new TFile(fileNameData.Data(),
"read");
552 if (!file || !file->IsOpen()) {
553 printf(
"cannot open file %s \n",fileNameData.Data());
556 TList *listTT =
static_cast<TList*
>(file->FindObjectAny(Form(
"TotalTracksPerChamber%s", gObjNameExtension.Data())));
557 TList *listTD =
static_cast<TList*
>(file->FindObjectAny(Form(
"TracksDetectedPerChamber%s", gObjNameExtension.Data())));
558 THnSparse *TT =
static_cast<THnSparse*
>(listTT->At(10));
559 THnSparse *TD =
static_cast<THnSparse*
>(listTD->At(10));
564 TString nameAdd[3] = {
"",
"Low",
"Up"};
565 TString titleAdd[3] = {
"",
" - lower limit",
" - upper limit"};
566 for (
Int_t i = 0; i < 1 || (saveEdges && i < 3); ++i) {
568 Form(
"Measured efficiency per chamber (0 = spectro)%s",titleAdd[i].
Data()));
570 Form(
"Measured efficiency per station (6 = st4&5)%s",titleAdd[i].
Data()));
591 effVsCh[0]->SetPoint(0,0.,1.);
592 effVsCh[0]->SetPointError(0,0.,0.,1.,0.);
594 for (
Int_t iSt = 0; iSt < 6; ++iSt) {
595 effVsSt[0]->SetPoint(iSt,iSt+1,1.);
596 effVsSt[0]->SetPointError(iSt,0.,0.,1.,0.);
602 effVsCh[1]->SetPoint(0,0.,0.);
603 effVsCh[1]->SetPointError(0,0.,0.,0.,0.);
606 effVsCh[2]->SetPoint(0,0.,1.);
607 effVsCh[2]->SetPointError(0,0.,0.,0.,0.);
609 for (
Int_t iSt = 0; iSt < 6; ++iSt) {
611 effVsSt[1]->SetPoint(iSt,iSt+1,0.);
612 effVsSt[1]->SetPointError(iSt,0.,0.,0.,0.);
614 effVsSt[2]->SetPoint(iSt,iSt+1,1.);
615 effVsSt[2]->SetPointError(iSt,0.,0.,0.,0.);
624 for (
Int_t iCh = 1; iCh < 11; iCh++) {
625 for (
Int_t i = 0; i < 1 || (saveEdges && i < 3); ++i) {
626 effVsCh[i]->SetPoint(iCh,iCh,chEff[iCh]);
627 effVsCh[i]->SetPointError(iCh,0.,0.,chEffErr[0][iCh],chEffErr[1][iCh]);
635 for (
Int_t i = 0; i < 1 || (saveEdges && i < 3); ++i) {
636 effVsCh[i]->GetXaxis()->Set(12, -0.5, 10.5);
637 effVsCh[i]->GetXaxis()->SetNdivisions(11);
639 effVsSt[i]->GetXaxis()->Set(7, 0.5, 6.5);
640 effVsSt[i]->GetXaxis()->SetNdivisions(6);
645 TCanvas *
c =
new TCanvas(
"cEfficiency",
"Measured tracking efficiency" , 1000, 400);
647 gROOT->SetSelectedPad(c->cd(1));
648 effVsCh[0]->DrawClone(
"ap");
649 gROOT->SetSelectedPad(c->cd(2));
650 effVsSt[0]->DrawClone(
"ap");
654 file =
new TFile(fileNameSave.Data(),
"update");
655 for (
Int_t i = 0; i < 1 || (saveEdges && i < 3); ++i) effVsCh[i]->Write(0x0, TObject::kOverwrite);
656 for (
Int_t i = 0; i < 1 || (saveEdges && i < 3); ++i) effVsSt[i]->Write(0x0, TObject::kOverwrite);
660 for (
Int_t i = 0; i < 1 || (saveEdges && i < 3); ++i) {
673 printf(
"plotting efficiency versus run...\n");
676 ifstream inFile(runList.Data());
677 if (!inFile.is_open()) {
678 printf(
"cannot open file %s\n",runList.Data());
684 chamberVsRunGraphs.SetOwner(kTRUE);
685 for (
Int_t iCh = 1; iCh < 11; ++iCh)
686 chamberVsRunGraphs.Add(
CreateGraph(
"effCh%dVsRun",
"Measured efficiency for chamber %d versus run",iCh));
690 TString nameAdd[3] = {
"",
"Low",
"Up"};
691 TString titleAdd[3] = {
"",
" - lower limit",
" - upper limit"};
692 for (
Int_t i = 0; i < 3; ++i) {
694 stationVsRunGraphs[i].SetOwner(kTRUE);
695 for (
Int_t iSt = 1; iSt < 6; ++iSt)
696 stationVsRunGraphs[i].Add(
CreateGraph(Form(
"effSt%%dVsRun%s",nameAdd[i].
Data()),
697 Form(
"Measured efficiency for station %%d versus run%s",titleAdd[i].
Data()),iSt));
698 stationVsRunGraphs[i].Add(
CreateGraph(Form(
"effSt4&5VsRun%s",nameAdd[i].
Data()),
699 Form(
"Measured efficiency for station 4&5 versus run%s",titleAdd[i].
Data())));
701 trkVsRun[i] =
CreateGraph(Form(
"trackingEffVsRun%s",nameAdd[i].
Data()),
702 Form(
"Measured tracking efficiency versus run%s", titleAdd[i].
Data()));
711 while (!inFile.eof()) {
715 currRun.ReadLine(inFile,kTRUE);
716 if(currRun.IsNull())
continue;
717 runs.AddLast(
new TObjString(currRun));
720 Int_t run = currRun.Atoi();
722 printf(
"run %d: ", run);
725 TString dataFile = Form(
"runs/%d/%s", run, fileNameData.Data());
726 TString outFile = Form(
"runs/%d/%s", run, fileNameSave.Data());
729 TFile *
file =
new TFile(outFile.Data(),
"read");
730 if (!file || !file->IsOpen()) {
731 printf(
"cannot open file\n");
736 for (
Int_t i = 0; i < 3; ++i) {
741 effVsCh =
static_cast<TGraphAsymmErrors*
>(file->FindObjectAny(Form(
"chamberEff%s",nameAdd[i].
Data())));
742 effVsSt =
static_cast<TGraphAsymmErrors*
>(file->FindObjectAny(Form(
"stationEff%s",nameAdd[i].
Data())));
743 if (!effVsCh || !effVsSt) {
744 printf(
"efficiency graph not found\n");
749 if (i == 0)
for (
Int_t iCh = 0; iCh < 10; ++iCh) {
751 g->SetPoint(irun,irun,effVsCh->GetY()[iCh+1]);
752 g->SetPointError(irun,0.,0.,effVsCh->GetErrorYlow(iCh+1),effVsCh->GetErrorYhigh(iCh+1));
756 for (
Int_t iSt = 0; iSt < 6; ++iSt) {
758 g->SetPoint(irun,irun,effVsSt->GetY()[iSt]);
759 g->SetPointError(irun,0.,0.,effVsSt->GetErrorYlow(iSt),effVsSt->GetErrorYhigh(iSt));
763 trkVsRun[i]->SetPoint(irun,irun,effVsCh->GetY()[0]);
764 trkVsRun[i]->SetPointError(irun,0.,0.,effVsCh->GetErrorYlow(0),effVsCh->GetErrorYhigh(0));
777 for (
Int_t i = 0; i < 3; ++i) {
785 new TCanvas(
"cTrackingEffVsRun",
"Tracking efficiency versus run",1000,400);
786 trkVsRun[0]->DrawClone(
"ap");
790 TFile*
file =
new TFile(fileNameSave.Data(),
"update");
791 chamberVsRunGraphs.Write(
"ChamberEffVsRun", TObject::kOverwrite | TObject::kSingleKey);
792 for (
Int_t i = 0; i < 3; ++i)
793 stationVsRunGraphs[i].Write(Form(
"StationEffVsRun%s",nameAdd[i].
Data()), TObject::kOverwrite | TObject::kSingleKey);
794 for (
Int_t i = 0; i < 3; ++i) trkVsRun[i]->Write(0x0, TObject::kOverwrite);
798 for (
Int_t i = 0; i < 3; ++i)
delete trkVsRun[i];
808 printf(
"plotting integrated efficiency...\n");
813 printf(
"Cannot compute integrated efficiency without run-by-run weights\n");
818 TFile *
file =
new TFile(fileNameSave.Data(),
"update");
819 if (!file || !file->IsOpen()) {
820 printf(
"cannot open file\n");
823 TObjArray *chamberVsRunGraphs =
static_cast<TObjArray*
>(file->FindObjectAny(
"ChamberEffVsRun"));
825 stationVsRunGraphs[0] =
static_cast<TObjArray*
>(file->FindObjectAny(
"StationEffVsRunLow"));
826 stationVsRunGraphs[1] =
static_cast<TObjArray*
>(file->FindObjectAny(
"StationEffVsRunUp"));
828 trkVsRun[0] =
static_cast<TGraphAsymmErrors*
>(file->FindObjectAny(
"trackingEffVsRunLow"));
829 trkVsRun[1] =
static_cast<TGraphAsymmErrors*
>(file->FindObjectAny(
"trackingEffVsRunUp"));
830 if (!chamberVsRunGraphs || !stationVsRunGraphs[0] || !stationVsRunGraphs[1] || !trkVsRun[0] || !trkVsRun[1]) {
831 printf(
"object not found --> you must first plot the efficiency versus run\n");
843 for (
Int_t iCh = 0; iCh < 10; ++iCh) {
849 for (
Int_t iSt = 0; iSt < 6; ++iSt) {
857 for (
Int_t iCh = 1; iCh < 11; ++iCh) {
858 cout <<
"Efficiency chamber " << iCh <<
" : ";
859 cout << effVsCh->GetY()[iCh] <<
" + " << effVsCh->GetErrorYhigh(iCh) <<
" - " << effVsCh->GetErrorYlow(iCh) << endl;
861 for (
Int_t iSt = 0; iSt < 6; ++iSt) {
862 if (iSt < 5) cout <<
"Station " << iSt+1 <<
" = ";
863 else cout <<
"Station 45 = ";
864 cout << effVsSt->GetY()[iSt] <<
" + " << effVsSt->GetErrorYhigh(iSt) <<
" - " << effVsSt->GetErrorYlow(iSt) << endl;
866 cout <<
"Total tracking efficiency : ";
867 cout << effVsCh->GetY()[0] <<
" + " << effVsCh->GetErrorYhigh(0) <<
" - " << effVsCh->GetErrorYlow(0) << endl << endl;
871 effVsCh->GetXaxis()->Set(12, -0.5, 10.5);
872 effVsCh->GetXaxis()->SetNdivisions(11);
874 effVsSt->GetXaxis()->Set(7, 0.5, 6.5);
875 effVsSt->GetXaxis()->SetNdivisions(6);
879 TCanvas *
c =
new TCanvas(
"cIntegratedEfficiency",
"Integrated tracking efficiency" , 1000, 400);
881 gROOT->SetSelectedPad(c->cd(1));
882 effVsCh->DrawClone(
"ap");
883 gROOT->SetSelectedPad(c->cd(2));
884 effVsSt->DrawClone(
"ap");
888 effVsCh->Write(0x0, TObject::kOverwrite);
889 effVsSt->Write(0x0, TObject::kOverwrite);
904 printf(
"plotting efficiency per DE...\n");
907 TFile *
file =
new TFile(fileNameData.Data(),
"read");
908 if (!file || !file->IsOpen()) {
909 printf(
"cannot open file %s \n",fileNameData.Data());
912 TList *listTT =
static_cast<TList*
>(file->FindObjectAny(Form(
"TotalTracksPerChamber%s", gObjNameExtension.Data())));
913 TList *listTD =
static_cast<TList*
>(file->FindObjectAny(Form(
"TracksDetectedPerChamber%s", gObjNameExtension.Data())));
917 chamberVsDEGraphs.SetOwner(kTRUE);
921 TString nameAdd[3] = {
"",
"Low",
"Up"};
922 TString titleAdd[3] = {
"",
" - lower limit",
" - upper limit"};
923 for (
Int_t i = 0; i < 3; ++i) stationVsDEGraphs[i].SetOwner(kTRUE);
925 for (
Int_t iSt = 0; iSt < 6; ++iSt)
for (
Int_t i = 0; i < 3; ++i) gSt[iSt][i] = 0x0;
928 for (
Int_t iCh = 0; iCh < 10; ++iCh) {
931 chamberVsDEGraphs.Add(
CreateGraph(
"effCh%dVsDE",
"Measured efficiency for chamber %d per DE",iCh+1));
935 THnSparse *TT =
static_cast<THnSparse*
>(listTT->At(iCh));
936 THnSparse *TD =
static_cast<THnSparse*
>(listTD->At(iCh));
956 for (
Int_t iSt = 0; iSt < 3; ++iSt) {
959 for (
Int_t i = 0; i < 1 || (saveEdges && i < 3); ++i) {
960 stationVsDEGraphs[i].Add(
CreateGraph(Form(
"effSt%%dVsDE%s",nameAdd[i].
Data()),
961 Form(
"Measured efficiency for station %%d per DE%s",titleAdd[i].
Data()),iSt+1));
962 gSt[iSt][i] =
static_cast<TGraphAsymmErrors*
>(stationVsDEGraphs[i].UncheckedAt(iSt));
967 for (
Int_t iDE = 0; iDE <
nDE; ++iDE) {
970 for (
Int_t iCh = 0; iCh < 2; ++iCh) {
971 chEff[2*iSt+iCh+1] = gCh[2*iSt+iCh]->GetY()[iDE];
972 chEffErr[0][2*iSt+iCh+1] = gCh[2*iSt+iCh]->GetErrorYlow(iDE);
973 chEffErr[1][2*iSt+iCh+1] = gCh[2*iSt+iCh]->GetErrorYhigh(iDE);
984 for (
Int_t i = 0; i < 1 || (saveEdges && i < 3); ++i) {
985 for (
Int_t iSt = 3; iSt < 5; ++iSt) {
986 stationVsDEGraphs[i].Add(
CreateGraph(Form(
"effSt%%dVsDE%s",nameAdd[i].
Data()),
987 Form(
"Measured efficiency for station %%d per DE%s",titleAdd[i].
Data()),iSt+1));
988 gSt[iSt][i] =
static_cast<TGraphAsymmErrors*
>(stationVsDEGraphs[i].UncheckedAt(iSt));
990 stationVsDEGraphs[i].Add(
CreateGraph(Form(
"effSt4&5VsDE%s",nameAdd[i].
Data()),
991 Form(
"Measured efficiency for station 4&5 per DE%s",titleAdd[i].
Data())));
992 gSt[5][i] =
static_cast<TGraphAsymmErrors*
>(stationVsDEGraphs[i].UncheckedAt(5));
997 for (
Int_t iDE = 0; iDE <
nDE; ++iDE) {
1000 for (
Int_t iCh = 6; iCh < 10; ++iCh) {
1001 chEff[iCh+1] = gCh[iCh]->GetY()[iDE];
1002 chEffErr[0][iCh+1] = gCh[iCh]->GetErrorYlow(iDE);
1003 chEffErr[1][iCh+1] = gCh[iCh]->GetErrorYhigh(iDE);
1015 for (
Int_t iCh = 0; iCh < 10; ++iCh) {
1016 Int_t nDE = gCh[iCh]->GetN();
1017 gCh[iCh]->GetXaxis()->Set(nDE+1, -0.5, nDE-0.5);
1018 gCh[iCh]->GetXaxis()->SetNdivisions(nDE);
1020 BeautifyGraphs(chamberVsDEGraphs,
"Detection Element",
"efficiency");
1021 for (
Int_t i = 0; i < 1 || (saveEdges && i < 3); ++i) {
1022 for (
Int_t iSt = 0; iSt < 6; ++iSt) {
1023 Int_t nDE = gSt[iSt][i]->GetN();
1024 gSt[iSt][i]->GetXaxis()->Set(nDE+1, -0.5, nDE-0.5);
1025 gSt[iSt][i]->GetXaxis()->SetNdivisions(nDE);
1027 BeautifyGraphs(stationVsDEGraphs[i],
"Detection Element",
"efficiency");
1032 file =
new TFile(fileNameSave.Data(),
"update");
1033 chamberVsDEGraphs.Write(
"ChamberEffVsDE", TObject::kOverwrite | TObject::kSingleKey);
1034 for (
Int_t i = 0; i < 1 || (saveEdges && i < 3); ++i)
1035 stationVsDEGraphs[i].Write(Form(
"StationEffVsDE%s",nameAdd[i].
Data()), TObject::kOverwrite | TObject::kSingleKey);
1046 printf(
"plotting efficiency per DE versus run...\n");
1049 ifstream inFile(runList.Data());
1050 if (!inFile.is_open()) {
1051 printf(
"cannot open file %s\n",runList.Data());
1057 deVsRunGraphs.SetOwner(kTRUE);
1059 TString nameAdd[3] = {
"",
"Low",
"Up"};
1060 TString titleAdd[3] = {
"",
" - lower limit",
" - upper limit"};
1061 for (
Int_t i = 0; i < 3; ++i) stDEVsRunGraphs[i].SetOwner(kTRUE);
1062 Bool_t createGraph = kTRUE;
1069 while (!inFile.eof()) {
1073 currRun.ReadLine(inFile,kTRUE);
1074 if(currRun.IsNull())
continue;
1075 runs.AddLast(
new TObjString(currRun));
1078 Int_t run = currRun.Atoi();
1080 printf(
"run %d: ", run);
1083 TString dataFile = Form(
"runs/%d/%s", run, fileNameData.Data());
1084 TString outFile = Form(
"runs/%d/%s", run, fileNameSave.Data());
1087 TFile *
file =
new TFile(outFile.Data(),
"read");
1088 if (!file || !file->IsOpen()) {
1089 printf(
"cannot open file\n");
1094 TObjArray *chamberVsDEGraphs =
static_cast<TObjArray*
>(file->FindObjectAny(
"ChamberEffVsDE"));
1095 if (!chamberVsDEGraphs) {
1096 printf(
"efficiency graph not found\n");
1100 Int_t currentDE = 0;
1103 for (
Int_t iCh = 0; iCh < 10; ++iCh) {
1110 for (
Int_t iDE = 0; iDE <
nDE; ++iDE) {
1113 if (createGraph) deVsRunGraphs.Add(
CreateGraph(
"effDE%dVsRun",
"Measured efficiency for DE %d versus run",100*(iCh+1)+iDE));
1117 gDE->SetPoint(irun,irun,g->GetY()[iDE]);
1118 gDE->SetPointError(irun,0.,0.,g->GetErrorYlow(iDE),g->GetErrorYhigh(iDE));
1125 for (
Int_t i = 0; i < 3; ++i) {
1128 TObjArray *stationVsDEGraphs =
static_cast<TObjArray*
>(file->FindObjectAny(Form(
"StationEffVsDE%s",nameAdd[i].
Data())));
1129 if (!stationVsDEGraphs) {
1130 printf(
"efficiency graph not found\n");
1134 Int_t currentStDE = 0;
1137 for (
Int_t iSt = 0; iSt < 6; ++iSt) {
1144 for (
Int_t iDE = 0; iDE <
nDE; ++iDE) {
1148 TString sSt = (iSt<5) ? Form(
"%d",iSt+1) :
"4&5";
1149 stDEVsRunGraphs[i].Add(
CreateGraph(Form(
"effSt%sDE%%dVsRun%s",sSt.Data(),nameAdd[i].Data()),
1150 Form(
"Measured efficiency for DE %%d in station %s versus run%s",sSt.Data(),titleAdd[i].Data()),iDE));
1155 gDE->SetPoint(irun,irun,g->GetY()[iDE]);
1156 gDE->SetPointError(irun,0.,0.,g->GetErrorYlow(iDE),g->GetErrorYhigh(iDE));
1166 createGraph = kFALSE;
1175 for (
Int_t i = 0; i < 3; ++i) {
1181 TFile*
file =
new TFile(fileNameSave.Data(),
"update");
1182 deVsRunGraphs.Write(
"DEEffVsRun", TObject::kOverwrite | TObject::kSingleKey);
1183 for (
Int_t i = 0; i < 3; ++i)
1184 stDEVsRunGraphs[i].Write(Form(
"DEEffPerStationVsRun%s",nameAdd[i].
Data()), TObject::kOverwrite | TObject::kSingleKey);
1195 printf(
"plotting integrated efficiency per DE...\n");
1200 printf(
"Cannot compute integrated efficiency without run-by-run weights\n");
1205 TFile *
file =
new TFile(fileNameSave.Data(),
"update");
1206 if (!file || !file->IsOpen()) {
1207 printf(
"cannot open file\n");
1210 TObjArray *deVsRunGraphs =
static_cast<TObjArray*
>(file->FindObjectAny(
"DEEffVsRun"));
1212 stDEVsRunGraphs[0] =
static_cast<TObjArray*
>(file->FindObjectAny(
"DEEffPerStationVsRunLow"));
1213 stDEVsRunGraphs[1] =
static_cast<TObjArray*
>(file->FindObjectAny(
"DEEffPerStationVsRunUp"));
1214 if (!deVsRunGraphs || !stDEVsRunGraphs[0] || !stDEVsRunGraphs[1]) {
1215 printf(
"object not found --> you must first plot the efficiency versus run\n");
1221 chamberVsDEGraphs.SetOwner(kTRUE);
1222 for (
Int_t iCh = 0; iCh < 10; ++iCh)
1223 chamberVsDEGraphs.Add(
CreateGraph(
"integratedEffCh%dVsDE",
"Integrated efficiency for chamber %d per DE",iCh+1));
1226 stationVsDEGraphs.SetOwner(kTRUE);
1227 for (
Int_t iSt = 0; iSt < 5; ++iSt)
1228 stationVsDEGraphs.Add(
CreateGraph(
"integratedEffSt%dVsDE",
"Integrated efficiency for station %d per DE",iSt+1));
1229 stationVsDEGraphs.Add(
CreateGraph(
"integratedEffSt4&5VsDE",
"Integrated efficiency for station 4&5 per DE"));
1232 TIter nextDE(deVsRunGraphs);
1234 while ((gDE = static_cast<TGraphAsymmErrors*>(nextDE()))) {
1238 sscanf(gDE->GetName(),
"effDE%dVsRun", &deId);
1239 Int_t iCh = deId/100-1;
1240 Int_t iDE = deId%100;
1249 Int_t ng = stDEVsRunGraphs[0]->GetEntries();
1250 for (
Int_t ig = 0; ig < ng; ++ig) {
1257 if (strstr(gDELow->GetName(),
"4&5")) {
1259 sscanf(gDELow->GetName(),
"effSt4&5DE%dVsRunLow", &iDE);
1261 sscanf(gDELow->GetName(),
"effSt%dDE%dVsRunLow", &iSt, &iDE);
1272 for (
Int_t iCh = 0; iCh < 10; ++iCh) {
1275 g->GetXaxis()->Set(nDE+1, -0.5, nDE-0.5);
1276 g->GetXaxis()->SetNdivisions(nDE);
1278 BeautifyGraphs(chamberVsDEGraphs,
"Detection Element",
"efficiency");
1279 for (
Int_t iSt = 0; iSt < 6; ++iSt) {
1282 g->GetXaxis()->Set(nDE+1, -0.5, nDE-0.5);
1283 g->GetXaxis()->SetNdivisions(nDE);
1285 BeautifyGraphs(stationVsDEGraphs,
"Detection Element",
"efficiency");
1288 chamberVsDEGraphs.Write(
"IntegratedChamberEffVsDE", TObject::kOverwrite | TObject::kSingleKey);
1289 stationVsDEGraphs.Write(
"IntegratedStationEffVsDE", TObject::kOverwrite | TObject::kSingleKey);
1302 TH1D *TTdraw = TT.Projection(0,
"e");
1303 TH1D *TDdraw = TD.Projection(0,
"e");
1307 Bool_t ok = (efficiency);
1312 Bool_t missingEff = kFALSE;
1314 for (
Int_t i = 0; i < 10; i++) {
1316 if (TTdraw->GetBinContent(i+1) > 0) {
1318 chEff[i+1] = efficiency->GetY()[i];
1319 chEffErr[0][i+1] = efficiency->GetErrorYlow(i);
1320 chEffErr[1][i+1] = efficiency->GetErrorYhigh(i);
1325 chEffErr[0][i+1] = 0.;
1326 chEffErr[1][i+1] = 0.;
1334 if (missingEff && printError) cout <<
"efficiency partially unknown" << endl;
1338 for (
Int_t i = 0; i < 10; i++) {
1341 chEffErr[0][i+1] = 0.;
1342 chEffErr[1][i+1] = 0.;
1346 if (printError) cout <<
"efficiency unknown" << endl << endl;
1366 TH1D *TTdraw = TT.Projection(0,
"e");
1367 TH1D *TDdraw = TD.Projection(0,
"e");
1375 for (
Int_t iDE = 0; iDE <
nDE; ++iDE) {
1377 if (TTdraw->GetBinContent(iDE+1) > 0) {
1379 effVsDE.SetPoint(iDE,iDE,efficiency->GetY()[iDE]);
1380 effVsDE.SetPointError(iDE,0,0,efficiency->GetErrorYlow(iDE),efficiency->GetErrorYhigh(iDE));
1384 effVsDE.SetPoint(iDE,iDE,-1);
1385 effVsDE.SetPointError(iDE,0,0,0,0);
1393 for (
Int_t iDE = 0; iDE <
nDE; ++iDE) {
1395 effVsDE.SetPoint(iDE,iDE,-1);
1396 effVsDE.SetPointError(iDE,0,0,0,0);
1415 stEff = 1.-(1.-chEff[2*iSt+1])*(1.-chEff[2*iSt+2]);
1417 Double_t d1 = (1. - chEff[2*iSt+2]); d1 *= d1;
1418 Double_t d2 = (1. - chEff[2*iSt+1]); d2 *= d2;
1420 for (
Int_t i = 0; i < 2; ++i) {
1421 Double_t s1 = chEffErr[i][2*iSt+1] * chEffErr[i][2*iSt+1];
1422 Double_t s2 = chEffErr[i][2*iSt+2] * chEffErr[i][2*iSt+2];
1423 stEffErr[i] = TMath::Sqrt(d1*s1 + d2*s2 + s1*s2);
1426 stEffErr[0] = TMath::Min(stEff, stEffErr[0]);
1427 stEffErr[1] = TMath::Min(1.-stEff, stEffErr[1]);
1437 if (chEff[2*iSt+1] >= 0 && chEff[2*iSt+2] >= 0) {
1444 for (
Int_t i = 0; i < 3; ++i) {
1446 effVsX[i]->SetPoint(ip,xp,stEff);
1447 effVsX[i]->SetPointError(ip,0.,0.,stEffErr[0],stEffErr[1]);
1458 for (
Int_t i = 0; i < 2; ++i) {
1461 chEffEdge[i].Set(11);
1462 for (
Int_t iCh = 1; iCh < 3; ++iCh) chEffEdge[i][2*iSt+iCh] = (chEff[2*iSt+iCh] < 0) ? edge[i] : chEff[2*iSt+iCh];
1469 effVsX[i+1]->SetPoint(ip,xp,stEffEdge[i]);
1470 effVsX[i+1]->SetPointError(ip,0.,0.,stEffEdgeErr[i][0],stEffEdgeErr[i][1]);
1477 effVsX[0]->SetPoint(ip,xp,stEffEdge[1]);
1478 effVsX[0]->SetPointError(ip,0.,0.,stEffEdge[1]-stEffEdge[0]+stEffEdgeErr[0][0],stEffEdgeErr[1][1]);
1491 st45Eff = chEff[7]*chEff[8]*chEff[9] + chEff[7]*chEff[8]*chEff[10] + chEff[7]*chEff[9]*chEff[10] + chEff[8]*chEff[9]*chEff[10] - 3.*chEff[7]*chEff[8]*chEff[9]*chEff[10];
1493 Double_t d1 = chEff[8]*chEff[9] + chEff[8]*chEff[10] + chEff[9]*chEff[10] - 3.*chEff[8]*chEff[9]*chEff[10]; d1 *= d1;
1494 Double_t d2 = chEff[7]*chEff[9] + chEff[7]*chEff[10] + chEff[9]*chEff[10] - 3.*chEff[7]*chEff[9]*chEff[10]; d2 *= d2;
1495 Double_t d3 = chEff[7]*chEff[8] + chEff[7]*chEff[10] + chEff[8]*chEff[10] - 3.*chEff[7]*chEff[8]*chEff[10]; d3 *= d3;
1496 Double_t d4 = chEff[7]*chEff[8] + chEff[7]*chEff[9] + chEff[8]*chEff[9] - 3.*chEff[7]*chEff[8]*chEff[9]; d4 *= d4;
1497 Double_t d12 = chEff[9] + chEff[10] - 3.*chEff[9]*chEff[10]; d12 *= d12;
1498 Double_t d13 = chEff[8] + chEff[10] - 3.*chEff[8]*chEff[10]; d13 *= d13;
1499 Double_t d14 = chEff[8] + chEff[9] - 3.*chEff[8]*chEff[9]; d14 *= d14;
1500 Double_t d23 = chEff[7] + chEff[10] - 3.*chEff[7]*chEff[10]; d23 *= d23;
1501 Double_t d24 = chEff[7] + chEff[9] - 3.*chEff[7]*chEff[9]; d24 *= d24;
1502 Double_t d34 = chEff[7] + chEff[8] - 3.*chEff[7]*chEff[8]; d34 *= d34;
1503 Double_t d123 = 1. - 3.*chEff[10]; d123 *= d123;
1504 Double_t d124 = 1. - 3.*chEff[9]; d124 *= d124;
1505 Double_t d134 = 1. - 3.*chEff[8]; d134 *= d134;
1506 Double_t d234 = 1. - 3.*chEff[7]; d234 *= d234;
1507 Double_t d1234 = - 3.; d1234 *= d1234;
1509 for (
Int_t i = 0; i < 2; ++i) {
1510 Double_t s1 = chEffErr[i][7] * chEffErr[i][7];
1511 Double_t s2 = chEffErr[i][8] * chEffErr[i][8];
1512 Double_t s3 = chEffErr[i][9] * chEffErr[i][9];
1513 Double_t s4 = chEffErr[i][10] * chEffErr[i][10];
1514 st45EffErr[i] = TMath::Sqrt(d1*s1 + d2*s2 + d3*s3 + d4*s4 + d12*s1*s2 + d13*s1*s3 + d14*s1*s4 + d23*s2*s3 + d24*s2*s4 + d34*s3*s4 + d123*s1*s2*s3 + d124*s1*s2*s4 + d134*s1*s3*s4 + d234*s2*s3*s4 + d1234*s1*s2*s3*s4);
1517 st45EffErr[0] = TMath::Min(st45Eff, st45EffErr[0]);
1518 st45EffErr[1] = TMath::Min(1.-st45Eff, st45EffErr[1]);
1528 if (chEff[7] >= 0 && chEff[8] >= 0 && chEff[9] >= 0 && chEff[10] >= 0) {
1535 for (
Int_t i = 0; i < 3; ++i) {
1537 effVsX[i]->SetPoint(ip,xp,stEff);
1538 effVsX[i]->SetPointError(ip,0.,0.,stEffErr[0],stEffErr[1]);
1549 for (
Int_t i = 0; i < 2; ++i) {
1552 chEffEdge[i].Set(11);
1553 for (
Int_t iCh = 7; iCh < 11; ++iCh) chEffEdge[i][iCh] = (chEff[iCh] < 0) ? edge[i] : chEff[iCh];
1560 effVsX[i+1]->SetPoint(ip,xp,stEffEdge[i]);
1561 effVsX[i+1]->SetPointError(ip,0.,0.,stEffEdgeErr[i][0],stEffEdgeErr[i][1]);
1568 effVsX[0]->SetPoint(ip,xp,stEffEdge[1]);
1569 effVsX[0]->SetPointError(ip,0.,0.,stEffEdge[1]-stEffEdge[0]+stEffEdgeErr[0][0],stEffEdgeErr[1][1]);
1583 for (
Int_t iSt = 0; iSt < 6; iSt++) de[iSt][0] = stEff[iSt]*stEff[iSt];
1587 spectroEff = stEff[0] * stEff[1] * stEff[2] * stEff[3] * stEff[4];
1589 for (
Int_t i = 0; i < 2; i++) {
1591 for (
Int_t iSt = 0; iSt < 6; iSt++) de[iSt][1] = stEffErr[iSt][i]*stEffErr[iSt][i];
1593 spectroEffErr[i] = 0.;
1594 for (
Int_t j = 1; j < 32; j++) {
1596 for (
Int_t iSt = 0; iSt < 5; iSt++) sigmaAdd *= de[iSt][TESTBIT(j,iSt)];
1597 spectroEffErr[i] += sigmaAdd;
1599 spectroEffErr[i] = TMath::Sqrt(spectroEffErr[i]);
1605 spectroEff = stEff[0] * stEff[1] * stEff[2] * stEff[5];
1607 for (
Int_t i = 0; i < 2; i++) {
1609 for (
Int_t iSt = 0; iSt < 6; iSt++) de[iSt][1] = stEffErr[iSt][i]*stEffErr[iSt][i];
1611 spectroEffErr[i] = 0.;
1612 for (
Int_t j = 1; j < 16; j++) {
1613 Double_t sigmaAdd = de[5][TESTBIT(j,3)];
1614 for (
Int_t iSt = 0; iSt < 3; iSt++) sigmaAdd *= de[iSt][TESTBIT(j,iSt)];
1615 spectroEffErr[i] += sigmaAdd;
1617 spectroEffErr[i] = TMath::Sqrt(spectroEffErr[i]);
1623 spectroEffErr[0] = TMath::Min(spectroEff, spectroEffErr[0]);
1624 spectroEffErr[1] = TMath::Min(1.-spectroEff, spectroEffErr[1]);
1639 Bool_t allEffKnown = kTRUE;
1640 for (
Int_t iCh = 1; iCh < 11 && allEffKnown; ++iCh)
if (chEff[iCh] < 0) allEffKnown = kFALSE;
1649 Double_t spectroEff, spectroEffErr[2];
1651 chEff[0] = spectroEff;
1652 chEffErr[0][0] = spectroEffErr[0];
1653 chEffErr[1][0] = spectroEffErr[1];
1656 for (
Int_t i = 0; i < 3; ++i) {
1658 effVsX[i]->SetPoint(ip,xp,chEff[0]);
1659 effVsX[i]->SetPointError(ip,0.,0.,chEffErr[0][0],chEffErr[1][0]);
1661 if (effVsSt[i])
for (
Int_t iSt = 0; iSt < 6; ++iSt) {
1662 effVsSt[i]->SetPoint(iSt,iSt+1,stEff[iSt]);
1663 effVsSt[i]->SetPointError(iSt,0.,0.,stEffErr[iSt][0],stEffErr[iSt][1]);
1673 Double_t spectroEffEdge[2], spectroEffEdgeErr[2][2];
1675 for (
Int_t i = 0; i < 2; ++i) {
1678 chEffEdge[i].Set(11);
1679 for (
Int_t iCh = 1; iCh < 11; ++iCh) chEffEdge[i][iCh] = (chEff[iCh] < 0) ? edge[i] : chEff[iCh];
1690 effVsX[i+1]->SetPoint(ip,xp,spectroEffEdge[i]);
1691 effVsX[i+1]->SetPointError(ip,0.,0.,spectroEffEdgeErr[i][0],spectroEffEdgeErr[i][1]);
1693 if (effVsSt[i+1])
for (
Int_t iSt = 0; iSt < 6; ++iSt) {
1694 effVsSt[i+1]->SetPoint(iSt,iSt+1,stEffEdge[i][iSt]);
1695 effVsSt[i+1]->SetPointError(iSt,0.,0.,stEffEdgeErr[i][iSt][0],stEffEdgeErr[i][iSt][1]);
1701 for (
Int_t iSt = 0; iSt < 6; ++iSt) {
1702 stEff[iSt] = stEffEdge[1][iSt];
1703 stEffErr[iSt][0] = stEffEdge[1][iSt] - stEffEdge[0][iSt] + stEffEdgeErr[0][iSt][0];
1704 stEffErr[iSt][1] = stEffEdgeErr[1][iSt][1];
1708 chEff[0] = spectroEffEdge[1];
1709 chEffErr[0][0] = spectroEffEdge[1] - spectroEffEdge[0] + spectroEffEdgeErr[0][0];
1710 chEffErr[1][0] = spectroEffEdgeErr[1][1];
1714 effVsX[0]->SetPoint(ip,xp,chEff[0]);
1715 effVsX[0]->SetPointError(ip,0.,0.,chEffErr[0][0],chEffErr[1][0]);
1717 if (effVsSt[0])
for (
Int_t iSt = 0; iSt < 6; ++iSt) {
1718 effVsSt[0]->SetPoint(iSt,iSt+1,stEff[iSt]);
1719 effVsSt[0]->SetPointError(iSt,0.,0.,stEffErr[iSt][0],stEffErr[iSt][1]);
1726 for (
Int_t iCh = 1; iCh < 11; ++iCh) {
1727 cout <<
"Efficiency chamber " << iCh <<
" : ";
1728 cout << chEff[iCh] <<
" + " << chEffErr[1][iCh] <<
" - " << chEffErr[0][iCh] << endl;
1730 for (
Int_t iSt = 0; iSt < 6; ++iSt) {
1731 if (iSt < 5) cout <<
"Station " << iSt+1 <<
" = ";
1732 else cout <<
"Station 45 = ";
1733 cout << stEff[iSt] <<
" + " << stEffErr[iSt][1] <<
" - " << stEffErr[iSt][0] << endl;
1735 cout <<
"Total tracking efficiency : ";
1736 cout << chEff[0] <<
" + " << chEffErr[1][0] <<
" - " << chEffErr[0][0] << endl << endl;
1750 effVsX.SetPoint(ip,xp,-1.);
1751 effVsX.SetPointError(ip,0.,0.,0.,0.);
1762 Int_t nRuns = effVsRunLow.GetN();
1763 for (
Int_t iRun = 0; iRun < nRuns; ++iRun) {
1766 TString sRun = effVsRunLow.GetXaxis()->GetBinLabel(iRun+1);
1769 printf(
"weight not found for run %s\n", sRun.Data());
1776 Double_t eff[2] = {effVsRunLow.GetY()[iRun], effVsRunUp.GetY()[iRun]};
1777 Double_t effErr[2] = {effVsRunLow.GetErrorYlow(iRun), effVsRunUp.GetErrorYhigh(iRun)};
1778 if (eff[0] < 0. || eff[1] < 0.) {
1779 printf(
"no efficiency measurement --> use 0(1) ± 0 as lower(upper) limit\n");
1788 for (
Int_t i = 0; i < 2; ++i) {
1790 intEffErr[i] += w2*effErr[i]*effErr[i];
1796 if (gen > 0. && ok) {
1798 effVsX.SetPoint(ip,xp,rec[1]/gen);
1799 effVsX.SetPointError(ip,0.,0.,(rec[1]-rec[0]+TMath::Sqrt(intEffErr[0]))/gen,TMath::Sqrt(intEffErr[1])/gen);
1803 if (gen <= 0.) printf(
"impossible to integrate, all weights = 0 or unknown ?!?\n");
1804 else printf(
"efficiency never measured --> return -1 ± 0\n");
1806 effVsX.SetPoint(ip,xp,-1.);
1807 effVsX.SetPointError(ip,0.,0.,0.,0.);
1823 ifstream inFile(fileName.Data());
1824 if (!inFile.is_open()) {
1825 printf(
"cannot open file %s\n", fileName.Data());
1833 while (! inFile.eof() ) {
1835 line.ReadLine(inFile,kTRUE);
1836 if(line.IsNull())
continue;
1839 if (param->GetEntries() != 2) {
1840 printf(
"bad input line %s", line.Data());
1844 Int_t run = ((TObjString*)param->UncheckedAt(0))->String().Atoi();
1846 printf(
"invalid run number: %d", run);
1850 Float_t weight = ((TObjString*)param->UncheckedAt(1))->String().Atof();
1852 printf(
"invalid weight: %g", weight);
1877 printf(
"Wrong pT range, ptMax must be higher than ptMin\n");
1882 printf(
"Wrong y range\n");
1887 printf(
"Wrong phi range\n");
1891 if (charge < -1 || charge > 1) {
1892 printf(
"Selected charge must be 0, 1 or -1\n");
1900 Int_t lowBin = SparseData.GetAxis(1)->FindBin(
centMin);
1902 SparseData.GetAxis(1)->SetRange(lowBin, upBin);
1905 if (
ptMin < 0.) lowBin = 0;
1906 else lowBin = SparseData.GetAxis(2)->FindBin(
ptMin);
1907 if (
ptMax < 0.) upBin = SparseData.GetAxis(2)->GetNbins()+1;
1908 else upBin = SparseData.GetAxis(2)->FindBin(
ptMax);
1909 SparseData.GetAxis(2)->SetRange(lowBin, upBin);
1912 if (
yMin < -4.) lowBin = 0;
1913 else lowBin = SparseData.GetAxis(3)->FindBin(
yMin);
1914 if (
yMax > -2.5) upBin = SparseData.GetAxis(3)->GetNbins()+1;
1915 else upBin = SparseData.GetAxis(3)->FindBin(
yMax);
1916 SparseData.GetAxis(3)->SetRange(lowBin, upBin);
1919 if (
phiMin < 0.) lowBin = 0;
1920 else lowBin = SparseData.GetAxis(4)->FindBin(
phiMin);
1921 if (
phiMax > TMath::TwoPi()) upBin = SparseData.GetAxis(4)->GetNbins()+1;
1922 else upBin = SparseData.GetAxis(4)->FindBin(
phiMax);
1923 SparseData.GetAxis(4)->SetRange(lowBin, upBin);
1927 lowBin = SparseData.GetAxis(5)->FindBin(
charge);
1928 SparseData.GetAxis(5)->SetRange(lowBin, lowBin);
1943 g->SetName(Form(name,value));
1944 g->SetTitle(Form(title,value));
1966 g.SetMarkerStyle(20);
1967 g.SetMarkerSize(0.7);
1968 g.SetMarkerColor(2);
1970 g.GetXaxis()->SetTitle(xAxisName);
1971 g.GetXaxis()->CenterTitle(kTRUE);
1972 g.GetXaxis()->SetLabelFont(22);
1973 g.GetXaxis()->SetTitleFont(22);
1975 g.GetYaxis()->SetTitle(yAxisName);
1976 g.GetYaxis()->CenterTitle(kTRUE);
1977 g.GetYaxis()->SetLabelFont(22);
1978 g.GetYaxis()->SetTitleFont(22);
1988 for (
Int_t i = 0; i <= array.GetLast(); ++i)
1989 BeautifyGraph(*static_cast<TGraphAsymmErrors*>(array.UncheckedAt(i)), xAxisName, yAxisName);
1999 g.GetXaxis()->Set(irun+1, -0.5, irun+0.5);
2001 TIter nextRun(&runs);
2002 TObjString *srun = 0x0;
2004 while ((srun = static_cast<TObjString*>(nextRun()))) {
2005 g.GetXaxis()->SetBinLabel(iirun, srun->GetName());
2017 for (
Int_t i = 0; i <= array.GetLast(); ++i)
2018 SetRunLabel(*static_cast<TGraphAsymmErrors*>(array.UncheckedAt(i)), irun, runs);
void ComputeStationEfficiency(TArrayD &chEff, TArrayD chEffErr[2], Int_t iSt, Double_t &stEff, Double_t stEffErr[2])
void MuonTrackingEfficiency(TString runList="runList.txt", TString fileNameWeights="", TString objNameExtension="", TString fileNameData="AnalysisResults.root", TString fileNameSave="efficiency_new.root")
void GetStationEfficiency(TArrayD &chEff, TArrayD chEffErr[2], Int_t iSt, TGraphAsymmErrors *effVsX[3], Int_t ip, Double_t xp)
void GetTrackingEfficiency(TArrayD &chEff, TArrayD chEffErr[2], TGraphAsymmErrors *effVsSt[3], TGraphAsymmErrors *effVsX[3], Int_t ip, Double_t xp, Bool_t print=kFALSE)
void ComputeTrackingEfficiency(Double_t stEff[6], Double_t stEffErr[6][2], Double_t &spectroEff, Double_t spectroEffErr[2])
void IntegrateMuonEfficiency(TGraphAsymmErrors &effVsRunLow, TGraphAsymmErrors &effVsRunUp, TGraphAsymmErrors &effVsX, Int_t ip, Double_t xp)
void PlotMuonEfficiencyVsRun(TString runList, TString fileNameData, TString fileNameSave, Bool_t print, Bool_t draw)
void PlotMuonEfficiency(TString fileNameData, TString fileNameSave, Bool_t saveEdges, Bool_t print, Bool_t draw)
void PlotIntegratedMuonEfficiency(TString fileNameWeights, TString fileNameSave, Bool_t print, Bool_t draw)
void PlotMuonEfficiencyVsXY(TString xVar, TString yVar, TString fileNameData, TString fileNameSave, Bool_t draw, Bool_t rap=kFALSE)
Bool_t moreTrackCandidates
void LoadRunWeights(TString fileName)
void GetDEEfficiency(THnSparse &TT, THnSparse &TD, TGraphAsymmErrors &effVsDE)
TString gObjNameExtension
void SetRunLabel(TGraphAsymmErrors &g, Int_t irun, const TList &runs)
void PlotIntegratedMuonEfficiencyVsX(TString var, TString runList, TString fileNameWeights, TString fileNameData, TString fileNameSave, Bool_t print, Bool_t draw)
void BeautifyGraphs(TObjArray &array, const char *xAxisName, const char *yAxisName)
TGraphAsymmErrors * CreateGraph(const char *name, const char *title, int value=-1)
void PlotIntegratedMuonEfficiencyPerDE(TString fileNameWeights, TString fileNameSave)
void ComputeStation45Efficiency(TArrayD &chEff, TArrayD chEffErr[2], Double_t &st45Eff, Double_t st45EffErr[2])
Bool_t Data(TH1F *h, Double_t *rangefit, Bool_t writefit, Double_t &sgn, Double_t &errsgn, Double_t &bkg, Double_t &errbkg, Double_t &sgnf, Double_t &errsgnf, Double_t &sigmafit, Int_t &status)
const Char_t * effErrMode
void BeautifyGraph(TGraphAsymmErrors &g, const char *xAxisName, const char *yAxisName)
void PlotMuonEfficiencyVsX(TString var, TString fileNameData, TString fileNameSave, Bool_t saveEdges, Bool_t print, Bool_t draw)
TFile * file
TList with histograms for a given trigger.
void PlotMuonEfficiencyPerDE(TString fileNameData, TString fileNameSave, Bool_t saveEdges)
void PlotMuonEfficiencyPerDEVsRun(TString runList, TString fileNameData, TString fileNameSave)
void GetStation45Efficiency(TArrayD &chEff, TArrayD chEffErr[2], TGraphAsymmErrors *effVsX[3], Int_t ip, Double_t xp)
Bool_t GetChamberEfficiency(THnSparse &TT, THnSparse &TD, TArrayD &chEff, TArrayD chEffErr[2], Bool_t printError=kFALSE)
void SetCentPtCh(THnSparse &SparseData)