ROOT logo
//#include "AliAnalysisTaskTriggerStudy.h"

Int_t GetNumberOfEventsWithBit(TH1 * hVenn, UInt_t bitMask, UInt_t excludeMask=0) ;

void TriggerStudyResults(const char * filename = "outTrigger/collection_136854.xml/trigger_study.root", TString trigger = "C0SM1-A-NOPF-ALL") {

  TFile * f = new TFile (filename);

  
  LoadLibs();

  // Draw trigger venn diagram
  //    hTrigStat_All_C0OM2-A-NOPF-ALL
  TString vennName = "hTrigStat_All";
  if (trigger != "") vennName = vennName+"_"+trigger;
  cout << "Venn name: " << vennName.Data() << endl;
  
  TH1 * hVenn = (TH1*) f->Get(vennName);
  hVenn->Draw();
  Int_t colors[] = {2,3,4,5,6,7,8,9,10,11,12,13,14,15};
  TPie * pie = new TPie(hVenn);
  Int_t nbin = hVenn->GetNbinsX();
  for(Int_t ibin = 0; ibin < nbin; ibin++){
    pie->SetEntryLabel(ibin, Form("%s, %d (%1.2f%%)", pie->GetEntryLabel(ibin), (int) pie->GetEntryVal(ibin), pie->GetEntryVal(ibin)/hVenn->GetEntries()*100));
  }
  
  pie->SortSlices(1,1); // Sort slices and merge the empty ones
  pie->SortSlices(0,0); // Sort in increasing order. Sorting in increasing order directly leads to segfault
  pie->SetRadius(.31);
  pie->SetX(.53);
  pie->SetY(.34);
  pie->SetLabelsOffset(.01);
  pie->SetLabelFormat("");//#splitline{%val (%perc)}{%txt}");
  pie->SetFillColors(colors);
  //  pie->SetTextSize(0.01);
  TCanvas * c = new TCanvas("c", "c", 1000,1000);
  pie->Draw("");
  
  pie->MakeLegend(0.224832, 0.66958, 0.833893, 0.97028, trigger.Data());
  cout << pie << endl;
  
  // Make a table of trigger efficiencies for all histos results
  // AliLatexTable table(2,"cc");
  // //  table.InsertCustomRow("\\multicolumn{c}{2}{Integrated efficiency}");
  // table.InsertCustomRow(Form("Trigger Name & Efficiency (%s)\\\\",trigger.Data()));
  // table.InsertHline();
  // TList * l = gDirectory->GetListOfKeys();
  // TIterator * iter = l->MakeIterator();
  // TKey * key = 0;
  // TH1F * hall = (TH1F*) gDirectory->Get("hTracklets_all"); // FIXME: get the normalization for a given trigger?
  // while (key = (TKey*) iter->Next()){
  //   TString name = key->GetName();
  //   if(!name.Contains("Tracklets")) continue;
  //   if(!name.Contains(trigger)) continue;
  //   if(name.Contains("all")) continue;
  //   TH1F * h = (TH1F*) gDirectory->Get(name);
  //   TString label = name(name.Index("_")+1, name.Index("_",name.Index("_")+1)-name.Index("_")-1);
  //   table.SetNextCol(label);
  //   table.SetNextCol(h->GetEntries()/hall->GetEntries());
  //   table.InsertRow();
  // }
  // cout << "Integrated trigger efficiency" << endl;
  // table.PrintTable("ASCII");

  Int_t v0ANDOnline  = GetNumberOfEventsWithBit(hVenn,0x1 <<AliAnalysisTaskTriggerStudy::kVDV0ANDOnline) ;
  Int_t v0ANDOffline = GetNumberOfEventsWithBit(hVenn,0x1 <<AliAnalysisTaskTriggerStudy::kVDV0ANDOffline | 0x1 << AliAnalysisTaskTriggerStudy::kVDPhysSel);
  Int_t recCandle    = GetNumberOfEventsWithBit(hVenn,0x1 <<AliAnalysisTaskTriggerStudy::kVDRecCandle | 0x1 << AliAnalysisTaskTriggerStudy::kVDPhysSel| 0x1 << AliAnalysisTaskTriggerStudy::kVDV0ANDOffline)  ;
  //  Int_t recCandlePS  = GetNumberOfEventsWithBit(hVenn,0x1 <<AliAnalysisTaskTriggerStudy::kVDRecCandle, 0x1 << AliAnalysisTaskTriggerStudy::kVDPhysSel)  ;
  Int_t genCandle         = GetNumberOfEventsWithBit(hVenn,0x1 <<AliAnalysisTaskTriggerStudy::kVDGenCandle)  ;
  Int_t genCandleAndV0    = GetNumberOfEventsWithBit(hVenn,0x1 <<AliAnalysisTaskTriggerStudy::kVDGenCandle | 0x1 << AliAnalysisTaskTriggerStudy::kVDV0ANDOffline)  ;
  
  Int_t physSel      = GetNumberOfEventsWithBit(hVenn,0x1 <<AliAnalysisTaskTriggerStudy::kVDPhysSel)     ;

  cout << "V0AND Online     " << v0ANDOnline   << endl;
  cout << "V0AND Offline    " << v0ANDOffline  << endl;
  cout << "REC CANDLE       " << recCandle     <<endl;
  cout << "GEN CANDLE       " << genCandle      << endl;
  cout << "REC/GEN CANDLE   " << (genCandle>0 ? Float_t(recCandle)/genCandle : genCandle)      << endl;
  cout << "REC/GEN CANDLEV0 " << (genCandleAndV0>0 ? Float_t(recCandle)/genCandleAndV0 : genCandleAndV0)      << endl;
  cout << "Phys Sel CINT1B  " << physSel       << endl;
  //  cout << "Dummy " << GetNumberOfEventsWithBit(hVenn,0x1 <<AliAnalysisTaskTriggerStudy::kVDRecCandle, 0x1 << AliAnalysisTaskTriggerStudy::kVDV0ANDOffline)  << endl;
  
  AliLatexTable table(5,"cc");
  table.InsertCustomRow("V0AND online/offline &	V0AND offline / after PS & V0AND online / after PS & candle / after PS & Candle / v0AND offline\\\\");
  table.SetNextCol(Float_t(v0ANDOnline)/v0ANDOffline,-3);
  table.SetNextCol(Float_t(v0ANDOffline)/physSel    ,-3);
  table.SetNextCol(Float_t(v0ANDOnline)/physSel     ,-3);
  table.SetNextCol(Float_t(recCandle)/physSel       ,-3);
  table.SetNextCol(Float_t(recCandle)/v0ANDOffline  ,-3);
  table.InsertRow();
  table.PrintTable("ASCII");

}

