1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
7 * Permission to use, copy, modify and distribute this software and its *
8 * documentation strictly for non-commercial purposes is hereby granted *
9 * without fee, provided that the above copyright notice appears in all *
10 * copies and that both the copyright notice and this permission notice *
11 * appear in the supporting documentation. The authors make no claims *
12 * about the suitability of this software for any purpose. It is *
13 * provided "as is" without express or implied warranty. *
14 **************************************************************************/
18 #include "AliHBTFunction.h"
22 //--------------------------------------------------------------------
24 //Author: Piotr Krzysztof Skowronski
25 //Piotr.Skowronski@cern.ch
26 //Base classes for HBT functions
28 OnePairFctn Function TwoPairFctn
32 | \ \ / \ |\ | \________________/__ | \
33 | \ \/ \ | \__|_____________ / \| \
34 | \ \ \_|____|__ \ / | \
35 | \ / \___ | | \ \/ |\ \
37 | / \ \| | \ / \ | \ \
38 | / \ /\ | \ / \ | \ |
39 | / \ / \ | \ / \ | \ |
40 | / \ / \ | \ / \ | \ |
42 OnePair1D OnePair2D OnePair3D TwoPair1D TwoPair2D TwoPair3D
45 four particle functions are intendent to be resolution functions:
46 it is mecessary to have simulated particle pair corresponding to given
47 recontructed track pair in order to calculate function simualted value
48 and recontructed value, to be further histogrammed
50 //---------------------------------------------------------------------
55 /******************************************************************/
56 /******************************************************************/
58 ClassImp( AliHBTFunction )
60 AliHBTFunction::AliHBTFunction():
61 fPairCut(new AliAODPairEmptyCut()), //dummy cut
62 fWriteNumAndDen(kFALSE),
67 /******************************************************************/
69 AliHBTFunction::AliHBTFunction(const char* name,const char* title):
71 fPairCut(new AliAODPairEmptyCut()), //dummy cut
72 fWriteNumAndDen(kFALSE),
77 /******************************************************************/
79 AliHBTFunction::AliHBTFunction(const AliHBTFunction & source):
81 fPairCut((AliAODPairCut*)source.fPairCut->Clone()),
82 fWriteNumAndDen(source.fWriteNumAndDen),
85 // Copy constructor needed by the coding conventions
87 /******************************************************************/
89 AliHBTFunction::~AliHBTFunction()
92 AliDebug(1,"Deleting");
95 /******************************************************************/
96 AliHBTFunction & AliHBTFunction::operator= (const AliHBTFunction & source)
98 // Assignment needed by the coding conventions
100 fPairCut = (AliAODPairCut*)source.fPairCut->Clone();
105 Int_t AliHBTFunction::WriteFunction()
107 //writes result of the function to file
109 AliDebug(1,"Entering");
112 AliDebug(1,"Writing Num & Den");
113 if (GetNumerator()) GetNumerator()->Write();
114 if (GetDenominator()) GetDenominator()->Write();
115 AliDebug(1,"Writing Num & Den Done");
117 AliDebug(1,"Getting Result");
118 TH1* res = GetResult();
119 AliDebug(1,"Getting Result Done");
123 AliDebug(1,"Writing Result");
124 retval = res->Write();
125 AliDebug(1,"Writing Result Done");
129 /******************************************************************/
131 TH1* AliHBTFunction::GetRatio(Double_t normfactor)
133 //returns ratio of numerator and denominator
135 AliDebug(1,Form("Norm. Factor is %f for %s",normfactor,GetName()));
137 if (normfactor == 0.0)
139 AliError("Scaling Factor is 0. Null poiner returned");
142 TString str = fName + " ratio";
143 TH1 *result = (TH1*)GetNumerator()->Clone(str.Data());
144 result->SetDirectory(0x0);
146 result->SetTitle(str.Data());
148 result->Divide(GetNumerator(),GetDenominator(),normfactor);
153 /******************************************************************/
154 void AliHBTFunction::SetPairCut(AliAODPairCut* cut)
156 //Sets new Pair Cut. Old one is deleted
157 //Note that it is created new object instead of simple pointer set
158 //I do not want to have pointer
159 //to object created somewhere else
160 //because in that case I could not believe that
161 //it would always exist (sb could delete it)
162 //so we have always own copy
166 AliError("argument is NULL");
170 fPairCut = (AliAODPairCut*)cut->Clone();
174 /******************************************************************/
176 void AliHBTFunction::Rename(const Char_t * name)
178 //renames the function and histograms
182 TString numstr = fName + " Numerator"; //title and name of the
183 //numerator histogram
184 TString denstr = fName + " Denominator";//title and name of the
185 //denominator histogram
187 GetNumerator()->SetName(numstr.Data());
188 GetNumerator()->SetTitle(numstr.Data());
190 GetDenominator()->SetName(denstr.Data());
191 GetDenominator()->SetTitle(denstr.Data());
195 void AliHBTFunction::Rename(const Char_t * name, const Char_t * title)
197 //renames and retitle the function and histograms
202 TString numstrn = fName + " Numerator"; //name of the
203 //numerator histogram
205 TString numstrt = fTitle + " Numerator"; //title of the
206 //numerator histogram
208 TString denstrn = fName + " Denominator";//name of the
209 //denominator histogram
211 TString denstrt = fTitle + " Denominator";//title of the
212 //denominator histogram
215 GetNumerator()->SetName(numstrn.Data());
216 GetNumerator()->SetTitle(numstrt.Data());
218 GetDenominator()->SetName(denstrn.Data());
219 GetDenominator()->SetTitle(denstrt.Data());
223 /******************************************************************/
225 void AliHBTFunction::InitFunction()
227 //Iniotializes fctn.: Resets histograms
228 //In case histograms are not created in ctor, builds with default parameters
229 AliDebug(1,"Entering");
230 if ( !(GetNumerator()&&GetDenominator()) ) BuildHistos();
231 GetNumerator()->Reset();
232 GetDenominator()->Reset();
234 GetNumerator()->SetDirectory(0x0);
235 GetDenominator()->SetDirectory(0x0);
238 /******************************************************************/
239 /******************************************************************/
240 /******************************************************************/
241 ClassImp(AliHBTCorrelFunction)
242 //____________________________________________
243 //////////////////////////////////////////////
245 // class AliHBTCorrelFunction
247 // Base class for correlation fuctions, that is which returns ratio.
248 // Stores pointer the created ratio histogram and deletes it when function is deleted
249 // created in order to evoid memory leak
251 ////////////////////////////////////////////////////////
252 AliHBTCorrelFunction& AliHBTCorrelFunction::operator=(const AliHBTCorrelFunction& in)
255 if (&in == this) return *this;
257 fRatio=(in.fRatio)?(TH1*)in.fRatio->Clone():0x0;
258 fRatio->SetDirectory(0x0);
262 /******************************************************************/
263 /******************************************************************/
264 /******************************************************************/
266 ClassImp( AliHBTOnePairFctn )
268 /******************************************************************/
269 /******************************************************************/
270 /******************************************************************/
272 ClassImp( AliHBTTwoPairFctn)
274 /******************************************************************/
275 /******************************************************************/
276 /******************************************************************/
278 ClassImp( AliHBTFunction1D )
280 const Int_t AliHBTFunction1D::fgkDefaultNBins = 100;
281 const Float_t AliHBTFunction1D::fgkDefaultMin = 0.0;
282 const Float_t AliHBTFunction1D::fgkDefaultMax = 0.15;
283 const UInt_t AliHBTFunction1D::fgkDefaultNBinsToScale = 30;
286 AliHBTFunction1D::AliHBTFunction1D():
289 fNBinsToScale(fgkDefaultNBinsToScale)
290 {//default constructor
292 /******************************************************************/
294 AliHBTFunction1D::AliHBTFunction1D(Int_t nbins, Float_t maxXval, Float_t minXval):
297 fNBinsToScale(fgkDefaultNBinsToScale)
299 //Constructor of Two Part One Dimentional Function
300 // nbins: number of bins in histograms - default 100
301 // maxXval and minXval: range of histgram(s) default 0 - 0.15 (GeV)
302 BuildHistos(nbins,maxXval,minXval);
304 /******************************************************************/
305 AliHBTFunction1D::AliHBTFunction1D(const Char_t *name, const Char_t *title):
306 AliHBTFunction(name,title),
309 fNBinsToScale(fgkDefaultNBinsToScale)
312 /******************************************************************/
313 AliHBTFunction1D::AliHBTFunction1D(const Char_t *name, const Char_t *title,
314 Int_t nbins, Float_t maxXval, Float_t minXval):
315 AliHBTFunction(name,title),
318 fNBinsToScale(fgkDefaultNBinsToScale)
321 BuildHistos(nbins,maxXval,minXval);
323 /******************************************************************/
325 AliHBTFunction1D::AliHBTFunction1D(const AliHBTFunction1D& source):
326 AliHBTFunction(source),
331 // Copy constructor needed by the coding conventions byt not used
332 Fatal("AliHBTFunction1D(const AliHBTFunction1D&)","Cpy ctor not usable.");
334 /******************************************************************/
336 AliHBTFunction1D& AliHBTFunction1D::operator= (const AliHBTFunction1D & /*source*/)
338 // Assignment needed by the coding conventions byt not used
339 Fatal("Assignment operator","not implemented");
342 /******************************************************************/
344 AliHBTFunction1D::~AliHBTFunction1D()
350 /******************************************************************/
351 void AliHBTFunction1D::BuildHistos()
353 //builds histograms with default settings
354 BuildHistos(fgkDefaultNBins,fgkDefaultMax,fgkDefaultMin);
357 /******************************************************************/
359 void AliHBTFunction1D::BuildHistos(Int_t nbins, Float_t max, Float_t min)
361 //builds numarator and denominator hitograms
362 TString numstr = fName + " Numerator"; //title and name of the
363 //numerator histogram
364 TString denstr = fName + " Denominator";//title and name of the
365 //denominator histogram
366 fNumerator = new TH1D(numstr.Data(),numstr.Data(),nbins,min,max);
367 fDenominator = new TH1D(denstr.Data(),denstr.Data(),nbins,min,max);
370 fDenominator->Sumw2();
372 /******************************************************************/
374 Double_t AliHBTFunction1D::Scale()
376 //Calculates the factor that should be used to scale
377 //quatience of fNumerator and fDenominator to 1 at tail
378 return Scale(fNumerator,fDenominator);
380 /******************************************************************/
382 Double_t AliHBTFunction1D::Scale(TH1D* num,TH1D* den)
384 //Calculates the factor that should be used to scale
385 //quatience of num and den to 1 at tail
387 AliDebug(1,"Entered");
390 AliError("No numerator");
395 AliError("No denominator");
399 if(fNBinsToScale < 1)
401 AliError("Number of bins for scaling is smaller than 1");
404 UInt_t nbins = num->GetNbinsX();
405 if (fNBinsToScale > nbins)
407 AliError("Number of bins for scaling is bigger thnan number of bins in histograms");
410 AliDebug(1,"No errors detected");
412 Double_t densum = 0.0;
413 Double_t numsum = 0.0;
415 Int_t offset = nbins - fNBinsToScale - 1;
417 for (UInt_t i = offset; i< nbins; i++)
419 if ( num->GetBinContent(i) > 0.0 )
421 densum += den->GetBinContent(i);
422 numsum += num->GetBinContent(i);
426 AliDebug(1,Form("numsum=%f densum=%f fNBinsToScaleX=%d",numsum,densum,fNBinsToScale));
428 if (numsum == 0) return 0.0;
429 Double_t ret = densum/numsum;
431 AliDebug(1,Form("returning %f",ret));
435 /******************************************************************/
436 /******************************************************************/
437 /******************************************************************/
439 //____________________
440 ///////////////////////////////////////////////////////
442 // AliHBTFunction2D //
444 // Base Calss for 2-dimensinal Functions //
446 // Piotr.Skowronski@cern.ch //
447 // http://aliweb.cern.ch/people/skowron/analyzer //
449 ///////////////////////////////////////////////////////
451 ClassImp( AliHBTFunction2D )
453 const Int_t AliHBTFunction2D::fgkDefaultNBinsX = 200;//default number of Bins in X axis in histograms
454 const Float_t AliHBTFunction2D::fgkDefaultMinX = 0.0;//Default min value of X axis in histograms
455 const Float_t AliHBTFunction2D::fgkDefaultMaxX = 1.5;//Default max value of X axis inhistograms
457 const Int_t AliHBTFunction2D::fgkDefaultNBinsY = 200;//default number of Bins in histograms
458 const Float_t AliHBTFunction2D::fgkDefaultMinY = -0.15;//Default min value of histograms
459 const Float_t AliHBTFunction2D::fgkDefaultMaxY = 0.15;//Default max value of histograms
461 const UInt_t AliHBTFunction2D::fgkDefaultNBinsToScaleX = 30;//Default number of X bins used for scaling to tale
462 const UInt_t AliHBTFunction2D::fgkDefaultNBinsToScaleY = 30;//Default number of bins used for scaling to tale
464 /******************************************************************/
465 AliHBTFunction2D::AliHBTFunction2D():
468 fNBinsToScaleX(fgkDefaultNBinsToScaleX),
469 fNBinsToScaleY(fgkDefaultNBinsToScaleY)
470 {//default constructor
472 /******************************************************************/
473 AliHBTFunction2D::AliHBTFunction2D(const Char_t *name, const Char_t *title):
474 AliHBTFunction(name,title),
477 fNBinsToScaleX(fgkDefaultNBinsToScaleX),
478 fNBinsToScaleY(fgkDefaultNBinsToScaleY)
481 /******************************************************************/
483 AliHBTFunction2D::AliHBTFunction2D(Int_t nXbins, Double_t maxXval, Double_t minXval,
484 Int_t nYbins, Double_t maxYval, Double_t minYval):
487 fNBinsToScaleX(fgkDefaultNBinsToScaleX),
488 fNBinsToScaleY(fgkDefaultNBinsToScaleY)
490 BuildHistos(nXbins,maxXval,minXval,nYbins,maxYval,minYval);
492 /******************************************************************/
494 AliHBTFunction2D::AliHBTFunction2D(const Char_t *name, const Char_t *title,
495 Int_t nXbins, Double_t maxXval, Double_t minXval,
496 Int_t nYbins, Double_t maxYval, Double_t minYval):
497 AliHBTFunction(name,title),
500 fNBinsToScaleX(fgkDefaultNBinsToScaleX),
501 fNBinsToScaleY(fgkDefaultNBinsToScaleY)
503 BuildHistos(nXbins,maxXval,minXval,nYbins,maxYval,minYval);
505 /******************************************************************/
506 AliHBTFunction2D::AliHBTFunction2D(const AliHBTFunction2D & source):
507 AliHBTFunction(source),
513 // Copy constructor needed by the coding conventions byt not used
514 Fatal("AliHBTFunction2D(const AliHBTFunction2D&)","Cpy ctor not usable.");
516 /******************************************************************/
518 AliHBTFunction2D& AliHBTFunction2D::operator= (const AliHBTFunction2D& /*source*/) {
519 // Assignment needed by the coding conventions byt not used
520 Fatal("Assignment operator","not implemented");
523 /******************************************************************/
525 AliHBTFunction2D::~AliHBTFunction2D()
531 /******************************************************************/
533 void AliHBTFunction2D::BuildHistos()
535 //Creates default histograms
536 BuildHistos(fgkDefaultNBinsX,fgkDefaultMaxX,fgkDefaultMinX,
537 fgkDefaultNBinsY,fgkDefaultMaxY,fgkDefaultMinY);
539 /******************************************************************/
541 void AliHBTFunction2D::BuildHistos(Int_t nxbins, Float_t xmax, Float_t xmin,
542 Int_t nybins, Float_t ymax, Float_t ymin)
544 //Builds numerator and denominator histograms (2d-case)
545 TString numstr = fName + " Numerator"; //title and name of the
546 //numerator histogram
547 TString denstr = fName + " Denominator";//title and name of the
548 //denominator histogram
550 fNumerator = new TH2D(numstr.Data(),numstr.Data(),
551 nxbins,xmin,xmax,nybins,ymin,ymax);
553 fDenominator = new TH2D(denstr.Data(),denstr.Data(),
554 nxbins,xmin,xmax,nybins,ymin,ymax);
557 fDenominator->Sumw2();
559 /******************************************************************/
561 void AliHBTFunction2D::SetNumberOfBinsToScale(UInt_t xn, UInt_t yn)
563 //defines area used for scaling factor calculation
567 /******************************************************************/
569 Double_t AliHBTFunction2D::Scale()
571 // Calculates the factor that should be used to scale
572 // quatience of fNumerator and fDenominator to 1 at
574 AliDebug(1,"Entered");
577 AliError("No numerator");
582 AliError("No denominator");
586 if( (fNBinsToScaleX < 1) || (fNBinsToScaleY < 1) )
588 AliError("Number of bins for scaling is smaller thnan 1");
591 UInt_t nbinsX = fNumerator->GetNbinsX();
592 if (fNBinsToScaleX > nbinsX)
594 AliError("Number of X bins for scaling is bigger thnan number of bins in histograms");
598 UInt_t nbinsY = fNumerator->GetNbinsX();
599 if (fNBinsToScaleY > nbinsY)
601 AliError("Number of Y bins for scaling is bigger thnan number of bins in histograms");
605 AliDebug(1,"No errors detected");
607 Int_t offsetX = nbinsX - fNBinsToScaleX - 1; //bin that we start loop over bins in axis X
608 Int_t offsetY = nbinsY - fNBinsToScaleY - 1; //bin that we start loop over bins in axis X
610 Double_t densum = 0.0;
611 Double_t numsum = 0.0;
613 for (UInt_t j = offsetY; j< nbinsY; j++)
614 for (UInt_t i = offsetX; i< nbinsX; i++)
616 if ( fNumerator->GetBinContent(i,j) > 0.0 )
618 densum += fDenominator->GetBinContent(i,j);
619 numsum += fNumerator->GetBinContent(i,j);
623 AliDebug(1,Form("numsum=%f densum=%f fNBinsToScaleX=%d fNBinsToScaleY=%d",
624 numsum,densum,fNBinsToScaleX,fNBinsToScaleY));
626 if (numsum == 0) return 0.0;
627 Double_t ret = densum/numsum;
629 AliDebug(1,Form("returning %f",ret));
633 /******************************************************************/
634 /******************************************************************/
635 /******************************************************************/
637 //____________________
638 ///////////////////////////////////////////////////////
640 // AliHBTFunction3D //
642 // Base Calss for 3-dimensinal Functions //
644 // Piotr.Skowronski@cern.ch //
645 // http://aliweb.cern.ch/people/skowron/analyzer //
647 ///////////////////////////////////////////////////////
649 ClassImp( AliHBTFunction3D)
651 const Int_t AliHBTFunction3D::fgkDefaultNBinsX = 200;//default number of Bins in X axis in histograms
652 const Float_t AliHBTFunction3D::fgkDefaultMinX = 0.0;//Default min value of X axis in histograms
653 const Float_t AliHBTFunction3D::fgkDefaultMaxX = 1.5;//Default max value of X axis inhistograms
655 const Int_t AliHBTFunction3D::fgkDefaultNBinsY = 200;//default number of Bins in histograms
656 const Float_t AliHBTFunction3D::fgkDefaultMinY = -0.15;//Default min value of histograms
657 const Float_t AliHBTFunction3D::fgkDefaultMaxY = 0.15;//Default max value of histograms
659 const Int_t AliHBTFunction3D::fgkDefaultNBinsZ = 200;//default number of Bins in histograms
660 const Float_t AliHBTFunction3D::fgkDefaultMinZ = -0.15;//Default min value of histograms
661 const Float_t AliHBTFunction3D::fgkDefaultMaxZ = 0.15;//Default max value of histograms
663 const UInt_t AliHBTFunction3D::fgkDefaultNBinsToScaleX = 30;//Default number of X bins used for scaling to tale
664 const UInt_t AliHBTFunction3D::fgkDefaultNBinsToScaleY = 30;//Default number of bins used for scaling to tale
665 const UInt_t AliHBTFunction3D::fgkDefaultNBinsToScaleZ = 30;//Default number of bins used for scaling to tale
667 AliHBTFunction3D::AliHBTFunction3D():
670 fNBinsToScaleX(fgkDefaultNBinsToScaleX),
671 fNBinsToScaleY(fgkDefaultNBinsToScaleY),
672 fNBinsToScaleZ(fgkDefaultNBinsToScaleZ)
676 /******************************************************************/
678 AliHBTFunction3D::AliHBTFunction3D(const Char_t *name, const Char_t *title):
679 AliHBTFunction(name,title),
682 fNBinsToScaleX(fgkDefaultNBinsToScaleX),
683 fNBinsToScaleY(fgkDefaultNBinsToScaleY),
684 fNBinsToScaleZ(fgkDefaultNBinsToScaleZ)
688 /******************************************************************/
690 AliHBTFunction3D::AliHBTFunction3D(Int_t nXbins, Double_t maxXval, Double_t minXval,
691 Int_t nYbins, Double_t maxYval, Double_t minYval,
692 Int_t nZbins, Double_t maxZval, Double_t minZval):
695 fNBinsToScaleX(fgkDefaultNBinsToScaleX),
696 fNBinsToScaleY(fgkDefaultNBinsToScaleY),
697 fNBinsToScaleZ(fgkDefaultNBinsToScaleZ)
700 BuildHistos( nXbins,maxXval,minXval,nYbins,maxYval,minYval,nZbins,maxZval,minZval);
702 /******************************************************************/
704 AliHBTFunction3D::AliHBTFunction3D(const Char_t *name, const Char_t *title,
705 Int_t nXbins, Double_t maxXval, Double_t minXval,
706 Int_t nYbins, Double_t maxYval, Double_t minYval,
707 Int_t nZbins, Double_t maxZval, Double_t minZval):
708 AliHBTFunction(name,title),
711 fNBinsToScaleX(fgkDefaultNBinsToScaleX),
712 fNBinsToScaleY(fgkDefaultNBinsToScaleY),
713 fNBinsToScaleZ(fgkDefaultNBinsToScaleZ)
716 BuildHistos( nXbins,maxXval,minXval,nYbins,maxYval,minYval,nZbins,maxZval,minZval);
718 /******************************************************************/
720 AliHBTFunction3D::AliHBTFunction3D(const AliHBTFunction3D& source):
721 AliHBTFunction(source),
728 // Copy constructor needed by the coding conventions byt not used
729 Fatal("AliHBTFunction3D(const AliHBTFunction3D&)","Cpy ctor not usable.");
731 /******************************************************************/
733 AliHBTFunction3D& AliHBTFunction3D::operator= (const AliHBTFunction3D & /*source*/)
735 // Assignment needed by the coding conventions byt not used
736 Fatal("Assignment operator","not implemented");
739 /******************************************************************/
742 AliHBTFunction3D::~AliHBTFunction3D()
747 /******************************************************************/
749 void AliHBTFunction3D::BuildHistos()
751 //Creates default histograms
752 BuildHistos(fgkDefaultNBinsX,fgkDefaultMaxX,fgkDefaultMinX,
753 fgkDefaultNBinsY,fgkDefaultMaxY,fgkDefaultMinY,
754 fgkDefaultNBinsZ,fgkDefaultMaxZ,fgkDefaultMinZ);
756 /******************************************************************/
758 void AliHBTFunction3D::BuildHistos(Int_t nxbins, Float_t xmax, Float_t xmin,
759 Int_t nybins, Float_t ymax, Float_t ymin,
760 Int_t nzbins, Float_t zmax, Float_t zmin)
762 //Builds numerator and denominator histograms (3d-case)
764 AliDebug(1,"Entered");
778 TString numstr = fName + " Numerator"; //title and name of the
779 //numerator histogram
780 TString denstr = fName + " Denominator";//title and name of the
781 //denominator histogram
783 fNumerator = new TH3F(numstr.Data(),numstr.Data(),
784 nxbins,xmin,xmax,nybins,ymin,ymax,nzbins,zmin,zmax);
786 fDenominator = new TH3F(denstr.Data(),denstr.Data(),
787 nxbins,xmin,xmax,nybins,ymin,ymax,nzbins,zmin,zmax);
790 fDenominator->Sumw2();
793 /******************************************************************/
795 Double_t AliHBTFunction3D::Scale()
797 // Calculates the factor that should be used to scale
798 // quatience of fNumerator and fDenominator to 1 at
800 AliDebug(1,"Entered");
803 AliError("No numerator");
808 AliError("No denominator");
812 if( (fNBinsToScaleX < 1) || (fNBinsToScaleY < 1) || (fNBinsToScaleZ < 1))
814 AliError("Number of bins for scaling is smaller thnan 1");
817 UInt_t nbinsX = fNumerator->GetNbinsX();
818 if (fNBinsToScaleX > nbinsX)
820 AliError("Number of X bins for scaling is bigger thnan number of bins in histograms");
824 UInt_t nbinsY = fNumerator->GetNbinsX();
825 if (fNBinsToScaleY > nbinsY)
827 AliError("Number of Y bins for scaling is bigger thnan number of bins in histograms");
831 UInt_t nbinsZ = fNumerator->GetNbinsZ();
832 if (fNBinsToScaleZ > nbinsZ)
834 AliError("Number of Z bins for scaling is bigger thnan number of bins in histograms");
838 AliDebug(1,"No errors detected");
840 Int_t offsetX = nbinsX - fNBinsToScaleX - 1; //bin that we start loop over bins in axis X
841 Int_t offsetY = nbinsY - fNBinsToScaleY - 1; //bin that we start loop over bins in axis Y
842 Int_t offsetZ = nbinsZ - fNBinsToScaleZ - 1; //bin that we start loop over bins in axis Z
844 Double_t densum = 0.0;
845 Double_t numsum = 0.0;
847 for (UInt_t k = offsetZ; k<nbinsZ; k++)
848 for (UInt_t j = offsetY; j<nbinsY; j++)
849 for (UInt_t i = offsetX; i<nbinsX; i++)
851 if ( fNumerator->GetBinContent(i,j,k) > 0.0 )
854 densum += fDenominator->GetBinContent(i,j,k);
855 numsum += fNumerator->GetBinContent(i,j,k);
859 AliDebug(1,Form("numsum=%f densum=%f fNBinsToScaleX=%d fNBinsToScaleY=%d fNBinsToScaleZ=%d",
860 numsum,densum,fNBinsToScaleX,fNBinsToScaleY,fNBinsToScaleZ));
862 if (numsum == 0) return 0.0;
863 Double_t ret = densum/numsum;
865 AliDebug(1,Form("returning %f",ret));
868 /******************************************************************/
870 void AliHBTFunction3D::SetNumberOfBinsToScale(UInt_t xn, UInt_t yn,UInt_t zn)
872 //sets up the volume to be used for scaling to tail
878 /******************************************************************/
879 /******************************************************************/
880 /******************************************************************/
881 /******************************************************************/
882 /******************************************************************/
883 /******************************************************************/
884 /******************************************************************/
885 /******************************************************************/
886 /******************************************************************/
888 //____________________
889 ///////////////////////////////////////////////////////
891 // AliHBTOnePairFctn1D //
893 // Base Calss for 1-dimensinal Functions that need //
894 // one pair to fill function //
896 // Piotr.Skowronski@cern.ch //
897 // http://aliweb.cern.ch/people/skowron/analyzer //
899 ///////////////////////////////////////////////////////
901 ClassImp( AliHBTOnePairFctn1D )
902 /******************************************************************/
904 AliHBTOnePairFctn1D::AliHBTOnePairFctn1D(Int_t nbins, Float_t maxXval, Float_t minXval):
905 AliHBTFunction1D(nbins,maxXval,minXval)
909 /******************************************************************/
911 AliHBTOnePairFctn1D::AliHBTOnePairFctn1D(const Char_t *name, const Char_t *title):
912 AliHBTFunction1D(name,title)
916 /******************************************************************/
918 AliHBTOnePairFctn1D::AliHBTOnePairFctn1D(const Char_t *name, const Char_t *title,
919 Int_t nbins, Float_t maxXval, Float_t minXval):
920 AliHBTFunction1D(name,title,nbins,maxXval,minXval)
924 /******************************************************************/
926 void AliHBTOnePairFctn1D::ProcessSameEventParticles(AliHBTPair* pair)
928 //Fills the numerator using pair from the same event
929 pair = CheckPair(pair);
930 if(pair) fNumerator->Fill(GetValue(pair));
932 /******************************************************************/
933 void AliHBTOnePairFctn1D::ProcessDiffEventParticles(AliHBTPair* pair)
935 //Fills the denumerator using mixed pairs
936 pair = CheckPair(pair);
937 if(pair) fDenominator->Fill(GetValue(pair));
940 /******************************************************************/
941 /******************************************************************/
942 /******************************************************************/
944 //____________________
945 ///////////////////////////////////////////////////////
947 // AliHBTOnePairFctn2D //
949 // Base Calss for 2-dimensinal Functions that need //
950 // one pair to fill function //
952 // Piotr.Skowronski@cern.ch //
953 // http://aliweb.cern.ch/people/skowron/analyzer //
955 ///////////////////////////////////////////////////////
957 ClassImp( AliHBTOnePairFctn2D )
958 /******************************************************************/
960 AliHBTOnePairFctn2D::AliHBTOnePairFctn2D(const Char_t *name, const Char_t *title):
961 AliHBTFunction2D(name,title)
965 /******************************************************************/
967 AliHBTOnePairFctn2D::AliHBTOnePairFctn2D(Int_t nXbins, Double_t maxXval, Double_t minXval,
968 Int_t nYbins, Double_t maxYval, Double_t minYval):
969 AliHBTFunction2D(nXbins, maxXval, minXval, nYbins, maxYval, minYval)
973 /******************************************************************/
975 AliHBTOnePairFctn2D::AliHBTOnePairFctn2D(const Char_t *name, const Char_t *title,
976 Int_t nXbins, Double_t maxXval, Double_t minXval,
977 Int_t nYbins, Double_t maxYval, Double_t minYval):
978 AliHBTFunction2D(name,title, nXbins, maxXval, minXval, nYbins, maxYval, minYval)
982 /******************************************************************/
984 void AliHBTOnePairFctn2D::ProcessSameEventParticles(AliHBTPair* pair)
986 // Fills the numerator using pairs from the same event
987 pair = CheckPair(pair);
992 fNumerator->Fill(x,y);
995 /******************************************************************/
997 void AliHBTOnePairFctn2D::ProcessDiffEventParticles(AliHBTPair* pair)
999 // Fills the denumerator using mixed pairs
1000 pair = CheckPair(pair);
1004 GetValues(pair,x,y);
1005 fDenominator->Fill(x,y);
1008 /******************************************************************/
1009 /******************************************************************/
1010 /******************************************************************/
1011 /******************************************************************/
1012 //____________________
1013 ///////////////////////////////////////////////////////
1015 // AliHBTOnePairFctn3D //
1017 // Base Calss for 3-dimensinal Functions that need //
1018 // one pair to fill function //
1020 // Piotr.Skowronski@cern.ch //
1021 // http://aliweb.cern.ch/people/skowron/analyzer //
1023 ///////////////////////////////////////////////////////
1024 ClassImp( AliHBTOnePairFctn3D)
1026 /******************************************************************/
1028 AliHBTOnePairFctn3D::AliHBTOnePairFctn3D(const Char_t *name, const Char_t *title):
1029 AliHBTFunction3D(name,title)
1033 /******************************************************************/
1035 AliHBTOnePairFctn3D::AliHBTOnePairFctn3D(Int_t nXbins, Double_t maxXval, Double_t minXval,
1036 Int_t nYbins, Double_t maxYval, Double_t minYval,
1037 Int_t nZbins, Double_t maxZval, Double_t minZval):
1038 AliHBTFunction3D(nXbins, maxXval, minXval, nYbins, maxYval, minYval, nZbins, maxZval, minZval)
1042 /******************************************************************/
1044 AliHBTOnePairFctn3D::AliHBTOnePairFctn3D(const Char_t *name, const Char_t *title,
1045 Int_t nXbins, Double_t maxXval, Double_t minXval,
1046 Int_t nYbins, Double_t maxYval, Double_t minYval,
1047 Int_t nZbins, Double_t maxZval, Double_t minZval):
1048 AliHBTFunction3D(name,title,nXbins, maxXval, minXval, nYbins, maxYval, minYval, nZbins, maxZval, minZval)
1052 /******************************************************************/
1054 void AliHBTOnePairFctn3D::ProcessSameEventParticles(AliHBTPair* pair)
1056 //Reacts on pair coming from same event (real pairs)
1057 //and fills numerator histogram
1058 pair = CheckPair(pair);
1062 GetValues(pair,x,y,z);
1063 fNumerator->Fill(x,y,z);
1066 /******************************************************************/
1068 void AliHBTOnePairFctn3D::ProcessDiffEventParticles(AliHBTPair* pair)
1070 //Reacts on pair coming from different events (mixed pairs)
1071 //and fills denominator histogram
1072 pair = CheckPair(pair);
1076 GetValues(pair,x,y,z);
1077 fDenominator->Fill(x,y,z);
1081 /******************************************************************/
1082 /******************************************************************/
1083 /******************************************************************/
1085 //____________________
1086 ///////////////////////////////////////////////////////
1088 // AliHBTTwoPairFctn1D //
1090 // Base Calss for 1-dimensinal Functions that need //
1091 // two pair (simulated and reconstructed) //
1092 // to fill function //
1094 // Piotr.Skowronski@cern.ch //
1095 // http://aliweb.cern.ch/people/skowron/analyzer //
1097 ///////////////////////////////////////////////////////
1098 ClassImp(AliHBTTwoPairFctn1D)
1099 /******************************************************************/
1101 AliHBTTwoPairFctn1D::AliHBTTwoPairFctn1D(Int_t nbins, Float_t maxXval, Float_t minXval):
1102 AliHBTFunction1D(nbins,maxXval,minXval)
1106 /******************************************************************/
1108 AliHBTTwoPairFctn1D::AliHBTTwoPairFctn1D(const Char_t *name, const Char_t *title):
1109 AliHBTFunction1D(name,title)
1113 /******************************************************************/
1115 AliHBTTwoPairFctn1D::AliHBTTwoPairFctn1D(const Char_t *name, const Char_t *title,
1116 Int_t nbins, Float_t maxXval, Float_t minXval):
1117 AliHBTFunction1D(name,title,nbins,maxXval,minXval)
1121 /******************************************************************/
1123 void AliHBTTwoPairFctn1D::ProcessSameEventParticles(AliHBTPair* trackpair, AliHBTPair* partpair)
1125 // Fills the numerator using pairs from the same event
1126 trackpair = CheckPair(trackpair);
1127 if( trackpair == 0x0) return;
1129 Double_t x = GetValue(trackpair,partpair);
1130 fNumerator->Fill(x);
1132 /******************************************************************/
1134 void AliHBTTwoPairFctn1D::ProcessDiffEventParticles(AliHBTPair* trackpair, AliHBTPair* partpair)
1136 // Fills the denumerator usin mixed pairs
1137 trackpair = CheckPair(trackpair);
1138 if( trackpair == 0x0) return;
1140 Double_t x = GetValue(trackpair,partpair);
1141 fDenominator->Fill(x);
1143 /******************************************************************/
1144 /******************************************************************/
1145 /******************************************************************/
1147 //____________________
1148 ///////////////////////////////////////////////////////
1150 // AliHBTTwoPairFctn2D //
1152 // Base Calss for 2-dimensinal Functions that need //
1153 // two pair (simulated and reconstructed) //
1154 // to fill function //
1156 // Piotr.Skowronski@cern.ch //
1157 // http://aliweb.cern.ch/people/skowron/analyzer //
1159 ///////////////////////////////////////////////////////
1161 ClassImp(AliHBTTwoPairFctn2D)
1163 /******************************************************************/
1165 AliHBTTwoPairFctn2D::AliHBTTwoPairFctn2D(const Char_t *name, const Char_t *title):
1166 AliHBTFunction2D(name,title)
1170 /******************************************************************/
1172 AliHBTTwoPairFctn2D::AliHBTTwoPairFctn2D(Int_t nXbins, Double_t maxXval, Double_t minXval,
1173 Int_t nYbins, Double_t maxYval, Double_t minYval):
1174 AliHBTFunction2D(nXbins, maxXval, minXval, nYbins, maxYval, minYval)
1178 /******************************************************************/
1180 AliHBTTwoPairFctn2D::AliHBTTwoPairFctn2D(const Char_t *name, const Char_t *title,
1181 Int_t nXbins, Double_t maxXval, Double_t minXval,
1182 Int_t nYbins, Double_t maxYval, Double_t minYval):
1183 AliHBTFunction2D(name,title,nXbins, maxXval, minXval, nYbins, maxYval, minYval)
1187 /******************************************************************/
1189 void AliHBTTwoPairFctn2D::ProcessSameEventParticles(AliHBTPair* trackpair, AliHBTPair* partpair)
1191 //processes pair of particles coming from a same events (real pair)
1192 trackpair = CheckPair(trackpair);
1193 if( trackpair == 0x0) return;
1196 GetValues(trackpair,partpair,x,y);
1197 fNumerator->Fill(x,y);
1199 /******************************************************************/
1201 void AliHBTTwoPairFctn2D::ProcessDiffEventParticles(AliHBTPair* trackpair, AliHBTPair* partpair)
1203 //processes pair of particles coming from a different events (mixed pair)
1204 trackpair = CheckPair(trackpair);
1205 if( trackpair == 0x0) return;
1208 GetValues(trackpair,partpair,x,y);
1209 fDenominator->Fill(x,y);
1212 /******************************************************************/
1213 /******************************************************************/
1214 /******************************************************************/
1216 //____________________
1217 ///////////////////////////////////////////////////////
1219 // AliHBTTwoPairFctn3D //
1221 // Base Calss for 3-dimensinal Functions that need //
1222 // two pair (simulated and reconstructed) //
1223 // to fill function //
1225 // Piotr.Skowronski@cern.ch //
1226 // http://aliweb.cern.ch/people/skowron/analyzer //
1228 ///////////////////////////////////////////////////////
1230 ClassImp(AliHBTTwoPairFctn3D)
1232 /******************************************************************/
1234 AliHBTTwoPairFctn3D::AliHBTTwoPairFctn3D(const Char_t *name, const Char_t *title):
1235 AliHBTFunction3D(name,title)
1239 /******************************************************************/
1241 AliHBTTwoPairFctn3D::AliHBTTwoPairFctn3D(Int_t nXbins, Double_t maxXval, Double_t minXval,
1242 Int_t nYbins, Double_t maxYval, Double_t minYval,
1243 Int_t nZbins, Double_t maxZval, Double_t minZval):
1244 AliHBTFunction3D(nXbins, maxXval, minXval, nYbins, maxYval, minYval, nZbins, maxZval, minZval)
1248 /******************************************************************/
1250 AliHBTTwoPairFctn3D::AliHBTTwoPairFctn3D(const Char_t *name, const Char_t *title,
1251 Int_t nXbins, Double_t maxXval, Double_t minXval,
1252 Int_t nYbins, Double_t maxYval, Double_t minYval,
1253 Int_t nZbins, Double_t maxZval, Double_t minZval):
1254 AliHBTFunction3D(name,title,nXbins, maxXval, minXval, nYbins, maxYval, minYval, nZbins, maxZval, minZval)
1258 /******************************************************************/
1260 void AliHBTTwoPairFctn3D::ProcessSameEventParticles(AliHBTPair* trackpair, AliHBTPair* partpair)
1262 // Fills th numerator using pairs from the same event
1263 trackpair = CheckPair(trackpair);
1264 if( trackpair == 0x0) return;
1267 GetValues(trackpair,partpair,x,y,z);
1268 fNumerator->Fill(x,y,z);
1271 /******************************************************************/
1273 void AliHBTTwoPairFctn3D::ProcessDiffEventParticles(AliHBTPair* trackpair, AliHBTPair* partpair)
1275 // Fills the denumerator using mixed pairs
1276 trackpair = CheckPair(trackpair);
1277 if( trackpair == 0x0) return;
1280 GetValues(trackpair,partpair,x,y,z);
1281 fDenominator->Fill(x,y,z);
1284 /******************************************************************/
1285 /******************************************************************/
1286 /******************************************************************/