ROOT logo
#include "TH1.h"
#include "TH3.h"
#include "TF1.h"
#include "TF3.h"
#include "TLegend.h"
#include "TCanvas.h"
#include "TTree.h"
#include "TFile.h"
#include "TLine.h"
#include "TPaveText.h"
#include "TStyle.h"
#include "TROOT.h"
#include "TSystem.h"
#include "TNtuple.h"
#include "TArrow.h"
#include "TGraphErrors.h"
#include "TVirtualFitter.h"
#include "TMath.h"
#include "TMinuit.h"
#include "TSpectrum.h"

// RooFit
#include "RooGenericPdf.h"
#include "RooFitResult.h"
#include "RooRealVar.h"


///////////////////////////
// Default Options (Global)
///////////////////////////

//________________
// container check

// display container contents
Bool_t IsShowContOn = kFALSE;
// check bin error
Bool_t IsCheckBinError = kFALSE;

//_______________________
// User setting variables

// enumerate variables
enum { NEVENT, Y, PT, IMASS, TRIG, PTMU, PMU, TRIGSIDE, RABSMU, CHARGE, ETAMU, THABSMU, VZMU, DCAMU }; 

// set efficiency matrix bin 
const Char_t *var0name="y";
const Char_t *var1name="pt";
const Int_t var0bin = 5;
const Int_t var1bin = 7;
Double_t var0lim[var0bin+1] = {-4.0,-3.7,-3.4,-3.1,-2.8,-2.5};
Double_t var1lim[var1bin+1] = {0,2,4,6,8,10,15,20};
const Double_t binnorm = (Double_t)5/2;	// for the last two pt bin

//______________
// Analysis cuts

// Use pt trigger cut
Bool_t IsHpt = kTRUE;

//_______________
// fit parameters 
Bool_t UseRooFit = kFALSE;
if(UseRooFit) { using namespace RooFit; }

// rebinning
Bool_t rebinned = kTRUE;
// 3 gauss for UPSILON family
Char_t *resname = "Upsilon";
Double_t fitrange[2] = {7, 12};		// fit range min, max
Double_t usrrange[2] = {7, 12}; 	// set range user
// setting fit paramter : single exponential(par[2]) + 3 gaussian(par[9])
// param[11] = { A, B, N_Y(1S), mean_Y(1S), sigma_Y(1S), N_Y(2S), mean_Y(2S), sigma_Y(2S), N_Y(3S), mean_Y(3S), sigma_Y(3S)
Double_t param[11] = {3000,-0.3,6.6,9.46,0.230,1.8,10.023,0.230,1,10.355,0.230};
// fix parameter switch
Bool_t IsFixSigma = kTRUE;

////////////////////////////
// UPSILON ANALYSIS MACRO //
////////////////////////////

//______________________________________________________

Bool_t upsilonCORRFW(const char *dataname,								// input file name
										 const Bool_t IsCreateEffMat=kFALSE,	// switch for efficiency matrix creation
										 const Bool_t IsExtSig=kFALSE,					// switch for fitting
										 const Bool_t IsDoCorrection=kFALSE		// switch for correction
										 )
{
// print out startup messages
	printf("******************************************************\n");
	printf("     Starting Correction Framework for Upsilon...\n");
	printf("******************************************************\n");
	printf("\nChecking options...\n");
	printf("Create new efficiency matrix...%s\n",IsCreateEffMat ? "yes":"no");
	printf("Extract Signal...%s\n",IsExtSig ? "yes":"no");
	printf("Do correction...%s\n",IsDoCorrection ? "yes":"no");
	printf("Checking done...\n");

// output files
	char *file_effmat = "";	// efficiency matrix
	char *file_datmat = ""; // data matrix
	char *file_result = ""; // correction result 

// call a fuction to construct efficiency matrix
	if(IsCreateEffMat) file_effmat = createEffMat(dataname);
	else {	// use default efficiency matrix
		//file_effmat = "effCont_mat_residual_aod_50k_pdccut.root";
		file_effmat = "efficiency.container.CFMuonResUpsilon.local.AOD.MC.root";
		printf("Default efficiency matrix: %s\n",file_effmat);
	}

// call a function to perform fit to extract #nignal
	if(IsExtSig) file_datmat = extSignal(dataname);
	else {
		file_datmat = "data.container.CFMuonResUpsilon.PDC09.local.AOD.MC.root";
		printf("Default data container: %s\n",file_datmat);
	}

// call a function to perform a correction on data
	if(IsDoCorrection) file_result = doCorrection(dataname, file_effmat, file_datmat);

// print out closing messages
	printf("******************************************************\n");
	printf("    Finishing Correction Framework for Upsilon...\n");
	printf("******************************************************\n");
	
// display results
	printf("\n here are results!!\n");
	printf("efficiency container is %s\n",file_effmat);
	printf("data container is %s\n",file_datmat);
	printf("correction result file is %s\n",file_result);

	return kTRUE;
}
  
//////////////////////////////
// Create Efficiency matrix //
//////////////////////////////

char* createEffMat(const char *dataname)
{

// print out starting messages
	printf("\nNow starting efficiency matrix creation...\n");

	LoadLib();

// open input container
	printf("Opening container from %s...",dataname);
  TFile *file = new TFile(dataname);	
	AliCFContainer *cont = (AliCFContainer*) (file->Get("container"));
	printf("done\n");

// print out container step and variables
	//cont->Print();
// get N step
	Int_t nstep = cont->GetNStep();
// get N variables
	Int_t nvar = cont->GetNVar();
	printf("Nstep: %d\n", nstep);
	printf("Nvar: %d\n", nvar);
// casting constant for use of array
	const Int_t stepnum = nstep;
	const Int_t varnum = nvar;	
// set variable: bin, min and max
	Double_t varbin[varnum]={ 5,  15, 100, 300, 40, 100, 100, 4, 300, 6,  100, 200, 100, 100 };
	Double_t varmin[varnum]={ 0,  -4,   0,   0,  0,   0,   0, 0,  15, 0, -4.5, 170, -50,   0 };
	Double_t varmax[varnum]={ 5,-2.5, 100, 300,  4, 100, 100, 4,  90, 6, -2.0, 180,  50, 100 };
// set variable epsilon
	Double_t varEpsilon[varnum];
	for (Int_t ie=0; ie<varnum; ie++) varEpsilon[ie] = (varmax[ie]-varmin[ie])/(100*varbin[ie]);
// Display container contents
	if(IsShowContOn) {
		TCanvas *csc[stepnum];

		for(Int_t i=0; i<2; i++) {
			csc[i] = new TCanvas(Form("csc%d",i),Form("container(%d)",i),0,0,1000,600);
			csc[i]->Divide(nvar/2,2);
			for(Int_t j=0; j<nvar; j++) {
				csc[i]->cd(j+1); cont->ShowProjection(j,i)->Draw();
			}
		}
	}
	
//___________
// GridSparse 

// GridSparse from container
	AliCFGridSparse *genSpar = (AliCFGridSparse*)cont->GetGrid(0);		// GEN
	AliCFGridSparse *recSpar = (AliCFGridSparse*)cont->GetGrid(1);		// REC 

// variables for efficiency matrix
	const Int_t nStep=2; 													// number of steps: MC and REC
	const Int_t nVar=2;														// number of variables: var0 and var1
	const Int_t var0dim=var0bin;									// number of bin in var0 dimension of efficiency matrix
	const Int_t var1dim=var1bin; 									// number of bin in var1 dimension of efficiency matrix
	const Int_t binMat[nVar]={var0dim,var1dim};		// summary array

// create new container for efficiency 
	AliCFContainer *effCont = new AliCFContainer("effCont","Upsilon efficiency matrix",nStep,nVar,binMat);
	effCont->SetBinLimits(0,var0lim);
	effCont->SetBinLimits(1,var1lim);
// create new gridsparse for efficiency
// gridsparse of generated events
	AliCFGridSparse *genGrid = new AliCFGridSparse("genGrid","Generated Upsilon matrix",nVar,binMat);
	genGrid->SetBinLimits(0,var0lim);
	genGrid->SetBinLimits(1,var1lim);
// gridsparse of reconstructed events
	AliCFGridSparse *recGrid = new AliCFGridSparse("recGrid","Reconstructed Upsilon matrix",nVar,binMat);
	recGrid->SetBinLimits(0,var0lim);
	recGrid->SetBinLimits(1,var1lim);
	
//____________________
// Loop on matrix bins

// cut on single muon
// theta cut
	varmin[THABSMU] = 171+varEpsilon[THABSMU];
	varmax[THABSMU] = 178-varEpsilon[THABSMU];
// eta cut
	varmin[ETAMU] = -4.0+varEpsilon[ETAMU];
	varmax[ETAMU] = -2.5-varEpsilon[ETAMU];
// rabs cut
	//varmin[RABSMU] = 17.6+varEpsilon[RABSMU];
	//varmin[RABSMU] = 80.0-varEpsilon[RABSMU];

// canvas for fitting
	TCanvas *cfit = new TCanvas("cfit","cfit",0,0,1600,1125);
	cfit->Divide(7,5);

	printf("Loop on matrix bins...");
	for(Int_t bin0=0; bin0<var0dim; bin0++) {			// loop on rapidity (var0dim)
		varmin[Y] = var0lim[bin0]+varEpsilon[Y];
		varmax[Y] = var0lim[bin0+1]-varEpsilon[Y];
		printf("%s range: %.2f < %s < %.2f\n",var0name,varmin[Y],var0name,varmax[Y]);

		for(Int_t bin1=0; bin1<var1dim; bin1++) {		// loop on pt (var1dim)
			varmin[PT] = var1lim[bin1]+varEpsilon[PT];
			varmax[PT] = var1lim[bin1+1]-varEpsilon[PT];
			printf("%s range: %.2f < %s < %.2f\n",var1name,varmin[PT],var1name,varmax[PT]);

			TH1D* gmass = (TH1D*)genSpar->Slice(IMASS,-1,-1,varmin,varmax);
			TH1D* rmass = (TH1D*)recSpar->Slice(IMASS,-1,-1,varmin,varmax);

			cfit->cd((bin0*7)+bin1+1);
			if(rebinned) rmass->Rebin(2);
			// fit reconstructed resonances to get the #_signal
			// declare array to retreive fit results
			Double_t par[4];
			Double_t *parErr;
			// landau (x) gauss : #_signal,mean,sigma,width
			TF1 *func = new TF1("func",gaussXlandau,8,10,4);
			func->SetParameters(30,9.46,0.09,0.004);
			// simple gauss
			//TF1 *func = new TF1("func",normGauss,8,10,3);
			//func->SetParameters(30,9.46,0.09);
			func->SetLineColor(kBlue);
			// fit with likelihood method
			rmass->Fit(func,"0L");
			// retreive fit parameters
			func->GetParameters(&par[0]);
			// fit second times
			func->SetParameters(par);
			rmass->Fit(func,"RL+");
			// retreive fit parameters
			func->GetParameters(&par[0]);
			parErr = func->GetParErrors();
			rmass->Draw("E");
			cfit->Update();

			Double_t genValue = bin1<5 ? gmass->Integral():gmass->Integral()/binnorm;
			Double_t genValueErr = TMath::Sqrt(genValue);
			Double_t recValue = bin1<5 ? par[0]/0.1:(par[0]/0.1)/binnorm;
			Double_t recValueErr = bin1<5 ? parErr[0]/0.1:(parErr[0]/0.1)/binnorm;

			printf("genValue = %.0f +/- %.0f\n",genValue,genValueErr);
			printf("recValue = %.0f +/- %.0f\n",recValue,recValueErr);

			Int_t binCell[nVar]={bin0+1,bin1+1};
			genGrid->SetElement(binCell,genValue);
			genGrid->SetElementError(binCell,genValueErr);
			recGrid->SetElement(binCell,recValue);
			recGrid->SetElementError(binCell,recValueErr);
		}
	}
	printf("done\n");
	printf("saving fit plots as %s...",Form("recfitplots.%s",dataname));
	cfit->SaveAs(Form("recfitplots.%s",dataname));
	printf("done\n");


	printf("fill efficiency container...");
//__________________________
// fill efficiency container
	effCont->SetGrid(0,genGrid);
	effCont->SetGrid(1,recGrid);
	TH1D *gvar0 = effCont->ShowProjection(0,0);
	TH1D *gvar1 = effCont->ShowProjection(1,0);
	TH1D *rvar0 = effCont->ShowProjection(0,1);
	TH1D *rvar1 = effCont->ShowProjection(1,1);
	TCanvas *cvars = new TCanvas("cvars","variables",0,0,800,800);
	cvars->Divide(2,2);
	cvars->cd(1); gvar0->Draw();
	cvars->cd(2); gvar1->Draw();
	cvars->cd(3); rvar0->Draw();
	cvars->cd(4); rvar1->Draw();
	printf("done\n");
// save efficiency container 
	char *outfile = Form("efficiency.%s",dataname);
	printf("saving efficiency container as %s...",outfile);
	effCont->Save(outfile);
	printf("done\n");

//_________________________
// create efficiency matrix
	printf("creating efficiency matrix...");
	AliCFEffGrid *matEff = new AliCFEffGrid("matEff",Form("%s efficiency matrix",resname),*effCont);
	printf("done\n");
// calcualte efficiency
	printf("calculating efficiency...");
	matEff->CalculateEfficiency(1,0);			// REC over MC
	printf("done\n");

//________________________
// display efficiency plot
	TCanvas *ceff = new TCanvas("ceff",Form("%s efficiency",resname),0,0,1200,400);
	ceff->Divide(3,1);
// efficiency over var0
	ceff->cd(1);
	TH1D *effvar0 = matEff->Project(0);
	effvar0->SetName(Form("eff_%s",var0name));
	effvar0->SetMinimum(0); effvar0->SetMaximum(1);
	effvar0->SetTitle(Form("%s efficiency(%s)",resname,var0name));
	effvar0->GetXaxis()->SetTitle(var0name);
	effvar0->GetYaxis()->SetTitle("Efficiency");
	effvar0->Draw("error");
// efficiency over var1
	ceff->cd(2);
	TH1D *effvar1 = matEff->Project(1);
	effvar1->SetName(Form("eff_%s",var1name));
	effvar1->SetMinimum(0); effvar1->SetMaximum(1);
	effvar1->SetTitle(Form("%s efficiency(%s)",resname,var1name));
	effvar1->GetXaxis()->SetTitle(var1name);
	effvar1->GetYaxis()->SetTitle("Efficiency");
	effvar1->Draw("error");
// 2-dimensional efficiency plot (var0, var1)
	ceff->cd(3);
	TH1D *eff2D = matEff->Project(0,1);
	eff2D->SetName("eff_2D");
	eff2D->SetMinimum(0); eff2D->SetMaximum(1);
	eff2D->SetTitle(Form("%s efficiency(%s,%s)",resname,var0name,var1name));
	eff2D->GetXaxis()->SetTitle(var0name);
	eff2D->GetYaxis()->SetTitle(var1name);
	eff2D->GetZaxis()->SetTitle("Efficiency");
	eff2D->Draw("colz");

	printf("\nEfficiency matrix created...\n");
	return outfile;
}

