ROOT logo
/**************************************************************************
 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
 *                                                                        *
 * Author: The ALICE Off-line Project.                                    *
 * Contributors are mentioned in the code where appropriate.              *
 *                                                                        *
 * Permission to use, copy, modify and distribute this software and its   *
 * documentation strictly for non-commercial purposes is hereby granted   *
 * without fee, provided that the above copyright notice appears in all   *
 * copies and that both the copyright notice and this permission notice   *
 * appear in the supporting documentation. The authors make no claims     *
 * about the suitability of this software for any purpose. It is          *
 * provided "as is" without express or implied warranty.                  *
 **************************************************************************/

// Draw corrections of secondaries
// author: Eulogio Serradilla <eulogio.serradilla@cern.ch>

#if !defined(__CINT__) || defined(__MAKECINT__)
#include <TROOT.h>
#include <TStyle.h>
#include <TFile.h>
#include <TH1D.h>
#include <TString.h>
#include <TMath.h>
#include <TCanvas.h>
#endif

#include "B2.h"

Int_t GetNumberCols(Int_t lowbin, Int_t hibin);

TCanvas* DrawMC(TH1D** hData, TH1D** hPrim, TH1D** hMat, TH1D** hFdwn, Int_t lowbin, Int_t hibin, const TString& name, const TString& title, const TH1D* hPt, Double_t dcaxyMin, Double_t dcaxyMax);

TCanvas* DrawFit(TH1D** hData, TH1D** hDataFit, TH1D** hPrim, TH1D** hMat, TH1D** hFdwn, Int_t lowbin, Int_t hibin, const TString& name, const TString& title, const TH1D* hPt, Double_t dcaxyMin, Double_t dcaxyMax);

TCanvas* DrawGoF(TH1D** hData, TH1D** hDataFit, Int_t lowbin, Int_t hibin, const TString& name, const TString& title, const TH1D* hPt, Double_t dcaxyMin, Double_t dcaxyMax);

void DrawSec(const TString& inputFile="debug.root", const TString& tag="test", const TString& particle="Proton", Double_t ptmin=0.5, Double_t ptmax=3., Double_t dcaxyMin=-1.5, Double_t dcaxyMax=1.5)
{
//
// draw corrections of secondaries
//
	gStyle->SetPadTickX(1);
	gStyle->SetPadTickY(1);
	gStyle->SetOptStat(0);
	gStyle->SetOptTitle(1);
	
	const Int_t kNBin = 50;
	
	TFile* finput = new TFile(inputFile.Data());
	if (finput->IsZombie()) exit(1);
	
	// data and templates
	
	TH1D* hData[kNBin];
	TH1D* hDataMC[kNBin];
	TH1D* hPrim[kNBin];
	TH1D* hMat[kNBin];
	TH1D* hFdwn[kNBin];
	
	// fitted data
	
	TH1D* hDataFit[kNBin];
	TH1D* hPrimFit[kNBin];
	TH1D* hMatFit[kNBin];
	TH1D* hFdwnFit[kNBin];
	
	TH1D* hPidPt = FindObj<TH1D>(finput, tag, particle + "_PID_Pt");
	
	Int_t lowbin = hPidPt->GetXaxis()->FindFixBin(ptmin);
	Int_t hibin  = hPidPt->GetXaxis()->FindFixBin(ptmax);
	
	for(Int_t i=lowbin; i<hibin && i<kNBin; ++i)
	{
		// MC
		hData[i]   = FindObj<TH1D>(finput, tag, particle + Form("_Data_DCAxy_%02d",i));
		hDataMC[i] = FindObj<TH1D>(finput, tag, particle + Form("_SimData_DCAxy_%02d",i));
		hPrim[i]   = FindObj<TH1D>(finput, tag, particle + Form("_Prim_DCAxy_%02d",i));
		hMat[i]    = FindObj<TH1D>(finput, tag, particle + Form("_Mat_DCAxy_%02d",i));
		
		if(particle.Contains("Proton"))
		{
			hFdwn[i] = FindObj<TH1D>(finput, tag, particle + Form("_Fdwn_DCAxy_%02d",i));
		}
		else
		{
			hFdwn[i] = 0;
		}
		
		// fitted data
		hDataFit[i] = FindObj<TH1D>(finput, tag, particle + Form("_Fit_Data_DCAxy_%02d",i));
		hPrimFit[i] = FindObj<TH1D>(finput, tag, particle + Form("_Fit_Prim_DCAxy_%02d",i));
		hMatFit[i]  = FindObj<TH1D>(finput, tag, particle + Form("_Fit_Mat_DCAxy_%02d",i));
		
		if(particle.Contains("Proton"))
		{
			hFdwnFit[i] = FindObj<TH1D>(finput, tag, particle + Form("_Fit_Fdwn_DCAxy_%02d",i));
		}
		else
		{
			hFdwnFit[i] = 0;
		}
	}
	
	// draw
	
	TCanvas* c0 = 0;
	
	if(hDataMC[lowbin]!=0)
	{
		c0 = DrawMC(hDataMC, hPrim, hMat, hFdwn, lowbin, hibin, particle + ".MC", Form("MC simulation for %s",particle.Data()), hPidPt, dcaxyMin, dcaxyMax);
		c0->Update();
	}
	
	TCanvas* c1;
	
	if(hDataFit[lowbin]!=0)
	{
		c1 = DrawFit(hData, hDataFit, hPrimFit, hMatFit, hFdwnFit, lowbin, hibin, particle + ".Fit", Form("Fitted DCA for %s",particle.Data()), hPidPt, dcaxyMin, dcaxyMax);
		c1->Update();
	}
	
	TCanvas* c2;
	
	if(hDataFit[lowbin]!=0)
	{
		c2 = DrawGoF(hData, hDataFit, lowbin, hibin, particle + ".GoF", Form("GoF for %s",particle.Data()), hPidPt, dcaxyMin, dcaxyMax);
		c2->Update();
	}
}

