]> git.uio.no Git - u/mrichter/AliRoot.git/blob - PWGUD/UPC/AliAnalysisTaskUpcTree.cxx
New task to create light-weight tree of UPC events
[u/mrichter/AliRoot.git] / PWGUD / UPC / AliAnalysisTaskUpcTree.cxx
1 /*************************************************************************
2 * Copyright(c) 1998-2008, 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 // Task to create upc tree
17 // evgeny.kryshen@cern.ch
18
19 #include "AliAnalysisTaskUpcTree.h"
20 #include "AliAnalysisTaskSE.h"
21 #include "TChain.h"
22 #include "AliVEvent.h"
23 #include "AliAODEvent.h"
24 #include "AliESDEvent.h"
25 #include "AliVHeader.h"
26 #include "AliMultiplicity.h"
27 #include "AliESDEvent.h"
28 #include "AliESDHeader.h"
29 #include "AliESDMuonTrack.h"
30 #include "AliESDtrack.h"
31 #include "TTree.h"
32 #include "TList.h"
33 #include "TFile.h"
34 #include "TObjString.h"
35 #include "TH1I.h"
36 #include "TLorentzVector.h"
37 #include "AliAnalysisManager.h"
38 #include "AliInputEventHandler.h"
39 #include "AliUpcParticle.h"
40 #include "AliAnalysisFilter.h"
41 #include "AliESDtrackCuts.h"
42 #include "AliMuonTrackCuts.h"
43 #include "AliTriggerIR.h"
44 ClassImp(AliAnalysisTaskUpcTree)
45
46 //-----------------------------------------------------------------------------
47 AliAnalysisTaskUpcTree::AliAnalysisTaskUpcTree(const char* name) :
48   AliAnalysisTaskSE(name),
49   fIsMC(0),
50   fIsAOD(0),
51   fMuonTrackCuts(new AliMuonTrackCuts),
52   fTrackFilter(NULL),
53   fListOfHistos(NULL),
54   fEventStatistics(NULL),
55   fTriggersPerRun(NULL),
56   fTree(NULL),
57   fTPCtracks(NULL),
58   fMUONtracks(NULL),
59   fChunkFileName(new TObjString()),
60   fEventInFile(-1),
61   fPeriod(-1),
62   fOrbit(-1),
63   fBC(-1),
64   fL0inputs(0),
65   fL1inputs(0),
66   fRunNumber(0),
67   fNofTracklets(0),
68   fBBonlineV0A(kFALSE),
69   fBGonlineV0A(kFALSE),
70   fBBonlineV0C(kFALSE),
71   fBGonlineV0C(kFALSE),
72   fV0ADecision(kFALSE),
73   fV0CDecision(kFALSE),
74   fZNAtdc(kFALSE),
75   fZNCtdc(kFALSE),
76   fZPAtdc(kFALSE),
77   fZPCtdc(kFALSE),
78   fZEM1tdc(kFALSE),
79   fZEM2tdc(kFALSE),
80   fZNAenergy(-1000),
81   fZNCenergy(-1000),
82   fZPAenergy(-1000),
83   fZPCenergy(-1000),
84   fZEM1energy(-1000),
85   fZEM2energy(-1000),
86   fZNAtower0(-1000),
87   fZNCtower0(-1000),
88   fZPAtower0(-1000),
89   fZPCtower0(-1000),
90   fVtxX(-1000),
91   fVtxY(-1000),
92   fVtxZ(-1000),
93   fVtxTPC(kFALSE),
94   fIR1(),
95   fIR2(),
96   fFOmap(),
97   fFiredChipMap()
98 {
99   fMuonTrackCuts->SetPassName("muon_pass2");
100   fMuonTrackCuts->SetAllowDefaultParams(kTRUE);
101   fMuonTrackCuts->SetFilterMask(AliMuonTrackCuts::kMuPdca);
102
103   for (Int_t i=0;i<NTRIGGERS;i++) fTriggerFired[i]=0;
104   for (Int_t i=0;i<32;i++) {
105     fV0AMult[i]=0;
106     fV0CMult[i]=0;
107     fV0ATime[i]=0;
108     fV0CTime[i]=0;
109     fBBTriggerV0A[i]=0;
110     fBGTriggerV0A[i]=0;
111     fBBTriggerV0C[i]=0;
112     fBGTriggerV0C[i]=0;
113   }
114   for (Int_t i=0;i<64;i++) {
115     fBBFlag[i]=0;
116     fBGFlag[i]=0;
117   }
118   DefineInput(0,TChain::Class());
119   DefineOutput(1,TList::Class());
120   DefineOutput(2,TTree::Class());
121 }
122 //-----------------------------------------------------------------------------
123
124
125 //-----------------------------------------------------------------------------
126 void AliAnalysisTaskUpcTree::NotifyRun(){
127   if (fMuonTrackCuts) fMuonTrackCuts->SetRun(fInputHandler); 
128   fInputHandler->SetNeedField();
129 }
130 //-----------------------------------------------------------------------------
131
132
133 //-----------------------------------------------------------------------------
134 void AliAnalysisTaskUpcTree::UserCreateOutputObjects(){
135   fListOfHistos = new TList();
136   fListOfHistos->SetOwner();
137   fEventStatistics = new TH1I("fEventStatistics","",10,0,10);
138   fEventStatistics->SetBit(TH1::kCanRebin);
139   fListOfHistos->Add(fEventStatistics);
140
141   fTriggersPerRun = new TH2I("fTriggersPerRun",";;Events",2000,195600,197600,NTRIGGERS,-0.5,NTRIGGERS+0.5);
142   fListOfHistos->Add(fTriggersPerRun);
143   
144   TDirectory *owd = gDirectory;
145   OpenFile(1);
146   fTree = new TTree("events","events");
147   owd->cd();
148   fTPCtracks = new TClonesArray("AliUpcParticle",100);
149   fMUONtracks = new TClonesArray("AliUpcParticle",10);
150   fTree->Branch("fTriggerFired",&fTriggerFired,Form("fTriggerFired[%i]/O",NTRIGGERS));
151   fTree->Branch("fChunkFileName",&fChunkFileName);
152   fTree->Branch("fEventInFile",&fEventInFile);
153   fTree->Branch("fPeriod",&fPeriod);
154   fTree->Branch("fOrbit",&fOrbit);
155   fTree->Branch("fBC",&fBC);
156   fTree->Branch("fRunNumber",&fRunNumber);
157   fTree->Branch("fNofTracklets",&fNofTracklets);
158   fTree->Branch("fV0AMult",&fV0AMult,"fV0AMult[32]/F");
159   fTree->Branch("fV0CMult",&fV0CMult,"fV0CMult[32]/F");
160   fTree->Branch("fV0ATime",&fV0ATime,"fV0ATime[32]/F");
161   fTree->Branch("fV0CTime",&fV0CTime,"fV0CTime[32]/F");
162   fTree->Branch("fBBFlag",&fBBFlag,"fBBFlag[64]/O");
163   fTree->Branch("fBGFlag",&fBGFlag,"fBGFlag[64]/O");
164   fTree->Branch("fBBTriggerV0A",&fBBTriggerV0A,"fBBTriggerV0A[32]/O");
165   fTree->Branch("fBGTriggerV0A",&fBGTriggerV0A,"fBGTriggerV0A[32]/O");
166   fTree->Branch("fBBTriggerV0C",&fBBTriggerV0C,"fBBTriggerV0C[32]/O");
167   fTree->Branch("fBGTriggerV0C",&fBGTriggerV0C,"fBGTriggerV0C[32]/O");
168   fTree->Branch("fBBonlineV0A",&fBBonlineV0A);
169   fTree->Branch("fBGonlineV0A",&fBGonlineV0A);
170   fTree->Branch("fBBonlineV0C",&fBBonlineV0C);
171   fTree->Branch("fBGonlineV0C",&fBGonlineV0C);
172   fTree->Branch("fV0ADecision",&fV0ADecision);
173   fTree->Branch("fV0CDecision",&fV0CDecision);
174   fTree->Branch("fZNAtdc",&fZNAtdc);
175   fTree->Branch("fZNCtdc",&fZNCtdc);
176   fTree->Branch("fZPAtdc",&fZPAtdc);
177   fTree->Branch("fZPCtdc",&fZPCtdc);
178   fTree->Branch("fZEM1tdc",&fZEM1tdc);
179   fTree->Branch("fZEM2tdc",&fZEM2tdc);
180   fTree->Branch("fZPAenergy",&fZPAenergy);
181   fTree->Branch("fZPCenergy",&fZPCenergy);
182   fTree->Branch("fZNAenergy",&fZNAenergy);
183   fTree->Branch("fZNCenergy",&fZNCenergy);
184   fTree->Branch("fZEM1energy",&fZEM1energy);
185   fTree->Branch("fZEM2energy",&fZEM2energy);
186   fTree->Branch("fZNAtower0",&fZNAtower0);
187   fTree->Branch("fZNCtower0",&fZNCtower0);
188   fTree->Branch("fZPAtower0",&fZPAtower0);
189   fTree->Branch("fZPCtower0",&fZPCtower0);
190   fTree->Branch("fVtxX",&fVtxX);
191   fTree->Branch("fVtxY",&fVtxY);
192   fTree->Branch("fVtxZ",&fVtxZ);
193   fTree->Branch("fVtxTPC",&fVtxTPC);
194   fTree->Branch("fTPCtracks",&fTPCtracks);
195   fTree->Branch("fMUONtracks",&fMUONtracks);
196   fTree->Branch("fNofITSClusters",&fNofITSClusters,"fNofITSClusters[6]/I");
197   fTree->Branch("fIR1",&fIR1);
198   fTree->Branch("fIR2",&fIR2);
199   fTree->Branch("fL0inputs",&fL0inputs);
200   fTree->Branch("fL1inputs",&fL1inputs);
201   fTree->Branch("fFOmap",&fFOmap);
202   fTree->Branch("fFiredChipMap",&fFiredChipMap);
203
204   PostData(1,fListOfHistos);
205   PostData(2,fTree);
206 }
207 //-----------------------------------------------------------------------------
208
209
210 //-----------------------------------------------------------------------------
211 void AliAnalysisTaskUpcTree::UserExec(Option_t *){
212   fMUONtracks->Clear();
213   fTPCtracks->Clear();
214   fEventStatistics->Fill("before cuts",1);
215   AliVEvent* event = fInputHandler->GetEvent();
216   if (!event) return;
217   AliAODEvent* aod =  fIsAOD ? (AliAODEvent*) event : 0;
218   AliESDEvent* esd = !fIsAOD ? (AliESDEvent*) event : 0;
219   
220   fEventStatistics->Fill("after event check",1);
221   
222   TString trigger = event->GetFiredTriggerClasses();
223
224   for (Int_t i=0;i<NTRIGGERS;i++) fTriggerFired[i]=0;
225   fTriggerFired[ 0] = 1;
226   fTriggerFired[ 1] = trigger.Contains("CCUP7-B");
227   fTriggerFired[ 2] = trigger.Contains("CMUP5-B");
228   fTriggerFired[ 3] = trigger.Contains("CMUP7-B");
229   fTriggerFired[ 4] = trigger.Contains("CMUP9-B");
230   fTriggerFired[ 5] = trigger.Contains("CMSL7-B-NOPF-MUON");
231   fTriggerFired[ 6] = trigger.Contains("CMSL7-B-NOPF-ALLNOTRD");
232
233   fRunNumber  = event->GetRunNumber();
234   Bool_t isTrigger=0;
235   for (Int_t i=0;i<NTRIGGERS;i++){
236     if (!fTriggerFired[i]) continue;
237     fTriggersPerRun->Fill(fRunNumber,i);
238     if (!i) continue;
239     isTrigger=1;
240   }
241   if (!isTrigger && !fIsMC) { PostData(1,fListOfHistos); return; }
242   fEventStatistics->Fill("after trigger check",1);
243
244   fNofTracklets = fIsAOD ? aod->GetTracklets()->GetNumberOfTracklets() :  esd->GetMultiplicity()->GetNumberOfTracklets();
245
246   if (fNofTracklets>1 && fTriggerFired[5]) { PostData(1,fListOfHistos); return; }
247   if (fNofTracklets>1 && fTriggerFired[6]) { PostData(1,fListOfHistos); return; }
248   
249   fEventStatistics->Fill("after tracklet check",1);
250
251   fPeriod     = event->GetPeriodNumber();
252   fOrbit      = event->GetOrbitNumber();
253   fBC         = event->GetBunchCrossNumber();
254   fL0inputs   = fIsAOD ? aod->GetHeader()->GetL0TriggerInputs() : esd->GetHeader()->GetL0TriggerInputs();
255   fL1inputs   = fIsAOD ? aod->GetHeader()->GetL1TriggerInputs() : esd->GetHeader()->GetL1TriggerInputs();
256   
257   for (Int_t i=0;i<6;i++) fNofITSClusters[i] = fIsAOD ? aod->GetHeader()->GetNumberOfITSClusters(i) : esd->GetMultiplicity()->GetNumberOfITSClusters(i);
258   
259   fIR1 = fIsAOD ? esd->GetHeader()->GetIRInt1InteractionMap() : esd->GetHeader()->GetIRInt1InteractionMap();
260   fIR2 = fIsAOD ? esd->GetHeader()->GetIRInt2InteractionMap() : esd->GetHeader()->GetIRInt2InteractionMap();
261   
262   AliVVZERO* vzero = event->GetVZEROData();
263   for (Int_t i=0; i<32; i++){
264     fV0AMult[i] = vzero->GetMultiplicityV0A(i);
265     fV0CMult[i] = vzero->GetMultiplicityV0C(i);
266     fV0ATime[i] = vzero->GetV0ATime();
267     fV0CTime[i] = vzero->GetV0CTime();
268     fBBTriggerV0A[i] = vzero->BBTriggerV0A(i);
269     fBGTriggerV0A[i] = vzero->BGTriggerV0A(i);
270     fBBTriggerV0C[i] = vzero->BBTriggerV0C(i);
271     fBGTriggerV0C[i] = vzero->BGTriggerV0C(i);
272   }
273
274   fBBonlineV0A = kFALSE;
275   fBGonlineV0A = kFALSE;
276   fBBonlineV0C = kFALSE;
277   fBGonlineV0C = kFALSE;
278   for (Int_t i=0; i<64; i++){
279     fBBFlag[i] = vzero->GetBBFlag(i);
280     fBGFlag[i] = vzero->GetBGFlag(i);
281     if (fBBFlag[i] && i>=32) fBBonlineV0A = kTRUE;
282     if (fBGFlag[i] && i>=32) fBGonlineV0A = kTRUE;
283     if (fBBFlag[i] && i <32) fBBonlineV0C = kTRUE;
284     if (fBGFlag[i] && i <32) fBGonlineV0C = kTRUE;
285   }
286   
287   fV0ADecision = vzero->GetV0ADecision();
288   fV0CDecision = vzero->GetV0CDecision();
289
290   // ZDC data
291   AliVZDC* zdc = event->GetZDCData();
292   fZNAenergy  = zdc->GetZNAEnergy();
293   fZNCenergy  = zdc->GetZNCEnergy();
294   fZPAenergy  = zdc->GetZPAEnergy();
295   fZPCenergy  = zdc->GetZPCEnergy();
296   fZEM1energy = zdc->GetZEM1Energy();
297   fZEM2energy = zdc->GetZEM2Energy();
298   fZNAtower0  = zdc->GetZNATowerEnergy()[0];
299   fZNCtower0  = zdc->GetZNCTowerEnergy()[0];
300   fZPAtower0  = zdc->GetZPATowerEnergy()[0];
301   fZPCtower0  = zdc->GetZPCTowerEnergy()[0];
302   // ZDC timing
303   fZEM1tdc = kFALSE;
304   fZEM2tdc = kFALSE;
305   fZNCtdc  = kFALSE;
306   fZPCtdc  = kFALSE;
307   fZNAtdc  = kFALSE;
308   fZPAtdc  = kFALSE;
309   if (!fIsAOD) {
310     AliESDZDC* esdzdc = (AliESDZDC*) zdc;
311     for(Int_t i=0;i<4;i++) {
312       if (esdzdc->GetZDCTDCData( 8,i)) fZEM1tdc = kTRUE;
313       if (esdzdc->GetZDCTDCData( 9,i)) fZEM2tdc = kTRUE;
314       if (esdzdc->GetZDCTDCData(10,i)) fZNCtdc  = kTRUE;
315       if (esdzdc->GetZDCTDCData(11,i)) fZPCtdc  = kTRUE;
316       if (esdzdc->GetZDCTDCData(12,i)) fZNAtdc  = kTRUE;
317       if (esdzdc->GetZDCTDCData(13,i)) fZPAtdc  = kTRUE;
318     }
319   }
320   
321   if (!esd) return; // AOD not yet implemented
322   
323   fEventInFile = esd->GetHeader()->GetEventNumberInFile();
324   fChunkFileName->SetString(((TTree*) GetInputData(0))->GetCurrentFile()->GetName());
325   
326   const AliESDVertex* vertex  = esd->GetPrimaryVertex();
327   fVtxX  = -1000;
328   fVtxY  = -1000;
329   fVtxZ  = -1000;
330   fVtxTPC = 1;
331   if (vertex) {
332     fVtxX  = vertex->GetX();
333     fVtxY  = vertex->GetY();
334     fVtxZ  = vertex->GetZ();
335     TString name(vertex->GetName());
336     fVtxTPC = name.CompareTo("PrimaryVertex") && name.CompareTo("SPDVertex");
337   }
338   
339   fFOmap = esd->GetMultiplicity()->GetFastOrFiredChips();
340   fFiredChipMap = esd->GetMultiplicity()->GetFiredChipMap();
341   
342   for (Int_t itr=0;itr<event->GetNumberOfTracks();itr++){
343     AliESDtrack* track = (AliESDtrack*) esd->GetTrack(itr);
344     Float_t pt   = track->Pt();
345     Float_t eta  = track->Eta();
346     Float_t phi  = track->Phi();
347     Short_t charge = track->Charge();
348     UInt_t mask = 0;//track->GetFilterMap();
349     
350     if (!fTrackFilter) AliFatal("Track filter undefined");
351     mask |= fTrackFilter->IsSelected(track);
352
353     if (!mask) continue;
354     UInt_t itsClusterMap      = track->GetITSClusterMap();
355     Bool_t itsRefit           = track->GetStatus() & AliVTrack::kITSrefit;
356     Bool_t tpcRefit           = track->GetStatus() & AliVTrack::kTPCrefit;
357     Bool_t kink               = track->GetKinkIndex(0)>0;
358     mask |= itsRefit      << 20;
359     mask |= tpcRefit      << 21;
360     mask |= kink          << 22;
361     mask |= itsClusterMap << 23;
362     
363     AliUpcParticle* part = new ((*fTPCtracks)[fTPCtracks->GetEntriesFast()]) AliUpcParticle(pt,eta,phi,charge,mask,10);
364     Float_t dedx              = track->GetTPCsignal();
365     Float_t nCrossedRaws      = track->GetTPCCrossedRows();
366     Float_t nFindableClusters = track->GetTPCNclsF();
367     Float_t nSharedClusters   = track->GetTPCnclsS();
368     Float_t nClusters         = track->GetTPCncls();
369     Float_t chi2tpc           = track->GetTPCchi2();
370     Float_t chi2its           = track->GetITSchi2();
371     Float_t chi2golden        = 0;//vertex ? track->GetChi2TPCConstrainedVsGlobal(vertex) : 0;
372     Float_t bxy,bz; 
373     track->GetImpactParameters(bxy,bz);
374     part->SetAt(dedx,0);
375     part->SetAt(nCrossedRaws,1);
376     part->SetAt(nFindableClusters,2);
377     part->SetAt(nSharedClusters,3);
378     part->SetAt(nClusters,4);
379     part->SetAt(chi2tpc,5);
380     part->SetAt(chi2its,6);
381     part->SetAt(chi2golden,7);
382     part->SetAt(bxy,8);
383     part->SetAt(bz,9);
384   }
385   
386   for (Int_t itr=0;itr<esd->GetNumberOfMuonTracks();itr++){
387     AliESDMuonTrack* track = esd->GetMuonTrack(itr);
388     if (!track->ContainTrackerData()) continue;
389     Float_t pt     = track->Pt();
390     Float_t eta    = track->Eta();
391     Float_t phi    = track->Phi();
392     Short_t charge = track->Charge();
393     UInt_t mask    = fMuonTrackCuts->IsSelected(track);
394     Float_t dca    = track->GetDCA();
395     Float_t chi2   = track->GetChi2();
396     Float_t ndf    = track->GetNDF();
397     Float_t rabs   = track->GetRAtAbsorberEnd();
398     Float_t match  = track->GetMatchTrigger();
399     AliUpcParticle* part = new ((*fMUONtracks)[fMUONtracks->GetEntriesFast()]) AliUpcParticle(pt,eta,phi,charge,mask,5);
400     part->SetAt(dca,0);
401     part->SetAt(chi2,1);
402     part->SetAt(ndf,2);
403     part->SetAt(rabs,3);
404     part->SetAt(match,4);
405   }
406   
407   fTree->Fill();
408   PostData(1,fListOfHistos);
409   PostData(2,fTree);
410 }
411 //-----------------------------------------------------------------------------
412