////////////////////
// Extract Signal //
////////////////////

char* extSignal(const char *dataname)
{

// print out starting messages
	printf("\nNow extracting #signal by fitting...\n");

	LoadLib();

// open input container
	printf("Opening container from %s...",dataname);
  TFile *file = new TFile(dataname);	
	AliCFContainer *cont = (AliCFContainer*) (file->Get("container"));
	printf("done\n");

// check dataname : PDC, LHC or Unknown (1, 2, 0)
	Int_t dFlag = 0;
	if(strstr(dataname,"PDC09")) { printf("this is PDC09 data...\n"); dFlag = 1; }
	else if(strstr(dataname,"LHC")) { printf("this is LHC data...\n"); dFlag = 2; }
	else { printf("unknown data...\n"); dFlag = 0; }

// print out container step and variables
// get N step
	Int_t nstep = cont->GetNStep();
// get N variables
	Int_t nvar = cont->GetNVar();
	printf("Nstep: %d\n", nstep);
	printf("Nvar: %d\n", nvar);
// casting constant for use of array
	const Int_t stepnum = nstep;
	const Int_t varnum = nvar;	
// set variable: bin, min and max
	Double_t varbin[varnum]={ 5,  15, 100, 300, 40, 100, 100, 4, 300, 6,  100, 200, 100, 100 };
	Double_t varmin[varnum]={ 0,  -4,   0,   0,  0,   0,   0, 0,  15, 0, -4.5, 170, -50,   0 };
	Double_t varmax[varnum]={ 5,-2.5, 100, 300,  4, 100, 100, 4,  90, 6, -2.0, 180,  50, 100 };
// set variable epsilon
	Double_t varEpsilon[varnum];
	for (Int_t ie=0; ie<varnum; ie++) varEpsilon[ie] = (varmax[ie]-varmin[ie])/(100*varbin[ie]);
// Display container contents
	if(IsShowContOn) {
		TCanvas *csc[stepnum];

		for(Int_t i=0; i<nstep; i++) {
			csc[i] = new TCanvas(Form("csc%d",i),Form("container(%d)",i),0,0,1000,600);
			csc[i]->Divide(nvar/2,2);
			for(Int_t j=0; j<nvar; j++) {
				csc[i]->cd(j+1); cont->ShowProjection(j,i)->Draw();
			}
		}

/*
		TH1D *hCheckMass = cont->ShowProjection(IMASS,1);
		Int_t nbins = hCheckMass->GetXaxis()->GetNbins();
		printf("nbins = %d\n", nbins);
		for(i=1;i<=nbins;i++) printf("bin %d: %f - %f\n",i, hCheckMass->GetBinError(i), TMath::Sqrt(hCheckMass->GetBinContent(i)));
		TCanvas *ctemp = new TCanvas("ctemp","ctemp",0,0,500,500);
		hCheckMass->Draw();
		*/
	}
	
//___________
// GridSparse 

// GridSparse from container
	AliCFGridSparse *genSpar = (AliCFGridSparse*)cont->GetGrid(0);		// GEN for PDC09
	AliCFGridSparse *cintSpar = (AliCFGridSparse*)cont->GetGrid(1);		// REC for PDC09 || CINT && !CMUS
	AliCFGridSparse *cmusSpar = (AliCFGridSparse*)cont->GetGrid(4);		// CMUS only

// variables for data matrix
	const Int_t nStep=2; 													// number of steps: REC(CINT && !CMUS) and CMUS only
	const Int_t nVar=2;														// number of variables: var0 and var1
	const Int_t var0dim=var0bin;									// number of bin in var0 dimension of data matrix
	const Int_t var1dim=var1bin; 									// number of bin in var1 dimension of data matrix
	const Int_t binMat[nVar]={var0dim,var1dim};		// summary array

// create new container for data
	AliCFContainer *dataCont = new AliCFContainer("dataCont","Upsilon data matrix",nStep,nVar,binMat);
	dataCont->SetBinLimits(0,var0lim);
	dataCont->SetBinLimits(1,var1lim);
// create new gridsparse for data
// gridsparse of REC (or CINT && !CMUS) events
	AliCFGridSparse *cintGrid = new AliCFGridSparse("cintGrid","Upsilon data matrix(CINT)",nVar,binMat);
	cintGrid->SetBinLimits(0,var0lim);
	cintGrid->SetBinLimits(1,var1lim);
// gridsparse of CMUS only events
	AliCFGridSparse *cmusGrid = new AliCFGridSparse("cmusGrid","Upsilon matrix(CMUS)",nVar,binMat);
	cmusGrid->SetBinLimits(0,var0lim);
	cmusGrid->SetBinLimits(1,var1lim);
	
//_____________________
// Loops on matrix bins 
	
	if(dFlag == 2) { // LHC data
	// event statistics
		for(Int_t i=0; i<5; i++) {
			varmin[NEVENT] = i+varEpsilon[NEVENT];
			varmax[NEVENT] = i+1-varEpsilon[NEVENT];
			Int_t nEvtInt = ((TH1D*)cintSpar->Slice(IMASS,-1,-1,varmin,varmax))->Integral();
			Int_t nEvtMus = ((TH1D*)cmusSpar->Slice(IMASS,-1,-1,varmin,varmax))->Integral();
			printf("#Event (%d) = %d(CINT1 = %d, CMUS1 = %d)\n",i,nEvtInt+nEvtMus,nEvtInt,nEvtMus);
		}
	
	// common cut on events
	// Rabs cut
		varmin[RABSMU] = 17.6+varEpsilon[RABSMU]; varmax[RABSMU] = 80.0-varEpsilon[RABSMU];
	// acceptance cut on dimuon
		varmin[Y] = -4+varEpsilon[Y];	varmax[Y] = -2.5-varEpsilon[Y];
	
	// canvas for display
		//TCanvas *cmassi = new TCanvas("cmassi","mass distribution(CINT)",0,0,900,600);
		//cmassi->Divide(3,2);
		//TCanvas *cmassm = new TCanvas("cmassm","mass distribution(CMUS)",0,0,900,600);
		//cmassm->Divide(3,2);
	
		TH1D *hmassi[3], *hmassm[3];
	
		// physics selection (0: off, 1: on)
		for(Int_t i=0;i<2;i++) {
			// track-trigger matching
			for(Int_t j=0;j<3;j++) {
				if(IsHpt) {
					switch (j) {
						case 0:
							varmin[TRIG] = 0+varEpsilon[TRIG];
							break;
						case 1:
							varmin[TRIG] = 3+varEpsilon[TRIG];
							break;
						case 2:
							varmin[TRIG] = 3.3+varEpsilon[TRIG];
							break;
					}
				}
				else {
					switch (j) {
						case 0:
							varmin[TRIG] = 0+varEpsilon[TRIG];
							break;
						case 1:
							varmin[TRIG] = 2+varEpsilon[TRIG];
							break;
						case 2:
							varmin[TRIG] = 2.2+varEpsilon[TRIG];
							break;
					}
				}
				// (CINT && !CMUS)
				varmin[NEVENT] = i+1+varEpsilon[NEVENT]; varmax[NEVENT] = i+2-varEpsilon[NEVENT];
				hmassi[j] = (TH1D*)cintSpar->Slice(IMASS,-1,-1,varmin,varmax);
				hmassi[j]->GetXaxis()->SetRangeUser(usrrange[0],usrrange[1]);
				//printf("#Event (CINT1B-%dmatch,hpt) = %d\n",j,hmassi[j]->Integral());
				//cmassi->cd(i*3+j+1);
				//hmassi[j]->Draw();
	
				// (CMUS only)
				varmin[NEVENT] = i+3+varEpsilon[NEVENT]; varmax[NEVENT] = i+4-varEpsilon[NEVENT];
				hmassm[j] = (TH1D*)cmusSpar->Slice(IMASS,-1,-1,varmin,varmax);
				if(rebinned) hmassm[j]->Rebin(4);
				hmassm[j]->GetXaxis()->SetRangeUser(usrrange[0],usrrange[1]);
				//printf("#Event (CMUS1B-%dmatch,hpt) = %d\n",j,hmassm[j]->Integral());
				//cmassm->cd(i*3+j+1);
				//hmassm[j]->Draw();
			}
		}
	
		// draw N matching mass plot and fit
		TCanvas *c1[3];
		TPaveText *info;
	
		Char_t *ptext[6];
	
		for(Int_t i=0; i<3; i++) {
			
			Double_t par[15] = {0, };
			Double_t *parErr = 0;;
			Double_t chi2=0, ndf=0, mean=0, mean_err=0, sigma=0, sigma_err=0, imin=0, imax=0, norm=0, norm_err=0, nsig=0, nsig_err=0,nbkg=0;
	
			//cout << "Bin cont. = " << hmassm[i]->GetBinContent(20) << " +- " << hmassm[i]->GetBinError(20) << endl;
			//cout << "sqrt(Bin cont.) = " << TMath::Sqrt(hmassm[i]->GetBinContent(20)) << endl;
	
			TF1 *bkg = new TF1("bkg",expo,fitrange[0],fitrange[1],2);
 			bkg->SetParameters(param[0],param[1]);
			hmassm[i]->Fit(bkg,"NR");
			bkg->GetParameters(&param[0]);
	
			TF1 *gl = new TF1("gl",global,fitrange[0],fitrange[1],11);
			gl->SetParameters(&param[0]);
	
			// fix yield 2S and 3S normalized from CMS result
			gl->FixParameter(5,1.8); gl->FixParameter(8,1);
			// fix mean from PDG
			gl->FixParameter(6,param[6]); gl->FixParameter(9,param[9]);
			// fix sigma from simulation with current alignment(v2)
			if(IsFixSigma) {gl->FixParameter(4,param[4]); gl->FixParameter(7,param[7]); gl->FixParameter(10,param[10]);}
			else {
				if(i!=2) {gl->SetParLimits(4,param[4]-0.2,param[4]+0.2);gl->FixParameter(7,param[7]); gl->FixParameter(10,param[10]);}
				else {gl->SetParLimits(4,param[4]-0.2,param[4]+0.2);gl->FixParameter(7,param[7]); gl->FixParameter(10,param[10]);}
			}
	
			gl->SetLineColor(kBlue);
			gl->SetLineWidth(2);
			hmassm[i]->Fit(gl,"NR");
			gl->GetParameters(&param[0]);
			parErr = gl->GetParErrors();
	
 	 		bkg->SetParameters(param[0],param[1]);
			bkg->SetParErrors(parErr);
			bkg->SetLineColor(kRed);
			bkg->SetLineStyle(2);
			bkg->SetLineWidth(2);
	
			TF1 *sig = new TF1("sig",normGauss3,fitrange[0],fitrange[1],9);
			sig->SetParameters(param[2],param[3],param[4],param[5],param[6],param[7],param[8],param[9],param[10]);
			sig->SetParErrors(&parErr[2]);
			sig->SetLineColor(kRed);
			sig->SetLineWidth(2);
	
			TF1 *sig1 = new TF1("sig1",normGauss,fitrange[0],fitrange[1],3);
			sig1->SetParameters(param[2],param[3],param[4]);
			sig1->SetParErrors(&parErr[2]);
			sig1->SetLineColor(kMagenta);
			sig1->SetLineWidth(2);
	
			TF1 *sig2 = new TF1("sig2",normGauss,fitrange[0],fitrange[1],3);
			sig2->SetParameters(param[5],param[6],param[7]);
			sig2->SetParErrors(&parErr[5]);
			sig2->SetLineColor(kViolet);
			sig2->SetLineWidth(2);
	
			TF1 *sig3 = new TF1("sig3",normGauss,fitrange[0],fitrange[1],3);
			sig3->SetParameters(param[8],param[9],param[10]);
			sig3->SetParErrors(&parErr[8]);
			sig3->SetLineColor(kPink);
			sig3->SetLineWidth(2);
	
			c1[i] = new TCanvas(Form("c1%d",i),Form("c1%d",i),0,0,800,800);
	
			c1[i]->cd(1); //c1[i]->cd(1)->SetLogy();
			hmassm[i]->SetMinimum(0); 
			hmassm[i]->DrawCopy();
			sig->Draw("same");
			//bkg_2->Draw("same");
			bkg->Draw("same");
			gl->Draw("same");
			sig1->Draw("same");
			sig2->Draw("same");
			sig3->Draw("same");
			
			chi2 = gl->GetChisquare();
			ndf = gl->GetNDF();
			mean = sig->GetParameter(1);
			mean_err = sig->GetParError(1);
			sigma = sig->GetParameter(2);
			sigma_err = sig->GetParError(2);
			imin = mean-2*sigma;
			imax = mean+2*sigma;
			nsig = sig->Integral(imin, imax);
			nsig_err = TMath::Sqrt(nsig);
			//nsig = sig->GetParameter(0);
			//nsig_err = sig->GetParError(0);
			if(rebinned) {
				norm = sig->GetParameter(0)/0.2;
				norm_err = sig->GetParError(0)/0.2;
				nsig = sig1->Integral(imin,imax)/0.2;
				nsig_err = TMath::Sqrt(nsig);
				nbkg = bkg->Integral(imin, imax)/0.2;
			}
			else {
				norm = sig->GetParameter(0)/0.1;
				norm_err = sig->GetParError(0)/0.1;
				nsig = sig1->Integral(imin,imax)/0.1;
				nsig_err = TMath::Sqrt(nsig);
				nbkg = bkg->Integral(imin, imax)/0.1;
			}
			
			TPaveText *info = new TPaveText(0.58,0.48,0.96,0.70,"brNDC");
			info->InsertText(Form("N_{%s} = %.0f #pm %.0f",resname, norm, norm_err));
	 		info->InsertText(Form("Mass = %.3f #pm %.3f GeV/c^{2}", mean, mean_err));
	 		if(IsFixSigma) info->InsertText(Form("#sigma_{%s} = %.0f (fixed) MeV/c^{2}",resname,sigma*1000));
	 		else info->InsertText(Form("#sigma_{%s} = %.0f #pm %.0f MeV/c^{2}",resname,sigma*1000, sigma_err*1000));
			info->InsertText(Form("S/B (2#sigma)= %.3f", nsig/nbkg));
			info->InsertText(Form("Significance (2#sigma) = %.3f" , nsig/TMath::Sqrt(nsig+nbkg)));
	
	 		printf("%d #geq trigger matching(%s)\n",i,IsHpt ? "Hpt" : "Lpt");
	 		printf("#Chi^{2}/ndf = %.3f\n", chi2/ndf);
			printf("N_Upsilon = %.0f +- %.0f\n",norm, norm_err);
			printf("S = %f, B = %f, S/B = %f, sqrt(S+B) = %f, S/sqrt(S+B) = %f\n", nsig, nbkg, nsig/nbkg, TMath::Sqrt(nsig+nbkg), nsig/TMath::Sqrt(nsig+nbkg));
			
			info->SetFillColor(0);
			info->Draw("same");
	
	  	TLegend *leg = new TLegend(0.5928571,0.7442857,0.96,0.9542857,NULL,"brNDC");
 			leg->SetBorderSize(0);
 			leg->SetTextFont(62);
 			leg->SetLineColor(1);
 			leg->SetLineStyle(1);
	  	leg->SetLineWidth(1);
 	  	leg->SetFillColor(0);
 	  	leg->SetFillStyle(1001);
	
   		TLegendEntry *entry=leg->AddEntry(hmassm[i],"Data","lpf");
  		entry->SetFillStyle(1001);
 			entry->SetLineColor(1);
	 		entry->SetLineStyle(1);
 			entry->SetLineWidth(1);
   		entry->SetMarkerColor(1);
   		entry->SetMarkerStyle(8);
   		entry->SetMarkerSize(1);
	
   		entry=leg->AddEntry(sig,"Signal only","lpf");
   		entry->SetFillColor(19);
   		entry->SetLineColor(kRed);
   		entry->SetLineStyle(1);
   		entry->SetLineWidth(2);
   		entry->SetMarkerColor(1);
   		entry->SetMarkerStyle(1);
   		entry->SetMarkerSize(1);
				
   		entry=leg->AddEntry(bkg,"Background only","lpf");
   		entry->SetFillColor(19);
   		entry->SetLineColor(kRed);
   		entry->SetLineStyle(2);
   		entry->SetLineWidth(2);
   		entry->SetMarkerColor(1);
   		entry->SetMarkerStyle(1);
   		entry->SetMarkerSize(1);

   		entry=leg->AddEntry(gl,"Signal + Background","lpf");
   			entry->SetFillColor(19);
   		entry->SetLineColor(kBlue);
   		entry->SetLineStyle(1);
   		entry->SetLineWidth(2);
   		entry->SetMarkerColor(1);
   		entry->SetMarkerStyle(1);
   		entry->SetMarkerSize(1);
   		leg->Draw();
		} 
	}	// dFlag ==2 (LHC data)

	if(dFlag == 1) {	// PDC09 
	// cut on single muon
	// theta cut
		//varmin[THABSMU] = 171+varEpsilon[THABSMU];
		//varmax[THABSMU] = 178-varEpsilon[THABSMU];
	// eta cut
		//varmin[ETAMU] = -4.0+varEpsilon[ETAMU];
		//varmax[ETAMU] = -2.5-varEpsilon[ETAMU];

	// canvas for fitting
		TCanvas *cfit = new TCanvas("cfit","cfit",0,0,1600,1125);
		cfit->Divide(7,5);


		printf("Loop on matrix bins...");
		for(Int_t bin0=0; bin0<var0dim; bin0++) {			// loop on rapidity (var0dim)
			varmin[Y] = var0lim[bin0]+varEpsilon[Y];
			varmax[Y] = var0lim[bin0+1]-varEpsilon[Y];
			printf("%s range: %.2f < %s < %.2f\n",var0name,varmin[Y],var0name,varmax[Y]);
	
			for(Int_t bin1=0; bin1<var1dim; bin1++) {		// loop on pt (var1dim)
				varmin[PT] = var1lim[bin1]+varEpsilon[PT];
				varmax[PT] = var1lim[bin1+1]-varEpsilon[PT];
				printf("%s range: %.2f < %s < %.2f\n",var1name,varmin[PT],var1name,varmax[PT]);

				cfit->cd((bin0*7)+bin1+1);
	
				TH1D* gmass = (TH1D*)genSpar->Slice(IMASS,-1,-1,varmin,varmax);
				TH1D* rmass = (TH1D*)cintSpar->Slice(IMASS,-1,-1,varmin,varmax);
				rmass->Rebin(2);
				gmass->GetXaxis()->SetRangeUser(usrrange[0],usrrange[1]);
				rmass->GetXaxis()->SetRangeUser(usrrange[0],usrrange[1]);

				Double_t genValue, genValueErr, recValue, recValueErr;
				if(!UseRooFit) {
				// fit reconstructed resonances to get the #_signal
				// declare array to retreive fit results
				Double_t param_pdc[12] = {1,1,1,9.46,0.1,0.04,1,10.023,0.1,1,10.38,0.1};
				Double_t *parErr;

				// fit functions
				TF1 *func_sig[3], *func_bkg, *func_gl;

				//___________
				// background
				func_bkg = new TF1("func_bkg",expo,fitrange[0],fitrange[1],2);
				func_bkg->SetParameters(param_pdc[0],param_pdc[1]);
				func_bkg->SetLineColor(kRed);
				func_bkg->SetLineStyle(2);
				func_bkg->SetLineWidth(2);
				rmass->Fit(func_bkg,"NR");
				func_bkg->GetParameters(&param_pdc[0]);

				//_______
				// signal
				// Y(2S)+Y(3S)
				func_sig[1] = new TF1("func_sig2",normGauss2,9.80,10.60,6);
				func_sig[1]->SetParameters(param_pdc[6],param_pdc[7],param_pdc[8],param_pdc[9],param_pdc[10],param_pdc[11]);
				func_sig[1]->SetLineColor(kMagenta);
				func_sig[1]->SetLineWidth(2);
				rmass->Fit(func_sig[1],"NR");
				func_sig[1]->GetParameters(&param_pdc[6]);

/*
				func_sig[0] = new TF1("func_sig1",gaussXlandau,9.20,9.70,4);
				func_sig[0]->SetParameters(param_pdc[2],param_pdc[3],param_pdc[4],param_pdc[5]);
				func_sig[0]->SetLineColor(kPink);
				func_sig[0]->SetLineWidth(2);
				rmass->Fit(func_sig[0],"NR");
				func_sig[0]->GetParameters(&param_pdc[2]);

				func_sig[2] = new TF1("func_sig3",normGauss,10.32,10.57,3);
				func_sig[2]->SetParameters(param_pdc[9],param_pdc[10],param_pdc[11]);
				func_sig[2]->SetLineColor(kViolet);
				func_sig[2]->SetLineWidth(2);
				rmass->Fit(func_sig[2],"0");
				func_sig[2]->SetParameters(param_pdc[9],param_pdc[10],param_pdc[11]);
				rmass->Fit(func_sig[2],"R");
				func_sig[2]->GetParameters(&param_pdc[9]);
				*/

				// Y(1S)+Y(2S)+Y(3S)+Background
				func_gl = new TF1("func_gl",global_pdc,fitrange[0],fitrange[1],12);
				func_gl->SetParameters(param_pdc);
				func_gl->SetParLimits(3,9.30,9.60);
				//func_gl->SetParLimits(4,0.05,0.15);
				func_gl->SetParLimits(7,9.95,10.08);
				//func_gl->SetParLimits(8,0.05,0.15);
				func_gl->SetParLimits(10,10.32,10.57);
				//func_gl->SetParLimits(11,0.05,0.15);
				func_gl->SetLineColor(kBlue);
				func_gl->SetLineWidth(2);
				rmass->Fit(func_gl,"NR");
				func_gl->GetParameters(&param_pdc[0]);
				parErr = func_gl->GetParErrors();

				rmass->Draw("E");
				func_bkg->Draw("same");

				func_gl->Draw("same");
				cfit->Update();
	
				genValue = bin1<5 ? gmass->Integral():gmass->Integral()/binnorm;
				genValueErr = TMath::Sqrt(genValue);
				recValue = bin1<5 ? param_pdc[2]/0.1:(param_pdc[2]/0.1)/binnorm;
				recValueErr = bin1<5 ? parErr[2]/0.1:(parErr[2]/0.1)/binnorm;
				}
				else {		// RooFit
					// Define RooFit variable of the x axis value
					RooRealVar mass("mass","Mass [GeV/c^{2}]",fitrange[0],fitrange[1]);

					// Convert TH1D class to RooFit
					RooDataHist hst("hst","hst",RooArgList(mass),rmass);

					// Define RooFit variable of signal
					RooRealVar Nsig0("Nsig0","Nsig0",0,1000);
					RooRealVar Nsig1("Nsig1","Nsig1",0,1000);
					RooRealVar Nsig2("Nsig2","Nsig2",0,1000);
					RooRealVar Nbg("Nbg","Nbg",-10,5000);

					// Define RooFit variable of gaussian for Y(1S)
					RooRealVar mG0("mG0","mG0",9.30,9.60);
					RooRealVar sG0("sG0","sG0",0.05,0.2);
					//RooGenericPdf genG("genG","genG","Nsig/(sG*TMath::Sqrt(2*TMath::Pi())) * TMath::Exp(-((mass-mG)*(mass-mG))/(2*(sG*sG)))",RooArgSet(mass,Nsig,sG,mG));
					RooGaussian gauss0("gauss0","gauss0",mass,mG0,sG0);

					// Define RooFit variable of gaussian for Y(2S)
					RooRealVar mG1("mG1","mG1",9.80,10.10);
					RooRealVar sG1("sG1","sG1",0.05,0.2);
					RooGaussian gauss1("gauss1","gauss1",mass,mG1,sG1);

					// Define RooFit variable of gaussian for Y(3S)
					RooRealVar mG2("mG2","mG2",10.30,10.60);
					RooRealVar sG2("sG2","sG2",0.05,0.2);
					RooGaussian gauss2("gauss2","gauss2",mass,mG2,sG2);

					// Define RooFit variable of exponential for background
					RooRealVar c("c","c",-20,20);
					RooExponential exp("exp","exp",mass,c);
					
					RooAddPdf glpdf("glpdf","glpdf",RooArgList(gauss0,gauss1,gauss2,exp),RooArgList(Nsig0,Nsig1,Nsig2,Nbg));

					RooFitResult *fitres = glpdf.fitTo(hst,"mhe0");

					// Get a frame from RooRealVar
					RooPlot *frame = mass.frame(Title("#Upsilon mass plot"));
					
					// Get Chi2, mean, sigma and Nsig
					printf("chi2 = %6.4f\n",frame->chiSquare());
					printf("mean  (1S) = %6.2f +/- %4.2f [GeV]\n",mG0.getVal(),mG0.getError());
					printf("sigma (1S) = %6.2f +/- %4.2f [GeV]\n",sG0.getVal(),sG0.getError());
					printf("Nsig  (1S) = %6.0f +/- %4.0f\n",Nsig0.getVal(),Nsig0.getError());
					genValue = bin1<5 ? gmass->Integral():gmass->Integral()/binnorm;
					genValueErr = TMath::Sqrt(genValue);
					recValue = bin1<5 ? Nsig0.getVal():Nsig0.getVal()/binnorm;
					recValueErr = bin1<5 ? Nsig0.getError():Nsig0.getError()/binnorm;

					// Add RooDataHist in the frame
					hst.plotOn(frame);
					glpdf.plotOn(frame,Components(gauss0),LineColor(kRed),LineStyle(kDashed));
					glpdf.plotOn(frame);

					frame->Draw();
				}

				printf("genValue = %.0f +/- %.0f\n",genValue,genValueErr);
				printf("recValue = %.0f +/- %.0f\n",recValue,recValueErr);
	
				// fill grid
				Int_t binCell[nVar]={bin0+1,bin1+1};
				cintGrid->SetElement(binCell,genValue);
				cintGrid->SetElementError(binCell,genValueErr);
				cmusGrid->SetElement(binCell,recValue);
				cmusGrid->SetElementError(binCell,recValueErr);
			}
		}
	}

// set data container
	dataCont->SetGrid(0, cintGrid);
	dataCont->SetGrid(1, cmusGrid);
	
	TCanvas *cdat = new TCanvas("cdat",Form("%s data container",resname),0,0,1200,400);
	cdat->Divide(3,1);
	cdat->cd(1); dataCont->Project(1,0)->Draw();
	cdat->cd(2); dataCont->Project(1,1)->Draw();
	cdat->cd(3); dataCont->Project(1,0,1)->Draw("colz");

// save data container 
	char *outfile = Form("data.%s",dataname);
	printf("saving data container as %s...",outfile);
	dataCont->Save(outfile);
	printf("done\n");

	return outfile;
}	// extSignal 

