5 // Author: S.Aiola, C.Loizides
7 #include "AliJetModelBaseTask.h"
9 #include <TClonesArray.h>
11 #include <TLorentzVector.h>
14 #include "AliAODCaloCluster.h"
15 #include "AliAnalysisManager.h"
16 #include "AliEMCALDigit.h"
17 #include "AliEMCALGeometry.h"
18 #include "AliEMCALRecPoint.h"
19 #include "AliESDCaloCluster.h"
21 #include "AliPicoTrack.h"
22 #include "AliVCluster.h"
23 #include "AliVEvent.h"
25 ClassImp(AliJetModelBaseTask)
27 //________________________________________________________________________
28 AliJetModelBaseTask::AliJetModelBaseTask() :
29 AliAnalysisTaskSE("AliJetModelBaseTask"),
39 fPhiMax(TMath::Pi() * 2),
54 // Default constructor.
57 //________________________________________________________________________
58 AliJetModelBaseTask::AliJetModelBaseTask(const char *name) :
59 AliAnalysisTaskSE(name),
61 fTracksName("PicoTracks"),
62 fOutTracksName("PicoTracksEmbedded"),
63 fCaloName("CaloClustersCorr"),
64 fOutCaloName("CaloClustersCorrEmbedded"),
69 fPhiMax(TMath::Pi() * 2),
84 // Standard constructor.
87 //________________________________________________________________________
88 AliJetModelBaseTask::~AliJetModelBaseTask()
93 //________________________________________________________________________
94 void AliJetModelBaseTask::UserExec(Option_t *)
105 //________________________________________________________________________
106 AliVCluster* AliJetModelBaseTask::AddCluster(Double_t e, Double_t eta, Double_t phi)
108 // Add a cluster to the event.
111 if (eta < -100 || phi < 0) {
112 GetRandomCell(eta, phi, absId);
115 fGeom->EtaPhiFromIndex(absId, eta, phi);
119 AliWarning(Form("Unable to embed cluster in eta = %f, phi = %f!"
120 " Maybe the eta-phi range is not inside the EMCal acceptance (eta = [%f, %f], phi = [%f, %f])",
121 eta, phi, fEtaMin, fEtaMax, fPhiMin, fPhiMax));
126 Double_t pt = GetRandomPt();
127 TLorentzVector nPart;
128 nPart.SetPtEtaPhiM(pt, eta, phi, 0);
132 return AddCluster(e, absId);
135 //________________________________________________________________________
136 AliVCluster* AliJetModelBaseTask::AddCluster(Double_t e, Int_t absId)
138 // Add a cluster to the event.
140 const Int_t nClusters = fOutClusters->GetEntriesFast();
142 TClonesArray digits("AliEMCALDigit", 1);
144 AliEMCALDigit *digit = static_cast<AliEMCALDigit*>(digits.New(0));
146 digit->SetIndexInList(0);
147 digit->SetType(AliEMCALDigit::kHG);
148 digit->SetAmplitude(e);
150 AliEMCALRecPoint recPoint("");
151 recPoint.AddDigit(*digit, e, kFALSE);
152 recPoint.EvalGlobalPosition(0, &digits);
155 recPoint.GetGlobalPosition(gpos);
159 AliVCluster *cluster = static_cast<AliVCluster*>(fOutClusters->New(nClusters));
160 cluster->SetType(AliVCluster::kEMCALClusterv1);
161 cluster->SetE(recPoint.GetEnergy());
162 cluster->SetPosition(g);
163 cluster->SetNCells(1);
164 UShort_t shortAbsId = absId;
165 cluster->SetCellsAbsId(&shortAbsId);
166 Double32_t fract = 1;
167 cluster->SetCellsAmplitudeFraction(&fract);
168 cluster->SetID(nClusters);
169 cluster->SetEmcCpvDistance(-1);
171 cluster->SetChi2(100); // MC flag!
176 //________________________________________________________________________
177 AliPicoTrack* AliJetModelBaseTask::AddTrack(Double_t pt, Double_t eta, Double_t phi)
179 // Add a track to the event.
181 const Int_t nTracks = fOutTracks->GetEntriesFast();
186 eta = GetRandomEta();
188 phi = GetRandomPhi();
190 Int_t label = fMarkMC ? 100 : 0;
192 AliPicoTrack *track = new ((*fOutTracks)[nTracks]) AliPicoTrack(pt,
203 //________________________________________________________________________
204 void AliJetModelBaseTask::CopyClusters()
206 // Copy all the clusters in the new collection
208 Bool_t esdMode = (Bool_t)(fClusters->GetClass()->GetBaseClass("AliESDCaloCluster") != 0);
209 const Int_t nClusters = fClusters->GetEntriesFast();
210 Int_t nCopiedClusters = 0;
213 for (Int_t i = 0; i < nClusters; ++i) {
214 AliESDCaloCluster *esdcluster = static_cast<AliESDCaloCluster*>(fClusters->At(i));
215 if (!esdcluster || !esdcluster->IsEMCAL())
217 new ((*fOutClusters)[nCopiedClusters]) AliESDCaloCluster(*esdcluster);
222 for (Int_t i = 0; i < nClusters; ++i) {
223 AliAODCaloCluster *aodcluster = static_cast<AliAODCaloCluster*>(fClusters->At(i));
224 if (!aodcluster || !aodcluster->IsEMCAL())
226 new ((*fOutClusters)[nCopiedClusters]) AliAODCaloCluster(*aodcluster);
232 //________________________________________________________________________
233 void AliJetModelBaseTask::CopyTracks()
235 const Int_t nTracks = fTracks->GetEntriesFast();
236 Int_t nCopiedTracks = 0;
237 for (Int_t i = 0; i < nTracks; ++i) {
238 AliPicoTrack *track = static_cast<AliPicoTrack*>(fTracks->At(i));
241 new ((*fOutTracks)[nCopiedTracks]) AliPicoTrack(*track);
246 //________________________________________________________________________
247 void AliJetModelBaseTask::ExecOnce()
251 if (fPtMax < fPtMin) {
252 AliWarning (Form("PtMax (%f) < PtMin (%f), setting PtMax = PtMin = %f", fPtMax, fPtMin, fPtMin));
256 if (fEtaMax < fEtaMin) {
257 AliWarning (Form("EtaMax (%f) < EtaMin (%f), setting EtaMax = EtaMin = %f", fEtaMax, fEtaMin, fEtaMin));
261 if (fPhiMax < fPhiMin) {
262 AliWarning (Form("PhiMax (%f) < PhiMin (%f), setting PhiMax = PhiMin = %f", fPhiMax, fPhiMin, fPhiMin));
266 if (fNTracks > 0 && !fTracks && !fTracksName.IsNull()) {
267 fTracks = dynamic_cast<TClonesArray*>(InputEvent()->FindListObject(fTracksName));
269 AliError(Form("%s: Couldn't retrieve tracks with name %s!", GetName(), fTracksName.Data()));
273 if (!fTracks->GetClass()->GetBaseClass("AliPicoTrack")) {
274 AliError(Form("%s: Collection %s does not contain AliPicoTrack objects!", GetName(), fTracksName.Data()));
280 fOutTracksName = fTracksName;
282 fOutTracksName += fSuffix;
283 fOutTracks = new TClonesArray("AliPicoTrack", fTracks->GetSize());
284 fOutTracks->SetName(fOutTracksName);
287 fOutTracks = fTracks;
292 if (!(InputEvent()->FindListObject(fOutTracksName)))
293 InputEvent()->AddObject(fOutTracks);
297 if (fNClusters > 0 && !fClusters && !fCaloName.IsNull()) {
298 fClusters = dynamic_cast<TClonesArray*>(InputEvent()->FindListObject(fCaloName));
301 AliError(Form("%s: Couldn't retrieve clusters with name %s!", GetName(), fCaloName.Data()));
305 if (!fClusters->GetClass()->GetBaseClass("AliVCluster")) {
306 AliError(Form("%s: Collection %s does not contain AliVCluster objects!", GetName(), fCaloName.Data()));
312 fOutCaloName = fCaloName;
314 fOutCaloName += fSuffix;
315 fOutClusters = new TClonesArray(fClusters->GetClass()->GetName(), fClusters->GetSize());
316 fOutClusters->SetName(fOutCaloName);
319 fOutClusters = fClusters;
324 if (!(InputEvent()->FindListObject(fOutCaloName)))
325 InputEvent()->AddObject(fOutClusters);
329 if (fGeomName.Length() > 0) {
330 fGeom = AliEMCALGeometry::GetInstance(fGeomName);
332 AliError(Form("Could not get geometry with name %s!", fGeomName.Data()));
334 fGeom = AliEMCALGeometry::GetInstance();
336 AliError("Could not get default geometry!");
340 const Double_t EmcalMinEta = fGeom->GetArm1EtaMin();
341 const Double_t EmcalMaxEta = fGeom->GetArm1EtaMax();
342 const Double_t EmcalMinPhi = fGeom->GetArm1PhiMin() * TMath::DegToRad();
343 const Double_t EmcalMaxPhi = fGeom->GetArm1PhiMax() * TMath::DegToRad();
345 if (fEtaMax > EmcalMaxEta) fEtaMax = EmcalMaxEta;
346 if (fEtaMax < EmcalMinEta) fEtaMax = EmcalMinEta;
347 if (fEtaMin > EmcalMaxEta) fEtaMin = EmcalMaxEta;
348 if (fEtaMin < EmcalMinEta) fEtaMin = EmcalMinEta;
350 if (fPhiMax > EmcalMaxPhi) fPhiMax = EmcalMaxPhi;
351 if (fPhiMax < EmcalMinPhi) fPhiMax = EmcalMinPhi;
352 if (fPhiMin > EmcalMaxPhi) fPhiMin = EmcalMaxPhi;
353 if (fPhiMin < EmcalMinPhi) fPhiMin = EmcalMinPhi;
357 //________________________________________________________________________
358 void AliJetModelBaseTask::GetRandomCell(Double_t &eta, Double_t &phi, Int_t &absId)
363 Double_t rndEta = eta;
364 Double_t rndPhi = phi;
367 rndEta = GetRandomEta();
369 rndPhi = GetRandomPhi();
370 fGeom->GetAbsCellIdFromEtaPhi(rndEta, rndPhi, absId);
372 } while (absId == -1 && repeats < 100);
375 AliWarning(Form("Could not extract random cluster! Random eta-phi extracted more than 100 times!\n"
376 "eta [%f, %f], phi [%f, %f]\n", fEtaMin, fEtaMax, fPhiMin, fPhiMax));
384 //________________________________________________________________________
385 Double_t AliJetModelBaseTask::GetRandomEta()
389 return gRandom->Rndm() * (fEtaMax - fEtaMin) + fEtaMin;
392 //________________________________________________________________________
393 Double_t AliJetModelBaseTask::GetRandomPhi()
397 return gRandom->Rndm() * (fPhiMax - fPhiMin) + fPhiMin;
400 //________________________________________________________________________
401 Double_t AliJetModelBaseTask::GetRandomPt()
406 return fPtSpectrum->GetRandom();
408 return gRandom->Rndm() * (fPtMax - fPtMin) + fPtMin;
411 //________________________________________________________________________
412 void AliJetModelBaseTask::Run()