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)
197 Double_t rndEta = eta;
198 Double_t rndPhi = phi;
201 rndEta = GetRandomEta();
203 rndPhi = GetRandomPhi();
204 fGeom->GetAbsCellIdFromEtaPhi(rndEta, rndPhi, absId);
206 } while (absId == -1 && repeats < 100);
209 AliWarning(Form("Could not extract random cluster! Random eta-phi extracted more than 100 times!\n"
210 "eta [%f, %f], phi [%f, %f]\n", fEtaMin, fEtaMax, fPhiMin, fPhiMax));
218 //________________________________________________________________________
219 Double_t AliJetModelBaseTask::GetRandomEta()
221 return gRandom->Rndm() * (fEtaMax - fEtaMin) + fEtaMin;
224 //________________________________________________________________________
225 Double_t AliJetModelBaseTask::GetRandomPhi()
227 return gRandom->Rndm() * (fPhiMax - fPhiMin) + fPhiMin;
230 //________________________________________________________________________
231 Double_t AliJetModelBaseTask::GetRandomPt()
233 return gRandom->Rndm() * (fPtMax - fPtMin) + fPtMin;
236 //________________________________________________________________________
237 AliVCluster* AliJetModelBaseTask::AddCluster(Double_t e, Double_t eta, Double_t phi)
240 if (eta < -100 || phi < 0) {
241 GetRandomCell(eta, phi, absId);
244 fGeom->EtaPhiFromIndex(absId, eta, phi);
248 AliWarning(Form("Unable to embed cluster in eta = %f, phi = %f!"
249 " Maybe the eta-phi range is not inside the EMCal acceptance (eta = [%f, %f], phi = [%f, %f])",
250 eta, phi, fEtaMin, fEtaMax, fPhiMin, fPhiMax));
255 Double_t pt = GetRandomPt();
256 TLorentzVector nPart;
257 nPart.SetPtEtaPhiM(pt, eta, phi, 0);
261 return AddCluster(e, absId);
264 //________________________________________________________________________
265 AliVCluster* AliJetModelBaseTask::AddCluster(Double_t e, Int_t absId)
267 const Int_t nClusters = fOutClusters->GetEntriesFast();
269 TClonesArray digits("AliEMCALDigit", 1);
271 AliEMCALDigit *digit = static_cast<AliEMCALDigit*>(digits.New(0));
273 digit->SetIndexInList(0);
274 digit->SetType(AliEMCALDigit::kHG);
275 digit->SetAmplitude(e);
277 AliEMCALRecPoint recPoint("");
278 recPoint.AddDigit(*digit, e, kFALSE);
279 recPoint.EvalGlobalPosition(0, &digits);
282 recPoint.GetGlobalPosition(gpos);
286 AliVCluster *cluster = static_cast<AliVCluster*>(fOutClusters->New(nClusters));
287 cluster->SetType(AliVCluster::kEMCALClusterv1);
288 cluster->SetE(recPoint.GetEnergy());
289 cluster->SetPosition(g);
290 cluster->SetNCells(1);
291 UShort_t shortAbsId = absId;
292 cluster->SetCellsAbsId(&shortAbsId);
293 Double32_t fract = 1;
294 cluster->SetCellsAmplitudeFraction(&fract);
295 cluster->SetID(nClusters);
296 cluster->SetEmcCpvDistance(-1);
297 cluster->SetChi2(100); // MC flag!
302 //________________________________________________________________________
303 AliPicoTrack* AliJetModelBaseTask::AddTrack(Double_t pt, Double_t eta, Double_t phi)
305 const Int_t nTracks = fOutTracks->GetEntriesFast();
310 eta = GetRandomEta();
312 phi = GetRandomPhi();
314 AliPicoTrack *track = new ((*fOutTracks)[nTracks]) AliPicoTrack(pt,
325 //________________________________________________________________________
326 void AliJetModelBaseTask::Run()
331 //________________________________________________________________________
332 void AliJetModelBaseTask::UserExec(Option_t *)
334 // Execute per event.