ROOT logo
/*
 *  CalcEffic.C
 */

TEfficiency* CalcEffic(const char* fileName, Bool_t makeDraw=kFALSE)
{
	// open the input file
	TFile *file = new TFile(fileName);
	
	// ********************************************
	// parameters to check before running the macro
	// ********************************************

	const Float_t E_MIN = 0.1;
	const Int_t NHISTS = 6; // Check the number of histograms for different particle species
	const Int_t NOUTPUTS = 3;
	const Int_t NHISTOUT[NOUTPUTS] = {6,3,3};
	Int_t IHISTOUT[NOUTPUTS][NHISTS] = {{0,1,2,3,4,5},{0,1,2,-1,-1,-1},{3,4,5,-1,-1,-1}};
	
	Int_t style[NOUTPUTS] = {20,21,22};
	Int_t color[NOUTPUTS] = {1,2,4};
		
	const Int_t fgNumOfEBins = 78; // Check the number of eta bins in the histograms
	const Int_t fgNumOfEtaBins = 16; // Check the number of E bins in the histograms
	Double_t fgEAxis[79]={0., 0.05, 0.10, 0.15, 0.20, 0.25, 0.30, 0.35, 0.4, 0.45, 0.5, 0.55, 0.6, 0.65, 0.7, 0.75, 0.8, 0.85, 0.9, 0.95,
		1.,1.5,2.,2.5,3.,3.5,4.,4.5,5.,5.5,6.,6.5,7.,7.5,8.,8.5,9.,9.5,10.,11.,
		12.,13.,14.,15.,16.,17.,18.,19.,20.,21.,22.,23.,24.,25.,26.,27.,28.,29.,30.,31.,
		32.,33.,34.,35.,36.,37.,38.,39.,40.,41.,42.,43.,44.,45.,46.,47.,48.,49.,50.};
	
	// declare histograms and graphs
	TH2F *histNum[NHISTS];
	TH2F *histDen[NHISTS];
	TGraphErrors *graph[NOUTPUTS];
	TGraphErrors *graphNum[NOUTPUTS];
	TGraphErrors *graphDen[NOUTPUTS];
	TEfficiency *effic[NOUTPUTS];
	char efficName[50];
	
	//define canvas
	gStyle->SetOptTitle(0);
	gStyle->SetOptStat(0);
	gStyle->SetOptFit(0);	
	
	TCanvas *c1;
	TCanvas *c2;
	
	if (makeDraw)
	{
		c1 = new TCanvas("c1","c1",500,400);
		//c1->SetTopMargin(0.04);
		//c1->SetRightMargin(0.04);
		//c1->SetLeftMargin(0.181452);
		//c1->SetBottomMargin(0.134409);
		c1->SetBorderSize(0);
		c1->SetFillColor(0);
		c1->SetBorderMode(0);
		c1->SetFrameFillColor(0);
		c1->SetFrameBorderMode(0);
		
		c2 = new TCanvas("c2","c2",500,400);
		c2->Divide(1,3);
	}
	
	// retrieve the input list of histogram. Check the TList name in the input file.
	TList *list = (TList*) file->Get("out1");
	
	// retrieve the histograms in the list. Check the name of the histograms
	histNum[0] = (TH2F*)list->FindObject("fHistElectronRec_EtaE_EmcalMC");
	histNum[1] = (TH2F*)list->FindObject("fHistConvElectronRec_EtaE_EmcalMC");
	histNum[2] = (TH2F*)list->FindObject("fHistScatElectronRec_EtaE_EmcalMC");
	histNum[3] = (TH2F*)list->FindObject("fHistGammaRec_EtaE_EmcalMC");
	histNum[4] = (TH2F*)list->FindObject("fHistAnnihGammaRec_EtaE_EmcalMC");
	histNum[5] = (TH2F*)list->FindObject("fHistScatGammaRec_EtaE_EmcalMC");
	
	// retrieve the histograms in the list. Check the name of the histograms
	histDen[0] = (TH2F*)list->FindObject("fHistElectronAcc_EtaE_EmcalMC");
	histDen[1] = (TH2F*)list->FindObject("fHistConvElectronAcc_EtaE_EmcalMC");
	histDen[2] = (TH2F*)list->FindObject("fHistScatElectronAcc_EtaE_EmcalMC");
	histDen[3] = (TH2F*)list->FindObject("fHistGammaAcc_EtaE_EmcalMC");
	histDen[4] = (TH2F*)list->FindObject("fHistAnnihGammaAcc_EtaE_EmcalMC");
	histDen[5] = (TH2F*)list->FindObject("fHistScatGammaAcc_EtaE_EmcalMC");
	
	// ********************************************

	Float_t x[fgNumOfEBins]={0}, ex[fgNumOfEBins]={0};
	Float_t y[fgNumOfEBins]={0}, ey[fgNumOfEBins]={0};
	Float_t num[fgNumOfEBins]={0}, den[fgNumOfEBins]={0};
	
	// loop over different desired outputs
	for (int iOut=0; iOut<NOUTPUTS; iOut++)
	{
		sprintf(efficName,"effic_%d",iOut);
		effic[iOut] = new TEfficiency(efficName,efficName,fgNumOfEBins,fgEAxis);

		// loop over E bins
		for (int ix=0; ix<fgNumOfEBins; ix++)
		{
			//check minimum energy
			if (histNum[0]->GetXaxis()->GetBinLowEdge(ix+1) < E_MIN)
				continue;
			
			// initialize ET variables for a new particle species
			x[ix]=histNum[0]->GetXaxis()->GetBinCenter(ix+1);
			y[ix]=0;
			ex[ix]=0;
			ey[ix]=0;
			num[ix] = 0;
			den[ix] = 0;
			
			// loop over eta bins
			for (int iy=0; iy<fgNumOfEtaBins; iy++)
			{
				for (int iHist=0; iHist<NHISTOUT[iOut]; iHist++)
				{
					num[ix] += histNum[IHISTOUT[iOut][iHist]]->GetBinContent(ix+1,iy+1); // sum over all E bins in order to get total ET
					den[ix] += histDen[IHISTOUT[iOut][iHist]]->GetBinContent(ix+1,iy+1); // sum over all E bins in order to get total ET
				}
			}
			
			if ((num[ix]>0) && (den[ix]>0))
			{
				effic[iOut]->SetTotalEvents(ix,den[ix]);
				effic[iOut]->SetPassedEvents(ix,num[ix]);

				y[ix] = num[ix]/den[ix];
				ey[ix] = y[ix]*sqrt(1/num[ix]+1/den[ix]);				
			}
			else
			{
				y[ix] = 0;	
				ey[ix] = 0;
			}
			
		} // end of loop over E bins

		graph[iOut] = new TGraphErrors(fgNumOfEBins,x,y,ex,ey); // graphic of ET(>E_cut)/ET(total) for a given particle species and E cut
		graphNum[iOut] = new TGraphErrors(fgNumOfEBins,x,num,ex,ey); // graphic of ET(>E_cut)/ET(total) for a given particle species and E cut	
		graphDen[iOut] = new TGraphErrors(fgNumOfEBins,x,den,ex,ey); // graphic of ET(>E_cut)/ET(total) for a given particle species and E cut

	} // end of loop over different outputs

	
	// Draw the plot
	
	if (makeDraw)
	{
		for (int i=0; i<NOUTPUTS; i++)
		{		
			c2->cd(i);
			
			graphDen[i]->SetMarkerStyle(style[i]);
			graphDen[i]->SetMarkerColor(color[i]);
			graphDen[i]->SetLineColor(color[i]);
			graphDen[i]->SetFillColor(0);
			if (i == 0) 
			{
				graphDen[i]->GetXaxis()->SetTitle("E (GeV)");
				graphDen[i]->GetYaxis()->SetTitle("effic");
				//graphDen[i]->SetMaximum(1.0);
				graphDen[i]->SetMinimum(0.0);
				graphDen[i]->Draw("AP");
			}
			else 
				graphDen[i]->Draw("P");
			
			graphNum[i]->SetMarkerStyle(style[i]+4);
			graphNum[i]->SetMarkerColor(color[i]);
			graphNum[i]->SetLineColor(color[i]);
			graphNum[i]->SetFillColor(0);
			graphNum[i]->Draw("P");		
		}
		
		c1->cd();
		/*
		for (int i=0; i<NOUTPUTS; i++)
		{
			effic[i]->SetMarkerStyle(style[i]);
			effic[i]->SetMarkerColor(color[i]);
			effic[i]->SetLineColor(color[i]);
			effic[i]->SetFillColor(0);
			effic[i]->SetTitle("efficiency;E (GeV); #epsilon");
			if (i == 0) 
			{
				effic[i]->Draw("AP");
			}
			else 
				effic[i]->Draw("Psame");
		}
		*/
		for (int i=0; i<NOUTPUTS; i++)
		{
			graph[i]->SetMarkerStyle(style[i]);
			graph[i]->SetMarkerColor(color[i]);
			graph[i]->SetLineColor(color[i]);
			graph[i]->SetFillColor(0);
			if (i == 0) 
			{
				graph[i]->Draw("AP");
			}
			else 
				graph[i]->Draw("P");
		}
		
		TLegend *leg = new TLegend(0.65,0.2,0.95,0.5);
		leg->AddEntry(effic[0],"electrons+gammas");
		leg->AddEntry(effic[1],"electrons");
		leg->AddEntry(effic[2],"gammas");
		leg->SetFillStyle(0);
		leg->SetFillColor(0);
		leg->SetBorderSize(0);
		leg->SetTextSize(0.03);
		leg->Draw();
	}
	
	return effic[0];
}
 CalcEffic.C:1
 CalcEffic.C:2
 CalcEffic.C:3
 CalcEffic.C:4
 CalcEffic.C:5
 CalcEffic.C:6
 CalcEffic.C:7
 CalcEffic.C:8
 CalcEffic.C:9
 CalcEffic.C:10
 CalcEffic.C:11
 CalcEffic.C:12
 CalcEffic.C:13
 CalcEffic.C:14
 CalcEffic.C:15
 CalcEffic.C:16
 CalcEffic.C:17
 CalcEffic.C:18
 CalcEffic.C:19
 CalcEffic.C:20
 CalcEffic.C:21
 CalcEffic.C:22
 CalcEffic.C:23
 CalcEffic.C:24
 CalcEffic.C:25
 CalcEffic.C:26
 CalcEffic.C:27
 CalcEffic.C:28
 CalcEffic.C:29
 CalcEffic.C:30
 CalcEffic.C:31
 CalcEffic.C:32
 CalcEffic.C:33
 CalcEffic.C:34
 CalcEffic.C:35
 CalcEffic.C:36
 CalcEffic.C:37
 CalcEffic.C:38
 CalcEffic.C:39
 CalcEffic.C:40
 CalcEffic.C:41
 CalcEffic.C:42
 CalcEffic.C:43
 CalcEffic.C:44
 CalcEffic.C:45
 CalcEffic.C:46
 CalcEffic.C:47
 CalcEffic.C:48
 CalcEffic.C:49
 CalcEffic.C:50
 CalcEffic.C:51
 CalcEffic.C:52
 CalcEffic.C:53
 CalcEffic.C:54
 CalcEffic.C:55
 CalcEffic.C:56
 CalcEffic.C:57
 CalcEffic.C:58
 CalcEffic.C:59
 CalcEffic.C:60
 CalcEffic.C:61
 CalcEffic.C:62
 CalcEffic.C:63
 CalcEffic.C:64
 CalcEffic.C:65
 CalcEffic.C:66
 CalcEffic.C:67
 CalcEffic.C:68
 CalcEffic.C:69
 CalcEffic.C:70
 CalcEffic.C:71
 CalcEffic.C:72
 CalcEffic.C:73
 CalcEffic.C:74
 CalcEffic.C:75
 CalcEffic.C:76
 CalcEffic.C:77
 CalcEffic.C:78
 CalcEffic.C:79
 CalcEffic.C:80
 CalcEffic.C:81
 CalcEffic.C:82
 CalcEffic.C:83
 CalcEffic.C:84
 CalcEffic.C:85
 CalcEffic.C:86
 CalcEffic.C:87
 CalcEffic.C:88
 CalcEffic.C:89
 CalcEffic.C:90
 CalcEffic.C:91
 CalcEffic.C:92
 CalcEffic.C:93
 CalcEffic.C:94
 CalcEffic.C:95
 CalcEffic.C:96
 CalcEffic.C:97
 CalcEffic.C:98
 CalcEffic.C:99
 CalcEffic.C:100
 CalcEffic.C:101
 CalcEffic.C:102
 CalcEffic.C:103
 CalcEffic.C:104
 CalcEffic.C:105
 CalcEffic.C:106
 CalcEffic.C:107
 CalcEffic.C:108
 CalcEffic.C:109
 CalcEffic.C:110
 CalcEffic.C:111
 CalcEffic.C:112
 CalcEffic.C:113
 CalcEffic.C:114
 CalcEffic.C:115
 CalcEffic.C:116
 CalcEffic.C:117
 CalcEffic.C:118
 CalcEffic.C:119
 CalcEffic.C:120
 CalcEffic.C:121
 CalcEffic.C:122
 CalcEffic.C:123
 CalcEffic.C:124
 CalcEffic.C:125
 CalcEffic.C:126
 CalcEffic.C:127
 CalcEffic.C:128
 CalcEffic.C:129
 CalcEffic.C:130
 CalcEffic.C:131
 CalcEffic.C:132
 CalcEffic.C:133
 CalcEffic.C:134
 CalcEffic.C:135
 CalcEffic.C:136
 CalcEffic.C:137
 CalcEffic.C:138
 CalcEffic.C:139
 CalcEffic.C:140
 CalcEffic.C:141
 CalcEffic.C:142
 CalcEffic.C:143
 CalcEffic.C:144
 CalcEffic.C:145
 CalcEffic.C:146
 CalcEffic.C:147
 CalcEffic.C:148
 CalcEffic.C:149
 CalcEffic.C:150
 CalcEffic.C:151
 CalcEffic.C:152
 CalcEffic.C:153
 CalcEffic.C:154
 CalcEffic.C:155
 CalcEffic.C:156
 CalcEffic.C:157
 CalcEffic.C:158
 CalcEffic.C:159
 CalcEffic.C:160
 CalcEffic.C:161
 CalcEffic.C:162
 CalcEffic.C:163
 CalcEffic.C:164
 CalcEffic.C:165
 CalcEffic.C:166
 CalcEffic.C:167
 CalcEffic.C:168
 CalcEffic.C:169
 CalcEffic.C:170
 CalcEffic.C:171
 CalcEffic.C:172
 CalcEffic.C:173
 CalcEffic.C:174
 CalcEffic.C:175
 CalcEffic.C:176
 CalcEffic.C:177
 CalcEffic.C:178
 CalcEffic.C:179
 CalcEffic.C:180
 CalcEffic.C:181
 CalcEffic.C:182
 CalcEffic.C:183
 CalcEffic.C:184
 CalcEffic.C:185
 CalcEffic.C:186
 CalcEffic.C:187
 CalcEffic.C:188
 CalcEffic.C:189
 CalcEffic.C:190
 CalcEffic.C:191
 CalcEffic.C:192
 CalcEffic.C:193
 CalcEffic.C:194
 CalcEffic.C:195
 CalcEffic.C:196
 CalcEffic.C:197
 CalcEffic.C:198
 CalcEffic.C:199
 CalcEffic.C:200
 CalcEffic.C:201
 CalcEffic.C:202
 CalcEffic.C:203
 CalcEffic.C:204
 CalcEffic.C:205
 CalcEffic.C:206
 CalcEffic.C:207
 CalcEffic.C:208
 CalcEffic.C:209
 CalcEffic.C:210
 CalcEffic.C:211
 CalcEffic.C:212
 CalcEffic.C:213
 CalcEffic.C:214
 CalcEffic.C:215
 CalcEffic.C:216
 CalcEffic.C:217