]> git.uio.no Git - u/mrichter/AliRoot.git/blame - PWGCF/Correlations/Base/AliAnalysisTaskCFTree.cxx
Merge branch 'master' into flatdev
[u/mrichter/AliRoot.git] / PWGCF / Correlations / Base / AliAnalysisTaskCFTree.cxx
CommitLineData
5fe7e785 1/**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
3 * *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
6 * *
7 * Permission to use, copy, modify and distribute this software and its *
8 * documentation strictly for non-commercial purposes is hereby granted *
9 * without fee, provided that the above copyright notice appears in all *
10 * copies and that both the copyright notice and this permission notice *
11 * appear in the supporting documentation. The authors make no claims *
12 * about the suitability of this software for any purpose. It is *
13 * provided "as is" without express or implied warranty. *
14 **************************************************************************/
15
16// Analysis task to produce trees of lightweight events
17// evgeny.kryshen@cern.ch
18
19// aliroot
20#include "AliAnalysisTaskCFTree.h"
21#include "AliCFParticle.h"
22#include "AliAnalysisManager.h"
23#include "AliInputEventHandler.h"
24#include "AliESDEvent.h"
25#include "AliAODEvent.h"
26#include "AliMCEvent.h"
5fe7e785 27#include "AliAODTrack.h"
28#include "AliESDtrack.h"
5fe7e785 29#include "AliExternalTrackParam.h"
30#include "AliCentrality.h"
31#include "AliAnalysisFilter.h"
d8c679e5 32#include "AliVMultiplicity.h"
33#include "AliAnalysisUtils.h"
5fe7e785 34// root
35#include "TMath.h"
36#include "TFile.h"
37#include "TList.h"
38#include "TH1I.h"
39#include "TChain.h"
40#include "TTree.h"
41#include "TClonesArray.h"
42ClassImp(AliAnalysisTaskCFTree)
43
44//-----------------------------------------------------------------------------
45AliAnalysisTaskCFTree::AliAnalysisTaskCFTree(const char* name) :
d8c679e5 46 AliAnalysisTaskSE(name),
5fe7e785 47 fTrackFilter(0x0),
48 fHybridConstrainedMask(0),
49 fTPConlyConstrainedMask(0),
d8c679e5 50 fUtils(0x0),
5fe7e785 51 fListOfHistos(0x0),
52 fEventStatistics(0x0),
53 fTree(0x0),
d8c679e5 54 fTracks(0x0),
4c66fa46 55 fTracklets(0x0),
56 fMuons(0x0),
d8c679e5 57 fMcParticles(0x0),
5fe7e785 58 fField(0),
d8c679e5 59 fCentrality(),
60 fVtxZ(0),
61 fVtxTPConly(0),
62 fVtxContributors(0),
5fe7e785 63 fPeriod(0),
64 fOrbit(),
65 fBc(),
66 fSelectMask(0),
d8c679e5 67 fIsPileupSPD(0),
68 fIsPileupMV(0),
69 fSelectBit(AliVEvent::kAny),
5fe7e785 70 fZVertexCut(10.),
5fe7e785 71 fTrackFilterBit(0xffffffff),
72 fTrackEtaCut(1.0),
73 fPtMin(0.15),
74 fSharedClusterCut(0.4),
75 fCrossedRowsCut(100),
4c66fa46 76 fFoundFractionCut(0.8),
c0ff46c8 77 fDphiCut(1.e9),
8e77b3fd 78 fStoreTracks(0),
4c66fa46 79 fStoreTracklets(0),
d8c679e5 80 fStoreMuons(0),
81 fStoreMcTracks(0),
82 fStoreMcTracklets(0),
83 fStoreMcMuons(0),
84 fStorePidInfo(0)
5fe7e785 85{
86 Info("AliAnalysisTaskCFTree","Calling Constructor");
87 DefineInput(0,TChain::Class());
d8c679e5 88 DefineOutput(1,TList::Class());
89 DefineOutput(2,TTree::Class());
5fe7e785 90}
91//-----------------------------------------------------------------------------
92
93
94//-----------------------------------------------------------------------------
d8c679e5 95void AliAnalysisTaskCFTree::UserCreateOutputObjects(){
5fe7e785 96 fListOfHistos = new TList();
97 fListOfHistos->SetOwner();
98 fEventStatistics = new TH1I("fEventStatistics","",10,0,10);
99 fEventStatistics->SetBit(TH1::kCanRebin);
100
101 fListOfHistos->Add(fEventStatistics);
102
d8c679e5 103 if (fStoreTracks) fTracks = new TClonesArray("AliCFParticle",2000);
104 if (fStoreTracklets) fTracklets = new TClonesArray("AliCFParticle",2000);
105 if (fStoreMuons) fMuons = new TClonesArray("AliCFParticle",2000);
106 if (fStoreMcTracks) fMcParticles = new TClonesArray("AliCFParticle",2000);
5fe7e785 107 // create file-resident tree
108 TDirectory *owd = gDirectory;
109 OpenFile(1);
110 fTree = new TTree("events","events");
111 owd->cd();
d8c679e5 112 fTree->Branch("cent",&fCentrality,"fCentrality[6]/F");
113 fTree->Branch("vtxz",&fVtxZ);
114 fTree->Branch("vtxTPConly",&fVtxTPConly);
115 fTree->Branch("vtxContributors",&fVtxContributors);
5fe7e785 116 fTree->Branch("field",&fField);
d8c679e5 117 fTree->Branch("run",&fCurrentRunNumber);
5fe7e785 118 fTree->Branch("period",&fPeriod);
119 fTree->Branch("orbit",&fOrbit);
120 fTree->Branch("bc",&fBc);
121 fTree->Branch("mask",&fSelectMask);
d8c679e5 122 fTree->Branch("pileupspd",&fIsPileupSPD);
123 fTree->Branch("pileupmv",&fIsPileupMV);
124 if (fTracks) fTree->Branch("tracks",&fTracks);
125 if (fTracklets) fTree->Branch("tracklets",&fTracklets);
126 if (fMuons) fTree->Branch("muons",&fMuons);
127 if (fMcParticles) fTree->Branch("mcparticles",&fMcParticles);
128
129 fUtils = new AliAnalysisUtils();
130
131 PostData(1,fListOfHistos);
132 PostData(2,fTree);
5fe7e785 133}
134//-----------------------------------------------------------------------------
135
136
137//-----------------------------------------------------------------------------
d8c679e5 138void AliAnalysisTaskCFTree::UserExec(Option_t *){
5fe7e785 139 fEventStatistics->Fill("before cuts",1);
140
d8c679e5 141 if (!fInputEvent) return;
5fe7e785 142 fEventStatistics->Fill("after event check",1);
143
d8c679e5 144 // TODO
145 // TString classes = fInputEvent->GetFiredTriggerClasses();
146 // fClassesFired = 0;
147 // fClassesFired |= (classes.Contains("CINT7-S-") << 0);
148 // fClassesFired |= (classes.Contains("CINT7-B-") << 0);
149 // fClassesFired |= (classes.Contains("CSHM8-S-") << 1);
150 // fClassesFired |= (classes.Contains("CSHM8-B-") << 1);
151 // fClassesFired |= (classes.Contains("CMSL7-S-") << 2);
152 // fClassesFired |= (classes.Contains("CMSL7-B-") << 2);
153 // fClassesFired |= (classes.Contains("CMSH7-S-") << 3);
154 // fClassesFired |= (classes.Contains("CMSH7-B-") << 3);
155 // fClassesFired |= (classes.Contains("CMUL7-S-") << 4);
156 // fClassesFired |= (classes.Contains("CMUL7-B-") << 4);
157 // fClassesFired |= (classes.Contains("CMLL7-S-") << 5);
158 // fClassesFired |= (classes.Contains("CMLL7-B-") << 5);
159 // fClassesFired |= (classes.Contains("CINT8-S-") << 6);
160 // fClassesFired |= (classes.Contains("CSPI7-S-") << 7);
161 // fClassesFired |= (classes.Contains("CSPI8-S-") << 8);
162 // fClassesFired |= (classes.Contains("CMSL8-S-") << 9);
163 // fClassesFired |= (classes.Contains("CMSH8-S-") <<10);
164 // fClassesFired |= (classes.Contains("CMUL8-S-") <<11);
165 // fClassesFired |= (classes.Contains("CMLL8-S-") <<12);
166 // fClassesFired |= (classes.Contains("C0MUL-SA") <<13);
167 // fClassesFired |= (classes.Contains("C0MUL-SC") <<14);
168 // if (!fClassesFired) return;
169 // fEventStatistics->Fill("after trigger check",1);
5fe7e785 170
171 fSelectMask = fInputHandler->IsEventSelected();
172 if (!(fSelectMask & fSelectBit)) return;
5fe7e785 173
d8c679e5 174 fEventStatistics->Fill("after physics selection",1);
175
176 fPeriod = fInputEvent->GetPeriodNumber();
177 fOrbit = fInputEvent->GetOrbitNumber();
178 fBc = fInputEvent->GetBunchCrossNumber();
179 fField = fInputEvent->GetMagneticField();
180 fCentrality[0] = fInputEvent->GetCentrality()->GetCentralityPercentile("V0M");
181 fCentrality[1] = fInputEvent->GetCentrality()->GetCentralityPercentile("V0A");
182 fCentrality[2] = fInputEvent->GetCentrality()->GetCentralityPercentile("V0C");
183 fCentrality[3] = fInputEvent->GetCentrality()->GetCentralityPercentile("CL1");
184 fCentrality[4] = fInputEvent->GetCentrality()->GetCentralityPercentile("ZNA");
185 fCentrality[5] = fInputEvent->GetCentrality()->GetCentralityPercentile("ZNC");
186 fIsPileupSPD = fUtils->IsPileUpSPD(fInputEvent);
187 fIsPileupMV = fUtils->IsPileUpMV(fInputEvent);
188// fNofITSClusters[i] = esd->GetMultiplicity()->GetNumberOfITSClusters(i);
189
190 const AliVVertex* vertex = fInputEvent->GetPrimaryVertex();
191 fVtxZ = vertex->GetZ();
192 fVtxTPConly = TString(vertex->GetName()).CompareTo("PrimaryVertex") && TString(vertex->GetName()).CompareTo("SPDVertex");
193 fVtxContributors = vertex->GetNContributors();
194 if (TMath::Abs(fVtxZ) >= fZVertexCut) return;
195 fEventStatistics->Fill("after vertex cut",1);
196
197 if (fTracks) {
198 fTracks->Clear();
199 for (Int_t ipart=0;ipart<fInputEvent->GetNumberOfTracks();ipart++){
200 AliVTrack* track = (AliVTrack*) fInputEvent->GetTrack(ipart);
201 if (!track) continue;
202 UInt_t mask = GetFilterMap(track);
203 if (!(mask & fTrackFilterBit)) continue;
5fe7e785 204
d8c679e5 205 if (track->InheritsFrom("AliAODTrack")) AddTrack(track,mask,0);
206 else if (track->InheritsFrom("AliESDtrack")) {
207 if (mask) AddTrack(track,mask,1);
208 if (mask & fHybridConstrainedMask) AddTrack(track,mask,2);
209 if (mask & fTPConlyConstrainedMask) AddTrack(track,mask,3);
4c66fa46 210 }
211 }
5fe7e785 212 }
4c66fa46 213
d8c679e5 214 if (fTracklets){
215 fTracklets->Clear();
216 AliVMultiplicity* mult = fInputEvent->GetMultiplicity();
217 Int_t nTracklets = mult->GetNumberOfTracklets();
218 for (Int_t i=0;i<nTracklets;i++){
219 Float_t phi = mult->GetPhi(i);
220 Float_t eta = -TMath::Log(TMath::Tan(mult->GetTheta(i)/2));
221 Float_t dphi = mult->GetDeltaPhi(i);
222 if (TMath::Abs(dphi)>fDphiCut) continue;
223 AliCFParticle* tracklet = new ((*fTracklets)[fTracklets->GetEntriesFast()]) AliCFParticle(dphi,eta,phi,0,0,fStoreMcTracklets?4:0);
224 if (!fStoreMcTracklets || !fMCEvent) continue;
225 Int_t label1 = mult->GetLabel(i,0);
226 Int_t label2 = mult->GetLabel(i,1);
227 if (label1!=label2) continue;
228 AliVParticle* particle = fMCEvent->GetTrack(label1);
229 if (!particle) continue;
230 Short_t charge = particle->Charge();
231 Float_t ptMC = particle->Pt();
232 Float_t etaMC = particle->Eta();
233 Float_t phiMC = particle->Phi();
234 Float_t pdg = particle->PdgCode();
235 tracklet->SetCharge(charge);
236 tracklet->SetAt(ptMC,0);
237 tracklet->SetAt(etaMC,1);
238 tracklet->SetAt(phiMC,2);
239 tracklet->SetAt(pdg,3);
2bb5fec4 240 }
d8c679e5 241 }
242
243 AliAODEvent* aod = dynamic_cast<AliAODEvent*> (fInputEvent);
244 if (fMuons && aod){ // aod only
245 fMuons->Clear();
4640c275 246 for (Int_t iTrack = 0; iTrack < aod->GetNumberOfTracks(); iTrack++) {
247 AliAODTrack* track = dynamic_cast<AliAODTrack*>(aod->GetTrack(iTrack));
248 if(!track) AliFatal("Not a standard AOD");
d8c679e5 249 if (!track->IsMuonTrack()) continue;
250 Float_t pt = track->Pt();
251 Float_t eta = track->Eta();
252 Float_t phi = track->Phi();
253 Short_t charge = track->Charge();
254 Float_t dca = track->DCA();
255 Float_t chi2 = track->Chi2perNDF();
256 Float_t rabs = track->GetRAtAbsorberEnd();
257 Int_t mask = track->GetMatchTrigger();
258 if (rabs < 17.6 || rabs > 89.5) continue;
259 if (eta < -4 || eta > -2.5) continue;
260 AliCFParticle* part = new ((*fMuons)[fMuons->GetEntriesFast()]) AliCFParticle(pt,eta,phi,charge,mask,fStoreMcMuons?11:3);
261 part->SetAt(dca,0);
262 part->SetAt(chi2,1);
263 part->SetAt(rabs,2);
264 if (!fStoreMcMuons || !fMCEvent) continue;
265 Int_t label = TMath::Abs(track->GetLabel());
266 AliVParticle* mcpart = fMCEvent->GetTrack(label);
267 if (!mcpart) continue;
268 Int_t mcpdg = mcpart->PdgCode();
269 Float_t mcpt = mcpart->Pt();
270 Float_t mceta = mcpart->Eta();
271 Float_t mcphi = mcpart->Phi();
272 part->SetAt(mcpt,3);
273 part->SetAt(mceta,4);
274 part->SetAt(mcphi,5);
275 part->SetAt(mcpdg,6);
276 part->SetAt(0,10);
277 Bool_t isPrimary = fMCEvent->IsPhysicalPrimary(label);
278 if (isPrimary) continue;
279 label = mcpart->GetMother();
280 while (!isPrimary && label>=0) {
281 mcpart = (AliVParticle*) fMCEvent->GetTrack(label);
282 label = mcpart->GetMother();
283 isPrimary = fMCEvent->IsPhysicalPrimary(label);
8e77b3fd 284 }
d8c679e5 285 if (!mcpart) continue;
286 Float_t mcprimarypt = mcpart->Pt();
287 Float_t mcprimaryeta = mcpart->Eta();
288 Float_t mcprimaryphi = mcpart->Phi();
289 Int_t mcprimarypdg = mcpart->PdgCode();
290 part->SetAt(mcprimarypt,7);
291 part->SetAt(mcprimaryeta,8);
292 part->SetAt(mcprimaryphi,9);
293 part->SetAt(mcprimarypdg,10);
5fe7e785 294 }
d8c679e5 295 }
8e77b3fd 296
d8c679e5 297 if (fMcParticles && fMCEvent) {
298 fMcParticles->Clear();
299 TString gen;
300 for (Int_t ipart=0;ipart<fMCEvent->GetNumberOfTracks();ipart++){
301 AliVParticle* part = fMCEvent->GetTrack(ipart);
302 Bool_t isCocktail = fMCEvent->GetCocktailGenerator(ipart,gen);
303 if (isCocktail && !gen.Contains("Pythia") && !gen.Contains("Hijing") && !gen.Contains("AMPT") && !gen.Contains("DPMJET")) continue;
304 Float_t pt = part->Pt();
305 Float_t eta = part->Eta();
306 Float_t phi = part->Phi();
307 Char_t charge = part->Charge();
308 Int_t mask = part->PdgCode();
309 // TODO
310 // Bool_t isPrimary = fMCEvent->IsPhysicalPrimary(ipart);
311 // if (pt < fMcPtMin) continue;
312 // if (TMath::Abs(eta) > fMcTrackEtaCut) continue;
313 new ((*fMcParticles)[fMcParticles->GetEntriesFast()]) AliCFParticle(pt,eta,phi,charge,mask);
5fe7e785 314 }
5fe7e785 315 }
d8c679e5 316
5fe7e785 317 fTree->Fill();
d8c679e5 318 PostData(1,fListOfHistos);
319 PostData(2,fTree);
5fe7e785 320}
321//-----------------------------------------------------------------------------
322
323
324//-----------------------------------------------------------------------------
d8c679e5 325UInt_t AliAnalysisTaskCFTree::GetFilterMap(AliVTrack* track){
5fe7e785 326 UInt_t mask = 0;
d8c679e5 327 if (track->InheritsFrom("AliAODTrack")) {
328 AliAODTrack* part = (AliAODTrack*) track;
5fe7e785 329 mask = part->GetFilterMap();
330 Double_t nCrossedRaws = part->GetTPCNCrossedRows();
331 Double_t nFindableClusters = part->GetTPCNclsF();
332 Double_t nSharedClusters = part->GetTPCnclsS();
333 Double_t nClusters = part->GetTPCncls();
334 Bool_t itsRefit = part->GetStatus() & AliVTrack::kITSrefit;
335 if (nCrossedRaws/nFindableClusters > fFoundFractionCut) mask |= (1 << 26);
336 if (nCrossedRaws>fCrossedRowsCut) mask |= (1 << 27);
337 if (itsRefit) mask |= (1 << 28);
338 if (nSharedClusters/nClusters<=fSharedClusterCut) mask |= (1 << 29);
339 if (part->GetLabel()<0) mask |= (1 << 31);
d8c679e5 340 } else if (track->InheritsFrom("AliESDtrack")){
341 AliESDtrack* part = (AliESDtrack*) track;
5fe7e785 342 if (!fTrackFilter) AliFatal("Track filter undefined");
343 mask |= fTrackFilter->IsSelected(part);
344 }
345
346 return mask;
347}
348//-----------------------------------------------------------------------------
349
350
351//-----------------------------------------------------------------------------
d8c679e5 352AliCFParticle* AliAnalysisTaskCFTree::AddTrack(AliVTrack* track, UInt_t mask, UInt_t flag){
5fe7e785 353
d8c679e5 354 // skip neutral mc trackicles
355 Char_t charge = track->Charge();
5fe7e785 356 if (charge==0) return NULL;
357
358 // set pt,eta,phi
359 Float_t pt=0,eta=0,phi=0;
d8c679e5 360 if (flag==0 || flag==1){ // AOD or Global ESD tracks
361 pt = track->Pt();
362 eta = track->Eta();
363 phi = track->Phi();
5fe7e785 364 if (flag==1) mask &= (~fHybridConstrainedMask) & (~fTPConlyConstrainedMask);
365 }
366 else if (flag==2) { // Hybrid constrained tracks (ESD)
d8c679e5 367 AliESDtrack* part = (AliESDtrack*) track;
368 const AliExternalTrackParam* param = part->GetConstrainedParam();
5fe7e785 369 pt = param->Pt();
370 eta = param->Eta();
371 phi = param->Phi();
372 mask &= fHybridConstrainedMask;
373 }
374 else if (flag==3) { // TPC only constrained tracks (ESD)
d8c679e5 375 AliESDtrack* part = (AliESDtrack*) track;
5fe7e785 376 AliESDtrack tpcTrack;
d8c679e5 377 if (!part->FillTPCOnlyTrack(tpcTrack)) return NULL;
5fe7e785 378 AliExternalTrackParam param;
d8c679e5 379 const AliESDVertex* vtxSPD = ((AliESDEvent*) fInputEvent)->GetPrimaryVertexSPD();
5fe7e785 380 if (!tpcTrack.RelateToVertexTPC(vtxSPD,fField,1.e30,&param)) return NULL;
381 pt = param.Pt();
382 eta = param.Eta();
383 phi = param.Phi();
384 mask &= fTPConlyConstrainedMask;
385 }
386
387 // kinematic cuts
388 if (pt < fPtMin || TMath::Abs(eta) > fTrackEtaCut) return NULL;
389
d8c679e5 390 AliCFParticle* cftrack = new ((*fTracks)[fTracks->GetEntriesFast()]) AliCFParticle(pt,eta,phi,charge,mask,fStorePidInfo ? 3: 0);
e428489e 391
d8c679e5 392 if (!fStorePidInfo) return cftrack;
e428489e 393 Float_t ncl = track->GetTPCsignalN();
394 Float_t dedx = track->GetTPCsignalTunedOnData(); if (dedx<=0) dedx = track->GetTPCsignal();
395 Float_t beta = -99;
396 if (track->GetStatus()&AliESDtrack::kTOFpid){
397 Double_t tof[5];
398 track->GetIntegratedTimes(tof);
399 beta = tof[0]/track->GetTOFsignal();
400 }
d8c679e5 401 cftrack->SetAt(ncl,0);
402 cftrack->SetAt(dedx,1);
403 cftrack->SetAt(beta,2);
404 return cftrack;
5fe7e785 405}