]> git.uio.no Git - u/mrichter/AliRoot.git/blame - PWG3/AliAnalysisTaskSingleMu.cxx
- Reset TProcessID count after each event
[u/mrichter/AliRoot.git] / PWG3 / AliAnalysisTaskSingleMu.cxx
CommitLineData
aad6618e 1/**************************************************************************
2 * Copyright(c) 1998-2007, 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//----------------------------------------------------------------------------
17// Implementation of the single muon analysis class
18// An example of usage can be found in the macro runSingleMuAnalysis.C.
19//----------------------------------------------------------------------------
20
21#define AliAnalysisTaskSingleMu_cxx
22
23// ROOT includes
24#include "Riostream.h"
25#include "TChain.h"
26#include "TH1.h"
27#include "TCanvas.h"
28#include "TSystem.h"
29#include "TROOT.h"
30#include "TParticle.h"
31#include "TLorentzVector.h"
32
33// STEER includes
34#include "AliLog.h"
35
36#include "AliAODEvent.h"
37#include "AliAODTrack.h"
38#include "AliAODVertex.h"
39#include "AliAODInputHandler.h"
40
41#include "AliAnalysisTask.h"
42#include "AliAnalysisDataSlot.h"
43#include "AliAnalysisManager.h"
44#include "AliAnalysisTaskSingleMu.h"
45
46ClassImp(AliAnalysisTaskSingleMu)
47
48//________________________________________________________________________
49AliAnalysisTaskSingleMu::AliAnalysisTaskSingleMu(const char *name) :
50 AliAnalysisTask(name,""),
51 fAOD(0),
52 fOutputContainer(0)
53{
54 //
55 /// Constructor.
56 //
57 ResetHistos();
58 // Input slot #0 works with an Ntuple
59 DefineInput(0, TChain::Class());
60 // Output slot #0 writes into a TObjArray container
61 DefineOutput(0, TObjArray::Class());
62}
63
64//___________________________________________________________________________
65void AliAnalysisTaskSingleMu::ConnectInputData(Option_t *)
66{
67 //
68 /// Connect AOD here
69 /// Called once
70 //
71
72 TTree* tree = dynamic_cast<TTree*> (GetInputData(0));
73 if (!tree) {
74 Printf("ERROR: Could not read chain from input slot 0");
75 } else {
76 /*
77 // Disable all branches and enable only the needed ones
78 // The next two lines are different when data produced as AliAODEvent is read
79 tree->SetBranchStatus("*", kFALSE);
80 tree->SetBranchStatus("fTracks.*", kTRUE);
81 */
82
83 AliAODInputHandler *aodH = dynamic_cast<AliAODInputHandler*> (AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler());
84
85 if (!aodH) {
86 Printf("ERROR: Could not get AODInputHandler");
87 } else
88 printf(" ConnectInputData of task %s\n", GetName());
89 fAOD = aodH->GetEvent();
90 }
91}
92
93//___________________________________________________________________________
94void AliAnalysisTaskSingleMu::CreateOutputObjects()
95{
96 //
97 /// Create output histograms
98 //
99 printf(" CreateOutputObjects of task %s\n", GetName());
100
101 Int_t ptBins = 60;
102 Float_t ptLow = 0., ptHigh = 30.;
103 Char_t *ptName = "P_{t} (GeV/c)";
104
105 Int_t vzBins = 40;
106 Float_t vzLow = -20., vzHigh = 20.;
107 Char_t *vzName = "Vz (cm)";
108
109 TString baseName, histoName;
110 fOutputContainer = new TObjArray(fgkNhistos*fgkNTrigCuts);
111 fOutputContainer->SetName("SingleMuAnalysisContainer");
112 Int_t iHisto = 0;
113
114 for(Int_t iTrig=0; iTrig<fgkNTrigCuts; iTrig++){
115
116 // 2D histos
117 if(!fVzVsPt[iTrig]){
118 baseName = "fVzVsPt";
119 histoName = baseName + trigName[iTrig];
120 fVzVsPt[iTrig] = new TH2F(histoName, histoName,
121 ptBins, ptLow, ptHigh,
122 vzBins, vzLow, vzHigh);
123 fVzVsPt[iTrig]->GetXaxis()->SetTitle(ptName);
124 fVzVsPt[iTrig]->GetYaxis()->SetTitle(vzName);
125
126 fOutputContainer->AddAt(fVzVsPt[iTrig], iHisto);
127 iHisto++;
128 }
129 }
130}
131
132//________________________________________________________________________
133void AliAnalysisTaskSingleMu::Exec(Option_t *)
134{
135 //
136 /// Main loop
137 /// Called for each event
138 //
139
140 TTree *tinput = (TTree*)GetInputData(0);
141 tinput->GetReadEntry();
142
143 if (!fAOD) {
144 Printf("ERROR: fAOD not available");
145 return;
146 }
147
148
149 // Object declaration
150 AliAODTrack *muonTrack = 0x0;
151 TLorentzVector lorVec;
152 Int_t trigMatch = -1;
153
154 Int_t nTracks = fAOD->GetNumberOfTracks();
155 for (Int_t itrack = 0; itrack < nTracks; itrack++) {
156 muonTrack = fAOD->GetTrack(itrack);
157
158 // Apply cuts
159 if(!MuonPassesCuts(*muonTrack, lorVec, trigMatch)) continue;
160
161 for(Int_t iTrig=0; iTrig<=trigMatch; iTrig++){
162 fVzVsPt[iTrig]->Fill(lorVec.Pt(), fAOD->GetPrimaryVertex()->GetZ());
163 }
164 }
165
166 // Post final data. It will be written to a file with option "RECREATE"
167 PostData(0, fOutputContainer);
168}
169
170//________________________________________________________________________
171void AliAnalysisTaskSingleMu::Terminate(Option_t *) {
172 //
173 /// Draw some histogram at the end.
174 //
175 if (!gROOT->IsBatch()) {
176 TCanvas *c1 = new TCanvas("c1","Vz vs Pt",10,10,310,310);
177 c1->SetFillColor(10); c1->SetHighLightColor(10);
178 c1->SetLeftMargin(0.15); c1->SetBottomMargin(0.15);
179 c1->Divide(2,2);
180 for(Int_t iTrig=0; iTrig<fgkNTrigCuts; iTrig++){
181 c1->cd(iTrig+1);
182 fVzVsPt[iTrig]->DrawCopy("COLZ");
183 }
184 }
185}
186
187//________________________________________________________________________
188void AliAnalysisTaskSingleMu::ResetHistos()
189{
190 //
191 /// Reset histograms
192 //
193 for(Int_t iTrig=0; iTrig<fgkNTrigCuts; iTrig++){
194 fVzVsPt[iTrig] = 0x0;
195 }
196 trigName[kNoMatchTrig] = "NoMatchTrig";
197 trigName[kAllPtTrig] = "AllPtTrig";
198 trigName[kLowPtTrig] = "LowPtTrig";
199 trigName[kHighPtTrig] = "HighPtTrig";
200}
201
202
203//________________________________________________________________________
204Bool_t AliAnalysisTaskSingleMu::MuonPassesCuts(AliAODTrack &muonTrack,
205 TLorentzVector &lorVec,
206 Int_t &trigMatch)
207{
208 //
209 /// Fill lorentz vector and check cuts
210 //
211
212 // Check if track is a muon
213 if(muonTrack.GetMostProbablePID()!=AliAODTrack::kMuon) return kFALSE;
214
215 // Check if track is triggered
216 trigMatch = kNoMatchTrig;
217 if (muonTrack.MatchTriggerHighPt()) {
218 trigMatch = kHighPtTrig;
219 } else if (muonTrack.MatchTriggerLowPt()) {
220 trigMatch = kLowPtTrig;
221 } else if (muonTrack.MatchTriggerAnyPt()){
222 trigMatch = kAllPtTrig;
223 }
224
225 // Fill track parameters
226 Double_t px = muonTrack.Px();
227 Double_t py = muonTrack.Py();
228 Double_t pz = muonTrack.Pz();
229 Double_t p = muonTrack.P();
230
231 const Double_t kMuonMass = 0.105658369;
232
233 Double_t energy = TMath::Sqrt(p*p + kMuonMass*kMuonMass);
234 lorVec.SetPxPyPzE(px,py,pz,energy);
235
236 return kTRUE;
237}