ROOT logo
/************************************************************************* 
* Copyright(c) 1998-2008, 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.                  * 
**************************************************************************/

// -----------------------------------------------------------------------
//  Definitions the mathematical functions used in the DiHadronPID
//  analysis.
// -----------------------------------------------------------------------
//  Author: Misha Veldhoen (misha.veldhoen@cern.ch)

#include "AliFunctionsDiHadronPID.h"

#include <iostream>
using namespace std;

#include "AliExternalTrackParam.h"
#include "TF1.h"

// -----------------------------------------------------------------------
AliFunctionsDiHadronPID::AliFunctionsDiHadronPID()

{

	// Constructor.

} 

// -----------------------------------------------------------------------
AliFunctionsDiHadronPID::~AliFunctionsDiHadronPID()

{

	// Destructor.

} 

// -----------------------------------------------------------------------
Int_t AliFunctionsDiHadronPID::Power(Int_t base, Int_t power) {

	// Power function for integers (not available in TMath).

	if (power > 0) {
		Int_t result = 1;
		for (Int_t ii = 0; ii < power; ++ii) {result *= base;}
		return result;
	} else {
		if (power == 0) {return 1;}
		else {
			cout << Form("%s::%s -> WARNING: Method doesn't work for negative powers.",__FILE__,__func__) << endl;
			return -999;
		}
	}

}

// -----------------------------------------------------------------------
Double_t AliFunctionsDiHadronPID::Gaussian1D(Double_t xx, Double_t integral, Double_t mu, Double_t sigma, Double_t binwidth) {

	// The other implementation should make use of this one.
	Double_t norm = (binwidth*integral)/(TMath::Sqrt(2.*TMath::Pi())*sigma);
	Double_t gaussian = TMath::Exp(-(xx-mu)*(xx-mu)/(2.*sigma*sigma));

	return (norm*gaussian);

}

// -----------------------------------------------------------------------
Double_t AliFunctionsDiHadronPID::Gaussian1DTail(Double_t xx, Double_t integral, Double_t mu, Double_t sigma, Double_t tail, Double_t binwidth) {

	// Gaussian with exponential tail on the right, I is the integral.
	// For function definition see: FitFunctions.nb

	Double_t kappa = mu + tail;

	if (mu >= kappa) return 0.; 	// Function becomes ill-defined.

	Double_t beta = sigma*sigma/(kappa-mu);
	Double_t BB = TMath::Exp( (kappa*kappa-mu*mu)/(2.*sigma*sigma) );
	Double_t norm1 = beta*TMath::Exp( -(mu-kappa)*(mu-kappa)/(2.*sigma*sigma) );
	Double_t norm2 = TMath::Sqrt(TMath::Pi()/2.)*sigma*TMath::Erfc( (mu-kappa)/(TMath::Sqrt2()*sigma) );
	Double_t norm = norm1 + norm2;

	Double_t funcleft = binwidth * (integral/norm)*TMath::Exp(-(xx-mu)*(xx-mu)/(2.*sigma*sigma));
	Double_t funcright = binwidth * (integral/norm)*BB*TMath::Exp(-xx/beta);

	if (xx <= kappa) return funcleft;
	else return funcright;

}

// -----------------------------------------------------------------------
Double_t AliFunctionsDiHadronPID::Gaussian2D(Double_t xx, Double_t yy, Double_t integral, 
	Double_t mux, Double_t muy, Double_t sigmax, Double_t sigmay, 
	Double_t binwidthx, Double_t binwidthy) {

	// 2D Gaussian.
	Double_t GaussianX = Gaussian1D(xx, 1., mux, sigmax, binwidthx);
	Double_t GaussianY = Gaussian1D(yy, 1., muy, sigmay, binwidthy);

	return integral * GaussianX * GaussianY; 

}

