5 // Author: Salvatore Aiola, Constantin 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.
79 //________________________________________________________________________
80 AliJetModelBaseTask::~AliJetModelBaseTask()
85 //________________________________________________________________________
86 void AliJetModelBaseTask::Init()
90 if (fPtMax < fPtMin) {
91 AliWarning (Form("PtMax (%f) < PtMin (%f), setting PtMax = PtMin = %f", fPtMax, fPtMin, fPtMin));
95 if (fEtaMax < fEtaMin) {
96 AliWarning (Form("EtaMax (%f) < EtaMin (%f), setting EtaMax = EtaMin = %f", fEtaMax, fEtaMin, fEtaMin));
100 if (fPhiMax < fPhiMin) {
101 AliWarning (Form("PhiMax (%f) < PhiMin (%f), setting PhiMax = PhiMin = %f", fPhiMax, fPhiMin, fPhiMin));
106 fTracks = dynamic_cast<TClonesArray*>(InputEvent()->FindListObject(fTracksName));
108 if (strcmp(fTracks->GetClass()->GetName(), "AliPicoTrack")) {
109 AliError("Can only embed PicoTracks!");
114 AliError(Form("Couldn't retrieve tracks with name %s!", fTracksName.Data()));
119 fOutTracksName = fTracksName;
121 fOutTracksName += fSuffix;
122 fOutTracks = new TClonesArray(*fTracks);
123 fOutTracks->SetName(fOutTracksName);
126 fOutTracks = fTracks;
131 if (!(InputEvent()->FindListObject(fOutTracksName)))
132 InputEvent()->AddObject(fOutTracks);
137 if (fNClusters > 0) {
138 fClusters = dynamic_cast<TClonesArray*>(InputEvent()->FindListObject(fCaloName));
141 AliError(Form("Couldn't retrieve clusters with name %s!", fCaloName.Data()));
146 fOutCaloName = fCaloName;
148 fOutCaloName += fSuffix;
149 fOutClusters = new TClonesArray(*fClusters);
150 fOutClusters->SetName(fOutCaloName);
153 fOutClusters = fClusters;
158 if (!(InputEvent()->FindListObject(fOutCaloName)))
159 InputEvent()->AddObject(fOutClusters);
160 fOutClusters->Clear();
164 if (fGeomName.Length() > 0) {
165 fGeom = AliEMCALGeometry::GetInstance(fGeomName);
167 AliError(Form("Could not get geometry with name %s!", fGeomName.Data()));
169 fGeom = AliEMCALGeometry::GetInstance();
171 AliError("Could not get default geometry!");
175 // hard-coded Emcal boundaries
176 const Float_t EmcalEtaMin = -0.7;
177 const Float_t EmcalEtaMax = 0.7;
178 const Float_t EmcalPhiMin = 80 * TMath::DegToRad();
179 const Float_t EmcalPhiMax = 180 * TMath::DegToRad();
181 if (fEtaMax > EmcalEtaMax) fEtaMax = EmcalEtaMax;
182 if (fEtaMax < EmcalEtaMin) fEtaMax = EmcalEtaMin;
183 if (fEtaMin > EmcalEtaMax) fEtaMin = EmcalEtaMax;
184 if (fEtaMin < EmcalEtaMin) fEtaMin = EmcalEtaMin;
186 if (fPhiMax > EmcalPhiMax) fPhiMax = EmcalPhiMax;
187 if (fPhiMax < EmcalPhiMin) fPhiMax = EmcalPhiMin;
188 if (fPhiMin > EmcalPhiMax) fPhiMin = EmcalPhiMax;
189 if (fPhiMin < EmcalPhiMin) fPhiMin = EmcalPhiMin;
193 //________________________________________________________________________
194 void AliJetModelBaseTask::GetRandomCell(Double_t &eta, Double_t &phi, Int_t &absId)
199 eta = gRandom->Rndm() * (fEtaMax - fEtaMin) + fEtaMin;
200 phi = gRandom->Rndm() * (fPhiMax - fPhiMin) + fPhiMin;
201 fGeom->GetAbsCellIdFromEtaPhi(eta, phi, absId);
203 } while (absId == -1 && repeats < 100);
206 AliWarning(Form("Could not extract random cluster! Random eta-phi extracted more than 100 times!\n"
207 "eta [%f, %f], phi [%f, %f]\n", fEtaMin, fEtaMax, fPhiMin, fPhiMax));
211 //________________________________________________________________________
212 Double_t AliJetModelBaseTask::GetRandomEta()
214 return gRandom->Rndm() * (fEtaMax - fEtaMin) + fEtaMin;
217 //________________________________________________________________________
218 Double_t AliJetModelBaseTask::GetRandomPhi()
220 return gRandom->Rndm() * (fPhiMax - fPhiMin) + fPhiMin;
223 //________________________________________________________________________
224 Double_t AliJetModelBaseTask::GetRandomPt()
226 return gRandom->Rndm() * (fPtMax - fPtMin) + fPtMin;
229 //________________________________________________________________________
230 AliVCluster* AliJetModelBaseTask::AddCluster(Double_t e, Double_t eta, Double_t phi)
233 if (eta < 0 || phi < 0) {
234 GetRandomCell(eta, phi, absId);
237 fGeom->EtaPhiFromIndex(absId, eta, phi);
241 AliWarning(Form("Unable to embed cluster in eta = %f, phi = %f!"
242 " Maybe the eta-phi range is not inside the EMCal acceptance (eta = [%f, %f], phi = [%f, %f])",
243 eta, phi, fEtaMin, fEtaMax, fPhiMin, fPhiMax));
248 Double_t pt = GetRandomPt();
249 TLorentzVector nPart;
250 nPart.SetPtEtaPhiM(pt, eta, phi, 0);
254 return AddCluster(e, absId);
257 //________________________________________________________________________
258 AliVCluster* AliJetModelBaseTask::AddCluster(Double_t e, Int_t absId)
260 const Int_t nClusters = fOutClusters->GetEntriesFast();
262 TClonesArray digits("AliEMCALDigit", 1);
264 AliEMCALDigit *digit = static_cast<AliEMCALDigit*>(digits.New(0));
266 digit->SetIndexInList(0);
267 digit->SetType(AliEMCALDigit::kHG);
268 digit->SetAmplitude(e);
270 AliEMCALRecPoint recPoint("");
271 recPoint.AddDigit(*digit, e, kFALSE);
272 recPoint.EvalGlobalPosition(0, &digits);
275 recPoint.GetGlobalPosition(gpos);
279 AliVCluster *cluster = static_cast<AliVCluster*>(fOutClusters->New(nClusters));
280 cluster->SetType(AliVCluster::kEMCALClusterv1);
281 cluster->SetE(recPoint.GetEnergy());
282 cluster->SetPosition(g);
283 cluster->SetNCells(1);
284 UShort_t shortAbsId = absId;
285 cluster->SetCellsAbsId(&shortAbsId);
286 Double32_t fract = 1;
287 cluster->SetCellsAmplitudeFraction(&fract);
288 cluster->SetID(nClusters);
289 cluster->SetEmcCpvDistance(-1);
290 cluster->SetChi2(100); // MC flag!
295 //________________________________________________________________________
296 AliPicoTrack* AliJetModelBaseTask::AddTrack(Double_t pt, Double_t eta, Double_t phi)
298 const Int_t nTracks = fOutTracks->GetEntriesFast();
303 eta = GetRandomEta();
305 phi = GetRandomPhi();
307 AliPicoTrack *track = new ((*fOutTracks)[nTracks]) AliPicoTrack(pt,
318 //________________________________________________________________________
319 void AliJetModelBaseTask::Run()
324 //________________________________________________________________________
325 void AliJetModelBaseTask::UserExec(Option_t *)
327 // Execute per event.