Int_t GetNumberCols(Int_t lowbin, Int_t hibin)
{
//
// number of rows and cols for plotting the slices
// square matrix (cols = rows)
//
	return TMath::CeilNint(TMath::Sqrt(TMath::Abs(hibin - lowbin)));
}

TCanvas* DrawMC(TH1D** hData, TH1D** hPrim, TH1D** hMat, TH1D** hFdwn, Int_t lowbin, Int_t hibin, const TString& name, const TString& title, const TH1D* hPt, Double_t dcaxyMin, Double_t dcaxyMax)
{
//
// Draw MC DCA distributions for each pt bin
//
	Int_t ncol = GetNumberCols(lowbin, hibin);
	
	TCanvas* c0 = new TCanvas(name.Data(), title.Data());
	c0->Divide(ncol, ncol);
	
	for(Int_t i=lowbin; i < hibin; ++i)
	{
		c0->cd(i+1-lowbin);
		
		gPad->SetLogy();
		
		hData[i]->SetTitle(Form("%0.2f < p_{T} < %0.2f GeV/c", hPt->GetBinLowEdge(i), hPt->GetBinLowEdge(i)+hPt->GetBinWidth(i)));
		hData[i]->SetMinimum(0.2);
		
		hData[i]->SetAxisRange(dcaxyMin, dcaxyMax, "X");
		
		hData[i]->SetMarkerStyle(kFullCircle);
		hData[i]->Draw("E");
		
		if(hPrim[i] != 0)
		{
			hPrim[i]->SetLineColor(9);
			hPrim[i]->Draw("sameHist");
		}
		
		if(hMat[i] != 0)
		{
			hMat[i]->SetLineColor(46);
			hMat[i]->Draw("sameHist");
		}
		
		if(hFdwn != 0)
		if(hFdwn[i] != 0)
		{
			hFdwn[i]->SetLineColor(8);
			hFdwn[i]->Draw("sameHist");
		}
	}
	
	return c0;
}

TCanvas* DrawFit(TH1D** hData, TH1D** hDataFit, TH1D** hPrim, TH1D** hMat, TH1D** hFdwn, Int_t lowbin, Int_t hibin, const TString& name, const TString& title, const TH1D* hPt, Double_t dcaxyMin, Double_t dcaxyMax)
{
//
// Draw DCA fitted model for each pt bin in current canvas
//
	Int_t ncol = GetNumberCols(lowbin, hibin);
	
	TCanvas* c0 = new TCanvas(name.Data(), title.Data());
	c0->Divide(ncol, ncol);
	
	for(Int_t i=lowbin; i < hibin && i < ncol*ncol; ++i)
	{
		c0->cd(i+1-lowbin);
		
		gPad->SetLogy();
		
		hData[i]->SetTitle(Form("%0.2f < #it{p}_{T} < %0.2f GeV/c", hPt->GetBinLowEdge(i), hPt->GetBinLowEdge(i)+hPt->GetBinWidth(i)));
		hData[i]->SetMinimum(0.2);
		
		hData[i]->SetAxisRange(dcaxyMin, dcaxyMax, "X");
		
		hData[i]->SetMarkerStyle(kFullCircle);
		hData[i]->Draw("E");
		
		hDataFit[i]->SetLineColor(2);
		hDataFit[i]->Draw("sameHist");
		
		if(hPrim[i] != 0)
		{
			hPrim[i]->SetLineColor(9);
			hPrim[i]->Draw("sameHist");
		}
		
		if(hMat[i] != 0)
		{
			hMat[i]->SetLineColor(46);
			hMat[i]->Draw("sameHist");
		}
		
		if(hFdwn != 0)
		if(hFdwn[i] != 0)
		{
			hFdwn[i]->SetLineColor(8);
			hFdwn[i]->Draw("sameHist");
		}
	}
	
	return c0;
}