// -----------------------------------------------------------------------
Double_t AliFunctionsDiHadronPID::Gaussian2DTailX(Double_t xx, Double_t yy, Double_t integral, 
	Double_t mux, Double_t muy, Double_t sigmax, Double_t sigmay, 
	Double_t tailx, Double_t binwidthx, Double_t binwidthy) {

	// 2D Gaussian with exponential tail in X direction.
	Double_t GaussianTailX = Gaussian1DTail(xx, 1., mux, sigmax, tailx, binwidthx);
	Double_t GaussianY = Gaussian1D(yy, 1., muy, sigmay, binwidthy);

	return integral * GaussianTailX * GaussianY;

}

// -----------------------------------------------------------------------
Double_t AliFunctionsDiHadronPID::Gaussian2DTailY(Double_t xx, Double_t yy, Double_t integral, 
	Double_t mux, Double_t muy, Double_t sigmax, Double_t sigmay, 
	Double_t taily, Double_t binwidthx, Double_t binwidthy) {

	// 2D Gaussian with exponential tail in Y direction.
	Double_t GaussianX = Gaussian1D(xx, 1., mux, sigmax, binwidthx);
	Double_t GaussianTailY = Gaussian1DTail(yy, 1., muy, sigmay, taily, binwidthy);

	return integral * GaussianX * GaussianTailY;

}

// -----------------------------------------------------------------------
Double_t AliFunctionsDiHadronPID::Gaussian2DTailXY(Double_t xx, Double_t yy, Double_t integral, 
	Double_t mux, Double_t muy, Double_t sigmax, Double_t sigmay, 
	Double_t tailx, Double_t taily, Double_t binwidthx, Double_t binwidthy) {

	// 2D Gaussian with exponential tail in X- and Y direction.
	Double_t GaussianTailX = Gaussian1DTail(xx, 1., mux, sigmax, tailx, binwidthx);
	Double_t GaussianTailY = Gaussian1DTail(yy, 1., muy, sigmay, taily, binwidthy);

	return integral * GaussianTailX * GaussianTailY;

}

// -----------------------------------------------------------------------
Double_t AliFunctionsDiHadronPID::PolyPenalty(Double_t xx, Double_t center, Double_t flatwidth, const Int_t polyorder) {

	// Penalty function for a chi^2 fit. The function is defined as:
	// 1 											for |xx - center| < flatwidth,
	// (|xx - center| - flatwidth) ^ polyorder		for |xx - center| > flatwidth.

	Double_t fx = 1.;
	if (TMath::Abs(xx - center) > flatwidth) {
		fx = TMath::Power( (TMath::Abs(xx - center) - flatwidth), polyorder ) + 1.;
	}

	return fx;

}

// -----------------------------------------------------------------------
TCanvas* AliFunctionsDiHadronPID::TestPolyPenalty(Double_t range, Double_t center, Double_t flatwidth, const Int_t polyorder) {

	// Creates an example of the TestPolyPenalty function.
	TF1* tf = new TF1("tf",Form("AliFunctionsDiHadronPID::PolyPenalty(x,[0],[1],%i)",polyorder),-range,range);
	tf->SetParameters(center,flatwidth);
	TCanvas* cvs = TCanvas::MakeDefCanvas();
	tf->Draw();

	return cvs;

}

// -----------------------------------------------------------------------
Double_t AliFunctionsDiHadronPID::TOFExpTime(Double_t pT, Double_t eta, Double_t mass) {

	// For description see ../Documents/TOFtime.tex

	Double_t AA = (2. * pT) / ( Charge() * BTPC() * GeVperkg() );
	Double_t BB = TMath::ASin( (Charge() * BTPC() * 0.01 * RTOF() * GeVperkg() ) / (2. * pT * C()) ); 
	Double_t CC = TMath::Sqrt( mass*mass/(pT*pT) + TMath::CosH(eta)*TMath::CosH(eta) );

	return (1.e12*AA*BB*CC);   // Time returned in ps.

}