LoadLibs() {

  gSystem->Load("libCore.so");  
  gSystem->Load("libGeom.so");
  gSystem->Load("libPhysics.so");
  gSystem->Load("libVMC");
  gSystem->Load("libTree");
  gSystem->Load("libProof");
  gSystem->Load("libMatrix");
  gSystem->Load("libSTEERBase");
  gSystem->Load("libESD");
  gSystem->Load("libAOD");
  gSystem->Load("libANALYSIS");
  gSystem->Load("libOADB");
  gSystem->Load("libANALYSISalice");
  gSystem->Load("libTENDER");
  gSystem->Load("libCORRFW");
  gSystem->Load("libPWG0base");
  gSystem->Load("libMinuit");
  gSystem->Load("libPWG2spectra");

  gROOT->ProcessLine(gSystem->ExpandPathName(".include $ALICE_ROOT/PWG0/multPbPb"));
  gROOT->ProcessLine(gSystem->ExpandPathName(".include $ALICE_ROOT/PWGPP/background"));
  // Load helper classes
  // TODO: replace this by a list of TOBJStrings
  TString taskName("$ALICE_ROOT/PWG0/multPbPb/AliAnalysisTaskTriggerStudy.cxx+");
  TString histoManName("$ALICE_ROOT/PWG0/multPbPb/AliAnalysisMultPbTrackHistoManager.cxx+");
  TString centrName("$ALICE_ROOT/PWG0/multPbPb/AliAnalysisMultPbCentralitySelector.cxx+");
  TString listName("$ALICE_ROOT/PWGPP/background/AliHistoListWrapper.cxx+");

  gSystem->ExpandPathName(taskName);
  // gSystem->ExpandPathName(histoManName);
  // gSystem->ExpandPathName(centrName);
  // gSystem->ExpandPathName(listName);

  Bool_t debug=0;
  //  gROOT->LoadMacro(listName    +(debug?"+g":""));   
  // gROOT->LoadMacro(histoManName+(debug?"+g":""));
  // gROOT->LoadMacro(centrName   +(debug?"+g":""));   
  gROOT->LoadMacro(taskName    +(debug?"+g":""));   

  // Histo fitter
  // gROOT->LoadMacro("/Users/mfloris/Work/ALICE/ANALYSIS/HistoFitter/fcn.cxx+g");
  // gROOT->LoadMacro("/Users/mfloris/Work/ALICE/ANALYSIS/HistoFitter/AliHistoFitter.cxx+g");


}

