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 *)
106 fOutTracks->Delete();
108 fOutClusters->Delete();
114 //________________________________________________________________________
115 AliVCluster* AliJetModelBaseTask::AddCluster(Double_t e, Double_t eta, Double_t phi)
117 // Add a cluster to the event.
120 if (eta < -100 || phi < 0) {
121 GetRandomCell(eta, phi, absId);
124 fGeom->EtaPhiFromIndex(absId, eta, phi);
128 AliWarning(Form("Unable to embed cluster in eta = %f, phi = %f!"
129 " Maybe the eta-phi range is not inside the EMCal acceptance (eta = [%f, %f], phi = [%f, %f])",
130 eta, phi, fEtaMin, fEtaMax, fPhiMin, fPhiMax));
135 Double_t pt = GetRandomPt();
136 TLorentzVector nPart;
137 nPart.SetPtEtaPhiM(pt, eta, phi, 0);
141 return AddCluster(e, absId);
144 //________________________________________________________________________
145 AliVCluster* AliJetModelBaseTask::AddCluster(Double_t e, Int_t absId)
147 // Add a cluster to the event.
149 const Int_t nClusters = fOutClusters->GetEntriesFast();
151 TClonesArray digits("AliEMCALDigit", 1);
153 AliEMCALDigit *digit = static_cast<AliEMCALDigit*>(digits.New(0));
155 digit->SetIndexInList(0);
156 digit->SetType(AliEMCALDigit::kHG);
157 digit->SetAmplitude(e);
159 AliEMCALRecPoint recPoint("");
160 recPoint.AddDigit(*digit, e, kFALSE);
161 recPoint.EvalGlobalPosition(0, &digits);
164 recPoint.GetGlobalPosition(gpos);
168 AliVCluster *cluster = static_cast<AliVCluster*>(fOutClusters->New(nClusters));
169 cluster->SetType(AliVCluster::kEMCALClusterv1);
170 cluster->SetE(recPoint.GetEnergy());
171 cluster->SetPosition(g);
172 cluster->SetNCells(1);
173 UShort_t shortAbsId = absId;
174 cluster->SetCellsAbsId(&shortAbsId);
175 Double32_t fract = 1;
176 cluster->SetCellsAmplitudeFraction(&fract);
177 cluster->SetID(nClusters);
178 cluster->SetEmcCpvDistance(-1);
180 cluster->SetChi2(100); // MC flag!
185 //________________________________________________________________________
186 AliPicoTrack* AliJetModelBaseTask::AddTrack(Double_t pt, Double_t eta, Double_t phi)
188 // Add a track to the event.
190 const Int_t nTracks = fOutTracks->GetEntriesFast();
195 eta = GetRandomEta();
197 phi = GetRandomPhi();
199 Int_t label = fMarkMC ? 100 : 0;
201 AliPicoTrack *track = new ((*fOutTracks)[nTracks]) AliPicoTrack(pt,
212 //________________________________________________________________________
213 void AliJetModelBaseTask::CopyClusters()
215 // Copy all the clusters in the new collection
217 Bool_t esdMode = (Bool_t)(fClusters->GetClass()->GetBaseClass("AliESDCaloCluster") != 0);
218 const Int_t nClusters = fClusters->GetEntriesFast();
219 Int_t nCopiedClusters = 0;
222 for (Int_t i = 0; i < nClusters; ++i) {
223 AliESDCaloCluster *esdcluster = static_cast<AliESDCaloCluster*>(fClusters->At(i));
224 if (!esdcluster || !esdcluster->IsEMCAL())
226 new ((*fOutClusters)[nCopiedClusters]) AliESDCaloCluster(*esdcluster);
231 for (Int_t i = 0; i < nClusters; ++i) {
232 AliAODCaloCluster *aodcluster = static_cast<AliAODCaloCluster*>(fClusters->At(i));
233 if (!aodcluster || !aodcluster->IsEMCAL())
235 new ((*fOutClusters)[nCopiedClusters]) AliAODCaloCluster(*aodcluster);
241 //________________________________________________________________________
242 void AliJetModelBaseTask::CopyTracks()
244 const Int_t nTracks = fTracks->GetEntriesFast();
245 Int_t nCopiedTracks = 0;
246 for (Int_t i = 0; i < nTracks; ++i) {
247 AliPicoTrack *track = static_cast<AliPicoTrack*>(fTracks->At(i));
250 new ((*fOutTracks)[nCopiedTracks]) AliPicoTrack(*track);
255 //________________________________________________________________________
256 Bool_t AliJetModelBaseTask::ExecOnce()
260 if (fPtMax < fPtMin) {
261 AliWarning (Form("PtMax (%f) < PtMin (%f), setting PtMax = PtMin = %f", fPtMax, fPtMin, fPtMin));
265 if (fEtaMax < fEtaMin) {
266 AliWarning (Form("EtaMax (%f) < EtaMin (%f), setting EtaMax = EtaMin = %f", fEtaMax, fEtaMin, fEtaMin));
270 if (fPhiMax < fPhiMin) {
271 AliWarning (Form("PhiMax (%f) < PhiMin (%f), setting PhiMax = PhiMin = %f", fPhiMax, fPhiMin, fPhiMin));
275 if (fNTracks > 0 && !fTracks && !fTracksName.IsNull()) {
276 fTracks = dynamic_cast<TClonesArray*>(InputEvent()->FindListObject(fTracksName));
278 AliError(Form("%s: Couldn't retrieve tracks with name %s!", GetName(), fTracksName.Data()));
282 if (!fTracks->GetClass()->GetBaseClass("AliPicoTrack")) {
283 AliError(Form("%s: Collection %s does not contain AliPicoTrack objects!", GetName(), fTracksName.Data()));
289 fOutTracksName = fTracksName;
291 fOutTracksName += fSuffix;
292 fOutTracks = new TClonesArray("AliPicoTrack", fTracks->GetSize());
293 fOutTracks->SetName(fOutTracksName);
294 if (InputEvent()->FindListObject(fOutTracksName)) {
295 AliFatal(Form("%s: Collection %s is already present in the event!", GetName(), fOutTracksName.Data()));
299 InputEvent()->AddObject(fOutTracks);
303 fOutTracks = fTracks;
308 if (fNClusters > 0 && !fClusters && !fCaloName.IsNull()) {
309 fClusters = dynamic_cast<TClonesArray*>(InputEvent()->FindListObject(fCaloName));
312 AliError(Form("%s: Couldn't retrieve clusters with name %s!", GetName(), fCaloName.Data()));
316 if (!fClusters->GetClass()->GetBaseClass("AliVCluster")) {
317 AliError(Form("%s: Collection %s does not contain AliVCluster objects!", GetName(), fCaloName.Data()));
323 fOutCaloName = fCaloName;
325 fOutCaloName += fSuffix;
326 fOutClusters = new TClonesArray(fClusters->GetClass()->GetName(), fClusters->GetSize());
327 fOutClusters->SetName(fOutCaloName);
328 if (InputEvent()->FindListObject(fOutCaloName)) {
329 AliFatal(Form("%s: Collection %s is already present in the event!", GetName(), fOutCaloName.Data()));
333 InputEvent()->AddObject(fOutClusters);
337 fOutClusters = fClusters;
342 if (fGeomName.Length() > 0) {
343 fGeom = AliEMCALGeometry::GetInstance(fGeomName);
345 AliError(Form("Could not get geometry with name %s!", fGeomName.Data()));
347 fGeom = AliEMCALGeometry::GetInstance();
349 AliError("Could not get default geometry!");
353 const Double_t EmcalMinEta = fGeom->GetArm1EtaMin();
354 const Double_t EmcalMaxEta = fGeom->GetArm1EtaMax();
355 const Double_t EmcalMinPhi = fGeom->GetArm1PhiMin() * TMath::DegToRad();
356 const Double_t EmcalMaxPhi = fGeom->GetArm1PhiMax() * TMath::DegToRad();
358 if (fEtaMax > EmcalMaxEta) fEtaMax = EmcalMaxEta;
359 if (fEtaMax < EmcalMinEta) fEtaMax = EmcalMinEta;
360 if (fEtaMin > EmcalMaxEta) fEtaMin = EmcalMaxEta;
361 if (fEtaMin < EmcalMinEta) fEtaMin = EmcalMinEta;
363 if (fPhiMax > EmcalMaxPhi) fPhiMax = EmcalMaxPhi;
364 if (fPhiMax < EmcalMinPhi) fPhiMax = EmcalMinPhi;
365 if (fPhiMin > EmcalMaxPhi) fPhiMin = EmcalMaxPhi;
366 if (fPhiMin < EmcalMinPhi) fPhiMin = EmcalMinPhi;
372 //________________________________________________________________________
373 void AliJetModelBaseTask::GetRandomCell(Double_t &eta, Double_t &phi, Int_t &absId)
378 Double_t rndEta = eta;
379 Double_t rndPhi = phi;
382 rndEta = GetRandomEta();
384 rndPhi = GetRandomPhi();
385 fGeom->GetAbsCellIdFromEtaPhi(rndEta, rndPhi, absId);
387 } while (absId == -1 && repeats < 100);
390 AliWarning(Form("Could not extract random cluster! Random eta-phi extracted more than 100 times!\n"
391 "eta [%f, %f], phi [%f, %f]\n", fEtaMin, fEtaMax, fPhiMin, fPhiMax));
399 //________________________________________________________________________
400 Double_t AliJetModelBaseTask::GetRandomEta()
404 return gRandom->Rndm() * (fEtaMax - fEtaMin) + fEtaMin;
407 //________________________________________________________________________
408 Double_t AliJetModelBaseTask::GetRandomPhi()
412 return gRandom->Rndm() * (fPhiMax - fPhiMin) + fPhiMin;
415 //________________________________________________________________________
416 Double_t AliJetModelBaseTask::GetRandomPt()
421 return fPtSpectrum->GetRandom();
423 return gRandom->Rndm() * (fPtMax - fPtMin) + fPtMin;
426 //________________________________________________________________________
427 void AliJetModelBaseTask::Run()