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 **************************************************************************/
16 // Class AliHFEvarManager:
17 // Contains definition of the variables which are filled into the
18 // Correction framework container. The class handles both AliCFContainer and
20 // Defining a new variable which has to be monitored can be done via the
21 // function AddVariable. This function also defines a new dimension for the
22 // particle container and appends it to the list of variables. For a new
23 // track the function NewTrack caches the values to be filled into the
24 // correction framework container. With FillContainer the specified
25 // correction framework container is filled. The VarManager also handles
26 // the filling of the correlation matrices
29 // Markus Fasel <M.Fasel@gsi.de>
35 #include <THnSparse.h>
38 #include "AliCFContainer.h"
40 #include "AliVParticle.h"
42 #include "AliHFEcontainer.h"
43 #include "AliHFEsignalCuts.h"
44 #include "AliHFEvarManager.h"
46 ClassImp(AliHFEvarManager)
47 ClassImp(AliHFEvarManager::AliHFEvariable);
49 //____________________________________________________________
50 AliHFEvarManager::AliHFEvarManager():
60 fWeightFactorsFunction(NULL)
68 //____________________________________________________________
69 AliHFEvarManager::AliHFEvarManager(const Char_t *name):
79 fWeightFactorsFunction(NULL)
82 // Default constructor
84 fVariables = new TObjArray;
88 //____________________________________________________________
89 AliHFEvarManager::AliHFEvarManager(const AliHFEvarManager &ref):
94 fWeightFactor(ref.fWeightFactor),
95 fSignalTrack(ref.fSignalTrack),
96 fWeighting(ref.fWeighting),
99 fWeightFactorsFunction(NULL)
107 //____________________________________________________________
108 AliHFEvarManager &AliHFEvarManager::operator=(const AliHFEvarManager &ref){
110 // Assignment operator
113 this->~AliHFEvarManager();
119 //____________________________________________________________
120 AliHFEvarManager::~AliHFEvarManager(){
125 if(fVariables) delete fVariables;
127 if(fContent) delete[] fContent;
128 if(fContentMC) delete[] fContentMC;
131 //____________________________________________________________
132 void AliHFEvarManager::Copy(TObject &o) const{
136 AliHFEvarManager &target = dynamic_cast<AliHFEvarManager &>(o);
137 target.fVariables = fVariables;
138 target.fContent = new Double_t[sizeof(fContent)/sizeof(Double_t)];
139 target.fContentMC = new Double_t[sizeof(fContentMC)/sizeof(Double_t)];
140 target.fWeightFactor = fWeightFactor;
141 target.fSignalTrack = fSignalTrack;
142 target.fWeighting = fWeighting;
143 target.fSignal = fSignal;
144 target.fWeightFactors = fWeightFactors;
145 target.fWeightFactorsFunction = fWeightFactorsFunction;
146 target.SetOwner(kFALSE);
149 //____________________________________________________________
150 void AliHFEvarManager::AddVariable(TString name){
152 // Add new variable to the var manager
153 // Value derived via GetValue()
155 AliDebug(1, Form("Var Name: %s", name.Data()));
157 if(!name.CompareTo("pt"))
158 fVariables->AddLast(new AliHFEvariable("pt", "pt", kPt, 44, 0.1, 20, kTRUE));
159 else if(!name.CompareTo("eta"))
160 fVariables->AddLast(new AliHFEvariable("eta", "eta", kEta, 8, -0.8, 0.8));
161 else if(!name.CompareTo("phi"))
162 fVariables->AddLast(new AliHFEvariable("phi", "phi", kPhi, 18, -0, 2*TMath::Pi()));
163 else if(!name.CompareTo("charge"))
164 fVariables->AddLast(new AliHFEvariable("charge", "charge", kCharge, 2, -1.1, 1.1));
165 else if(!name.CompareTo("source"))
166 fVariables->AddLast(new AliHFEvariable("source", "source", kSource, 4, 0, 4));
167 else if(!name.CompareTo("centrality"))
168 fVariables->AddLast(new AliHFEvariable("centrality", "centrality", kCentrality, 20, 0.0, 100.0));
169 else if(!name.CompareTo("species"))
170 fVariables->AddLast(new AliHFEvariable("species", "species", kSpecies, 6, -1, 5));
175 //____________________________________________________________
176 void AliHFEvarManager::DefineVariables(AliHFEcontainer *cont){
180 Int_t nVars = fVariables->GetEntriesFast();
181 cont->SetNumberOfVariables(nVars);
182 TIter vars(fVariables);
185 while((var = dynamic_cast<AliHFEvariable *>(vars()))){
186 cont->SetVariableName(counter, var->GetName());
187 if(var->IsLogarithmic())
188 cont->MakeLogarithmicBinning(counter, var->GetNumberOfBins(), var->GetMinimum(), var->GetMaximum());
190 cont->MakeLinearBinning(counter, var->GetNumberOfBins(), var->GetMinimum(), var->GetMaximum());
193 fContent = new Double_t[nVars];
194 memset(fContent, 0, sizeof(Double_t) * nVars);
195 fContentMC = new Double_t[nVars];
196 memset(fContentMC, 0, sizeof(Double_t) * nVars);
199 //____________________________________________________________
200 void AliHFEvarManager::NewTrack(AliVParticle *recTrack, AliVParticle *mcTrack, Float_t centrality, Int_t aprioriPID, Bool_t signal){
202 // Cache information for new track pair
204 AliDebug(1, "Filling new Track");
205 fSignalTrack = signal;
206 FillArray(recTrack, fContent, centrality, aprioriPID);
207 if(mcTrack) FillArray(mcTrack, fContentMC, centrality, aprioriPID);
209 Int_t indexpt = -1, indexeta = -1, indexphi = -1, counter = 0;
210 AliHFEvariable *var = NULL;
211 TIter vars(fVariables);
212 while((var = dynamic_cast<AliHFEvariable *>(vars()))){
213 switch(var->GetVarCode()){
214 case kPt: indexpt = counter; break;
215 case kEta: indexeta = counter; break;
216 case kPhi: indexphi = counter; break;
218 if(indexpt >= 0 && indexeta >= 0 && indexphi >= 0) // all dimensions found
222 if(indexpt >= 0 && indexeta >= 0 && indexphi >= 0)
223 fWeightFactor = FindWeight(fContent[indexpt], fContent[indexeta], fContent[indexphi]);
227 //____________________________________________________________
228 Double_t AliHFEvarManager::GetValue(AliVParticle *track, UInt_t code, Float_t centrality, Int_t aprioriPID) const {
230 // Definition of the variables
232 if(!track) return 0.;
235 case kPt: value = track->Pt(); break;
236 case kEta: value = track->Eta(); break;
237 case kPhi: value = track->Phi(); break;
239 value = track->Charge();
240 if(TString(track->IsA()->GetName()).Contains("MC")) value /= 3;
245 if(fSignal->IsCharmElectron(track)) value = 0;
246 else if(fSignal->IsBeautyElectron(track)) value = 1;
247 else if(fSignal->IsGammaElectron(track)) value = 2;
252 case kSpecies: value = aprioriPID; break;
253 case kCentrality: value = centrality; break;
258 //____________________________________________________________
259 void AliHFEvarManager::FillArray(AliVParticle *track, Double_t* container, Float_t centrality, Int_t aprioriPID) const{
261 // Fill array with variables
263 TIter vars(fVariables);
264 AliHFEvariable *var = NULL;
266 while((var = dynamic_cast<AliHFEvariable *>(vars())))
267 container[counter++] = GetValue(track , var->GetVarCode(), centrality, aprioriPID);
270 //____________________________________________________________
271 void AliHFEvarManager::FillContainer(AliCFContainer *cont, Int_t step, Bool_t useMC) const{
273 // Fill CF container with defined content
276 // Do reweighting if necessary
277 Double_t *content = fContent;
278 if(useMC) content = fContentMC;
279 cont->Fill(content, step, fWeightFactor);
282 //____________________________________________________________
283 void AliHFEvarManager::FillContainer(AliHFEcontainer *cont, const Char_t *contname, UInt_t step, Bool_t useMC, Double_t externalWeight) const {
285 // Fill CF container with defined content
288 // Do reweighting if necessary
289 Double_t *content = fContent;
290 if(useMC) content = fContentMC;
291 cont->FillCFContainer(contname, step, content, fWeightFactor * externalWeight);
294 //____________________________________________________________
295 void AliHFEvarManager::FillContainerStepname(AliHFEcontainer *cont, const Char_t *contname, const Char_t *step, Bool_t useMC, Double_t externalWeight) const {
297 // Fill CF container with defined content
300 // Do reweighting if necessary
301 Double_t *content = fContent;
302 if(useMC) content = fContentMC;
303 cont->FillCFContainerStepname(contname, step, content, fWeightFactor * externalWeight);
306 //____________________________________________________________
307 void AliHFEvarManager::FillCorrelationMatrix(THnSparseF *matrix) const {
309 // Fill Correlation Matrix
312 // Do reweighting if necessary
313 Double_t content[10];
314 memcpy(content, fContent, sizeof(Double_t) * 5);
315 memcpy(&content[5], fContentMC, sizeof(Double_t) * 5);
316 matrix->Fill(content, fWeightFactor);
319 //_______________________________________________
320 void AliHFEvarManager::SetWeightFactors(TH3F *weightFactors){
322 // Set the histos with the weights for the efficiency maps
325 fWeightFactors = weightFactors;
328 //_______________________________________________
329 void AliHFEvarManager::SetWeightFactorsFunction(TF3 *weightFactorsFunction){
331 // Set the histos with the weights for the efficiency maps
334 fWeightFactorsFunction = weightFactorsFunction;
337 //_______________________________________________
338 Double_t AliHFEvarManager::FindWeight(Double_t pt, Double_t eta, Double_t phi) const {
340 // Find the weight corresponding to pt eta and phi in the TH3D
342 Double_t weight = 1.0;
345 TAxis *ptaxis = fWeightFactors->GetXaxis();
346 TAxis *etaaxis = fWeightFactors->GetYaxis();
347 TAxis *phiaxis = fWeightFactors->GetZaxis();
349 Int_t ptbin = ptaxis->FindBin(pt);
350 Int_t etabin = etaaxis->FindBin(eta);
351 Int_t phibin = phiaxis->FindBin(phi);
354 weight = fWeightFactors->GetBinContent(ptbin,etabin,phibin);
356 else if(fWeightFactorsFunction) {
358 weight = fWeightFactorsFunction->Eval(pt,eta,phi);
362 AliDebug(2, Form("pt %f, eta %f, phi %f, weight %f",pt,eta,phi,weight));
367 //_______________________________________________
368 AliHFEvarManager::AliHFEvariable::AliHFEvariable():
374 , fIsLogarithmic(kFALSE)
381 //_______________________________________________
382 AliHFEvarManager::AliHFEvariable::AliHFEvariable(const Char_t *name, const Char_t *title, UInt_t code, UInt_t nBins, Double_t min, Double_t max, Bool_t isLogarithmic):
388 , fIsLogarithmic(isLogarithmic)
391 // Default constructor
395 //_______________________________________________
396 AliHFEvarManager::AliHFEvariable::AliHFEvariable(const AliHFEvarManager::AliHFEvariable &ref):
402 , fIsLogarithmic(ref.fIsLogarithmic)
409 //_______________________________________________
410 AliHFEvarManager::AliHFEvariable& AliHFEvarManager::AliHFEvariable::operator=(const AliHFEvarManager::AliHFEvariable &ref){
412 // Assignment operator
416 TNamed::operator=(ref);
421 fIsLogarithmic = ref.fIsLogarithmic;