Int_t GetNumberOfEventsWithBit(TH1 * hVenn, UInt_t bitMask, UInt_t excludeMask) {
  // If more than 1 bit is on in bitMask, they are used in and 
  Int_t nbins = hVenn->GetNbinsX();
  //  cout << "bitMask " << hex << bitMask << endl;
  
  Int_t nev = 0;
  for(Int_t ibins = 1; ibins <= nbins; ibins++){
    Int_t x = Int_t(hVenn->GetBinCenter(ibins));
    Bool_t useBin = x&bitMask;
    //    printf("Bood 0x%x 0x%x %d\n", x, bitMask, useBin);
    for (Int_t i = 0; i < 4*sizeof(bitMask) ; i++){
      UInt_t localMask = bitMask & (0x1 << i);
      //      cout << "localMask " << localMask << endl;
      
      if(localMask &&  !(x & localMask))   useBin = kFALSE;
    }
    //    cout << hex << x << " " << bitMask << endl;
    
    if (useBin && !(x&excludeMask)) {      
      nev += hVenn->GetBinContent(ibins);
      //  cout << "Using " << hVenn->GetXaxis()->GetBinLabel(ibins)  << " " << hVenn->GetBinContent(ibins) << endl;      
    }
  }

  return nev;
}
 TriggerStudyResults.C:1
 TriggerStudyResults.C:2
 TriggerStudyResults.C:3
 TriggerStudyResults.C:4
 TriggerStudyResults.C:5
 TriggerStudyResults.C:6
 TriggerStudyResults.C:7
 TriggerStudyResults.C:8
 TriggerStudyResults.C:9
 TriggerStudyResults.C:10
 TriggerStudyResults.C:11
 TriggerStudyResults.C:12
 TriggerStudyResults.C:13
 TriggerStudyResults.C:14
 TriggerStudyResults.C:15
 TriggerStudyResults.C:16
 TriggerStudyResults.C:17
 TriggerStudyResults.C:18
 TriggerStudyResults.C:19
 TriggerStudyResults.C:20
 TriggerStudyResults.C:21
 TriggerStudyResults.C:22
 TriggerStudyResults.C:23
 TriggerStudyResults.C:24
 TriggerStudyResults.C:25
 TriggerStudyResults.C:26
 TriggerStudyResults.C:27
 TriggerStudyResults.C:28
 TriggerStudyResults.C:29
 TriggerStudyResults.C:30
 TriggerStudyResults.C:31
 TriggerStudyResults.C:32
 TriggerStudyResults.C:33
 TriggerStudyResults.C:34
 TriggerStudyResults.C:35
 TriggerStudyResults.C:36
 TriggerStudyResults.C:37
 TriggerStudyResults.C:38
 TriggerStudyResults.C:39
 TriggerStudyResults.C:40
 TriggerStudyResults.C:41
 TriggerStudyResults.C:42
 TriggerStudyResults.C:43
 TriggerStudyResults.C:44
 TriggerStudyResults.C:45
 TriggerStudyResults.C:46
 TriggerStudyResults.C:47
 TriggerStudyResults.C:48
 TriggerStudyResults.C:49
 TriggerStudyResults.C:50
 TriggerStudyResults.C:51
 TriggerStudyResults.C:52
 TriggerStudyResults.C:53
 TriggerStudyResults.C:54
 TriggerStudyResults.C:55
 TriggerStudyResults.C:56
 TriggerStudyResults.C:57
 TriggerStudyResults.C:58
 TriggerStudyResults.C:59
 TriggerStudyResults.C:60
 TriggerStudyResults.C:61
 TriggerStudyResults.C:62
 TriggerStudyResults.C:63
 TriggerStudyResults.C:64
 TriggerStudyResults.C:65
 TriggerStudyResults.C:66
 TriggerStudyResults.C:67
 TriggerStudyResults.C:68
 TriggerStudyResults.C:69
 TriggerStudyResults.C:70
 TriggerStudyResults.C:71
 TriggerStudyResults.C:72
 TriggerStudyResults.C:73
 TriggerStudyResults.C:74
 TriggerStudyResults.C:75
 TriggerStudyResults.C:76
 TriggerStudyResults.C:77
 TriggerStudyResults.C:78
 TriggerStudyResults.C:79
 TriggerStudyResults.C:80
 TriggerStudyResults.C:81
 TriggerStudyResults.C:82
 TriggerStudyResults.C:83
 TriggerStudyResults.C:84
 TriggerStudyResults.C:85
 TriggerStudyResults.C:86
 TriggerStudyResults.C:87
 TriggerStudyResults.C:88
 TriggerStudyResults.C:89
 TriggerStudyResults.C:90
 TriggerStudyResults.C:91
 TriggerStudyResults.C:92
 TriggerStudyResults.C:93
 TriggerStudyResults.C:94
 TriggerStudyResults.C:95
 TriggerStudyResults.C:96
 TriggerStudyResults.C:97
 TriggerStudyResults.C:98
 TriggerStudyResults.C:99
 TriggerStudyResults.C:100
 TriggerStudyResults.C:101
 TriggerStudyResults.C:102
 TriggerStudyResults.C:103
 TriggerStudyResults.C:104
 TriggerStudyResults.C:105
 TriggerStudyResults.C:106
 TriggerStudyResults.C:107
 TriggerStudyResults.C:108
 TriggerStudyResults.C:109
 TriggerStudyResults.C:110
 TriggerStudyResults.C:111
 TriggerStudyResults.C:112
 TriggerStudyResults.C:113
 TriggerStudyResults.C:114
 TriggerStudyResults.C:115
 TriggerStudyResults.C:116
 TriggerStudyResults.C:117
 TriggerStudyResults.C:118
 TriggerStudyResults.C:119
 TriggerStudyResults.C:120
 TriggerStudyResults.C:121
 TriggerStudyResults.C:122
 TriggerStudyResults.C:123
 TriggerStudyResults.C:124
 TriggerStudyResults.C:125
 TriggerStudyResults.C:126
 TriggerStudyResults.C:127
 TriggerStudyResults.C:128
 TriggerStudyResults.C:129
 TriggerStudyResults.C:130
 TriggerStudyResults.C:131
 TriggerStudyResults.C:132
 TriggerStudyResults.C:133
 TriggerStudyResults.C:134
 TriggerStudyResults.C:135
 TriggerStudyResults.C:136
 TriggerStudyResults.C:137
 TriggerStudyResults.C:138
 TriggerStudyResults.C:139
 TriggerStudyResults.C:140
 TriggerStudyResults.C:141
 TriggerStudyResults.C:142
 TriggerStudyResults.C:143
 TriggerStudyResults.C:144
 TriggerStudyResults.C:145
 TriggerStudyResults.C:146
 TriggerStudyResults.C:147
 TriggerStudyResults.C:148
 TriggerStudyResults.C:149
 TriggerStudyResults.C:150
 TriggerStudyResults.C:151
 TriggerStudyResults.C:152
 TriggerStudyResults.C:153
 TriggerStudyResults.C:154
 TriggerStudyResults.C:155
 TriggerStudyResults.C:156
 TriggerStudyResults.C:157
 TriggerStudyResults.C:158
 TriggerStudyResults.C:159
 TriggerStudyResults.C:160
 TriggerStudyResults.C:161
 TriggerStudyResults.C:162
 TriggerStudyResults.C:163
 TriggerStudyResults.C:164
 TriggerStudyResults.C:165
 TriggerStudyResults.C:166
 TriggerStudyResults.C:167
 TriggerStudyResults.C:168
 TriggerStudyResults.C:169