1 // $Id: AliJetConstituentTagCopier.cxx $
3 // Copy tags from particle level constituent to detector level
7 #include "AliJetConstituentTagCopier.h"
9 #include <TClonesArray.h>
11 #include <TLorentzVector.h>
13 #include "AliNamedArrayI.h"
14 #include "AliVCluster.h"
15 #include "AliVParticle.h"
16 #include "AliEmcalParticle.h"
19 ClassImp(AliJetConstituentTagCopier)
21 //________________________________________________________________________
22 AliJetConstituentTagCopier::AliJetConstituentTagCopier() :
23 AliAnalysisTaskEmcal("AliJetConstituentTagCopier", kFALSE),
28 // Default constructor.
31 //________________________________________________________________________
32 AliJetConstituentTagCopier::AliJetConstituentTagCopier(const char *name) :
33 AliAnalysisTaskEmcal(name, kFALSE),
34 fMCParticlesName("MCParticles"),
38 // Standard constructor.
41 //________________________________________________________________________
42 AliJetConstituentTagCopier::~AliJetConstituentTagCopier()
47 //________________________________________________________________________
48 void AliJetConstituentTagCopier::ExecOnce()
53 fMCParticles = dynamic_cast<TClonesArray*>(InputEvent()->FindListObject(fMCParticlesName));
55 AliError(Form("%s: Could not retrieve MC particles %s!", GetName(), fMCParticlesName.Data()));
58 else if (!fMCParticles->GetClass()->GetBaseClass("AliVParticle")) {
59 AliError(Form("%s: Collection %s does not contain AliVParticle objects!", GetName(), fMCParticlesName.Data()));
65 if (!fMCParticlesMap) {
66 fMCParticlesMap = dynamic_cast<AliNamedArrayI*>(InputEvent()->FindListObject(fMCParticlesName + "_Map"));
67 // this is needed to map the MC labels with the indexes of the MC particle collection
68 // if teh map is not given, the MC labels are assumed to be consistent with the indexes (which is not the case if AliEmcalMCTrackSelector is used)
69 if (!fMCParticlesMap) {
70 AliWarning(Form("%s: Could not retrieve map for MC particles %s! Will assume MC labels consistent with indexes...", GetName(), fMCParticlesName.Data()));
71 fMCParticlesMap = new AliNamedArrayI("tracksMap",9999);
72 for (Int_t i = 0; i < 9999; i++) {
73 fMCParticlesMap->AddAt(i,i);
78 AliAnalysisTaskEmcal::ExecOnce();
81 //________________________________________________________________________
82 Bool_t AliJetConstituentTagCopier::Run()
85 if (fTracks->GetClass()->GetBaseClass("AliVParticle"))
87 else if (fTracks->GetClass()->GetBaseClass("AliEmcalParticle"))
88 DoEmcalParticleLoop(fTracks);
90 AliError(Form("%s: Object type not recognized in collection %s. Nothing will be done.", GetName(), fTracks->GetName()));
94 if (fCaloClusters->GetClass()->GetBaseClass("AliVCluster"))
95 DoClusterLoop(fCaloClusters);
96 else if (fCaloClusters->GetClass()->GetBaseClass("AliEmcalParticle"))
97 DoEmcalParticleLoop(fCaloClusters);
99 AliError(Form("%s: Object type not recognized in collection %s. Nothing will be done.", GetName(), fCaloClusters->GetName()));
105 //________________________________________________________________________
106 void AliJetConstituentTagCopier::DoClusterLoop(TClonesArray *array)
108 Double_t totalEnergy = 0;
109 for (Int_t i = 0; i < array->GetEntries(); i++) {
110 AliVCluster *cluster = static_cast<AliVCluster*>(array->At(i));
112 AliError(Form("%s: Could not get cluster %d", GetName(), i));
115 if (!AcceptCluster(cluster))
117 Int_t mcLabel = cluster->GetLabel();
120 cluster->GetMomentum(vect, fVertex);
121 AliDebug(2, Form("Cluster %d, pt = %f, eta = %f, phi = %f, label = %d",
122 i, cluster->E(), vect.Eta(), vect.Phi(), mcLabel));
123 totalEnergy += cluster->E();
125 if (mcLabel < fMCParticlesMap->GetSize())
126 index = fMCParticlesMap->At(mcLabel);
129 AliVParticle *part = static_cast<AliVParticle*>(fMCParticles->At(index));
131 AliError(Form("%s: Could not get MC particle %d", GetName(), index));
134 AliDebug(2, Form("Matched with particle %d, pt = %f, eta = %f, phi = %f",
135 index, part->E(), part->Eta(), part->Phi()));
136 UInt_t bits = (UInt_t)part->TestBits(TObject::kBitMask);
137 cluster->SetBit(bits);
141 AliDebug(2, Form("Total energy of MC clusters = %f",
145 //________________________________________________________________________
146 void AliJetConstituentTagCopier::DoTrackLoop(TClonesArray *array)
148 for (Int_t i = 0; i < array->GetEntries(); i++) {
149 AliVParticle *track = static_cast<AliVParticle*>(array->At(i));
151 AliError(Form("%s: Could not get track %d", GetName(), i));
154 if (!AcceptTrack(track))
156 Int_t mcLabel = TMath::Abs(track->GetLabel());
159 if (mcLabel < fMCParticlesMap->GetSize())
160 index = fMCParticlesMap->At(mcLabel);
163 AliVParticle *part = static_cast<AliVParticle*>(fMCParticles->At(index));
165 AliError(Form("%s: Could not get MC particle %d", GetName(), index));
168 AliDebug(3, Form("Track %d, pt = %f, eta = %f, phi = %f, label = %d is matched with particle %d, pt = %f, eta = %f, phi = %f",
169 i, track->Pt(), track->Eta(), track->Phi(), mcLabel, index, part->Pt(), part->Eta(), part->Phi()));
170 UInt_t bits = (UInt_t)part->TestBits(TObject::kBitMask);
176 //________________________________________________________________________
177 void AliJetConstituentTagCopier::DoEmcalParticleLoop(TClonesArray *array)
179 for (Int_t i = 0; i < array->GetEntries(); i++) {
180 AliEmcalParticle *emcpart = static_cast<AliEmcalParticle*>(array->At(i));
182 AliError(Form("%s: Could not get EmcalParticle %d", GetName(), i));
185 if (!AcceptEmcalPart(emcpart))
187 AliVCluster *cluster = emcpart->GetCluster();
188 AliVParticle *track = emcpart->GetTrack();
191 mcLabel = cluster->GetLabel();
193 mcLabel = TMath::Abs(track->GetLabel());
196 if (mcLabel < fMCParticlesMap->GetSize())
197 index = fMCParticlesMap->At(mcLabel);
200 AliVParticle *part = static_cast<AliVParticle*>(fMCParticles->At(index));
202 AliError(Form("%s: Could not get MC particle %d", GetName(), index));
205 UInt_t bits = (UInt_t)part->TestBits(TObject::kBitMask);
206 emcpart->SetBit(bits);