ROOT logo
/////////////////////////////////////////////////////////
// NumberOfEventsMCvsDATA.C                            //
//                                                     //
// plots the ratio (# of MC events)/(# of DATA events) //
//    against the run number                           //
//                                                     //
// Written by John Groh                                //
/////////////////////////////////////////////////////////

// for cout
#include <iostream>
using namespace std;

// possible cuts to use -   0    1    2    3
Double_t CentCutMin[4] =   {0,  30,  30,  30};
Double_t CentCutMax[4] =   {5,  40,  40,  40};
Double_t QvecCutMin[4] =   {0,   0,   0, 1.5};
Double_t QvecCutMax[4] = {100, 100, 0.4, 100};
Double_t EtaMin[4] =    {-0.8,-0.8,-0.8,-0.8};
Double_t EtaMax[4] =     {0.8, 0.8, 0.8, 0.8};
Double_t Nsigmapid = 3.;
UInt_t trkbit = 1024;

//--------------------
// Start of function -
//--------------------
// icut selects which cut to use (2 and 3 have too low statistics and cause divide-by-zero errors, so don't use)
// nSigmaCut is the size of the deviation with which to determine outliers
void NumberOfEventsMCvsDATA(Int_t icut = 1, const Float_t nSigmaCut = 3)
{  
  // load libraries (I'm not sure I need all of these...)
  gSystem->Load("libCore.so");
  gSystem->Load("libPhysics.so");
  gSystem->Load("libTree");
  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("libPWGTools");
  gSystem->Load("libPWGLFspectra");
  gSystem->Load("libProof.so");
  gSystem->AddIncludePath("-I$ALICE_ROOT/include");

  // get number of runs used
  Int_t nRunsTemp = 0;
  Int_t dummy;
  ifstream runList("output/AODQAChecks/RunList.txt");
  while (!runList.eof())
    {
      runList >> dummy;
      nRunsTemp++;
    }
  runList.close();

  // I know this is silly, but you need a const for array sizes.
  // Also, it seems to want to read one more line than there is in the file
  const Int_t nRuns = nRunsTemp - 1;

  // fill an array with the run numbers and another two with the file names
  runList.open("output/AODQAChecks/RunList.txt");
  Int_t runs[nRuns];
  TString dataFilesDATA[nRuns];
  TString dataFilesMC[nRuns];

  for (Int_t irun=0; irun<nRuns; irun++)
    {
      runList >> runs[irun];
      dataFilesDATA[irun] = Form("output/AODQAChecks/DATA/AnalysisResults%i.root",runs[irun]);
      dataFilesMC[irun] = Form("output/AODQAChecks/MC/AnalysisResults%i.root",runs[irun]);
    }
  runList.close();

  // choose which TDirectories in the .root files to use
  TString snameDATA;
  TString snameMC;
  snameDATA = Form("OutputAODSpectraTask_Data_Cent%.0fto%.0f_QVec%.1fto%.1f_Eta%.1fto%.1f_%.1fSigmaPID_TrBit%d",CentCutMin[icut],CentCutMax[icut],QvecCutMin[icut],QvecCutMax[icut],EtaMin[icut],EtaMax[icut],Nsigmapid,trkbit);
  snameMC = Form("OutputAODSpectraTask_MC_Cent%.0fto%.0f_QVec%.1fto%.1f_Eta%.1fto%.1f_%.1fSigmaPID_TrBit%d",CentCutMin[icut],CentCutMax[icut],QvecCutMin[icut],QvecCutMax[icut],EtaMin[icut],EtaMax[icut],Nsigmapid,trkbit);

  TFile * fileDATA;
  TDirectoryFile * DirDATA;
  AliSpectraAODEventCuts * ecutsDATA;
  TFile * fileMC;
  TDirectoryFile * DirMC;
  AliSpectraAODEventCuts * ecutsMC;

  // histogram to be filled w/ the ratio (# of MC events)/(# of DATA events)
  TH1F * hNEventsRatio = new TH1F("hNEventsRatio","",nRuns,0,nRuns);

  // loop over all runs
  for (Int_t irun=0; irun<nRuns; irun++)
    {
      Printf("\n--- Processing run %i ---",runs[irun]);
      
      // open the file
      fileDATA = TFile::Open(dataFilesDATA[irun].Data());
      if (!fileDATA)
	{
	  Printf("\n!!! ERROR: Could not open DATA file %s !!!\n",dataFiles[irun].Data());
	  continue;
	}
      fileMC = TFile::Open(dataFilesMC[irun].Data());
      if (!fileMC)
	{
	  Printf("\n!!! ERROR: Could not open MC file %s !!!\n",dataFiles[irun].Data());
	  continue;
	}
      
      // choose the right directory and event cut objects
      DirDATA = (TDirectoryFile*)fileDATA->Get(Form("%s",snameDATA.Data()));
      if (!DirDATA)
	{
	  Printf("\n!!! ERROR: DirDATA is a null pointer. Skipping to next file !!!\n");
	  continue;
	}
      DirMC = (TDirectoryFile*)fileMC->Get(Form("%s",snameMC.Data()));
      if (!DirMC)
	{
	  Printf("\n!!! ERROR: DirMC is a null pointer. Skipping to next file !!!\n");
	  continue;
	}
      ecutsDATA = (AliSpectraAODEventCuts*)DirDATA->Get("Event Cuts");
      if (!ecutsDATA)
	{
	  Printf("\n!!! ERROR: ecutsDATA is a null pointer. Skipping to next file !!!\n");
	  continue;
	}      
      ecutsMC = (AliSpectraAODEventCuts*)DirMC->Get("Event Cuts");
      if (!ecutsMC)
	{
	  Printf("\n!!! ERROR: ecutsMC is a null pointer. Skipping to next file !!!\n");
	  continue;
	}      

      // calculate the ratio and fill the histogram
      Int_t nEventsDATA = ecutsDATA->NumberOfEvents();
      Int_t nEventsMC = ecutsMC->NumberOfEvents();
      Float_t ratio = (Float_t)nEventsMC / (Float_t)nEventsDATA;
      hNEventsRatio->SetBinContent(irun+1,ratio);
      Printf("# of MC events: %i\n# of DATA events: %i\nRatio: %.2f",nEventsMC,nEventsDATA,ratio);

    } // end loop over runs

  // draw it
  TCanvas * cNEventsRatio = new TCanvas("cNEventsRatio","cNEventsRatio");
  for (Int_t irun=0; irun<nRuns; irun++)
    hNEventsRatio->GetXaxis()->SetBinLabel(irun+1,Form("%i",runs[irun]));
  hNEventsRatio->GetYaxis()->SetTitle("(# of MC events)/(# of DATA events)");
  hNEventsRatio->GetYaxis()->SetTitleOffset(1.2);
  hNEventsRatio->SetMarkerStyle(21);
  hNEventsRatio->SetMarkerColor(kBlue);
  hNEventsRatio->SetStats(kFALSE);
  hNEventsRatio->DrawCopy("P");
}





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