///////////////////
// Do Correction //
///////////////////

char* doCorrection(char *dataname, char* file_effmat, char* file_datmat)
{
	
// print out starting messages
	printf("\nNow extracting #signal by fitting...\n");

	LoadLib();

	TFile *fEffCont = new TFile(file_effmat);
	TFile *fDataCont = new TFile(file_datmat);

	AliCFContainer *effCont = (AliCFContainer*)fEffCont->Get("effCont");
	AliCFContainer *dataCont = (AliCFContainer*)fDataCont->Get("dataCont");

	AliCFEffGrid *matEff = new AliCFEffGrid("matEff",Form("%s efficiency matrix",resname),*effCont);
	AliCFDataGrid *matGen = new AliCFDataGrid("matGen",Form("%s gen matrix",resname), *dataCont,0);
	AliCFDataGrid *matData = new AliCFDataGrid("matData",Form("%s data matrix",resname),*dataCont,1);

	// calculate efficiency
	matEff->CalculateEfficiency(1,0);

//________________________
// display efficiency plot
	TCanvas *ceff = new TCanvas("ceff",Form("%s efficiency",resname),0,0,1200,400);
	ceff->Divide(3,1);
// efficiency over var0
	ceff->cd(1);
	TH1D *effvar0 = matEff->Project(0);
	effvar0->SetName(Form("eff_%s",var0name));
	effvar0->SetMinimum(0); effvar0->SetMaximum(1);
	effvar0->SetTitle(Form("%s efficiency(%s)",resname,var0name));
	effvar0->GetXaxis()->SetTitle(var0name);
	effvar0->GetYaxis()->SetTitle("Efficiency");
	effvar0->Draw("error");
// efficiency over var1
	ceff->cd(2);
	TH1D *effvar1 = matEff->Project(1);
	effvar1->SetName(Form("eff_%s",var1name));
	effvar1->SetMinimum(0); effvar1->SetMaximum(1);
	effvar1->SetTitle(Form("%s efficiency(%s)",resname,var1name));
	effvar1->GetXaxis()->SetTitle(var1name);
	effvar1->GetYaxis()->SetTitle("Efficiency");
	effvar1->Draw("error");
// 2-dimensional efficiency plot (var0, var1)
	ceff->cd(3);
	TH1D *eff2D = matEff->Project(0,1);
	eff2D->SetName("eff_2D");
	eff2D->SetMinimum(0); eff2D->SetMaximum(1);
	eff2D->SetTitle(Form("%s efficiency(%s,%s)",resname,var0name,var1name));
	eff2D->GetXaxis()->SetTitle(var0name);
	eff2D->GetYaxis()->SetTitle(var1name);
	eff2D->GetZaxis()->SetTitle("Efficiency");
	eff2D->Draw("colz");
//_________________
// display gen plot
	TCanvas *ccor = new TCanvas("ccor",Form("%s correction",resname),0,0,1200,400);
	ccor->Divide(3,1);
// cora over var0
	ccor->cd(1);
	TH1D *genvar0 = matGen->Project(0);
	genvar0->SetName(Form("cor_%s",var0name));
	genvar0->SetMinimum(0);
	genvar0->SetLineColor(kRed);
	genvar0->SetMarkerStyle(22);
	genvar0->SetMarkerColor(kRed);
	genvar0->SetTitle(Form("%s correction(%s)",resname,var0name));
	genvar0->GetXaxis()->SetTitle(var0name);
	genvar0->GetYaxis()->SetTitle("dN/dy");
	genvar0->Draw();
// cora over var1
	ccor->cd(2);
	TH1D *genvar1 = matGen->Project(1);
	genvar1->SetName(Form("cor_%s",var1name));
	genvar1->SetMinimum(0);
	genvar1->SetLineColor(kRed);
	genvar1->SetMarkerStyle(22);
	genvar1->SetMarkerColor(kRed);
	genvar1->SetTitle(Form("%s correction(%s)",resname,var1name));
	genvar1->GetXaxis()->SetTitle(var1name);
	genvar1->GetYaxis()->SetTitle("dN/dpt");
	genvar1->Draw();

//__________________
// display data plot
// data over var0
	ccor->cd(1);
	TH1D *datvar0 = matData->Project(0);
	datvar0->SetName(Form("dat_%s",var0name));
	datvar0->SetMinimum(0);
	datvar0->SetMarkerStyle(22);
	datvar0->SetTitle(Form("%s before correction(%s)",resname,var0name));
	datvar0->GetXaxis()->SetTitle(var0name);
	datvar0->GetYaxis()->SetTitle("dN/dy");
	datvar0->Draw("same");
// data over var1
	ccor->cd(2);
	TH1D *datvar1 = matData->Project(1);
	datvar1->SetName(Form("dat_%s",var1name));
	datvar1->SetMinimum(0);
	datvar1->SetMarkerStyle(22);
	datvar1->SetTitle(Form("%s before correction(%s)",resname,var1name));
	datvar1->GetXaxis()->SetTitle(var1name);
	datvar1->GetYaxis()->SetTitle("dN/dpt");
	datvar1->Draw("same");

//___________________
// perform correction
	matData->ApplyEffCorrection(*matEff);

//________________________
// display correction plot
// correction over var0
	ccor->cd(1);
	TH1D *corvar0 = matData->Project(0);
	corvar0->SetName(Form("cor_%s",var0name));
	corvar0->SetMinimum(0);
	corvar0->SetLineColor(kBlue);
	corvar0->SetMarkerStyle(22);
	corvar0->SetMarkerColor(kBlue);
	corvar0->SetTitle(Form("%s correction(%s)",resname,var0name));
	corvar0->GetXaxis()->SetTitle(var0name);
	corvar0->GetYaxis()->SetTitle("dN/dy");
	corvar0->Draw("same");
// correction over var1
	ccor->cd(2);
	TH1D *corvar1 = matData->Project(1);
	corvar1->SetName(Form("cor_%s",var1name));
	corvar1->SetMinimum(0);
	corvar1->SetLineColor(kBlue);
	corvar1->SetMarkerStyle(22);
	corvar1->SetMarkerColor(kBlue);
	corvar1->SetTitle(Form("%s correction(%s)",resname,var1name));
	corvar1->GetXaxis()->SetTitle(var1name);
	corvar1->GetYaxis()->SetTitle("dN/dpt");
	corvar1->Draw("same");
// 2D correction over var0 and var1
	ccor->cd(3);
	TH2D *cor2D = matData->Project(0,1);
	cor2D->SetName("cor_2D");
	cor2D->SetMinimum(0);
	cor2D->SetTitle(Form("%s correction(%s,%s)",resname,var0name,var1name));
	cor2D->GetXaxis()->SetTitle(var0name);
	cor2D->GetYaxis()->SetTitle(var1name);
	cor2D->GetZaxis()->SetTitle("dN/dpty");
	cor2D->Draw("colz");


	printf("\nCorrection matrix created...\n");
	
// save correction result
	char *outfile = Form("correction-result.%s",dataname);
	printf("saving correction result as %s...",outfile);
	TFile file(outfile,"RECREATE");
	file.cd();
	corvar0->Write();
	corvar1->Write();
	cor2D->Write();
	file.Write();
	file.Close();

	printf("done\n");

	return outfile;
}

