1 /*************************************************************************
2 * Copyright(c) 1998-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 **************************************************************************/
16 ///////////////////////////////////////////////////////////////////////////
17 // Dielectron Correction framework manager //
31 ///////////////////////////////////////////////////////////////////////////
35 #include <AliCFContainer.h>
36 #include <AliAnalysisFilter.h>
37 #include <AliAnalysisCuts.h>
40 #include "AliDielectronCF.h"
41 #include "AliDielectronMC.h"
43 ClassImp(AliDielectronCF)
45 AliDielectronCF::AliDielectronCF() :
46 TNamed("DielectronCF","DielectronCF"),
50 fStepsForEachCut(kTRUE),
51 fStepsForCutsIncreasing(kFALSE),
57 // Default constructor
59 for (Int_t i=0; i<AliDielectronVarManager::kNMaxValues; ++i){
63 for (Int_t i=0; i<kNmaxAddSteps; ++i){
64 fNBins[kNmaxAddSteps]=0;
65 fVarLoLimit[kNmaxAddSteps]=0.;
66 fVarUpLimit[kNmaxAddSteps]=0.;
70 //________________________________________________________________
71 AliDielectronCF::AliDielectronCF(const char* name, const char* title) :
76 fStepsForEachCut(kTRUE),
77 fStepsForCutsIncreasing(kFALSE),
85 for (Int_t i=0; i<AliDielectronVarManager::kNMaxValues; ++i){
89 for (Int_t i=0; i<kNmaxAddSteps; ++i){
90 fNBins[kNmaxAddSteps]=0;
91 fVarLoLimit[kNmaxAddSteps]=0.;
92 fVarUpLimit[kNmaxAddSteps]=0.;
96 //________________________________________________________________
97 AliDielectronCF::~AliDielectronCF()
105 //________________________________________________________________
106 void AliDielectronCF::AddVariable(AliDielectronVarManager::ValueTypes type, Int_t nbins, Double_t min, Double_t max)
109 // Add a variable to the CF configuration
111 fVariables[fNVars] = (UInt_t)type;
112 fVarLoLimit[fNVars] = min;
113 fVarUpLimit[fNVars] = max;
114 fNBins[fNVars] = nbins;
118 //________________________________________________________________
119 void AliDielectronCF::InitialiseContainer(const AliAnalysisFilter& filter)
122 // Initialise container based on the cuts in the analysis filter
125 fNCuts=filter.GetCuts()->GetEntries();
127 fNSteps=4; //defaults: 0: MC truth
130 // 3: after all cuts + MC truth
132 if (fStepsForEachCut) fNSteps+=(2*fNCuts); //one step for each cut + MC truth
133 if (fStepsForCutsIncreasing) fNSteps+=(2*(fNCuts-2)); //one step for the increasing cuts + MC truth
134 // e.g. cut2&cut3, cut2&cut3&cut4
135 fNSteps+=(2*fNStepMasks); // cuts for the additional cut masks
136 // create the container
137 fCfContainer = new AliCFContainer(GetName(), GetTitle(), fNSteps, fNVars, fNBins);
139 // initialize the variables and their bin limits
140 for (Int_t iVar=0; iVar<fNVars; iVar++) {
141 UInt_t type=fVariables[iVar];
142 Int_t nBins = fNBins[iVar];
143 Double_t loLim = fVarLoLimit[iVar];
144 Double_t upLim = fVarUpLimit[iVar];
145 Double_t *binLim = new Double_t[nBins+1];
147 // set the bin limits
148 for(Int_t iBin=0; iBin<=nBins; iBin++) binLim[iBin] = loLim + (upLim-loLim) / nBins*(Double_t)iBin;
150 fCfContainer->SetBinLimits(iVar, binLim);
151 fCfContainer->SetVarTitle(iVar, AliDielectronVarManager::GetValueName(type));
155 //=================//
156 // Set step titles //
157 //=================//
161 fCfContainer->SetStepTitle(step++,"MC truth");
163 //before cuts (MC truth)
164 fCfContainer->SetStepTitle(step++,"No cuts (MC truth)");
167 TString cutName="All Cuts"; //TODO: User GetTitle???
168 fCfContainer->SetStepTitle(step++, cutName.Data()); //Step for the cut
169 cutName+=" (MC truth)";
170 fCfContainer->SetStepTitle(step++, cutName.Data()); //Step for the cut with MC truth
173 //Steps for each of the cuts
174 if (fStepsForEachCut){
175 for (Int_t iCut=0; iCut<fNCuts;++iCut) {
176 TString cutName=filter.GetCuts()->At(iCut)->GetName(); //TODO: User GetTitle???
177 fCfContainer->SetStepTitle(step++, cutName.Data()); //Step for the cut
178 cutName+=" (MC truth)";
179 fCfContainer->SetStepTitle(step++, cutName.Data()); //Step for the cut with MC truth
183 //Steps for increasing cut match
184 if (fStepsForCutsIncreasing){
185 TString cutName=filter.GetCuts()->At(0)->GetName(); //TODO: User GetTitle???
186 for (Int_t iCut=1; iCut<fNCuts-1;++iCut) {
188 cutName+=filter.GetCuts()->At(iCut)->GetName();
189 fCfContainer->SetStepTitle(step++, cutName.Data()); //Step for the cut
190 cutName+=" (MC truth)";
191 fCfContainer->SetStepTitle(step++, cutName.Data()); //Step for the cut with MC truth
195 //Steps of user defined cut combinations
196 for (UInt_t iComb=0; iComb<fNStepMasks; ++iComb){
198 UInt_t mask=fStepMasks[iComb];
199 for (Int_t iCut=0; iCut<fNCuts;++iCut) {
201 if (cutName.IsNull()){
202 cutName=filter.GetCuts()->At(iCut)->GetName();
205 cutName+=filter.GetCuts()->At(iCut)->GetName();
209 fCfContainer->SetStepTitle(step++, cutName.Data()); //Step for the cut
210 cutName+=" (MC truth)";
211 fCfContainer->SetStepTitle(step++, cutName.Data()); //Step for the cut with MC truth
215 AliError("Something went wrong in the naming of the steps!!!");
219 //________________________________________________________________
220 void AliDielectronCF::Fill(UInt_t mask, const TObject *particle)
223 // Fill the containers
226 Bool_t isMCTruth=kFALSE;
227 if (fPdgMother>=0) isMCTruth=AliDielectronMC::Instance()->IsMotherPdg(particle,fPdgMother);
229 Double_t valuesAll[AliDielectronVarManager::kNMaxValues];
230 AliDielectronVarManager::Fill(particle,valuesAll);
232 Double_t values[AliDielectronVarManager::kNMaxValues];
233 for (Int_t iVar=0; iVar<fNVars; ++iVar){
234 Int_t var=fVariables[iVar];
235 values[iVar]=valuesAll[var];
238 UInt_t selectedMask=(1<<fNCuts)-1;
243 // step 0 would be full MC truth and is handled in FillMC
247 if (isMCTruth) fCfContainer->Fill(values,step);
251 if (mask == selectedMask){
252 fCfContainer->Fill(values,step);
254 if (isMCTruth) fCfContainer->Fill(values,step);
260 //Steps for each of the cuts
261 if (fStepsForEachCut){
262 for (Int_t iCut=0; iCut<fNCuts;++iCut) {
263 if (mask&(1<<iCut)) {
264 fCfContainer->Fill(values,step);
266 if (isMCTruth) fCfContainer->Fill(values,step);
274 //Steps for increasing cut match
275 if (fStepsForCutsIncreasing){
276 for (Int_t iCut=1; iCut<fNCuts-1;++iCut) {
277 if (mask&(1<<((iCut+1)-1))) {
278 fCfContainer->Fill(values,step);
280 if (isMCTruth) fCfContainer->Fill(values,step);
288 //Steps of user defined cut combinations
289 for (UInt_t iComb=0; iComb<fNStepMasks; ++iComb){
290 UInt_t userMask=fStepMasks[iComb];
292 fCfContainer->Fill(values,step);
294 if (isMCTruth) fCfContainer->Fill(values,step);
303 //________________________________________________________________
304 void AliDielectronCF::FillMC(const TObject *particle)
307 // fill MC part of the Container
309 Double_t valuesAll[AliDielectronVarManager::kNMaxValues];
310 AliDielectronVarManager::Fill(particle,valuesAll);
312 Double_t values[AliDielectronVarManager::kNMaxValues];
313 for (Int_t iVar=0; iVar<fNVars; ++iVar){
314 Int_t var=fVariables[iVar];
315 values[iVar]=valuesAll[var];
317 //TODO: temporary solution, set manually the pair type to 1: mixed e+-
318 values[AliDielectronVarManager::kPairType]=1;
319 fCfContainer->Fill(values,0);