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.
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 const Double_t EmcalMinEta = fGeom->GetArm1EtaMin();
176 const Double_t EmcalMaxEta = fGeom->GetArm1EtaMax();
177 const Double_t EmcalMinPhi = fGeom->GetArm1PhiMin() * TMath::DegToRad();
178 const Double_t EmcalMaxPhi = fGeom->GetArm1PhiMax() * TMath::DegToRad();
180 if (fEtaMax > EmcalMaxEta) fEtaMax = EmcalMaxEta;
181 if (fEtaMax < EmcalMinEta) fEtaMax = EmcalMinEta;
182 if (fEtaMin > EmcalMaxEta) fEtaMin = EmcalMaxEta;
183 if (fEtaMin < EmcalMinEta) fEtaMin = EmcalMinEta;
185 if (fPhiMax > EmcalMaxPhi) fPhiMax = EmcalMaxPhi;
186 if (fPhiMax < EmcalMinPhi) fPhiMax = EmcalMinPhi;
187 if (fPhiMin > EmcalMaxPhi) fPhiMin = EmcalMaxPhi;
188 if (fPhiMin < EmcalMinPhi) fPhiMin = EmcalMinPhi;
192 //________________________________________________________________________
193 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()
220 return gRandom->Rndm() * (fEtaMax - fEtaMin) + fEtaMin;
223 //________________________________________________________________________
224 Double_t AliJetModelBaseTask::GetRandomPhi()
226 return gRandom->Rndm() * (fPhiMax - fPhiMin) + fPhiMin;
229 //________________________________________________________________________
230 Double_t AliJetModelBaseTask::GetRandomPt()
232 return gRandom->Rndm() * (fPtMax - fPtMin) + fPtMin;
235 //________________________________________________________________________
236 AliVCluster* AliJetModelBaseTask::AddCluster(Double_t e, Double_t eta, Double_t phi)
239 if (eta < -100 || phi < 0) {
240 GetRandomCell(eta, phi, absId);
243 fGeom->EtaPhiFromIndex(absId, eta, phi);
247 AliWarning(Form("Unable to embed cluster in eta = %f, phi = %f!"
248 " Maybe the eta-phi range is not inside the EMCal acceptance (eta = [%f, %f], phi = [%f, %f])",
249 eta, phi, fEtaMin, fEtaMax, fPhiMin, fPhiMax));
254 Double_t pt = GetRandomPt();
255 TLorentzVector nPart;
256 nPart.SetPtEtaPhiM(pt, eta, phi, 0);
260 return AddCluster(e, absId);
263 //________________________________________________________________________
264 AliVCluster* AliJetModelBaseTask::AddCluster(Double_t e, Int_t absId)
266 const Int_t nClusters = fOutClusters->GetEntriesFast();
268 TClonesArray digits("AliEMCALDigit", 1);
270 AliEMCALDigit *digit = static_cast<AliEMCALDigit*>(digits.New(0));
272 digit->SetIndexInList(0);
273 digit->SetType(AliEMCALDigit::kHG);
274 digit->SetAmplitude(e);
276 AliEMCALRecPoint recPoint("");
277 recPoint.AddDigit(*digit, e, kFALSE);
278 recPoint.EvalGlobalPosition(0, &digits);
281 recPoint.GetGlobalPosition(gpos);
285 AliVCluster *cluster = static_cast<AliVCluster*>(fOutClusters->New(nClusters));
286 cluster->SetType(AliVCluster::kEMCALClusterv1);
287 cluster->SetE(recPoint.GetEnergy());
288 cluster->SetPosition(g);
289 cluster->SetNCells(1);
290 UShort_t shortAbsId = absId;
291 cluster->SetCellsAbsId(&shortAbsId);
292 Double32_t fract = 1;
293 cluster->SetCellsAmplitudeFraction(&fract);
294 cluster->SetID(nClusters);
295 cluster->SetEmcCpvDistance(-1);
296 cluster->SetChi2(100); // MC flag!
301 //________________________________________________________________________
302 AliPicoTrack* AliJetModelBaseTask::AddTrack(Double_t pt, Double_t eta, Double_t phi)
304 const Int_t nTracks = fOutTracks->GetEntriesFast();
309 eta = GetRandomEta();
311 phi = GetRandomPhi();
313 AliPicoTrack *track = new ((*fOutTracks)[nTracks]) AliPicoTrack(pt,
324 //________________________________________________________________________
325 void AliJetModelBaseTask::Run()
330 //________________________________________________________________________
331 void AliJetModelBaseTask::UserExec(Option_t *)
333 // Execute per event.