ROOT logo
//----------------------------------------------------------------------
//                              AliPWGFunc
//
// This class implements several function useful to fit pt spectra,
// including but not limited to blast wave models.
//
//
// Author: M. Floris, CERN
//----------------------------------------------------------------------

#ifndef ALIBWFUNC_H
#define ALIBWFUNC_H

#if !defined(__CINT__) || defined(__MAKECINT__)

#include "TObject.h"

class TF1;
class TH1;
class TGraph;
#endif



class AliPWGFunc : public TObject {


public:
  // define the variables used for the function
  typedef enum {kdNdpt,kOneOverPtdNdpt,kOneOverMtdNdmt,kdNdmt,kOneOverMtdNdmtMinusM} VarType_t;

  AliPWGFunc();
  ~AliPWGFunc();

  // Boltzmann-Gibbs Blast Wave
  TF1 * GetBGBW(Double_t mass, Double_t beta, Double_t T, Double_t n,
		Double_t norm, const char * name = "fBGBW");

  
  // Boltzmann
  TF1 * GetBoltzmann(Double_t mass, Double_t T, Double_t norm, const char * name ="fBoltzmann");

  // Tsallis blast wave
  TF1 * GetTsallisBW(Double_t mass, Double_t beta, Double_t T, Double_t q,
		     Double_t norm, Double_t ymax = 0.5, const char * name = "fTsallisBW");

  // Simple exponential in 1/mt*dNdmt
  TF1 * GetMTExp(Double_t mass, Double_t T, Double_t norm, const char * name ="fMtExp");

  // Simple exponential in 1/pt*dNdpt
  TF1 * GetPTExp(Double_t T, Double_t norm, const char * name ="fPtExp");

  // Tsallis (no BW, a la CMS)
  TF1 * GetTsallis(Double_t mass, Double_t T, Double_t q, Double_t norm, const char * name="fTsallis") 
  {return GetLevi (mass,T,1/(q-1),norm,name);}
  
  // Levi function (aka Tsallis)
  TF1 * GetLevi(Double_t mass, Double_t T, Double_t n, Double_t norm, const char * name="fLevi");

  // UA1 function 
  TF1 * GetUA1(Double_t mass, Double_t p0star, Double_t pt0, Double_t n, Double_t T, Double_t norm, const char * name="fUA1");

  // Function derived from a histo
  TF1 * GetHistoFunc(TH1 * h, const char * name = "fHisto");

  // Function derived from a graph
  TF1 * GetGraphFunc(TGraph * h, const char * name = "fHisto");

  // Power law
  TF1 * GetPowerLaw(Double_t pt0, Double_t n, Double_t norm, const char * name="fPowerLaw");
  

  // Bose-Einstein
  TF1 * GetBoseEinstein(Double_t mass, Double_t T, Double_t norm, const char * name="fBoseEinstein");

  // Fermi-Dirac
  TF1 * GetFermiDirac(Double_t mass, Double_t T, Double_t norm, const char * name="fFermiDirac");


  void SetVarType(VarType_t tp) {fVarType=tp;}

protected:

  // dNdpt here means 1/pt dN/dpt
  

  // Boltzmann-Gibbs blast wave
  TF1 * GetBGBWdNdpt(Double_t mass, Double_t beta, Double_t temp,
		     Double_t n, Double_t norm, const char * name= "fBGBW");

  // Tsallis blast wave
  TF1 * GetTsallisBWdNdpt(Double_t mass, Double_t beta, Double_t T, Double_t q,
			  Double_t norm, Double_t ymax = 0.5, const char * name = "fTsallisBW");

  // Simple exponential in 1/mt*MT
  TF1 * GetMTExpdNdpt(Double_t mass, Double_t T, Double_t norm, const char * name ="fExp");

  // Bose-Einstein
  TF1 * GetBoseEinsteindNdpt(Double_t mass, Double_t T, Double_t norm, const char * name="fBoseEinstein");

  // Fermi-Dirac
  TF1 * GetFermiDiracdNdpt(Double_t mass, Double_t T, Double_t norm, const char * name="fFermiDirac");


  // Tsallis (no BW, a la CMS)
  TF1 * GetTsallisdNdpt(Double_t mass, Double_t T, Double_t q, Double_t norm, const char * name="fTsallis");

  // Levi function
  TF1 * GetLevidNdpt(Double_t mass, Double_t T, Double_t n, Double_t norm, const char * name="fLevi");

  // Power Law function
  TF1 * GetPowerLawdNdpt(Double_t pt0, Double_t n, Double_t norm, const char * name="fLevi");