// -----------------------------------------------------------------------
Double_t AliFunctionsDiHadronPID::TPCExpdEdX(Double_t pT, Double_t eta, Double_t mass) {

	// Not so neat solution, however the easiest for now.

	// Prameters taken from the constructor of AliTPCPIDResponse:
	Double_t MIP = 50.;
	Double_t Kp[5] = {0.0283086, 2.63394e+01, 5.04114e-11, 2.12543, 4.88663};

	Double_t betaGamma = TMath::Abs( (pT * TMath::CosH(eta)) / mass );

	// Implementation as in AliTPCPIDResponse.
	return MIP * AliExternalTrackParam::BetheBlochAleph(betaGamma,Kp[0],Kp[1],Kp[2],Kp[3],Kp[4]);

}
 AliFunctionsDiHadronPID.cxx:1
 AliFunctionsDiHadronPID.cxx:2
 AliFunctionsDiHadronPID.cxx:3
 AliFunctionsDiHadronPID.cxx:4
 AliFunctionsDiHadronPID.cxx:5
 AliFunctionsDiHadronPID.cxx:6
 AliFunctionsDiHadronPID.cxx:7
 AliFunctionsDiHadronPID.cxx:8
 AliFunctionsDiHadronPID.cxx:9
 AliFunctionsDiHadronPID.cxx:10
 AliFunctionsDiHadronPID.cxx:11
 AliFunctionsDiHadronPID.cxx:12
 AliFunctionsDiHadronPID.cxx:13
 AliFunctionsDiHadronPID.cxx:14
 AliFunctionsDiHadronPID.cxx:15
 AliFunctionsDiHadronPID.cxx:16
 AliFunctionsDiHadronPID.cxx:17
 AliFunctionsDiHadronPID.cxx:18
 AliFunctionsDiHadronPID.cxx:19
 AliFunctionsDiHadronPID.cxx:20
 AliFunctionsDiHadronPID.cxx:21
 AliFunctionsDiHadronPID.cxx:22
 AliFunctionsDiHadronPID.cxx:23
 AliFunctionsDiHadronPID.cxx:24
 AliFunctionsDiHadronPID.cxx:25
 AliFunctionsDiHadronPID.cxx:26
 AliFunctionsDiHadronPID.cxx:27
 AliFunctionsDiHadronPID.cxx:28
 AliFunctionsDiHadronPID.cxx:29
 AliFunctionsDiHadronPID.cxx:30
 AliFunctionsDiHadronPID.cxx:31
 AliFunctionsDiHadronPID.cxx:32
 AliFunctionsDiHadronPID.cxx:33
 AliFunctionsDiHadronPID.cxx:34
 AliFunctionsDiHadronPID.cxx:35
 AliFunctionsDiHadronPID.cxx:36
 AliFunctionsDiHadronPID.cxx:37
 AliFunctionsDiHadronPID.cxx:38
 AliFunctionsDiHadronPID.cxx:39
 AliFunctionsDiHadronPID.cxx:40
 AliFunctionsDiHadronPID.cxx:41
 AliFunctionsDiHadronPID.cxx:42
 AliFunctionsDiHadronPID.cxx:43
 AliFunctionsDiHadronPID.cxx:44
 AliFunctionsDiHadronPID.cxx:45
 AliFunctionsDiHadronPID.cxx:46
 AliFunctionsDiHadronPID.cxx:47
 AliFunctionsDiHadronPID.cxx:48
 AliFunctionsDiHadronPID.cxx:49
 AliFunctionsDiHadronPID.cxx:50
 AliFunctionsDiHadronPID.cxx:51
 AliFunctionsDiHadronPID.cxx:52
 AliFunctionsDiHadronPID.cxx:53
 AliFunctionsDiHadronPID.cxx:54
 AliFunctionsDiHadronPID.cxx:55
 AliFunctionsDiHadronPID.cxx:56
 AliFunctionsDiHadronPID.cxx:57
 AliFunctionsDiHadronPID.cxx:58
 AliFunctionsDiHadronPID.cxx:59
 AliFunctionsDiHadronPID.cxx:60
 AliFunctionsDiHadronPID.cxx:61
 AliFunctionsDiHadronPID.cxx:62
 AliFunctionsDiHadronPID.cxx:63
 AliFunctionsDiHadronPID.cxx:64
 AliFunctionsDiHadronPID.cxx:65
 AliFunctionsDiHadronPID.cxx:66
 AliFunctionsDiHadronPID.cxx:67
 AliFunctionsDiHadronPID.cxx:68
 AliFunctionsDiHadronPID.cxx:69
 AliFunctionsDiHadronPID.cxx:70
 AliFunctionsDiHadronPID.cxx:71
 AliFunctionsDiHadronPID.cxx:72
 AliFunctionsDiHadronPID.cxx:73
 AliFunctionsDiHadronPID.cxx:74
 AliFunctionsDiHadronPID.cxx:75
 AliFunctionsDiHadronPID.cxx:76
 AliFunctionsDiHadronPID.cxx:77
 AliFunctionsDiHadronPID.cxx:78
 AliFunctionsDiHadronPID.cxx:79
 AliFunctionsDiHadronPID.cxx:80
 AliFunctionsDiHadronPID.cxx:81
 AliFunctionsDiHadronPID.cxx:82
 AliFunctionsDiHadronPID.cxx:83
 AliFunctionsDiHadronPID.cxx:84
 AliFunctionsDiHadronPID.cxx:85
 AliFunctionsDiHadronPID.cxx:86
 AliFunctionsDiHadronPID.cxx:87
 AliFunctionsDiHadronPID.cxx:88
 AliFunctionsDiHadronPID.cxx:89
 AliFunctionsDiHadronPID.cxx:90
 AliFunctionsDiHadronPID.cxx:91
 AliFunctionsDiHadronPID.cxx:92
 AliFunctionsDiHadronPID.cxx:93
 AliFunctionsDiHadronPID.cxx:94
 AliFunctionsDiHadronPID.cxx:95
 AliFunctionsDiHadronPID.cxx:96
 AliFunctionsDiHadronPID.cxx:97
 AliFunctionsDiHadronPID.cxx:98
 AliFunctionsDiHadronPID.cxx:99
 AliFunctionsDiHadronPID.cxx:100
 AliFunctionsDiHadronPID.cxx:101
 AliFunctionsDiHadronPID.cxx:102
 AliFunctionsDiHadronPID.cxx:103
 AliFunctionsDiHadronPID.cxx:104
 AliFunctionsDiHadronPID.cxx:105
 AliFunctionsDiHadronPID.cxx:106
 AliFunctionsDiHadronPID.cxx:107
 AliFunctionsDiHadronPID.cxx:108
 AliFunctionsDiHadronPID.cxx:109
 AliFunctionsDiHadronPID.cxx:110
 AliFunctionsDiHadronPID.cxx:111
 AliFunctionsDiHadronPID.cxx:112
 AliFunctionsDiHadronPID.cxx:113
 AliFunctionsDiHadronPID.cxx:114
 AliFunctionsDiHadronPID.cxx:115
 AliFunctionsDiHadronPID.cxx:116
 AliFunctionsDiHadronPID.cxx:117
 AliFunctionsDiHadronPID.cxx:118
 AliFunctionsDiHadronPID.cxx:119
 AliFunctionsDiHadronPID.cxx:120
 AliFunctionsDiHadronPID.cxx:121
 AliFunctionsDiHadronPID.cxx:122
 AliFunctionsDiHadronPID.cxx:123
 AliFunctionsDiHadronPID.cxx:124
 AliFunctionsDiHadronPID.cxx:125
 AliFunctionsDiHadronPID.cxx:126
 AliFunctionsDiHadronPID.cxx:127
 AliFunctionsDiHadronPID.cxx:128
 AliFunctionsDiHadronPID.cxx:129
 AliFunctionsDiHadronPID.cxx:130
 AliFunctionsDiHadronPID.cxx:131
 AliFunctionsDiHadronPID.cxx:132
 AliFunctionsDiHadronPID.cxx:133
 AliFunctionsDiHadronPID.cxx:134
 AliFunctionsDiHadronPID.cxx:135
 AliFunctionsDiHadronPID.cxx:136
 AliFunctionsDiHadronPID.cxx:137
 AliFunctionsDiHadronPID.cxx:138
 AliFunctionsDiHadronPID.cxx:139
 AliFunctionsDiHadronPID.cxx:140
 AliFunctionsDiHadronPID.cxx:141
 AliFunctionsDiHadronPID.cxx:142
 AliFunctionsDiHadronPID.cxx:143
 AliFunctionsDiHadronPID.cxx:144
 AliFunctionsDiHadronPID.cxx:145
 AliFunctionsDiHadronPID.cxx:146
 AliFunctionsDiHadronPID.cxx:147
 AliFunctionsDiHadronPID.cxx:148
 AliFunctionsDiHadronPID.cxx:149
 AliFunctionsDiHadronPID.cxx:150
 AliFunctionsDiHadronPID.cxx:151
 AliFunctionsDiHadronPID.cxx:152
 AliFunctionsDiHadronPID.cxx:153
 AliFunctionsDiHadronPID.cxx:154
 AliFunctionsDiHadronPID.cxx:155
 AliFunctionsDiHadronPID.cxx:156
 AliFunctionsDiHadronPID.cxx:157
 AliFunctionsDiHadronPID.cxx:158
 AliFunctionsDiHadronPID.cxx:159
 AliFunctionsDiHadronPID.cxx:160
 AliFunctionsDiHadronPID.cxx:161
 AliFunctionsDiHadronPID.cxx:162
 AliFunctionsDiHadronPID.cxx:163
 AliFunctionsDiHadronPID.cxx:164
 AliFunctionsDiHadronPID.cxx:165
 AliFunctionsDiHadronPID.cxx:166
 AliFunctionsDiHadronPID.cxx:167
 AliFunctionsDiHadronPID.cxx:168
 AliFunctionsDiHadronPID.cxx:169
 AliFunctionsDiHadronPID.cxx:170
 AliFunctionsDiHadronPID.cxx:171
 AliFunctionsDiHadronPID.cxx:172
 AliFunctionsDiHadronPID.cxx:173
 AliFunctionsDiHadronPID.cxx:174
 AliFunctionsDiHadronPID.cxx:175
 AliFunctionsDiHadronPID.cxx:176
 AliFunctionsDiHadronPID.cxx:177
 AliFunctionsDiHadronPID.cxx:178
 AliFunctionsDiHadronPID.cxx:179
 AliFunctionsDiHadronPID.cxx:180
 AliFunctionsDiHadronPID.cxx:181
 AliFunctionsDiHadronPID.cxx:182
 AliFunctionsDiHadronPID.cxx:183
 AliFunctionsDiHadronPID.cxx:184
 AliFunctionsDiHadronPID.cxx:185
 AliFunctionsDiHadronPID.cxx:186
 AliFunctionsDiHadronPID.cxx:187
 AliFunctionsDiHadronPID.cxx:188
 AliFunctionsDiHadronPID.cxx:189
 AliFunctionsDiHadronPID.cxx:190
 AliFunctionsDiHadronPID.cxx:191
 AliFunctionsDiHadronPID.cxx:192
 AliFunctionsDiHadronPID.cxx:193
 AliFunctionsDiHadronPID.cxx:194
 AliFunctionsDiHadronPID.cxx:195
 AliFunctionsDiHadronPID.cxx:196
 AliFunctionsDiHadronPID.cxx:197
 AliFunctionsDiHadronPID.cxx:198
 AliFunctionsDiHadronPID.cxx:199
 AliFunctionsDiHadronPID.cxx:200
 AliFunctionsDiHadronPID.cxx:201
 AliFunctionsDiHadronPID.cxx:202
 AliFunctionsDiHadronPID.cxx:203
 AliFunctionsDiHadronPID.cxx:204
 AliFunctionsDiHadronPID.cxx:205
 AliFunctionsDiHadronPID.cxx:206
 AliFunctionsDiHadronPID.cxx:207
 AliFunctionsDiHadronPID.cxx:208
 AliFunctionsDiHadronPID.cxx:209
 AliFunctionsDiHadronPID.cxx:210