//////////////////////////
// DEFINE FIT FUNCTIONS //
//////////////////////////

// single exponential
Double_t expo(Double_t *x, Double_t *par) {
	return par[0] * TMath::Exp((par[1]*x[0]));
}

// double exponential with exclusive region - UPSILON
Double_t dexpo(Double_t *x, Double_t *par) {
	// exclusive region
  if (x[0] > 9.0 && x[0] < 10.0) {
   	TF1::RejectPoint();
   	return 0;
 	}
	return expo(x, &par[0]) + expo(x, &par[2]);
}

// double exponential
Double_t dexpo2(Double_t *x, Double_t *par) {
	return expo(x, &par[0]) + expo(x, &par[2]);
}

// signal : gauss
// fit each resonance
Double_t normGauss(Double_t *x, Double_t *par) {
	return par[0] / (par[2]*TMath::Sqrt(2*TMath::Pi())) * TMath::Exp(-((x[0]-par[1])*(x[0]-par[1]))/(2*(par[2]*par[2])));
}

// fit two resonance
Double_t normGauss2(Double_t *x, Double_t *par) {
	return normGauss(x, &par[0]) + normGauss(x,&par[3]);
}

// fit three resonances
Double_t normGauss3(Double_t *x, Double_t *par) {
	return normGauss(x, &par[0]) + normGauss(x, &par[3]) + normGauss(x, &par[6]);
}

