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 static std::map<std::string,Double_t> massMap;
42 // not super elegant, but that way we do not depend on TDatabasePDG and thus
43 // can decide on our particle naming
46 massMap["Jpsi"] = 3.096916e+00;
47 massMap["PsiPrime"] = 3.68609e+00;
48 massMap["Upsilon"] = 9.46030e+00;
49 massMap["UpsilonPrime"] = 1.00233e+01;
55 Double_t ErrorAB(Double_t a, Double_t aerr, Double_t b, Double_t berr)
59 if ( TMath::Abs(a) > 1E-12 )
61 e += (aerr*aerr)/(a*a);
64 if ( TMath::Abs(b) > 1E-12 )
66 e += (berr*berr)/(b*b);
69 return TMath::Sqrt(e);
72 Double_t funcCB(Double_t* xx, Double_t* par)
75 Double_t alpha = par[1];
77 Double_t mean = par[3];
78 Double_t sigma = par[4];
82 Double_t A = TMath::Power(n/TMath::Abs(alpha),n)*TMath::Exp(-0.5*alpha*alpha);
83 Double_t B = n/TMath::Abs(alpha) - TMath::Abs(alpha);
85 Double_t y = ( TMath::Abs(sigma) > 1E-12 ? (x-mean)/sigma : 0 );
89 return N*TMath::Exp(-0.5*y*y);
93 return N*A*TMath::Power(B-y,-n);
97 Double_t funcJpsiGCBE(Double_t* xx, Double_t* par)
101 Double_t g = par[0]*TMath::Gaus(x,par[1],par[2]);
103 Double_t jpsi = funcCB(xx,par+3);
105 Double_t expo = par[8]*TMath::Exp(par[9]*x);
110 Double_t funcJpsiPsiPrimeCustom(Double_t* xx, Double_t* par)
113 Double_t alpha = par[1];
115 Double_t mean = par[3];
116 Double_t sigma = par[4];
117 Double_t alphaprime = par[5];
118 Double_t nprime = par[6];
122 Double_t A = TMath::Power(n/TMath::Abs(alpha),n)*TMath::Exp(-0.5*alpha*alpha);
123 Double_t B = n/TMath::Abs(alpha) - TMath::Abs(alpha);
124 Double_t C = TMath::Power(nprime/TMath::Abs(alphaprime),nprime)*TMath::Exp(-0.5*alphaprime*alphaprime);
125 Double_t D = nprime/TMath::Abs(alphaprime) - TMath::Abs(alphaprime);
127 Double_t y = ( TMath::Abs(sigma) > 1E-12 ? (x-mean)/sigma : 0 );
131 if ( y > alphaprime )
133 cb = N*C*TMath::Power(D+y,-nprime);
135 else if ( y > alpha*-1.0 )
137 cb = N*TMath::Exp(-0.5*y*y);
141 cb = N*A*TMath::Power(B-y,-n);
146 return cb + par[7] + par[8]*x; // gaus + pol1
150 Double_t yprime = (x-par[10])/par[11];
151 return cb + par[9]*TMath::Exp(-0.5*yprime*yprime)+par[12]*TMath::Exp(-par[13]*x);
152 // gaus (j/psi) + gaus (psi') + expo
157 Double_t funcCB2(Double_t* xx, Double_t* par)
160 Double_t alpha = par[1];
162 Double_t mean = par[3];
163 Double_t sigma = par[4];
164 Double_t alphaprime = par[5];
165 Double_t nprime = par[6];
169 Double_t A = TMath::Power(n/TMath::Abs(alpha),n)*TMath::Exp(-0.5*alpha*alpha);
170 Double_t B = n/TMath::Abs(alpha) - TMath::Abs(alpha);
171 Double_t C = TMath::Power(nprime/TMath::Abs(alphaprime),nprime)*TMath::Exp(-0.5*alphaprime*alphaprime);
172 Double_t D = nprime/TMath::Abs(alphaprime) - TMath::Abs(alphaprime);
174 Double_t y = ( TMath::Abs(sigma) > 1E-12 ? (x-mean)/sigma : 0 );
176 if ( y > alphaprime )
178 return N*C*TMath::Power(D+y,-nprime);
180 else if ( y > alpha*-1.0 )
182 return N*TMath::Exp(-0.5*y*y);
186 return N*A*TMath::Power(B-y,-n);
190 Double_t funcJpsiPsiPrime(Double_t* xx, Double_t* par)
192 Double_t jpsi = funcCB(xx,par);
193 Double_t psiprime = funcCB2(xx,par+5);
198 Double_t e1 = par[n]*TMath::Exp(par[n+1]*x);
199 Double_t e2 = par[n+2]*TMath::Exp(par[n+3]*x);
203 if ( x > par[3] ) e=e2;
205 return jpsi+psiprime+e;
208 Double_t funcJpsiCBE(Double_t* xx, Double_t* par)
212 Double_t jpsi = funcCB(xx,par);
216 Double_t e1 = par[5]*TMath::Exp(par[6]*x);
222 Double_t funcJpsiPCBE(Double_t* xx, Double_t* par)
226 Double_t pol2 = par[0] + par[1]*x + par[2]*x*x;
228 Double_t jpsi = funcCB(xx,par+3);
230 Double_t expo = par[8]*TMath::Exp(par[9]*x);
232 return pol2+jpsi+expo;
235 Double_t funcJpsiECBE(Double_t* xx, Double_t* par)
239 Double_t jpsi = funcCB(xx,par+2);
243 Double_t e1 = par[0]*TMath::Exp(par[1]*x);
245 Double_t e2 = par[7]*TMath::Exp(par[8]*x);
250 const char* NormalizeName(const char* name, const char* suffix)
252 TString str(Form("%s_%s",name,suffix));
254 str.ReplaceAll("-","_");
255 str.ReplaceAll("/","%");
260 //------------------------------------------------------------------------------
261 Double_t BackgroundVWG(Double_t *x, Double_t *par)
263 // gaussian variable width
264 Double_t sigma = par[2]+par[3]*((x[0]-par[1])/par[1]);
265 return par[0]*TMath::Exp(-(x[0]-par[1])*(x[0]-par[1])/(2.*sigma*sigma));
269 //------------------------------------------------------------------------------
270 Double_t CrystalBallExtended(Double_t *x,Double_t *par)
272 //par[0] = Normalization
280 Double_t t = (x[0]-par[1])/par[2];
281 if (par[3] < 0) t = -t;
283 Double_t absAlpha = fabs((Double_t)par[3]);
284 Double_t absAlpha2 = fabs((Double_t)par[5]);
286 if (t >= -absAlpha && t < absAlpha2) // gaussian core
288 return par[0]*(exp(-0.5*t*t));
291 if (t < -absAlpha) //left tail
293 Double_t a = TMath::Power(par[4]/absAlpha,par[4])*exp(-0.5*absAlpha*absAlpha);
294 Double_t b = par[4]/absAlpha - absAlpha;
295 return par[0]*(a/TMath::Power(b - t, par[4]));
298 if (t >= absAlpha2) //right tail
301 Double_t c = TMath::Power(par[6]/absAlpha2,par[6])*exp(-0.5*absAlpha2*absAlpha2);
302 Double_t d = par[6]/absAlpha2 - absAlpha2;
303 return par[0]*(c/TMath::Power(d + t, par[6]));
309 //------------------------------------------------------------------------------
310 Double_t Gaus(Double_t *x, Double_t *par)
313 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]));
317 //------------------------------------------------------------------------------
318 Double_t Exp(Double_t *x, Double_t *par)
321 return par[0]*TMath::Exp(par[1]*x[0]);
325 //------------------------------------------------------------------------------
326 Double_t Pow(Double_t *x, Double_t *par)
329 return par[0]*TMath::Power(x[0],par[1]);
333 //------------------------------------------------------------------------------
334 Double_t fitFunctionVWG(Double_t *x, Double_t *par)
336 if (x[0] > 2.9 && x[0] < 3.3) TF1::RejectPoint();
337 return BackgroundVWG(x, par);
340 //------------------------------------------------------------------------------
341 Double_t fitFunctionCB2VWG(Double_t *x, Double_t *par)
343 return BackgroundVWG(x, par) + CrystalBallExtended(x, &par[4]);
346 //------------------------------------------------------------------------------
347 Double_t func2CB2VWG(Double_t *x, Double_t *par)
351 3.68609+(par[5]-3.096916)/3.096916*3.68609,
352 par[6]/3.096916*3.68609,
358 return BackgroundVWG(x, par) + CrystalBallExtended(x, &par[4]) + CrystalBallExtended(x, par2);
361 //_____________________________________________________________________________
362 //_____________________________________________________________________________
363 //_____________________________________________________________________________
364 //_____________________________________________________________________________
365 //_____________________________________________________________________________
367 //_____________________________________________________________________________
368 AliAnalysisMuMuResult::AliAnalysisMuMuResult(TRootIOCtor* /*io*/) :
382 //_____________________________________________________________________________
383 AliAnalysisMuMuResult::AliAnalysisMuMuResult(const TH1& hminv)
400 //_____________________________________________________________________________
401 AliAnalysisMuMuResult::AliAnalysisMuMuResult(const TH1& hminv,
405 TNamed(Form("%s-%d",fitType,nrebin),""),
420 //_____________________________________________________________________________
421 AliAnalysisMuMuResult::AliAnalysisMuMuResult(const TH1& hminv,
422 const char* triggerName,
423 const char* eventSelection,
424 const char* pairSelection,
425 const char* centSelection,
426 const AliAnalysisMuMuBinning::Range& bin)
428 TNamed(Form("%s-%s-%s-%s",triggerName,eventSelection,pairSelection,centSelection),""),
443 //_____________________________________________________________________________
444 AliAnalysisMuMuResult::AliAnalysisMuMuResult(const AliAnalysisMuMuResult& rhs)
447 fNofRuns(rhs.NofRuns()),
448 fNofTriggers(rhs.NofTriggers()),
458 /// Note that the mother is lost
459 /// fKeys remains 0x0 so it will be recomputed if need be
463 fMinv = static_cast<TH1*>(rhs.fMinv->Clone());
468 fSubResults = static_cast<TObjArray*>(rhs.fSubResults->Clone());
473 fMap = static_cast<TMap*>(rhs.fMap->Clone());
478 //_____________________________________________________________________________
479 AliAnalysisMuMuResult& AliAnalysisMuMuResult::operator=(const AliAnalysisMuMuResult& rhs)
494 fMinv = static_cast<TH1*>(rhs.fMinv->Clone());
499 fSubResults = static_cast<TObjArray*>(rhs.fSubResults->Clone());
504 fMap = static_cast<TMap*>(rhs.fMap->Clone());
507 static_cast<TNamed&>(*this)=rhs;
509 fNofRuns = rhs.NofRuns();
510 fNofTriggers = rhs.NofTriggers();
512 fWeight = rhs.fWeight;
518 //_____________________________________________________________________________
519 AliAnalysisMuMuResult::~AliAnalysisMuMuResult()
527 //_____________________________________________________________________________
528 const AliAnalysisMuMuBinning::Range& AliAnalysisMuMuResult::Bin() const
530 if ( !Mother() ) return fBin;
531 else return Mother()->Bin();
534 //_____________________________________________________________________________
535 TObject* AliAnalysisMuMuResult::Clone(const char* /*newname*/) const
537 return new AliAnalysisMuMuResult(*this);
540 //_____________________________________________________________________________
541 Bool_t AliAnalysisMuMuResult::Correct(const AliAnalysisMuMuResult& other, const char* particle, const char* subResultName)
543 /// Assuming other has an AccxEff entry, correct this value by AccxEff of other
545 if ( HasValue(Form("Nof%s",particle)) )
547 if (!other.HasValue(Form("AccEff%s",particle),subResultName))
549 AliError(Form("Cannot correct as I do not find the AccEff%s value (subResultName=%s)!",particle,subResultName));
553 Double_t acc = other.GetValue(Form("AccEff%s",particle),subResultName);
554 Double_t value = 0.0;
556 if ( acc > 0 ) value = GetValue(Form("Nof%s",particle)) / acc;
558 Double_t error = ErrorAB( GetValue(Form("Nof%s",particle)),
559 GetErrorStat(Form("Nof%s",particle)),
560 other.GetValue(Form("AccEff%s",particle),subResultName),
561 other.GetErrorStat(Form("AccEff%s",particle),subResultName) );
563 Set(Form("CorrNof%s",particle),value,error*value);
571 //_____________________________________________________________________________
572 Double_t AliAnalysisMuMuResult::CountParticle(const TH1& hminv, const char* particle, Double_t sigma)
574 /// Count the number of entries in an invariant mass range
576 const std::map<std::string,Double_t>& m = MassMap();
578 std::map<std::string,Double_t>::const_iterator it = m.find(particle);
582 AliErrorClass(Form("Don't know the mass of particle %s",particle));
586 Double_t mass = it->second;
590 AliDebugClass(1,Form("Oups. Got a sigma of %e for particle %s !",sigma,particle));
591 return hminv.Integral();
594 TAxis* x = hminv.GetXaxis();
596 Int_t b1 = x->FindBin(mass-sigma);
597 Int_t b2 = x->FindBin(mass+sigma);
599 AliDebugClass(1,Form("hminv getentries %e integral %e",hminv.GetEntries(),hminv.Integral(b1,b2)));
601 return hminv.Integral(b1,b2);
605 //_____________________________________________________________________________
606 void AliAnalysisMuMuResult::FitJpsiPsiPrimeCustom(TH1& h)
608 std::cout << "Fit with jpsi + psiprime (custom)" << std::endl;
610 const Double_t xmin(1.5);
611 const Double_t xmax(8.0);
613 fitTotal = new TF1("fitTotal",funcJpsiPsiPrimeCustom,xmin,xmax,14);
614 fitTotal->SetLineColor(4);
616 fitTotal->SetParName(0,"cstecb");
617 fitTotal->SetParName(1,"alpha");
618 fitTotal->SetParName(2,"n");
619 fitTotal->SetParName(3,"meanjpsi");
620 fitTotal->SetParName(4,"sigmajpsi");
621 fitTotal->SetParName(5,"alphaprime");
622 fitTotal->SetParName(6,"nprime");
623 fitTotal->SetParName(7,"cstepol1");
624 fitTotal->SetParName(8,"slopepol1");
625 fitTotal->SetParName(9,"cstegaus");
626 fitTotal->SetParName(10,"meanpsiprime");
627 fitTotal->SetParName(11,"sigmapsiprime");
628 fitTotal->SetParName(12,"csteexpo");
629 fitTotal->SetParName(13,"slopeexpo");
631 fitTotal->SetParameter( 0,1);
633 const char* fitOption = "SQBR+";
634 const Double_t alphaMC = 0.936;
635 const Double_t nMC = 4.44;
636 const Double_t alphaprimeMC = 1.60;
637 const Double_t nprimeMC = 3.23;
639 TF1* fcb = new TF1("cb",funcCB2,2.9,3.3,7);
640 fcb->SetParameters(1,1.0,4.0,3.1,0.1,1.5,3);
642 fcb->SetParLimits(3,3,4);
643 fcb->SetParLimits(4,0,1);
645 fcb->FixParameter(1,alphaMC);
646 fcb->FixParameter(2,nMC);
647 fcb->FixParameter(5,alphaprimeMC);
648 fcb->FixParameter(6,nprimeMC);
650 TFitResultPtr rcb = h.Fit(fcb,fitOption,"",2.9,3.3);
657 fitTotal->SetParameter(0,rcb->Parameter(0));
658 fitTotal->SetParameter(1,rcb->Parameter(1)); fitTotal->SetParLimits(1,0,10); // alpha
659 fitTotal->SetParameter(2,rcb->Parameter(2)); fitTotal->SetParLimits(2,1,10); // n
660 fitTotal->SetParameter(3,rcb->Parameter(3)); fitTotal->SetParLimits(3,3.0,3.5); // mean
661 fitTotal->SetParameter(4,rcb->Parameter(4)); fitTotal->SetParLimits(4,0,1); // sigma
662 fitTotal->SetParameter(5,rcb->Parameter(5)); fitTotal->SetParLimits(1,0,10); // alphaprime
663 fitTotal->SetParameter(6,rcb->Parameter(6)); fitTotal->SetParLimits(2,1,10); // nprime
665 fitTotal->FixParameter(1,alphaMC);
666 fitTotal->FixParameter(2,nMC);
667 fitTotal->FixParameter(5,alphaprimeMC);
668 fitTotal->FixParameter(6,nprimeMC);
670 TF1* fge = new TF1("fge","gaus(0)+expo(3)",3.5,4.4);
671 fge->SetParameters(1,3.6,0.25,1,1);
672 TFitResultPtr rpsiprime = h.Fit(fge,fitOption,"",3.5,4.4);
674 if (static_cast<int>(rpsiprime))
676 AliInfo("Will fix psiprime parameters");
677 fitTotal->FixParameter(9,0);
678 fitTotal->FixParameter(10,3.7);
679 fitTotal->FixParameter(11,0.1);
683 fitTotal->SetParameter(10,rpsiprime->Parameter(1)); fitTotal->SetParLimits(10,3.5,3.8); // mean'
684 fitTotal->SetParameter(11,rpsiprime->Parameter(2)); fitTotal->SetParLimits(11,0.05,0.7); // sigma'
687 TFitResultPtr rpol1 = h.Fit("pol1",fitOption,"",1.5,2.5);
688 fitTotal->SetParameter( 7,rpol1->Parameter(0));
689 fitTotal->SetParameter( 8,rpol1->Parameter(1));
691 TFitResultPtr rexpo = h.Fit("expo",fitOption,"",4.5,7.0);
692 fitTotal->SetParameter(12,rexpo->Parameter(0));
693 fitTotal->SetParameter(13,rexpo->Parameter(1));
696 TFitResultPtr r = h.Fit(fitTotal,fitOption,"",1.5,7);
698 TF1* signal = new TF1("signal","gaus",2,6);
699 signal->SetParameters(fitTotal->GetParameter(0),
700 fitTotal->GetParameter(3),
701 fitTotal->GetParameter(4));
703 TF1* signalPrime = new TF1("signalPrime","gaus",2,6);
704 signalPrime->SetParameters(fitTotal->GetParameter(9),
705 fitTotal->GetParameter(10),
706 fitTotal->GetParameter(11));
708 Double_t gausParameters[3];
709 Double_t covarianceMatrix[3][3];
710 Double_t gausParametersPrime[3];
711 Double_t covarianceMatrixPrime[3][3];
713 covarianceMatrix[0][0] = (r->GetCovarianceMatrix())(0,0);
714 covarianceMatrix[1][0] = (r->GetCovarianceMatrix())(3,0);
715 covarianceMatrix[2][0] = (r->GetCovarianceMatrix())(4,0);
716 covarianceMatrix[0][1] = (r->GetCovarianceMatrix())(0,3);
717 covarianceMatrix[0][2] = (r->GetCovarianceMatrix())(0,4);
719 for ( int iy = 1; iy < 3; ++iy )
721 for ( int ix = 1; ix < 3; ++ix )
723 covarianceMatrix[ix][iy] = (r->GetCovarianceMatrix())(ix+2,iy+2);
727 gausParameters[0] = fitTotal->GetParameter(0);
728 gausParameters[1] = fitTotal->GetParameter(3);
729 gausParameters[2] = fitTotal->GetParameter(4);
731 gausParametersPrime[0] = fitTotal->GetParameter(9);
732 gausParametersPrime[1] = fitTotal->GetParameter(10);
733 gausParametersPrime[2] = fitTotal->GetParameter(11);
735 covarianceMatrixPrime[0][0] = (r->GetCovarianceMatrix())(9,9);
736 covarianceMatrixPrime[1][0] = (r->GetCovarianceMatrix())(10,9);
737 covarianceMatrixPrime[2][0] = (r->GetCovarianceMatrix())(11,9);
738 covarianceMatrixPrime[0][1] = (r->GetCovarianceMatrix())(9,10);
739 covarianceMatrixPrime[0][2] = (r->GetCovarianceMatrix())(9,11);
741 for ( int iy = 1; iy < 3; ++iy )
743 for ( int ix = 1; ix < 3; ++ix )
745 covarianceMatrixPrime[ix][iy] = (r->GetCovarianceMatrix())(ix+2,iy+2);
749 double n = signal->Integral(2,6)/h.GetBinWidth(10);
750 double nerr = signal->IntegralError(2,6,&gausParameters[0],&covarianceMatrix[0][0])/h.GetBinWidth(10);
751 Set("NofJpsi",n,nerr);
752 Set("MeanJpsi",fitTotal->GetParameter(3),fitTotal->GetParError(3));
753 Set("SigmaJpsi",fitTotal->GetParameter(4),fitTotal->GetParError(4));
755 double nprime = signalPrime->Integral(2,6)/h.GetBinWidth(10);
756 double nerrprime = signalPrime->IntegralError(2,6,&gausParametersPrime[0],&covarianceMatrixPrime[0][0])/h.GetBinWidth(10);
757 Set("NofPsiPrime",nprime,nerrprime);
758 Set("MeanPsiPrime",fitTotal->GetParameter(10),fitTotal->GetParError(10));
759 Set("SigmaPsiPrime",fitTotal->GetParameter(11),fitTotal->GetParError(11));
764 //_____________________________________________________________________________
765 AliAnalysisMuMuResult::SubResult AliAnalysisMuMuResult::FitJpsiPsiPrimeCB(TH1& h)
767 std::cout << "Fit with jpsi + psiprime (CB) " << std::endl;
769 const Double_t xmin(1.5);
770 const Double_t xmax(8.0);
772 fitTotal = new TF1("fitTotal",funcJpsiPsiPrime,xmin,xmax,14);
774 // Double_t N = par[0];
775 // Double_t alpha = par[1];
776 // Double_t n = par[2];
777 // Double_t mean = par[3];
778 // Double_t sigma = par[4];
780 fitTotal->SetParameter( 0,1); // N
781 fitTotal->FixParameter( 1,0.936); // alpha
782 fitTotal->FixParameter( 2,4.44); // n
783 fitTotal->SetParameter( 3,3.1); fitTotal->SetParLimits(3,3.0,3.2); // mean
784 fitTotal->SetParameter( 4,0.07); fitTotal->SetParLimits(4,0.02,1); // sigma
786 fitTotal->SetParameter( 5,0.01); // N'
787 fitTotal->FixParameter( 6,0.936); // alpha'
788 fitTotal->FixParameter( 7,4.44); // n'
789 fitTotal->SetParameter( 8,3.7); fitTotal->SetParLimits(8,3.5,3.8); // mean'
790 fitTotal->SetParameter( 9,0.1); fitTotal->SetParLimits(9,0.02,1.0); // sigma'
792 fitTotal->SetParameter(10,h.GetMaximum());
793 fitTotal->SetParameter(11,-1);
795 fitTotal->SetParameter(12,h.GetMaximum()/100);
796 fitTotal->SetParameter(13,-1);
798 TFitResultPtr r = h.Fit(fitTotal,"SQBI","",1.5,6);
800 // for ( int ix = 0; ix < fitTotal->GetNpar(); ++ix )
802 // for ( int iy = 0; iy < fitTotal->GetNpar(); ++iy )
804 // std::cout << Form("COV(%d,%d)=%e ",ix,iy,r->GetCovarianceMatrix()(ix,iy));
806 // std::cout << std::endl;
810 TF1* signal = new TF1("signal","gaus",2,8);
812 signal->SetParameters(fitTotal->GetParameter(0),
813 fitTotal->GetParameter(3),
814 fitTotal->GetParameter(4));
816 TF1* signalPrime = new TF1("signalPrime","gaus",2,8);
818 signalPrime->SetParameters(fitTotal->GetParameter(0),
819 fitTotal->GetParameter(8),
820 fitTotal->GetParameter(9));
822 Double_t gausParameters[3];
823 Double_t gausParametersPrime[3];
824 Double_t covarianceMatrix[3][3];
825 Double_t covarianceMatrixPrime[3][3];
827 gausParameters[0] = fitTotal->GetParameter(0);
828 gausParameters[1] = fitTotal->GetParameter(3);
829 gausParameters[2] = fitTotal->GetParameter(4);
831 covarianceMatrix[0][0] = (r->GetCovarianceMatrix())(0,0);
832 covarianceMatrix[1][0] = (r->GetCovarianceMatrix())(3,0);
833 covarianceMatrix[2][0] = (r->GetCovarianceMatrix())(4,0);
834 covarianceMatrix[0][1] = (r->GetCovarianceMatrix())(0,3);
835 covarianceMatrix[0][2] = (r->GetCovarianceMatrix())(0,4);
837 for ( int iy = 1; iy < 3; ++iy )
839 for ( int ix = 1; ix < 3; ++ix )
841 covarianceMatrix[ix][iy] = (r->GetCovarianceMatrix())(ix+2,iy+2);
845 gausParametersPrime[0] = fitTotal->GetParameter(0);
846 gausParametersPrime[1] = fitTotal->GetParameter(8);
847 gausParametersPrime[2] = fitTotal->GetParameter(9);
849 covarianceMatrixPrime[0][0] = (r->GetCovarianceMatrix())(0,0);
850 covarianceMatrixPrime[1][0] = (r->GetCovarianceMatrix())(8,0);
851 covarianceMatrixPrime[2][0] = (r->GetCovarianceMatrix())(9,0);
852 covarianceMatrixPrime[0][1] = (r->GetCovarianceMatrix())(0,8);
853 covarianceMatrixPrime[0][2] = (r->GetCovarianceMatrix())(0,9);
855 for ( int iy = 1; iy < 3; ++iy )
857 for ( int ix = 1; ix < 3; ++ix )
859 covarianceMatrixPrime[ix][iy] = (r->GetCovarianceMatrix())(ix+2,iy+2);
863 double n = signal->Integral(2,6)/h.GetBinWidth(10);
864 double nerr = signal->IntegralError(2,6,&gausParameters[0],&covarianceMatrix[0][0])/h.GetBinWidth(10);
866 Set("NofJpsi",n,nerr);
867 Set("MeanJpsi",fitTotal->GetParameter(3),fitTotal->GetParError(3));
868 Set("SigmaJpsi",fitTotal->GetParameter(4),fitTotal->GetParError(4));
870 double nprime = signalPrime->Integral(2,6)/h.GetBinWidth(10);
871 double nerrprime = signalPrime->IntegralError(2,6,&gausParametersPrime[0],&covarianceMatrixPrime[0][0])/h.GetBinWidth(10);
873 Set("NofPsiPrime",nprime,nerrprime);
874 Set("MeanPsiPrime",fitTotal->GetParameter(8),fitTotal->GetParError(8));
875 Set("SigmaPsiPrime",fitTotal->GetParameter(9),fitTotal->GetParError(9));
880 //_____________________________________________________________________________
881 AliAnalysisMuMuResult* AliAnalysisMuMuResult::FitJpsiGCBE(TH1& h)
883 std::cout << "Fit with jpsi alone (gaus + CB + expo)" << std::endl;
885 Int_t nrebin = fMinv->GetXaxis()->GetNbins() / h.GetXaxis()->GetNbins();
887 AliAnalysisMuMuResult* r = new AliAnalysisMuMuResult(h,"JPSIGCBE",nrebin);
889 TH1* hfit = r->Minv();
891 const Double_t xmin(1.0);
892 const Double_t xmax(8.0);
894 TF1* fitTotal = new TF1("fitTotal",funcJpsiGCBE,xmin,xmax,10);
895 fitTotal->SetParNames("cste","x0","sigma0","N","alpha","n","mean","sigma","expocste","exposlope");
897 fitTotal->SetParLimits(3,0,h.GetMaximum()*2); // N
899 const Double_t cbalpha(0.98);
900 const Double_t cbn(5.2);
902 fitTotal->FixParameter(4,cbalpha);
903 fitTotal->FixParameter(5,cbn);
905 fitTotal->SetParLimits(6,2.8,3.2); // mean
906 fitTotal->SetParLimits(7,0.02,0.3); // sigma
908 TF1* fg = new TF1("fg","gaus",xmin,xmax);
910 hfit->Fit(fg,"","",0.75,3.0);
912 fitTotal->SetParameter(0,fg->GetParameter(0));
913 fitTotal->SetParameter(1,fg->GetParameter(1));
914 fitTotal->SetParameter(2,fg->GetParameter(2));
916 TF1* fexpo = new TF1("expo","expo",xmin,xmax);
918 hfit->Fit(fexpo,"","",3.5,5);
920 fitTotal->SetParameter(8,fexpo->GetParameter(0));
921 fitTotal->SetParameter(9,fexpo->GetParameter(1));
923 fitTotal->SetParameter(3,h.GetMaximum()),
924 fitTotal->SetParameter(4,cbalpha);
925 fitTotal->SetParameter(5,cbn);
926 fitTotal->SetParameter(6,3.15);
927 fitTotal->SetParameter(7,0.1);
929 const char* fitOption = "SI+";
931 TFitResultPtr fitResult = hfit->Fit(fitTotal,fitOption,"",2,5);
933 r->Set("MeanJpsi",fitTotal->GetParameter(6),fitTotal->GetParError(6));
934 r->Set("SigmaJpsi",fitTotal->GetParameter(7),fitTotal->GetParError(7));
936 double m = r->GetValue("MeanJpsi");
937 double s = r->GetValue("SigmaJpsi");
940 TF1* fcb = new TF1("fcb",funcCB,xmin,xmax,5);
941 fcb->SetParameters(fitTotal->GetParameter(3),
942 fitTotal->GetParameter(4),
943 fitTotal->GetParameter(5),
944 fitTotal->GetParameter(6),
945 fitTotal->GetParameter(7));
947 fcb->SetLineColor(6);
949 TLine* l1 = new TLine(m-n*s,0,m-n*s,fitTotal->GetParameter(3));
950 TLine* l2 = new TLine(m+n*s,0,m+n*s,fitTotal->GetParameter(3));
953 h.GetListOfFunctions()->Add(fcb);
954 h.GetListOfFunctions()->Add(l1);
955 h.GetListOfFunctions()->Add(l2);
958 Double_t cbParameters[5];
959 Double_t covarianceMatrix[5][5];
961 cbParameters[0] = fitTotal->GetParameter(3);
962 cbParameters[1] = fitTotal->GetParameter(4);
963 cbParameters[2] = fitTotal->GetParameter(5);
964 cbParameters[3] = fitTotal->GetParameter(6);
965 cbParameters[4] = fitTotal->GetParameter(7);
967 for ( int iy = 0; iy < 5; ++iy )
969 for ( int ix = 0; ix < 5; ++ix )
971 covarianceMatrix[ix][iy] = (fitResult->GetCovarianceMatrix())(ix+3,iy+3);
975 double njpsi = fcb->Integral(m-n*s,m+n*s)/h.GetBinWidth(1);
977 double nerr = fcb->IntegralError(m-n*s,m+n*s,&cbParameters[0],&covarianceMatrix[0][0])/h.GetBinWidth(1);
979 r->Set("NofJpsi",njpsi,nerr);
985 //_____________________________________________________________________________
986 void AliAnalysisMuMuResult::FitJpsiPCBE(TH1& h)
988 std::cout << "Fit with jpsi alone (pol2 + CB + expo)" << std::endl;
990 const Double_t xmin(2.0);
991 const Double_t xmax(5.0);
993 fitTotal = new TF1("fitTotal",funcJpsiPCBE,xmin,xmax,10);
994 fitTotal->SetParNames("p0","p1","p2","N","alpha","n","mean","sigma","expocste","exposlope");
996 fitTotal->SetParLimits(3,0,h.GetMaximum()*2); // N
998 const Double_t cbalpha(0.98);
999 const Double_t cbn(5.2);
1001 fitTotal->FixParameter(4,cbalpha);
1002 fitTotal->FixParameter(5,cbn);
1004 fitTotal->SetParLimits(6,2,4); // mean
1005 fitTotal->SetParLimits(7,0.05,0.2); // sigma
1007 TF1* fpol2 = new TF1("pol2","pol2",xmin,xmax);
1009 h.Fit(fpol2,"+","",2,2.8);
1011 fitTotal->SetParameter(0,fpol2->GetParameter(0));
1012 fitTotal->SetParameter(1,fpol2->GetParameter(1));
1013 fitTotal->SetParameter(2,fpol2->GetParameter(2));
1015 TF1* fexpo = new TF1("expo","expo",xmin,xmax);
1017 h.Fit(fexpo,"+","",3.5,4.5);
1019 fitTotal->SetParameter(8,fexpo->GetParameter(0));
1020 fitTotal->SetParameter(9,fexpo->GetParameter(1));
1022 fitTotal->SetParameter(3,h.GetMaximum()),
1023 fitTotal->SetParameter(4,cbalpha);
1024 fitTotal->SetParameter(5,cbn);
1025 fitTotal->SetParameter(6,3.15);
1026 fitTotal->SetParameter(7,0.1);
1028 h.Fit(fitTotal,"+","",2.5,5);
1030 Set("MeanJpsi",fitTotal->GetParameter(6),fitTotal->GetParError(6));
1031 Set("SigmaJpsi",fitTotal->GetParameter(7),fitTotal->GetParError(7));
1033 double m = GetValue("MeanJpsi");
1034 double s = GetValue("SigmaJpsi");
1037 TF1* fcb = new TF1("fcb",funcCB,xmin,xmax,5);
1038 fcb->SetParameters(fitTotal->GetParameter(3),
1039 fitTotal->GetParameter(4),
1040 fitTotal->GetParameter(5),
1041 fitTotal->GetParameter(6),
1042 fitTotal->GetParameter(7));
1044 fcb->SetLineColor(6);
1046 TLine* l1 = new TLine(m-n*s,0,m-n*s,fitTotal->GetParameter(3));
1047 TLine* l2 = new TLine(m+n*s,0,m+n*s,fitTotal->GetParameter(3));
1048 l1->SetLineColor(6);
1049 l2->SetLineColor(6);
1050 h.GetListOfFunctions()->Add(fcb);
1051 h.GetListOfFunctions()->Add(l1);
1052 h.GetListOfFunctions()->Add(l2);
1055 Set("NofJpsi",fitTotal->Integral(m-n*s,m+n*s)/h.GetBinWidth(1),fitTotal->IntegralError(m-n*s,m+n*s)/h.GetBinWidth(1));
1057 // Set("NofJpsi",fitTotal->Integral(0,10)/h.GetBinWidth(1),fitTotal->IntegralError(0,10)/h.GetBinWidth(1));
1061 //_____________________________________________________________________________
1062 void AliAnalysisMuMuResult::FitJpsiCBE(TH1& h)
1064 std::cout << "Fit with jpsi alone" << std::endl;
1066 const Double_t xmin(1.5);
1067 const Double_t xmax(8.0);
1069 fitTotal = new TF1("fitTotal",funcJpsiCBE,xmin,xmax,7);
1070 fitTotal->SetParNames("N","alpha","n","mean","sigma","expocste","exposlope");
1072 // fitTotal->SetParameters(h.GetMaximum(),1,5,3.0,0.07,1.5,3,1,0);
1074 fitTotal->SetParameters(1,1.15,3.6,3.0,0.07,1,-1);
1076 fitTotal->SetParLimits(0,0,h.GetMaximum()); // N
1077 // fitTotal->SetParLimits(1,0.1,2); // alpha
1078 fitTotal->FixParameter(1,0.98);
1079 // fitTotal->SetParLimits(2,0.01,5); // n
1080 fitTotal->FixParameter(2,5.2);
1081 fitTotal->SetParLimits(3,2.8,3.5); // mean
1082 fitTotal->SetParLimits(4,0.05,0.2); // sigma
1084 TF1* fexpo = new TF1("expo","expo",xmin,xmax);
1086 h.Fit(fexpo,"+","",2,3);
1088 fitTotal->SetParameter(5,fexpo->GetParameter(0));
1089 fitTotal->SetParameter(6,fexpo->GetParameter(1));
1091 h.Fit(fitTotal,"+","",2,5);
1094 Set("MeanJpsi",fitTotal->GetParameter(3),fitTotal->GetParError(3));
1095 Set("SigmaJpsi",fitTotal->GetParameter(4),fitTotal->GetParError(4));
1097 double m = GetValue("MeanJpsi");
1098 double s = GetValue("SigmaJpsi");
1101 TF1* fcb = new TF1("fcb",funcCB,xmin,xmax,5);
1102 fcb->SetParameters(fitTotal->GetParameter(0),
1103 fitTotal->GetParameter(1),
1104 fitTotal->GetParameter(2),
1105 fitTotal->GetParameter(3),
1106 fitTotal->GetParameter(4));
1108 fcb->SetLineColor(6);
1110 TLine* l1 = new TLine(m-n*s,0,m-n*s,fitTotal->GetParameter(0));
1111 TLine* l2 = new TLine(m+n*s,0,m+n*s,fitTotal->GetParameter(0));
1112 l1->SetLineColor(6);
1113 l2->SetLineColor(6);
1114 h.GetListOfFunctions()->Add(fcb);
1115 h.GetListOfFunctions()->Add(l1);
1116 h.GetListOfFunctions()->Add(l2);
1119 Set("NofJpsi",fitTotal->Integral(m-n*s,m+n*s)/h.GetBinWidth(1),fitTotal->IntegralError(m-n*s,m+n*s)/h.GetBinWidth(1));
1121 // Set("NofJpsi",fitTotal->Integral(0,10)/h.GetBinWidth(1),fitTotal->IntegralError(0,10)/h.GetBinWidth(1));
1125 //_____________________________________________________________________________
1126 void AliAnalysisMuMuResult::FitJpsiECBE(TH1& h)
1128 std::cout << "Fit with jpsi alone (expo + CB + expo)" << std::endl;
1130 const Double_t xmin(1.5);
1131 const Double_t xmax(8.0);
1133 fitTotal = new TF1("fitTotal",funcJpsiECBE,xmin,xmax,9);
1134 fitTotal->SetParNames("e0","s0","N","alpha","n","mean","sigma","e1","s1");
1136 fitTotal->SetParameters(1,-1,1,1.15,3.6,3.2,0.06,-1);
1138 fitTotal->SetParLimits(0,0,h.GetMaximum()*2);
1140 fitTotal->FixParameter(3,0.98); // alpha
1141 fitTotal->FixParameter(4,5.2); // n
1142 fitTotal->SetParLimits(5,2.8,3.5); // mean
1143 fitTotal->SetParLimits(6,0.05,0.2); // sigma
1145 TF1* fexpo1 = new TF1("expo1","expo",xmin,xmax);
1146 TF1* fexpo2 = new TF1("expo2","expo",xmin,xmax);
1148 h.Fit(fexpo1,"","",1.5,3);
1150 fitTotal->SetParameter(0,fexpo1->GetParameter(0));
1151 fitTotal->SetParameter(1,fexpo1->GetParameter(1));
1153 h.Fit(fexpo2,"","",3.5,5.0);
1155 fitTotal->SetParameter(7,fexpo2->GetParameter(0));
1156 fitTotal->SetParameter(8,fexpo2->GetParameter(1));
1158 const char* fitOption = "SI+";
1160 TFitResultPtr r = h.Fit(fitTotal,fitOption,"",2,5);
1162 Set("MeanJpsi",fitTotal->GetParameter(5),fitTotal->GetParError(5));
1163 Set("SigmaJpsi",fitTotal->GetParameter(6),fitTotal->GetParError(6));
1165 double m = GetValue("MeanJpsi");
1166 double s = GetValue("SigmaJpsi");
1169 TF1* fcb = new TF1("fcb",funcCB,xmin,xmax,5);
1170 fcb->SetParameters(fitTotal->GetParameter(2),
1171 fitTotal->GetParameter(3),
1172 fitTotal->GetParameter(4),
1173 fitTotal->GetParameter(5),
1174 fitTotal->GetParameter(6));
1176 fcb->SetParError(0,fitTotal->GetParError(2));
1177 fcb->SetParError(1,fitTotal->GetParError(3));
1178 fcb->SetParError(2,fitTotal->GetParError(4));
1179 fcb->SetParError(3,fitTotal->GetParError(5));
1180 fcb->SetParError(4,fitTotal->GetParError(6));
1182 fcb->SetLineColor(6);
1184 TLine* l1 = new TLine(m-n*s,0,m-n*s,fitTotal->GetParameter(2));
1185 TLine* l2 = new TLine(m+n*s,0,m+n*s,fitTotal->GetParameter(2));
1186 l1->SetLineColor(6);
1187 l2->SetLineColor(6);
1188 h.GetListOfFunctions()->Add(fcb);
1189 h.GetListOfFunctions()->Add(l1);
1190 h.GetListOfFunctions()->Add(l2);
1193 Double_t cbParameters[5];
1194 Double_t covarianceMatrix[5][5];
1196 cbParameters[0] = fitTotal->GetParameter(2);
1197 cbParameters[1] = fitTotal->GetParameter(3);
1198 cbParameters[2] = fitTotal->GetParameter(4);
1199 cbParameters[3] = fitTotal->GetParameter(5);
1200 cbParameters[4] = fitTotal->GetParameter(6);
1202 for ( int iy = 0; iy < 5; ++iy )
1204 for ( int ix = 0; ix < 5; ++ix )
1206 covarianceMatrix[ix][iy] = (r->GetCovarianceMatrix())(ix+2,iy+2);
1211 double njpsi = fcb->Integral(m-n*s,m+n*s)/h.GetBinWidth(1);
1213 double nerr = fcb->IntegralError(m-n*s,m+n*s,&cbParameters[0],&covarianceMatrix[0][0])/h.GetBinWidth(1);
1216 Set("NofJpsi",njpsi,nerr);
1221 //_____________________________________________________________________________
1222 AliAnalysisMuMuResult* AliAnalysisMuMuResult::FitJpsi(TH1& h)
1224 std::cout << "Fit with jpsi alone" << std::endl;
1226 Int_t nrebin = fMinv->GetXaxis()->GetNbins() / h.GetXaxis()->GetNbins();
1228 AliAnalysisMuMuResult* r = new AliAnalysisMuMuResult(h,"JPSI",nrebin);
1230 TH1* hfit = r->Minv();
1232 const Double_t xmin(1.5);
1233 const Double_t xmax(8.0);
1235 TF1* fitTotal = new TF1("fitTotal",funcCB2,xmin,xmax,7);
1236 fitTotal->SetParNames("N","alpha","n","mean","sigma","alphaprime","nprime");
1237 fitTotal->SetParameters(h.GetMaximum(),1,5,3.0,0.07,1.5,3);
1238 fitTotal->SetParLimits(0,0,h.GetMaximum()*2); // N
1239 fitTotal->SetParLimits(1,0,10); // alpha
1240 fitTotal->SetParLimits(2,1,10); // n
1241 fitTotal->SetParLimits(3,1,4); // mean
1242 fitTotal->SetParLimits(4,0.01,1); // sigma
1243 fitTotal->SetParLimits(5,0,10); // alpha
1244 fitTotal->SetParLimits(6,1,10); // n
1246 hfit->Fit(fitTotal,"+","",2,5);
1249 r->Set("MeanJpsi",fitTotal->GetParameter(3),fitTotal->GetParError(3));
1250 r->Set("SigmaJpsi",fitTotal->GetParameter(4),fitTotal->GetParError(4));
1252 double m = r->GetValue("MeanJpsi");
1253 double s = r->GetValue("SigmaJpsi");
1256 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));
1261 //_____________________________________________________________________________
1262 AliAnalysisMuMuResult* AliAnalysisMuMuResult::FitJpsi2CB2VWG(const TH1& h)
1264 std::cout << "Fit with jpsi + psiprime VWG" << std::endl;
1266 Int_t nrebin = fMinv->GetXaxis()->GetNbins() / h.GetXaxis()->GetNbins();
1268 AliAnalysisMuMuResult* r = new AliAnalysisMuMuResult(h,"JPSI2CB2VWG",nrebin);
1271 TH1* hfit = r->Minv();
1273 const Double_t xmin(2.2);
1274 const Double_t xmax(5.0);
1276 TF1* fitTotal = new TF1("fitTotal",func2CB2VWG,xmin,xmax,12);
1277 fitTotal->SetParNames("kVWG","mVWG","sVWG1","sVWG2","kPsi","mPsi","sPsi","alPsi","nlPsi","auPsi","nuPsi");
1278 fitTotal->SetParName(11, "kPsi'");
1280 fitTotal->SetParameter(0, 10000.);
1281 fitTotal->SetParameter(1, 1.9);
1282 fitTotal->SetParameter(2, 0.5);
1283 fitTotal->SetParLimits(2, 0., 100.);
1284 fitTotal->SetParameter(3, 0.3);
1285 fitTotal->SetParLimits(3, 0., 100.);
1286 fitTotal->SetParameter(4, 100.);
1287 fitTotal->SetParameter(5, 3.13);
1288 fitTotal->SetParLimits(5, 3.08, 3.2);
1289 fitTotal->SetParameter(6, 0.08);
1290 fitTotal->SetParLimits(6, 0.05, 0.15);
1291 fitTotal->FixParameter(7, 0.93);
1292 fitTotal->FixParameter(8, 5.59);
1293 fitTotal->FixParameter(9, 2.32);
1294 fitTotal->FixParameter(10, 3.39);
1295 fitTotal->SetParameter(11, 10.);
1297 const char* fitOption = "SIER"; //+";
1299 TFitResultPtr fitResult = hfit->Fit(fitTotal,fitOption,"");
1301 r->Set("MeanJpsi",fitTotal->GetParameter(5),fitTotal->GetParError(5));
1302 r->Set("SigmaJpsi",fitTotal->GetParameter(6),fitTotal->GetParError(6));
1304 double m = r->GetValue("MeanJpsi");
1305 double s = r->GetValue("SigmaJpsi");
1308 TF1* fcb = new TF1("fcb",CrystalBallExtended,xmin,xmax,7);
1309 fcb->SetParameters(fitTotal->GetParameter(4),
1310 fitTotal->GetParameter(5),
1311 fitTotal->GetParameter(6),
1312 fitTotal->GetParameter(7),
1313 fitTotal->GetParameter(8),
1314 fitTotal->GetParameter(9),
1315 fitTotal->GetParameter(10));
1318 fcb->SetLineColor(1);
1320 TLine* l1 = new TLine(m-n*s,0,m-n*s,fitTotal->GetParameter(4));
1321 TLine* l2 = new TLine(m+n*s,0,m+n*s,fitTotal->GetParameter(4));
1322 l1->SetLineColor(6);
1323 l2->SetLineColor(6);
1324 hfit->GetListOfFunctions()->Add(fcb);
1325 hfit->GetListOfFunctions()->Add(l1);
1326 hfit->GetListOfFunctions()->Add(l2);
1328 Double_t cbParameters[7];
1329 Double_t covarianceMatrix[7][7];
1331 for ( int ix = 0; ix < 7; ++ix )
1333 cbParameters[ix] = fitTotal->GetParameter(ix+4);
1336 for ( int iy = 0; iy < 5; ++iy )
1338 for ( int ix = 0; ix < 5; ++ix )
1340 covarianceMatrix[ix][iy] = (fitResult->GetCovarianceMatrix())(ix+4,iy+4);
1344 double njpsi = fcb->Integral(m-n*s,m+n*s)/h.GetBinWidth(1);
1345 double nerr = fcb->IntegralError(m-n*s,m+n*s,&cbParameters[0],&covarianceMatrix[0][0])/h.GetBinWidth(1);
1347 r->Set("NofJpsi",njpsi,nerr);
1353 //_____________________________________________________________________________
1354 void AliAnalysisMuMuResult::FitUpsilon(TH1& h)
1356 std::cout << "Fit with upsilon alone" << std::endl;
1358 const Double_t xmin(6.0);
1359 const Double_t xmax(12.0);
1361 fitTotal = new TF1("fitTotal",funcCB2,xmin,xmax,7);
1362 fitTotal->SetParNames("N","alpha","n","mean","sigma","alphaprime","nprime");
1363 fitTotal->SetParameters(h.GetMaximum(),1,5,9.46,0.2,1.5,3);
1364 fitTotal->SetParLimits(0,0,h.GetMaximum()*2); // N
1365 fitTotal->SetParLimits(1,0,10); // alpha
1366 fitTotal->SetParLimits(2,1,10); // n
1367 fitTotal->SetParLimits(3,8,12); // mean
1368 fitTotal->SetParLimits(4,0.01,1); // sigma
1369 fitTotal->SetParLimits(5,0,10); // alpha
1370 fitTotal->SetParLimits(6,1,10); // n
1372 h.Fit(fitTotal,"+","",6,12);
1375 Set("MeanUpsilon",fitTotal->GetParameter(3),fitTotal->GetParError(3));
1376 Set("SigmaUpsilon",fitTotal->GetParameter(4),fitTotal->GetParError(4));
1378 double m = GetValue("MeanUpsilon");
1379 double s = GetValue("SigmaUpsilon");
1382 Set("NofUpsilon",fitTotal->Integral(m-n*s,m+n*s)/h.GetBinWidth(1),fitTotal->IntegralError(m-n*s,m+n*s)/h.GetBinWidth(1));
1386 //_____________________________________________________________________________
1387 Double_t AliAnalysisMuMuResult::ErrorAB(Double_t a, Double_t aerr, Double_t b, Double_t berr)
1391 if ( TMath::Abs(a) > 1E-12 )
1393 e += (aerr*aerr)/(a*a);
1396 if ( TMath::Abs(b) > 1E-12 )
1398 e += (berr*berr)/(b*b);
1401 return TMath::Sqrt(e);
1404 //_____________________________________________________________________________
1405 Double_t AliAnalysisMuMuResult::ErrorABC(Double_t a, Double_t aerr, Double_t b, Double_t berr, Double_t c, Double_t cerror)
1409 if ( TMath::Abs(a) > 1E-12 )
1411 e += (aerr*aerr)/(a*a);
1414 if ( TMath::Abs(b) > 1E-12 )
1416 e += (berr*berr)/(b*b);
1419 if ( TMath::Abs(b) > 1E-12 )
1421 e += (cerror*cerror)/(c*c);
1424 return TMath::Sqrt(e);
1428 //_____________________________________________________________________________
1429 Bool_t AliAnalysisMuMuResult::AddFit(const char* fitType, Int_t nrebin)
1433 if ( !fMinv ) return kFALSE;
1435 TString sFitType(fitType);
1438 if ( fMinv->GetEntries()<100 && !sFitType.Contains("COUNT")) return kFALSE;
1440 TH1* hminv = static_cast<TH1*>(fMinv->Clone());
1442 hminv->Rebin(nrebin);
1443 hminv->SetDirectory(0);
1445 AliAnalysisMuMuResult* r(0x0);
1447 // if ( sFitType == "PSI12" )
1449 // r = FitJpsiPsiPrimeCustom(*hminv);
1452 if ( sFitType=="PSI1")
1454 r = FitJpsi(*hminv);
1455 // r = FitJpsiGCBE(*hminv);
1458 if ( sFitType == "PSILOW")
1460 r = FitJpsi2CB2VWG(*hminv);
1463 if ( sFitType == "COUNTPSI" )
1465 r = new AliAnalysisMuMuResult(*hminv,"COUNTJPSI",1);
1466 Double_t n = CountParticle(*hminv,"Jpsi");
1467 r->Set("NofJpsi",n,TMath::Sqrt(n));
1472 // r->SetNofInputParticles("Jpsi",GetValue("NofInputJpsi"));
1477 fSubResults = new TObjArray;
1478 fSubResults->SetOwner(kTRUE);
1485 r->SetNofTriggers(NofTriggers());
1486 r->SetNofRuns(NofRuns());
1487 fSubResults->Add(r);
1495 //_____________________________________________________________________________
1496 Double_t AliAnalysisMuMuResult::GetErrorStat(const char* name, const char* subResultName) const
1498 // compute the mean value from all subresults
1500 if ( strlen(subResultName) > 0 )
1504 AliError(Form("No subresult from which I could get the %s one...",subResultName));
1505 return TMath::Limits<Double_t>::Max();
1507 AliAnalysisMuMuResult* sub = static_cast<AliAnalysisMuMuResult*>(fSubResults->FindObject(subResultName));
1510 AliError(Form("Could not get subresult named %s",subResultName));
1511 return TMath::Limits<Double_t>::Max();
1513 return sub->GetErrorStat(name);
1518 TObjArray* p = static_cast<TObjArray*>(fMap->GetValue(name));
1521 TParameter<double>* val = static_cast<TParameter<double>*>(p->At(kErrorStat));
1522 return val->GetVal();
1526 TIter next(fSubResults);
1527 AliAnalysisMuMuResult* r;
1531 while ( ( r = static_cast<AliAnalysisMuMuResult*>(next()) ) )
1533 if ( r->HasValue(name) )
1535 mean += r->GetErrorStat(name);
1539 return ( n ? mean/n : 0.0 );
1542 //_____________________________________________________________________________
1543 Double_t AliAnalysisMuMuResult::GetValue(const char* name, const char* subResultName) const
1545 // get a value (either directly or by computing the mean of the subresults)
1547 if ( strlen(subResultName) > 0 )
1551 AliError(Form("No subresult from which I could get the %s one...",subResultName));
1552 return TMath::Limits<Double_t>::Max();
1554 AliAnalysisMuMuResult* sub = static_cast<AliAnalysisMuMuResult*>(fSubResults->FindObject(subResultName));
1557 AliError(Form("Could not get subresult named %s",subResultName));
1558 return TMath::Limits<Double_t>::Max();
1560 return sub->GetValue(name);
1565 TObjArray* p = static_cast<TObjArray*>(fMap->GetValue(name));
1568 TParameter<double>* val = static_cast<TParameter<double>*>(p->At(kValue));
1569 return val->GetVal();
1573 // compute the mean value from all subresults
1574 TIter next(fSubResults);
1575 AliAnalysisMuMuResult* r;
1579 while ( ( r = static_cast<AliAnalysisMuMuResult*>(next()) ) )
1581 if ( r->HasValue(name) )
1583 mean += r->GetValue(name);
1587 return ( n ? mean/n : 0.0 );
1590 //_____________________________________________________________________________
1591 Bool_t AliAnalysisMuMuResult::HasValue(const char* name, const char* subResultName) const
1593 if ( strlen(subResultName) > 0 )
1597 AliError(Form("No subresult from which I could get the %s one...",subResultName));
1600 AliAnalysisMuMuResult* sub = static_cast<AliAnalysisMuMuResult*>(fSubResults->FindObject(subResultName));
1603 AliError(Form("Could not get subresult named %s",subResultName));
1606 return sub->HasValue(name);
1609 if ( fMap && ( fMap->GetValue(name) != 0x0 ) )
1614 TIter next(fSubResults);
1615 AliAnalysisMuMuResult* r;
1617 while ( ( r = static_cast<AliAnalysisMuMuResult*>(next()) ) )
1619 if ( r->HasValue(name) ) return kTRUE;
1625 //_____________________________________________________________________________
1626 THashList* AliAnalysisMuMuResult::Keys() const
1628 /// Return the complete list of keys we're using
1631 fKeys = new THashList;
1632 fKeys->SetOwner(kTRUE);
1636 while ( ( key = static_cast<TObjString*>(next()) ) )
1638 if ( !fKeys->FindObject(key->String()) )
1640 fKeys->Add(new TObjString(key->String()));
1644 AliAnalysisMuMuResult* r;
1645 TIter nextResult(fSubResults);
1647 while ( ( r = static_cast<AliAnalysisMuMuResult*>(nextResult())) )
1649 TIter nextHL(r->Keys());
1652 while ( ( s = static_cast<TObjString*>(nextHL())) )
1654 if ( !fKeys->FindObject(s->String()) )
1656 fKeys->Add(new TObjString(s->String()));
1665 //_____________________________________________________________________________
1666 Long64_t AliAnalysisMuMuResult::Merge(TCollection* list)
1670 /// Merge a list of AliAnalysisMuMuResult objects with this
1671 /// Returns the number of merged objects (including this).
1673 /// Note that the merging is to be understood here as an average operation
1675 AliInfo(Form("this=%p",this));
1676 if (!list) return 0;
1678 if (list->IsEmpty()) return 1;
1683 hminvList.SetOwner(kTRUE);
1685 Double_t thisWeight = Weight();
1686 Double_t sumOfWeights = thisWeight;
1688 Double_t nofTriggers = fNofTriggers*thisWeight;
1689 Double_t nofRuns = fNofRuns*thisWeight;
1691 fNofRuns *= thisWeight;
1693 while ( ( currObj = next() ) )
1695 AliAnalysisMuMuResult* result = dynamic_cast<AliAnalysisMuMuResult*>(currObj);
1698 AliFatal(Form("object named \"%s\" is a %s instead of an AliAnalysisMuMuResult!", currObj->GetName(), currObj->ClassName()));
1702 Double_t w = result->Weight();
1704 nofRuns += result->NofRuns()*w;
1705 nofTriggers += result->NofTriggers()*w;
1706 fWeight += result->fWeight;
1710 thisWeight/= sumOfWeights;
1711 fNofRuns = nofRuns/sumOfWeights;
1712 fNofTriggers = nofTriggers/sumOfWeights;
1713 fWeight /= sumOfWeights;
1715 AliInfo(Form("thisWeight=%e sumOfWeight=%8.2f noftriggers=%e weight=%e",thisWeight,sumOfWeights,1.0*fNofTriggers,fWeight));
1717 TIter nextKey(fMap);
1720 while ( ( key = static_cast<TObjString*>(nextKey())) )
1722 AliInfo(key->String().Data());
1724 Double_t value = GetValue(key->String())*thisWeight;
1725 Double_t estat = GetErrorStat(key->String())*GetErrorStat(key->String())*thisWeight*thisWeight;
1727 Double_t test(thisWeight);
1731 while ( ( currObj = next() ) )
1733 AliAnalysisMuMuResult* result = dynamic_cast<AliAnalysisMuMuResult*>(currObj);
1735 if (!result->HasValue(key->String()))
1737 AliError(Form("Did not find key %s in of the result to merge",key->String().Data()));
1741 // can only merge under the condition we have the same bin
1743 if ( fBin != result->Bin() )
1745 AliError("Cannot merge results of different bin");
1749 Double_t w = result->Weight()/sumOfWeights;
1755 value += result->GetValue(key->String())*w;
1756 estat += result->GetErrorStat(key->String())*result->GetErrorStat(key->String())*w2;
1762 TMath::Sqrt(estat));
1764 AliInfo(Form("test=%e",test));
1769 fMinv->Scale(thisWeight);
1774 while ( ( currObj = next() ) )
1776 AliAnalysisMuMuResult* result = dynamic_cast<AliAnalysisMuMuResult*>(currObj);
1778 if ( result->Minv() )
1780 TH1* h = static_cast<TH1*>(result->Minv()->Clone());
1781 AliInfo(Form("Nbins %d xmin %e xmax %e",h->GetXaxis()->GetNbins(),h->GetXaxis()->GetXmin(),
1782 h->GetXaxis()->GetXmax()));
1783 h->Scale(result->Weight());
1790 fMinv->Merge(&hminvList);
1791 fMinv->Scale(1.0/sumOfWeights);
1794 TIter nextSubresult(fSubResults);
1795 AliAnalysisMuMuResult* r;
1797 while ( ( r = static_cast<AliAnalysisMuMuResult*>(nextSubresult())) )
1803 while ( ( currObj = next() ) )
1805 sublist.Add(currObj);
1811 return list->GetEntries()+1;
1814 //_____________________________________________________________________________
1815 Int_t AliAnalysisMuMuResult::NofRuns() const
1817 if ( !Mother() ) return fNofRuns;
1818 else return Mother()->NofRuns();
1821 //_____________________________________________________________________________
1822 Int_t AliAnalysisMuMuResult::NofTriggers() const
1824 if ( !Mother() ) return fNofTriggers;
1825 else return Mother()->NofTriggers();
1828 //_____________________________________________________________________________
1829 void AliAnalysisMuMuResult::Print(Option_t* opt) const
1834 for ( Int_t i = 0; i < 9; ++i )
1836 sopt.ReplaceAll(Form("%d",i),"");
1840 pot.ReplaceAll("ALL","");
1841 pot.ReplaceAll("FULL","");
1843 std::cout << pot.Data() << Form("%50s- NRUNS %d - NTRIGGER %10d - %s%s",
1847 fWeight > 0.0 ? Form(" WEIGHT %e -",fWeight) : "",
1848 fBin.AsString().Data());
1850 if ( fSubResults && fSubResults->GetEntries()>1 )
1852 std::cout << " (" << fSubResults->GetEntries()-1 << " subresults)";
1855 std::cout << std::endl;
1857 if ( sopt.Contains("DUMP") )
1861 while ( ( str = static_cast<TObjString*>(next()) ) )
1863 TObjArray* a = static_cast<TObjArray*>(fMap->GetValue(str->String()));
1865 std::cout << Form("%s %e %e",
1866 str->String().Data(),
1867 static_cast<TParameter<Double_t>*> (a->At(kValue))->GetVal(),
1868 static_cast<TParameter<Double_t>*> (a->At(kErrorStat))->GetVal()) << std::endl;
1874 PrintParticle("Jpsi",pot.Data());
1875 PrintParticle("PsiPrime",pot.Data());
1876 PrintParticle("Upsilon",pot.Data());
1879 if ( HasValue("MBR"))
1881 std::cout << Form("\t\tMBR %e +- %e",GetValue("MBR"),GetErrorStat("MBR")) << std::endl;
1884 if ( fSubResults && fSubResults->GetEntries() > 1 && ( sopt.Contains("ALL") || sopt.Contains("FULL") ) )
1886 std::cout << pot.Data() << "\t===== sub results ===== " << std::endl;
1890 TIter next(fSubResults);
1891 AliAnalysisMuMuResult* r;
1893 while ( ( r = static_cast<AliAnalysisMuMuResult*>(next()) ) )
1895 r->Print(sopt.Data());
1900 //_____________________________________________________________________________
1901 void AliAnalysisMuMuResult::PrintParticle(const char* particle, const char* opt) const
1903 Double_t npart = GetValue(Form("Nof%s",particle));
1904 if (npart<=0) return;
1907 std::cout << opt << Form("\t%s",particle) << std::endl;
1909 // Double_t npartError = GetErrorStat(Form("Nof%s",particle));
1910 // std::cout << opt << Form("\t\t%20s %9.2f +- %5.2f","Count",npart,npartError) << std::endl;
1915 while ( ( key = static_cast<TObjString*>(next()) ) )
1917 if ( !key->String().Contains(particle) ) continue;
1919 PrintValue(key->String(),opt,GetValue(key->String()),GetErrorStat(key->String()));
1923 //_____________________________________________________________________________
1924 void AliAnalysisMuMuResult::PrintValue(const char* key, const char* opt, Double_t value, Double_t errorStat) const
1926 // print one value and its associated error
1928 if ( TString(key).Contains("AccEff") )
1930 std::cout << opt << Form("\t\t%20s %9.2f +- %5.2f %%",key,value*100,errorStat*100) << std::endl;
1932 else if ( TString(key).BeginsWith("Sigma") || TString(key).BeginsWith("Mean") )
1934 std::cout << opt << Form("\t\t%20s %9.2f +- %5.2f MeV/c^2",key,value*1E3,1E3*errorStat) << std::endl;
1936 else if ( TString(key).BeginsWith("Nof") )
1938 std::cout << opt << Form("\t\t%20s %9.2f +- %5.2f",key,value,errorStat) << std::endl;
1940 else if ( value > 1E-3 && value < 1E3 )
1942 std::cout << opt << Form("\t\t%20s %9.2f +- %5.2f",key,value,errorStat) << std::endl;
1946 std::cout << opt << Form("\t\t%20s %9.2e +- %9.2e",key,value,errorStat) << std::endl;
1950 //_____________________________________________________________________________
1951 void AliAnalysisMuMuResult::Set(const char* name, Double_t value, Double_t errorStat)
1956 fMap->SetOwnerKeyValue(kTRUE,kTRUE);
1959 TObjArray* p = static_cast<TObjArray*>(fMap->GetValue(name));
1962 p = new TObjArray(4);
1966 p->AddAt(new TParameter<Double_t>(name,value),kValue);
1967 p->AddAt(new TParameter<Double_t>(name,errorStat),kErrorStat);
1969 fMap->Add(new TObjString(name),p);
1973 static_cast<TParameter<double>*>(p->At(kValue))->SetVal(value);
1974 static_cast<TParameter<double>*>(p->At(kErrorStat))->SetVal(errorStat);
1977 if ( TString(name)=="NofJpsi" )
1979 if ( NofTriggers() > 0 )
1981 Double_t rate = value/NofTriggers();
1982 Double_t rateError = rate*ErrorAB(value,errorStat,NofTriggers(),TMath::Sqrt(NofTriggers()));
1983 Set("RateJpsi",rate,rateError);
1988 //_____________________________________________________________________________
1989 void AliAnalysisMuMuResult::SetBin(const AliAnalysisMuMuBinning::Range& bin)
1991 if (!Mother()) fBin = bin;
1992 else Mother()->SetBin(bin);
1995 //_____________________________________________________________________________
1996 void AliAnalysisMuMuResult::SetNofInputParticles(const TH1& hminv)
1998 static const char* particleNames[] = { "Jpsi" , "PsiPrime", "Upsilon","UpsilonPrime" };
2000 for ( Int_t i = 0; i < 4; ++i )
2002 Double_t n = CountParticle(hminv,particleNames[i]);
2004 AliDebug(1,Form("i=%d particle %s n %e",i,particleNames[i],n));
2008 SetNofInputParticles(particleNames[i],n);
2013 //_____________________________________________________________________________
2014 void AliAnalysisMuMuResult::SetNofInputParticles(const char* particle, int n)
2016 /// Set the number of input particles (so it is a MC result)
2017 /// and (re)compute the AccxEff values
2019 Set(Form("NofInput%s",particle),n,TMath::Sqrt(n));
2023 Set(Form("AccEff%s",particle),0,0);
2027 Double_t npart = GetValue(Form("Nof%s",particle));
2028 Double_t npartErr = GetErrorStat(Form("Nof%s",particle));
2029 Double_t ninput = GetValue(Form("NofInput%s",particle));
2030 Double_t ninputErr = GetErrorStat(Form("NofInput%s",particle));
2032 Set(Form("AccEff%s",particle),
2034 (npart/ninput)*ErrorAB(npart,npartErr,ninput,ninputErr));
2036 TIter next(fSubResults);
2037 AliAnalysisMuMuResult* r;
2039 while ( ( r = static_cast<AliAnalysisMuMuResult*>(next())) )
2041 r->Set(Form("NofInput%s",particle),n,TMath::Sqrt(n));
2043 npart = r->GetValue(Form("Nof%s",particle));
2044 npartErr = r->GetErrorStat(Form("Nof%s",particle));
2046 r->Set(Form("AccEff%s",particle),
2048 (npart/ninput)*ErrorAB(npart,npartErr,ninput,ninputErr));
2053 //_____________________________________________________________________________
2054 void AliAnalysisMuMuResult::SetNofRuns(Int_t n)
2056 if ( !Mother() ) fNofRuns=n;
2057 else Mother()->SetNofRuns(n);
2060 //_____________________________________________________________________________
2061 void AliAnalysisMuMuResult::SetNofTriggers(Int_t n)
2063 if ( !Mother() ) fNofTriggers=n;
2064 else Mother()->SetNofTriggers(n);
2067 //_____________________________________________________________________________
2068 void AliAnalysisMuMuResult::SetMinv(const TH1& hminv)
2070 /// Set the inv. mass spectrum to be fitted.
2074 fMinv = static_cast<TH1*>(hminv.Clone(Form("Minv%u",n++)));
2075 fMinv->SetDirectory(0);