5 // Author: S.Aiola, C.Loizides
7 #include <TClonesArray.h>
8 #include <TLorentzVector.h>
11 #include "AliAnalysisManager.h"
12 #include "AliVEvent.h"
13 #include "AliVCluster.h"
14 #include "AliEMCALDigit.h"
15 #include "AliEMCALRecPoint.h"
16 #include "AliPicoTrack.h"
17 #include "AliEMCALGeometry.h"
20 #include "AliJetModelBaseTask.h"
22 ClassImp(AliJetModelBaseTask)
24 //________________________________________________________________________
25 AliJetModelBaseTask::AliJetModelBaseTask() :
26 AliAnalysisTaskSE("AliJetModelBaseTask"),
36 fPhiMax(TMath::Pi() * 2),
48 // Default constructor.
51 //________________________________________________________________________
52 AliJetModelBaseTask::AliJetModelBaseTask(const char *name) :
53 AliAnalysisTaskSE(name),
55 fTracksName("PicoTracks"),
56 fOutTracksName("PicoTracksEmbedded"),
57 fCaloName("CaloClustersCorr"),
58 fOutCaloName("CaloClustersCorrEmbedded"),
63 fPhiMax(TMath::Pi() * 2),
75 // Standard constructor.
78 //________________________________________________________________________
79 AliJetModelBaseTask::~AliJetModelBaseTask()
84 //________________________________________________________________________
85 void AliJetModelBaseTask::Init()
89 if (fPtMax < fPtMin) {
90 AliWarning (Form("PtMax (%f) < PtMin (%f), setting PtMax = PtMin = %f", fPtMax, fPtMin, fPtMin));
94 if (fEtaMax < fEtaMin) {
95 AliWarning (Form("EtaMax (%f) < EtaMin (%f), setting EtaMax = EtaMin = %f", fEtaMax, fEtaMin, fEtaMin));
99 if (fPhiMax < fPhiMin) {
100 AliWarning (Form("PhiMax (%f) < PhiMin (%f), setting PhiMax = PhiMin = %f", fPhiMax, fPhiMin, fPhiMin));
105 fTracks = dynamic_cast<TClonesArray*>(InputEvent()->FindListObject(fTracksName));
107 AliError(Form("Couldn't retrieve tracks with name %s!", fTracksName.Data()));
111 if (strcmp(fTracks->GetClass()->GetName(), "AliPicoTrack")) {
112 AliError("Can only embed PicoTracks!");
117 fOutTracksName = fTracksName;
119 fOutTracksName += fSuffix;
120 fOutTracks = new TClonesArray(*fTracks);
121 fOutTracks->SetName(fOutTracksName);
124 fOutTracks = fTracks;
129 if (!(InputEvent()->FindListObject(fOutTracksName)))
130 InputEvent()->AddObject(fOutTracks);
135 if (fNClusters > 0) {
136 fClusters = dynamic_cast<TClonesArray*>(InputEvent()->FindListObject(fCaloName));
139 AliError(Form("Couldn't retrieve clusters with name %s!", fCaloName.Data()));
144 fOutCaloName = fCaloName;
146 fOutCaloName += fSuffix;
147 fOutClusters = new TClonesArray(*fClusters);
148 fOutClusters->SetName(fOutCaloName);
151 fOutClusters = fClusters;
156 if (!(InputEvent()->FindListObject(fOutCaloName)))
157 InputEvent()->AddObject(fOutClusters);
158 fOutClusters->Clear();
162 if (fGeomName.Length() > 0) {
163 fGeom = AliEMCALGeometry::GetInstance(fGeomName);
165 AliError(Form("Could not get geometry with name %s!", fGeomName.Data()));
167 fGeom = AliEMCALGeometry::GetInstance();
169 AliError("Could not get default geometry!");
173 const Double_t EmcalMinEta = fGeom->GetArm1EtaMin();
174 const Double_t EmcalMaxEta = fGeom->GetArm1EtaMax();
175 const Double_t EmcalMinPhi = fGeom->GetArm1PhiMin() * TMath::DegToRad();
176 const Double_t EmcalMaxPhi = fGeom->GetArm1PhiMax() * TMath::DegToRad();
178 if (fEtaMax > EmcalMaxEta) fEtaMax = EmcalMaxEta;
179 if (fEtaMax < EmcalMinEta) fEtaMax = EmcalMinEta;
180 if (fEtaMin > EmcalMaxEta) fEtaMin = EmcalMaxEta;
181 if (fEtaMin < EmcalMinEta) fEtaMin = EmcalMinEta;
183 if (fPhiMax > EmcalMaxPhi) fPhiMax = EmcalMaxPhi;
184 if (fPhiMax < EmcalMinPhi) fPhiMax = EmcalMinPhi;
185 if (fPhiMin > EmcalMaxPhi) fPhiMin = EmcalMaxPhi;
186 if (fPhiMin < EmcalMinPhi) fPhiMin = EmcalMinPhi;
190 //________________________________________________________________________
191 void AliJetModelBaseTask::GetRandomCell(Double_t &eta, Double_t &phi, Int_t &absId)
196 Double_t rndEta = eta;
197 Double_t rndPhi = phi;
200 rndEta = GetRandomEta();
202 rndPhi = GetRandomPhi();
203 fGeom->GetAbsCellIdFromEtaPhi(rndEta, rndPhi, absId);
205 } while (absId == -1 && repeats < 100);
208 AliWarning(Form("Could not extract random cluster! Random eta-phi extracted more than 100 times!\n"
209 "eta [%f, %f], phi [%f, %f]\n", fEtaMin, fEtaMax, fPhiMin, fPhiMax));
217 //________________________________________________________________________
218 Double_t AliJetModelBaseTask::GetRandomEta()
222 return gRandom->Rndm() * (fEtaMax - fEtaMin) + fEtaMin;
225 //________________________________________________________________________
226 Double_t AliJetModelBaseTask::GetRandomPhi()
230 return gRandom->Rndm() * (fPhiMax - fPhiMin) + fPhiMin;
233 //________________________________________________________________________
234 Double_t AliJetModelBaseTask::GetRandomPt()
238 return gRandom->Rndm() * (fPtMax - fPtMin) + fPtMin;
241 //________________________________________________________________________
242 AliVCluster* AliJetModelBaseTask::AddCluster(Double_t e, Double_t eta, Double_t phi)
244 // Add a cluster to the event.
247 if (eta < -100 || phi < 0) {
248 GetRandomCell(eta, phi, absId);
251 fGeom->EtaPhiFromIndex(absId, eta, phi);
255 AliWarning(Form("Unable to embed cluster in eta = %f, phi = %f!"
256 " Maybe the eta-phi range is not inside the EMCal acceptance (eta = [%f, %f], phi = [%f, %f])",
257 eta, phi, fEtaMin, fEtaMax, fPhiMin, fPhiMax));
262 Double_t pt = GetRandomPt();
263 TLorentzVector nPart;
264 nPart.SetPtEtaPhiM(pt, eta, phi, 0);
268 return AddCluster(e, absId);
271 //________________________________________________________________________
272 AliVCluster* AliJetModelBaseTask::AddCluster(Double_t e, Int_t absId)
274 // Add a cluster to the event.
276 const Int_t nClusters = fOutClusters->GetEntriesFast();
278 TClonesArray digits("AliEMCALDigit", 1);
280 AliEMCALDigit *digit = static_cast<AliEMCALDigit*>(digits.New(0));
282 digit->SetIndexInList(0);
283 digit->SetType(AliEMCALDigit::kHG);
284 digit->SetAmplitude(e);
286 AliEMCALRecPoint recPoint("");
287 recPoint.AddDigit(*digit, e, kFALSE);
288 recPoint.EvalGlobalPosition(0, &digits);
291 recPoint.GetGlobalPosition(gpos);
295 AliVCluster *cluster = static_cast<AliVCluster*>(fOutClusters->New(nClusters));
296 cluster->SetType(AliVCluster::kEMCALClusterv1);
297 cluster->SetE(recPoint.GetEnergy());
298 cluster->SetPosition(g);
299 cluster->SetNCells(1);
300 UShort_t shortAbsId = absId;
301 cluster->SetCellsAbsId(&shortAbsId);
302 Double32_t fract = 1;
303 cluster->SetCellsAmplitudeFraction(&fract);
304 cluster->SetID(nClusters);
305 cluster->SetEmcCpvDistance(-1);
306 cluster->SetChi2(100); // MC flag!
311 //________________________________________________________________________
312 AliPicoTrack* AliJetModelBaseTask::AddTrack(Double_t pt, Double_t eta, Double_t phi)
314 // Add a track to the event.
316 const Int_t nTracks = fOutTracks->GetEntriesFast();
321 eta = GetRandomEta();
323 phi = GetRandomPhi();
325 AliPicoTrack *track = new ((*fOutTracks)[nTracks]) AliPicoTrack(pt,
336 //________________________________________________________________________
337 void AliJetModelBaseTask::Run()
342 //________________________________________________________________________
343 void AliJetModelBaseTask::UserExec(Option_t *)
345 // Execute per event.