+ BuildHistos(nXbins,maxXval,minXval,nYbins,maxYval,minYval);
+}
+/******************************************************************/
+
+AliHBTFunction2D::AliHBTFunction2D(const Char_t *name, const Char_t *title,
+ Int_t nXbins, Double_t maxXval, Double_t minXval,
+ Int_t nYbins, Double_t maxYval, Double_t minYval):
+ AliHBTFunction(name,title),
+ fNumerator(0x0),
+ fDenominator(0x0),
+ fNBinsToScaleX(fgkDefaultNBinsToScaleX),
+ fNBinsToScaleY(fgkDefaultNBinsToScaleY)
+{
+ BuildHistos(nXbins,maxXval,minXval,nYbins,maxYval,minYval);
+}
+/******************************************************************/
+AliHBTFunction2D::AliHBTFunction2D(const AliHBTFunction2D & source):
+ AliHBTFunction(source),
+ fNumerator(0x0),
+ fDenominator(0x0),
+ fNBinsToScaleX(0x0),
+ fNBinsToScaleY(0x0)
+{
+// Copy constructor needed by the coding conventions byt not used
+ Fatal("AliHBTFunction2D(const AliHBTFunction2D&)","Cpy ctor not usable.");
+}
+/******************************************************************/
+
+AliHBTFunction2D& AliHBTFunction2D::operator= (const AliHBTFunction2D& /*source*/) {
+// Assignment needed by the coding conventions byt not used
+ Fatal("Assignment operator","not implemented");
+ return * this;
+}
+/******************************************************************/
+
+AliHBTFunction2D::~AliHBTFunction2D()
+{
+//dtor
+ delete fNumerator;
+ delete fDenominator;
+}
+/******************************************************************/
+
+void AliHBTFunction2D::BuildHistos()
+{
+//Creates default histograms
+ BuildHistos(fgkDefaultNBinsX,fgkDefaultMaxX,fgkDefaultMinX,
+ fgkDefaultNBinsY,fgkDefaultMaxY,fgkDefaultMinY);
+}
+/******************************************************************/
+
+void AliHBTFunction2D::BuildHistos(Int_t nxbins, Float_t xmax, Float_t xmin,
+ Int_t nybins, Float_t ymax, Float_t ymin)
+{
+//Builds numerator and denominator histograms (2d-case)
+ TString numstr = fName + " Numerator"; //title and name of the
+ //numerator histogram
+ TString denstr = fName + " Denominator";//title and name of the
+ //denominator histogram
+
+ fNumerator = new TH2D(numstr.Data(),numstr.Data(),
+ nxbins,xmin,xmax,nybins,ymin,ymax);
+
+ fDenominator = new TH2D(denstr.Data(),denstr.Data(),
+ nxbins,xmin,xmax,nybins,ymin,ymax);
+
+ fNumerator->Sumw2();
+ fDenominator->Sumw2();
+}
+/******************************************************************/
+
+void AliHBTFunction2D::SetNumberOfBinsToScale(UInt_t xn, UInt_t yn)
+{
+//defines area used for scaling factor calculation
+ fNBinsToScaleX = xn;
+ fNBinsToScaleY = yn;
+}
+/******************************************************************/
+
+Double_t AliHBTFunction2D::Scale()
+{
+// Calculates the factor that should be used to scale
+// quatience of fNumerator and fDenominator to 1 at
+// given region
+ AliDebug(1,"Entered");
+ if(!fNumerator)
+ {
+ AliError("No numerator");
+ return 0.0;
+ }
+ if(!fDenominator)
+ {
+ AliError("No denominator");
+ return 0.0;
+ }
+
+ if( (fNBinsToScaleX < 1) || (fNBinsToScaleY < 1) )
+ {
+ AliError("Number of bins for scaling is smaller thnan 1");
+ return 0.0;
+ }
+ UInt_t nbinsX = fNumerator->GetNbinsX();
+ if (fNBinsToScaleX > nbinsX)
+ {
+ AliError("Number of X bins for scaling is bigger thnan number of bins in histograms");
+ return 0.0;
+ }
+
+ UInt_t nbinsY = fNumerator->GetNbinsX();
+ if (fNBinsToScaleY > nbinsY)
+ {
+ AliError("Number of Y bins for scaling is bigger thnan number of bins in histograms");
+ return 0.0;
+ }
+
+ AliDebug(1,"No errors detected");
+
+ Int_t offsetX = nbinsX - fNBinsToScaleX - 1; //bin that we start loop over bins in axis X
+ Int_t offsetY = nbinsY - fNBinsToScaleY - 1; //bin that we start loop over bins in axis X
+
+ Double_t densum = 0.0;
+ Double_t numsum = 0.0;
+
+ for (UInt_t j = offsetY; j< nbinsY; j++)
+ for (UInt_t i = offsetX; i< nbinsX; i++)
+ {
+ if ( fNumerator->GetBinContent(i,j) > 0.0 )
+ {
+ densum += fDenominator->GetBinContent(i,j);
+ numsum += fNumerator->GetBinContent(i,j);
+ }
+ }
+
+ AliDebug(1,Form("numsum=%f densum=%f fNBinsToScaleX=%d fNBinsToScaleY=%d",
+ numsum,densum,fNBinsToScaleX,fNBinsToScaleY));
+
+ if (numsum == 0) return 0.0;
+ Double_t ret = densum/numsum;
+
+ AliDebug(1,Form("returning %f",ret));
+ return ret;
+}
+
+/******************************************************************/
+/******************************************************************/
+/******************************************************************/
+
+//____________________
+///////////////////////////////////////////////////////
+// //
+// AliHBTFunction3D //
+// //
+// Base Calss for 3-dimensinal Functions //
+// //
+// Piotr.Skowronski@cern.ch //
+// http://aliweb.cern.ch/people/skowron/analyzer //
+// //
+///////////////////////////////////////////////////////
+
+ClassImp( AliHBTFunction3D)
+
+const Int_t AliHBTFunction3D::fgkDefaultNBinsX = 200;//default number of Bins in X axis in histograms
+const Float_t AliHBTFunction3D::fgkDefaultMinX = 0.0;//Default min value of X axis in histograms
+const Float_t AliHBTFunction3D::fgkDefaultMaxX = 1.5;//Default max value of X axis inhistograms
+
+const Int_t AliHBTFunction3D::fgkDefaultNBinsY = 200;//default number of Bins in histograms
+const Float_t AliHBTFunction3D::fgkDefaultMinY = -0.15;//Default min value of histograms
+const Float_t AliHBTFunction3D::fgkDefaultMaxY = 0.15;//Default max value of histograms
+
+const Int_t AliHBTFunction3D::fgkDefaultNBinsZ = 200;//default number of Bins in histograms
+const Float_t AliHBTFunction3D::fgkDefaultMinZ = -0.15;//Default min value of histograms
+const Float_t AliHBTFunction3D::fgkDefaultMaxZ = 0.15;//Default max value of histograms
+
+const UInt_t AliHBTFunction3D::fgkDefaultNBinsToScaleX = 30;//Default number of X bins used for scaling to tale
+const UInt_t AliHBTFunction3D::fgkDefaultNBinsToScaleY = 30;//Default number of bins used for scaling to tale
+const UInt_t AliHBTFunction3D::fgkDefaultNBinsToScaleZ = 30;//Default number of bins used for scaling to tale
+
+AliHBTFunction3D::AliHBTFunction3D():
+ fNumerator(0x0),
+ fDenominator(0x0),
+ fNBinsToScaleX(fgkDefaultNBinsToScaleX),
+ fNBinsToScaleY(fgkDefaultNBinsToScaleY),
+ fNBinsToScaleZ(fgkDefaultNBinsToScaleZ)
+{
+ //constructor
+}
+/******************************************************************/
+
+AliHBTFunction3D::AliHBTFunction3D(const Char_t *name, const Char_t *title):
+ AliHBTFunction(name,title),
+ fNumerator(0x0),
+ fDenominator(0x0),
+ fNBinsToScaleX(fgkDefaultNBinsToScaleX),
+ fNBinsToScaleY(fgkDefaultNBinsToScaleY),
+ fNBinsToScaleZ(fgkDefaultNBinsToScaleZ)
+{
+ //constructor
+}
+/******************************************************************/
+
+AliHBTFunction3D::AliHBTFunction3D(Int_t nXbins, Double_t maxXval, Double_t minXval,
+ Int_t nYbins, Double_t maxYval, Double_t minYval,
+ Int_t nZbins, Double_t maxZval, Double_t minZval):
+ fNumerator(0x0),
+ fDenominator(0x0),
+ fNBinsToScaleX(fgkDefaultNBinsToScaleX),
+ fNBinsToScaleY(fgkDefaultNBinsToScaleY),
+ fNBinsToScaleZ(fgkDefaultNBinsToScaleZ)
+{
+ //constructor
+ BuildHistos( nXbins,maxXval,minXval,nYbins,maxYval,minYval,nZbins,maxZval,minZval);
+}
+/******************************************************************/
+
+AliHBTFunction3D::AliHBTFunction3D(const Char_t *name, const Char_t *title,
+ Int_t nXbins, Double_t maxXval, Double_t minXval,
+ Int_t nYbins, Double_t maxYval, Double_t minYval,
+ Int_t nZbins, Double_t maxZval, Double_t minZval):
+ AliHBTFunction(name,title),
+ fNumerator(0x0),
+ fDenominator(0x0),
+ fNBinsToScaleX(fgkDefaultNBinsToScaleX),
+ fNBinsToScaleY(fgkDefaultNBinsToScaleY),
+ fNBinsToScaleZ(fgkDefaultNBinsToScaleZ)
+{
+ //constructor
+ BuildHistos( nXbins,maxXval,minXval,nYbins,maxYval,minYval,nZbins,maxZval,minZval);
+}
+/******************************************************************/
+
+AliHBTFunction3D::AliHBTFunction3D(const AliHBTFunction3D& source):
+ AliHBTFunction(source),
+ fNumerator(0x0),
+ fDenominator(0x0),
+ fNBinsToScaleX(0x0),
+ fNBinsToScaleY(0x0),
+ fNBinsToScaleZ(0x0)
+{
+// Copy constructor needed by the coding conventions byt not used
+ Fatal("AliHBTFunction3D(const AliHBTFunction3D&)","Cpy ctor not usable.");
+}
+/******************************************************************/
+
+AliHBTFunction3D& AliHBTFunction3D::operator= (const AliHBTFunction3D & /*source*/)
+{
+// Assignment needed by the coding conventions byt not used
+ Fatal("Assignment operator","not implemented");
+ return * this;
+ }
+/******************************************************************/
+
+
+AliHBTFunction3D::~AliHBTFunction3D()
+{
+ delete fNumerator;
+ delete fDenominator;
+}
+/******************************************************************/
+
+void AliHBTFunction3D::BuildHistos()
+{
+//Creates default histograms
+ BuildHistos(fgkDefaultNBinsX,fgkDefaultMaxX,fgkDefaultMinX,
+ fgkDefaultNBinsY,fgkDefaultMaxY,fgkDefaultMinY,
+ fgkDefaultNBinsZ,fgkDefaultMaxZ,fgkDefaultMinZ);
+}
+/******************************************************************/
+
+void AliHBTFunction3D::BuildHistos(Int_t nxbins, Float_t xmax, Float_t xmin,
+ Int_t nybins, Float_t ymax, Float_t ymin,
+ Int_t nzbins, Float_t zmax, Float_t zmin)
+{
+ //Builds numerator and denominator histograms (3d-case)
+
+ AliDebug(1,"Entered");
+
+ if (fNumerator )
+ {
+ delete fNumerator;
+ fNumerator = 0x0;
+ }
+
+ if (fDenominator )
+ {
+ delete fDenominator;
+ fDenominator = 0x0;
+ }
+