]> git.uio.no Git - u/mrichter/AliRoot.git/blob - PWGCF/Correlations/Base/AliAnalysisTaskCFTree.cxx
Merge branch 'TPCdev' of https://git.cern.ch/reps/AliRoot into TPCdev
[u/mrichter/AliRoot.git] / PWGCF / Correlations / Base / AliAnalysisTaskCFTree.cxx
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"
27 #include "AliAODTrack.h"
28 #include "AliESDtrack.h"
29 #include "AliExternalTrackParam.h"
30 #include "AliCentrality.h"
31 #include "AliAnalysisFilter.h"
32 #include "AliVMultiplicity.h"
33 #include "AliAnalysisUtils.h"
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"
42 ClassImp(AliAnalysisTaskCFTree)
43
44 //-----------------------------------------------------------------------------
45 AliAnalysisTaskCFTree::AliAnalysisTaskCFTree(const char* name) :
46   AliAnalysisTaskSE(name),
47   fTrackFilter(0x0),
48   fHybridConstrainedMask(0),
49   fTPConlyConstrainedMask(0),
50   fUtils(0x0),
51   fListOfHistos(0x0),
52   fEventStatistics(0x0),
53   fTree(0x0),
54   fTracks(0x0),
55   fTracklets(0x0),
56   fMuons(0x0),
57   fMcParticles(0x0),
58   fField(0),
59   fCentrality(),
60   fVtxZ(0),
61   fVtxTPConly(0),
62   fVtxContributors(0),
63   fPeriod(0),
64   fOrbit(),
65   fBc(),
66   fSelectMask(0),
67   fIsPileupSPD(0),
68   fIsPileupMV(0),
69   fSelectBit(AliVEvent::kAny),
70   fZVertexCut(10.),
71   fTrackFilterBit(0xffffffff),
72   fTrackEtaCut(1.0),
73   fPtMin(0.15),
74   fSharedClusterCut(0.4),
75   fCrossedRowsCut(100),
76   fFoundFractionCut(0.8),
77   fDphiCut(1.e9),
78   fStoreTracks(0),
79   fStoreTracklets(0),
80   fStoreMuons(0),
81   fStoreMcTracks(0),
82   fStoreMcTracklets(0),
83   fStoreMcMuons(0),
84   fStorePidInfo(0)
85 {
86   Info("AliAnalysisTaskCFTree","Calling Constructor");
87   DefineInput(0,TChain::Class());
88   DefineOutput(1,TList::Class());
89   DefineOutput(2,TTree::Class());
90 }
91 //-----------------------------------------------------------------------------
92
93
94 //-----------------------------------------------------------------------------
95 void AliAnalysisTaskCFTree::UserCreateOutputObjects(){
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
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);
107   // create file-resident tree
108   TDirectory *owd = gDirectory;
109   OpenFile(1);
110   fTree = new TTree("events","events");
111   owd->cd();
112   fTree->Branch("cent",&fCentrality,"fCentrality[6]/F");
113   fTree->Branch("vtxz",&fVtxZ);
114   fTree->Branch("vtxTPConly",&fVtxTPConly);
115   fTree->Branch("vtxContributors",&fVtxContributors);
116   fTree->Branch("field",&fField);
117   fTree->Branch("run",&fCurrentRunNumber);
118   fTree->Branch("period",&fPeriod);
119   fTree->Branch("orbit",&fOrbit);
120   fTree->Branch("bc",&fBc);
121   fTree->Branch("mask",&fSelectMask);
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);
133 }
134 //-----------------------------------------------------------------------------
135
136
137 //-----------------------------------------------------------------------------
138 void AliAnalysisTaskCFTree::UserExec(Option_t *){
139   fEventStatistics->Fill("before cuts",1);
140   
141   if (!fInputEvent) return;
142   fEventStatistics->Fill("after event check",1);
143   
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);
170   
171   fSelectMask = fInputHandler->IsEventSelected();
172   if (!(fSelectMask & fSelectBit)) return;
173   
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;
204
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);
210       }
211     }
212   }
213   
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);
240     }
241   }
242   
243   AliAODEvent* aod = dynamic_cast<AliAODEvent*> (fInputEvent);
244   if (fMuons && aod){ // aod only
245     fMuons->Clear();
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");
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);
284       }
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);
294     }
295   }
296
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);
314     }
315   }
316
317   fTree->Fill();
318   PostData(1,fListOfHistos);
319   PostData(2,fTree);
320 }
321 //-----------------------------------------------------------------------------
322
323
324 //-----------------------------------------------------------------------------
325 UInt_t AliAnalysisTaskCFTree::GetFilterMap(AliVTrack* track){
326   UInt_t mask = 0;
327   if (track->InheritsFrom("AliAODTrack")) {
328     AliAODTrack* part = (AliAODTrack*) track;
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);
340   } else if (track->InheritsFrom("AliESDtrack")){
341     AliESDtrack* part = (AliESDtrack*) track;
342     if (!fTrackFilter) AliFatal("Track filter undefined");
343     mask |= fTrackFilter->IsSelected(part);
344   }
345   
346   return mask;
347 }
348 //-----------------------------------------------------------------------------
349
350
351 //-----------------------------------------------------------------------------
352 AliCFParticle* AliAnalysisTaskCFTree::AddTrack(AliVTrack* track, UInt_t mask, UInt_t flag){
353
354   // skip neutral mc trackicles
355   Char_t charge = track->Charge();
356   if (charge==0) return NULL;
357   
358   // set pt,eta,phi
359   Float_t pt=0,eta=0,phi=0;
360   if (flag==0 || flag==1){ // AOD or Global ESD tracks
361     pt  = track->Pt();
362     eta = track->Eta();
363     phi = track->Phi();
364     if  (flag==1) mask &= (~fHybridConstrainedMask) & (~fTPConlyConstrainedMask);
365   } 
366   else if (flag==2) { // Hybrid constrained tracks (ESD)
367     AliESDtrack* part = (AliESDtrack*) track;
368     const AliExternalTrackParam* param = part->GetConstrainedParam();
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)
375     AliESDtrack* part = (AliESDtrack*) track;
376     AliESDtrack tpcTrack;
377     if (!part->FillTPCOnlyTrack(tpcTrack)) return NULL;
378     AliExternalTrackParam param;
379     const AliESDVertex* vtxSPD = ((AliESDEvent*) fInputEvent)->GetPrimaryVertexSPD();
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
390   AliCFParticle* cftrack = new ((*fTracks)[fTracks->GetEntriesFast()]) AliCFParticle(pt,eta,phi,charge,mask,fStorePidInfo ? 3: 0);
391
392   if (!fStorePidInfo) return cftrack;
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   }
401   cftrack->SetAt(ncl,0);
402   cftrack->SetAt(dedx,1);
403   cftrack->SetAt(beta,2);
404   return cftrack;
405 }