TCanvas* DrawGoF(TH1D** hData, TH1D** hDataFit, Int_t lowbin, Int_t hibin, const TString& name, const TString& title, const TH1D* hPt, Double_t dcaxyMin, Double_t dcaxyMax)
{
//
// Draw a goodness of fit for each pt bin consisting of data/fit
//
	Int_t ncol = GetNumberCols(lowbin, hibin);
	
	TCanvas* c0 = new TCanvas(name.Data(), title.Data());
	c0->Divide(ncol, ncol);
	
	for(Int_t i=lowbin; i < hibin; ++i)
	{
		c0->cd(i+1-lowbin);
		
		TH1D* hDiv = (TH1D*)hData[i]->Clone("_Div_Data_Fit_");
		hDiv->Sumw2();
		hDiv->Divide(hDataFit[i]);
		
		hDiv->SetTitle(Form("%0.2f < p_{T} < %0.2f GeV/c", hPt->GetBinLowEdge(i), hPt->GetBinLowEdge(i)+hPt->GetBinWidth(i)));
		hDiv->SetAxisRange(dcaxyMin, dcaxyMax, "X");
		hDiv->SetAxisRange(0,3,"Y");
		hDiv->SetMarkerStyle(kFullCircle);
		hDiv->DrawCopy("E");
		
		delete hDiv;
	}
	
	return c0;
}
 DrawSec.C:1
 DrawSec.C:2
 DrawSec.C:3
 DrawSec.C:4
 DrawSec.C:5
 DrawSec.C:6
 DrawSec.C:7
 DrawSec.C:8
 DrawSec.C:9
 DrawSec.C:10
 DrawSec.C:11
 DrawSec.C:12
 DrawSec.C:13
 DrawSec.C:14
 DrawSec.C:15
 DrawSec.C:16
 DrawSec.C:17
 DrawSec.C:18
 DrawSec.C:19
 DrawSec.C:20
 DrawSec.C:21
 DrawSec.C:22
 DrawSec.C:23
 DrawSec.C:24
 DrawSec.C:25
 DrawSec.C:26
 DrawSec.C:27
 DrawSec.C:28
 DrawSec.C:29
 DrawSec.C:30
 DrawSec.C:31
 DrawSec.C:32
 DrawSec.C:33
 DrawSec.C:34
 DrawSec.C:35
 DrawSec.C:36
 DrawSec.C:37
 DrawSec.C:38
 DrawSec.C:39
 DrawSec.C:40
 DrawSec.C:41
 DrawSec.C:42
 DrawSec.C:43
 DrawSec.C:44
 DrawSec.C:45
 DrawSec.C:46
 DrawSec.C:47
 DrawSec.C:48
 DrawSec.C:49
 DrawSec.C:50
 DrawSec.C:51
 DrawSec.C:52
 DrawSec.C:53
 DrawSec.C:54
 DrawSec.C:55
 DrawSec.C:56
 DrawSec.C:57
 DrawSec.C:58
 DrawSec.C:59
 DrawSec.C:60
 DrawSec.C:61
 DrawSec.C:62
 DrawSec.C:63
 DrawSec.C:64
 DrawSec.C:65
 DrawSec.C:66
 DrawSec.C:67
 DrawSec.C:68
 DrawSec.C:69
 DrawSec.C:70
 DrawSec.C:71
 DrawSec.C:72
 DrawSec.C:73
 DrawSec.C:74
 DrawSec.C:75
 DrawSec.C:76
 DrawSec.C:77
 DrawSec.C:78
 DrawSec.C:79
 DrawSec.C:80
 DrawSec.C:81
 DrawSec.C:82
 DrawSec.C:83
 DrawSec.C:84
 DrawSec.C:85
 DrawSec.C:86
 DrawSec.C:87
 DrawSec.C:88
 DrawSec.C:89
 DrawSec.C:90
 DrawSec.C:91
 DrawSec.C:92
 DrawSec.C:93
 DrawSec.C:94
 DrawSec.C:95
 DrawSec.C:96
 DrawSec.C:97
 DrawSec.C:98
 DrawSec.C:99
 DrawSec.C:100
 DrawSec.C:101
 DrawSec.C:102
 DrawSec.C:103
 DrawSec.C:104
 DrawSec.C:105
 DrawSec.C:106
 DrawSec.C:107
 DrawSec.C:108
 DrawSec.C:109
 DrawSec.C:110
 DrawSec.C:111
 DrawSec.C:112
 DrawSec.C:113
 DrawSec.C:114
 DrawSec.C:115
 DrawSec.C:116
 DrawSec.C:117
 DrawSec.C:118
 DrawSec.C:119
 DrawSec.C:120
 DrawSec.C:121
 DrawSec.C:122
 DrawSec.C:123
 DrawSec.C:124
 DrawSec.C:125
 DrawSec.C:126
 DrawSec.C:127
 DrawSec.C:128
 DrawSec.C:129
 DrawSec.C:130
 DrawSec.C:131
 DrawSec.C:132
 DrawSec.C:133
 DrawSec.C:134
 DrawSec.C:135
 DrawSec.C:136
 DrawSec.C:137
 DrawSec.C:138
 DrawSec.C:139
 DrawSec.C:140
 DrawSec.C:141
 DrawSec.C:142
 DrawSec.C:143
 DrawSec.C:144
 DrawSec.C:145
 DrawSec.C:146
 DrawSec.C:147
 DrawSec.C:148
 DrawSec.C:149
 DrawSec.C:150
 DrawSec.C:151
 DrawSec.C:152
 DrawSec.C:153
 DrawSec.C:154
 DrawSec.C:155
 DrawSec.C:156
 DrawSec.C:157
 DrawSec.C:158
 DrawSec.C:159
 DrawSec.C:160
 DrawSec.C:161
 DrawSec.C:162
 DrawSec.C:163
 DrawSec.C:164
 DrawSec.C:165
 DrawSec.C:166
 DrawSec.C:167
 DrawSec.C:168
 DrawSec.C:169
 DrawSec.C:170
 DrawSec.C:171
 DrawSec.C:172
 DrawSec.C:173
 DrawSec.C:174
 DrawSec.C:175
 DrawSec.C:176
 DrawSec.C:177
 DrawSec.C:178
 DrawSec.C:179
 DrawSec.C:180
 DrawSec.C:181
 DrawSec.C:182
 DrawSec.C:183
 DrawSec.C:184
 DrawSec.C:185
 DrawSec.C:186
 DrawSec.C:187
 DrawSec.C:188
 DrawSec.C:189
 DrawSec.C:190
 DrawSec.C:191
 DrawSec.C:192
 DrawSec.C:193
 DrawSec.C:194
 DrawSec.C:195
 DrawSec.C:196
 DrawSec.C:197
 DrawSec.C:198
 DrawSec.C:199
 DrawSec.C:200
 DrawSec.C:201
 DrawSec.C:202
 DrawSec.C:203
 DrawSec.C:204
 DrawSec.C:205
 DrawSec.C:206
 DrawSec.C:207
 DrawSec.C:208
 DrawSec.C:209
 DrawSec.C:210
 DrawSec.C:211
 DrawSec.C:212
 DrawSec.C:213
 DrawSec.C:214
 DrawSec.C:215
 DrawSec.C:216
 DrawSec.C:217
 DrawSec.C:218
 DrawSec.C:219
 DrawSec.C:220
 DrawSec.C:221
 DrawSec.C:222
 DrawSec.C:223
 DrawSec.C:224
 DrawSec.C:225
 DrawSec.C:226
 DrawSec.C:227
 DrawSec.C:228
 DrawSec.C:229
 DrawSec.C:230
 DrawSec.C:231
 DrawSec.C:232
 DrawSec.C:233
 DrawSec.C:234
 DrawSec.C:235
 DrawSec.C:236
 DrawSec.C:237
 DrawSec.C:238
 DrawSec.C:239
 DrawSec.C:240
 DrawSec.C:241
 DrawSec.C:242
 DrawSec.C:243
 DrawSec.C:244
 DrawSec.C:245
 DrawSec.C:246
 DrawSec.C:247
 DrawSec.C:248
 DrawSec.C:249
 DrawSec.C:250
 DrawSec.C:251
 DrawSec.C:252
 DrawSec.C:253
 DrawSec.C:254
 DrawSec.C:255
 DrawSec.C:256
 DrawSec.C:257
 DrawSec.C:258
 DrawSec.C:259
 DrawSec.C:260
 DrawSec.C:261
 DrawSec.C:262
 DrawSec.C:263
 DrawSec.C:264
 DrawSec.C:265
 DrawSec.C:266
 DrawSec.C:267
 DrawSec.C:268