1 /**************************************************************************
2 * Copyright(c) 2007-2009, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
7 * Permission to use, copy, modify and distribute this software and its *
8 * documentation strictly for non-commercial purposes is hereby granted *
9 * without fee, provided that the above copyright notice appears in all *
10 * copies and that both the copyright notice and this permission notice *
11 * appear in the supporting documentation. The authors make no claims *
12 * about the suitability of this software for any purpose. It is *
13 * provided "as is" without express or implied warranty. *
14 **************************************************************************/
18 ///////////////////////////////////////////////////////////////////
20 // Implementation of the class to calculate statistical //
21 // significance from AliMultiVeector objects with signal and //
22 // background counts vs. cut values //
23 // Origin: Francesco Prino (prino@to.infn.it) //
25 ///////////////////////////////////////////////////////////////////
27 #include "AliMultiDimVector.h"
28 #include "AliSignificanceCalculator.h"
32 ClassImp(AliSignificanceCalculator)
33 //___________________________________________________________________________
34 AliSignificanceCalculator::AliSignificanceCalculator():
38 fErrSquareBackground(0),
44 // default constructor
45 fSignal=new AliMultiDimVector();
46 fBackground=new AliMultiDimVector();
48 //___________________________________________________________________________
49 AliSignificanceCalculator::AliSignificanceCalculator(AliMultiDimVector* sig, AliMultiDimVector* bkg, Float_t normsig, Float_t normbkg):
53 fErrSquareBackground(0),
59 // standard constructor
60 if(fSignal && fBackground) CalculateSignificance();
62 //___________________________________________________________________________
63 AliSignificanceCalculator::AliSignificanceCalculator(AliMultiDimVector* sig, AliMultiDimVector* bkg, AliMultiDimVector* err2sig, AliMultiDimVector* err2bkg, Float_t normsig, Float_t normbkg):
65 fErrSquareSignal(err2sig),
67 fErrSquareBackground(err2bkg),
73 // standard constructor
74 if(fSignal && fBackground) CalculateSignificance();
76 //___________________________________________________________________________
77 AliSignificanceCalculator::~AliSignificanceCalculator(){
79 if(fSignal) delete fSignal;
80 if(fBackground) delete fBackground;
81 if(fSignificance) delete fSignificance;
82 if(fErrSignificance) delete fErrSignificance;
84 //___________________________________________________________________________
85 Bool_t AliSignificanceCalculator::Check() const {
86 // checks AliMultiDimVector dimension and normalization
87 if(fSignal==0 || fBackground==0) return kFALSE;
88 if(fNormSig==0. || fNormBkg==0.) return kFALSE;
89 if(fSignal->GetNTotCells() != fBackground->GetNTotCells()) return kFALSE;
92 //___________________________________________________________________________
93 void AliSignificanceCalculator::CalculateSignificance(){
94 // calculates significance and its error
95 if(!Check()) AliFatal("Signal and Background AliMultiDimVector dimensions do not match!");
97 if(fSignificance) delete fSignificance;
98 if(fErrSignificance) delete fErrSignificance;
99 fSignificance=new AliMultiDimVector();
100 fSignificance->CopyStructure(fSignal);
101 fErrSignificance=new AliMultiDimVector();
102 fErrSignificance->CopyStructure(fSignal);
104 for(ULong64_t i=0;i<fSignal->GetNTotCells();i++) {
105 if(fSignal->GetElement(i)!=-1 && fBackground->GetElement(i)!=-1){
106 Float_t s=fSignal->GetElement(i)*fNormSig;
107 Float_t b=fBackground->GetElement(i)*fNormBkg;
111 signif=s/TMath::Sqrt(s+b);
113 if(fErrSquareSignal) errs=TMath::Sqrt(fErrSquareSignal->GetElement(i))*fNormSig;
114 else errs=TMath::Sqrt(fSignal->GetElement(i))*fNormSig; // Poisson statistics
115 if(fErrSquareBackground) errb=TMath::Sqrt(fErrSquareBackground->GetElement(i))*fNormBkg;
116 else errb=TMath::Sqrt(fBackground->GetElement(i))*fNormBkg; // Poisson
117 Float_t dsigds=(s+2*b)/2./(s+b)/TMath::Sqrt(s+b);
118 Float_t dsigdb=-s/2./(s+b)/TMath::Sqrt(s+b);
119 errsig=TMath::Sqrt(dsigds*dsigds*errs*errs+dsigdb*dsigdb*errb*errb);
121 fSignificance->SetElement(i,signif);
122 fErrSignificance->SetElement(i,errsig);
125 fSignificance->SetNameTitle("Significance","Significance");
126 fErrSignificance->SetNameTitle("ErrorOnSignificance","ErrorOnSignificance");
128 //___________________________________________________________________________
129 AliMultiDimVector* AliSignificanceCalculator::CalculatePurity() const {
131 if(!Check()) AliFatal("Signal and Background AliMultiDimVector dimensions do not match!");
133 AliMultiDimVector* purity=new AliMultiDimVector();
134 purity->CopyStructure(fSignal);
135 for(ULong64_t i=0;i<fSignal->GetNTotCells();i++) {
136 if(fSignal->GetElement(i)!=-1 && fBackground->GetElement(i)!=-1){
137 Float_t s=fSignal->GetElement(i)*fNormSig;
138 Float_t b=fBackground->GetElement(i)*fNormBkg;
140 if((s+b)>0) pur=s/(s+b);
141 purity->SetElement(i,pur);
144 purity->SetNameTitle("Purity","Purity");
147 //___________________________________________________________________________
148 AliMultiDimVector* AliSignificanceCalculator::CalculatePurityError() const {
149 // calculates error on purity
150 if(!Check()) AliFatal("Signal and Background AliMultiDimVector dimensions do not match!");
152 AliMultiDimVector* epurity=new AliMultiDimVector();
153 epurity->CopyStructure(fSignal);
154 for(ULong64_t i=0;i<fSignal->GetNTotCells();i++) {
155 if(fSignal->GetElement(i)!=-1 && fBackground->GetElement(i)!=-1){
156 Float_t s=fSignal->GetElement(i)*fNormSig;
157 Float_t b=fBackground->GetElement(i)*fNormBkg;
161 if(fErrSquareSignal) errs=TMath::Sqrt(fErrSquareSignal->GetElement(i))*fNormSig;
162 else errs=TMath::Sqrt(fSignal->GetElement(i))*fNormSig; // Poisson statistics
163 if(fErrSquareBackground) errb=TMath::Sqrt(fErrSquareBackground->GetElement(i))*fNormBkg;
164 else errb=TMath::Sqrt(fBackground->GetElement(i))*fNormBkg; // Poisson
165 Float_t dpurds=b/(s+b)/(s+b);
166 Float_t dpurdb=-s/(s+b)/(s+b);
167 epur=TMath::Sqrt(dpurds*dpurds*errs*errs+dpurdb*dpurdb*errb*errb);
169 epurity->SetElement(i,epur);
172 epurity->SetNameTitle("ErrorOnPurity","ErrorOnPurity");
175 //___________________________________________________________________________
176 AliMultiDimVector* AliSignificanceCalculator::CalculateSOverB() const {
177 // Signal over Background
178 if(!Check()) AliFatal("Signal and Background AliMultiDimVector dimensions do not match!");
180 AliMultiDimVector* sob=new AliMultiDimVector();
181 sob->CopyStructure(fSignal);
182 for(ULong64_t i=0;i<fSignal->GetNTotCells();i++) {
183 if(fSignal->GetElement(i)!=-1 && fBackground->GetElement(i)!=-1){
184 Float_t s=fSignal->GetElement(i)*fNormSig;
185 Float_t b=fBackground->GetElement(i)*fNormBkg;
188 sob->SetElement(i,soverb);
191 sob->SetNameTitle("SoverB","SoverB");
194 //___________________________________________________________________________
195 AliMultiDimVector* AliSignificanceCalculator::CalculateSOverBError() const {
196 // Error on Signal over Background
197 if(!Check()) AliFatal("Signal and Background AliMultiDimVector dimensions do not match!");
199 AliMultiDimVector* esob=new AliMultiDimVector();
200 esob->CopyStructure(fSignal);
201 for(ULong64_t i=0;i<fSignal->GetNTotCells();i++) {
202 if(fSignal->GetElement(i)!=-1 && fBackground->GetElement(i)!=-1){
203 Float_t s=fSignal->GetElement(i)*fNormSig;
204 Float_t b=fBackground->GetElement(i)*fNormBkg;
209 if(fErrSquareSignal) errs=TMath::Sqrt(fErrSquareSignal->GetElement(i))*fNormSig;
210 else errs=TMath::Sqrt(fSignal->GetElement(i))*fNormSig; // Poisson statistics
211 if(fErrSquareBackground) errb=TMath::Sqrt(fErrSquareBackground->GetElement(i))*fNormBkg;
212 else errb=TMath::Sqrt(fBackground->GetElement(i))*fNormBkg; // Poisson
213 esoverb=soverb*TMath::Sqrt(errs*errs/s/s+errb*errb/b/b);
215 esob->SetElement(i,esoverb);
218 esob->SetNameTitle("ErrorOnSoverB","ErrorOnSoverB");