// convolution of gauss and landau
Double_t gaussXlandau(Double_t *var, Double_t *par) {
  // Gaussian convoluted with an inverted Landau function:
  // TMath::Gaus(x,mean,sigma)
  // TMath::Landau(x,mean,width)

  Double_t N = par[0];  // normalization factor = number of entries
  Double_t mG = par[1]; // mean of the gaussian
  Double_t sG = par[2]; // sigma of the gaussian
  Double_t wL = par[3]; // width of the Landau
  Double_t x = var[0];  // variable
  // Numerical constant
  Double_t sqrt2pi = 2.506628275;  // Sqrt{2*Pi}
  Double_t mL0 = -0.22278298;      // maximum Landau location for mean=0
  // Range of integral convolution
  Double_t Nsigma = 5;
  Double_t Sigma = sG + wL;
  //Double_t xMin = mG - Nsigma*Sigma;
  //Double_t xMax = mG + Nsigma*Sigma;
  Double_t xMin = 0;
  Double_t xMax = 2*mG;
  // Integral convolution of a Gaussian with an inverted Landau
  Int_t Nstep = 2000;
  Double_t step = (xMax-xMin) / Nstep;
  Double_t sum = 0;
  Double_t xx;
  for (Double_t i=1.0; i<Nstep; i++) {
    xx = xMin + (i-0.5)*step;
    sum += TMath::Gaus(xx,mG,sG) * TMath::Landau(-(x-xx),0,wL);
  }
  // Normalized result
  return N*sum*step/(sqrt2pi*sG*wL);
}

// global fit : UPSILON Family w/ sigle exponential
Double_t global(Double_t *x, Double_t *par) {
	return expo(x,&par[0]) + normGauss3(x, &par[2]);
}

// global fit for PDC09 : UPSILON Family w/ sigle exponential
Double_t global_pdc(Double_t *x, Double_t *par) {
	return expo(x,&par[0]) + gaussXlandau(x, &par[2]) + normGauss2(x, &par[6]);
}

// Crystal ball fit
Double_t CrystalBall(Double_t *x, Double_t *par) {
	//Crystal ball function for signal
	//parameters are 0:alpha,1:n,2:mean,3:sigma,4:number of expected events
	Double_t m=x[0];
	Double_t alpha=par[0];
	Double_t n=par[1];
	Double_t m0=par[2];
	Double_t sigma=par[3];
	Double_t N=par[4];
	
	Double_t t = (m-m0)/sigma;
	if(alpha<0) t = -t;

	Double_t absAlpha = TMath::Abs((Double_t)alpha);

	if(t >= -absAlpha) {
		return N/(sigma*TMath::Sqrt(2*TMath::Pi()))*exp(-0.5*t*t);
		//return N*exp(-0.5*t*t);
	}
	else {
		Double_t intn=0;
		Double_t fracn=modf(n, &intn);
		if(n>10) return 0;
		if((n/absAlpha<0) && TMath::Abs(fracn)>0) return 0; // TMath::Power(x,y): negative x and non-integer y not supported!!
		Double_t a = TMath::Power(n/absAlpha,n)*exp(-0.5*absAlpha*absAlpha);
		Double_t b = n/absAlpha - absAlpha;

		return N/(sigma*TMath::Sqrt(2*TMath::Pi()))*(a/TMath::Power(b - t, n));
		//return N*(a/TMath::Power(b - t, n));
	}
}

