ROOT logo
/**************************************************************************
 * Copyright(c) 2007-2009, ALICE Experiment at CERN, All rights reserved. *
 *                                                                        *
 * Author: The ALICE Off-line Project.                                    *
 * Contributors are mentioned in the code where appropriate.              *
 *                                                                        *
 * Permission to use, copy, modify and distribute this software and its   *
 * documentation strictly for non-commercial purposes is hereby granted   *
 * without fee, provided that the above copyright notice appears in all   *
 * copies and that both the copyright notice and this permission notice   *
 * appear in the supporting documentation. The authors make no claims     *
 * about the suitability of this software for any purpose. It is          *
 * provided "as is" without express or implied warranty.                  *
 **************************************************************************/

/* $Id$ */

///////////////////////////////////////////////////////////////////
//                                                               //
// Implementation of the class to calculate statistical          //
// significance from AliMultiVeector objects with signal and     //
// background counts vs. cut values                              //
// Origin: Francesco Prino (prino@to.infn.it)                    //
//                                                               //
///////////////////////////////////////////////////////////////////

#include "AliMultiDimVector.h"
#include "AliSignificanceCalculator.h"
#include "TMath.h"
#include "AliLog.h"

ClassImp(AliSignificanceCalculator)
//___________________________________________________________________________
AliSignificanceCalculator::AliSignificanceCalculator():
fSignal(0),
fErrSquareSignal(0),
fBackground(0),
fErrSquareBackground(0),
fSignificance(0),
fErrSignificance(0),
fNormSig(1.),  
fNormBkg(1.)
{
  // default constructor
  fSignal=new AliMultiDimVector();
  fBackground=new AliMultiDimVector();
}
//___________________________________________________________________________
AliSignificanceCalculator::AliSignificanceCalculator(AliMultiDimVector* sig, AliMultiDimVector* bkg, Float_t normsig, Float_t normbkg):
fSignal(sig),
fErrSquareSignal(0),
fBackground(bkg),
fErrSquareBackground(0),
fSignificance(0),
fErrSignificance(0),
fNormSig(normsig),
fNormBkg(normbkg)
{
  // standard constructor
  if(fSignal && fBackground) CalculateSignificance();
}
//___________________________________________________________________________
AliSignificanceCalculator::AliSignificanceCalculator(AliMultiDimVector* sig, AliMultiDimVector* bkg, AliMultiDimVector* err2sig, AliMultiDimVector* err2bkg, Float_t normsig, Float_t normbkg):
fSignal(sig),
fErrSquareSignal(err2sig),
fBackground(bkg),
fErrSquareBackground(err2bkg),
fSignificance(0),
fErrSignificance(0),
fNormSig(normsig),
fNormBkg(normbkg)
{
  // standard constructor
  if(fSignal && fBackground) CalculateSignificance();
}
//___________________________________________________________________________
AliSignificanceCalculator::~AliSignificanceCalculator(){
  // destructor
  if(fSignal) delete fSignal;
  if(fBackground) delete fBackground;
  if(fSignificance) delete fSignificance;
  if(fErrSignificance) delete fErrSignificance;
}
//___________________________________________________________________________
Bool_t AliSignificanceCalculator::Check() const {
  // checks AliMultiDimVector dimension and normalization
  if(fSignal==0 || fBackground==0) return kFALSE;
  if(fNormSig==0. || fNormBkg==0.) return kFALSE;
  if(fSignal->GetNTotCells() != fBackground->GetNTotCells()) return kFALSE;
  return kTRUE;
}
//___________________________________________________________________________
void AliSignificanceCalculator::CalculateSignificance(){
  // calculates significance and its error
  if(!Check()) AliFatal("Signal and Background AliMultiDimVector dimensions do not match!");
  
  if(fSignificance) delete fSignificance;
  if(fErrSignificance) delete fErrSignificance;
  fSignificance=new AliMultiDimVector();
  fSignificance->CopyStructure(fSignal);
  fErrSignificance=new AliMultiDimVector();
  fErrSignificance->CopyStructure(fSignal);

  for(ULong64_t i=0;i<fSignal->GetNTotCells();i++) {
    if(fSignal->GetElement(i)!=-1 && fBackground->GetElement(i)!=-1){
      Float_t s=fSignal->GetElement(i)*fNormSig;
      Float_t b=fBackground->GetElement(i)*fNormBkg;
      Float_t signif=0.;
      Float_t errsig=0.;
      if((s+b)>0){ 
	signif=s/TMath::Sqrt(s+b);
	Float_t errs,errb;
	if(fErrSquareSignal) errs=TMath::Sqrt(fErrSquareSignal->GetElement(i))*fNormSig;
	else errs=TMath::Sqrt(fSignal->GetElement(i))*fNormSig; // Poisson statistics
	if(fErrSquareBackground) errb=TMath::Sqrt(fErrSquareBackground->GetElement(i))*fNormBkg;
	else errb=TMath::Sqrt(fBackground->GetElement(i))*fNormBkg; // Poisson
	Float_t dsigds=(s+2*b)/2./(s+b)/TMath::Sqrt(s+b);
	Float_t dsigdb=-s/2./(s+b)/TMath::Sqrt(s+b);
	errsig=TMath::Sqrt(dsigds*dsigds*errs*errs+dsigdb*dsigdb*errb*errb);
      }
      fSignificance->SetElement(i,signif);
      fErrSignificance->SetElement(i,errsig);
    }
  }
  fSignificance->SetNameTitle("Significance","Significance");
  fErrSignificance->SetNameTitle("ErrorOnSignificance","ErrorOnSignificance");
}
//___________________________________________________________________________
AliMultiDimVector* AliSignificanceCalculator::CalculatePurity() const {
  // calculates purity 
  if(!Check()) AliFatal("Signal and Background AliMultiDimVector dimensions do not match!");
  
  AliMultiDimVector* purity=new AliMultiDimVector();
  purity->CopyStructure(fSignal);
  for(ULong64_t i=0;i<fSignal->GetNTotCells();i++) {
    if(fSignal->GetElement(i)!=-1 && fBackground->GetElement(i)!=-1){
      Float_t s=fSignal->GetElement(i)*fNormSig;
      Float_t b=fBackground->GetElement(i)*fNormBkg;
      Float_t pur=0.;
      if((s+b)>0) pur=s/(s+b);
      purity->SetElement(i,pur);
    }
  }
  purity->SetNameTitle("Purity","Purity");
  return purity;
}
//___________________________________________________________________________
AliMultiDimVector* AliSignificanceCalculator::CalculatePurityError() const {
  // calculates error on purity 
  if(!Check()) AliFatal("Signal and Background AliMultiDimVector dimensions do not match!");
  
  AliMultiDimVector* epurity=new AliMultiDimVector();
  epurity->CopyStructure(fSignal);
  for(ULong64_t i=0;i<fSignal->GetNTotCells();i++) {
    if(fSignal->GetElement(i)!=-1 && fBackground->GetElement(i)!=-1){
      Float_t s=fSignal->GetElement(i)*fNormSig;
      Float_t b=fBackground->GetElement(i)*fNormBkg;
      Float_t epur=0.;
      if((s+b)>0){
	Float_t errs,errb;
	if(fErrSquareSignal) errs=TMath::Sqrt(fErrSquareSignal->GetElement(i))*fNormSig;
	else errs=TMath::Sqrt(fSignal->GetElement(i))*fNormSig; // Poisson statistics
	if(fErrSquareBackground) errb=TMath::Sqrt(fErrSquareBackground->GetElement(i))*fNormBkg;
	else errb=TMath::Sqrt(fBackground->GetElement(i))*fNormBkg; // Poisson
	Float_t dpurds=b/(s+b)/(s+b);
	Float_t dpurdb=-s/(s+b)/(s+b);
	epur=TMath::Sqrt(dpurds*dpurds*errs*errs+dpurdb*dpurdb*errb*errb);
      }
      epurity->SetElement(i,epur);
    }
  }
  epurity->SetNameTitle("ErrorOnPurity","ErrorOnPurity");
  return epurity;
}
//___________________________________________________________________________
AliMultiDimVector* AliSignificanceCalculator::CalculateSOverB() const {
  // Signal over Background
  if(!Check()) AliFatal("Signal and Background AliMultiDimVector dimensions do not match!");
  
  AliMultiDimVector* sob=new AliMultiDimVector();
  sob->CopyStructure(fSignal);
  for(ULong64_t i=0;i<fSignal->GetNTotCells();i++) {
    if(fSignal->GetElement(i)!=-1 && fBackground->GetElement(i)!=-1){
      Float_t s=fSignal->GetElement(i)*fNormSig;
      Float_t b=fBackground->GetElement(i)*fNormBkg;
      Float_t soverb=0.;
      if(b>0) soverb=s/b;
      sob->SetElement(i,soverb);
    }
  }
  sob->SetNameTitle("SoverB","SoverB");
  return sob;
}
//___________________________________________________________________________
AliMultiDimVector* AliSignificanceCalculator::CalculateSOverBError() const {
  // Error on Signal over Background
  if(!Check()) AliFatal("Signal and Background AliMultiDimVector dimensions do not match!");
  
  AliMultiDimVector* esob=new AliMultiDimVector();
  esob->CopyStructure(fSignal);
  for(ULong64_t i=0;i<fSignal->GetNTotCells();i++) {
    if(fSignal->GetElement(i)!=-1 && fBackground->GetElement(i)!=-1){
      Float_t s=fSignal->GetElement(i)*fNormSig;
      Float_t b=fBackground->GetElement(i)*fNormBkg;
      Float_t esoverb=0.;
      if(b>0){
	Float_t soverb=s/b;
	Float_t errs,errb;
	if(fErrSquareSignal) errs=TMath::Sqrt(fErrSquareSignal->GetElement(i))*fNormSig;
	else errs=TMath::Sqrt(fSignal->GetElement(i))*fNormSig; // Poisson statistics
	if(fErrSquareBackground) errb=TMath::Sqrt(fErrSquareBackground->GetElement(i))*fNormBkg;
	else errb=TMath::Sqrt(fBackground->GetElement(i))*fNormBkg; // Poisson
	esoverb=soverb*TMath::Sqrt(errs*errs/s/s+errb*errb/b/b);
      }
      esob->SetElement(i,esoverb);
    }
  }
  esob->SetNameTitle("ErrorOnSoverB","ErrorOnSoverB");
  return esob;
}
 AliSignificanceCalculator.cxx:1
 AliSignificanceCalculator.cxx:2
 AliSignificanceCalculator.cxx:3
 AliSignificanceCalculator.cxx:4
 AliSignificanceCalculator.cxx:5
 AliSignificanceCalculator.cxx:6
 AliSignificanceCalculator.cxx:7
 AliSignificanceCalculator.cxx:8
 AliSignificanceCalculator.cxx:9
 AliSignificanceCalculator.cxx:10
 AliSignificanceCalculator.cxx:11
 AliSignificanceCalculator.cxx:12
 AliSignificanceCalculator.cxx:13
 AliSignificanceCalculator.cxx:14
 AliSignificanceCalculator.cxx:15
 AliSignificanceCalculator.cxx:16
 AliSignificanceCalculator.cxx:17
 AliSignificanceCalculator.cxx:18
 AliSignificanceCalculator.cxx:19
 AliSignificanceCalculator.cxx:20
 AliSignificanceCalculator.cxx:21
 AliSignificanceCalculator.cxx:22
 AliSignificanceCalculator.cxx:23
 AliSignificanceCalculator.cxx:24
 AliSignificanceCalculator.cxx:25
 AliSignificanceCalculator.cxx:26
 AliSignificanceCalculator.cxx:27
 AliSignificanceCalculator.cxx:28
 AliSignificanceCalculator.cxx:29
 AliSignificanceCalculator.cxx:30
 AliSignificanceCalculator.cxx:31
 AliSignificanceCalculator.cxx:32
 AliSignificanceCalculator.cxx:33
 AliSignificanceCalculator.cxx:34
 AliSignificanceCalculator.cxx:35
 AliSignificanceCalculator.cxx:36
 AliSignificanceCalculator.cxx:37
 AliSignificanceCalculator.cxx:38
 AliSignificanceCalculator.cxx:39
 AliSignificanceCalculator.cxx:40
 AliSignificanceCalculator.cxx:41
 AliSignificanceCalculator.cxx:42
 AliSignificanceCalculator.cxx:43
 AliSignificanceCalculator.cxx:44
 AliSignificanceCalculator.cxx:45
 AliSignificanceCalculator.cxx:46
 AliSignificanceCalculator.cxx:47
 AliSignificanceCalculator.cxx:48
 AliSignificanceCalculator.cxx:49
 AliSignificanceCalculator.cxx:50
 AliSignificanceCalculator.cxx:51
 AliSignificanceCalculator.cxx:52
 AliSignificanceCalculator.cxx:53
 AliSignificanceCalculator.cxx:54
 AliSignificanceCalculator.cxx:55
 AliSignificanceCalculator.cxx:56
 AliSignificanceCalculator.cxx:57
 AliSignificanceCalculator.cxx:58
 AliSignificanceCalculator.cxx:59
 AliSignificanceCalculator.cxx:60
 AliSignificanceCalculator.cxx:61
 AliSignificanceCalculator.cxx:62
 AliSignificanceCalculator.cxx:63
 AliSignificanceCalculator.cxx:64
 AliSignificanceCalculator.cxx:65
 AliSignificanceCalculator.cxx:66
 AliSignificanceCalculator.cxx:67
 AliSignificanceCalculator.cxx:68
 AliSignificanceCalculator.cxx:69
 AliSignificanceCalculator.cxx:70
 AliSignificanceCalculator.cxx:71
 AliSignificanceCalculator.cxx:72
 AliSignificanceCalculator.cxx:73
 AliSignificanceCalculator.cxx:74
 AliSignificanceCalculator.cxx:75
 AliSignificanceCalculator.cxx:76
 AliSignificanceCalculator.cxx:77
 AliSignificanceCalculator.cxx:78
 AliSignificanceCalculator.cxx:79
 AliSignificanceCalculator.cxx:80
 AliSignificanceCalculator.cxx:81
 AliSignificanceCalculator.cxx:82
 AliSignificanceCalculator.cxx:83
 AliSignificanceCalculator.cxx:84
 AliSignificanceCalculator.cxx:85
 AliSignificanceCalculator.cxx:86
 AliSignificanceCalculator.cxx:87
 AliSignificanceCalculator.cxx:88
 AliSignificanceCalculator.cxx:89
 AliSignificanceCalculator.cxx:90
 AliSignificanceCalculator.cxx:91
 AliSignificanceCalculator.cxx:92
 AliSignificanceCalculator.cxx:93
 AliSignificanceCalculator.cxx:94
 AliSignificanceCalculator.cxx:95
 AliSignificanceCalculator.cxx:96
 AliSignificanceCalculator.cxx:97
 AliSignificanceCalculator.cxx:98
 AliSignificanceCalculator.cxx:99
 AliSignificanceCalculator.cxx:100
 AliSignificanceCalculator.cxx:101
 AliSignificanceCalculator.cxx:102
 AliSignificanceCalculator.cxx:103
 AliSignificanceCalculator.cxx:104
 AliSignificanceCalculator.cxx:105
 AliSignificanceCalculator.cxx:106
 AliSignificanceCalculator.cxx:107
 AliSignificanceCalculator.cxx:108
 AliSignificanceCalculator.cxx:109
 AliSignificanceCalculator.cxx:110
 AliSignificanceCalculator.cxx:111
 AliSignificanceCalculator.cxx:112
 AliSignificanceCalculator.cxx:113
 AliSignificanceCalculator.cxx:114
 AliSignificanceCalculator.cxx:115
 AliSignificanceCalculator.cxx:116
 AliSignificanceCalculator.cxx:117
 AliSignificanceCalculator.cxx:118
 AliSignificanceCalculator.cxx:119
 AliSignificanceCalculator.cxx:120
 AliSignificanceCalculator.cxx:121
 AliSignificanceCalculator.cxx:122
 AliSignificanceCalculator.cxx:123
 AliSignificanceCalculator.cxx:124
 AliSignificanceCalculator.cxx:125
 AliSignificanceCalculator.cxx:126
 AliSignificanceCalculator.cxx:127
 AliSignificanceCalculator.cxx:128
 AliSignificanceCalculator.cxx:129
 AliSignificanceCalculator.cxx:130
 AliSignificanceCalculator.cxx:131
 AliSignificanceCalculator.cxx:132
 AliSignificanceCalculator.cxx:133
 AliSignificanceCalculator.cxx:134
 AliSignificanceCalculator.cxx:135
 AliSignificanceCalculator.cxx:136
 AliSignificanceCalculator.cxx:137
 AliSignificanceCalculator.cxx:138
 AliSignificanceCalculator.cxx:139
 AliSignificanceCalculator.cxx:140
 AliSignificanceCalculator.cxx:141
 AliSignificanceCalculator.cxx:142
 AliSignificanceCalculator.cxx:143
 AliSignificanceCalculator.cxx:144
 AliSignificanceCalculator.cxx:145
 AliSignificanceCalculator.cxx:146
 AliSignificanceCalculator.cxx:147
 AliSignificanceCalculator.cxx:148
 AliSignificanceCalculator.cxx:149
 AliSignificanceCalculator.cxx:150
 AliSignificanceCalculator.cxx:151
 AliSignificanceCalculator.cxx:152
 AliSignificanceCalculator.cxx:153
 AliSignificanceCalculator.cxx:154
 AliSignificanceCalculator.cxx:155
 AliSignificanceCalculator.cxx:156
 AliSignificanceCalculator.cxx:157
 AliSignificanceCalculator.cxx:158
 AliSignificanceCalculator.cxx:159
 AliSignificanceCalculator.cxx:160
 AliSignificanceCalculator.cxx:161
 AliSignificanceCalculator.cxx:162
 AliSignificanceCalculator.cxx:163
 AliSignificanceCalculator.cxx:164
 AliSignificanceCalculator.cxx:165
 AliSignificanceCalculator.cxx:166
 AliSignificanceCalculator.cxx:167
 AliSignificanceCalculator.cxx:168
 AliSignificanceCalculator.cxx:169
 AliSignificanceCalculator.cxx:170
 AliSignificanceCalculator.cxx:171
 AliSignificanceCalculator.cxx:172
 AliSignificanceCalculator.cxx:173
 AliSignificanceCalculator.cxx:174
 AliSignificanceCalculator.cxx:175
 AliSignificanceCalculator.cxx:176
 AliSignificanceCalculator.cxx:177
 AliSignificanceCalculator.cxx:178
 AliSignificanceCalculator.cxx:179
 AliSignificanceCalculator.cxx:180
 AliSignificanceCalculator.cxx:181
 AliSignificanceCalculator.cxx:182
 AliSignificanceCalculator.cxx:183
 AliSignificanceCalculator.cxx:184
 AliSignificanceCalculator.cxx:185
 AliSignificanceCalculator.cxx:186
 AliSignificanceCalculator.cxx:187
 AliSignificanceCalculator.cxx:188
 AliSignificanceCalculator.cxx:189
 AliSignificanceCalculator.cxx:190
 AliSignificanceCalculator.cxx:191
 AliSignificanceCalculator.cxx:192
 AliSignificanceCalculator.cxx:193
 AliSignificanceCalculator.cxx:194
 AliSignificanceCalculator.cxx:195
 AliSignificanceCalculator.cxx:196
 AliSignificanceCalculator.cxx:197
 AliSignificanceCalculator.cxx:198
 AliSignificanceCalculator.cxx:199
 AliSignificanceCalculator.cxx:200
 AliSignificanceCalculator.cxx:201
 AliSignificanceCalculator.cxx:202
 AliSignificanceCalculator.cxx:203
 AliSignificanceCalculator.cxx:204
 AliSignificanceCalculator.cxx:205
 AliSignificanceCalculator.cxx:206
 AliSignificanceCalculator.cxx:207
 AliSignificanceCalculator.cxx:208
 AliSignificanceCalculator.cxx:209
 AliSignificanceCalculator.cxx:210
 AliSignificanceCalculator.cxx:211
 AliSignificanceCalculator.cxx:212
 AliSignificanceCalculator.cxx:213
 AliSignificanceCalculator.cxx:214
 AliSignificanceCalculator.cxx:215
 AliSignificanceCalculator.cxx:216
 AliSignificanceCalculator.cxx:217
 AliSignificanceCalculator.cxx:218
 AliSignificanceCalculator.cxx:219
 AliSignificanceCalculator.cxx:220