32 #include <THnSparse.h>
35 #include <TObjString.h>
36 #include <Riostream.h>
40 #include <TGraphAsymmErrors.h>
44 #include <THashList.h>
45 #include <TParameter.h>
61 void PlotMuonEfficiencyVsX(TString var, TString fileNameData, TString fileNameSave, Bool_t saveEdges, Bool_t print, Bool_t draw);
63 TString fileNameData, TString fileNameSave, Bool_t print, Bool_t draw);
65 void PlotMuonEfficiencyVsXY(TString xVar, TString yVar, TString fileNameData, TString fileNameSave, Bool_t draw, Bool_t rap = kFALSE);
67 void PlotMuonEfficiency(TString fileNameData, TString fileNameSave, Bool_t saveEdges, Bool_t print, Bool_t draw);
68 void PlotMuonEfficiencyVsRun(TString runList, TString fileNameData, TString fileNameSave, Bool_t print, Bool_t draw);
75 Bool_t
GetChamberEfficiency(THnSparse &TT, THnSparse &TD, TArrayD &chEff, TArrayD chEffErr[2], Bool_t printError = kFALSE);
76 void GetDEEfficiency(THnSparse &TT, THnSparse &TD, TGraphAsymmErrors &effVsDE);
77 void ComputeStationEfficiency(TArrayD &chEff, TArrayD chEffErr[2], Int_t iSt, Double_t &stEff, Double_t stEffErr[2]);
78 void GetStationEfficiency(TArrayD &chEff, TArrayD chEffErr[2], Int_t iSt, TGraphAsymmErrors *effVsX[3], Int_t ip, Double_t xp);
80 void GetStation45Efficiency(TArrayD &chEff, TArrayD chEffErr[2], TGraphAsymmErrors *effVsX[3], Int_t ip, Double_t xp);
81 void ComputeTrackingEfficiency(Double_t stEff[6], Double_t stEffErr[6][2], Double_t &spectroEff, Double_t spectroEffErr[2]);
83 TGraphAsymmErrors *effVsX[3], Int_t ip, Double_t xp, Bool_t print = kFALSE);
85 TGraphAsymmErrors &effVsX, Int_t ip, Double_t xp);
89 TGraphAsymmErrors*
CreateGraph(
const char* name,
const char*
title,
int value=-1);
90 void BeautifyGraph(TGraphAsymmErrors &g,
const char* xAxisName,
const char* yAxisName);
91 void BeautifyGraphs(TObjArray& array,
const char* xAxisName,
const char* yAxisName);
92 void SetRunLabel(TGraphAsymmErrors &g, Int_t irun,
const TList& runs);
93 void SetRunLabel(TObjArray& array, Int_t irun,
const TList& runs);
98 TString fileNameWeights =
"",
99 TString fileNameData =
"AnalysisResults.root",
100 TString fileNameSave =
"efficiency_new.root")
133 void PlotMuonEfficiencyVsX(TString var, TString fileNameData, TString fileNameSave, Bool_t saveEdges, Bool_t print, Bool_t draw)
137 printf(
"plotting efficiency versus %s...\n", var.Data());
140 if (var ==
"centrality") xDim = 1;
141 else if (var ==
"pt") xDim = 2;
142 else if (var ==
"y") xDim = 3;
143 else if (var ==
"phi") xDim = 4;
144 else if (var ==
"charge") xDim = 5;
146 printf(
"incorrect variable. Choices are centrality, pt, y, phi and charge.\n");
151 TFile *
file =
new TFile(fileNameData.Data(),
"read");
152 if (!file || !file->IsOpen()) {
153 printf(
"cannot open file %s \n",fileNameData.Data());
156 TList *listTT =
static_cast<TList*
>(file->FindObjectAny(
"TotalTracksPerChamber"));
157 TList *listTD =
static_cast<TList*
>(file->FindObjectAny(
"TracksDetectedPerChamber"));
158 THnSparse *TT =
static_cast<THnSparse*
>(listTT->At(10));
159 THnSparse *TD =
static_cast<THnSparse*
>(listTD->At(10));
162 TGraphAsymmErrors *effVsX[3] = {0x0, 0x0, 0x0};
163 TString nameAdd[3] = {
"",
"Low",
"Up"};
164 TString titleAdd[3] = {
"",
" - lower limit",
" - upper limit"};
165 for (Int_t i = 0; i < 1 || (saveEdges && i < 3); ++i) {
166 effVsX[i] =
CreateGraph(Form(
"trackingEffVs%s%s",var.Data(),nameAdd[i].Data()),
167 Form(
"Measured tracking efficiency versus %s%s",var.Data(),titleAdd[i].Data()));
179 for (Int_t ix = 1; ix <= TT->GetAxis(xDim)->GetNbins(); ix++) {
181 if (print) cout << var.Data() <<
" " << TT->GetAxis(xDim)->GetBinLowEdge(ix) <<
"-" << TT->GetAxis(xDim)->GetBinUpEdge(ix) <<
":" << endl;
184 TT->GetAxis(xDim)->SetRange(ix, ix);
185 TD->GetAxis(xDim)->SetRange(ix, ix);
191 TGraphAsymmErrors *dummy[3] = {0x0, 0x0, 0x0};
192 GetTrackingEfficiency(chEff, chEffErr, dummy, effVsX, ix-1, TT->GetAxis(xDim)->GetBinCenter(ix), print);
197 effVsX[0]->SetPoint(ix-1,TT->GetAxis(xDim)->GetBinCenter(ix),1.);
198 effVsX[0]->SetPointError(ix-1,0.,0.,1.,0.);
203 effVsX[1]->SetPoint(ix-1,TT->GetAxis(xDim)->GetBinCenter(ix),0.);
204 effVsX[1]->SetPointError(ix-1,0.,0.,0.,0.);
207 effVsX[2]->SetPoint(ix-1,TT->GetAxis(xDim)->GetBinCenter(ix),1.);
208 effVsX[2]->SetPointError(ix-1,0.,0.,0.,0.);
220 for (Int_t i = 0; i < 1 || (saveEdges && i < 3); ++i)
BeautifyGraph(*effVsX[i], var.Data(),
"efficiency");
223 new TCanvas(Form(
"cTrackingEffVs%s",var.Data()), Form(
"Measured tracking efficiency versus %s",var.Data()),1000,400);
224 effVsX[0]->DrawClone(
"ap");
228 file =
new TFile(fileNameSave.Data(),
"update");
229 for (Int_t i = 0; i < 1 || (saveEdges && i < 3); ++i) effVsX[i]->Write(0x0, TObject::kOverwrite);
233 for (Int_t i = 0; i < 1 || (saveEdges && i < 3); ++i)
delete effVsX[i];
240 TString fileNameData, TString fileNameSave, Bool_t print, Bool_t draw)
244 printf(
"plotting integrated efficiency versus %s...\n", var.Data());
249 printf(
"Cannot compute integrated efficiency without run-by-run weights\n");
254 ifstream inFile(runList.Data());
255 if (!inFile.is_open()) {
256 printf(
"cannot open file %s\n",runList.Data());
261 TGraphAsymmErrors *intEffVsX =
CreateGraph(Form(
"integratedTrackingEffVs%s",var.Data()),
262 Form(
"Integrated tracking efficiency versus %s",var.Data()));
271 while (!inFile.eof()) {
275 currRun.ReadLine(inFile,kTRUE);
276 if(currRun.IsNull() || !currRun.IsDec())
continue;
277 Int_t run = currRun.Atoi();
279 printf(
"run %d: ", run);
282 TString dataFile = Form(
"runs/%d/%s", run, fileNameData.Data());
283 TString outFile = Form(
"runs/%d/%s", run, fileNameSave.Data());
287 TParameter<Double_t> *weight =
static_cast<TParameter<Double_t>*
>(
runWeights->FindObject(currRun.Data()));
289 printf(
"weight not found for run %s\n", currRun.Data());
292 Double_t w = weight->GetVal();
296 TFile *
file =
new TFile(outFile.Data(),
"read");
297 if (!file || !file->IsOpen()) {
298 printf(
"cannot open file\n");
301 TGraphAsymmErrors *effVsX[2];
302 effVsX[0] =
static_cast<TGraphAsymmErrors*
>(file->FindObjectAny(Form(
"trackingEffVs%sLow",var.Data())));
303 effVsX[1] =
static_cast<TGraphAsymmErrors*
>(file->FindObjectAny(Form(
"trackingEffVs%sUp",var.Data())));
304 if (!effVsX[0] || !effVsX[1]) {
305 printf(
"trackingEffVs%sLow(Up) object not found\n", var.Data());
311 n = effVsX[0]->GetN();
312 x.Set(n, effVsX[0]->GetX());
313 for (Int_t i = 0; i < 2; ++i) {
317 }
else if (n != effVsX[0]->GetN()) {
318 printf(
"number of points in graph trackingEffVs%sLow(Up) for run %d is different than from previous runs\n", var.Data(), run);
324 for (Int_t ix = 0; ix < n; ++ix) {
325 Double_t ieffErr[2] = {effVsX[0]->GetErrorYlow(ix), effVsX[1]->GetErrorYhigh(ix)};
326 for (Int_t i = 0; i < 2; ++i) {
327 rec[i][ix] += w*effVsX[i]->GetY()[ix];
328 effErr[i][ix] += w2*ieffErr[i]*ieffErr[i];
342 for (Int_t ix = 0; ix < n; ++ix) {
344 intEffVsX->SetPoint(ix, x[ix], rec[1][ix]/gen);
345 intEffVsX->SetPointError(ix, 0., 0., (rec[1][ix]-rec[0][ix]+TMath::Sqrt(effErr[0][ix]))/gen, TMath::Sqrt(effErr[1][ix])/gen);
351 for (Int_t ix = 0; ix < n; ++ix) {
353 printf(
"impossible to integrate, all weights = 0 or unknown ?!?\n");
355 intEffVsX->SetPoint(ix, x[ix], -1.);
356 intEffVsX->SetPointError(ix, 0., 0., 0., 0.);
366 new TCanvas(Form(
"cIntegratedTrackingEffVs%s",var.Data()), Form(
"Integrated tracking efficiency versus %s",var.Data()),1000,400);
367 intEffVsX->DrawClone(
"ap");
371 TFile *
file =
new TFile(fileNameSave.Data(),
"update");
372 intEffVsX->Write(0x0, TObject::kOverwrite);
382 void PlotMuonEfficiencyVsXY(TString xVar, TString yVar, TString fileNameData, TString fileNameSave, Bool_t draw, Bool_t rap)
386 printf(
"plotting efficiency versus %s/%s...\n", xVar.Data(), yVar.Data());
389 if (xVar ==
"centrality") xDim = 1;
390 else if (xVar ==
"pt") xDim = 2;
391 else if (xVar ==
"y") xDim = 3;
392 else if (xVar ==
"phi") xDim = 4;
393 else if (xVar ==
"charge") xDim = 5;
395 printf(
"incorrect variable. Choices are centrality, pt, y, phi and charge.\n");
399 if (yVar ==
"centrality") yDim = 1;
400 else if (yVar ==
"pt") yDim = 2;
401 else if (yVar ==
"y") yDim = 3;
402 else if (yVar ==
"phi") yDim = 4;
403 else if (yVar ==
"charge") yDim = 5;
405 printf(
"incorrect variable. Choices are centrality, pt, y, phi and charge.\n");
410 TFile *
file =
new TFile(fileNameData.Data(),
"read");
411 if (!file || !file->IsOpen()) {
412 printf(
"cannot open file %s\n",fileNameData.Data());
415 TList *listTT =
static_cast<TList*
>(file->FindObjectAny(
"TotalTracksPerChamber"));
416 TList *listTD =
static_cast<TList*
>(file->FindObjectAny(
"TracksDetectedPerChamber"));
417 THnSparse *TT =
static_cast<THnSparse*
>(listTT->At(10));
418 THnSparse *TD =
static_cast<THnSparse*
>(listTD->At(10));
421 Int_t nxBins = TT->GetAxis(xDim)->GetNbins();
422 Int_t nyBins = TT->GetAxis(yDim)->GetNbins();
423 TH2F *effVsXY =
new TH2F(Form(
"trackingEffVs%s-%s",xVar.Data(),yVar.Data()),
424 Form(
"Measured tracking efficiency versus %s and %s",xVar.Data(),yVar.Data()),
425 nxBins, TT->GetAxis(xDim)->GetBinLowEdge(1), TT->GetAxis(xDim)->GetBinUpEdge(nxBins),
426 nyBins, TT->GetAxis(yDim)->GetBinLowEdge(1), TT->GetAxis(yDim)->GetBinUpEdge(nyBins));
427 effVsXY->SetDirectory(0);
438 for (Int_t ix = 1; ix <= nxBins; ++ix) {
441 TT->GetAxis(xDim)->SetRange(ix, ix);
442 TD->GetAxis(xDim)->SetRange(ix, ix);
444 for (Int_t iy = 1; iy <= nyBins; ++iy) {
447 TT->GetAxis(yDim)->SetRange(iy, iy);
448 TD->GetAxis(yDim)->SetRange(iy, iy);
454 TGraphAsymmErrors *dummy[3] = {0x0, 0x0, 0x0};
458 effVsXY->Fill(TT->GetAxis(xDim)->GetBinCenter(ix),TT->GetAxis(yDim)->GetBinCenter(iy),chEff[0]);
459 effVsXY->SetBinError(ix,iy,TMath::Max(chEffErr[0][0], chEffErr[1][0]));
464 effVsXY->Fill(TT->GetAxis(xDim)->GetBinCenter(ix),TT->GetAxis(yDim)->GetBinCenter(iy),0.);
465 effVsXY->SetBinError(ix,iy,1.);
477 effVsXY->GetXaxis()->SetTitle(xVar.Data());
478 effVsXY->GetXaxis()->CenterTitle(kTRUE);
479 effVsXY->GetXaxis()->SetLabelFont(22);
480 effVsXY->GetXaxis()->SetTitleFont(22);
481 effVsXY->GetYaxis()->SetTitle(yVar.Data());
482 effVsXY->GetYaxis()->CenterTitle(kTRUE);
483 effVsXY->GetYaxis()->SetLabelFont(22);
484 effVsXY->GetYaxis()->SetTitleFont(22);
485 effVsXY->GetZaxis()->SetTitle(
"efficiency");
486 effVsXY->GetZaxis()->SetLabelFont(22);
487 effVsXY->GetZaxis()->SetTitleFont(22);
490 new TCanvas(Form(
"cTrackingEffVs%s-%s",xVar.Data(),yVar.Data()), Form(
"Measured tracking efficiency versus %s and %s",xVar.Data(),yVar.Data()),700,600);
491 effVsXY->DrawClone(
"surf1");
495 file =
new TFile(fileNameSave.Data(),
"update");
496 effVsXY->Write(0x0, TObject::kOverwrite);
499 if (yDim == 3 && rap) {
501 TH2F* effVsXYrap =
new TH2F();
502 TString rapName = Form(
"trackingEffVs%s-%sRapBins", xVar.Data(), yVar.Data());
503 TString rapTitle = Form(
"Measured tracking efficiency versus %s and %s", xVar.Data(), yVar.Data());
504 effVsXYrap->SetTitle(rapTitle.Data());
505 effVsXYrap->SetName(rapName.Data());
507 Double_t xBinEdge[nxBins+1];
508 for (Int_t xbin = 0; xbin <= nxBins; ++xbin)
509 xBinEdge[xbin] = effVsXY->GetXaxis()->GetBinLowEdge(xbin+1);
511 Double_t yBinEdge[nyBins+1];
512 for (Int_t ybin = 0; ybin <= nyBins; ++ybin)
513 yBinEdge[ybin] = 2*TMath::ATan(TMath::Exp((effVsXY->GetYaxis()->GetBinLowEdge(ybin+1))));
515 effVsXYrap->SetBins(nxBins, xBinEdge, nyBins, yBinEdge);
517 for (Int_t xbin = 1; xbin <= nxBins; ++xbin)
518 for (Int_t ybin = 1; ybin <= nyBins; ++ybin)
519 effVsXYrap->SetBinContent(xbin, ybin, effVsXY->GetBinContent(xbin,ybin));
521 effVsXYrap->Write(0x0, TObject::kOverwrite);
536 void PlotMuonEfficiency(TString fileNameData, TString fileNameSave, Bool_t saveEdges, Bool_t print, Bool_t draw)
540 printf(
"plotting efficiency...\n");
543 TFile *
file =
new TFile(fileNameData.Data(),
"read");
544 if (!file || !file->IsOpen()) {
545 printf(
"cannot open file %s \n",fileNameData.Data());
548 TList *listTT =
static_cast<TList*
>(file->FindObjectAny(
"TotalTracksPerChamber"));
549 TList *listTD =
static_cast<TList*
>(file->FindObjectAny(
"TracksDetectedPerChamber"));
550 THnSparse *TT =
static_cast<THnSparse*
>(listTT->At(10));
551 THnSparse *TD =
static_cast<THnSparse*
>(listTD->At(10));
554 TGraphAsymmErrors *effVsCh[3] = {0x0, 0x0, 0x0};
555 TGraphAsymmErrors *effVsSt[3] = {0x0, 0x0, 0x0};
556 TString nameAdd[3] = {
"",
"Low",
"Up"};
557 TString titleAdd[3] = {
"",
" - lower limit",
" - upper limit"};
558 for (Int_t i = 0; i < 1 || (saveEdges && i < 3); ++i) {
559 effVsCh[i] =
CreateGraph(Form(
"chamberEff%s",nameAdd[i].Data()),
560 Form(
"Measured efficiency per chamber (0 = spectro)%s",titleAdd[i].Data()));
561 effVsSt[i] =
CreateGraph(Form(
"stationEff%s",nameAdd[i].Data()),
562 Form(
"Measured efficiency per station (6 = st4&5)%s",titleAdd[i].Data()));
583 effVsCh[0]->SetPoint(0,0.,1.);
584 effVsCh[0]->SetPointError(0,0.,0.,1.,0.);
589 effVsCh[1]->SetPoint(0,0.,0.);
590 effVsCh[1]->SetPointError(0,0.,0.,0.,0.);
593 effVsCh[2]->SetPoint(0,0.,1.);
594 effVsCh[2]->SetPointError(0,0.,0.,0.,0.);
601 for (Int_t iCh = 1; iCh < 11; iCh++) {
602 for (Int_t i = 0; i < 1 || (saveEdges && i < 3); ++i) {
603 effVsCh[i]->SetPoint(iCh,iCh,chEff[iCh]);
604 effVsCh[i]->SetPointError(iCh,0.,0.,chEffErr[0][iCh],chEffErr[1][iCh]);
612 for (Int_t i = 0; i < 1 || (saveEdges && i < 3); ++i) {
613 effVsCh[i]->GetXaxis()->Set(12, -0.5, 10.5);
614 effVsCh[i]->GetXaxis()->SetNdivisions(11);
616 effVsSt[i]->GetXaxis()->Set(7, 0.5, 6.5);
617 effVsSt[i]->GetXaxis()->SetNdivisions(6);
622 TCanvas *c =
new TCanvas(
"cEfficiency",
"Measured tracking efficiency" , 1000, 400);
624 gROOT->SetSelectedPad(c->cd(1));
625 effVsCh[0]->DrawClone(
"ap");
626 gROOT->SetSelectedPad(c->cd(2));
627 effVsSt[0]->DrawClone(
"ap");
631 file =
new TFile(fileNameSave.Data(),
"update");
632 for (Int_t i = 0; i < 1 || (saveEdges && i < 3); ++i) effVsCh[i]->Write(0x0, TObject::kOverwrite);
633 for (Int_t i = 0; i < 1 || (saveEdges && i < 3); ++i) effVsSt[i]->Write(0x0, TObject::kOverwrite);
637 for (Int_t i = 0; i < 1 || (saveEdges && i < 3); ++i) {
650 printf(
"plotting efficiency versus run...\n");
653 ifstream inFile(runList.Data());
654 if (!inFile.is_open()) {
655 printf(
"cannot open file %s\n",runList.Data());
660 TObjArray chamberVsRunGraphs;
661 chamberVsRunGraphs.SetOwner(kTRUE);
662 for ( Int_t iCh = 1; iCh < 11; ++iCh)
663 chamberVsRunGraphs.Add(
CreateGraph(
"effCh%dVsRun",
"Measured efficiency for chamber %d versus run",iCh));
665 TObjArray stationVsRunGraphs[3];
666 TGraphAsymmErrors *trkVsRun[3];
667 TString nameAdd[3] = {
"",
"Low",
"Up"};
668 TString titleAdd[3] = {
"",
" - lower limit",
" - upper limit"};
669 for (Int_t i = 0; i < 3; ++i) {
671 stationVsRunGraphs[i].SetOwner(kTRUE);
672 for ( Int_t iSt = 1; iSt < 6; ++iSt)
673 stationVsRunGraphs[i].Add(
CreateGraph(Form(
"effSt%%dVsRun%s",nameAdd[i].Data()),
674 Form(
"Measured efficiency for station %%d versus run%s",titleAdd[i].Data()),iSt));
675 stationVsRunGraphs[i].Add(
CreateGraph(Form(
"effSt4&5VsRun%s",nameAdd[i].Data()),
676 Form(
"Measured efficiency for station 4&5 versus run%s",titleAdd[i].Data())));
678 trkVsRun[i] =
CreateGraph(Form(
"trackingEffVsRun%s",nameAdd[i].Data()),
679 Form(
"Measured tracking efficiency versus run%s", titleAdd[i].Data()));
688 while (!inFile.eof()) {
692 currRun.ReadLine(inFile,kTRUE);
693 if(currRun.IsNull())
continue;
694 runs.AddLast(
new TObjString(currRun));
697 Int_t run = currRun.Atoi();
699 printf(
"run %d: ", run);
702 TString dataFile = Form(
"runs/%d/%s", run, fileNameData.Data());
703 TString outFile = Form(
"runs/%d/%s", run, fileNameSave.Data());
706 TFile *
file =
new TFile(outFile.Data(),
"read");
707 if (!file || !file->IsOpen()) {
708 printf(
"cannot open file\n");
713 for (Int_t i = 0; i < 3; ++i) {
716 TGraphAsymmErrors *effVsCh;
717 TGraphAsymmErrors *effVsSt;
718 effVsCh =
static_cast<TGraphAsymmErrors*
>(file->FindObjectAny(Form(
"chamberEff%s",nameAdd[i].Data())));
719 effVsSt =
static_cast<TGraphAsymmErrors*
>(file->FindObjectAny(Form(
"stationEff%s",nameAdd[i].Data())));
720 if (!effVsCh || !effVsSt) {
721 printf(
"efficiency graph not found\n");
726 if (i == 0)
for ( Int_t iCh = 0; iCh < 10; ++iCh) {
727 TGraphAsymmErrors *g =
static_cast<TGraphAsymmErrors*
>(chamberVsRunGraphs.UncheckedAt(iCh));
728 g->SetPoint(irun,irun,effVsCh->GetY()[iCh+1]);
729 g->SetPointError(irun,0.,0.,effVsCh->GetErrorYlow(iCh+1),effVsCh->GetErrorYhigh(iCh+1));
733 for ( Int_t iSt = 0; iSt < 6; ++iSt) {
734 TGraphAsymmErrors *g =
static_cast<TGraphAsymmErrors*
>(stationVsRunGraphs[i].UncheckedAt(iSt));
735 g->SetPoint(irun,irun,effVsSt->GetY()[iSt]);
736 g->SetPointError(irun,0.,0.,effVsSt->GetErrorYlow(iSt),effVsSt->GetErrorYhigh(iSt));
740 trkVsRun[i]->SetPoint(irun,irun,effVsCh->GetY()[0]);
741 trkVsRun[i]->SetPointError(irun,0.,0.,effVsCh->GetErrorYlow(0),effVsCh->GetErrorYhigh(0));
754 for (Int_t i = 0; i < 3; ++i) {
762 new TCanvas(
"cTrackingEffVsRun",
"Tracking efficiency versus run",1000,400);
763 trkVsRun[0]->DrawClone(
"ap");
767 TFile*
file =
new TFile(fileNameSave.Data(),
"update");
768 chamberVsRunGraphs.Write(
"ChamberEffVsRun", TObject::kOverwrite | TObject::kSingleKey);
769 for (Int_t i = 0; i < 3; ++i)
770 stationVsRunGraphs[i].Write(Form(
"StationEffVsRun%s",nameAdd[i].Data()), TObject::kOverwrite | TObject::kSingleKey);
771 for (Int_t i = 0; i < 3; ++i) trkVsRun[i]->Write(0x0, TObject::kOverwrite);
775 for (Int_t i = 0; i < 3; ++i)
delete trkVsRun[i];
785 printf(
"plotting integrated efficiency...\n");
790 printf(
"Cannot compute integrated efficiency without run-by-run weights\n");
795 TFile *
file =
new TFile(fileNameSave.Data(),
"update");
796 if (!file || !file->IsOpen()) {
797 printf(
"cannot open file\n");
800 TObjArray *chamberVsRunGraphs =
static_cast<TObjArray*
>(file->FindObjectAny(
"ChamberEffVsRun"));
801 TObjArray *stationVsRunGraphs[2];
802 stationVsRunGraphs[0] =
static_cast<TObjArray*
>(file->FindObjectAny(
"StationEffVsRunLow"));
803 stationVsRunGraphs[1] =
static_cast<TObjArray*
>(file->FindObjectAny(
"StationEffVsRunUp"));
804 TGraphAsymmErrors *trkVsRun[2];
805 trkVsRun[0] =
static_cast<TGraphAsymmErrors*
>(file->FindObjectAny(
"trackingEffVsRunLow"));
806 trkVsRun[1] =
static_cast<TGraphAsymmErrors*
>(file->FindObjectAny(
"trackingEffVsRunUp"));
807 if (!chamberVsRunGraphs || !stationVsRunGraphs[0] || !stationVsRunGraphs[1] || !trkVsRun[0] || !trkVsRun[1]) {
808 printf(
"object not found --> you must first plot the efficiency versus run\n");
813 TGraphAsymmErrors *effVsCh =
CreateGraph(
"integratedChamberEff",
"Integrated efficiency per chamber (0 = spectro)");
814 TGraphAsymmErrors *effVsSt =
CreateGraph(
"integratedStationEff",
"Integrated efficiency per station (6 = st4&5)");
820 for ( Int_t iCh = 0; iCh < 10; ++iCh) {
821 TGraphAsymmErrors *g =
static_cast<TGraphAsymmErrors*
>(chamberVsRunGraphs->UncheckedAt(iCh));
826 for ( Int_t iSt = 0; iSt < 6; ++iSt) {
827 TGraphAsymmErrors *gLow =
static_cast<TGraphAsymmErrors*
>(stationVsRunGraphs[0]->UncheckedAt(iSt));
828 TGraphAsymmErrors *gUp =
static_cast<TGraphAsymmErrors*
>(stationVsRunGraphs[1]->UncheckedAt(iSt));
834 for (Int_t iCh = 1; iCh < 11; ++iCh) {
835 cout <<
"Efficiency chamber " << iCh <<
" : ";
836 cout << effVsCh->GetY()[iCh] <<
" + " << effVsCh->GetErrorYhigh(iCh) <<
" - " << effVsCh->GetErrorYlow(iCh) << endl;
838 for (Int_t iSt = 0; iSt < 6; ++iSt) {
839 if (iSt < 5) cout <<
"Station " << iSt+1 <<
" = ";
840 else cout <<
"Station 45 = ";
841 cout << effVsSt->GetY()[iSt] <<
" + " << effVsSt->GetErrorYhigh(iSt) <<
" - " << effVsSt->GetErrorYlow(iSt) << endl;
843 cout <<
"Total tracking efficiency : ";
844 cout << effVsCh->GetY()[0] <<
" + " << effVsCh->GetErrorYhigh(0) <<
" - " << effVsCh->GetErrorYlow(0) << endl << endl;
848 effVsCh->GetXaxis()->Set(12, -0.5, 10.5);
849 effVsCh->GetXaxis()->SetNdivisions(11);
851 effVsSt->GetXaxis()->Set(7, 0.5, 6.5);
852 effVsSt->GetXaxis()->SetNdivisions(6);
856 TCanvas *c =
new TCanvas(
"cIntegratedEfficiency",
"Integrated tracking efficiency" , 1000, 400);
858 gROOT->SetSelectedPad(c->cd(1));
859 effVsCh->DrawClone(
"ap");
860 gROOT->SetSelectedPad(c->cd(2));
861 effVsSt->DrawClone(
"ap");
865 effVsCh->Write(0x0, TObject::kOverwrite);
866 effVsSt->Write(0x0, TObject::kOverwrite);
881 printf(
"plotting efficiency per DE...\n");
884 TFile *
file =
new TFile(fileNameData.Data(),
"read");
885 if (!file || !file->IsOpen()) {
886 printf(
"cannot open file %s \n",fileNameData.Data());
889 TList *listTT =
static_cast<TList*
>(file->FindObjectAny(
"TotalTracksPerChamber"));
890 TList *listTD =
static_cast<TList*
>(file->FindObjectAny(
"TracksDetectedPerChamber"));
893 TObjArray chamberVsDEGraphs;
894 chamberVsDEGraphs.SetOwner(kTRUE);
895 TGraphAsymmErrors *gCh[10];
897 TObjArray stationVsDEGraphs[3];
898 TString nameAdd[3] = {
"",
"Low",
"Up"};
899 TString titleAdd[3] = {
"",
" - lower limit",
" - upper limit"};
900 for (Int_t i = 0; i < 3; ++i) stationVsDEGraphs[i].SetOwner(kTRUE);
901 TGraphAsymmErrors *gSt[6][3];
902 for (Int_t iSt = 0; iSt < 6; ++iSt)
for (Int_t i = 0; i < 3; ++i) gSt[iSt][i] = 0x0;
905 for (Int_t iCh = 0; iCh < 10; ++iCh) {
908 chamberVsDEGraphs.Add(
CreateGraph(
"effCh%dVsDE",
"Measured efficiency for chamber %d per DE",iCh+1));
909 gCh[iCh] =
static_cast<TGraphAsymmErrors*
>(chamberVsDEGraphs.UncheckedAt(iCh));
912 THnSparse *TT =
static_cast<THnSparse*
>(listTT->At(iCh));
913 THnSparse *TD =
static_cast<THnSparse*
>(listTD->At(iCh));
933 for (Int_t iSt = 0; iSt < 3; ++iSt) {
936 for (Int_t i = 0; i < 1 || (saveEdges && i < 3); ++i) {
937 stationVsDEGraphs[i].Add(
CreateGraph(Form(
"effSt%%dVsDE%s",nameAdd[i].Data()),
938 Form(
"Measured efficiency for station %%d per DE%s",titleAdd[i].Data()),iSt+1));
939 gSt[iSt][i] =
static_cast<TGraphAsymmErrors*
>(stationVsDEGraphs[i].UncheckedAt(iSt));
943 Int_t
nDE = gCh[2*iSt]->GetN();
944 for (Int_t iDE = 0; iDE <
nDE; ++iDE) {
947 for (Int_t iCh = 0; iCh < 2; ++iCh) {
948 chEff[2*iSt+iCh+1] = gCh[2*iSt+iCh]->GetY()[iDE];
949 chEffErr[0][2*iSt+iCh+1] = gCh[2*iSt+iCh]->GetErrorYlow(iDE);
950 chEffErr[1][2*iSt+iCh+1] = gCh[2*iSt+iCh]->GetErrorYhigh(iDE);
961 for (Int_t i = 0; i < 1 || (saveEdges && i < 3); ++i) {
962 for (Int_t iSt = 3; iSt < 5; ++iSt) {
963 stationVsDEGraphs[i].Add(
CreateGraph(Form(
"effSt%%dVsDE%s",nameAdd[i].Data()),
964 Form(
"Measured efficiency for station %%d per DE%s",titleAdd[i].Data()),iSt+1));
965 gSt[iSt][i] =
static_cast<TGraphAsymmErrors*
>(stationVsDEGraphs[i].UncheckedAt(iSt));
967 stationVsDEGraphs[i].Add(
CreateGraph(Form(
"effSt4&5VsDE%s",nameAdd[i].Data()),
968 Form(
"Measured efficiency for station 4&5 per DE%s",titleAdd[i].Data())));
969 gSt[5][i] =
static_cast<TGraphAsymmErrors*
>(stationVsDEGraphs[i].UncheckedAt(5));
973 Int_t
nDE = gCh[6]->GetN();
974 for (Int_t iDE = 0; iDE <
nDE; ++iDE) {
977 for (Int_t iCh = 6; iCh < 10; ++iCh) {
978 chEff[iCh+1] = gCh[iCh]->GetY()[iDE];
979 chEffErr[0][iCh+1] = gCh[iCh]->GetErrorYlow(iDE);
980 chEffErr[1][iCh+1] = gCh[iCh]->GetErrorYhigh(iDE);
984 for (Int_t iSt = 3; iSt < 5; ++iSt)
GetStationEfficiency(chEff, chEffErr, iSt, gSt[iSt], iDE, iDE);
992 for (Int_t iCh = 0; iCh < 10; ++iCh) {
993 Int_t nDE = gCh[iCh]->GetN();
994 gCh[iCh]->GetXaxis()->Set(nDE+1, -0.5, nDE-0.5);
995 gCh[iCh]->GetXaxis()->SetNdivisions(nDE);
997 BeautifyGraphs(chamberVsDEGraphs,
"Detection Element",
"efficiency");
998 for (Int_t i = 0; i < 1 || (saveEdges && i < 3); ++i) {
999 for (Int_t iSt = 0; iSt < 6; ++iSt) {
1000 Int_t nDE = gSt[iSt][i]->GetN();
1001 gSt[iSt][i]->GetXaxis()->Set(nDE+1, -0.5, nDE-0.5);
1002 gSt[iSt][i]->GetXaxis()->SetNdivisions(nDE);
1004 BeautifyGraphs(stationVsDEGraphs[i],
"Detection Element",
"efficiency");
1009 file =
new TFile(fileNameSave.Data(),
"update");
1010 chamberVsDEGraphs.Write(
"ChamberEffVsDE", TObject::kOverwrite | TObject::kSingleKey);
1011 for (Int_t i = 0; i < 1 || (saveEdges && i < 3); ++i)
1012 stationVsDEGraphs[i].Write(Form(
"StationEffVsDE%s",nameAdd[i].Data()), TObject::kOverwrite | TObject::kSingleKey);
1023 printf(
"plotting efficiency per DE versus run...\n");
1026 ifstream inFile(runList.Data());
1027 if (!inFile.is_open()) {
1028 printf(
"cannot open file %s\n",runList.Data());
1033 TObjArray deVsRunGraphs;
1034 deVsRunGraphs.SetOwner(kTRUE);
1035 TObjArray stDEVsRunGraphs[3];
1036 TString nameAdd[3] = {
"",
"Low",
"Up"};
1037 TString titleAdd[3] = {
"",
" - lower limit",
" - upper limit"};
1038 for (Int_t i = 0; i < 3; ++i) stDEVsRunGraphs[i].SetOwner(kTRUE);
1039 Bool_t createGraph = kTRUE;
1046 while (!inFile.eof()) {
1050 currRun.ReadLine(inFile,kTRUE);
1051 if(currRun.IsNull())
continue;
1052 runs.AddLast(
new TObjString(currRun));
1055 Int_t run = currRun.Atoi();
1057 printf(
"run %d: ", run);
1060 TString dataFile = Form(
"runs/%d/%s", run, fileNameData.Data());
1061 TString outFile = Form(
"runs/%d/%s", run, fileNameSave.Data());
1064 TFile *
file =
new TFile(outFile.Data(),
"read");
1065 if (!file || !file->IsOpen()) {
1066 printf(
"cannot open file\n");
1071 TObjArray *chamberVsDEGraphs =
static_cast<TObjArray*
>(file->FindObjectAny(
"ChamberEffVsDE"));
1072 if (!chamberVsDEGraphs) {
1073 printf(
"efficiency graph not found\n");
1077 Int_t currentDE = 0;
1080 for ( Int_t iCh = 0; iCh < 10; ++iCh) {
1083 TGraphAsymmErrors *g =
static_cast<TGraphAsymmErrors*
>(chamberVsDEGraphs->UncheckedAt(iCh));
1084 Int_t
nDE = g->GetN();
1087 for (Int_t iDE = 0; iDE <
nDE; ++iDE) {
1090 if (createGraph) deVsRunGraphs.Add(
CreateGraph(
"effDE%dVsRun",
"Measured efficiency for DE %d versus run",100*(iCh+1)+iDE));
1091 TGraphAsymmErrors *gDE=
static_cast<TGraphAsymmErrors*
>(deVsRunGraphs.UncheckedAt(currentDE++));
1094 gDE->SetPoint(irun,irun,g->GetY()[iDE]);
1095 gDE->SetPointError(irun,0.,0.,g->GetErrorYlow(iDE),g->GetErrorYhigh(iDE));
1102 for (Int_t i = 0; i < 3; ++i) {
1105 TObjArray *stationVsDEGraphs =
static_cast<TObjArray*
>(file->FindObjectAny(Form(
"StationEffVsDE%s",nameAdd[i].Data())));
1106 if (!stationVsDEGraphs) {
1107 printf(
"efficiency graph not found\n");
1111 Int_t currentStDE = 0;
1114 for ( Int_t iSt = 0; iSt < 6; ++iSt) {
1117 TGraphAsymmErrors *g =
static_cast<TGraphAsymmErrors*
>(stationVsDEGraphs->UncheckedAt(iSt));
1118 Int_t
nDE = g->GetN();
1121 for (Int_t iDE = 0; iDE <
nDE; ++iDE) {
1125 TString sSt = (iSt<5) ? Form(
"%d",iSt+1) :
"4&5";
1126 stDEVsRunGraphs[i].Add(
CreateGraph(Form(
"effSt%sDE%%dVsRun%s",sSt.Data(),nameAdd[i].Data()),
1127 Form(
"Measured efficiency for DE %%d in station %s versus run%s",sSt.Data(),titleAdd[i].Data()),iDE));
1129 TGraphAsymmErrors *gDE=
static_cast<TGraphAsymmErrors*
>(stDEVsRunGraphs[i].UncheckedAt(currentStDE++));
1132 gDE->SetPoint(irun,irun,g->GetY()[iDE]);
1133 gDE->SetPointError(irun,0.,0.,g->GetErrorYlow(iDE),g->GetErrorYhigh(iDE));
1143 createGraph = kFALSE;
1152 for (Int_t i = 0; i < 3; ++i) {
1158 TFile*
file =
new TFile(fileNameSave.Data(),
"update");
1159 deVsRunGraphs.Write(
"DEEffVsRun", TObject::kOverwrite | TObject::kSingleKey);
1160 for (Int_t i = 0; i < 3; ++i)
1161 stDEVsRunGraphs[i].Write(Form(
"DEEffPerStationVsRun%s",nameAdd[i].Data()), TObject::kOverwrite | TObject::kSingleKey);
1172 printf(
"plotting integrated efficiency per DE...\n");
1177 printf(
"Cannot compute integrated efficiency without run-by-run weights\n");
1182 TFile *
file =
new TFile(fileNameSave.Data(),
"update");
1183 if (!file || !file->IsOpen()) {
1184 printf(
"cannot open file\n");
1187 TObjArray *deVsRunGraphs =
static_cast<TObjArray*
>(file->FindObjectAny(
"DEEffVsRun"));
1188 TObjArray *stDEVsRunGraphs[2];
1189 stDEVsRunGraphs[0] =
static_cast<TObjArray*
>(file->FindObjectAny(
"DEEffPerStationVsRunLow"));
1190 stDEVsRunGraphs[1] =
static_cast<TObjArray*
>(file->FindObjectAny(
"DEEffPerStationVsRunUp"));
1191 if (!deVsRunGraphs || !stDEVsRunGraphs[0] || !stDEVsRunGraphs[1]) {
1192 printf(
"object not found --> you must first plot the efficiency versus run\n");
1197 TObjArray chamberVsDEGraphs;
1198 chamberVsDEGraphs.SetOwner(kTRUE);
1199 for ( Int_t iCh = 0; iCh < 10; ++iCh)
1200 chamberVsDEGraphs.Add(
CreateGraph(
"integratedEffCh%dVsDE",
"Integrated efficiency for chamber %d per DE",iCh+1));
1202 TObjArray stationVsDEGraphs;
1203 stationVsDEGraphs.SetOwner(kTRUE);
1204 for ( Int_t iSt = 0; iSt < 5; ++iSt)
1205 stationVsDEGraphs.Add(
CreateGraph(
"integratedEffSt%dVsDE",
"Integrated efficiency for station %d per DE",iSt+1));
1206 stationVsDEGraphs.Add(
CreateGraph(
"integratedEffSt4&5VsDE",
"Integrated efficiency for station 4&5 per DE"));
1209 TIter nextDE(deVsRunGraphs);
1210 TGraphAsymmErrors *gDE = 0x0;
1211 while ((gDE = static_cast<TGraphAsymmErrors*>(nextDE()))) {
1215 sscanf(gDE->GetName(),
"effDE%dVsRun", &deId);
1216 Int_t iCh = deId/100-1;
1217 Int_t iDE = deId%100;
1220 TGraphAsymmErrors *g =
static_cast<TGraphAsymmErrors*
>(chamberVsDEGraphs.UncheckedAt(iCh));
1226 Int_t ng = stDEVsRunGraphs[0]->GetEntries();
1227 for (Int_t ig = 0; ig < ng; ++ig) {
1229 TGraphAsymmErrors *gDELow =
static_cast<TGraphAsymmErrors*
>(stDEVsRunGraphs[0]->UncheckedAt(ig));
1230 TGraphAsymmErrors *gDEUp =
static_cast<TGraphAsymmErrors*
>(stDEVsRunGraphs[1]->UncheckedAt(ig));
1234 if (strstr(gDELow->GetName(),
"4&5")) {
1236 sscanf(gDELow->GetName(),
"effSt4&5DE%dVsRunLow", &iDE);
1238 sscanf(gDELow->GetName(),
"effSt%dDE%dVsRunLow", &iSt, &iDE);
1243 TGraphAsymmErrors *g =
static_cast<TGraphAsymmErrors*
>(stationVsDEGraphs.UncheckedAt(iSt));
1249 for ( Int_t iCh = 0; iCh < 10; ++iCh) {
1250 TGraphAsymmErrors *g =
static_cast<TGraphAsymmErrors*
>(chamberVsDEGraphs.UncheckedAt(iCh));
1251 Int_t
nDE = g->GetN();
1252 g->GetXaxis()->Set(nDE+1, -0.5, nDE-0.5);
1253 g->GetXaxis()->SetNdivisions(nDE);
1255 BeautifyGraphs(chamberVsDEGraphs,
"Detection Element",
"efficiency");
1256 for ( Int_t iSt = 0; iSt < 6; ++iSt) {
1257 TGraphAsymmErrors *g =
static_cast<TGraphAsymmErrors*
>(stationVsDEGraphs.UncheckedAt(iSt));
1258 Int_t
nDE = g->GetN();
1259 g->GetXaxis()->Set(nDE+1, -0.5, nDE-0.5);
1260 g->GetXaxis()->SetNdivisions(nDE);
1262 BeautifyGraphs(stationVsDEGraphs,
"Detection Element",
"efficiency");
1265 chamberVsDEGraphs.Write(
"IntegratedChamberEffVsDE", TObject::kOverwrite | TObject::kSingleKey);
1266 stationVsDEGraphs.Write(
"IntegratedStationEffVsDE", TObject::kOverwrite | TObject::kSingleKey);
1279 TH1D *TTdraw = TT.Projection(0,
"e");
1280 TH1D *TDdraw = TD.Projection(0,
"e");
1283 TGraphAsymmErrors *efficiency = (TTdraw->GetEntries() > 0) ?
new TGraphAsymmErrors(TDdraw, TTdraw,Form(
"%se0",
effErrMode)) : 0x0;
1284 Bool_t ok = (efficiency);
1289 Bool_t missingEff = kFALSE;
1291 for (Int_t i = 0; i < 10; i++) {
1293 if (TTdraw->GetBinContent(i+1) > 0) {
1295 chEff[i+1] = efficiency->GetY()[i];
1296 chEffErr[0][i+1] = efficiency->GetErrorYlow(i);
1297 chEffErr[1][i+1] = efficiency->GetErrorYhigh(i);
1302 chEffErr[0][i+1] = 0.;
1303 chEffErr[1][i+1] = 0.;
1311 if (missingEff && printError) cout <<
"efficiency partially unknown" << endl;
1315 for (Int_t i = 0; i < 10; i++) {
1318 chEffErr[0][i+1] = 0.;
1319 chEffErr[1][i+1] = 0.;
1323 if (printError) cout <<
"efficiency unknown" << endl << endl;
1343 TH1D *TTdraw = TT.Projection(0,
"e");
1344 TH1D *TDdraw = TD.Projection(0,
"e");
1347 TGraphAsymmErrors *efficiency = (TTdraw->GetEntries() > 0) ?
new TGraphAsymmErrors(TDdraw, TTdraw,Form(
"%se0",
effErrMode)) : 0x0;
1348 Int_t
nDE = TTdraw->GetNbinsX();
1352 for (Int_t iDE = 0; iDE <
nDE; ++iDE) {
1354 if (TTdraw->GetBinContent(iDE+1) > 0) {
1356 effVsDE.SetPoint(iDE,iDE,efficiency->GetY()[iDE]);
1357 effVsDE.SetPointError(iDE,0,0,efficiency->GetErrorYlow(iDE),efficiency->GetErrorYhigh(iDE));
1361 effVsDE.SetPoint(iDE,iDE,-1);
1362 effVsDE.SetPointError(iDE,0,0,0,0);
1370 for (Int_t iDE = 0; iDE <
nDE; ++iDE) {
1372 effVsDE.SetPoint(iDE,iDE,-1);
1373 effVsDE.SetPointError(iDE,0,0,0,0);
1392 stEff = 1.-(1.-chEff[2*iSt+1])*(1.-chEff[2*iSt+2]);
1394 Double_t d1 = (1. - chEff[2*iSt+2]); d1 *= d1;
1395 Double_t d2 = (1. - chEff[2*iSt+1]); d2 *= d2;
1397 for (Int_t i = 0; i < 2; ++i) {
1398 Double_t s1 = chEffErr[i][2*iSt+1] * chEffErr[i][2*iSt+1];
1399 Double_t s2 = chEffErr[i][2*iSt+2] * chEffErr[i][2*iSt+2];
1400 stEffErr[i] = TMath::Sqrt(d1*s1 + d2*s2 + s1*s2);
1403 stEffErr[0] = TMath::Min(stEff, stEffErr[0]);
1404 stEffErr[1] = TMath::Min(1.-stEff, stEffErr[1]);
1410 void GetStationEfficiency(TArrayD &chEff, TArrayD chEffErr[2], Int_t iSt, TGraphAsymmErrors *effVsX[3], Int_t ip, Double_t xp)
1414 if (chEff[2*iSt+1] >= 0 && chEff[2*iSt+2] >= 0) {
1417 Double_t stEff, stEffErr[2];
1421 for (Int_t i = 0; i < 3; ++i) {
1423 effVsX[i]->SetPoint(ip,xp,stEff);
1424 effVsX[i]->SetPointError(ip,0.,0.,stEffErr[0],stEffErr[1]);
1430 Double_t edge[2] = {0., 1.};
1431 TArrayD chEffEdge[2];
1432 Double_t stEffEdge[2];
1433 Double_t stEffEdgeErr[2][2];
1435 for (Int_t i = 0; i < 2; ++i) {
1438 chEffEdge[i].Set(11);
1439 for (Int_t iCh = 1; iCh < 3; ++iCh) chEffEdge[i][2*iSt+iCh] = (chEff[2*iSt+iCh] < 0) ? edge[i] : chEff[2*iSt+iCh];
1446 effVsX[i+1]->SetPoint(ip,xp,stEffEdge[i]);
1447 effVsX[i+1]->SetPointError(ip,0.,0.,stEffEdgeErr[i][0],stEffEdgeErr[i][1]);
1454 effVsX[0]->SetPoint(ip,xp,stEffEdge[1]);
1455 effVsX[0]->SetPointError(ip,0.,0.,stEffEdge[1]-stEffEdge[0]+stEffEdgeErr[0][0],stEffEdgeErr[1][1]);
1468 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];
1470 Double_t d1 = chEff[8]*chEff[9] + chEff[8]*chEff[10] + chEff[9]*chEff[10] - 3.*chEff[8]*chEff[9]*chEff[10]; d1 *= d1;
1471 Double_t d2 = chEff[7]*chEff[9] + chEff[7]*chEff[10] + chEff[9]*chEff[10] - 3.*chEff[7]*chEff[9]*chEff[10]; d2 *= d2;
1472 Double_t d3 = chEff[7]*chEff[8] + chEff[7]*chEff[10] + chEff[8]*chEff[10] - 3.*chEff[7]*chEff[8]*chEff[10]; d3 *= d3;
1473 Double_t d4 = chEff[7]*chEff[8] + chEff[7]*chEff[9] + chEff[8]*chEff[9] - 3.*chEff[7]*chEff[8]*chEff[9]; d4 *= d4;
1474 Double_t d12 = chEff[9] + chEff[10] - 3.*chEff[9]*chEff[10]; d12 *= d12;
1475 Double_t d13 = chEff[8] + chEff[10] - 3.*chEff[8]*chEff[10]; d13 *= d13;
1476 Double_t d14 = chEff[8] + chEff[9] - 3.*chEff[8]*chEff[9]; d14 *= d14;
1477 Double_t d23 = chEff[7] + chEff[10] - 3.*chEff[7]*chEff[10]; d23 *= d23;
1478 Double_t d24 = chEff[7] + chEff[9] - 3.*chEff[7]*chEff[9]; d24 *= d24;
1479 Double_t d34 = chEff[7] + chEff[8] - 3.*chEff[7]*chEff[8]; d34 *= d34;
1480 Double_t d123 = 1. - 3.*chEff[10]; d123 *= d123;
1481 Double_t d124 = 1. - 3.*chEff[9]; d124 *= d124;
1482 Double_t d134 = 1. - 3.*chEff[8]; d134 *= d134;
1483 Double_t d234 = 1. - 3.*chEff[7]; d234 *= d234;
1484 Double_t d1234 = - 3.; d1234 *= d1234;
1486 for (Int_t i = 0; i < 2; ++i) {
1487 Double_t s1 = chEffErr[i][7] * chEffErr[i][7];
1488 Double_t s2 = chEffErr[i][8] * chEffErr[i][8];
1489 Double_t s3 = chEffErr[i][9] * chEffErr[i][9];
1490 Double_t s4 = chEffErr[i][10] * chEffErr[i][10];
1491 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);
1494 st45EffErr[0] = TMath::Min(st45Eff, st45EffErr[0]);
1495 st45EffErr[1] = TMath::Min(1.-st45Eff, st45EffErr[1]);
1505 if (chEff[7] >= 0 && chEff[8] >= 0 && chEff[9] >= 0 && chEff[10] >= 0) {
1508 Double_t stEff, stEffErr[2];
1512 for (Int_t i = 0; i < 3; ++i) {
1514 effVsX[i]->SetPoint(ip,xp,stEff);
1515 effVsX[i]->SetPointError(ip,0.,0.,stEffErr[0],stEffErr[1]);
1521 Double_t edge[2] = {0., 1.};
1522 TArrayD chEffEdge[2];
1523 Double_t stEffEdge[2];
1524 Double_t stEffEdgeErr[2][2];
1526 for (Int_t i = 0; i < 2; ++i) {
1529 chEffEdge[i].Set(11);
1530 for (Int_t iCh = 7; iCh < 11; ++iCh) chEffEdge[i][iCh] = (chEff[iCh] < 0) ? edge[i] : chEff[iCh];
1537 effVsX[i+1]->SetPoint(ip,xp,stEffEdge[i]);
1538 effVsX[i+1]->SetPointError(ip,0.,0.,stEffEdgeErr[i][0],stEffEdgeErr[i][1]);
1545 effVsX[0]->SetPoint(ip,xp,stEffEdge[1]);
1546 effVsX[0]->SetPointError(ip,0.,0.,stEffEdge[1]-stEffEdge[0]+stEffEdgeErr[0][0],stEffEdgeErr[1][1]);
1560 for (Int_t iSt = 0; iSt < 6; iSt++) de[iSt][0] = stEff[iSt]*stEff[iSt];
1564 spectroEff = stEff[0] * stEff[1] * stEff[2] * stEff[3] * stEff[4];
1566 for (Int_t i = 0; i < 2; i++) {
1568 for (Int_t iSt = 0; iSt < 6; iSt++) de[iSt][1] = stEffErr[iSt][i]*stEffErr[iSt][i];
1570 spectroEffErr[i] = 0.;
1571 for (Int_t j = 1; j < 32; j++) {
1572 Double_t sigmaAdd = 1.;
1573 for (Int_t iSt = 0; iSt < 5; iSt++) sigmaAdd *= de[iSt][TESTBIT(j,iSt)];
1574 spectroEffErr[i] += sigmaAdd;
1576 spectroEffErr[i] = TMath::Sqrt(spectroEffErr[i]);
1582 spectroEff = stEff[0] * stEff[1] * stEff[2] * stEff[5];
1584 for (Int_t i = 0; i < 2; i++) {
1586 for (Int_t iSt = 0; iSt < 6; iSt++) de[iSt][1] = stEffErr[iSt][i]*stEffErr[iSt][i];
1588 spectroEffErr[i] = 0.;
1589 for (Int_t j = 1; j < 16; j++) {
1590 Double_t sigmaAdd = de[5][TESTBIT(j,3)];
1591 for (Int_t iSt = 0; iSt < 3; iSt++) sigmaAdd *= de[iSt][TESTBIT(j,iSt)];
1592 spectroEffErr[i] += sigmaAdd;
1594 spectroEffErr[i] = TMath::Sqrt(spectroEffErr[i]);
1600 spectroEffErr[0] = TMath::Min(spectroEff, spectroEffErr[0]);
1601 spectroEffErr[1] = TMath::Min(1.-spectroEff, spectroEffErr[1]);
1608 TGraphAsymmErrors *effVsX[3], Int_t ip, Double_t xp, Bool_t print)
1613 Double_t stEffErr[6][2];
1616 Bool_t allEffKnown = kTRUE;
1617 for (Int_t iCh = 1; iCh < 11 && allEffKnown; ++iCh)
if (chEff[iCh] < 0) allEffKnown = kFALSE;
1626 Double_t spectroEff, spectroEffErr[2];
1628 chEff[0] = spectroEff;
1629 chEffErr[0][0] = spectroEffErr[0];
1630 chEffErr[1][0] = spectroEffErr[1];
1633 for (Int_t i = 0; i < 3; ++i) {
1635 effVsX[i]->SetPoint(ip,xp,chEff[0]);
1636 effVsX[i]->SetPointError(ip,0.,0.,chEffErr[0][0],chEffErr[1][0]);
1638 if (effVsSt[i])
for (Int_t iSt = 0; iSt < 6; ++iSt) {
1639 effVsSt[i]->SetPoint(iSt,iSt+1,stEff[iSt]);
1640 effVsSt[i]->SetPointError(iSt,0.,0.,stEffErr[iSt][0],stEffErr[iSt][1]);
1646 Double_t edge[2] = {0., 1.};
1647 TArrayD chEffEdge[2];
1648 Double_t stEffEdge[2][6];
1649 Double_t stEffEdgeErr[2][6][2];
1650 Double_t spectroEffEdge[2], spectroEffEdgeErr[2][2];
1652 for (Int_t i = 0; i < 2; ++i) {
1655 chEffEdge[i].Set(11);
1656 for (Int_t iCh = 1; iCh < 11; ++iCh) chEffEdge[i][iCh] = (chEff[iCh] < 0) ? edge[i] : chEff[iCh];
1659 for (Int_t iSt = 0; iSt < 5; ++iSt)
ComputeStationEfficiency(chEffEdge[i], chEffErr, iSt, stEffEdge[i][iSt], stEffEdgeErr[i][iSt]);
1667 effVsX[i+1]->SetPoint(ip,xp,spectroEffEdge[i]);
1668 effVsX[i+1]->SetPointError(ip,0.,0.,spectroEffEdgeErr[i][0],spectroEffEdgeErr[i][1]);
1670 if (effVsSt[i+1])
for (Int_t iSt = 0; iSt < 6; ++iSt) {
1671 effVsSt[i+1]->SetPoint(iSt,iSt+1,stEffEdge[i][iSt]);
1672 effVsSt[i+1]->SetPointError(iSt,0.,0.,stEffEdgeErr[i][iSt][0],stEffEdgeErr[i][iSt][1]);
1678 for (Int_t iSt = 0; iSt < 6; ++iSt) {
1679 stEff[iSt] = stEffEdge[1][iSt];
1680 stEffErr[iSt][0] = stEffEdge[1][iSt] - stEffEdge[0][iSt] + stEffEdgeErr[0][iSt][0];
1681 stEffErr[iSt][1] = stEffEdgeErr[1][iSt][1];
1685 chEff[0] = spectroEffEdge[1];
1686 chEffErr[0][0] = spectroEffEdge[1] - spectroEffEdge[0] + spectroEffEdgeErr[0][0];
1687 chEffErr[1][0] = spectroEffEdgeErr[1][1];
1691 effVsX[0]->SetPoint(ip,xp,chEff[0]);
1692 effVsX[0]->SetPointError(ip,0.,0.,chEffErr[0][0],chEffErr[1][0]);
1694 if (effVsSt[0])
for (Int_t iSt = 0; iSt < 6; ++iSt) {
1695 effVsSt[0]->SetPoint(iSt,iSt+1,stEff[iSt]);
1696 effVsSt[0]->SetPointError(iSt,0.,0.,stEffErr[iSt][0],stEffErr[iSt][1]);
1703 for (Int_t iCh = 1; iCh < 11; ++iCh) {
1704 cout <<
"Efficiency chamber " << iCh <<
" : ";
1705 cout << chEff[iCh] <<
" + " << chEffErr[1][iCh] <<
" - " << chEffErr[0][iCh] << endl;
1707 for (Int_t iSt = 0; iSt < 6; ++iSt) {
1708 if (iSt < 5) cout <<
"Station " << iSt+1 <<
" = ";
1709 else cout <<
"Station 45 = ";
1710 cout << stEff[iSt] <<
" + " << stEffErr[iSt][1] <<
" - " << stEffErr[iSt][0] << endl;
1712 cout <<
"Total tracking efficiency : ";
1713 cout << chEff[0] <<
" + " << chEffErr[1][0] <<
" - " << chEffErr[0][0] << endl << endl;
1721 TGraphAsymmErrors &effVsX, Int_t ip, Double_t xp)
1727 effVsX.SetPoint(ip,xp,-1.);
1728 effVsX.SetPointError(ip,0.,0.,0.,0.);
1733 Double_t rec[2] = {0., 0.};
1735 Double_t intEffErr[2] = {0., 0.};
1739 Int_t nRuns = effVsRunLow.GetN();
1740 for (Int_t iRun = 0; iRun < nRuns; ++iRun) {
1743 TString sRun = effVsRunLow.GetXaxis()->GetBinLabel(iRun+1);
1744 TParameter<Double_t> *weight =
static_cast<TParameter<Double_t>*
>(
runWeights->FindObject(sRun.Data()));
1746 printf(
"weight not found for run %s\n", sRun.Data());
1749 Double_t w = weight->GetVal();
1753 Double_t eff[2] = {effVsRunLow.GetY()[iRun], effVsRunUp.GetY()[iRun]};
1754 Double_t effErr[2] = {effVsRunLow.GetErrorYlow(iRun), effVsRunUp.GetErrorYhigh(iRun)};
1755 if (eff[0] < 0. || eff[1] < 0.) {
1756 printf(
"no efficiency measurement --> use 0(1) ± 0 as lower(upper) limit\n");
1765 for (Int_t i = 0; i < 2; ++i) {
1767 intEffErr[i] += w2*effErr[i]*effErr[i];
1773 if (gen > 0. && ok) {
1775 effVsX.SetPoint(ip,xp,rec[1]/gen);
1776 effVsX.SetPointError(ip,0.,0.,(rec[1]-rec[0]+TMath::Sqrt(intEffErr[0]))/gen,TMath::Sqrt(intEffErr[1])/gen);
1780 if (gen <= 0.) printf(
"impossible to integrate, all weights = 0 or unknown ?!?\n");
1781 else printf(
"efficiency never measured --> return -1 ± 0\n");
1783 effVsX.SetPoint(ip,xp,-1.);
1784 effVsX.SetPointError(ip,0.,0.,0.,0.);
1800 ifstream inFile(fileName.Data());
1801 if (!inFile.is_open()) {
1802 printf(
"cannot open file %s", fileName.Data());
1810 while (! inFile.eof() ) {
1812 line.ReadLine(inFile,kTRUE);
1813 if(line.IsNull())
continue;
1815 TObjArray *param = line.Tokenize(
" ");
1816 if (param->GetEntries() != 2) {
1817 printf(
"bad input line %s", line.Data());
1821 Int_t run = ((TObjString*)param->UncheckedAt(0))->String().Atoi();
1823 printf(
"invalid run number: %d", run);
1827 Float_t weight = ((TObjString*)param->UncheckedAt(1))->String().Atof();
1829 printf(
"invalid weight: %g", weight);
1833 runWeights->Add(
new TParameter<Double_t>(Form(
"%d",run), weight));
1850 printf(
"Wrong Pt range, ptMax must be higher than ptMin\n");
1854 if (charge < -1 || charge > 1) {
1855 printf(
"Selected charge must be 0, 1 or -1\n");
1863 Int_t lowBin = SparseData.GetAxis(1)->FindBin(
centMin);
1864 Int_t upBin = SparseData.GetAxis(1)->FindBin(
centMax);
1865 SparseData.GetAxis(1)->SetRange(lowBin, upBin);
1868 lowBin = SparseData.GetAxis(2)->FindBin(
ptMin);
1869 if (
ptMax == -1) { upBin = SparseData.GetAxis(2)->GetNbins()+1; }
1870 else { upBin = SparseData.GetAxis(2)->FindBin(
ptMax);}
1871 SparseData.GetAxis(2)->SetRange(lowBin, upBin);
1875 lowBin = SparseData.GetAxis(5)->FindBin(
charge);
1876 SparseData.GetAxis(5)->SetRange(lowBin, lowBin);
1887 TGraphAsymmErrors* g =
new TGraphAsymmErrors();
1891 g->SetName(Form(name,value));
1892 g->SetTitle(Form(title,value));
1908 void BeautifyGraph(TGraphAsymmErrors &g,
const char* xAxisName,
const char* yAxisName)
1914 g.SetMarkerStyle(20);
1915 g.SetMarkerSize(0.7);
1916 g.SetMarkerColor(2);
1918 g.GetXaxis()->SetTitle(xAxisName);
1919 g.GetXaxis()->CenterTitle(kTRUE);
1920 g.GetXaxis()->SetLabelFont(22);
1921 g.GetXaxis()->SetTitleFont(22);
1923 g.GetYaxis()->SetTitle(yAxisName);
1924 g.GetYaxis()->CenterTitle(kTRUE);
1925 g.GetYaxis()->SetLabelFont(22);
1926 g.GetYaxis()->SetTitleFont(22);
1936 for ( Int_t i = 0; i <= array.GetLast(); ++i)
1937 BeautifyGraph(*static_cast<TGraphAsymmErrors*>(array.UncheckedAt(i)), xAxisName, yAxisName);
1947 g.GetXaxis()->Set(irun+1, -0.5, irun+0.5);
1949 TIter nextRun(&runs);
1950 TObjString *srun = 0x0;
1952 while ((srun = static_cast<TObjString*>(nextRun()))) {
1953 g.GetXaxis()->SetBinLabel(iirun, srun->GetName());
1965 for (Int_t i = 0; i <= array.GetLast(); ++i)
1966 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 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)
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])
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)
void PlotMuonEfficiencyPerDE(TString fileNameData, TString fileNameSave, Bool_t saveEdges)
void PlotMuonEfficiencyPerDEVsRun(TString runList, TString fileNameData, TString fileNameSave)
void MuonTrackingEfficiency(TString runList="runList.txt", TString fileNameWeights="", TString fileNameData="AnalysisResults.root", TString fileNameSave="efficiency_new.root")
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)