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 **************************************************************************/
19 #include "AliAnalysisMuMuResult.h"
21 ClassImp(AliAnalysisMuMuResult)
24 #include "TFitResult.h"
27 #include "THashList.h"
32 #include "TObjArray.h"
33 #include "TParameter.h"
34 #include "AliAnalysisMuMuBinning.h"
35 #include "AliHistogramCollection.h"
39 const std::map<std::string,Double_t>& MassMap()
41 /// a simple map of masses...
42 static std::map<std::string,Double_t> massMap;
43 // not super elegant, but that way we do not depend on TDatabasePDG and thus
44 // can decide on our particle naming
47 massMap["Jpsi"] = 3.096916e+00;
48 massMap["PsiPrime"] = 3.68609e+00;
49 massMap["Upsilon"] = 9.46030e+00;
50 massMap["UpsilonPrime"] = 1.00233e+01;
56 Double_t funcCB(Double_t* xx, Double_t* par)
60 Double_t norm = par[0];
61 Double_t alpha = par[1];
63 Double_t mean = par[3];
64 Double_t sigma = par[4];
68 Double_t a = TMath::Power(n/TMath::Abs(alpha),n)*TMath::Exp(-0.5*alpha*alpha);
69 Double_t b = n/TMath::Abs(alpha) - TMath::Abs(alpha);
71 Double_t y = ( TMath::Abs(sigma) > 1E-12 ? (x-mean)/sigma : 0 );
75 return norm*TMath::Exp(-0.5*y*y);
79 return norm*a*TMath::Power(b-y,-n);
83 Double_t funcJpsiGCBE(Double_t* xx, Double_t* par)
85 /// crystal ball + expo + gaussian
88 Double_t g = par[0]*TMath::Gaus(x,par[1],par[2]);
90 Double_t jpsi = funcCB(xx,par+3);
92 Double_t expo = par[8]*TMath::Exp(par[9]*x);
97 Double_t funcJpsiPsiPrimeCustom(Double_t* xx, Double_t* par)
99 // custom fit for jpsi + psi prime
101 Double_t norm = par[0];
102 Double_t alpha = par[1];
104 Double_t mean = par[3];
105 Double_t sigma = par[4];
106 Double_t alphaprime = par[5];
107 Double_t nprime = par[6];
111 Double_t a = TMath::Power(n/TMath::Abs(alpha),n)*TMath::Exp(-0.5*alpha*alpha);
112 Double_t b = n/TMath::Abs(alpha) - TMath::Abs(alpha);
113 Double_t c = TMath::Power(nprime/TMath::Abs(alphaprime),nprime)*TMath::Exp(-0.5*alphaprime*alphaprime);
114 Double_t d = nprime/TMath::Abs(alphaprime) - TMath::Abs(alphaprime);
116 Double_t y = ( TMath::Abs(sigma) > 1E-12 ? (x-mean)/sigma : 0 );
120 if ( y > alphaprime )
122 cb = norm*c*TMath::Power(d+y,-nprime);
124 else if ( y > alpha*-1.0 )
126 cb = norm*TMath::Exp(-0.5*y*y);
130 cb = norm*a*TMath::Power(b-y,-n);
135 return cb + par[7] + par[8]*x; // gaus + pol1
139 Double_t yprime = (x-par[10])/par[11];
140 return cb + par[9]*TMath::Exp(-0.5*yprime*yprime)+par[12]*TMath::Exp(-par[13]*x);
141 // gaus (j/psi) + gaus (psi') + expo
146 Double_t funcCB2(Double_t* xx, Double_t* par)
148 /// CB2 = extended crystal ball
150 Double_t norm = par[0];
151 Double_t alpha = par[1];
153 Double_t mean = par[3];
154 Double_t sigma = par[4];
155 Double_t alphaprime = par[5];
156 Double_t nprime = par[6];
160 Double_t a = TMath::Power(n/TMath::Abs(alpha),n)*TMath::Exp(-0.5*alpha*alpha);
161 Double_t b = n/TMath::Abs(alpha) - TMath::Abs(alpha);
162 Double_t c = TMath::Power(nprime/TMath::Abs(alphaprime),nprime)*TMath::Exp(-0.5*alphaprime*alphaprime);
163 Double_t d = nprime/TMath::Abs(alphaprime) - TMath::Abs(alphaprime);
165 Double_t y = ( TMath::Abs(sigma) > 1E-12 ? (x-mean)/sigma : 0 );
167 if ( y > alphaprime )
169 return norm*c*TMath::Power(d+y,-nprime);
171 else if ( y > alpha*-1.0 )
173 return norm*TMath::Exp(-0.5*y*y);
177 return norm*a*TMath::Power(b-y,-n);
181 Double_t funcJpsiPsiPrime(Double_t* xx, Double_t* par)
185 Double_t jpsi = funcCB(xx,par);
186 Double_t psiprime = funcCB2(xx,par+5);
191 Double_t e1 = par[n]*TMath::Exp(par[n+1]*x);
192 Double_t e2 = par[n+2]*TMath::Exp(par[n+3]*x);
196 if ( x > par[3] ) e=e2;
198 return jpsi+psiprime+e;
201 Double_t funcJpsiCBE(Double_t* xx, Double_t* par)
205 Double_t jpsi = funcCB(xx,par);
209 Double_t e1 = par[5]*TMath::Exp(par[6]*x);
215 Double_t funcJpsiPCBE(Double_t* xx, Double_t* par)
221 Double_t pol2 = par[0] + par[1]*x + par[2]*x*x;
223 Double_t jpsi = funcCB(xx,par+3);
225 Double_t expo = par[8]*TMath::Exp(par[9]*x);
227 return pol2+jpsi+expo;
230 Double_t funcJpsiECBE(Double_t* xx, Double_t* par)
234 Double_t jpsi = funcCB(xx,par+2);
238 Double_t e1 = par[0]*TMath::Exp(par[1]*x);
240 Double_t e2 = par[7]*TMath::Exp(par[8]*x);
245 Double_t funcJpsiNA48(Double_t*x, Double_t* par)
247 /// Fit function from e.q. 4.8 of Ruben's PhD.
248 Double_t c1 = par[0];
249 Double_t c2 = par[1];
250 Double_t d1 = par[2];
251 Double_t d2 = par[3];
252 Double_t g1 = par[4];
253 Double_t g2 = par[5];
254 Double_t m0 = par[6];
255 Double_t sigma1 = par[7];
256 Double_t sigma2 = par[8];
257 Double_t b1 = par[9];
258 Double_t b2 = par[10];
259 Double_t norm = par[11];
267 Double_t e = d1-g1*TMath::Sqrt(c1*m0-m);
268 rv = TMath::Power(b1*(c1*m0-m),e);
271 else if( m >= c1*m0 && m <= m0 )
275 else if ( m >= m0 && m < c2*m0 )
279 else if( m >= c2*m0 )
281 Double_t e = d2-g2*TMath::Sqrt(m-c2*m0);
282 rv = TMath::Power(b2*(m-c2*m0),e);
286 return norm*TMath::Exp(-(m-m0)*(m-m0)/(2.0*rv*rv));
289 const char* NormalizeName(const char* name, const char* suffix)
291 /// Remove - and / from the name, and adds _suffix
293 TString str(Form("%s_%s",name,suffix));
295 str.ReplaceAll("-","_");
296 str.ReplaceAll("/","%");
301 //------------------------------------------------------------------------------
302 Double_t BackgroundVWG(Double_t *x, Double_t *par)
304 // gaussian variable width
305 Double_t sigma = par[2]+par[3]*((x[0]-par[1])/par[1]);
306 return par[0]*TMath::Exp(-(x[0]-par[1])*(x[0]-par[1])/(2.*sigma*sigma));
310 //------------------------------------------------------------------------------
311 Double_t CrystalBallExtended(Double_t *x,Double_t *par)
313 //par[0] = Normalization
321 Double_t t = (x[0]-par[1])/par[2];
322 if (par[3] < 0) t = -t;
324 Double_t absAlpha = fabs((Double_t)par[3]);
325 Double_t absAlpha2 = fabs((Double_t)par[5]);
327 if (t >= -absAlpha && t < absAlpha2) // gaussian core
329 return par[0]*(exp(-0.5*t*t));
332 if (t < -absAlpha) //left tail
334 Double_t a = TMath::Power(par[4]/absAlpha,par[4])*exp(-0.5*absAlpha*absAlpha);
335 Double_t b = par[4]/absAlpha - absAlpha;
336 return par[0]*(a/TMath::Power(b - t, par[4]));
339 if (t >= absAlpha2) //right tail
342 Double_t c = TMath::Power(par[6]/absAlpha2,par[6])*exp(-0.5*absAlpha2*absAlpha2);
343 Double_t d = par[6]/absAlpha2 - absAlpha2;
344 return par[0]*(c/TMath::Power(d + t, par[6]));
350 //------------------------------------------------------------------------------
351 Double_t Gaus(Double_t *x, Double_t *par)
354 return par[0]/TMath::Sqrt(2.*TMath::Pi())/par[2]*TMath::Exp(-(x[0]-par[1])*(x[0]-par[1])/(2.*par[2]*par[2]));
358 //------------------------------------------------------------------------------
359 Double_t Exp(Double_t *x, Double_t *par)
362 return par[0]*TMath::Exp(par[1]*x[0]);
366 //------------------------------------------------------------------------------
367 Double_t Pow(Double_t *x, Double_t *par)
370 return par[0]*TMath::Power(x[0],par[1]);
374 //------------------------------------------------------------------------------
375 Double_t fitFunctionVWG(Double_t *x, Double_t *par)
377 if (x[0] > 2.9 && x[0] < 3.3) TF1::RejectPoint();
378 return BackgroundVWG(x, par);
381 //------------------------------------------------------------------------------
382 Double_t fitFunctionCB2VWG(Double_t *x, Double_t *par)
384 return BackgroundVWG(x, par) + CrystalBallExtended(x, &par[4]);
387 //------------------------------------------------------------------------------
388 Double_t func2CB2VWG(Double_t *x, Double_t *par)
390 /// 2 extended crystal balls + variable width gaussian
391 /// width of the second CB related to the first (free) one.
395 3.68609+(par[5]-3.096916)/3.096916*3.68609,
396 par[6]/3.096916*3.68609,
402 return BackgroundVWG(x, par) + CrystalBallExtended(x, &par[4]) + CrystalBallExtended(x, par2);
405 //_____________________________________________________________________________
406 //_____________________________________________________________________________
407 //_____________________________________________________________________________
408 //_____________________________________________________________________________
409 //_____________________________________________________________________________
411 //_____________________________________________________________________________
412 AliAnalysisMuMuResult::AliAnalysisMuMuResult(TRootIOCtor* /*io*/) :
427 fCentralitySelection(),
432 //_____________________________________________________________________________
433 AliAnalysisMuMuResult::AliAnalysisMuMuResult(const TH1& hminv)
449 fCentralitySelection(),
455 //_____________________________________________________________________________
456 AliAnalysisMuMuResult::AliAnalysisMuMuResult(const TH1& hminv,
460 TNamed(Form("%s:%d",fitType,nrebin),""),
474 fCentralitySelection(),
480 //_____________________________________________________________________________
481 AliAnalysisMuMuResult::AliAnalysisMuMuResult(const TH1& hminv,
482 const char* triggerName,
483 const char* eventSelection,
484 const char* pairSelection,
485 const char* centSelection,
486 const AliAnalysisMuMuBinning::Range& bin)
488 TNamed(Form("%s-%s-%s-%s",triggerName,eventSelection,pairSelection,centSelection),""),
499 fTriggerClass(triggerName),
500 fEventSelection(eventSelection),
501 fPairSelection(pairSelection),
502 fCentralitySelection(centSelection),
508 //_____________________________________________________________________________
509 AliAnalysisMuMuResult::AliAnalysisMuMuResult(const AliAnalysisMuMuResult& rhs)
512 fNofRuns(rhs.NofRuns()),
513 fNofTriggers(rhs.NofTriggers()),
520 fWeight(rhs.fWeight),
525 /// Note that the mother is lost
526 /// fKeys remains 0x0 so it will be recomputed if need be
530 fMinv = static_cast<TH1*>(rhs.fMinv->Clone());
535 fSubResults = static_cast<TObjArray*>(rhs.fSubResults->Clone());
540 fMap = static_cast<TMap*>(rhs.fMap->Clone());
543 if ( rhs.fAlias.Length() > 0 )
549 //_____________________________________________________________________________
550 AliAnalysisMuMuResult& AliAnalysisMuMuResult::operator=(const AliAnalysisMuMuResult& rhs)
552 /// Assignment operator
567 fMinv = static_cast<TH1*>(rhs.fMinv->Clone());
572 fSubResults = static_cast<TObjArray*>(rhs.fSubResults->Clone());
577 fMap = static_cast<TMap*>(rhs.fMap->Clone());
580 static_cast<TNamed&>(*this)=rhs;
582 fNofRuns = rhs.NofRuns();
583 fNofTriggers = rhs.NofTriggers();
585 fWeight = rhs.fWeight;
590 if ( rhs.fAlias.Length() > 0 )
599 //_____________________________________________________________________________
600 AliAnalysisMuMuResult::~AliAnalysisMuMuResult()
609 //_____________________________________________________________________________
610 const AliAnalysisMuMuBinning::Range& AliAnalysisMuMuResult::Bin() const
612 /// Get the bin of this result
613 if ( !Mother() ) return fBin;
614 else return Mother()->Bin();
617 //_____________________________________________________________________________
618 TObject* AliAnalysisMuMuResult::Clone(const char* /*newname*/) const
620 /// Clone this result
621 return new AliAnalysisMuMuResult(*this);
624 //_____________________________________________________________________________
625 Bool_t AliAnalysisMuMuResult::Correct(const AliAnalysisMuMuResult& other, const char* particle, const char* subResultName)
627 /// Assuming other has an AccxEff entry, correct this value by AccxEff of other
629 if ( HasValue(Form("Nof%s",particle)) )
631 if (!other.HasValue(Form("AccEff%s",particle),subResultName))
633 AliError(Form("Cannot correct as I do not find the AccEff%s value (subResultName=%s)!",particle,subResultName));
637 Double_t acc = other.GetValue(Form("AccEff%s",particle),subResultName);
638 Double_t value = 0.0;
640 if ( acc > 0 ) value = GetValue(Form("Nof%s",particle)) / acc;
642 Double_t error = ErrorAB( GetValue(Form("Nof%s",particle)),
643 GetErrorStat(Form("Nof%s",particle)),
644 other.GetValue(Form("AccEff%s",particle),subResultName),
645 other.GetErrorStat(Form("AccEff%s",particle),subResultName) );
647 Set(Form("CorrNof%s",particle),value,error*value);
653 AliError(Form("Result does not have Nof%s : cannot correct it !",particle));
658 //_____________________________________________________________________________
659 Double_t AliAnalysisMuMuResult::CountParticle(const TH1& hminv, const char* particle, Double_t sigma)
661 /// Count the number of entries in an invariant mass range
663 const std::map<std::string,Double_t>& m = MassMap();
665 std::map<std::string,Double_t>::const_iterator it = m.find(particle);
669 AliErrorClass(Form("Don't know the mass of particle %s",particle));
673 Double_t mass = it->second;
677 AliDebugClass(1,Form("Oups. Got a sigma of %e for particle %s !",sigma,particle));
678 return hminv.Integral();
681 TAxis* x = hminv.GetXaxis();
683 Int_t b1 = x->FindBin(mass-sigma);
684 Int_t b2 = x->FindBin(mass+sigma);
686 AliDebugClass(1,Form("hminv getentries %e integral %e",hminv.GetEntries(),hminv.Integral(b1,b2)));
688 return hminv.Integral(b1,b2);
692 //_____________________________________________________________________________
693 void AliAnalysisMuMuResult::FitJpsiPsiPrimeCustom(TH1& h)
695 std::cout << "Fit with jpsi + psiprime (custom)" << std::endl;
697 const Double_t xmin(1.5);
698 const Double_t xmax(8.0);
700 fitTotal = new TF1("fitTotal",funcJpsiPsiPrimeCustom,xmin,xmax,14);
701 fitTotal->SetLineColor(4);
703 fitTotal->SetParName(0,"cstecb");
704 fitTotal->SetParName(1,"alpha");
705 fitTotal->SetParName(2,"n");
706 fitTotal->SetParName(3,"meanjpsi");
707 fitTotal->SetParName(4,"sigmajpsi");
708 fitTotal->SetParName(5,"alphaprime");
709 fitTotal->SetParName(6,"nprime");
710 fitTotal->SetParName(7,"cstepol1");
711 fitTotal->SetParName(8,"slopepol1");
712 fitTotal->SetParName(9,"cstegaus");
713 fitTotal->SetParName(10,"meanpsiprime");
714 fitTotal->SetParName(11,"sigmapsiprime");
715 fitTotal->SetParName(12,"csteexpo");
716 fitTotal->SetParName(13,"slopeexpo");
718 fitTotal->SetParameter( 0,1);
720 const char* fitOption = "SQBR+";
721 const Double_t alphaMC = 0.936;
722 const Double_t nMC = 4.44;
723 const Double_t alphaprimeMC = 1.60;
724 const Double_t nprimeMC = 3.23;
726 TF1* fcb = new TF1("cb",funcCB2,2.9,3.3,7);
727 fcb->SetParameters(1,1.0,4.0,3.1,0.1,1.5,3);
729 fcb->SetParLimits(3,3,4);
730 fcb->SetParLimits(4,0,1);
732 fcb->FixParameter(1,alphaMC);
733 fcb->FixParameter(2,nMC);
734 fcb->FixParameter(5,alphaprimeMC);
735 fcb->FixParameter(6,nprimeMC);
737 TFitResultPtr rcb = h.Fit(fcb,fitOption,"",2.9,3.3);
744 fitTotal->SetParameter(0,rcb->Parameter(0));
745 fitTotal->SetParameter(1,rcb->Parameter(1)); fitTotal->SetParLimits(1,0,10); // alpha
746 fitTotal->SetParameter(2,rcb->Parameter(2)); fitTotal->SetParLimits(2,1,10); // n
747 fitTotal->SetParameter(3,rcb->Parameter(3)); fitTotal->SetParLimits(3,3.0,3.5); // mean
748 fitTotal->SetParameter(4,rcb->Parameter(4)); fitTotal->SetParLimits(4,0,1); // sigma
749 fitTotal->SetParameter(5,rcb->Parameter(5)); fitTotal->SetParLimits(1,0,10); // alphaprime
750 fitTotal->SetParameter(6,rcb->Parameter(6)); fitTotal->SetParLimits(2,1,10); // nprime
752 fitTotal->FixParameter(1,alphaMC);
753 fitTotal->FixParameter(2,nMC);
754 fitTotal->FixParameter(5,alphaprimeMC);
755 fitTotal->FixParameter(6,nprimeMC);
757 TF1* fge = new TF1("fge","gaus(0)+expo(3)",3.5,4.4);
758 fge->SetParameters(1,3.6,0.25,1,1);
759 TFitResultPtr rpsiprime = h.Fit(fge,fitOption,"",3.5,4.4);
761 if (static_cast<int>(rpsiprime))
763 AliInfo("Will fix psiprime parameters");
764 fitTotal->FixParameter(9,0);
765 fitTotal->FixParameter(10,3.7);
766 fitTotal->FixParameter(11,0.1);
770 fitTotal->SetParameter(10,rpsiprime->Parameter(1)); fitTotal->SetParLimits(10,3.5,3.8); // mean'
771 fitTotal->SetParameter(11,rpsiprime->Parameter(2)); fitTotal->SetParLimits(11,0.05,0.7); // sigma'
774 TFitResultPtr rpol1 = h.Fit("pol1",fitOption,"",1.5,2.5);
775 fitTotal->SetParameter( 7,rpol1->Parameter(0));
776 fitTotal->SetParameter( 8,rpol1->Parameter(1));
778 TFitResultPtr rexpo = h.Fit("expo",fitOption,"",4.5,7.0);
779 fitTotal->SetParameter(12,rexpo->Parameter(0));
780 fitTotal->SetParameter(13,rexpo->Parameter(1));
783 TFitResultPtr r = h.Fit(fitTotal,fitOption,"",1.5,7);
785 TF1* signal = new TF1("signal","gaus",2,6);
786 signal->SetParameters(fitTotal->GetParameter(0),
787 fitTotal->GetParameter(3),
788 fitTotal->GetParameter(4));
790 TF1* signalPrime = new TF1("signalPrime","gaus",2,6);
791 signalPrime->SetParameters(fitTotal->GetParameter(9),
792 fitTotal->GetParameter(10),
793 fitTotal->GetParameter(11));
795 Double_t gausParameters[3];
796 Double_t covarianceMatrix[3][3];
797 Double_t gausParametersPrime[3];
798 Double_t covarianceMatrixPrime[3][3];
800 covarianceMatrix[0][0] = (r->GetCovarianceMatrix())(0,0);
801 covarianceMatrix[1][0] = (r->GetCovarianceMatrix())(3,0);
802 covarianceMatrix[2][0] = (r->GetCovarianceMatrix())(4,0);
803 covarianceMatrix[0][1] = (r->GetCovarianceMatrix())(0,3);
804 covarianceMatrix[0][2] = (r->GetCovarianceMatrix())(0,4);
806 for ( int iy = 1; iy < 3; ++iy )
808 for ( int ix = 1; ix < 3; ++ix )
810 covarianceMatrix[ix][iy] = (r->GetCovarianceMatrix())(ix+2,iy+2);
814 gausParameters[0] = fitTotal->GetParameter(0);
815 gausParameters[1] = fitTotal->GetParameter(3);
816 gausParameters[2] = fitTotal->GetParameter(4);
818 gausParametersPrime[0] = fitTotal->GetParameter(9);
819 gausParametersPrime[1] = fitTotal->GetParameter(10);
820 gausParametersPrime[2] = fitTotal->GetParameter(11);
822 covarianceMatrixPrime[0][0] = (r->GetCovarianceMatrix())(9,9);
823 covarianceMatrixPrime[1][0] = (r->GetCovarianceMatrix())(10,9);
824 covarianceMatrixPrime[2][0] = (r->GetCovarianceMatrix())(11,9);
825 covarianceMatrixPrime[0][1] = (r->GetCovarianceMatrix())(9,10);
826 covarianceMatrixPrime[0][2] = (r->GetCovarianceMatrix())(9,11);
828 for ( int iy = 1; iy < 3; ++iy )
830 for ( int ix = 1; ix < 3; ++ix )
832 covarianceMatrixPrime[ix][iy] = (r->GetCovarianceMatrix())(ix+2,iy+2);
836 double n = signal->Integral(2,6)/h.GetBinWidth(10);
837 double nerr = signal->IntegralError(2,6,&gausParameters[0],&covarianceMatrix[0][0])/h.GetBinWidth(10);
838 Set("NofJpsi",n,nerr);
839 Set("MeanJpsi",fitTotal->GetParameter(3),fitTotal->GetParError(3));
840 Set("SigmaJpsi",fitTotal->GetParameter(4),fitTotal->GetParError(4));
842 double nprime = signalPrime->Integral(2,6)/h.GetBinWidth(10);
843 double nerrprime = signalPrime->IntegralError(2,6,&gausParametersPrime[0],&covarianceMatrixPrime[0][0])/h.GetBinWidth(10);
844 Set("NofPsiPrime",nprime,nerrprime);
845 Set("MeanPsiPrime",fitTotal->GetParameter(10),fitTotal->GetParError(10));
846 Set("SigmaPsiPrime",fitTotal->GetParameter(11),fitTotal->GetParError(11));
851 //_____________________________________________________________________________
852 AliAnalysisMuMuResult::SubResult AliAnalysisMuMuResult::FitJpsiPsiPrimeCB(TH1& h)
854 std::cout << "Fit with jpsi + psiprime (CB) " << std::endl;
856 const Double_t xmin(1.5);
857 const Double_t xmax(8.0);
859 fitTotal = new TF1("fitTotal",funcJpsiPsiPrime,xmin,xmax,14);
861 // Double_t N = par[0];
862 // Double_t alpha = par[1];
863 // Double_t n = par[2];
864 // Double_t mean = par[3];
865 // Double_t sigma = par[4];
867 fitTotal->SetParameter( 0,1); // N
868 fitTotal->FixParameter( 1,0.936); // alpha
869 fitTotal->FixParameter( 2,4.44); // n
870 fitTotal->SetParameter( 3,3.1); fitTotal->SetParLimits(3,3.0,3.2); // mean
871 fitTotal->SetParameter( 4,0.07); fitTotal->SetParLimits(4,0.02,1); // sigma
873 fitTotal->SetParameter( 5,0.01); // N'
874 fitTotal->FixParameter( 6,0.936); // alpha'
875 fitTotal->FixParameter( 7,4.44); // n'
876 fitTotal->SetParameter( 8,3.7); fitTotal->SetParLimits(8,3.5,3.8); // mean'
877 fitTotal->SetParameter( 9,0.1); fitTotal->SetParLimits(9,0.02,1.0); // sigma'
879 fitTotal->SetParameter(10,h.GetMaximum());
880 fitTotal->SetParameter(11,-1);
882 fitTotal->SetParameter(12,h.GetMaximum()/100);
883 fitTotal->SetParameter(13,-1);
885 TFitResultPtr r = h.Fit(fitTotal,"SQBI","",1.5,6);
887 // for ( int ix = 0; ix < fitTotal->GetNpar(); ++ix )
889 // for ( int iy = 0; iy < fitTotal->GetNpar(); ++iy )
891 // std::cout << Form("COV(%d,%d)=%e ",ix,iy,r->GetCovarianceMatrix()(ix,iy));
893 // std::cout << std::endl;
897 TF1* signal = new TF1("signal","gaus",2,8);
899 signal->SetParameters(fitTotal->GetParameter(0),
900 fitTotal->GetParameter(3),
901 fitTotal->GetParameter(4));
903 TF1* signalPrime = new TF1("signalPrime","gaus",2,8);
905 signalPrime->SetParameters(fitTotal->GetParameter(0),
906 fitTotal->GetParameter(8),
907 fitTotal->GetParameter(9));
909 Double_t gausParameters[3];
910 Double_t gausParametersPrime[3];
911 Double_t covarianceMatrix[3][3];
912 Double_t covarianceMatrixPrime[3][3];
914 gausParameters[0] = fitTotal->GetParameter(0);
915 gausParameters[1] = fitTotal->GetParameter(3);
916 gausParameters[2] = fitTotal->GetParameter(4);
918 covarianceMatrix[0][0] = (r->GetCovarianceMatrix())(0,0);
919 covarianceMatrix[1][0] = (r->GetCovarianceMatrix())(3,0);
920 covarianceMatrix[2][0] = (r->GetCovarianceMatrix())(4,0);
921 covarianceMatrix[0][1] = (r->GetCovarianceMatrix())(0,3);
922 covarianceMatrix[0][2] = (r->GetCovarianceMatrix())(0,4);
924 for ( int iy = 1; iy < 3; ++iy )
926 for ( int ix = 1; ix < 3; ++ix )
928 covarianceMatrix[ix][iy] = (r->GetCovarianceMatrix())(ix+2,iy+2);
932 gausParametersPrime[0] = fitTotal->GetParameter(0);
933 gausParametersPrime[1] = fitTotal->GetParameter(8);
934 gausParametersPrime[2] = fitTotal->GetParameter(9);
936 covarianceMatrixPrime[0][0] = (r->GetCovarianceMatrix())(0,0);
937 covarianceMatrixPrime[1][0] = (r->GetCovarianceMatrix())(8,0);
938 covarianceMatrixPrime[2][0] = (r->GetCovarianceMatrix())(9,0);
939 covarianceMatrixPrime[0][1] = (r->GetCovarianceMatrix())(0,8);
940 covarianceMatrixPrime[0][2] = (r->GetCovarianceMatrix())(0,9);
942 for ( int iy = 1; iy < 3; ++iy )
944 for ( int ix = 1; ix < 3; ++ix )
946 covarianceMatrixPrime[ix][iy] = (r->GetCovarianceMatrix())(ix+2,iy+2);
950 double n = signal->Integral(2,6)/h.GetBinWidth(10);
951 double nerr = signal->IntegralError(2,6,&gausParameters[0],&covarianceMatrix[0][0])/h.GetBinWidth(10);
953 Set("NofJpsi",n,nerr);
954 Set("MeanJpsi",fitTotal->GetParameter(3),fitTotal->GetParError(3));
955 Set("SigmaJpsi",fitTotal->GetParameter(4),fitTotal->GetParError(4));
957 double nprime = signalPrime->Integral(2,6)/h.GetBinWidth(10);
958 double nerrprime = signalPrime->IntegralError(2,6,&gausParametersPrime[0],&covarianceMatrixPrime[0][0])/h.GetBinWidth(10);
960 Set("NofPsiPrime",nprime,nerrprime);
961 Set("MeanPsiPrime",fitTotal->GetParameter(8),fitTotal->GetParError(8));
962 Set("SigmaPsiPrime",fitTotal->GetParameter(9),fitTotal->GetParError(9));
967 //_____________________________________________________________________________
968 AliAnalysisMuMuResult* AliAnalysisMuMuResult::FitJpsiGCBE(TH1& h)
970 /// Fit Jpsi spectra with crystal ball + gaussian + exponential
972 std::cout << "Fit with jpsi alone (gaus + CB + expo)" << std::endl;
974 Int_t nrebin = fMinv->GetXaxis()->GetNbins() / h.GetXaxis()->GetNbins();
976 AliAnalysisMuMuResult* r = new AliAnalysisMuMuResult(h,"JPSIGCBE",nrebin);
978 TH1* hfit = r->Minv();
980 const Double_t xmin(1.0);
981 const Double_t xmax(8.0);
983 TF1* fitTotal = new TF1("fitTotal",funcJpsiGCBE,xmin,xmax,10);
984 fitTotal->SetParNames("cste","x0","sigma0","N","alpha","n","mean","sigma","expocste","exposlope");
986 fitTotal->SetParLimits(3,0,h.GetMaximum()*2); // N
988 const Double_t cbalpha(0.98);
989 const Double_t cbn(5.2);
991 fitTotal->FixParameter(4,cbalpha);
992 fitTotal->FixParameter(5,cbn);
994 fitTotal->SetParLimits(6,2.8,3.2); // mean
995 fitTotal->SetParLimits(7,0.02,0.3); // sigma
997 TF1* fg = new TF1("fg","gaus",xmin,xmax);
999 hfit->Fit(fg,"","",0.75,3.0);
1001 fitTotal->SetParameter(0,fg->GetParameter(0));
1002 fitTotal->SetParameter(1,fg->GetParameter(1));
1003 fitTotal->SetParameter(2,fg->GetParameter(2));
1005 TF1* fexpo = new TF1("expo","expo",xmin,xmax);
1007 hfit->Fit(fexpo,"","",3.5,5);
1009 fitTotal->SetParameter(8,fexpo->GetParameter(0));
1010 fitTotal->SetParameter(9,fexpo->GetParameter(1));
1012 fitTotal->SetParameter(3,h.GetMaximum()),
1013 fitTotal->SetParameter(4,cbalpha);
1014 fitTotal->SetParameter(5,cbn);
1015 fitTotal->SetParameter(6,3.15);
1016 fitTotal->SetParameter(7,0.1);
1018 const char* fitOption = "SI+";
1020 TFitResultPtr fitResult = hfit->Fit(fitTotal,fitOption,"",2,5);
1022 r->Set("MeanJpsi",fitTotal->GetParameter(6),fitTotal->GetParError(6));
1023 r->Set("SigmaJpsi",fitTotal->GetParameter(7),fitTotal->GetParError(7));
1025 double m = r->GetValue("MeanJpsi");
1026 double s = r->GetValue("SigmaJpsi");
1029 TF1* fcb = new TF1("fcb",funcCB,xmin,xmax,5);
1030 fcb->SetParameters(fitTotal->GetParameter(3),
1031 fitTotal->GetParameter(4),
1032 fitTotal->GetParameter(5),
1033 fitTotal->GetParameter(6),
1034 fitTotal->GetParameter(7));
1036 fcb->SetLineColor(6);
1038 TLine* l1 = new TLine(m-n*s,0,m-n*s,fitTotal->GetParameter(3));
1039 TLine* l2 = new TLine(m+n*s,0,m+n*s,fitTotal->GetParameter(3));
1040 l1->SetLineColor(6);
1041 l2->SetLineColor(6);
1042 h.GetListOfFunctions()->Add(fcb);
1043 h.GetListOfFunctions()->Add(l1);
1044 h.GetListOfFunctions()->Add(l2);
1047 Double_t cbParameters[5];
1048 Double_t covarianceMatrix[5][5];
1050 cbParameters[0] = fitTotal->GetParameter(3);
1051 cbParameters[1] = fitTotal->GetParameter(4);
1052 cbParameters[2] = fitTotal->GetParameter(5);
1053 cbParameters[3] = fitTotal->GetParameter(6);
1054 cbParameters[4] = fitTotal->GetParameter(7);
1056 for ( int iy = 0; iy < 5; ++iy )
1058 for ( int ix = 0; ix < 5; ++ix )
1060 covarianceMatrix[ix][iy] = (fitResult->GetCovarianceMatrix())(ix+3,iy+3);
1064 double njpsi = fcb->Integral(m-n*s,m+n*s)/h.GetBinWidth(1);
1066 double nerr = fcb->IntegralError(m-n*s,m+n*s,&cbParameters[0],&covarianceMatrix[0][0])/h.GetBinWidth(1);
1068 r->Set("NofJpsi",njpsi,nerr);
1074 //_____________________________________________________________________________
1075 void AliAnalysisMuMuResult::FitJpsiPCBE(TH1& h)
1077 std::cout << "Fit with jpsi alone (pol2 + CB + expo)" << std::endl;
1079 const Double_t xmin(2.0);
1080 const Double_t xmax(5.0);
1082 fitTotal = new TF1("fitTotal",funcJpsiPCBE,xmin,xmax,10);
1083 fitTotal->SetParNames("p0","p1","p2","N","alpha","n","mean","sigma","expocste","exposlope");
1085 fitTotal->SetParLimits(3,0,h.GetMaximum()*2); // N
1087 const Double_t cbalpha(0.98);
1088 const Double_t cbn(5.2);
1090 fitTotal->FixParameter(4,cbalpha);
1091 fitTotal->FixParameter(5,cbn);
1093 fitTotal->SetParLimits(6,2,4); // mean
1094 fitTotal->SetParLimits(7,0.05,0.2); // sigma
1096 TF1* fpol2 = new TF1("pol2","pol2",xmin,xmax);
1098 h.Fit(fpol2,"+","",2,2.8);
1100 fitTotal->SetParameter(0,fpol2->GetParameter(0));
1101 fitTotal->SetParameter(1,fpol2->GetParameter(1));
1102 fitTotal->SetParameter(2,fpol2->GetParameter(2));
1104 TF1* fexpo = new TF1("expo","expo",xmin,xmax);
1106 h.Fit(fexpo,"+","",3.5,4.5);
1108 fitTotal->SetParameter(8,fexpo->GetParameter(0));
1109 fitTotal->SetParameter(9,fexpo->GetParameter(1));
1111 fitTotal->SetParameter(3,h.GetMaximum()),
1112 fitTotal->SetParameter(4,cbalpha);
1113 fitTotal->SetParameter(5,cbn);
1114 fitTotal->SetParameter(6,3.15);
1115 fitTotal->SetParameter(7,0.1);
1117 h.Fit(fitTotal,"+","",2.5,5);
1119 Set("MeanJpsi",fitTotal->GetParameter(6),fitTotal->GetParError(6));
1120 Set("SigmaJpsi",fitTotal->GetParameter(7),fitTotal->GetParError(7));
1122 double m = GetValue("MeanJpsi");
1123 double s = GetValue("SigmaJpsi");
1126 TF1* fcb = new TF1("fcb",funcCB,xmin,xmax,5);
1127 fcb->SetParameters(fitTotal->GetParameter(3),
1128 fitTotal->GetParameter(4),
1129 fitTotal->GetParameter(5),
1130 fitTotal->GetParameter(6),
1131 fitTotal->GetParameter(7));
1133 fcb->SetLineColor(6);
1135 TLine* l1 = new TLine(m-n*s,0,m-n*s,fitTotal->GetParameter(3));
1136 TLine* l2 = new TLine(m+n*s,0,m+n*s,fitTotal->GetParameter(3));
1137 l1->SetLineColor(6);
1138 l2->SetLineColor(6);
1139 h.GetListOfFunctions()->Add(fcb);
1140 h.GetListOfFunctions()->Add(l1);
1141 h.GetListOfFunctions()->Add(l2);
1144 Set("NofJpsi",fitTotal->Integral(m-n*s,m+n*s)/h.GetBinWidth(1),fitTotal->IntegralError(m-n*s,m+n*s)/h.GetBinWidth(1));
1146 // Set("NofJpsi",fitTotal->Integral(0,10)/h.GetBinWidth(1),fitTotal->IntegralError(0,10)/h.GetBinWidth(1));
1150 //_____________________________________________________________________________
1151 void AliAnalysisMuMuResult::FitJpsiCBE(TH1& h)
1153 std::cout << "Fit with jpsi alone" << std::endl;
1155 const Double_t xmin(1.5);
1156 const Double_t xmax(8.0);
1158 fitTotal = new TF1("fitTotal",funcJpsiCBE,xmin,xmax,7);
1159 fitTotal->SetParNames("N","alpha","n","mean","sigma","expocste","exposlope");
1161 // fitTotal->SetParameters(h.GetMaximum(),1,5,3.0,0.07,1.5,3,1,0);
1163 fitTotal->SetParameters(1,1.15,3.6,3.0,0.07,1,-1);
1165 fitTotal->SetParLimits(0,0,h.GetMaximum()); // N
1166 // fitTotal->SetParLimits(1,0.1,2); // alpha
1167 fitTotal->FixParameter(1,0.98);
1168 // fitTotal->SetParLimits(2,0.01,5); // n
1169 fitTotal->FixParameter(2,5.2);
1170 fitTotal->SetParLimits(3,2.8,3.5); // mean
1171 fitTotal->SetParLimits(4,0.05,0.2); // sigma
1173 TF1* fexpo = new TF1("expo","expo",xmin,xmax);
1175 h.Fit(fexpo,"+","",2,3);
1177 fitTotal->SetParameter(5,fexpo->GetParameter(0));
1178 fitTotal->SetParameter(6,fexpo->GetParameter(1));
1180 h.Fit(fitTotal,"+","",2,5);
1183 Set("MeanJpsi",fitTotal->GetParameter(3),fitTotal->GetParError(3));
1184 Set("SigmaJpsi",fitTotal->GetParameter(4),fitTotal->GetParError(4));
1186 double m = GetValue("MeanJpsi");
1187 double s = GetValue("SigmaJpsi");
1190 TF1* fcb = new TF1("fcb",funcCB,xmin,xmax,5);
1191 fcb->SetParameters(fitTotal->GetParameter(0),
1192 fitTotal->GetParameter(1),
1193 fitTotal->GetParameter(2),
1194 fitTotal->GetParameter(3),
1195 fitTotal->GetParameter(4));
1197 fcb->SetLineColor(6);
1199 TLine* l1 = new TLine(m-n*s,0,m-n*s,fitTotal->GetParameter(0));
1200 TLine* l2 = new TLine(m+n*s,0,m+n*s,fitTotal->GetParameter(0));
1201 l1->SetLineColor(6);
1202 l2->SetLineColor(6);
1203 h.GetListOfFunctions()->Add(fcb);
1204 h.GetListOfFunctions()->Add(l1);
1205 h.GetListOfFunctions()->Add(l2);
1208 Set("NofJpsi",fitTotal->Integral(m-n*s,m+n*s)/h.GetBinWidth(1),fitTotal->IntegralError(m-n*s,m+n*s)/h.GetBinWidth(1));
1210 // Set("NofJpsi",fitTotal->Integral(0,10)/h.GetBinWidth(1),fitTotal->IntegralError(0,10)/h.GetBinWidth(1));
1214 //_____________________________________________________________________________
1215 void AliAnalysisMuMuResult::FitJpsiECBE(TH1& h)
1217 std::cout << "Fit with jpsi alone (expo + CB + expo)" << std::endl;
1219 const Double_t xmin(1.5);
1220 const Double_t xmax(8.0);
1222 fitTotal = new TF1("fitTotal",funcJpsiECBE,xmin,xmax,9);
1223 fitTotal->SetParNames("e0","s0","N","alpha","n","mean","sigma","e1","s1");
1225 fitTotal->SetParameters(1,-1,1,1.15,3.6,3.2,0.06,-1);
1227 fitTotal->SetParLimits(0,0,h.GetMaximum()*2);
1229 fitTotal->FixParameter(3,0.98); // alpha
1230 fitTotal->FixParameter(4,5.2); // n
1231 fitTotal->SetParLimits(5,2.8,3.5); // mean
1232 fitTotal->SetParLimits(6,0.05,0.2); // sigma
1234 TF1* fexpo1 = new TF1("expo1","expo",xmin,xmax);
1235 TF1* fexpo2 = new TF1("expo2","expo",xmin,xmax);
1237 h.Fit(fexpo1,"","",1.5,3);
1239 fitTotal->SetParameter(0,fexpo1->GetParameter(0));
1240 fitTotal->SetParameter(1,fexpo1->GetParameter(1));
1242 h.Fit(fexpo2,"","",3.5,5.0);
1244 fitTotal->SetParameter(7,fexpo2->GetParameter(0));
1245 fitTotal->SetParameter(8,fexpo2->GetParameter(1));
1247 const char* fitOption = "SI+";
1249 TFitResultPtr r = h.Fit(fitTotal,fitOption,"",2,5);
1251 Set("MeanJpsi",fitTotal->GetParameter(5),fitTotal->GetParError(5));
1252 Set("SigmaJpsi",fitTotal->GetParameter(6),fitTotal->GetParError(6));
1254 double m = GetValue("MeanJpsi");
1255 double s = GetValue("SigmaJpsi");
1258 TF1* fcb = new TF1("fcb",funcCB,xmin,xmax,5);
1259 fcb->SetParameters(fitTotal->GetParameter(2),
1260 fitTotal->GetParameter(3),
1261 fitTotal->GetParameter(4),
1262 fitTotal->GetParameter(5),
1263 fitTotal->GetParameter(6));
1265 fcb->SetParError(0,fitTotal->GetParError(2));
1266 fcb->SetParError(1,fitTotal->GetParError(3));
1267 fcb->SetParError(2,fitTotal->GetParError(4));
1268 fcb->SetParError(3,fitTotal->GetParError(5));
1269 fcb->SetParError(4,fitTotal->GetParError(6));
1271 fcb->SetLineColor(6);
1273 TLine* l1 = new TLine(m-n*s,0,m-n*s,fitTotal->GetParameter(2));
1274 TLine* l2 = new TLine(m+n*s,0,m+n*s,fitTotal->GetParameter(2));
1275 l1->SetLineColor(6);
1276 l2->SetLineColor(6);
1277 h.GetListOfFunctions()->Add(fcb);
1278 h.GetListOfFunctions()->Add(l1);
1279 h.GetListOfFunctions()->Add(l2);
1282 Double_t cbParameters[5];
1283 Double_t covarianceMatrix[5][5];
1285 cbParameters[0] = fitTotal->GetParameter(2);
1286 cbParameters[1] = fitTotal->GetParameter(3);
1287 cbParameters[2] = fitTotal->GetParameter(4);
1288 cbParameters[3] = fitTotal->GetParameter(5);
1289 cbParameters[4] = fitTotal->GetParameter(6);
1291 for ( int iy = 0; iy < 5; ++iy )
1293 for ( int ix = 0; ix < 5; ++ix )
1295 covarianceMatrix[ix][iy] = (r->GetCovarianceMatrix())(ix+2,iy+2);
1300 double njpsi = fcb->Integral(m-n*s,m+n*s)/h.GetBinWidth(1);
1302 double nerr = fcb->IntegralError(m-n*s,m+n*s,&cbParameters[0],&covarianceMatrix[0][0])/h.GetBinWidth(1);
1305 Set("NofJpsi",njpsi,nerr);
1310 //_____________________________________________________________________________
1311 AliAnalysisMuMuResult* AliAnalysisMuMuResult::FitJpsi(TH1& h)
1313 /// Fit Jpsi spectra using extended crystall ball (CB2) with free tails
1315 std::cout << "Fit with jpsi alone" << std::endl;
1317 Int_t nrebin = fMinv->GetXaxis()->GetNbins() / h.GetXaxis()->GetNbins();
1319 AliAnalysisMuMuResult* r = new AliAnalysisMuMuResult(h,"JPSI",nrebin);
1321 TH1* hfit = r->Minv();
1323 const Double_t xmin(1.5);
1324 const Double_t xmax(8.0);
1326 TF1* fitTotal = new TF1("fitTotal",funcCB2,xmin,xmax,7);
1327 fitTotal->SetParNames("N","alphaLow","nLow","mean","sigma","alphaUp","nUp");
1328 fitTotal->SetParameters(h.GetMaximum(),1,5,3.1,0.07,1.5,3);
1329 fitTotal->SetParLimits(0,0,h.GetMaximum()*2); // N
1330 fitTotal->SetParLimits(1,0,10); // alpha
1331 fitTotal->SetParLimits(2,0.1,10); // n
1332 fitTotal->SetParLimits(3,3,3.1); // mean
1333 fitTotal->SetParLimits(4,0.01,1); // sigma
1334 fitTotal->SetParLimits(5,0,10); // alpha
1335 fitTotal->SetParLimits(6,0.1,10); // n
1337 hfit->Fit(fitTotal,"+","",2,5);
1340 r->Set("MeanJpsi",fitTotal->GetParameter(3),fitTotal->GetParError(3));
1341 r->Set("SigmaJpsi",fitTotal->GetParameter(4),fitTotal->GetParError(4));
1343 double m = r->GetValue("MeanJpsi");
1344 double s = r->GetValue("SigmaJpsi");
1347 r->Set("NofJpsi",fitTotal->Integral(m-n*s,m+n*s)/h.GetBinWidth(1),fitTotal->IntegralError(m-n*s,m+n*s)/h.GetBinWidth(1));
1352 //_____________________________________________________________________________
1353 AliAnalysisMuMuResult* AliAnalysisMuMuResult::FitJpsiCB2VWG(const TH1& h)
1355 /// Fit Jpsi spectra using extended crystal ball (CB2) + variable width gaussian (VWG)
1357 std::cout << "Fit with jpsi VWG" << std::endl;
1359 Int_t nrebin = fMinv->GetXaxis()->GetNbins() / h.GetXaxis()->GetNbins();
1361 AliAnalysisMuMuResult* r = new AliAnalysisMuMuResult(h,"JPSICB2VWG",nrebin);
1364 TH1* hfit = r->Minv();
1366 const Double_t xmin(2.0);
1367 const Double_t xmax(5.0);
1369 // // gaussian variable width
1370 // Double_t sigma = par[2]+par[3]*((x[0]-par[1])/par[1]);
1371 // return par[0]*TMath::Exp(-(x[0]-par[1])*(x[0]-par[1])/(2.*sigma*sigma));
1372 // Double_t CrystalBallExtended(Double_t *x,Double_t *par)
1373 // //par[0] = Normalization
1378 // //par[5] = alpha'
1381 TF1* fitTotal = new TF1("fitTotal",fitFunctionCB2VWG,xmin,xmax,11);
1382 fitTotal->SetParNames("kVWG","mVWG","sVWG1","sVWG2","norm","mean","sigma","alpha","n","alpha'","n'");
1384 fitTotal->SetParameter(0, 10000.); // kVWG
1385 fitTotal->SetParameter(1, 1.9); // mVWG
1387 fitTotal->SetParameter(2, 0.5); // sVWG1
1388 fitTotal->SetParLimits(2, 0., 100.);
1390 fitTotal->SetParameter(3, 0.3); // sVWG2
1391 fitTotal->SetParLimits(3, 0., 100.);
1393 fitTotal->SetParameter(4, h.GetMaximum()); // norm
1395 fitTotal->SetParameter(5, 3.1); // mean
1396 fitTotal->SetParLimits(5, 3.0, 3.2);
1398 fitTotal->SetParameter(6, 0.08); // sigma
1399 fitTotal->SetParLimits(6, 0.04, 0.20);
1401 fitTotal->SetParameter(7,1.0); // alpha
1402 fitTotal->SetParameter(8,5); // n
1403 fitTotal->SetParameter(9,2.0); // alpha'
1404 fitTotal->SetParameter(10,4); // n'
1406 // fitTotal->FixParameter(7, 0.93);
1407 // fitTotal->FixParameter(8, 5.59);
1408 // fitTotal->FixParameter(9, 2.32);
1409 // fitTotal->FixParameter(10, 3.39);
1410 // fitTotal->SetParameter(11, 10.);
1412 const char* fitOption = "SIER"; //+";
1414 TFitResultPtr fitResult = hfit->Fit(fitTotal,fitOption,"");
1416 r->Set("MeanJpsi",fitTotal->GetParameter(5),fitTotal->GetParError(5));
1417 r->Set("SigmaJpsi",fitTotal->GetParameter(6),fitTotal->GetParError(6));
1419 double m = r->GetValue("MeanJpsi");
1420 double s = r->GetValue("SigmaJpsi");
1423 TF1* fcb = new TF1("fcb",CrystalBallExtended,xmin,xmax,7);
1424 fcb->SetParameters(fitTotal->GetParameter(4),
1425 fitTotal->GetParameter(5),
1426 fitTotal->GetParameter(6),
1427 fitTotal->GetParameter(7),
1428 fitTotal->GetParameter(8),
1429 fitTotal->GetParameter(9),
1430 fitTotal->GetParameter(10));
1433 fcb->SetLineColor(1);
1435 TLine* l1 = new TLine(m-n*s,0,m-n*s,fitTotal->GetParameter(4));
1436 TLine* l2 = new TLine(m+n*s,0,m+n*s,fitTotal->GetParameter(4));
1437 l1->SetLineColor(6);
1438 l2->SetLineColor(6);
1439 hfit->GetListOfFunctions()->Add(fcb);
1440 hfit->GetListOfFunctions()->Add(l1);
1441 hfit->GetListOfFunctions()->Add(l2);
1443 Double_t cbParameters[7];
1444 Double_t covarianceMatrix[7][7];
1446 for ( int ix = 0; ix < 7; ++ix )
1448 cbParameters[ix] = fitTotal->GetParameter(ix+4);
1451 for ( int iy = 0; iy < 5; ++iy )
1453 for ( int ix = 0; ix < 5; ++ix )
1455 covarianceMatrix[ix][iy] = (fitResult->GetCovarianceMatrix())(ix+4,iy+4);
1459 double njpsi = fcb->Integral(m-n*s,m+n*s)/h.GetBinWidth(1);
1460 double nerr = fcb->IntegralError(m-n*s,m+n*s,&cbParameters[0],&covarianceMatrix[0][0])/h.GetBinWidth(1);
1462 r->Set("NofJpsi",njpsi,nerr);
1467 //_____________________________________________________________________________
1468 AliAnalysisMuMuResult* AliAnalysisMuMuResult::FitJpsi2CB2VWG(const TH1& h,
1474 /// Fit using extended crystal ball + variable width gaussian
1476 std::cout << Form("Fit with jpsi + psiprime VWG alphaLow=%5.2f nLow=%5.2f alphaUp=%5.2f nUp=%5.2f",
1477 alphaLow,nLow,alphaUp,nUp) << std::endl;
1479 Int_t nrebin = fMinv->GetXaxis()->GetNbins() / h.GetXaxis()->GetNbins();
1481 TString resultName("JPSI2CB2VWG");
1484 resultName += TString::Format("alphaLow=%5.2f",alphaLow);
1488 resultName += TString::Format("nLow=%5.2f",nLow);
1492 resultName += TString::Format("alphaUp=%5.2f",alphaUp);
1496 resultName += TString::Format("nUp=%5.2f",nUp);
1498 resultName.ReplaceAll(" ","");
1500 AliAnalysisMuMuResult* r = new AliAnalysisMuMuResult(h,resultName.Data(),nrebin);
1502 TH1* hfit = r->Minv();
1504 const Double_t xmin(2.2);
1505 const Double_t xmax(5.0);
1507 TF1* fitTotal = new TF1("fitTotal",func2CB2VWG,xmin,xmax,12);
1508 fitTotal->SetParNames("kVWG","mVWG","sVWG1","sVWG2","kPsi","mPsi","sPsi","alPsi","nlPsi","auPsi","nuPsi");
1509 fitTotal->SetParName(11, "kPsi'");
1511 fitTotal->SetParameter(0, 10000.);
1512 fitTotal->SetParameter(1, 1.9);
1513 fitTotal->SetParameter(2, 0.5);
1514 fitTotal->SetParLimits(2, 0., 100.);
1515 fitTotal->SetParameter(3, 0.3);
1516 fitTotal->SetParLimits(3, 0., 100.);
1517 fitTotal->SetParameter(4, 100.);
1518 fitTotal->SetParameter(5, 3.1);
1519 fitTotal->SetParLimits(5, 3.08, 3.2);
1520 fitTotal->SetParameter(6, 0.08);
1521 fitTotal->SetParLimits(6, 0.05, 0.15);
1523 // r = FitJpsi2CB2VWG(*hminv,0.93,5.59,2.32,3.39);
1527 fitTotal->FixParameter(7, alphaLow);
1531 fitTotal->SetParameter(7,0.9);
1532 fitTotal->SetParLimits(7,0.1,10.0);
1537 fitTotal->FixParameter(8, nLow);
1541 fitTotal->SetParameter(8,5.0);
1542 fitTotal->SetParLimits(8,0.0,10.0);
1547 fitTotal->FixParameter(9, alphaUp);
1551 fitTotal->SetParameter(9, 2.0);
1552 fitTotal->SetParLimits(9,0.1,10.0);
1557 fitTotal->FixParameter(10, nUp);
1561 fitTotal->SetParameter(10,3.0);
1562 fitTotal->SetParLimits(10,0.0,10.0);
1565 fitTotal->SetParameter(11, 10.);
1567 const char* fitOption = "SER"; //+";
1569 TFitResultPtr fitResult = hfit->Fit(fitTotal,fitOption,"");
1571 r->Set("MeanJpsi",fitTotal->GetParameter(5),fitTotal->GetParError(5));
1572 r->Set("SigmaJpsi",fitTotal->GetParameter(6),fitTotal->GetParError(6));
1574 double m = r->GetValue("MeanJpsi");
1575 double s = r->GetValue("SigmaJpsi");
1578 TF1* fcb = new TF1("fcb",CrystalBallExtended,xmin,xmax,7);
1579 fcb->SetParameters(fitTotal->GetParameter(4),
1580 fitTotal->GetParameter(5),
1581 fitTotal->GetParameter(6),
1582 fitTotal->GetParameter(7),
1583 fitTotal->GetParameter(8),
1584 fitTotal->GetParameter(9),
1585 fitTotal->GetParameter(10));
1588 fcb->SetLineColor(1);
1590 TLine* l1 = new TLine(m-n*s,0,m-n*s,fitTotal->GetParameter(4));
1591 TLine* l2 = new TLine(m+n*s,0,m+n*s,fitTotal->GetParameter(4));
1592 l1->SetLineColor(6);
1593 l2->SetLineColor(6);
1594 hfit->GetListOfFunctions()->Add(fcb);
1595 hfit->GetListOfFunctions()->Add(l1);
1596 hfit->GetListOfFunctions()->Add(l2);
1598 Double_t cbParameters[7];
1599 Double_t covarianceMatrix[7][7];
1601 for ( int ix = 0; ix < 7; ++ix )
1603 cbParameters[ix] = fitTotal->GetParameter(ix+4);
1606 for ( int iy = 0; iy < 5; ++iy )
1608 for ( int ix = 0; ix < 5; ++ix )
1610 covarianceMatrix[ix][iy] = (fitResult->GetCovarianceMatrix())(ix+4,iy+4);
1614 double njpsi = fcb->Integral(m-n*s,m+n*s)/h.GetBinWidth(1);
1615 double nerr = fcb->IntegralError(m-n*s,m+n*s,&cbParameters[0],&covarianceMatrix[0][0])/h.GetBinWidth(1);
1617 r->Set("NofJpsi",njpsi,nerr);
1622 //_____________________________________________________________________________
1623 AliAnalysisMuMuResult* AliAnalysisMuMuResult::FitJpsiNA48(const TH1& h)
1625 /// fit using functional form from Ruben Shahoyan's thesis (2001) (eq. 4.8.)
1627 std::cout << "Fit with jpsi NA50 Ruben eq. 4.8" << std::endl;
1629 Int_t nrebin = fMinv->GetXaxis()->GetNbins() / h.GetXaxis()->GetNbins();
1631 AliAnalysisMuMuResult* r = new AliAnalysisMuMuResult(h,"JPSINA",nrebin);
1633 TH1* hfit = r->Minv();
1635 const Double_t xmin(2.0);
1636 const Double_t xmax(5.0);
1638 TF1* fitTotal = new TF1("fitTotal",funcJpsiNA48,xmin,xmax,12);
1640 fitTotal->SetParName( 0, "c1");
1641 fitTotal->FixParameter(0,0.97);
1643 fitTotal->SetParName( 1, "c2");
1644 fitTotal->FixParameter(1,1.05);
1646 fitTotal->SetParName( 2, "d1");
1647 fitTotal->SetParameter(2,0.0);
1648 fitTotal->SetParLimits(2,0,1);
1650 fitTotal->SetParName( 3, "d2");
1651 fitTotal->SetParameter(3,0.0);
1652 fitTotal->SetParLimits(3,0,1);
1654 fitTotal->SetParName( 4, "g1");
1655 fitTotal->SetParameter(4,0.0);
1656 fitTotal->SetParLimits(4,0.0,1);
1658 fitTotal->SetParName( 5, "g2");
1659 fitTotal->SetParameter(5,0.0);
1660 fitTotal->SetParLimits(5,0.0,1);
1662 fitTotal->SetParName( 6, "m0");
1663 fitTotal->SetParameter(6,3.1);
1664 fitTotal->SetParLimits(6,2.8,3.4);
1666 fitTotal->SetParName( 7, "sigma1");
1667 fitTotal->SetParameter(7,0.05);
1668 fitTotal->SetParLimits(7,0.01,0.2);
1670 fitTotal->SetParName( 8, "sigma2");
1671 fitTotal->SetParameter(8,0.05);
1672 fitTotal->SetParLimits(8,0.01,0.2);
1674 fitTotal->SetParName( 9, "b1");
1675 fitTotal->SetParameter(9,1.0);
1676 fitTotal->SetParLimits(9,0,1);
1678 fitTotal->SetParName(10, "b2");
1679 fitTotal->SetParameter(10,1.0);
1680 fitTotal->SetParLimits(10,0,1);
1682 fitTotal->SetParName(11, "norm");
1683 fitTotal->SetParameter(11,h.GetMaximum());
1685 const char* fitOption = "SIER"; //+";
1687 TFitResultPtr fitResult = hfit->Fit(fitTotal,fitOption,"");
1689 r->Set("MeanJpsi",fitTotal->GetParameter(6),fitTotal->GetParError(6));
1691 fitTotal->GetParameter(7)+fitTotal->GetParameter(8),
1694 double m = r->GetValue("MeanJpsi");
1695 double s = r->GetValue("SigmaJpsi");
1698 TLine* l1 = new TLine(m-n*s,0,m-n*s,fitTotal->GetParameter(11));
1699 TLine* l2 = new TLine(m+n*s,0,m+n*s,fitTotal->GetParameter(11));
1700 l1->SetLineColor(6);
1701 l2->SetLineColor(6);
1702 hfit->GetListOfFunctions()->Add(l1);
1703 hfit->GetListOfFunctions()->Add(l2);
1705 double njpsi = fitTotal->Integral(m-n*s,m+n*s)/h.GetBinWidth(1);
1706 double nerr = fitTotal->IntegralError(m-n*s,m+n*s)/h.GetBinWidth(1);
1708 r->Set("NofJpsi",njpsi,nerr);
1714 //_____________________________________________________________________________
1715 void AliAnalysisMuMuResult::FitUpsilon(TH1& h)
1717 std::cout << "Fit with upsilon alone" << std::endl;
1719 const Double_t xmin(6.0);
1720 const Double_t xmax(12.0);
1722 fitTotal = new TF1("fitTotal",funcCB2,xmin,xmax,7);
1723 fitTotal->SetParNames("N","alpha","n","mean","sigma","alphaprime","nprime");
1724 fitTotal->SetParameters(h.GetMaximum(),1,5,9.46,0.2,1.5,3);
1725 fitTotal->SetParLimits(0,0,h.GetMaximum()*2); // N
1726 fitTotal->SetParLimits(1,0,10); // alpha
1727 fitTotal->SetParLimits(2,1,10); // n
1728 fitTotal->SetParLimits(3,8,12); // mean
1729 fitTotal->SetParLimits(4,0.01,1); // sigma
1730 fitTotal->SetParLimits(5,0,10); // alpha
1731 fitTotal->SetParLimits(6,1,10); // n
1733 h.Fit(fitTotal,"+","",6,12);
1736 Set("MeanUpsilon",fitTotal->GetParameter(3),fitTotal->GetParError(3));
1737 Set("SigmaUpsilon",fitTotal->GetParameter(4),fitTotal->GetParError(4));
1739 double m = GetValue("MeanUpsilon");
1740 double s = GetValue("SigmaUpsilon");
1743 Set("NofUpsilon",fitTotal->Integral(m-n*s,m+n*s)/h.GetBinWidth(1),fitTotal->IntegralError(m-n*s,m+n*s)/h.GetBinWidth(1));
1747 //_____________________________________________________________________________
1748 Double_t AliAnalysisMuMuResult::ErrorAB(Double_t a, Double_t aerr, Double_t b, Double_t berr)
1750 /// Compute the quadratic sum of 2 errors
1754 if ( TMath::Abs(a) > 1E-12 )
1756 e += (aerr*aerr)/(a*a);
1759 if ( TMath::Abs(b) > 1E-12 )
1761 e += (berr*berr)/(b*b);
1764 return TMath::Sqrt(e);
1767 //_____________________________________________________________________________
1768 Double_t AliAnalysisMuMuResult::ErrorABC(Double_t a, Double_t aerr, Double_t b, Double_t berr, Double_t c, Double_t cerror)
1770 /// Compute the quadratic sum of 3 errors
1774 if ( TMath::Abs(a) > 1E-12 )
1776 e += (aerr*aerr)/(a*a);
1779 if ( TMath::Abs(b) > 1E-12 )
1781 e += (berr*berr)/(b*b);
1784 if ( TMath::Abs(b) > 1E-12 )
1786 e += (cerror*cerror)/(c*c);
1789 return TMath::Sqrt(e);
1793 //_____________________________________________________________________________
1794 Bool_t AliAnalysisMuMuResult::AddFit(const char* fitType, Int_t npar, Double_t* par)
1796 // Add a fit to this result
1798 TString msg(Form("fitType=%s npar=%d par[]=",fitType,npar));
1800 for ( Int_t i = 0; i < npar; ++i )
1802 msg += TString::Format("%e,",par[i]);
1805 msg += TString::Format(" minv=%p %d",fMinv,fMinv?TMath::Nint(fMinv->GetEntries()):0);
1807 if ( !fMinv ) return kFALSE;
1809 TString sFitType(fitType);
1813 if (sFitType.CountChar(':'))
1815 Int_t index = sFitType.Index(":");
1816 nrebin = TString(sFitType(index+1,sFitType.Length()-index-1)).Atoi();
1817 sFitType = sFitType(0,index);
1820 msg += TString::Format(" nrebin=%d",nrebin);
1822 AliDebug(1,msg.Data());
1825 if ( fMinv->GetEntries()<100 && !sFitType.Contains("COUNT")) return kFALSE;
1827 TH1* hminv = static_cast<TH1*>(fMinv->Clone());
1829 hminv->Rebin(nrebin);
1830 hminv->SetDirectory(0);
1832 AliAnalysisMuMuResult* r(0x0);
1834 if ( sFitType=="PSI1")
1836 r = FitJpsi(*hminv);
1838 else if ( sFitType == "PSILOW")
1840 r = FitJpsi2CB2VWG(*hminv,-1,-1,-1,-1); // free tails
1842 else if ( sFitType == "PSILOWMCTAILS" )
1846 AliError("Cannot use PSILOWMCTAILS without being given the MC tails !");
1850 r = FitJpsi2CB2VWG(*hminv,par[0],par[1],par[2],par[3]);
1853 r->SetAlias("MCTAILS");
1856 else if ( sFitType.BeginsWith("PSILOWALPHA") )
1858 Float_t lpar[] = { 0.0, 0.0, 0.0, 0.0 };
1860 AliDebug(1,Form("sFitType=%s",sFitType.Data()));
1862 sscanf(sFitType.Data(),"PSILOWALPHALOW%fNLOW%fALPHAUP%fNUP%f",
1863 &lpar[0],&lpar[1],&lpar[2],&lpar[3]);
1865 AliDebug(1,Form("PSILOW ALPHALOW=%f NLOW=%f ALPHAUP=%f NUP=%f",lpar[0],lpar[1],lpar[2],lpar[3]));
1867 if ( lpar[0] == 0.0 && lpar[1] == 0.0 && lpar[0] == 0.0 && lpar[1] == 0.0 )
1869 AliError("Cannot work with zero tails !");
1873 r = FitJpsi2CB2VWG(*hminv,lpar[0],lpar[1],lpar[2],lpar[3]);
1876 else if ( sFitType == "COUNTJPSI" )
1878 r = new AliAnalysisMuMuResult(*hminv,"COUNTJPSI",1);
1879 Double_t n = CountParticle(*hminv,"Jpsi");
1880 r->Set("NofJpsi",n,TMath::Sqrt(n));
1888 r->SetNofTriggers(NofTriggers());
1889 r->SetNofRuns(NofRuns());
1893 fSubResults = new TObjArray;
1894 fSubResults->SetOwner(kTRUE);
1897 fSubResults->Add(r);
1905 //_____________________________________________________________________________
1906 Double_t AliAnalysisMuMuResult::GetErrorStat(const char* name, const char* subResultName) const
1908 // compute the mean value from all subresults
1910 if ( strlen(subResultName) > 0 )
1914 AliError(Form("No subresult from which I could get the %s one...",subResultName));
1915 return TMath::Limits<Double_t>::Max();
1917 AliAnalysisMuMuResult* sub = static_cast<AliAnalysisMuMuResult*>(fSubResults->FindObject(subResultName));
1920 AliError(Form("Could not get subresult named %s",subResultName));
1921 return TMath::Limits<Double_t>::Max();
1923 return sub->GetErrorStat(name);
1928 TObjArray* p = static_cast<TObjArray*>(fMap->GetValue(name));
1931 TParameter<double>* val = static_cast<TParameter<double>*>(p->At(kErrorStat));
1932 return val->GetVal();
1936 TIter next(fSubResults);
1937 AliAnalysisMuMuResult* r;
1941 while ( ( r = static_cast<AliAnalysisMuMuResult*>(next()) ) )
1943 if ( r->HasValue(name) )
1945 mean += r->GetErrorStat(name);
1949 return ( n ? mean/n : 0.0 );
1952 //_____________________________________________________________________________
1953 Double_t AliAnalysisMuMuResult::GetValue(const char* name, const char* subResultName) const
1955 // get a value (either directly or by computing the mean of the subresults)
1957 if ( strlen(subResultName) > 0 )
1961 AliError(Form("No subresult from which I could get the %s one...",subResultName));
1962 return TMath::Limits<Double_t>::Max();
1964 AliAnalysisMuMuResult* sub = static_cast<AliAnalysisMuMuResult*>(fSubResults->FindObject(subResultName));
1967 AliError(Form("Could not get subresult named %s",subResultName));
1968 return TMath::Limits<Double_t>::Max();
1970 return sub->GetValue(name);
1975 TObjArray* p = static_cast<TObjArray*>(fMap->GetValue(name));
1978 TParameter<double>* val = static_cast<TParameter<double>*>(p->At(kValue));
1979 return val->GetVal();
1983 // compute the mean value from all subresults
1984 TIter next(fSubResults);
1985 AliAnalysisMuMuResult* r;
1989 while ( ( r = static_cast<AliAnalysisMuMuResult*>(next()) ) )
1991 if ( r->HasValue(name) )
1993 mean += r->GetValue(name);
1997 return ( n ? mean/n : 0.0 );
2000 //_____________________________________________________________________________
2001 Bool_t AliAnalysisMuMuResult::HasValue(const char* name, const char* subResultName) const
2003 /// Whether this result (or subresult if subResultName is provided) has a property
2006 if ( strlen(subResultName) > 0 )
2010 AliError(Form("No subresult from which I could get the %s one...",subResultName));
2013 AliAnalysisMuMuResult* sub = static_cast<AliAnalysisMuMuResult*>(fSubResults->FindObject(subResultName));
2016 AliError(Form("Could not get subresult named %s",subResultName));
2019 return sub->HasValue(name);
2022 if ( fMap && ( fMap->GetValue(name) != 0x0 ) )
2027 TIter next(fSubResults);
2028 AliAnalysisMuMuResult* r;
2030 while ( ( r = static_cast<AliAnalysisMuMuResult*>(next()) ) )
2032 if ( r->HasValue(name) ) return kTRUE;
2038 //_____________________________________________________________________________
2039 THashList* AliAnalysisMuMuResult::Keys() const
2041 /// Return the complete list of keys we're using
2044 fKeys = new THashList;
2045 fKeys->SetOwner(kTRUE);
2049 while ( ( key = static_cast<TObjString*>(next()) ) )
2051 if ( !fKeys->FindObject(key->String()) )
2053 fKeys->Add(new TObjString(key->String()));
2057 AliAnalysisMuMuResult* r;
2058 TIter nextResult(fSubResults);
2060 while ( ( r = static_cast<AliAnalysisMuMuResult*>(nextResult())) )
2062 TIter nextHL(r->Keys());
2065 while ( ( s = static_cast<TObjString*>(nextHL())) )
2067 if ( !fKeys->FindObject(s->String()) )
2069 fKeys->Add(new TObjString(s->String()));
2078 //_____________________________________________________________________________
2079 Long64_t AliAnalysisMuMuResult::Merge(TCollection* list)
2083 /// Merge a list of AliAnalysisMuMuResult objects with this
2084 /// Returns the number of merged objects (including this).
2086 /// Note that the merging is to be understood here as an average operation
2088 AliInfo(Form("this=%p",this));
2089 if (!list) return 0;
2091 if (list->IsEmpty()) return 1;
2096 hminvList.SetOwner(kTRUE);
2098 Double_t thisWeight = Weight();
2099 Double_t sumOfWeights = thisWeight;
2101 Double_t nofTriggers = fNofTriggers*thisWeight;
2102 Double_t nofRuns = fNofRuns*thisWeight;
2104 fNofRuns *= thisWeight;
2106 while ( ( currObj = next() ) )
2108 AliAnalysisMuMuResult* result = dynamic_cast<AliAnalysisMuMuResult*>(currObj);
2111 AliFatal(Form("object named \"%s\" is a %s instead of an AliAnalysisMuMuResult!", currObj->GetName(), currObj->ClassName()));
2115 Double_t w = result->Weight();
2117 nofRuns += result->NofRuns()*w;
2118 nofTriggers += result->NofTriggers()*w;
2119 fWeight += result->fWeight;
2123 thisWeight/= sumOfWeights;
2124 fNofRuns = nofRuns/sumOfWeights;
2125 fNofTriggers = nofTriggers/sumOfWeights;
2126 fWeight /= sumOfWeights;
2128 AliInfo(Form("thisWeight=%e sumOfWeight=%8.2f noftriggers=%e weight=%e",thisWeight,sumOfWeights,1.0*fNofTriggers,fWeight));
2130 TIter nextKey(fMap);
2133 while ( ( key = static_cast<TObjString*>(nextKey())) )
2135 AliInfo(key->String().Data());
2137 Double_t value = GetValue(key->String())*thisWeight;
2138 Double_t estat = GetErrorStat(key->String())*GetErrorStat(key->String())*thisWeight*thisWeight;
2140 Double_t test(thisWeight);
2144 while ( ( currObj = next() ) )
2146 AliAnalysisMuMuResult* result = dynamic_cast<AliAnalysisMuMuResult*>(currObj);
2153 if (!result->HasValue(key->String()))
2155 AliError(Form("Did not find key %s in of the result to merge",key->String().Data()));
2159 // can only merge under the condition we have the same bin
2161 if ( fBin != result->Bin() )
2163 AliError("Cannot merge results of different bin");
2167 Double_t w = result->Weight()/sumOfWeights;
2173 value += result->GetValue(key->String())*w;
2174 estat += result->GetErrorStat(key->String())*result->GetErrorStat(key->String())*w2;
2180 TMath::Sqrt(estat));
2182 AliInfo(Form("test=%e",test));
2187 fMinv->Scale(thisWeight);
2192 while ( ( currObj = next() ) )
2194 AliAnalysisMuMuResult* result = dynamic_cast<AliAnalysisMuMuResult*>(currObj);
2196 if ( result->Minv() )
2198 TH1* h = static_cast<TH1*>(result->Minv()->Clone());
2199 AliInfo(Form("Nbins %d xmin %e xmax %e",h->GetXaxis()->GetNbins(),h->GetXaxis()->GetXmin(),
2200 h->GetXaxis()->GetXmax()));
2201 h->Scale(result->Weight());
2208 fMinv->Merge(&hminvList);
2209 fMinv->Scale(1.0/sumOfWeights);
2212 TIter nextSubresult(fSubResults);
2213 AliAnalysisMuMuResult* r;
2215 while ( ( r = static_cast<AliAnalysisMuMuResult*>(nextSubresult())) )
2221 while ( ( currObj = next() ) )
2223 sublist.Add(currObj);
2229 return list->GetEntries()+1;
2232 //_____________________________________________________________________________
2233 Int_t AliAnalysisMuMuResult::NofRuns() const
2235 /// Get the number of runs
2236 if ( !Mother() ) return fNofRuns;
2237 else return Mother()->NofRuns();
2240 //_____________________________________________________________________________
2241 Int_t AliAnalysisMuMuResult::NofTriggers() const
2243 /// Get the number of triggers
2245 if ( !Mother() ) return fNofTriggers;
2246 else return Mother()->NofTriggers();
2249 //_____________________________________________________________________________
2250 void AliAnalysisMuMuResult::Print(Option_t* opt) const
2257 for ( Int_t i = 0; i < 9; ++i )
2259 sopt.ReplaceAll(Form("%d",i),"");
2263 pot.ReplaceAll("ALL","");
2264 pot.ReplaceAll("FULL","");
2266 std::cout << pot.Data();
2268 if ( fAlias.Length() > 0 )
2270 std::cout << Form("%s - ",fAlias.Data());
2273 std::cout << Form("%50s - NRUNS %d - NTRIGGER %10d - %s%s",
2277 fWeight > 0.0 ? Form(" WEIGHT %e -",fWeight) : "",
2278 fBin.AsString().Data());
2280 if ( fSubResults && fSubResults->GetEntries()>1 )
2282 std::cout << " (" << fSubResults->GetEntries()-1 << " subresults)";
2287 std::cout << Form(" - REBIN %d",fRebin) << std::endl;
2290 std::cout << std::endl;
2292 if ( sopt.Contains("DUMP") )
2296 while ( ( str = static_cast<TObjString*>(next()) ) )
2298 TObjArray* a = static_cast<TObjArray*>(fMap->GetValue(str->String()));
2300 std::cout << Form("%s %e %e",
2301 str->String().Data(),
2302 static_cast<TParameter<Double_t>*> (a->At(kValue))->GetVal(),
2303 static_cast<TParameter<Double_t>*> (a->At(kErrorStat))->GetVal()) << std::endl;
2309 PrintParticle("Jpsi",pot.Data());
2310 PrintParticle("PsiPrime",pot.Data());
2311 PrintParticle("Upsilon",pot.Data());
2314 if ( HasValue("MBR"))
2316 std::cout << Form("\t\tMBR %e +- %e",GetValue("MBR"),GetErrorStat("MBR")) << std::endl;
2319 if ( fSubResults /* && fSubResults->GetEntries() > 1 */ && ( sopt.Contains("ALL") || sopt.Contains("FULL") ) )
2321 std::cout << pot.Data() << "\t===== sub results ===== " << std::endl;
2325 TIter next(fSubResults);
2326 AliAnalysisMuMuResult* r;
2328 while ( ( r = static_cast<AliAnalysisMuMuResult*>(next()) ) )
2330 r->Print(sopt.Data());
2335 //_____________________________________________________________________________
2336 void AliAnalysisMuMuResult::PrintParticle(const char* particle, const char* opt) const
2338 /// Print all information about one particule type
2340 Double_t npart = GetValue(Form("Nof%s",particle));
2341 if (npart<=0) return;
2344 std::cout << opt << Form("\t%s",particle) << std::endl;
2346 // Double_t npartError = GetErrorStat(Form("Nof%s",particle));
2347 // std::cout << opt << Form("\t\t%20s %9.2f +- %5.2f","Count",npart,npartError) << std::endl;
2352 while ( ( key = static_cast<TObjString*>(next()) ) )
2354 if ( !key->String().Contains(particle) ) continue;
2356 PrintValue(key->String(),opt,GetValue(key->String()),GetErrorStat(key->String()));
2360 //_____________________________________________________________________________
2361 void AliAnalysisMuMuResult::PrintValue(const char* key, const char* opt, Double_t value, Double_t errorStat)
2363 // print one value and its associated error
2365 if ( TString(key).Contains("AccEff") )
2367 std::cout << opt << Form("\t\t%20s %9.2f +- %5.2f %%",key,value*100,errorStat*100) << std::endl;
2369 else if ( TString(key).BeginsWith("Sigma") || TString(key).BeginsWith("Mean") )
2371 std::cout << opt << Form("\t\t%20s %9.2f +- %5.2f MeV/c^2",key,value*1E3,1E3*errorStat) << std::endl;
2373 else if ( TString(key).Contains("Nof") )
2375 std::cout << opt << Form("\t\t%20s %9.2f +- %5.2f",key,value,errorStat) << std::endl;
2377 else if ( value > 1E-3 && value < 1E3 )
2379 std::cout << opt << Form("\t\t%20s %9.2f +- %5.2f",key,value,errorStat) << std::endl;
2383 std::cout << opt << Form("\t\t%20s %9.2e +- %9.2e",key,value,errorStat) << std::endl;
2387 //_____________________________________________________________________________
2388 void AliAnalysisMuMuResult::Set(const char* name, Double_t value, Double_t errorStat)
2390 /// Set a (value,error) pair with a given name
2395 fMap->SetOwnerKeyValue(kTRUE,kTRUE);
2398 TObjArray* p = static_cast<TObjArray*>(fMap->GetValue(name));
2401 p = new TObjArray(4);
2405 p->AddAt(new TParameter<Double_t>(name,value),kValue);
2406 p->AddAt(new TParameter<Double_t>(name,errorStat),kErrorStat);
2408 fMap->Add(new TObjString(name),p);
2412 static_cast<TParameter<double>*>(p->At(kValue))->SetVal(value);
2413 static_cast<TParameter<double>*>(p->At(kErrorStat))->SetVal(errorStat);
2416 if ( TString(name)=="NofJpsi" )
2418 if ( NofTriggers() > 0 )
2420 Double_t rate = value/NofTriggers();
2421 Double_t rateError = rate*ErrorAB(value,errorStat,NofTriggers(),TMath::Sqrt(NofTriggers()));
2422 Set("RateJpsi",rate,rateError);
2427 //_____________________________________________________________________________
2428 void AliAnalysisMuMuResult::SetBin(const AliAnalysisMuMuBinning::Range& bin)
2432 if (!Mother()) fBin = bin;
2433 else Mother()->SetBin(bin);
2436 //_____________________________________________________________________________
2437 void AliAnalysisMuMuResult::SetNofInputParticles(const TH1& hminv)
2439 /// Set the number of input particle from the invariant mass spectra
2441 static const char* particleNames[] = { "Jpsi" , "PsiPrime", "Upsilon","UpsilonPrime" };
2443 for ( Int_t i = 0; i < 4; ++i )
2445 Double_t n = CountParticle(hminv,particleNames[i]);
2447 AliDebug(1,Form("i=%d particle %s n %e",i,particleNames[i],n));
2451 SetNofInputParticles(particleNames[i],n);
2456 //_____________________________________________________________________________
2457 void AliAnalysisMuMuResult::SetNofInputParticles(const char* particle, int n)
2459 /// Set the number of input particles (so it is a MC result)
2460 /// and (re)compute the AccxEff values
2462 Set(Form("NofInput%s",particle),n,TMath::Sqrt(n));
2466 Set(Form("AccEff%s",particle),0,0);
2470 Double_t npart = GetValue(Form("Nof%s",particle));
2471 Double_t npartErr = GetErrorStat(Form("Nof%s",particle));
2472 Double_t ninput = GetValue(Form("NofInput%s",particle));
2473 Double_t ninputErr = GetErrorStat(Form("NofInput%s",particle));
2475 Set(Form("AccEff%s",particle),
2477 (npart/ninput)*ErrorAB(npart,npartErr,ninput,ninputErr));
2479 TIter next(fSubResults);
2480 AliAnalysisMuMuResult* r;
2482 while ( ( r = static_cast<AliAnalysisMuMuResult*>(next())) )
2484 r->Set(Form("NofInput%s",particle),n,TMath::Sqrt(n));
2486 npart = r->GetValue(Form("Nof%s",particle));
2487 npartErr = r->GetErrorStat(Form("Nof%s",particle));
2489 r->Set(Form("AccEff%s",particle),
2491 (npart/ninput)*ErrorAB(npart,npartErr,ninput,ninputErr));
2496 //_____________________________________________________________________________
2497 void AliAnalysisMuMuResult::SetNofRuns(Int_t n)
2499 if ( !Mother() ) fNofRuns=n;
2500 else Mother()->SetNofRuns(n);
2503 //_____________________________________________________________________________
2504 void AliAnalysisMuMuResult::SetNofTriggers(Int_t n)
2506 if ( !Mother() ) fNofTriggers=n;
2507 else Mother()->SetNofTriggers(n);
2510 //_____________________________________________________________________________
2511 void AliAnalysisMuMuResult::SetMinv(const TH1& hminv)
2513 /// Set the inv. mass spectrum to be fitted.
2517 fMinv = static_cast<TH1*>(hminv.Clone(Form("Minv%u",n++)));
2518 fMinv->SetDirectory(0);
2521 //_____________________________________________________________________________
2522 AliAnalysisMuMuResult*
2523 AliAnalysisMuMuResult::SubResult(const char* subResultName) const
2525 /// get a given subresult
2530 TIter next(fSubResults);
2531 AliAnalysisMuMuResult* r;
2532 while ( ( r = static_cast<AliAnalysisMuMuResult*>(next())) )
2534 if ( r->Alias() == subResultName )