// Loading libraries
void LoadLib() {
	printf("Loading libraries...");
// loading libraries
	gSystem->SetIncludePath("-I. -I$ALICE_ROOT/include  -I$ROOTSYS/include"); 
  gSystem->Load("libCore.so");  
  gSystem->Load("libTree.so");
  gSystem->Load("libGeom.so");
  gSystem->Load("libVMC.so");
  gSystem->Load("libPhysics.so");
  gSystem->Load("libSTEERBase");
  gSystem->Load("libESD");
  gSystem->Load("libAOD") ;
	gSystem->Load("libANALYSIS.so");
	gSystem->Load("libANALYSISalice.so");
	gSystem->Load("libCORRFW.so");

	gROOT->SetStyle("Plain");
	gStyle->SetPalette(1);
	gStyle->SetOptFit(1);
	gStyle->SetOptStat(0);
	printf("done\n");
}
 upsilonCORRFW.C:1
 upsilonCORRFW.C:2
 upsilonCORRFW.C:3
 upsilonCORRFW.C:4
 upsilonCORRFW.C:5
 upsilonCORRFW.C:6
 upsilonCORRFW.C:7
 upsilonCORRFW.C:8
 upsilonCORRFW.C:9
 upsilonCORRFW.C:10
 upsilonCORRFW.C:11
 upsilonCORRFW.C:12
 upsilonCORRFW.C:13
 upsilonCORRFW.C:14
 upsilonCORRFW.C:15
 upsilonCORRFW.C:16
 upsilonCORRFW.C:17
 upsilonCORRFW.C:18
 upsilonCORRFW.C:19
 upsilonCORRFW.C:20
 upsilonCORRFW.C:21
 upsilonCORRFW.C:22
 upsilonCORRFW.C:23
 upsilonCORRFW.C:24
 upsilonCORRFW.C:25
 upsilonCORRFW.C:26
 upsilonCORRFW.C:27
 upsilonCORRFW.C:28
 upsilonCORRFW.C:29
 upsilonCORRFW.C:30
 upsilonCORRFW.C:31
 upsilonCORRFW.C:32
 upsilonCORRFW.C:33
 upsilonCORRFW.C:34
 upsilonCORRFW.C:35
 upsilonCORRFW.C:36
 upsilonCORRFW.C:37
 upsilonCORRFW.C:38
 upsilonCORRFW.C:39
 upsilonCORRFW.C:40
 upsilonCORRFW.C:41
 upsilonCORRFW.C:42
 upsilonCORRFW.C:43
 upsilonCORRFW.C:44
 upsilonCORRFW.C:45
 upsilonCORRFW.C:46
 upsilonCORRFW.C:47
 upsilonCORRFW.C:48
 upsilonCORRFW.C:49
 upsilonCORRFW.C:50
 upsilonCORRFW.C:51
 upsilonCORRFW.C:52
 upsilonCORRFW.C:53
 upsilonCORRFW.C:54
 upsilonCORRFW.C:55
 upsilonCORRFW.C:56
 upsilonCORRFW.C:57
 upsilonCORRFW.C:58
 upsilonCORRFW.C:59
 upsilonCORRFW.C:60
 upsilonCORRFW.C:61
 upsilonCORRFW.C:62
 upsilonCORRFW.C:63
 upsilonCORRFW.C:64
 upsilonCORRFW.C:65
 upsilonCORRFW.C:66
 upsilonCORRFW.C:67
 upsilonCORRFW.C:68
 upsilonCORRFW.C:69
 upsilonCORRFW.C:70
 upsilonCORRFW.C:71
 upsilonCORRFW.C:72
 upsilonCORRFW.C:73
 upsilonCORRFW.C:74
 upsilonCORRFW.C:75
 upsilonCORRFW.C:76
 upsilonCORRFW.C:77
 upsilonCORRFW.C:78
 upsilonCORRFW.C:79
 upsilonCORRFW.C:80
 upsilonCORRFW.C:81
 upsilonCORRFW.C:82
 upsilonCORRFW.C:83
 upsilonCORRFW.C:84
 upsilonCORRFW.C:85
 upsilonCORRFW.C:86
 upsilonCORRFW.C:87
 upsilonCORRFW.C:88
 upsilonCORRFW.C:89
 upsilonCORRFW.C:90
 upsilonCORRFW.C:91
 upsilonCORRFW.C:92
 upsilonCORRFW.C:93
 upsilonCORRFW.C:94
 upsilonCORRFW.C:95
 upsilonCORRFW.C:96
 upsilonCORRFW.C:97
 upsilonCORRFW.C:98
 upsilonCORRFW.C:99
 upsilonCORRFW.C:100
 upsilonCORRFW.C:101
 upsilonCORRFW.C:102
 upsilonCORRFW.C:103
 upsilonCORRFW.C:104
 upsilonCORRFW.C:105
 upsilonCORRFW.C:106
 upsilonCORRFW.C:107
 upsilonCORRFW.C:108
 upsilonCORRFW.C:109
 upsilonCORRFW.C:110
 upsilonCORRFW.C:111
 upsilonCORRFW.C:112
 upsilonCORRFW.C:113
 upsilonCORRFW.C:114
 upsilonCORRFW.C:115
 upsilonCORRFW.C:116
 upsilonCORRFW.C:117
 upsilonCORRFW.C:118
 upsilonCORRFW.C:119
 upsilonCORRFW.C:120
 upsilonCORRFW.C:121
 upsilonCORRFW.C:122
 upsilonCORRFW.C:123
 upsilonCORRFW.C:124
 upsilonCORRFW.C:125
 upsilonCORRFW.C:126
 upsilonCORRFW.C:127
 upsilonCORRFW.C:128
 upsilonCORRFW.C:129
 upsilonCORRFW.C:130
 upsilonCORRFW.C:131
 upsilonCORRFW.C:132
 upsilonCORRFW.C:133
 upsilonCORRFW.C:134
 upsilonCORRFW.C:135
 upsilonCORRFW.C:136
 upsilonCORRFW.C:137
 upsilonCORRFW.C:138
 upsilonCORRFW.C:139
 upsilonCORRFW.C:140
 upsilonCORRFW.C:141
 upsilonCORRFW.C:142
 upsilonCORRFW.C:143
 upsilonCORRFW.C:144
 upsilonCORRFW.C:145
 upsilonCORRFW.C:146
 upsilonCORRFW.C:147
 upsilonCORRFW.C:148
 upsilonCORRFW.C:149
 upsilonCORRFW.C:150
 upsilonCORRFW.C:151
 upsilonCORRFW.C:152
 upsilonCORRFW.C:153
 upsilonCORRFW.C:154
 upsilonCORRFW.C:155
 upsilonCORRFW.C:156
 upsilonCORRFW.C:157
 upsilonCORRFW.C:158
 upsilonCORRFW.C:159
 upsilonCORRFW.C:160
 upsilonCORRFW.C:161
 upsilonCORRFW.C:162
 upsilonCORRFW.C:163
 upsilonCORRFW.C:164
 upsilonCORRFW.C:165
 upsilonCORRFW.C:166
 upsilonCORRFW.C:167
 upsilonCORRFW.C:168
 upsilonCORRFW.C:169
 upsilonCORRFW.C:170
 upsilonCORRFW.C:171
 upsilonCORRFW.C:172
 upsilonCORRFW.C:173
 upsilonCORRFW.C:174
 upsilonCORRFW.C:175
 upsilonCORRFW.C:176
 upsilonCORRFW.C:177
 upsilonCORRFW.C:178
 upsilonCORRFW.C:179
 upsilonCORRFW.C:180
 upsilonCORRFW.C:181
 upsilonCORRFW.C:182
 upsilonCORRFW.C:183
 upsilonCORRFW.C:184
 upsilonCORRFW.C:185
 upsilonCORRFW.C:186
 upsilonCORRFW.C:187
 upsilonCORRFW.C:188
 upsilonCORRFW.C:189
 upsilonCORRFW.C:190
 upsilonCORRFW.C:191
 upsilonCORRFW.C:192
 upsilonCORRFW.C:193
 upsilonCORRFW.C:194
 upsilonCORRFW.C:195
 upsilonCORRFW.C:196
 upsilonCORRFW.C:197
 upsilonCORRFW.C:198
 upsilonCORRFW.C:199
 upsilonCORRFW.C:200
 upsilonCORRFW.C:201
 upsilonCORRFW.C:202
 upsilonCORRFW.C:203
 upsilonCORRFW.C:204
 upsilonCORRFW.C:205
 upsilonCORRFW.C:206
 upsilonCORRFW.C:207
 upsilonCORRFW.C:208
 upsilonCORRFW.C:209
 upsilonCORRFW.C:210
 upsilonCORRFW.C:211
 upsilonCORRFW.C:212
 upsilonCORRFW.C:213
 upsilonCORRFW.C:214
 upsilonCORRFW.C:215
 upsilonCORRFW.C:216
 upsilonCORRFW.C:217
 upsilonCORRFW.C:218
 upsilonCORRFW.C:219
 upsilonCORRFW.C:220
 upsilonCORRFW.C:221
 upsilonCORRFW.C:222
 upsilonCORRFW.C:223
 upsilonCORRFW.C:224
 upsilonCORRFW.C:225
 upsilonCORRFW.C:226
 upsilonCORRFW.C:227
 upsilonCORRFW.C:228
 upsilonCORRFW.C:229
 upsilonCORRFW.C:230
 upsilonCORRFW.C:231
 upsilonCORRFW.C:232
 upsilonCORRFW.C:233
 upsilonCORRFW.C:234
 upsilonCORRFW.C:235
 upsilonCORRFW.C:236
 upsilonCORRFW.C:237
 upsilonCORRFW.C:238
 upsilonCORRFW.C:239
 upsilonCORRFW.C:240
 upsilonCORRFW.C:241
 upsilonCORRFW.C:242
 upsilonCORRFW.C:243
 upsilonCORRFW.C:244
 upsilonCORRFW.C:245
 upsilonCORRFW.C:246
 upsilonCORRFW.C:247
 upsilonCORRFW.C:248
 upsilonCORRFW.C:249
 upsilonCORRFW.C:250
 upsilonCORRFW.C:251
 upsilonCORRFW.C:252
 upsilonCORRFW.C:253
 upsilonCORRFW.C:254
 upsilonCORRFW.C:255
 upsilonCORRFW.C:256
 upsilonCORRFW.C:257
 upsilonCORRFW.C:258
 upsilonCORRFW.C:259
 upsilonCORRFW.C:260
 upsilonCORRFW.C:261
 upsilonCORRFW.C:262
 upsilonCORRFW.C:263
 upsilonCORRFW.C:264
 upsilonCORRFW.C:265
 upsilonCORRFW.C:266
 upsilonCORRFW.C:267
 upsilonCORRFW.C:268
 upsilonCORRFW.C:269
 upsilonCORRFW.C:270
 upsilonCORRFW.C:271
 upsilonCORRFW.C:272
 upsilonCORRFW.C:273
 upsilonCORRFW.C:274
 upsilonCORRFW.C:275
 upsilonCORRFW.C:276
 upsilonCORRFW.C:277
 upsilonCORRFW.C:278
 upsilonCORRFW.C:279
 upsilonCORRFW.C:280
 upsilonCORRFW.C:281
 upsilonCORRFW.C:282
 upsilonCORRFW.C:283
 upsilonCORRFW.C:284
 upsilonCORRFW.C:285
 upsilonCORRFW.C:286
 upsilonCORRFW.C:287
 upsilonCORRFW.C:288
 upsilonCORRFW.C:289
 upsilonCORRFW.C:290
 upsilonCORRFW.C:291
 upsilonCORRFW.C:292
 upsilonCORRFW.C:293
 upsilonCORRFW.C:294
 upsilonCORRFW.C:295
 upsilonCORRFW.C:296
 upsilonCORRFW.C:297
 upsilonCORRFW.C:298
 upsilonCORRFW.C:299
 upsilonCORRFW.C:300
 upsilonCORRFW.C:301
 upsilonCORRFW.C:302
 upsilonCORRFW.C:303
 upsilonCORRFW.C:304
 upsilonCORRFW.C:305
 upsilonCORRFW.C:306
 upsilonCORRFW.C:307
 upsilonCORRFW.C:308
 upsilonCORRFW.C:309
 upsilonCORRFW.C:310
 upsilonCORRFW.C:311
 upsilonCORRFW.C:312
 upsilonCORRFW.C:313
 upsilonCORRFW.C:314
 upsilonCORRFW.C:315
 upsilonCORRFW.C:316
 upsilonCORRFW.C:317
 upsilonCORRFW.C:318
 upsilonCORRFW.C:319
 upsilonCORRFW.C:320
 upsilonCORRFW.C:321
 upsilonCORRFW.C:322
 upsilonCORRFW.C:323
 upsilonCORRFW.C:324
 upsilonCORRFW.C:325
 upsilonCORRFW.C:326
 upsilonCORRFW.C:327
 upsilonCORRFW.C:328
 upsilonCORRFW.C:329
 upsilonCORRFW.C:330
 upsilonCORRFW.C:331
 upsilonCORRFW.C:332
 upsilonCORRFW.C:333
 upsilonCORRFW.C:334
 upsilonCORRFW.C:335
 upsilonCORRFW.C:336
 upsilonCORRFW.C:337
 upsilonCORRFW.C:338
 upsilonCORRFW.C:339
 upsilonCORRFW.C:340
 upsilonCORRFW.C:341
 upsilonCORRFW.C:342
 upsilonCORRFW.C:343
 upsilonCORRFW.C:344
 upsilonCORRFW.C:345
 upsilonCORRFW.C:346
 upsilonCORRFW.C:347
 upsilonCORRFW.C:348
 upsilonCORRFW.C:349
 upsilonCORRFW.C:350
 upsilonCORRFW.C:351
 upsilonCORRFW.C:352
 upsilonCORRFW.C:353
 upsilonCORRFW.C:354
 upsilonCORRFW.C:355
 upsilonCORRFW.C:356
 upsilonCORRFW.C:357
 upsilonCORRFW.C:358
 upsilonCORRFW.C:359
 upsilonCORRFW.C:360
 upsilonCORRFW.C:361
 upsilonCORRFW.C:362
 upsilonCORRFW.C:363
 upsilonCORRFW.C:364
 upsilonCORRFW.C:365
 upsilonCORRFW.C:366
 upsilonCORRFW.C:367
 upsilonCORRFW.C:368
 upsilonCORRFW.C:369
 upsilonCORRFW.C:370
 upsilonCORRFW.C:371
 upsilonCORRFW.C:372
 upsilonCORRFW.C:373
 upsilonCORRFW.C:374
 upsilonCORRFW.C:375
 upsilonCORRFW.C:376
 upsilonCORRFW.C:377
 upsilonCORRFW.C:378
 upsilonCORRFW.C:379
 upsilonCORRFW.C:380
 upsilonCORRFW.C:381
 upsilonCORRFW.C:382
 upsilonCORRFW.C:383
 upsilonCORRFW.C:384
 upsilonCORRFW.C:385
 upsilonCORRFW.C:386
 upsilonCORRFW.C:387
 upsilonCORRFW.C:388
 upsilonCORRFW.C:389
 upsilonCORRFW.C:390
 upsilonCORRFW.C:391
 upsilonCORRFW.C:392
 upsilonCORRFW.C:393
 upsilonCORRFW.C:394
 upsilonCORRFW.C:395
 upsilonCORRFW.C:396
 upsilonCORRFW.C:397
 upsilonCORRFW.C:398
 upsilonCORRFW.C:399
 upsilonCORRFW.C:400
 upsilonCORRFW.C:401
 upsilonCORRFW.C:402
 upsilonCORRFW.C:403
 upsilonCORRFW.C:404
 upsilonCORRFW.C:405
 upsilonCORRFW.C:406
 upsilonCORRFW.C:407
 upsilonCORRFW.C:408
 upsilonCORRFW.C:409
 upsilonCORRFW.C:410
 upsilonCORRFW.C:411
 upsilonCORRFW.C:412
 upsilonCORRFW.C:413
 upsilonCORRFW.C:414
 upsilonCORRFW.C:415
 upsilonCORRFW.C:416
 upsilonCORRFW.C:417
 upsilonCORRFW.C:418
 upsilonCORRFW.C:419
 upsilonCORRFW.C:420
 upsilonCORRFW.C:421
 upsilonCORRFW.C:422
 upsilonCORRFW.C:423
 upsilonCORRFW.C:424
 upsilonCORRFW.C:425
 upsilonCORRFW.C:426
 upsilonCORRFW.C:427
 upsilonCORRFW.C:428
 upsilonCORRFW.C:429
 upsilonCORRFW.C:430
 upsilonCORRFW.C:431
 upsilonCORRFW.C:432
 upsilonCORRFW.C:433
 upsilonCORRFW.C:434
 upsilonCORRFW.C:435
 upsilonCORRFW.C:436
 upsilonCORRFW.C:437
 upsilonCORRFW.C:438
 upsilonCORRFW.C:439
 upsilonCORRFW.C:440
 upsilonCORRFW.C:441
 upsilonCORRFW.C:442
 upsilonCORRFW.C:443
 upsilonCORRFW.C:444
 upsilonCORRFW.C:445
 upsilonCORRFW.C:446
 upsilonCORRFW.C:447
 upsilonCORRFW.C:448
 upsilonCORRFW.C:449
 upsilonCORRFW.C:450
 upsilonCORRFW.C:451
 upsilonCORRFW.C:452
 upsilonCORRFW.C:453
 upsilonCORRFW.C:454
 upsilonCORRFW.C:455
 upsilonCORRFW.C:456
 upsilonCORRFW.C:457
 upsilonCORRFW.C:458
 upsilonCORRFW.C:459
 upsilonCORRFW.C:460
 upsilonCORRFW.C:461
 upsilonCORRFW.C:462
 upsilonCORRFW.C:463
 upsilonCORRFW.C:464
 upsilonCORRFW.C:465
 upsilonCORRFW.C:466
 upsilonCORRFW.C:467
 upsilonCORRFW.C:468
 upsilonCORRFW.C:469
 upsilonCORRFW.C:470
 upsilonCORRFW.C:471
 upsilonCORRFW.C:472
 upsilonCORRFW.C:473
 upsilonCORRFW.C:474
 upsilonCORRFW.C:475
 upsilonCORRFW.C:476
 upsilonCORRFW.C:477
 upsilonCORRFW.C:478
 upsilonCORRFW.C:479
 upsilonCORRFW.C:480
 upsilonCORRFW.C:481
 upsilonCORRFW.C:482
 upsilonCORRFW.C:483
 upsilonCORRFW.C:484
 upsilonCORRFW.C:485
 upsilonCORRFW.C:486
 upsilonCORRFW.C:487
 upsilonCORRFW.C:488
 upsilonCORRFW.C:489
 upsilonCORRFW.C:490
 upsilonCORRFW.C:491
 upsilonCORRFW.C:492
 upsilonCORRFW.C:493
 upsilonCORRFW.C:494
 upsilonCORRFW.C:495
 upsilonCORRFW.C:496
 upsilonCORRFW.C:497
 upsilonCORRFW.C:498
 upsilonCORRFW.C:499
 upsilonCORRFW.C:500
 upsilonCORRFW.C:501
 upsilonCORRFW.C:502
 upsilonCORRFW.C:503
 upsilonCORRFW.C:504
 upsilonCORRFW.C:505
 upsilonCORRFW.C:506
 upsilonCORRFW.C:507
 upsilonCORRFW.C:508
 upsilonCORRFW.C:509
 upsilonCORRFW.C:510
 upsilonCORRFW.C:511
 upsilonCORRFW.C:512
 upsilonCORRFW.C:513
 upsilonCORRFW.C:514
 upsilonCORRFW.C:515
 upsilonCORRFW.C:516
 upsilonCORRFW.C:517
 upsilonCORRFW.C:518
 upsilonCORRFW.C:519
 upsilonCORRFW.C:520
 upsilonCORRFW.C:521
 upsilonCORRFW.C:522
 upsilonCORRFW.C:523
 upsilonCORRFW.C:524
 upsilonCORRFW.C:525
 upsilonCORRFW.C:526
 upsilonCORRFW.C:527
 upsilonCORRFW.C:528
 upsilonCORRFW.C:529
 upsilonCORRFW.C:530
 upsilonCORRFW.C:531
 upsilonCORRFW.C:532
 upsilonCORRFW.C:533
 upsilonCORRFW.C:534
 upsilonCORRFW.C:535
 upsilonCORRFW.C:536
 upsilonCORRFW.C:537
 upsilonCORRFW.C:538
 upsilonCORRFW.C:539
 upsilonCORRFW.C:540
 upsilonCORRFW.C:541
 upsilonCORRFW.C:542
 upsilonCORRFW.C:543
 upsilonCORRFW.C:544
 upsilonCORRFW.C:545
 upsilonCORRFW.C:546
 upsilonCORRFW.C:547
 upsilonCORRFW.C:548
 upsilonCORRFW.C:549
 upsilonCORRFW.C:550
 upsilonCORRFW.C:551
 upsilonCORRFW.C:552
 upsilonCORRFW.C:553
 upsilonCORRFW.C:554
 upsilonCORRFW.C:555
 upsilonCORRFW.C:556
 upsilonCORRFW.C:557
 upsilonCORRFW.C:558
 upsilonCORRFW.C:559
 upsilonCORRFW.C:560
 upsilonCORRFW.C:561
 upsilonCORRFW.C:562
 upsilonCORRFW.C:563
 upsilonCORRFW.C:564
 upsilonCORRFW.C:565
 upsilonCORRFW.C:566
 upsilonCORRFW.C:567
 upsilonCORRFW.C:568
 upsilonCORRFW.C:569
 upsilonCORRFW.C:570
 upsilonCORRFW.C:571
 upsilonCORRFW.C:572
 upsilonCORRFW.C:573
 upsilonCORRFW.C:574
 upsilonCORRFW.C:575
 upsilonCORRFW.C:576
 upsilonCORRFW.C:577
 upsilonCORRFW.C:578
 upsilonCORRFW.C:579
 upsilonCORRFW.C:580
 upsilonCORRFW.C:581
 upsilonCORRFW.C:582
 upsilonCORRFW.C:583
 upsilonCORRFW.C:584
 upsilonCORRFW.C:585
 upsilonCORRFW.C:586
 upsilonCORRFW.C:587
 upsilonCORRFW.C:588
 upsilonCORRFW.C:589
 upsilonCORRFW.C:590
 upsilonCORRFW.C:591
 upsilonCORRFW.C:592
 upsilonCORRFW.C:593
 upsilonCORRFW.C:594
 upsilonCORRFW.C:595
 upsilonCORRFW.C:596
 upsilonCORRFW.C:597
 upsilonCORRFW.C:598
 upsilonCORRFW.C:599
 upsilonCORRFW.C:600
 upsilonCORRFW.C:601
 upsilonCORRFW.C:602
 upsilonCORRFW.C:603
 upsilonCORRFW.C:604
 upsilonCORRFW.C:605
 upsilonCORRFW.C:606
 upsilonCORRFW.C:607
 upsilonCORRFW.C:608
 upsilonCORRFW.C:609
 upsilonCORRFW.C:610
 upsilonCORRFW.C:611
 upsilonCORRFW.C:612
 upsilonCORRFW.C:613
 upsilonCORRFW.C:614
 upsilonCORRFW.C:615
 upsilonCORRFW.C:616
 upsilonCORRFW.C:617
 upsilonCORRFW.C:618
 upsilonCORRFW.C:619
 upsilonCORRFW.C:620
 upsilonCORRFW.C:621
 upsilonCORRFW.C:622
 upsilonCORRFW.C:623
 upsilonCORRFW.C:624
 upsilonCORRFW.C:625
 upsilonCORRFW.C:626
 upsilonCORRFW.C:627
 upsilonCORRFW.C:628
 upsilonCORRFW.C:629
 upsilonCORRFW.C:630
 upsilonCORRFW.C:631
 upsilonCORRFW.C:632
 upsilonCORRFW.C:633
 upsilonCORRFW.C:634
 upsilonCORRFW.C:635
 upsilonCORRFW.C:636
 upsilonCORRFW.C:637
 upsilonCORRFW.C:638
 upsilonCORRFW.C:639
 upsilonCORRFW.C:640
 upsilonCORRFW.C:641
 upsilonCORRFW.C:642
 upsilonCORRFW.C:643
 upsilonCORRFW.C:644
 upsilonCORRFW.C:645
 upsilonCORRFW.C:646
 upsilonCORRFW.C:647
 upsilonCORRFW.C:648
 upsilonCORRFW.C:649
 upsilonCORRFW.C:650
 upsilonCORRFW.C:651
 upsilonCORRFW.C:652
 upsilonCORRFW.C:653
 upsilonCORRFW.C:654
 upsilonCORRFW.C:655
 upsilonCORRFW.C:656
 upsilonCORRFW.C:657
 upsilonCORRFW.C:658
 upsilonCORRFW.C:659
 upsilonCORRFW.C:660
 upsilonCORRFW.C:661
 upsilonCORRFW.C:662
 upsilonCORRFW.C:663
 upsilonCORRFW.C:664
 upsilonCORRFW.C:665
 upsilonCORRFW.C:666
 upsilonCORRFW.C:667
 upsilonCORRFW.C:668
 upsilonCORRFW.C:669
 upsilonCORRFW.C:670
 upsilonCORRFW.C:671
 upsilonCORRFW.C:672
 upsilonCORRFW.C:673
 upsilonCORRFW.C:674
 upsilonCORRFW.C:675
 upsilonCORRFW.C:676
 upsilonCORRFW.C:677
 upsilonCORRFW.C:678
 upsilonCORRFW.C:679
 upsilonCORRFW.C:680
 upsilonCORRFW.C:681
 upsilonCORRFW.C:682
 upsilonCORRFW.C:683
 upsilonCORRFW.C:684
 upsilonCORRFW.C:685
 upsilonCORRFW.C:686
 upsilonCORRFW.C:687
 upsilonCORRFW.C:688
 upsilonCORRFW.C:689
 upsilonCORRFW.C:690
 upsilonCORRFW.C:691
 upsilonCORRFW.C:692
 upsilonCORRFW.C:693
 upsilonCORRFW.C:694
 upsilonCORRFW.C:695
 upsilonCORRFW.C:696
 upsilonCORRFW.C:697
 upsilonCORRFW.C:698
 upsilonCORRFW.C:699
 upsilonCORRFW.C:700
 upsilonCORRFW.C:701
 upsilonCORRFW.C:702
 upsilonCORRFW.C:703
 upsilonCORRFW.C:704
 upsilonCORRFW.C:705
 upsilonCORRFW.C:706
 upsilonCORRFW.C:707
 upsilonCORRFW.C:708
 upsilonCORRFW.C:709
 upsilonCORRFW.C:710
 upsilonCORRFW.C:711
 upsilonCORRFW.C:712
 upsilonCORRFW.C:713
 upsilonCORRFW.C:714
 upsilonCORRFW.C:715
 upsilonCORRFW.C:716
 upsilonCORRFW.C:717
 upsilonCORRFW.C:718
 upsilonCORRFW.C:719
 upsilonCORRFW.C:720
 upsilonCORRFW.C:721
 upsilonCORRFW.C:722
 upsilonCORRFW.C:723
 upsilonCORRFW.C:724
 upsilonCORRFW.C:725
 upsilonCORRFW.C:726
 upsilonCORRFW.C:727
 upsilonCORRFW.C:728
 upsilonCORRFW.C:729
 upsilonCORRFW.C:730
 upsilonCORRFW.C:731
 upsilonCORRFW.C:732
 upsilonCORRFW.C:733
 upsilonCORRFW.C:734
 upsilonCORRFW.C:735
 upsilonCORRFW.C:736
 upsilonCORRFW.C:737
 upsilonCORRFW.C:738
 upsilonCORRFW.C:739
 upsilonCORRFW.C:740
 upsilonCORRFW.C:741
 upsilonCORRFW.C:742
 upsilonCORRFW.C:743
 upsilonCORRFW.C:744
 upsilonCORRFW.C:745
 upsilonCORRFW.C:746
 upsilonCORRFW.C:747
 upsilonCORRFW.C:748
 upsilonCORRFW.C:749
 upsilonCORRFW.C:750
 upsilonCORRFW.C:751
 upsilonCORRFW.C:752
 upsilonCORRFW.C:753
 upsilonCORRFW.C:754
 upsilonCORRFW.C:755
 upsilonCORRFW.C:756
 upsilonCORRFW.C:757
 upsilonCORRFW.C:758
 upsilonCORRFW.C:759
 upsilonCORRFW.C:760
 upsilonCORRFW.C:761
 upsilonCORRFW.C:762
 upsilonCORRFW.C:763
 upsilonCORRFW.C:764
 upsilonCORRFW.C:765
 upsilonCORRFW.C:766
 upsilonCORRFW.C:767
 upsilonCORRFW.C:768
 upsilonCORRFW.C:769
 upsilonCORRFW.C:770
 upsilonCORRFW.C:771
 upsilonCORRFW.C:772
 upsilonCORRFW.C:773
 upsilonCORRFW.C:774
 upsilonCORRFW.C:775
 upsilonCORRFW.C:776
 upsilonCORRFW.C:777
 upsilonCORRFW.C:778
 upsilonCORRFW.C:779
 upsilonCORRFW.C:780
 upsilonCORRFW.C:781
 upsilonCORRFW.C:782
 upsilonCORRFW.C:783
 upsilonCORRFW.C:784
 upsilonCORRFW.C:785
 upsilonCORRFW.C:786
 upsilonCORRFW.C:787
 upsilonCORRFW.C:788
 upsilonCORRFW.C:789
 upsilonCORRFW.C:790
 upsilonCORRFW.C:791
 upsilonCORRFW.C:792
 upsilonCORRFW.C:793
 upsilonCORRFW.C:794
 upsilonCORRFW.C:795
 upsilonCORRFW.C:796
 upsilonCORRFW.C:797
 upsilonCORRFW.C:798
 upsilonCORRFW.C:799
 upsilonCORRFW.C:800
 upsilonCORRFW.C:801
 upsilonCORRFW.C:802
 upsilonCORRFW.C:803
 upsilonCORRFW.C:804
 upsilonCORRFW.C:805
 upsilonCORRFW.C:806
 upsilonCORRFW.C:807
 upsilonCORRFW.C:808
 upsilonCORRFW.C:809
 upsilonCORRFW.C:810
 upsilonCORRFW.C:811
 upsilonCORRFW.C:812
 upsilonCORRFW.C:813
 upsilonCORRFW.C:814
 upsilonCORRFW.C:815
 upsilonCORRFW.C:816
 upsilonCORRFW.C:817
 upsilonCORRFW.C:818
 upsilonCORRFW.C:819
 upsilonCORRFW.C:820
 upsilonCORRFW.C:821
 upsilonCORRFW.C:822
 upsilonCORRFW.C:823
 upsilonCORRFW.C:824
 upsilonCORRFW.C:825
 upsilonCORRFW.C:826
 upsilonCORRFW.C:827
 upsilonCORRFW.C:828
 upsilonCORRFW.C:829
 upsilonCORRFW.C:830
 upsilonCORRFW.C:831
 upsilonCORRFW.C:832
 upsilonCORRFW.C:833
 upsilonCORRFW.C:834
 upsilonCORRFW.C:835
 upsilonCORRFW.C:836
 upsilonCORRFW.C:837
 upsilonCORRFW.C:838
 upsilonCORRFW.C:839
 upsilonCORRFW.C:840
 upsilonCORRFW.C:841
 upsilonCORRFW.C:842
 upsilonCORRFW.C:843
 upsilonCORRFW.C:844
 upsilonCORRFW.C:845
 upsilonCORRFW.C:846
 upsilonCORRFW.C:847
 upsilonCORRFW.C:848
 upsilonCORRFW.C:849
 upsilonCORRFW.C:850
 upsilonCORRFW.C:851
 upsilonCORRFW.C:852
 upsilonCORRFW.C:853
 upsilonCORRFW.C:854
 upsilonCORRFW.C:855
 upsilonCORRFW.C:856
 upsilonCORRFW.C:857
 upsilonCORRFW.C:858
 upsilonCORRFW.C:859
 upsilonCORRFW.C:860
 upsilonCORRFW.C:861
 upsilonCORRFW.C:862
 upsilonCORRFW.C:863
 upsilonCORRFW.C:864
 upsilonCORRFW.C:865
 upsilonCORRFW.C:866
 upsilonCORRFW.C:867
 upsilonCORRFW.C:868
 upsilonCORRFW.C:869
 upsilonCORRFW.C:870
 upsilonCORRFW.C:871
 upsilonCORRFW.C:872
 upsilonCORRFW.C:873
 upsilonCORRFW.C:874
 upsilonCORRFW.C:875
 upsilonCORRFW.C:876
 upsilonCORRFW.C:877
 upsilonCORRFW.C:878
 upsilonCORRFW.C:879
 upsilonCORRFW.C:880
 upsilonCORRFW.C:881
 upsilonCORRFW.C:882
 upsilonCORRFW.C:883
 upsilonCORRFW.C:884
 upsilonCORRFW.C:885
 upsilonCORRFW.C:886
 upsilonCORRFW.C:887
 upsilonCORRFW.C:888
 upsilonCORRFW.C:889
 upsilonCORRFW.C:890
 upsilonCORRFW.C:891
 upsilonCORRFW.C:892
 upsilonCORRFW.C:893
 upsilonCORRFW.C:894
 upsilonCORRFW.C:895
 upsilonCORRFW.C:896
 upsilonCORRFW.C:897
 upsilonCORRFW.C:898
 upsilonCORRFW.C:899
 upsilonCORRFW.C:900
 upsilonCORRFW.C:901
 upsilonCORRFW.C:902
 upsilonCORRFW.C:903
 upsilonCORRFW.C:904
 upsilonCORRFW.C:905
 upsilonCORRFW.C:906
 upsilonCORRFW.C:907
 upsilonCORRFW.C:908
 upsilonCORRFW.C:909
 upsilonCORRFW.C:910
 upsilonCORRFW.C:911
 upsilonCORRFW.C:912
 upsilonCORRFW.C:913
 upsilonCORRFW.C:914
 upsilonCORRFW.C:915
 upsilonCORRFW.C:916
 upsilonCORRFW.C:917
 upsilonCORRFW.C:918
 upsilonCORRFW.C:919
 upsilonCORRFW.C:920
 upsilonCORRFW.C:921
 upsilonCORRFW.C:922
 upsilonCORRFW.C:923
 upsilonCORRFW.C:924
 upsilonCORRFW.C:925
 upsilonCORRFW.C:926
 upsilonCORRFW.C:927
 upsilonCORRFW.C:928
 upsilonCORRFW.C:929
 upsilonCORRFW.C:930
 upsilonCORRFW.C:931
 upsilonCORRFW.C:932
 upsilonCORRFW.C:933
 upsilonCORRFW.C:934
 upsilonCORRFW.C:935
 upsilonCORRFW.C:936
 upsilonCORRFW.C:937
 upsilonCORRFW.C:938
 upsilonCORRFW.C:939
 upsilonCORRFW.C:940
 upsilonCORRFW.C:941
 upsilonCORRFW.C:942
 upsilonCORRFW.C:943
 upsilonCORRFW.C:944
 upsilonCORRFW.C:945
 upsilonCORRFW.C:946
 upsilonCORRFW.C:947
 upsilonCORRFW.C:948
 upsilonCORRFW.C:949
 upsilonCORRFW.C:950
 upsilonCORRFW.C:951
 upsilonCORRFW.C:952
 upsilonCORRFW.C:953
 upsilonCORRFW.C:954
 upsilonCORRFW.C:955
 upsilonCORRFW.C:956
 upsilonCORRFW.C:957
 upsilonCORRFW.C:958
 upsilonCORRFW.C:959
 upsilonCORRFW.C:960
 upsilonCORRFW.C:961
 upsilonCORRFW.C:962
 upsilonCORRFW.C:963
 upsilonCORRFW.C:964
 upsilonCORRFW.C:965
 upsilonCORRFW.C:966
 upsilonCORRFW.C:967
 upsilonCORRFW.C:968
 upsilonCORRFW.C:969
 upsilonCORRFW.C:970
 upsilonCORRFW.C:971
 upsilonCORRFW.C:972
 upsilonCORRFW.C:973
 upsilonCORRFW.C:974
 upsilonCORRFW.C:975
 upsilonCORRFW.C:976
 upsilonCORRFW.C:977
 upsilonCORRFW.C:978
 upsilonCORRFW.C:979
 upsilonCORRFW.C:980
 upsilonCORRFW.C:981
 upsilonCORRFW.C:982
 upsilonCORRFW.C:983
 upsilonCORRFW.C:984
 upsilonCORRFW.C:985
 upsilonCORRFW.C:986
 upsilonCORRFW.C:987
 upsilonCORRFW.C:988
 upsilonCORRFW.C:989
 upsilonCORRFW.C:990
 upsilonCORRFW.C:991
 upsilonCORRFW.C:992
 upsilonCORRFW.C:993
 upsilonCORRFW.C:994
 upsilonCORRFW.C:995
 upsilonCORRFW.C:996
 upsilonCORRFW.C:997
 upsilonCORRFW.C:998
 upsilonCORRFW.C:999
 upsilonCORRFW.C:1000
 upsilonCORRFW.C:1001
 upsilonCORRFW.C:1002
 upsilonCORRFW.C:1003
 upsilonCORRFW.C:1004
 upsilonCORRFW.C:1005
 upsilonCORRFW.C:1006
 upsilonCORRFW.C:1007
 upsilonCORRFW.C:1008
 upsilonCORRFW.C:1009
 upsilonCORRFW.C:1010
 upsilonCORRFW.C:1011
 upsilonCORRFW.C:1012
 upsilonCORRFW.C:1013
 upsilonCORRFW.C:1014
 upsilonCORRFW.C:1015
 upsilonCORRFW.C:1016
 upsilonCORRFW.C:1017
 upsilonCORRFW.C:1018
 upsilonCORRFW.C:1019
 upsilonCORRFW.C:1020
 upsilonCORRFW.C:1021
 upsilonCORRFW.C:1022
 upsilonCORRFW.C:1023
 upsilonCORRFW.C:1024
 upsilonCORRFW.C:1025
 upsilonCORRFW.C:1026
 upsilonCORRFW.C:1027
 upsilonCORRFW.C:1028
 upsilonCORRFW.C:1029
 upsilonCORRFW.C:1030
 upsilonCORRFW.C:1031
 upsilonCORRFW.C:1032
 upsilonCORRFW.C:1033
 upsilonCORRFW.C:1034
 upsilonCORRFW.C:1035
 upsilonCORRFW.C:1036
 upsilonCORRFW.C:1037
 upsilonCORRFW.C:1038
 upsilonCORRFW.C:1039
 upsilonCORRFW.C:1040
 upsilonCORRFW.C:1041
 upsilonCORRFW.C:1042
 upsilonCORRFW.C:1043
 upsilonCORRFW.C:1044
 upsilonCORRFW.C:1045
 upsilonCORRFW.C:1046
 upsilonCORRFW.C:1047
 upsilonCORRFW.C:1048
 upsilonCORRFW.C:1049
 upsilonCORRFW.C:1050
 upsilonCORRFW.C:1051
 upsilonCORRFW.C:1052
 upsilonCORRFW.C:1053
 upsilonCORRFW.C:1054
 upsilonCORRFW.C:1055
 upsilonCORRFW.C:1056
 upsilonCORRFW.C:1057
 upsilonCORRFW.C:1058
 upsilonCORRFW.C:1059
 upsilonCORRFW.C:1060
 upsilonCORRFW.C:1061
 upsilonCORRFW.C:1062
 upsilonCORRFW.C:1063
 upsilonCORRFW.C:1064
 upsilonCORRFW.C:1065
 upsilonCORRFW.C:1066
 upsilonCORRFW.C:1067
 upsilonCORRFW.C:1068
 upsilonCORRFW.C:1069
 upsilonCORRFW.C:1070
 upsilonCORRFW.C:1071
 upsilonCORRFW.C:1072
 upsilonCORRFW.C:1073
 upsilonCORRFW.C:1074
 upsilonCORRFW.C:1075
 upsilonCORRFW.C:1076
 upsilonCORRFW.C:1077
 upsilonCORRFW.C:1078
 upsilonCORRFW.C:1079
 upsilonCORRFW.C:1080
 upsilonCORRFW.C:1081
 upsilonCORRFW.C:1082
 upsilonCORRFW.C:1083
 upsilonCORRFW.C:1084
 upsilonCORRFW.C:1085
 upsilonCORRFW.C:1086
 upsilonCORRFW.C:1087
 upsilonCORRFW.C:1088
 upsilonCORRFW.C:1089
 upsilonCORRFW.C:1090
 upsilonCORRFW.C:1091
 upsilonCORRFW.C:1092
 upsilonCORRFW.C:1093
 upsilonCORRFW.C:1094
 upsilonCORRFW.C:1095
 upsilonCORRFW.C:1096
 upsilonCORRFW.C:1097
 upsilonCORRFW.C:1098
 upsilonCORRFW.C:1099
 upsilonCORRFW.C:1100
 upsilonCORRFW.C:1101
 upsilonCORRFW.C:1102
 upsilonCORRFW.C:1103
 upsilonCORRFW.C:1104
 upsilonCORRFW.C:1105
 upsilonCORRFW.C:1106
 upsilonCORRFW.C:1107
 upsilonCORRFW.C:1108
 upsilonCORRFW.C:1109
 upsilonCORRFW.C:1110
 upsilonCORRFW.C:1111
 upsilonCORRFW.C:1112
 upsilonCORRFW.C:1113
 upsilonCORRFW.C:1114
 upsilonCORRFW.C:1115
 upsilonCORRFW.C:1116
 upsilonCORRFW.C:1117
 upsilonCORRFW.C:1118
 upsilonCORRFW.C:1119
 upsilonCORRFW.C:1120
 upsilonCORRFW.C:1121
 upsilonCORRFW.C:1122
 upsilonCORRFW.C:1123
 upsilonCORRFW.C:1124
 upsilonCORRFW.C:1125
 upsilonCORRFW.C:1126
 upsilonCORRFW.C:1127
 upsilonCORRFW.C:1128
 upsilonCORRFW.C:1129
 upsilonCORRFW.C:1130
 upsilonCORRFW.C:1131
 upsilonCORRFW.C:1132
 upsilonCORRFW.C:1133
 upsilonCORRFW.C:1134
 upsilonCORRFW.C:1135
 upsilonCORRFW.C:1136
 upsilonCORRFW.C:1137
 upsilonCORRFW.C:1138
 upsilonCORRFW.C:1139
 upsilonCORRFW.C:1140
 upsilonCORRFW.C:1141
 upsilonCORRFW.C:1142
 upsilonCORRFW.C:1143
 upsilonCORRFW.C:1144
 upsilonCORRFW.C:1145
 upsilonCORRFW.C:1146
 upsilonCORRFW.C:1147
 upsilonCORRFW.C:1148
 upsilonCORRFW.C:1149
 upsilonCORRFW.C:1150
 upsilonCORRFW.C:1151
 upsilonCORRFW.C:1152
 upsilonCORRFW.C:1153
 upsilonCORRFW.C:1154
 upsilonCORRFW.C:1155
 upsilonCORRFW.C:1156
 upsilonCORRFW.C:1157
 upsilonCORRFW.C:1158
 upsilonCORRFW.C:1159
 upsilonCORRFW.C:1160
 upsilonCORRFW.C:1161
 upsilonCORRFW.C:1162
 upsilonCORRFW.C:1163
 upsilonCORRFW.C:1164
 upsilonCORRFW.C:1165
 upsilonCORRFW.C:1166
 upsilonCORRFW.C:1167
 upsilonCORRFW.C:1168
 upsilonCORRFW.C:1169
 upsilonCORRFW.C:1170
 upsilonCORRFW.C:1171
 upsilonCORRFW.C:1172
 upsilonCORRFW.C:1173
 upsilonCORRFW.C:1174
 upsilonCORRFW.C:1175
 upsilonCORRFW.C:1176
 upsilonCORRFW.C:1177
 upsilonCORRFW.C:1178
 upsilonCORRFW.C:1179
 upsilonCORRFW.C:1180
 upsilonCORRFW.C:1181
 upsilonCORRFW.C:1182
 upsilonCORRFW.C:1183
 upsilonCORRFW.C:1184
 upsilonCORRFW.C:1185
 upsilonCORRFW.C:1186
 upsilonCORRFW.C:1187
 upsilonCORRFW.C:1188
 upsilonCORRFW.C:1189
 upsilonCORRFW.C:1190
 upsilonCORRFW.C:1191
 upsilonCORRFW.C:1192
 upsilonCORRFW.C:1193
 upsilonCORRFW.C:1194
 upsilonCORRFW.C:1195
 upsilonCORRFW.C:1196
 upsilonCORRFW.C:1197
 upsilonCORRFW.C:1198
 upsilonCORRFW.C:1199
 upsilonCORRFW.C:1200
 upsilonCORRFW.C:1201
 upsilonCORRFW.C:1202
 upsilonCORRFW.C:1203
 upsilonCORRFW.C:1204
 upsilonCORRFW.C:1205
 upsilonCORRFW.C:1206
 upsilonCORRFW.C:1207
 upsilonCORRFW.C:1208
 upsilonCORRFW.C:1209
 upsilonCORRFW.C:1210