  // UA1 function
  TF1 * GetUA1dNdpt(Double_t pt0, Double_t n, Double_t norm, const char * name="fLevi");

  // TimesPt means dNdpt

  // Boltzmann-Gibbs Blast Wave
  TF1 * GetBGBWdNdptTimesPt(Double_t mass, Double_t beta, Double_t T, Double_t n,
			    Double_t norm, const char * name = "fBGBWTimesPt");

  TF1 * GetBGBWdNdptTimesMt(Double_t mass, Double_t beta, Double_t T, Double_t n,
			    Double_t norm, const char * name = "fBGBWTimesMt");


  // Tsallis blast wave
  TF1 * GetTsallisBWdNdptTimesPt(Double_t mass, Double_t beta, Double_t T, Double_t q,
				 Double_t norm, Double_t ymax = 0.5, const char * name = "fTsallisBWTimesPt");
  // Levi function
  TF1 * GetLevidNdptTimesPt(Double_t mass, Double_t T, Double_t n, Double_t norm, const char * name="fLevi");

  // UA1 function
  TF1 * GetUA1dNdptTimesPt(Double_t pt0, Double_t n, Double_t norm, const char * name="fLevi");

  // PowerLaw function
  TF1 * GetPowerLawdNdptTimesPt(Double_t pt0, Double_t n, Double_t norm, const char * name="fLevi");

  // Simple exponential in 1/mt*dNdmT
  TF1 * GetMTExpdNdptTimesPt(Double_t mass, Double_t T, Double_t norm, const char * name ="fMtExpTimesPt");

  // Bose-Einstein
  TF1 * GetBoseEinsteindNdptTimesPt(Double_t mass, Double_t T, Double_t norm, const char * name="fBoseEinstein");

  // Fermi-Dirac
  TF1 * GetFermiDiracdNdptTimesPt(Double_t mass, Double_t T, Double_t norm, const char * name="fFermiDirac");


  // Simple exponential in 1/mp*dNdpT
  TF1 * GetPTExpdNdptTimesPt(Double_t T, Double_t norm, const char * name ="fPtExpTimesPt");

  // Boltzmann (exp in 1/mt*dNdmT times mt)
  TF1 * GetBoltzmanndNdptTimesPt(Double_t mass, Double_t T, Double_t norm, const char * name ="fBoltzmannTimesPt");

  // Tsallis (no BW, a la CMS)
  TF1 * GetTsallisdNdptTimesPt(Double_t mass, Double_t T, Double_t q, Double_t norm, const char * name="fTsallisTimesPt");

  // 1/mt dNdmt
  
  // Levi
  TF1 * GetLevidNdmt(Double_t mass, Double_t T, Double_t n, Double_t norm, const char * name = "fLeviMt", VarType_t var = kOneOverMtdNdmt);

  // mt exp
  TF1 * GetMTExpdNdmt(Double_t mass, Double_t temp, Double_t norm, const char * name, VarType_t var);


  // gereral setters
  void SetLineWidth(Width_t width) { fLineWidth = width;}

  TF1 * GetTestFunc(Double_t mass, Double_t T, Double_t norm, Double_t ymax, const char * name ="fTest") ;

  // static functions for TF1
  // Boltzmann-Gibbs Blast Wave
  static Double_t StaticBGdNdPt(const double * x, const double* p);
  static Double_t StaticBGdNdPtTimesPt(const double * x, const double* p);
  static Double_t StaticBGdNdMtTimesMt(const double * x, const double* p);
  // Tsallis blast wave
  static Double_t StaticTsallisdNdPt(const double * x, const double* p);
  static Double_t StaticTsallisdNdPtTimesPt(const double * x, const double* p);
  // Helper funcs for numeric integration
  static Double_t IntegrandBG(const double * x, const double* p);
  static Double_t IntegrandTsallis(const double * x, const double* p);

  // Test func
  static Double_t StaticTest(const double * x, const double* p);
  static Double_t IntegrandTest(const double * x, const double* p);

  // histo func
  static Double_t StaticHistoFunc(const double * x, const double* p);

  // UA1 parametrization
  static Double_t StaticUA1Func(const double * x, const double* p);
  static Double_t StaticUA1FuncOneOverPt(const double * x, const double* p) ;


private:


  TF1 * fLastFunc;     // Last function returned
  Width_t fLineWidth;  // Line width
  VarType_t fVarType;  // Variable types (e.g. dNdpt vs pt, 1/mt dNdmt vs mt...) 
  
  AliPWGFunc(const AliPWGFunc&);            // not implemented
  AliPWGFunc& operator=(const AliPWGFunc&); // not implemented


  ClassDef(AliPWGFunc, 1)


};

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