19 #include <Riostream.h>
20 #include "TObjString.h"
21 #include "TObjArray.h"
28 #include "TDirectory.h"
34 #include "TGridResult.h"
35 #include "TGraphAsymmErrors.h"
45 #include "TFileMerger.h"
46 #include "TFitResultPtr.h"
49 #include "AliMergeableCollection.h"
50 #include "AliCounterCollection.h"
52 #include "AliAnalysisMuonUtility.h"
55 #include "AliCDBManager.h"
56 #include "AliCDBStorage.h"
58 #include "AliCDBEntry.h"
59 #include "AliMUONCDB.h"
60 #include "AliMUONTriggerEfficiencyCells.h"
109 return SetCondition(physSel, trigClassName, centrality, itrackSel, imatch, imethod, kFALSE);
117 if ( ! trigOut->GetMergeableCollection() ) {
118 AliError(Form(
"Cannot find %s in %s\n",outputName,filename));
122 TObjArray* condition =
static_cast<TObjArray*
>(
fConditions->At(0));
128 effHistoList->SetName(filename);
129 TString currRun = AliAnalysisMuonUtility::GetRunNumberAsString(filename);
130 effHistoList->SetUniqueID(currRun.Atoi());
150 if ( irpc == 0 || irpc == 9 ) {
151 Int_t arr[] = {26,27,28,29,48,49,50,51,68,69,84,85,100,101,113};
152 Int_t nBoards =
sizeof(arr)/
sizeof(arr[0]);
153 boards.Set(nBoards,arr);
155 for ( Int_t iboard=0; iboard<nBoards; iboard++ ) boards[iboard] += 117;
157 else if ( irpc == 1 || irpc == 8 ) {
158 Int_t arr[] = {9,10,11,30,31,32,33,52,53,54,55,70,71,86,87,102,103,114};
159 Int_t nBoards =
sizeof(arr)/
sizeof(arr[0]);
160 boards.Set(nBoards,arr);
162 for ( Int_t iboard=0; iboard<nBoards; iboard++ ) boards[iboard] += 117;
164 else if ( irpc == 2 || irpc == 7 ) {
165 Int_t arr[] = {12,13,34,35,56,57,72,73,88,89,104,105,115};
166 Int_t nBoards =
sizeof(arr)/
sizeof(arr[0]);
167 boards.Set(nBoards,arr);
169 for ( Int_t iboard=0; iboard<nBoards; iboard++ ) boards[iboard] += 117;
171 else if ( irpc == 3 || irpc == 6 ) {
172 Int_t arr[] = {14,15,36,37,58,59,74,75,90,91,106,107,116};
173 Int_t nBoards =
sizeof(arr)/
sizeof(arr[0]);
174 boards.Set(nBoards,arr);
176 for ( Int_t iboard=0; iboard<nBoards; iboard++ ) boards[iboard] += 117;
178 else if ( irpc == 4 || irpc == 5 ) {
179 Int_t arr[] = {16,38,60,76,92,108,117};
180 Int_t nBoards =
sizeof(arr)/
sizeof(arr[0]);
181 boards.Set(nBoards,arr);
183 for ( Int_t iboard=0; iboard<nBoards; iboard++ ) boards[iboard] += 117;
185 else if ( irpc == 17 || irpc == 10 ) {
186 Int_t arr[] = {6,7,8,22,23,24,25,44,45,46,47,66,67,82,83,98,99,112};
187 Int_t nBoards =
sizeof(arr)/
sizeof(arr[0]);
188 boards.Set(nBoards,arr);
190 for ( Int_t iboard=0; iboard<nBoards; iboard++ ) boards[iboard] += 117;
192 else if ( irpc == 16 || irpc == 11 ) {
193 Int_t arr[] = {4,5,20,21,42,43,64,65,80,81,96,97,111};
194 Int_t nBoards =
sizeof(arr)/
sizeof(arr[0]);
195 boards.Set(nBoards,arr);
197 for ( Int_t iboard=0; iboard<nBoards; iboard++ ) boards[iboard] += 117;
199 else if ( irpc == 15 || irpc == 12 ) {
200 Int_t arr[] = {2,3,18,19,40,41,62,63,78,79,94,95,110};
201 Int_t nBoards =
sizeof(arr)/
sizeof(arr[0]);
202 boards.Set(nBoards,arr);
204 for ( Int_t iboard=0; iboard<nBoards; iboard++ ) boards[iboard] += 117;
206 else if ( irpc == 14 || irpc == 13 ) {
207 Int_t arr[] = {1,17,39,61,77,93,109};
208 Int_t nBoards =
sizeof(arr)/
sizeof(arr[0]);
209 boards.Set(nBoards,arr);
211 for ( Int_t iboard=0; iboard<nBoards; iboard++ ) boards[iboard] += 117;
221 TString srcs(sources);
222 if ( srcs.Contains(
"raw://") ) {
223 AliError(
"The method assumes that the specified storage is a SpecificStorage. Hence, please replace raw:// with the actual path in alien, e.g.: alien://folder=/alice/data/<year>/OCDB");
226 TObjArray* sourceList = srcs.Tokenize(
",");
227 TObjArray effMapList;
228 effMapList.SetOwner();
230 TString trigEffCDBdir =
"MUON/Calib/TriggerEfficiency";
232 TIter next(sourceList);
233 TObjString* src = 0x0;
234 while ( (src = static_cast<TObjString*>(next())) ) {
235 TString currSrc = src->String();
236 if ( currSrc.BeginsWith(
"alien") && ! gGrid ) TGrid::Connect(
"alien://");
238 AliMUONTriggerEfficiencyCells* effMap = 0x0;
239 if ( currSrc.EndsWith(
".root") ) effMap =
new AliMUONTriggerEfficiencyCells(currSrc.Data());
241 TObjArray* dirRun = currSrc.Tokenize(
"?");
242 TString cdbPath = dirRun->UncheckedAt(0)->GetName();
243 TString runNum = ( dirRun->GetEntriesFast() > 1 ) ? dirRun->UncheckedAt(1)->GetName() :
"";
244 AliCDBManager* mgr = AliCDBManager::Instance();
245 if ( ! mgr->GetDefaultStorage() ) mgr->SetDefaultStorage(
"local://$ALICE_ROOT/OCDB");
246 mgr->SetSpecificStorage(trigEffCDBdir.Data(),cdbPath.Data());
248 if ( runNum.IsNull() ) {
249 cout <<
"Please enter run number: " << endl;
252 else runNumber = runNum.Atoi();
253 mgr->SetRun(runNumber);
254 AliCDBEntry* cdbEntry = mgr->Get(trigEffCDBdir.Data());
258 effMap =
static_cast<AliMUONTriggerEfficiencyCells*
>(cdbEntry->GetObject()->Clone());
260 if ( ! effMap )
continue;
261 effMapList.Add(effMap);
272 TString sTitles(titles);
273 TObjArray* titleList = sTitles.Tokenize(
",");
277 Int_t nLists = effMapList->GetEntriesFast();
279 TString sCanvasNameSuffix(canvasNameSuffix);
280 if ( ! sCanvasNameSuffix.IsNull() && ! sCanvasNameSuffix.BeginsWith(
"_") ) sCanvasNameSuffix.Prepend(
"_");
282 Double_t xpt, ypt, xref, yref;
283 enum {kEff, kDiff, kPull};
287 TString yTitle =
"Eff.";
288 if ( sOpt.Contains(
"diff") ) {
290 yTitle =
"Eff. - (ref.Eff)";
292 else if ( sOpt.Contains(
"pull") ) {
294 yTitle =
"(Eff - (ref.Eff)) / err";
298 Bool_t needsLegend = ( nLists > 1 );
301 Int_t colors[] = {kBlack, kRed, kSpring, kTeal, kBlue, kViolet, kMagenta, kOrange, kGray};
302 Int_t ncolors =
sizeof(colors)/
sizeof(colors[0]);
304 Int_t hTypes[2] = {AliMUONTriggerEfficiencyCells::kHboardCount,AliMUONTriggerEfficiencyCells::kHslatCount};
305 Int_t countTypes[3] = {AliMUONTriggerEfficiencyCells::kBendingEff,AliMUONTriggerEfficiencyCells::kNonBendingEff,AliMUONTriggerEfficiencyCells::kBothPlanesEff};
307 TString currName =
"";
309 for ( Int_t itype=0; itype<2; itype++ ) {
310 TString xTitle = ( hTypes[itype] == AliMUONTriggerEfficiencyCells::kHslatCount ) ?
"RPC" :
"Board";
311 for ( Int_t icount=0; icount<3; icount++ ) {
313 for ( Int_t ich=0; ich<4; ich++ ) {
317 TGraphAsymmErrors* refGraph = 0x0;
318 for ( Int_t ilist=0; ilist<nLists; ilist++ ) {
319 TString currTitle = titleList->At(ilist)->GetName();
320 AliMUONTriggerEfficiencyCells* effMap =
static_cast<AliMUONTriggerEfficiencyCells*
>(effMapList->UncheckedAt(ilist));
321 currName = effMap->GetHistoName(hTypes[itype],AliMUONTriggerEfficiencyCells::kAllTracks,ich);
322 TH1* histoDen =
static_cast<TH1*
>(effMap->GetHistoList()->FindObject(currName.Data()));
323 currName = effMap->GetHistoName(hTypes[itype],countTypes[icount],ich);
324 TH1* histoNum =
static_cast<TH1*
>(effMap->GetHistoList()->FindObject(currName.Data()));
325 TGraphAsymmErrors* graph =
new TGraphAsymmErrors(histoNum,histoDen,
"e0");
326 currName = histoNum->GetName();
327 currName.ReplaceAll(
"Count",
"Eff");
328 currName.Append(Form(
"_%s",currTitle.Data()));
329 graph->SetName(currName.Data());
331 if ( iopt != kEff ) {
333 for ( Int_t ipt=0; ipt<graph->GetN(); ipt++ ) {
334 refGraph->GetPoint(ipt,xref,yref);
335 graph->GetPoint(ipt,xpt,ypt);
336 Double_t diff = ypt - yref;
337 if ( TMath::Abs(diff) > 1.e-4 ) nDiffs++;
338 if ( iopt == kDiff ) graph->SetPoint(ipt,xpt,diff);
339 else if ( iopt == kPull ) {
340 Double_t err =
GetError(graph->GetErrorYlow(ipt),graph->GetErrorYhigh(ipt));
341 Double_t pull = ( err > 0. ) ? diff/err : 0.;
342 graph->SetPoint(ipt,xpt,pull);
353 currName = graph->GetName();
354 currName.Remove(currName.Length()-currTitle.Length()-5);
355 currName += sCanvasNameSuffix;
356 can =
new TCanvas(currName.Data(),currName.Data(),20*ican,20*ican,600,600);
360 if ( needsLegend && ! leg ) {
361 leg =
new TLegend(0.35, 0.15, 0.65, 0.45);
362 if ( refGraph ) leg->SetHeader(Form(
"Ref.: %s",titleList->At(0)->GetName()));
366 Int_t icolor = ( ilist < ncolors ) ? colors[ilist] : 20+ilist;
367 graph->SetLineColor(icolor);
368 graph->SetMarkerColor(icolor);
369 graph->SetMarkerStyle(20+ilist);
370 graph->SetMarkerSize(0.5);
371 graph->GetXaxis()->SetTitle(xTitle.Data());
372 graph->GetYaxis()->SetTitle(yTitle.Data());
373 graph->Draw((gPad->GetListOfPrimitives()->GetEntries()==0)?
"ap":
"p");
374 if ( leg ) leg->AddEntry(graph,titleList->At(ilist)->GetName(),
"lp");
376 if (leg ) leg->Draw();
392 AliWarning(
"No condition found! Please specify the default efficiency condition with SetEffConditions and then add additional tests with AddSystematicCondition");
400 TObjArray condTitle(nConditions);
401 condTitle.SetOwner();
405 TObjArray effMapList;
406 effMapList.SetOwner();
408 for ( Int_t icond=0; icond<nConditions; icond++ ) {
409 TObjArray* condition =
static_cast<TObjArray*
>(
fConditions->UncheckedAt(icond));
412 AliMUONTriggerEfficiencyCells* effMap =
new AliMUONTriggerEfficiencyCells(effList);
413 effMapList.Add(effMap);
414 titles += Form(
"%s,",condTitle.At(icond)->GetName());
417 titles.Remove(TString::kTrailing,
',');
427 TObjArray* condition =
static_cast<TObjArray*
>(
fConditions->At(0));
430 TObjArray effMapList;
431 effMapList.SetOwner();
435 while ( (trigOut = static_cast<AliTrigChEffOutput*>(next())) ) {
437 AliMUONTriggerEfficiencyCells* effMap =
new AliMUONTriggerEfficiencyCells(effList);
438 effMapList.Add(effMap);
439 titles += Form(
"%s,",trigOut->GetName());
441 titles.Remove(TString::kTrailing,
',');
488 TDirectory *savdir = gDirectory;
489 TDirectory *adir = savdir->mkdir(source->GetName());
493 TIter nextkey(source->GetListOfKeys());
494 while ((key = (TKey*)nextkey())) {
495 const char *classname = key->GetClassName();
496 TClass *cl = gROOT->GetClass(classname);
498 if (cl->InheritsFrom(TDirectory::Class())) {
499 source->cd(key->GetName());
500 TDirectory *subdir = gDirectory;
504 }
else if (cl->InheritsFrom(TTree::Class())) {
505 TTree *T = (TTree*)source->Get(key->GetName());
507 TTree *newT = T->CloneTree(-1,
"fast");
511 TObject *obj = key->ReadObj();
513 obj->Write(obj->GetName(),TObject::kSingleKey);
517 adir->SaveSelf(kTRUE);
523 Bool_t
AliMTRChEffAnalysis::CopyLocally (
const char* runList,
const char* path,
const char* pattern,
const char* localFileList,
const char* outDir,
const char* directory )
const
526 TString sPattern(pattern);
527 TString sOutDir(outDir);
529 Bool_t isGrid = (! sPattern.IsNull());
531 if ( sOutDir.IsNull() ) {
533 TString data = sPath(TRegexp(
"/data/"));
534 TString year = sPath(TRegexp(
"/20[0-9][0-9]/"));
535 TString period = sPath(TRegexp(
"/LHC[0-9][0-9][a-z]"));
538 TString pass = AliAnalysisMuonUtility::GetPassName(path);
539 if ( pass.IsNull() ) pass = AliAnalysisMuonUtility::GetPassName(pattern);
540 sOutDir = data+year+period+pass;
541 sOutDir.ReplaceAll(
"//",
"/");
542 sOutDir.Remove(TString::kTrailing,
'/');
543 sOutDir.Remove(TString::kLeading,
'/');
545 else sOutDir = sPath;
546 sOutDir.Remove(TString::kTrailing,
'/');
547 sOutDir.Remove(TString::kLeading,
'/');
550 TGridResult* res = 0x0;
552 if ( ! gGrid ) TGrid::Connect(
"alien://");
553 res = gGrid->Query(path,pattern);
558 ofstream outFile(localFileList);
559 Bool_t allOk = kTRUE;
560 Bool_t prompt = kTRUE;
561 Bool_t overwrite = kFALSE;
562 for ( Int_t irun=0; irun<rl->GetEntries(); irun++ ) {
563 TString run =
static_cast<TObjString*
>(rl->At(irun))->String();
564 TString dest = Form(
"%s/%09i/QAresults.root",sOutDir.Data(),run.Atoi());
565 TString destDir =
gSystem->DirName(dest.Data());
566 if (
gSystem->AccessPathName(destDir.Data()) )
ExecCommand(Form(
"mkdir -p %s",destDir.Data()),kFALSE);
567 Bool_t copyFile = kTRUE;
568 Bool_t isFileOk = kTRUE;
569 if (
gSystem->AccessPathName(dest) == 0 ) {
571 TString decision =
"";
572 cout <<
"Local file " << dest.Data() <<
" already exist: overwrite? [y/n/ya/na (a=use decision for all)]" << endl;
574 if ( decision.EndsWith(
"a") ) prompt = kFALSE;
575 if ( decision.BeginsWith(
"y") ) overwrite = kTRUE;
576 else overwrite = kFALSE;
578 copyFile = overwrite;
583 for ( Int_t ifile=0; ifile<res->GetEntries(); ifile++ ) {
584 TString inFilename = res->GetKey(ifile,
"turl");
585 if ( inFilename.Contains(run.Data()) ) {
590 if ( src.IsNull() ) {
591 AliWarning(Form(
"Cannot find output for run %s",run.Data()));
595 TFile* outFile = TFile::Open(dest,
"RECREATE");
596 TFile* inFile = TFile::Open(src);
598 TDirectory* dir =
static_cast<TDirectory*
>(inFile->Get(directory));
603 else isFileOk = kFALSE;
609 src = Form(
"http://aliqamu.web.cern.ch/aliqamu/%s",dest.Data());
610 isFileOk = TFile::Cp(src.Data(),dest.Data());
614 if ( isFileOk ) outFile <<
gSystem->pwd() <<
"/" << dest.Data() << endl;
626 TString baseNames[3] = {
"Chamber",
"RPC",
"Board"};
627 TString base = baseNames[itype] +
"Eff";
630 AliWarning(
"Please specify RPC");
633 base += Form(
"InRPC%i",irpc);
653 for ( Int_t ich=0; ich<nCh; ich++ ) {
654 TString canName = base;
656 TCanvas* can =
new TCanvas(canName.Data(),canName.Data(),25*ich,25*ich,width,height);
657 can->Divide(nColumns,nRows,0,0);
660 for ( Int_t idetelem=0; idetelem<nDetEl; idetelem++ ) {
664 Int_t detElemId = idetelem;
668 TString
title = Form(
"%s %i",baseNames[itype].
Data(),detElemId);
669 TLegend* leg =
new TLegend(0.2,0.15,0.8,0.4);
670 leg->SetHeader(title.Data());
671 for ( Int_t icount=0; icount<2; icount++ ) {
672 TGraphAsymmErrors* gr =
GetTrendEff(itype, icount, ich, detElemId);
673 gr->SetLineColor(icount+1);
674 gr->SetMarkerColor(icount+1);
675 gr->SetMarkerStyle(24+2*icount);
676 gr->GetYaxis()->SetRangeUser(minEff,maxEff);
680 gr->Draw(icount==0?
"ap":
"p");
681 TString legTitle = ( icount==0 ) ?
"bending plane" :
"non-bending plane";
682 leg->AddEntry(gr,legTitle.Data(),
"lp");
683 if ( maxNsigmaOutliers > 0. ) {
684 TGraphAsymmErrors* outliers =
GetOutliers(gr,maxNsigmaOutliers);
685 outliers->SetLineColor(6+icount);
686 outliers->SetMarkerColor(6+icount);
687 outliers->SetMarkerStyle(20+2*icount);
688 outliers->SetLineWidth(2);
690 legTitle.ReplaceAll(
"plane",
"outliers");
691 leg->AddEntry(outliers,legTitle.Data(),
"lp");
705 AliWarning(
"This function is valid only for itype 1 and 2");
709 TString baseNames[3] = {
"Chamber",
"RPC",
"Board"};
710 TString base = baseNames[itype] +
"Stat";
713 AliWarning(
"Please specify RPC");
716 base += Form(
"InRPC%i",irpc);
729 for ( Int_t ich=0; ich<nCh; ich++ ) {
731 TH1* sumHistos = 0x0;
732 for ( Int_t idetelem=0; idetelem<nDetEl; idetelem++ ) {
733 Int_t detElemId = idetelem;
736 histos[idetelem]->SetName(Form(
"%s_stat",histos[idetelem]->GetName()));
737 histos[idetelem]->SetStats(0);
738 if ( sumHistos ) sumHistos->Add(histos[idetelem]);
739 else sumHistos =
static_cast<TH1*
>(histos[idetelem]->Clone(
"sumHistos"));
742 TString canName = base;
743 TCanvas* can =
new TCanvas(canName.Data(),canName.Data(),25*ich,25*ich,width,height);
744 can->Divide(nColumns,nRows,0,0);
745 for ( Int_t idetelem=0; idetelem<nDetEl; idetelem++ ) {
749 Int_t detElemId = idetelem;
751 TString
title = Form(
"%s %i",baseNames[itype].
Data(),detElemId);
752 TLegend* leg =
new TLegend(0.2,0.65,0.8,0.9);
753 leg->SetHeader(title.Data());
754 TGraphAsymmErrors* gr =
new TGraphAsymmErrors(histos[idetelem],sumHistos,
"e0");
755 gr->SetHistogram(static_cast<TH1F*>(histos[idetelem]));
757 gr->SetMarkerStyle(24);
758 gr->SetMarkerSize(0.5);
759 gr->GetYaxis()->SetRangeUser(minY,maxY);
760 gr->GetYaxis()->SetTitle(Form(
"Tracks in %s / Sum of tracks of %ss in %s",baseNames[itype].
Data(),baseNames[itype].
Data(),baseNames[itype-1].
Data()));
763 TString legTitle =
"stat";
765 if ( maxNsigmaOutliers > 0. ) {
766 TGraphAsymmErrors* outliers =
GetOutliers(gr,maxNsigmaOutliers);
767 outliers->SetLineColor(6);
768 outliers->SetMarkerColor(6);
769 outliers->SetMarkerStyle(20);
770 outliers->SetLineWidth(2);
772 legTitle =
"outliers";
773 leg->AddEntry(outliers,legTitle.Data(),
"lp");
788 Int_t colors[] = {kBlack, kRed, kSpring, kTeal, kBlue, kViolet, kMagenta, kOrange, kGray};
789 Int_t ncolors =
sizeof(colors)/
sizeof(colors[0]);
791 Int_t itype = ( perRPC ) ? AliMUONTriggerEfficiencyCells::kHslatCount : AliMUONTriggerEfficiencyCells::kHboardCount;
792 Int_t countTypes[2] = {AliMUONTriggerEfficiencyCells::kBendingEff,AliMUONTriggerEfficiencyCells::kNonBendingEff};
796 TObjArray condTitle(nConditions);
797 condTitle.SetOwner();
799 Double_t xpt, ypt, xref, yref;
800 TArrayD eff(4), effErr(4);
805 while ( (trigOut = static_cast<AliTrigChEffOutput*>(next())) ) {
811 TArrayI isEmpty(nConditions);
815 TObjArray effGraphs[8];
816 for ( Int_t iplane=0; iplane<8; iplane++ ) {
817 effGraphs[iplane].SetOwner();
820 TObjArray effMapList;
821 effMapList.SetOwner();
822 for ( Int_t icond=0; icond<nConditions; icond++ ) {
823 TObjArray* condition =
static_cast<TObjArray*
>(
fConditions->UncheckedAt(icond));
826 AliMUONTriggerEfficiencyCells* effMap =
new AliMUONTriggerEfficiencyCells(effList);
827 effMapList.Add(effMap);
828 titles += Form(
"%s,",condTitle.At(icond)->GetName());
830 for ( Int_t ich=0; ich<4; ich++ ) {
831 TString currName = effMap->GetHistoName(itype,AliMUONTriggerEfficiencyCells::kAllTracks,ich);
832 TH1* histoDen =
static_cast<TH1*
>(effMap->GetHistoList()->FindObject(currName.Data()));
833 for ( Int_t icount=0; icount<2; icount++ ) {
834 Int_t iplane = 4*icount+ich;
836 if ( histoDen->GetEntries() > 0 ) {
837 currName = effMap->GetHistoName(itype,countTypes[icount],ich);
838 TH1* histoNum =
static_cast<TH1*
>(effMap->GetHistoList()->FindObject(currName.Data()));
839 TGraphAsymmErrors* gr =
new TGraphAsymmErrors(histoNum,histoDen,
"e0");
841 effGraphs[iplane].AddAtAndExpand(gr,icond);
845 AliWarning(Form(
"No entries in count %i and ch %i for %s\n",icount,ich,condTitle.At(icond)->GetName()));
851 titles.Remove(TString::kTrailing,
',');
855 TString canName = Form(
"EffSyst_%s",trigOut->GetName());
856 Int_t pos = 25*(imerged+1);
857 TCanvas* can =
new TCanvas(canName.Data(),canName.Data(),pos,pos,1200,800);
858 can->Divide(4,2,0,0);
860 for ( Int_t icount=0; icount<2; icount++ ) {
861 for ( Int_t ich=0; ich<4; ich++ ) {
862 Int_t iplane = 4*icount+ich;
866 TLegend* leg =
new TLegend(0.15,0.7,0.9,0.9);
867 leg->SetHeader(trigOut->
GetHistoName(-1,icount,ich,-1,-1,-1));
869 for ( Int_t icond=1; icond<nConditions; icond++ ) {
870 if ( isEmpty[icond] == 1 )
continue;
871 TH1* histo =
new TH1D(Form(
"syst_%s_%s_plane%i_ch%i",trigOut->GetName(),condTitle[icond]->GetName(),icount,11+ich),
"",200,-0.1,0.1);
872 histo->GetXaxis()->SetTitle(
"Eff.-(ref.Eff.)");
873 histo->GetYaxis()->SetTitle(
"1/#sigma^{2}");
875 TGraphAsymmErrors* gr =
static_cast<TGraphAsymmErrors*
>(effGraphs[iplane].UncheckedAt(icond));
876 TGraphAsymmErrors* grRef =
static_cast<TGraphAsymmErrors*
>(effGraphs[iplane].UncheckedAt(0));
877 for ( Int_t ipt=0; ipt<gr->GetN(); ipt++ ) {
878 gr->GetPoint(ipt,xpt,ypt);
879 Double_t err =
GetError(gr->GetErrorYlow(ipt),gr->GetErrorYhigh(ipt));
880 Double_t invErr2 = ( err > 0. ) ? 1./(err*err) : 0.;
881 grRef->GetPoint(ipt,xref,yref);
883 Double_t diff = ypt-yref;
884 histo->Fill(diff,invErr2);
888 sumHisto =
static_cast<TH1*
>(histo->Clone(Form(
"syst_%s_plane%i_ch%i",trigOut->GetName(),icount,11+ich)));
889 sumHisto->SetLineColor(1);
891 leg->AddEntry(sumHisto,
"All systematics",
"l");
893 else sumHisto->Add(histo);
894 Int_t icolor = ( icond < ncolors ) ? colors[icond] : 20+icond;
895 histo->SetLineColor(icolor);
897 leg->AddEntry(histo,condTitle[icond]->GetName(),
"l");
904 canName = Form(
"TriggerEff_3outOf4_syst_%s",trigOut->GetName());
906 TCanvas* canSyst =
new TCanvas(canName.Data(),canName.Data(),pos,pos,600,600);
908 TLegend* leg =
new TLegend(0.15,0.7,0.9,0.4);
910 TH1* histo[nConditions];
911 for ( Int_t icond=0; icond<nConditions; icond++ ) {
912 if ( isEmpty[icond] == 1 )
continue;
913 histo[icond] =
new TH1D(Form(
"TriggerEff_syst_%s_%s",condTitle[icond]->GetName(),trigOut->GetName()),
"Dispersion of trigger probability (3/4)",200,-0.1,0.1);
914 histo[icond]->GetXaxis()->SetTitle(
"Trig. prob. - (ref. trig. prob)");
915 histo[icond]->GetYaxis()->SetTitle(
"1/#sigma^{2}");
918 for ( Int_t ipt=0; ipt<
nDE; ipt++ ) {
919 Double_t refTrigProb = 0.;
920 for ( Int_t icond=0; icond<nConditions; icond++ ) {
921 if ( isEmpty[icond] == 1 )
continue;
922 Double_t trigProb = 1., trigProbErr2 = 0.;
923 for ( Int_t icount=0; icount<2; icount++ ) {
924 for ( Int_t ich=0; ich<4; ich++ ) {
925 Int_t iplane = 4*icount+ich;
926 TGraphAsymmErrors* gr =
static_cast<TGraphAsymmErrors*
>(effGraphs[iplane].UncheckedAt(icond));
927 gr->GetPoint(ipt,xpt,ypt);
929 effErr[ich] =
GetError(gr->GetErrorYlow(ipt),gr->GetErrorYhigh(ipt));
931 Double_t effErr34 = 0.;
934 trigProbErr2 += effErr34*effErr34;
938 refTrigProb = trigProb;
942 Double_t invErr2 = ( trigProbErr2>0. ) ? 1./trigProbErr2 : 0.;
943 histo[icond]->Fill(trigProb-refTrigProb,invErr2);
948 for ( Int_t icond=0; icond<nConditions; icond++ ) {
949 if ( isEmpty[icond] == 1 )
continue;
950 TString
title = ( icond == 0 ) ?
"All systematics" : condTitle[icond]->GetName();
951 Int_t icolor = ( icond < ncolors ) ? colors[icond] : 20+icond;
952 histo[icond]->SetLineColor(icolor);
953 histo[icond]->Draw((icond == 0)?
"":
"same");
954 leg->AddEntry(histo[icond],title.Data(),
"l");
955 if ( icond>0 ) histo[0]->Add(histo[icond]);
966 TString decision =
"y";
968 if ( gROOT->IsBatch() ) prompt = kFALSE;
971 cout << command.Data() <<
" ? [y/n]" << endl;
976 if ( decision ==
"y" ) {
977 cout <<
"Executing: " << command.Data() << endl;
996 Double_t val = par[1];
997 Int_t nChanges = par[0];
998 Double_t matchDiff = 123456789.;
999 Int_t matchChange = -1;
1000 for ( Int_t iknot=0; iknot<nChanges; iknot++ ) {
1001 Int_t iparChange = 2*(iknot+1);
1002 Double_t diff = xx - par[iparChange];
1003 if ( diff >= 0. && diff < matchDiff ) {
1005 matchChange = iparChange;
1008 if ( matchChange >= 0 ) val = par[matchChange+1];
1016 TH1* statHisto = 0x0;
1018 UInt_t uFirstRun = (UInt_t)firstRun;
1019 UInt_t uLastRun = (UInt_t)lastRun;
1022 TList* effHistoList = 0x0;
1023 while ( (effHistoList = static_cast<TList*>(next()) ) ) {
1024 UInt_t run = effHistoList->GetUniqueID();
1025 if ( run < uFirstRun || run > uLastRun )
continue;
1028 if ( statHisto ) statHisto->Add(histo);
1029 else statHisto =
static_cast<TH1*
>(histo->Clone(
"tmpStatHisto"));
1032 if ( ! statHisto )
return 0.;
1034 Double_t statPerDE = 0.;
1037 Int_t excludeBoardsHalf[] = {1, 17, 39, 61, 77, 93,109,
1038 16, 38, 60, 76, 92, 108, 117,
1039 110, 111, 112, 113, 114, 115, 116};
1040 Int_t nExcludedHalf =
sizeof(excludeBoardsHalf)/
sizeof(excludeBoardsHalf[0]);
1041 for ( Int_t ibin=1; ibin<=statHisto->GetNbinsX(); ibin++ ) {
1042 Bool_t skip = kFALSE;
1043 for ( Int_t iexcl=0; iexcl<nExcludedHalf; iexcl++ ) {
1044 if ( ibin == excludeBoardsHalf[iexcl] || ibin == excludeBoardsHalf[iexcl]+117 ) {
1049 if ( skip )
continue;
1050 statPerDE += statHisto->GetBinContent(ibin);
1055 statPerDE = statHisto->Integral();
1056 nDe = (Double_t)statHisto->GetNbinsX();
1058 statPerDE = nDe > 0. ? statPerDE/nDe : -1.;
1068 Int_t itrackSel =
static_cast<TObjString*
>(condition->At(3))->String().Atoi();
1069 Int_t imatch =
static_cast<TObjString*
>(condition->At(4))->String().Atoi();
1070 Int_t imethod =
static_cast<TObjString*
>(condition->At(5))->String().Atoi();
1072 return trigOut->
GetEffHistoList(condition->At(0)->GetName(),condition->At(1)->GetName(),condition->At(2)->GetName(),itrackSel,imatch,imethod);
1079 return TMath::Max(errLow,errHigh);
1087 return static_cast<TH1*
>(effHistoList->At(ihisto));
1095 Int_t nRuns =
fOutputs->GetEntriesFast();
1097 TH1F* hRunChangeCount =
new TH1F(
"runChangeCount",
"Number of RPCs changing efficiency per run",nRuns,-0.5,-0.5+(Double_t)nRuns);
1098 hRunChangeCount->SetXTitle(
"Run num.");
1099 hRunChangeCount->SetYTitle(
"Num. of RPCs with change in eff.");
1100 for ( Int_t irun=0; irun<nRuns; irun++ ) {
1101 hRunChangeCount->GetXaxis()->SetBinLabel(irun+1,Form(
"%i",
GetRunNumber(irun)));
1106 Int_t nCanvas = perRPC ? 4 : 18;
1107 TObjArray canList(nCanvas);
1109 for ( Int_t irpc=0; irpc<18; irpc++ ) {
1112 Int_t firstDetEl = perRPC ? irpc : 0;
1113 Int_t lastDetEl = perRPC ? irpc : boards.GetSize()-1;
1115 for ( Int_t ich=0; ich<4; ich++ ) {
1116 Int_t ican = perRPC ? ich : irpc;
1117 TCanvas* can =
static_cast<TCanvas*
>(canList.At(ican));
1119 TString canName = perRPC ? Form(
"testRanges_ch%i",11+ich) : Form(
"testRanges_RPC%i",irpc);
1120 can =
new TCanvas(canName.Data(),canName.Data(),10*ich,10*ich,1200,800);
1121 can->Divide(6,3,0,0);
1122 can->SetMargin(0.,0.,0.,0.);
1123 canList.AddAt(can,ican);
1126 for ( Int_t idetel=firstDetEl; idetel<=lastDetEl; idetel++ ) {
1127 Int_t currDE = ( perRPC ) ? idetel : boards[idetel];
1129 TGraphAsymmErrors* trendGraph =
GetTrendEff(itype,icount,ich,currDE);
1130 TArrayI range =
GetHomogeneousRanges(trendGraph,chi2Cut,maxNRanges,minEffVariation,forcedChanges, kTRUE);
1131 trendGraph->GetYaxis()->SetRangeUser(minEff,maxEff);
1134 gPad->SetTicks(1,1);
1135 gPad->SetMargin(0.08,0.,0.08,0.);
1136 TString drawOpt = ( gPad->GetListOfPrimitives()->GetEntries() == 0 ) ?
"ap" :
"p";
1138 TString legendName = Form(
"%s_%i",can->GetName(),currDE);
1139 TLegend* leg =
static_cast<TLegend*
>(gPad->GetListOfPrimitives()->FindObject(legendName.Data()));
1141 leg =
new TLegend(0.2,0.15,0.8,0.4);
1142 leg->SetHeader(Form(
"%s %i",perRPC?
"RPC":
"Board",currDE));
1143 leg->SetName(legendName.Data());
1147 Int_t icolor = ich+1;
1148 trendGraph->SetLineColor(icolor);
1149 trendGraph->SetMarkerColor(icolor);
1150 trendGraph->SetMarkerStyle(24+ich);
1151 TF1* func =
static_cast<TF1*
>(trendGraph->GetListOfFunctions()->At(0));
1153 func->SetLineWidth(2);
1154 func->SetLineColor(icolor);
1157 trendGraph->GetXaxis()->SetLabelSize(0.07);
1158 trendGraph->SetTitle(
"");
1160 trendGraph->Draw(drawOpt.Data());
1161 leg->AddEntry(trendGraph,Form(
"Chamber %i",11+ich),
"lp");
1163 for ( Int_t ichange=2; ichange<range.GetSize(); ichange++ ) {
1165 if ( ichange%2 == 1 )
continue;
1166 Int_t runIdx = range[ichange];
1168 TLine* line =
new TLine(runIdx,minEff,runIdx,maxEff);
1169 line->SetLineStyle(2);
1172 text.DrawLatex((Double_t)(runIdx-3),maxEff-0.1*(maxEff-minEff)*(Double_t)(ichange/2),Form(
"%i",
GetRunNumber(runIdx)));
1174 hRunChangeCount->Fill(runIdx);
1175 if ( hRunChangeCount->GetBinContent(runIdx+1) == 1 ) {
1176 TString infoMsg = Form(
"Efficiency change in %i triggered by ch %i RPC %i",
GetRunNumber(runIdx),11+ich,irpc);
1177 if ( ! perRPC ) infoMsg += Form(
" Board %i",currDE);
1178 AliInfo(infoMsg.Data());
1187 TArrayI runChangeClust(nRuns);
1188 Double_t sumWgtRun = 0.;
1189 Double_t sumWgt = 0;
1190 for ( Int_t irun=0; irun<=nRuns; irun++ ) {
1191 if ( irun == nRuns || hRunChangeCount->GetBinContent(irun+1) == 0 ) {
1192 if ( sumWgt > 0. ) {
1193 Int_t averageRun = TMath::Nint(sumWgtRun / sumWgt);
1194 AliDebug(2,Form(
"Average run: %i => %i\n",averageRun,
GetRunNumber(averageRun)));
1195 runChangeClust[averageRun]++;
1200 if ( irun == nRuns )
break;
1202 AliDebug(2,Form(
"irun %i => %i: wgt %g",irun,
GetRunNumber(irun),hRunChangeCount->GetBinContent(irun+1)));
1205 Double_t wgt = hRunChangeCount->GetBinContent(irun+1);
1206 if ( forcedChanges ) {
1207 for ( Int_t ichange=0; ichange<forcedChanges->GetSize(); ichange++ ) {
1208 if (
GetRunNumber(irun) == forcedChanges->At(ichange) ) wgt *= 10.;
1211 sumWgtRun += wgt*(Double_t)irun;
1215 TCanvas* summaryCan =
new TCanvas(
"effChangeSummary",
"effChangeSummary",50,50,600,600);
1216 summaryCan->SetLogy();
1217 hRunChangeCount->GetXaxis()->LabelsOption(
"v");
1218 hRunChangeCount->Draw();
1221 TArrayI runRanges(nRuns);
1223 for ( Int_t irun=1; irun<nRuns; irun++ ) {
1224 if ( runChangeClust[irun] > 0 ) {
1230 runRanges.Set(ientry);
1241 TArrayD forcedChangesBin;
1243 if ( forcedChanges ) {
1244 forcedChangesBin.Set(forcedChanges->GetSize());
1245 for ( Int_t ichange=0; ichange<forcedChanges->GetSize(); ichange++ ) {
1247 if ( idx >= 0 ) forcedChangesBin[nForced++] = (Double_t)idx;
1248 else AliWarning(Form(
"Cannot find run %i\n",forcedChanges->At(ichange)));
1252 Double_t minNormChi2 = 123456789.;
1253 Int_t minNormChi2Step = -1;
1254 TString fitOpt =
"NQ0";
1259 for ( Int_t istep=0; istep<maxNRanges; istep++ ) {
1260 Int_t nPars = 2*(istep+1);
1261 Double_t xMin = trendGraph->GetXaxis()->GetXmin();
1262 Double_t xMax = trendGraph->GetXaxis()->GetXmax();
1264 func->FixParameter(0,istep);
1265 for ( Int_t ipar=1; ipar<nPars; ipar++ ) {
1272 Double_t val = ( ipar%2 == 1 ) ? 0.95 : (xMax-xMin) * (Double_t)(ipar/2)/((Double_t)(istep+1));
1273 func->SetParameter(ipar,val);
1274 if ( ipar%2 == 0 ) func->SetParLimits(ipar,xMin,xMax);
1277 TFitResultPtr fitResult = trendGraph->Fit(func,fitOpt.Data());
1280 if ( forcedChanges ) {
1281 Bool_t hasFixedPars = kFALSE;
1282 for ( Int_t iforced=0; iforced<nForced; iforced++ ) {
1283 for ( Int_t jstep=0; jstep<istep; jstep++ ) {
1284 Int_t ipar = 2*(jstep+1);
1285 if ( TMath::Abs(forcedChangesBin[iforced]-func->GetParameter(ipar)) > 2. )
continue;
1286 func->FixParameter(ipar,forcedChangesBin[iforced]);
1287 hasFixedPars = kTRUE;
1290 if ( hasFixedPars ) fitResult = trendGraph->Fit(func,fitOpt.Data());
1297 Double_t normChi2 = func->GetChisquare() / ((Double_t)func->GetNDF());
1298 if ( normChi2 < minNormChi2 ) {
1299 minNormChi2 = normChi2;
1300 minNormChi2Step = istep;
1303 if ( normChi2 < chi2Cut )
break;
1309 trendGraph->GetListOfFunctions()->Add(func->Clone());
1310 Int_t nSteps = (Int_t)func->GetParameter(0);
1315 Int_t nPoints = nSteps+1;
1316 TArrayD parRunIdx(nPoints);
1317 TArrayD parEff(nPoints);
1318 for ( Int_t ipar=0; ipar<func->GetNpar(); ipar++ ) {
1319 Int_t istep = ipar/2;
1320 if ( ipar%2 == 0 ) parRunIdx[istep] = func->GetParameter(ipar);
1321 else parEff[istep] = func->GetParameter(ipar);
1324 TArrayI sortIdx(nPoints);
1325 TMath::Sort(nPoints,parRunIdx.GetArray(),sortIdx.GetArray(),kFALSE);
1327 runRanges.Set(2*nPoints);
1330 for ( Int_t ipoint=1; ipoint<nPoints; ipoint++ ) {
1331 Double_t deltaEff = TMath::Abs(parEff[sortIdx[ipoint]]-parEff[sortIdx[ipoint-1]]);
1333 if ( deltaEff < minEffVariation ) {
1334 AliWarning(Form(
"Efficiency variation for %s is %g => consider uniform",trendGraph->GetName(),deltaEff));
1337 Int_t runChangeIdx = TMath::Nint(parRunIdx[sortIdx[ipoint]]);
1338 AliDebug(1,Form(
"Change run: %s => %g => %i %i",trendGraph->GetName(),parRunIdx[sortIdx[ipoint]],runChangeIdx,
GetRunNumber(runChangeIdx)));
1339 runRanges[irun++] = returnIndex ? runChangeIdx-1 :
GetRunNumber(runChangeIdx-1);
1340 runRanges[irun++] = returnIndex ? runChangeIdx :
GetRunNumber(runChangeIdx);
1342 Int_t lastPt = trendGraph->GetN()-1;
1343 runRanges[irun++] = returnIndex ? lastPt :
GetRunNumber(lastPt);
1344 runRanges.Set(irun);
1347 AliWarning(Form(
"Fit did not converge for %s (minimum chi2 %g for step %i)",trendGraph->GetName(),minNormChi2,minNormChi2Step));
1362 TString identifier = Form(
"/%s/%s/%s/",condition->At(0)->GetName(),condition->At(1)->GetName(),condition->At(2)->GetName());
1363 Int_t itrackSel =
static_cast<TObjString*
>(condition->At(3))->String().Atoi();
1364 Int_t imatch =
static_cast<TObjString*
>(condition->At(4))->String().Atoi();
1365 Int_t imethod =
static_cast<TObjString*
>(condition->At(5))->String().Atoi();
1366 TString objName = trigOut->
GetHistoName(itype, icount, ichamber, itrackSel, imatch, imethod);
1367 identifier += objName;
1375 for ( Int_t ipt=0; ipt<
fOutputs->GetEntriesFast(); ipt++ ) {
1376 UInt_t run =
fOutputs->UncheckedAt(ipt)->GetUniqueID();
1377 if ( run == runNumber )
return ipt;
1387 TGraphAsymmErrors* outliers =
new TGraphAsymmErrors(*graph);
1388 outliers->SetHistogram(static_cast<TH1F*>(graph->GetHistogram()->Clone(Form(
"%s_outliers",graph->GetHistogram()->GetName()))));
1390 if ( graph->GetListOfFunctions()->GetEntries() == 0 ) graph->Fit(
"pol0",
"Q0");
1391 TF1* func =
static_cast<TF1*
>(graph->GetListOfFunctions()->At(0));
1395 for ( Int_t ipt=0; ipt<graph->GetN(); ipt++ ) {
1396 graph->GetPoint(ipt,xpt,ypt);
1397 Double_t diff = ypt - func->Eval(xpt);
1398 Double_t err = ( diff > 0. ) ? graph->GetErrorYlow(ipt) : graph->GetErrorYhigh(ipt);
1399 if ( err < 0. || TMath::Abs(diff)/err > maxNsigmas )
continue;
1400 outliers->RemovePoint(ipt-nremoved);
1411 if ( ipt < 0 || ipt >=
fOutputs->GetEntriesFast() )
return -1;
1412 return fOutputs->UncheckedAt(ipt)->GetUniqueID();
1419 TList* rl =
new TList;
1421 TString sRunList =
gSystem->ExpandPathName(runList);
1422 if (
gSystem->AccessPathName(sRunList) || sRunList.EndsWith(
".root") ) {
1423 sRunList.ReplaceAll(
",",
" ");
1424 if ( sRunList.IsDigit() ) {
1425 TObjArray* arr = sRunList.Tokenize(
" ");
1426 for ( Int_t iarr=0; iarr<arr->GetEntries(); iarr++ ) {
1427 rl->Add(
new TObjString(arr->At(iarr)->GetName()));
1433 ifstream inFile(sRunList.Data());
1434 TString currLine =
"";
1435 while ( ! inFile.eof() ) {
1436 currLine.ReadLine(inFile);
1437 TString currRun = AliAnalysisMuonUtility::GetRunNumberAsString(currLine);
1438 if ( ! currRun.IsNull() ) rl->Add(
new TObjString(currRun));
1451 Int_t nConditions =
fConditions->GetEntriesFast();
1452 TObjArray* refCondition = 0x0;
1454 for ( Int_t icond=0; icond<nConditions; icond++ ) {
1455 TObjArray* condition =
static_cast<TObjArray*
>(
fConditions->UncheckedAt(icond));
1458 refCondition = condition;
1459 title = condition->GetName();
1461 for ( Int_t ic=0; ic<condition->GetEntriesFast(); ic++ ) {
1462 TString currCond =
static_cast<TObjString*
>(condition->UncheckedAt(ic))->String();
1463 TString refCond =
static_cast<TObjString*
>(refCondition->UncheckedAt(ic))->String();
1464 if ( currCond == refCond )
continue;
1465 TString add = currCond;
1466 if ( ic == 3 ) add = trigOut->
GetHistoName(-1,-1,-1,currCond.Atoi(),-1,-1);
1467 else if ( ic == 4 ) add = trigOut->
GetHistoName(-1,-1,-1,-1,currCond.Atoi(),-1);
1468 else if ( ic == 5 ) add = trigOut->
GetHistoName(-1,-1,-1,-1,-1,currCond.Atoi());
1469 title += Form(
"_%s",add.Data());
1471 title.Remove(TString::kLeading,
'_');
1472 title.ReplaceAll(
",",
"|");
1473 condTitles.AddAt(
new TObjString(title),icond);
1483 Int_t itrackSel =
static_cast<TObjString*
>(condition->At(3))->String().Atoi();
1484 Int_t imatch =
static_cast<TObjString*
>(condition->At(4))->String().Atoi();
1485 Int_t imethod =
static_cast<TObjString*
>(condition->At(5))->String().Atoi();
1486 TString objName = trigOut->
GetHistoName(itype, icount, ichamber, itrackSel, imatch, imethod);
1487 return static_cast<TH1*
>(trigOut->GetSum(condition->At(0)->GetName(),condition->At(1)->GetName(),condition->At(2)->GetName(),objName));
1495 if ( idetelem < 0 && ichamber >=0 ) idetelem = 11+ichamber;
1497 TH1* outHisto = 0x0;
1500 TList* effHistoList = 0x0;
1502 while ( (effHistoList = static_cast<TList*>(next()) ) ) {
1507 TString outName = Form(
"histo_type%i_count%i_ch%i_",itype,icount,11+ichamber);
1509 outName += Form(
"%i_trend",idetelem);
1510 outHisto =
new TH1D(outName.Data(),outName.Data(),
fOutputs->GetEntriesFast(),0.,(Double_t)
fOutputs->GetEntriesFast());
1511 outHisto->SetDirectory(0);
1512 outHisto->GetXaxis()->SetTitle(
"Run num.");
1514 UInt_t run = effHistoList->GetUniqueID();
1515 outHisto->GetXaxis()->SetBinLabel(ibin,Form(
"%u",run));
1516 TH1* histo =
GetHisto(effHistoList,itype,icount,ichamber);
1517 Int_t currBin = histo->GetXaxis()->FindBin(idetelem);
1518 outHisto->SetBinContent(ibin,histo->GetBinContent(currBin));
1519 outHisto->SetBinError(ibin,histo->GetBinError(currBin));
1521 if ( outHisto ) outHisto->GetXaxis()->LabelsOption(
"v");
1530 AliWarning(
"Chose either bending plane, non-bending plane or both planes");
1533 TH1* histoNum =
GetTrend(itype,icount,ichamber,idetelem);
1535 TGraphAsymmErrors* graph =
new TGraphAsymmErrors(histoNum,histoDen,
"e0");
1537 histoNum->SetStats(kFALSE);
1538 graph->SetHistogram(static_cast<TH1F*>(histoNum));
1539 graph->GetYaxis()->SetTitle(
"Efficiency");
1540 graph->SetMarkerSize(0.5);
1553 Double_t binomialEff = 0.;
1554 Double_t sumErr2 = 0.;
1555 for ( Int_t jch=-1; jch<4; jch++ ) {
1556 Double_t prodEff = 1.;
1557 Double_t prodErr2 = 0.;
1558 for ( Int_t ich=0; ich<4; ich++ ) {
1559 Double_t currEff = ( ich == jch ) ? 1.-eff[ich] : eff[ich];
1561 Double_t relErr = ( currEff>0. ) ? effErr[ich]/currEff : 0.;
1562 prodErr2 += relErr*relErr;
1564 binomialEff += prodEff;
1565 sumErr2 += prodEff*prodEff*prodErr2;
1567 probErr = TMath::Sqrt(sumErr2);
1576 AliError(
"You first need to merge efficiency objects with MergeOutput");
1587 if ( runRanges.GetSize()%2 == 1 ) {
1588 AliError(
"Run ranges expected in the form: start_period1,end_period1,start_period2,end_period2... => even number expected");
1594 Int_t nRanges = mergedRanges.GetSize()/2;
1603 TList* effHistoList = 0x0;
1604 for ( Int_t irange=0; irange<nRanges; irange++ ) {
1605 Int_t firstRun = mergedRanges[2*irange];
1606 Int_t lastRun = mergedRanges[2*irange+1];
1611 UInt_t uFirstRun = (UInt_t)firstRun;
1612 UInt_t uLastRun = (UInt_t)lastRun;
1614 TString filename =
"";
1617 TFileMerger fileMerger;
1618 while ( (effHistoList = static_cast<TList*>(next()) ) ) {
1619 UInt_t run = effHistoList->GetUniqueID();
1620 if ( run < uFirstRun || run > uLastRun )
continue;
1621 filename = effHistoList->GetName();
1622 if ( firstRun == lastRun )
continue;
1623 fileMerger.AddFile(filename.Data(),kFALSE);
1626 TString sRange = Form(
"%i_%i",firstRun,lastRun);
1627 TString mergedFilename = Form(
"mergedTrigEff_runs_%s.root",sRange.Data());
1629 if ( firstRun == lastRun ) TFile::Cp(filename.Data(),mergedFilename.Data(),kFALSE);
1631 fileMerger.OutputFile(mergedFilename.Data());
1635 trigOut->SetName(sRange.Data());
1644 if ( averageStatError <= 0. || averageStatError >= 1. )
return runRanges;
1650 Double_t effForStatCalc = 0.9;
1652 Double_t averageStatNeeded = effForStatCalc*(1.-effForStatCalc)/(averageStatError*averageStatError);
1654 AliInfo(Form(
"Average statistics needed to reach precision of %g : %g",averageStatError,averageStatNeeded));
1656 Int_t nRanges = runRanges.GetSize()/2;
1658 TArrayD averageStat(nRanges);
1659 Double_t fullStat = 0.;
1660 for ( Int_t irange=0; irange<nRanges; irange++ ) {
1662 fullStat += averageStat[irange];
1665 TArrayI mergedRanges(runRanges.GetSize());
1667 mergedRanges[imerged++] = runRanges[0];
1668 Double_t mergedAverageStat = 0., remainingStat = fullStat;
1669 for ( Int_t irange=0; irange<nRanges; irange++ ) {
1670 Int_t istart = 2*irange;
1671 Int_t iend = istart+1;
1672 mergedAverageStat += averageStat[irange];
1673 remainingStat -= averageStat[irange];
1675 AliInfo(Form(
"%i - %i => stat %g",runRanges[2*irange],runRanges[2*irange+1],averageStat[irange]));
1677 if ( ( mergedAverageStat >= averageStatNeeded && remainingStat >= averageStatNeeded ) || iend == runRanges.GetSize()-1 ) {
1678 mergedRanges[imerged++] = runRanges[iend];
1679 AliInfo(Form(
" merged range %i - %i => stat %g",mergedRanges[imerged-2],mergedRanges[imerged-1],mergedAverageStat));
1680 mergedAverageStat = 0.;
1681 Int_t nextRun = iend+1;
1682 if ( nextRun < runRanges.GetSize() ) mergedRanges[imerged++] = runRanges[nextRun];
1685 mergedRanges.Set(imerged);
1686 return mergedRanges;
1698 TString sCondition = Form(
"%s;%s;%s;%i;%i;%i",physSel,trigClassName,centrality,itrackSel,imatch,imethod);
1699 TObjArray* foundCondition =
static_cast<TObjArray*
>(
fConditions->FindObject(sCondition.Data()));
1700 TObjArray* basicCondition =
static_cast<TObjArray*
>(
fConditions->At(0));
1702 TObjArray* addCondition = 0x0;
1704 if ( foundCondition ) {
1706 if ( foundCondition == basicCondition )
return kFALSE;
1709 addCondition = foundCondition;
1713 AliInfo(
"Systematic condition already added");
1718 addCondition = sCondition.Tokenize(
";");
1719 addCondition->SetName(sCondition.Data());
1724 if ( basicCondition ) {
1725 AliInfo(Form(
"Changing current eff. condition: %s\n",basicCondition->GetName()));
1727 delete basicCondition;
1734 TObjArray* tmpOutputs =
static_cast<TObjArray*
>(
fOutputs->Clone());
1736 TIter next(tmpOutputs);
1737 TList* effHistiList = 0x0;
1738 while ( (effHistiList = static_cast<TList*>(next())) ) {
1761 return SetCondition(physSel, trigClassName, centrality, itrackSel, imatch, imethod, kTRUE);
1771 TString filename(localFileList);
1772 gSystem->ExpandPathName(filename);
1773 if (
gSystem->AccessPathName(filename.Data()) ) {
1774 AliWarning(Form(
"Cannot find %s",filename.Data()));
1777 if ( filename.EndsWith(
".root") )
return AddToList(filename.Data(),outputName);
1779 Bool_t isOk = kTRUE;
1780 ifstream inFile(filename.Data());
1781 TString currLine =
"";
1782 while ( ! inFile.eof() ) {
1783 currLine.ReadLine(inFile);
1784 if ( currLine.IsNull() )
continue;
1785 if (
gSystem->AccessPathName(currLine.Data()) )
continue;
1786 if ( !
AddToList(currLine.Data(), outputName) ) isOk = kFALSE;
1797 CopyLocally(runList,path,pattern,localFileList,outDir,directory);
1805 CopyLocally(runList,path,
"",localFileList,outDir,directory);
1814 TString outCDBdir(outputCDB);
1815 if ( outCDBdir.Contains(
"://") && ! outCDBdir.BeginsWith(
"local") ) {
1816 AliError(
"A local directory is required to store the information");
1819 outCDBdir.ReplaceAll(
"local://",
"");
1820 if (
gSystem->AccessPathName(outCDBdir.Data()) ) {
1821 if ( !
ExecCommand(Form(
"mkdir -p %s",outCDBdir.Data()), kTRUE) ) {
1822 AliError(Form(
"Failed to create directory %s",outCDBdir.Data()));
1826 TString outCDB = outCDBdir;
1827 outCDB.Prepend(
"local://");
1829 AliCDBManager* mgr = AliCDBManager::Instance();
1830 if ( ! mgr->GetDefaultStorage() ) mgr->SetDefaultStorage(
"local://$ALICE_ROOT/OCDB");
1832 TString trigEffCDBdir =
"MUON/Calib/TriggerEfficiency";
1834 mgr->SetSpecificStorage(trigEffCDBdir.Data(),outCDB.Data());
1836 AliCDBStorage* specificStorage = mgr->GetSpecificStorage(trigEffCDBdir.Data());
1838 TObjArray* condition =
static_cast<TObjArray*
>(
fConditions->At(0));
1842 while ( (trigOut = static_cast<AliTrigChEffOutput*>(next())) ) {
1844 TString runRange = trigOut->GetName();
1855 TObjArray* currRange = runRange.Tokenize(
"_");
1856 Int_t firstRun =
static_cast<TObjString*
>(currRange->UncheckedAt(0))->String().Atoi();
1857 Int_t lastRun =
static_cast<TObjString*
>(currRange->UncheckedAt(1))->String().Atoi();
1861 for ( Int_t irun=0; irun<2; irun++ ) {
1862 Int_t runnr = ( irun == 0 ) ? firstRun : lastRun;
1863 specificStorage->QueryCDB(runnr);
1864 TObjArray* allIdsForRun = specificStorage->GetQueryCDBList();
1865 TIter nextId(allIdsForRun);
1867 while ((
id = dynamic_cast<AliCDBId*>(nextId()))) {
1868 TString path(id->GetPath());
1869 Int_t foundFirst =
id->GetFirstRun();
1870 Int_t foundLast =
id->GetLastRun();
1871 Int_t version =
id->GetVersion();
1872 Int_t subversion =
id->GetSubVersion();
1873 TString locPath = Form(
"%s/%s/Run%d_%d_v%d_s%d.root",outCDBdir.Data(),path.Data(),foundFirst,foundLast,version,subversion);
1874 if ( !
gSystem->AccessPathName(locPath.Data()) ) {
1881 AliMUONTriggerEfficiencyCells* effMap =
new AliMUONTriggerEfficiencyCells(effList);
1882 AliMUONCDB::WriteToCDB(effMap,
"MUON/Calib/TriggerEfficiency", firstRun, lastRun,
"Measured efficiencies");
Counts per cathode histogram index.
Int_t GetIndexFromRun(UInt_t runNumber) const
ClassImp(AliAnalysisTaskTriggerRates) AliAnalysisTaskTriggerRates
TList * GetEffHistoList(TString physSel, TString trigClassNames, TString centrality, Int_t itrackSel, Int_t imatch, Int_t imethod)
void CompareMergedEfficiencies(const char *opt) const
void CopyDir(TDirectory *source) const
Double_t GetError(Double_t errLow, Double_t errHigh) const
tracks used for calculation
Bool_t CopyLocally(const char *runList, const char *path, const char *pattern, const char *localFileList, const char *outDir, const char *directory) const
Hit pattern from tracker track extrapolation.
Double_t GetThreeOfFour(TArrayD eff, TArrayD effErr, Double_t &probErr) const
TGraphAsymmErrors * GetTrendEff(Int_t itype, Int_t icount, Int_t ichamber, Int_t idetelem) const
TArrayI MergeRangesForStat(TArrayI runRanges, Double_t averageStatError, Bool_t excludePeriphericBoards=kTRUE) const
Counts per slat histogram index.
Int_t CompareEfficiencies(const char *sources, const char *titles, const char *opt, const char *canvasNameSuffix="") const
Bool_t SetResultsFromGrid(const char *runList, const char *path, const char *pattern, const char *localFileList="localFileList.txt", const char *outDir="", const char *directory="MTR_ChamberEffMap", const char *outputName="testMTRChamberEff")
TList * GetEffHistoList(AliTrigChEffOutput *trigOut, TObjArray *condition) const
Bool_t AddToList(const char *filename, const char *outputName)
TObjArray * fMergedOutputs
!<! List of conditions for trigger efficiency
virtual ~AliMTRChEffAnalysis()
Int_t CompareEfficiencyMethods(const char *source, const char *opt, const char *canvasNameSuffix="") const
Output for Trig chamber effieincy.
TArrayI GetHomogeneousRanges(Double_t chi2Cut=3, Int_t maxNRanges=4, Double_t minEffVariation=0.005, Bool_t perRPC=kTRUE, TArrayI *forcedChanges=0x0, Double_t minEff=0.85, Double_t maxEff=1.01)
Bool_t SetEffConditions(const char *physSel, const char *trigClassName, const char *centrality, Int_t itrackSel, Int_t imatch, Int_t imethod)
Output for Trig chamber effieincy.
void DrawStatContribution(Int_t itype, Int_t irpc, Double_t maxNsigmaOutliers=-1., Double_t minY=0., Double_t maxY=0.15) const
Double_t GetAverageStat(Int_t firstRun, Int_t lastRun, Int_t itype=AliTrigChEffOutput::kHboardEff, Bool_t excludePeriphericBoards=kTRUE) const
Bool_t SetOutList(const char *localFileList, const char *outputName)
TString GetIdentifier(AliTrigChEffOutput *trigOut, TObjArray *condition, Int_t itype, Int_t icount, Int_t ichamber) const
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)
TH1 * GetHisto(TList *effHistoList, Int_t itype, Int_t icount, Int_t ichamber) const
Bool_t SetCondition(const char *physSel, const char *trigClassName, const char *centrality, Int_t itrackSel, Int_t imatch, Int_t imethod, Bool_t isBasic)
Bool_t WriteMergedToOCDB(const char *outputCDB="CDB") const
Bool_t GetShortConditionTitles(AliTrigChEffOutput *trigOut, TObjArray &condTitles) const
TList * GetRunList(const char *runList) const
Int_t GetRunNumber(Int_t ipt) const
Bool_t HasMergedResults() const
Bool_t ExecCommand(TString command, Bool_t prompt) const
TArrayI BoardsInRPC(Int_t irpc) const
Double_t FitRangesFunc(Double_t *x, Double_t *par)
Counts per board histogram index.
void DrawEffTrend(Int_t itype, Int_t irpc, Double_t maxNsigmasOutliers=-1., Double_t minEff=0.8, Double_t maxEff=1.01) const
TObjArray * fConditions
!<! List of outputs
TGraphAsymmErrors * GetOutliers(TGraphAsymmErrors *graph, Double_t maxNsigmas=3.) const
Bool_t AddSystematicCondition(const char *physSel, const char *trigClassName, const char *centrality, Int_t itrackSel, Int_t imatch, Int_t imethod)
Bool_t SetResultsFromWeb(const char *runList, const char *path, const char *localFileList="localFileList.txt", const char *outDir="", const char *directory="MTR_ChamberEffMap", const char *outputName="testMTRChamberEff")
Bool_t DrawSystematicEnvelope(Bool_t perRPC=kFALSE) const
Bool_t MergeOutput(TArrayI runRanges, Double_t averageStatError=0.01, Bool_t isIndex=kFALSE)
TString GetHistoName(Int_t itype, Int_t icount, Int_t ichamber, Int_t itrackSel, Int_t imatch, Int_t imethod)
Bool_t SetDefaultEffConditions()
TH1 * GetSum(AliTrigChEffOutput *trigOut, TObjArray *condition, Int_t itype, Int_t icount, Int_t ichamber) const
TH1 * GetTrend(Int_t itype, Int_t icount, Int_t ichamber, Int_t idetelem) const