]> git.uio.no Git - u/mrichter/AliRoot.git/blame - PWGHF/hfe/AliHFEsignalCuts.cxx
Update of hfe code
[u/mrichter/AliRoot.git] / PWGHF / hfe / AliHFEsignalCuts.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// Signal cuts
17// Checks whether a particle (reconstructed or MC) is coming from MC Signal
18// For more information see implementation file
19//
20// Autor:
21// Markus Fasel <M.Fasel@gsi.de>
22//
23#include <TClass.h>
24#include <TMath.h>
25#include <TParticle.h>
26#include <TString.h>
27
e156c3bb 28#include "AliAODTrack.h"
3a72645a 29#include "AliAODMCParticle.h"
e156c3bb 30#include "AliESDtrack.h"
3a72645a 31#include "AliLog.h"
32#include "AliMCEvent.h"
33#include "AliMCParticle.h"
34#include "AliVParticle.h"
76d0b522 35#include "TClonesArray.h"
3a72645a 36
37#include "AliHFEsignalCuts.h"
38#include "AliHFEmcQA.h"
39
40ClassImp(AliHFEsignalCuts)
41
42//____________________________________________________________
43AliHFEsignalCuts::AliHFEsignalCuts():
44 AliAnalysisCuts(),
45 fMC(NULL),
76d0b522 46 fAODArrayMCInfo(NULL),
3a72645a 47 fMCQA(NULL)
48{
49 //
50 // Dummy constructor
51 //
52}
53
54//____________________________________________________________
55AliHFEsignalCuts::AliHFEsignalCuts(const Char_t *name, const Char_t *title):
56 AliAnalysisCuts(name, title),
57 fMC(NULL),
76d0b522 58 fAODArrayMCInfo(NULL),
3a72645a 59 fMCQA(NULL)
60{
61 //
62 // Default constructor
63 //
64 fMCQA = new AliHFEmcQA;
65 if(fMCQA) fMCQA->Init();
66}
67
68//____________________________________________________________
69AliHFEsignalCuts::AliHFEsignalCuts(const AliHFEsignalCuts &ref):
70 AliAnalysisCuts(ref),
71 fMC(ref.fMC),
76d0b522 72 fAODArrayMCInfo(NULL),
3a72645a 73 fMCQA(ref.fMCQA)
74{
75 //
76 // Copy constructor
77 //
78}
79
80//____________________________________________________________
81AliHFEsignalCuts &AliHFEsignalCuts::operator=(const AliHFEsignalCuts &ref){
82 //
83 // Assignment operator
84 //
85 if(this != &ref){
76d0b522 86 //fMC = ref.fMC;
87 //fAODArrayMCInfo = ref.fAODArrayMCInfo;
3a72645a 88 fMCQA = ref.fMCQA;
89 }
90 return *this;
91}
92
93//____________________________________________________________
94AliHFEsignalCuts::~AliHFEsignalCuts(){
95 //
96 // Destructor
97 //
98 if(fMCQA) delete fMCQA;
99}
100
101//____________________________________________________________
102void AliHFEsignalCuts::SetMCEvent(AliMCEvent *mc){
103 //
104 // Set mc event
105 //
106 fMC = mc;
107 if(fMCQA) fMCQA->SetMCEvent(mc);
108}
109
110//____________________________________________________________
76d0b522 111void AliHFEsignalCuts::SetMCAODInfo(TClonesArray *mcarray){
112 //
113 // Set mc array info
114 //
115 fAODArrayMCInfo = mcarray;
116 if(fMCQA) fMCQA->SetMCArray(mcarray);
117}
118
119//____________________________________________________________
959ea9d8 120Bool_t AliHFEsignalCuts::IsSelected(TObject *o){
3a72645a 121 //
122 // Define signal as electron coming from charm or beauty
123 // @TODO: Implement setter so that also either of them can be defined
124 // as signal alone
125
126
127 return IsCharmElectron(o) || IsBeautyElectron(o);
128/*
129 //saving time?
130 Int_t esources = GetElecSource(dynamic_cast<const AliVParticle *>(o));
131 if(esources>0)printf("esources= %d\n",esources);
132 if(esources == AliHFEmcQA::kDirectCharm || esources == AliHFEmcQA::kDirectBeauty || esources == AliHFEmcQA::kBeautyCharm) // 1: direct D->e, 2: B->e 3: B->D->e
133 return kTRUE;
134 else
135 return kFALSE;
136*/
137
138}
139
140//____________________________________________________________
141Bool_t AliHFEsignalCuts::IsCharmElectron(const TObject * const o) const {
142 //
143 // Check if mother is coming from Charm
144 //
bf892a6a 145 if(!dynamic_cast<const AliVParticle *>(o)) return kFALSE;
3a72645a 146 Int_t esources = GetElecSource(dynamic_cast<const AliVParticle *>(o));
147 if(esources == AliHFEmcQA::kDirectCharm) // 1: direct D->e
148 return kTRUE;
149 else
150 return kFALSE;
151}
152
153//____________________________________________________________
154Bool_t AliHFEsignalCuts::IsBeautyElectron(const TObject * const o) const {
155 //
156 // Check if mother is coming from Beauty
157 //
bf892a6a 158 if(!dynamic_cast<const AliVParticle *>(o)) return kFALSE;
3a72645a 159 Int_t esources = GetElecSource(dynamic_cast<const AliVParticle *>(o));
160 if(esources == AliHFEmcQA::kDirectBeauty || esources == AliHFEmcQA::kBeautyCharm) // 2: B->e 3: B->D->e
161 return kTRUE;
162 else
163 return kFALSE;
164}
165
166//____________________________________________________________
167Bool_t AliHFEsignalCuts::IsGammaElectron(const TObject * const o) const {
168 //
c2690925 169 // Check for MC if the electron is coming from Gamma
3a72645a 170 //
bf892a6a 171 if(!dynamic_cast<const AliVParticle *>(o)) return kFALSE;
3a72645a 172 Int_t esources = GetElecSource(dynamic_cast<const AliVParticle *>(o));
c2690925 173 if(esources >= AliHFEmcQA::kGammaPi0 && esources <= AliHFEmcQA::kGammaRho0 ) // 4: conversion electrons
174 //if(esources == AliHFEmcQA::kGammaPi0 || esources == AliHFEmcQA::kGammaEta || esources == AliHFEmcQA::kGammaOmega || esources == AliHFEmcQA::kGammaPhi || esources == AliHFEmcQA::kGammaEtaPrime || esources == AliHFEmcQA::kGammaRho0 ) // 4: conversion electrons
175 return kTRUE;
176 else
177 return kFALSE;
178}
179
180//____________________________________________________________
181Bool_t AliHFEsignalCuts::IsNonHFElectron(const TObject * const o) const {
182 //
183 // Check for MC if the electron is coming from NonHFE except for conversion
184 //
185 if(!dynamic_cast<const AliVParticle *>(o)) return kFALSE;
11ff28c5 186 Int_t esources = GetElecSource(dynamic_cast<const AliVParticle *>(o));
c2690925 187 if(esources == AliHFEmcQA:: kPi0 || esources == AliHFEmcQA::kEta || esources == AliHFEmcQA::kOmega || esources == AliHFEmcQA::kPhi || esources == AliHFEmcQA::kEtaPrime || esources == AliHFEmcQA::kRho0) // 4: conversion electrons
3a72645a 188 return kTRUE;
189 else
190 return kFALSE;
191}
11ff28c5 192
c2690925 193//____________________________________________________________
11ff28c5 194Bool_t AliHFEsignalCuts::IsJpsiElectron(const TObject * const o) const {
195 //
196 // Check if mother is coming from Charm
197 //
198 if(!dynamic_cast<const AliVParticle *>(o)) return kFALSE;
199 Int_t esources = GetElecSource(dynamic_cast<const AliVParticle *>(o));
200 if(esources == AliHFEmcQA::kJpsi) // 5: J/psi->ee
201 return kTRUE;
202 else
203 return kFALSE;
204}
205
206//____________________________________________________________
207Bool_t AliHFEsignalCuts::IsB2JpsiElectron(const TObject * const o) const {
208 //
209 // Check if mother is coming from Charm
210 //
211 if(!dynamic_cast<const AliVParticle *>(o)) return kFALSE;
212 Int_t esources = GetElecSource(dynamic_cast<const AliVParticle *>(o));
213 if(esources == AliHFEmcQA::kB2Jpsi) // 6: B->Jpsi->ee
214 return kTRUE;
215 else
216 return kFALSE;
217}
218
219//____________________________________________________________
220Bool_t AliHFEsignalCuts::IsKe3Electron(const TObject * const o) const {
221 //
222 // Check if mother is coming from Charm
223 //
224 if(!dynamic_cast<const AliVParticle *>(o)) return kFALSE;
225 Int_t esources = GetElecSource(dynamic_cast<const AliVParticle *>(o));
226 if(esources == AliHFEmcQA::kKe3) // 7: K->e
227 return kTRUE;
228 else
229 return kFALSE;
230}
3a72645a 231
232/*
233//____________________________________________________________
234Bool_t AliHFEsignalCuts::IsCharmElectron(const TObject * const o) const {
235 //
236 // Check if mother is coming from Charm
237 //
238 if(TMath::Abs(GetTrackPDG(dynamic_cast<const AliVParticle *>(o))) != 11) return kFALSE;
239 Int_t motherpdg = TMath::Abs(GetMotherPDG(dynamic_cast<const AliVParticle *>(o)));
240 AliDebug(1, Form("Mother PDG %d\n", motherpdg));
241
242 if((motherpdg % 1000) / 100 == 4) return kTRUE; // charmed meson, 3rd position in pdg code == 4
243 if(motherpdg / 1000 == 4) return kTRUE; // charmed baryon, 4th position in pdg code == 4
244 AliDebug(1, "No Charm\n");
245 return kFALSE;
246}
247
248//____________________________________________________________
249Bool_t AliHFEsignalCuts::IsBeautyElectron(const TObject * const o) const {
250 //
251 // Check if mother is coming from Beauty
252 //
253 if(TMath::Abs(GetTrackPDG(dynamic_cast<const AliVParticle *>(o))) != 11) return kFALSE;
254 Int_t motherpdg = TMath::Abs(GetMotherPDG(dynamic_cast<const AliVParticle *>(o)));
255 AliDebug(1, Form("Mother PDG %d\n", motherpdg));
256
257 if((motherpdg % 1000) / 100 == 5) return kTRUE; // beauty meson, 3rd position in pdg code == 5
258 if(motherpdg / 1000 == 5) return kTRUE; // beauty baryon, 4th position in pdg code == 5
259 AliDebug(1, "No Beauty\n");
260 return kFALSE;
261}
262
263//____________________________________________________________
264Bool_t AliHFEsignalCuts::IsGammaElectron(const TObject * const o) const {
265 //
266 // Check for MC if the electron is coming from Gamma
267 //
268 if(TMath::Abs(GetTrackPDG(dynamic_cast<const AliVParticle *>(o))) != 11) return kFALSE;
269 Int_t motherpdg = TMath::Abs(GetMotherPDG(dynamic_cast<const AliVParticle *>(o)));
270 AliDebug(1, Form("Mother PDG %d\n", motherpdg));
271
272 if(motherpdg!=22){
273 AliDebug(1, "No Gamma");
274 return kFALSE;
275 } else {
276 AliDebug(1, "Gamma");
277 return kTRUE;
278 }
279}
280*/
281
282//____________________________________________________________
283Int_t AliHFEsignalCuts::GetMotherPDG(const AliVParticle * const track) const {
284 //
285 // Get Mother Pdg code for reconstructed respectively MC tracks
286 //
76d0b522 287 TClass *type = track->IsA();
288 if((!fMC && (type == AliESDtrack::Class())) || (!fAODArrayMCInfo && (type == AliAODTrack::Class()))){
3a72645a 289 AliDebug(1, "No MC Event Available\n");
290 return 0;
291 }
292 const AliVParticle *motherParticle = NULL, *mctrack = NULL;
76d0b522 293 Int_t label = TMath::Abs(track->GetLabel());
294 if(type == AliESDtrack::Class()){
3a72645a 295 // Reconstructed track
76d0b522 296 if(label) mctrack = fMC->GetTrack(TMath::Abs(label));
297
298 }
299 else if(type == AliAODTrack::Class()) {
3a72645a 300 // MCParticle
76d0b522 301 if(label && label < fAODArrayMCInfo->GetEntriesFast())
302 mctrack = (AliVParticle *) fAODArrayMCInfo->At(label);
303 }
304 else {
305 mctrack=track;
3a72645a 306 }
307
308 if(!mctrack) return 0;
309
310 Int_t motherPDG = 0;
311 if(TString(mctrack->IsA()->GetName()).CompareTo("AliMCParticle") == 0){
312 // case MC Particle
bf892a6a 313 const AliMCParticle *esdmctrack = dynamic_cast<const AliMCParticle *>(mctrack);
314 if(esdmctrack) motherParticle = fMC->GetTrack(esdmctrack->Particle()->GetFirstMother());
315 if(motherParticle){
316 const AliMCParticle *esdmcmother = dynamic_cast<const AliMCParticle *>(motherParticle);
317 if(esdmcmother) motherPDG = TMath::Abs(esdmcmother->Particle()->GetPdgCode());
318 }
3a72645a 319 } else {
320 // case AODMCParticle
bf892a6a 321 const AliAODMCParticle *aodmctrack = dynamic_cast<const AliAODMCParticle *>(mctrack);
76d0b522 322 if(aodmctrack) {
323 if(aodmctrack->GetMother() && aodmctrack->GetMother() < fAODArrayMCInfo->GetEntriesFast())
324 motherParticle = (AliVParticle *) fAODArrayMCInfo->At(aodmctrack->GetMother());
325 }
bf892a6a 326 if(motherParticle){
327 const AliAODMCParticle *aodmcmother = dynamic_cast<const AliAODMCParticle *>(motherParticle);
328 if(aodmcmother) motherPDG = TMath::Abs(aodmcmother->GetPdgCode());
329 }
3a72645a 330 }
331 return motherPDG;
332}
333
334//____________________________________________________________
335Int_t AliHFEsignalCuts::GetTrackPDG(const AliVParticle * const track) const {
76d0b522 336 //
337 // Return PDG code of a particle itself
338 //
339 TClass *type = track->IsA();
340 if((!fMC && (type == AliESDtrack::Class())) || (!fAODArrayMCInfo && (type == AliAODTrack::Class()))){
3a72645a 341 AliDebug(1, "No MC Event Available\n");
342 return 0;
343 }
76d0b522 344 const AliVParticle *mctrack = NULL;
345 Int_t label = TMath::Abs(track->GetLabel());
346 if(type == AliESDtrack::Class()){
347 // Reconstructed track
348 if(label) mctrack = fMC->GetTrack(TMath::Abs(label));
349
350 }
351 else if(type == AliAODTrack::Class()) {
352 // MCParticle
353 if(label && label < fAODArrayMCInfo->GetEntriesFast())
354 mctrack = (AliVParticle *) fAODArrayMCInfo->At(label);
355 }
356 else {
357 mctrack=track;
358 }
359
360 if(!mctrack) return 0;
361
362 TString mctype = mctrack->IsA()->GetName();
363 Int_t trackPdg = 0;
364 if(!mctype.CompareTo("AliMCParticle")){
365 const AliMCParticle *esdmc = dynamic_cast<const AliMCParticle *>(mctrack);
366 if(esdmc) trackPdg = esdmc->Particle()->GetPdgCode();
367 } else {
368 const AliAODMCParticle *aodmc = dynamic_cast< const AliAODMCParticle *>(mctrack);
369 if(aodmc) trackPdg = aodmc->GetPdgCode();
370 }
371 return trackPdg;
3a72645a 372}
373
374//____________________________________________________________
375Int_t AliHFEsignalCuts::GetElecSource(const AliVParticle * const track) const {
76d0b522 376 //
377 // Return PDG code of a particle itself
378 //
379
380 TClass *type = track->IsA();
381 if((!fMC && (type == AliESDtrack::Class())) || (!fAODArrayMCInfo && (type == AliAODTrack::Class()))){
e3ae862b 382 AliDebug(1, "No MC Event Available\n");
383 return 0;
384 }
385 if(!fMCQA){
386 AliDebug(1, "No MCQA Available\n");
387 return 0;
388 }
389 if(!track){
390 AliDebug(1, "Track not Available\n");
391 return 0;
392 }
3a72645a 393
e3ae862b 394 const AliVParticle *mctrack = NULL;
395 TParticle *mcpart = NULL;
76d0b522 396 Int_t label = TMath::Abs(track->GetLabel());
a8ef1999 397 //AliMCParticle *esdmcmother = NULL;
76d0b522 398 if(type == AliESDtrack::Class()){
399 // Reconstructed track
400 if(label) mctrack = fMC->GetTrack(TMath::Abs(label));
401
402 }
403 else if(type == AliAODTrack::Class()) {
404 // MCParticle
405 if(label && label < fAODArrayMCInfo->GetEntriesFast())
406 mctrack = (AliVParticle *) fAODArrayMCInfo->At(label);
407 }
408 else {
409 mctrack=track;
410 }
e3ae862b 411 if(!mctrack) return 0;
3a72645a 412
e3ae862b 413 Int_t eSource = 0;
e156c3bb 414 if(mctrack->IsA() == AliMCParticle::Class()){
e3ae862b 415 const AliMCParticle *esdmc = dynamic_cast<const AliMCParticle *>(mctrack);
416 if(esdmc){
417 mcpart = esdmc->Particle();
418 eSource=fMCQA->GetElecSource(mcpart);
a8ef1999 419/* // considering secondary pions
420 if(eSource>=AliHFEmcQA::kGammaPi0) { // conversion electron, be careful with the enum odering
421 Int_t glabel=TMath::Abs(esdmc->GetMother()); // gamma label
422 if((esdmcmother= dynamic_cast<AliMCParticle *>(fMC->GetTrack(glabel)))){
423 glabel=TMath::Abs(esdmcmother->GetMother()); // gamma's mother's label
424 if((esdmcmother= dynamic_cast<AliMCParticle *>(fMC->GetTrack(glabel)))){
425 if(glabel>fMC->GetNumberOfPrimaries()) eSource=AliHFEmcQA::kElse;
426 }
427 }
428 }
429 else if(eSource==AliHFEmcQA::kPi0 || (eSource>=AliHFEmcQA::kEta && eSource<=AliHFEmcQA::kRho0) ){ // nonHFE except for the conversion electron
430 Int_t glabel=TMath::Abs(esdmc->GetMother());
431 if((esdmcmother= dynamic_cast<AliMCParticle *>(fMC->GetTrack(glabel)))){
432 if(glabel>fMC->GetNumberOfPrimaries()) eSource=AliHFEmcQA::kElse;
433 }
434 }
435*/
e3ae862b 436 }
437 } else {
76d0b522 438 eSource=fMCQA->GetElecSource(mctrack);
e3ae862b 439 }
440 return eSource;
3a72645a 441}