1 #include "AliAnalysisTaskTOFSpectraPbPb.h"
2 #include "AliESDEvent.h"
3 #include "AliMCEvent.h"
5 #include "AliPhysicsSelection.h"
6 #include "AliESDtrackCuts.h"
8 #include "AliTOFcalib.h"
9 #include "AliTOFT0maker.h"
13 #include "AliCDBManager.h"
15 #include "AliESDtrack.h"
16 #include "TObjArray.h"
17 #include "TLorentzVector.h"
18 #include "TParticle.h"
19 #include "TDatabasePDG.h"
20 #include "TParticlePDG.h"
21 #include "AliTOFRunParams.h"
22 #include "AliAnalysisTrack.h"
23 #include "AliAnalysisParticle.h"
24 #include "AliAnalysisEvent.h"
25 #include "TClonesArray.h"
26 #include "AliAnalysisManager.h"
27 #include "AliAODHandler.h"
29 #include "AliCentrality.h"
30 #include "AliInputEventHandler.h"
31 #include "AliVEvent.h"
33 ClassImp(AliAnalysisTaskTOFSpectraPbPb)
35 //_______________________________________________________
37 AliAnalysisTaskTOFSpectraPbPb::AliAnalysisTaskTOFSpectraPbPb() :
38 AliAnalysisTaskSE("TOFSpectraPbPb"),
43 fVertexSelectionFlag(kFALSE),
49 fESDpid(new AliESDpid()),
50 fIsCollisionCandidate(kFALSE),
55 fAnalysisEvent(new AliAnalysisEvent()),
56 fAnalysisTrackArray(new TClonesArray("AliAnalysisTrack")),
57 fAnalysisTrack(new AliAnalysisTrack()),
58 fAnalysisParticleArray(new TClonesArray("AliAnalysisParticle")),
59 fAnalysisParticle(new AliAnalysisParticle()),
60 fTOFcalib(new AliTOFcalib()),
61 fTOFT0maker(new AliTOFT0maker(fESDpid)),
65 fHistoList(new TList()),
66 fMCHistoList(new TList())
74 //_______________________________________________________
76 AliAnalysisTaskTOFSpectraPbPb::~AliAnalysisTaskTOFSpectraPbPb()
82 if (fTrackCuts) delete fTrackCuts;
90 //_______________________________________________________
93 AliAnalysisTaskTOFSpectraPbPb::UserCreateOutputObjects()
96 * user create output objects
100 OutputTree()->Branch("AnalysisEvent", "AliAnalysisEvent", &fAnalysisEvent);
101 OutputTree()->Branch("AnalysisTrack", "TClonesArray", &fAnalysisTrackArray);
103 OutputTree()->Branch("AnalysisParticle", "TClonesArray", &fAnalysisParticleArray);
106 //_______________________________________________________
109 AliAnalysisTaskTOFSpectraPbPb::InitRun()
116 fESDEvent = dynamic_cast<AliESDEvent *>(InputEvent());
118 AliError("cannot get ESD event");
122 Int_t runNb = fESDEvent->GetRunNumber();
123 /* check run already initialized */
124 if (fInitFlag && fRunNumber == runNb) return kTRUE;
126 AliCDBManager *cdb = AliCDBManager::Instance();
127 cdb->SetDefaultStorage("raw://");
130 if (!fTOFcalib->Init()) {
131 AliError("cannot init TOF calib");
134 AliInfo(Form("initialized for run %d", runNb));
140 //_______________________________________________________
143 AliAnalysisTaskTOFSpectraPbPb::InitEvent()
150 fESDEvent = dynamic_cast<AliESDEvent *>(InputEvent());
151 if (!fESDEvent) return kFALSE;
154 fMCEvent = dynamic_cast<AliMCEvent *>(MCEvent());
155 if (!fMCEvent) return kFALSE;
159 fMCStack = fMCEvent->Stack();
160 if (!fMCStack) return kFALSE;
162 /* event selection */
163 fIsCollisionCandidate = (((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected() & AliVEvent::kMB);
164 /* vertex selection */
165 const AliESDVertex *vertex = fESDEvent->GetPrimaryVertexTracks();
166 if (vertex->GetNContributors() < 1) {
167 vertex = fESDEvent->GetPrimaryVertexSPD();
168 if (vertex->GetNContributors() < 1) fHasVertex = kFALSE;
169 else fHasVertex = kTRUE;
171 else fHasVertex = kTRUE;
172 if (fVertexSelectionFlag && (!fHasVertex || TMath::Abs(vertex->GetZ()) > fVertexCut)) return kFALSE;
173 fVertexZ = vertex->GetZ();
174 /* centrality in PbPb */
176 fCentrality = fESDEvent->GetCentrality();
179 /* calibrate ESD (also in MC to correct TExp) */
180 fTOFcalib->CalibrateESD(fESDEvent);
183 if (fMCFlag && fMCTuneFlag)
184 fMCTimeZero = fTOFcalib->TuneForMC(fESDEvent, fTimeResolution);
186 #if 0 /* NEW METHOD */
187 /* compute TOF-T0, fill ESD and make PID */
188 fTOFT0maker->ComputeT0TOF(fESDEvent);
189 fTOFT0maker->WriteInESD(fESDEvent);
190 fESDpid->SetTOFResponse(fESDEvent, AliESDpid::kTOF_T0);
191 fESDpid->MakePID(fESDEvent, kFALSE, 0.);
194 #if 1 /* OLD METHOD */
195 /* compute and apply TOF-T0 */
196 fTOFT0maker->ComputeT0TOF(fESDEvent);
197 fESDpid->MakePID(fESDEvent, kFALSE, 0.);
203 //_______________________________________________________
206 AliAnalysisTaskTOFSpectraPbPb::HasPrimaryDCA(AliESDtrack *track)
212 // cut on transverse impact parameter
213 Float_t d0z0[2],covd0z0[3];
214 track->GetImpactParameters(d0z0, covd0z0);
215 Float_t sigma= 0.0050 + 0.0060 / TMath::Power(track->Pt(), 0.9);
216 Float_t d0max = 7. * sigma;
218 Float_t sigmaZ = 0.0146 + 0.0070 / TMath::Power(track->Pt(), 1.114758);
219 if (track->Pt() > 1.) sigmaZ = 0.0216;
220 Float_t d0maxZ = 5. * sigmaZ;
222 if(TMath::Abs(d0z0[0]) > d0max || TMath::Abs(d0z0[1]) > d0maxZ)
229 //_______________________________________________________
232 AliAnalysisTaskTOFSpectraPbPb::UserExec(Option_t *option)
238 /*** INITIALIZATION ***/
241 ((AliAODHandler*)(AliAnalysisManager::GetAnalysisManager()->GetOutputEventHandler()))->SetFillAOD(kFALSE);
244 if (!InitRun()) return;
246 if (!InitEvent()) return;
249 ((AliAODHandler*)(AliAnalysisManager::GetAnalysisManager()->GetOutputEventHandler()))->SetFillAOD(kTRUE);
251 /*** MC PRIMARY PARTICLES ***/
255 /* reset track array */
256 fAnalysisParticleArray->Clear();
258 /* loop over primary particles */
259 Int_t nPrimaries = fMCStack->GetNprimary();
261 TParticlePDG *particlePDG;
262 /* loop over primary particles */
263 for (Int_t ipart = 0; ipart < nPrimaries; ipart++) {
265 if (!fMCStack->IsPhysicalPrimary(ipart)) continue;
267 particle = fMCStack->Particle(ipart);
268 if (!particle) continue;
269 /* check rapidity and pt cuts */
270 if (TMath::Abs(particle->Y()) > 0.5) continue;
271 if (particle->Pt() < 0.15) continue;
272 /* get particlePDG */
273 particlePDG = particle->GetPDG();
274 if (!particlePDG) continue;
276 if (particlePDG->Charge() == 0.) continue;
277 /* update and add analysis particle */
278 fAnalysisParticle->Update(particle, ipart);
279 new ((*fAnalysisParticleArray)[fAnalysisParticleArray->GetEntries()]) AliAnalysisParticle(*fAnalysisParticle);
280 } /* end of loop over primary particles */
283 /*** GLOBAL EVENT INFORMATION ***/
285 fAnalysisEvent->Reset();
286 /* update global event info */
287 fAnalysisEvent->SetIsCollisionCandidate(fIsCollisionCandidate);
288 fAnalysisEvent->SetHasVertex(fHasVertex);
289 fAnalysisEvent->SetVertexZ(fVertexZ);
290 fAnalysisEvent->SetMCTimeZero(fMCTimeZero);
291 /* update TOF event info */
292 for (Int_t i = 0; i < 10; i++) {
293 fAnalysisEvent->SetTimeZeroTOF(i, fESDpid->GetTOFResponse().GetT0bin(i));
294 fAnalysisEvent->SetTimeZeroTOFSigma(i, fESDpid->GetTOFResponse().GetT0binRes(i));
296 /* update T0 event info */
297 for (Int_t i = 0; i < 3; i++)
298 fAnalysisEvent->SetTimeZeroT0(i, fESDEvent->GetT0TOF(i));
300 /* update centrality info in PbPb */
302 fAnalysisEvent->SetCentralityQuality(fCentrality->GetQuality());
303 for (Int_t icent = 0; icent < AliAnalysisEvent::kNCentralityEstimators; icent++)
304 fAnalysisEvent->SetCentralityPercentile(icent, fCentrality->GetCentralityPercentileUnchecked(AliAnalysisEvent::fgkCentralityEstimatorName[icent]));
307 /*** RECONSTRUCTED TRACKS ***/
309 /* reset track array */
310 fAnalysisTrackArray->Clear();
312 /* loop over ESD tracks */
313 Int_t nTracks = fESDEvent->GetNumberOfTracks();
315 for (Int_t itrk = 0; itrk < nTracks; itrk++) {
317 track = fESDEvent->GetTrack(itrk);
318 if (!track) continue;
319 /* check accept track */
320 if (!fTrackCuts->AcceptTrack(track)) continue;
321 /* update and add analysis track */
322 fAnalysisTrack->Update(track, fMCStack, fMCEvent);
323 new ((*fAnalysisTrackArray)[fAnalysisTrackArray->GetEntries()]) AliAnalysisTrack(*fAnalysisTrack);
325 } /* end of loop over ESD tracks */