]> git.uio.no Git - u/mrichter/AliRoot.git/blame - PWG3/hfe/AliHFEvarManager.cxx
Various updates, including corrections for code rule violations
[u/mrichter/AliRoot.git] / PWG3 / hfe / AliHFEvarManager.cxx
CommitLineData
3a72645a 1/**************************************************************************
2* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
3* *
4* Author: The ALICE Off-line Project. *
5* Contributors are mentioned in the code where appropriate. *
6* *
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**************************************************************************/
15//
16// Class AliHFEvarManager:
17// Contains definition of the variables which are filled into the
18// Correction framework container. The class handles both AliCFContainer and
19// AliHFEcontainer.
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
27//
28// Author:
29// Markus Fasel <M.Fasel@gsi.de>
30//
31#include <TClass.h>
32#include <TH3.h>
33#include <TF3.h>
34#include <TMath.h>
35#include <THnSparse.h>
36#include <TString.h>
37
38#include "AliCFContainer.h"
39#include "AliLog.h"
40#include "AliVParticle.h"
41
42#include "AliHFEcontainer.h"
43#include "AliHFEsignalCuts.h"
44#include "AliHFEvarManager.h"
45
46ClassImp(AliHFEvarManager)
47ClassImp(AliHFEvarManager::AliHFEvariable);
48
49//____________________________________________________________
50AliHFEvarManager::AliHFEvarManager():
51 TNamed(),
52 fVariables(NULL),
53 fContent(NULL),
54 fContentMC(NULL),
55 fWeightFactor(1.),
56 fSignalTrack(kTRUE),
57 fWeighting(kFALSE),
58 fSignal(NULL),
59 fWeightFactors(NULL),
60 fWeightFactorsFunction(NULL)
61{
62 //
63 // Dummy constructor
64 //
65 SetOwner();
66}
67
68//____________________________________________________________
69AliHFEvarManager::AliHFEvarManager(const Char_t *name):
70 TNamed(name, ""),
71 fVariables(NULL),
72 fContent(NULL),
73 fContentMC(NULL),
74 fWeightFactor(1.),
75 fSignalTrack(kTRUE),
76 fWeighting(kFALSE),
77 fSignal(NULL),
78 fWeightFactors(NULL),
79 fWeightFactorsFunction(NULL)
80{
81 //
82 // Default constructor
83 //
84 fVariables = new TObjArray;
85 SetOwner();
86}
87
88//____________________________________________________________
89AliHFEvarManager::AliHFEvarManager(const AliHFEvarManager &ref):
90 TNamed(ref),
91 fVariables(NULL),
92 fContent(NULL),
93 fContentMC(NULL),
94 fWeightFactor(ref.fWeightFactor),
95 fSignalTrack(ref.fSignalTrack),
96 fWeighting(ref.fWeighting),
97 fSignal(NULL),
98 fWeightFactors(NULL),
99 fWeightFactorsFunction(NULL)
100{
101 //
102 // Copy Constructor
103 //
104 ref.Copy(*this);
105}
106
107//____________________________________________________________
108AliHFEvarManager &AliHFEvarManager::operator=(const AliHFEvarManager &ref){
109 //
110 // Assignment operator
111 //
112 if(&ref != this){
113 this->~AliHFEvarManager();
114 ref.Copy(*this);
115 }
116 return *this;
117}
118
119//____________________________________________________________
120AliHFEvarManager::~AliHFEvarManager(){
121 //
122 // Destructor
123 //
124 if(IsOwner()){
125 if(fVariables) delete fVariables;
126 }
127 if(fContent) delete[] fContent;
128 if(fContentMC) delete[] fContentMC;
129}
130
131//____________________________________________________________
132void AliHFEvarManager::Copy(TObject &o) const{
133 //
134 // Make Copy
135 //
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);
147}
148
149//____________________________________________________________
150void AliHFEvarManager::AddVariable(TString name){
151 //
152 // Add new variable to the var manager
153 // Value derived via GetValue()
154 //
155 AliDebug(1, Form("Var Name: %s", name.Data()));
156
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"))
6555e2ad 168 fVariables->AddLast(new AliHFEvariable("centrality", "centrality", kCentrality, 11, 0.0, 11.0));
3a72645a 169 else if(!name.CompareTo("species"))
170 fVariables->AddLast(new AliHFEvariable("species", "species", kSpecies, 6, -1, 5));
171
172 // More to come ...
173}
174
6555e2ad 175//____________________________________________________________
176Bool_t AliHFEvarManager::IsVariableDefined(TString name){
177 //
178 // Add new variable to the var manager
179 // Value derived via GetValue()
180 //
181 AliDebug(1, Form("Var Name: %s", name.Data()));
182
183 AliHFEvariable *u = (AliHFEvariable *) fVariables->FindObject((const char*)name);
184 if(u) return kTRUE;
185 else return kFALSE;
186
187 // More to come ...
188}
189
3a72645a 190//____________________________________________________________
191void AliHFEvarManager::DefineVariables(AliHFEcontainer *cont){
192 //
193 // Define Variables
194 //
195 Int_t nVars = fVariables->GetEntriesFast();
196 cont->SetNumberOfVariables(nVars);
197 TIter vars(fVariables);
198 AliHFEvariable *var;
199 Int_t counter = 0;
200 while((var = dynamic_cast<AliHFEvariable *>(vars()))){
201 cont->SetVariableName(counter, var->GetName());
202 if(var->IsLogarithmic())
203 cont->MakeLogarithmicBinning(counter, var->GetNumberOfBins(), var->GetMinimum(), var->GetMaximum());
204 else
205 cont->MakeLinearBinning(counter, var->GetNumberOfBins(), var->GetMinimum(), var->GetMaximum());
206 counter++;
207 }
208 fContent = new Double_t[nVars];
209 memset(fContent, 0, sizeof(Double_t) * nVars);
210 fContentMC = new Double_t[nVars];
211 memset(fContentMC, 0, sizeof(Double_t) * nVars);
212}
213
214//____________________________________________________________
215void AliHFEvarManager::NewTrack(AliVParticle *recTrack, AliVParticle *mcTrack, Float_t centrality, Int_t aprioriPID, Bool_t signal){
216 //
217 // Cache information for new track pair
218 //
219 AliDebug(1, "Filling new Track");
220 fSignalTrack = signal;
221 FillArray(recTrack, fContent, centrality, aprioriPID);
222 if(mcTrack) FillArray(mcTrack, fContentMC, centrality, aprioriPID);
223 if(fWeighting){
224 Int_t indexpt = -1, indexeta = -1, indexphi = -1, counter = 0;
225 AliHFEvariable *var = NULL;
226 TIter vars(fVariables);
227 while((var = dynamic_cast<AliHFEvariable *>(vars()))){
228 switch(var->GetVarCode()){
229 case kPt: indexpt = counter; break;
230 case kEta: indexeta = counter; break;
231 case kPhi: indexphi = counter; break;
232 };
233 if(indexpt >= 0 && indexeta >= 0 && indexphi >= 0) // all dimensions found
234 break;
235 counter++;
236 }
237 if(indexpt >= 0 && indexeta >= 0 && indexphi >= 0)
238 fWeightFactor = FindWeight(fContent[indexpt], fContent[indexeta], fContent[indexphi]);
239 }
240}
241
242//____________________________________________________________
243Double_t AliHFEvarManager::GetValue(AliVParticle *track, UInt_t code, Float_t centrality, Int_t aprioriPID) const {
244 //
245 // Definition of the variables
246 //
247 if(!track) return 0.;
248 Double_t value = 0.;
249 switch(code){
250 case kPt: value = track->Pt(); break;
251 case kEta: value = track->Eta(); break;
252 case kPhi: value = track->Phi(); break;
253 case kCharge:{
254 value = track->Charge();
255 if(TString(track->IsA()->GetName()).Contains("MC")) value /= 3;
256 break;
257 }
258 case kSource:{
259 if(fSignal){
260 if(fSignal->IsCharmElectron(track)) value = 0;
261 else if(fSignal->IsBeautyElectron(track)) value = 1;
262 else if(fSignal->IsGammaElectron(track)) value = 2;
263 else value = 3;
264 }
265 break;
266 }
267 case kSpecies: value = aprioriPID; break;
268 case kCentrality: value = centrality; break;
269 };
270 return value;
271}
272
273//____________________________________________________________
274void AliHFEvarManager::FillArray(AliVParticle *track, Double_t* container, Float_t centrality, Int_t aprioriPID) const{
275 //
276 // Fill array with variables
277 //
278 TIter vars(fVariables);
279 AliHFEvariable *var = NULL;
280 Int_t counter = 0;
281 while((var = dynamic_cast<AliHFEvariable *>(vars())))
282 container[counter++] = GetValue(track , var->GetVarCode(), centrality, aprioriPID);
283}
284
285//____________________________________________________________
286void AliHFEvarManager::FillContainer(AliCFContainer *cont, Int_t step, Bool_t useMC) const{
287 //
288 // Fill CF container with defined content
289 //
290
291 // Do reweighting if necessary
292 Double_t *content = fContent;
293 if(useMC) content = fContentMC;
294 cont->Fill(content, step, fWeightFactor);
295}
296
297//____________________________________________________________
298void AliHFEvarManager::FillContainer(AliHFEcontainer *cont, const Char_t *contname, UInt_t step, Bool_t useMC, Double_t externalWeight) const {
299 //
300 // Fill CF container with defined content
301 //
302
303 // Do reweighting if necessary
304 Double_t *content = fContent;
305 if(useMC) content = fContentMC;
306 cont->FillCFContainer(contname, step, content, fWeightFactor * externalWeight);
307}
308
309//____________________________________________________________
310void AliHFEvarManager::FillContainerStepname(AliHFEcontainer *cont, const Char_t *contname, const Char_t *step, Bool_t useMC, Double_t externalWeight) const {
311 //
312 // Fill CF container with defined content
313 //
314
315 // Do reweighting if necessary
316 Double_t *content = fContent;
317 if(useMC) content = fContentMC;
318 cont->FillCFContainerStepname(contname, step, content, fWeightFactor * externalWeight);
319}
320
321//____________________________________________________________
322void AliHFEvarManager::FillCorrelationMatrix(THnSparseF *matrix) const {
323 //
324 // Fill Correlation Matrix
325 //
326
327 // Do reweighting if necessary
328 Double_t content[10];
329 memcpy(content, fContent, sizeof(Double_t) * 5);
330 memcpy(&content[5], fContentMC, sizeof(Double_t) * 5);
331 matrix->Fill(content, fWeightFactor);
332}
333
334//_______________________________________________
335void AliHFEvarManager::SetWeightFactors(TH3F *weightFactors){
336 //
337 // Set the histos with the weights for the efficiency maps
338 //
339 fWeighting = kTRUE;
340 fWeightFactors = weightFactors;
341}
342
343//_______________________________________________
344void AliHFEvarManager::SetWeightFactorsFunction(TF3 *weightFactorsFunction){
345 //
346 // Set the histos with the weights for the efficiency maps
347 //
348 fWeighting = kTRUE;
349 fWeightFactorsFunction = weightFactorsFunction;
350}
351
352//_______________________________________________
353Double_t AliHFEvarManager::FindWeight(Double_t pt, Double_t eta, Double_t phi) const {
354 //
355 // Find the weight corresponding to pt eta and phi in the TH3D
356 //
357 Double_t weight = 1.0;
358 if(fWeightFactors) {
359
360 TAxis *ptaxis = fWeightFactors->GetXaxis();
361 TAxis *etaaxis = fWeightFactors->GetYaxis();
362 TAxis *phiaxis = fWeightFactors->GetZaxis();
363
364 Int_t ptbin = ptaxis->FindBin(pt);
365 Int_t etabin = etaaxis->FindBin(eta);
366 Int_t phibin = phiaxis->FindBin(phi);
367
368
369 weight = fWeightFactors->GetBinContent(ptbin,etabin,phibin);
370 }
371 else if(fWeightFactorsFunction) {
372
373 weight = fWeightFactorsFunction->Eval(pt,eta,phi);
374
375 }
376
377 AliDebug(2, Form("pt %f, eta %f, phi %f, weight %f",pt,eta,phi,weight));
378
379 return weight;
380}
381
382//_______________________________________________
383AliHFEvarManager::AliHFEvariable::AliHFEvariable():
384 TNamed()
385 , fCode(0)
386 , fNBins(0)
387 , fMin(0)
388 , fMax(0)
389 , fIsLogarithmic(kFALSE)
390{
391 //
392 // Dummy constructor
393 //
394}
395
396//_______________________________________________
397AliHFEvarManager::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):
398 TNamed(name, title)
399 , fCode(code)
400 , fNBins(nBins)
401 , fMin(min)
402 , fMax(max)
403 , fIsLogarithmic(isLogarithmic)
404{
405 //
406 // Default constructor
407 //
408}
409
410//_______________________________________________
411AliHFEvarManager::AliHFEvariable::AliHFEvariable(const AliHFEvarManager::AliHFEvariable &ref):
412 TNamed(ref)
413 , fCode(ref.fCode)
414 , fNBins(ref.fNBins)
415 , fMin(ref.fMin)
416 , fMax(ref.fMax)
417 , fIsLogarithmic(ref.fIsLogarithmic)
418{
419 //
420 // Copy constructor
421 //
422}
423
424//_______________________________________________
425AliHFEvarManager::AliHFEvariable& AliHFEvarManager::AliHFEvariable::operator=(const AliHFEvarManager::AliHFEvariable &ref){
426 //
427 // Assignment operator
428 //
429
430 if(&ref != this){
431 TNamed::operator=(ref);
432 fCode = ref.fCode;
433 fNBins = ref.fNBins;
434 fMax = ref.fMax;
435 fMin = ref.fMin;
436 fIsLogarithmic = ref.fIsLogarithmic;
437 }
438 return *this;
439}
440