]> git.uio.no Git - u/mrichter/AliRoot.git/blame - PWG/muon/AliAnalysisTaskAODvsESD.cxx
Added Tender to PHOSPi0Flow single-task macros.
[u/mrichter/AliRoot.git] / PWG / muon / AliAnalysisTaskAODvsESD.cxx
CommitLineData
27de2dfb 1
2/* $Id$ */
3
fe9005e3 4#include "TChain.h"
5#include "TTree.h"
6#include "TNtuple.h"
7#include "TBranch.h"
8#include "TH1F.h"
9#include "TCanvas.h"
10#include <TLorentzVector.h>
11#include <TVector3.h>
12
13#include "AliAnalysisTask.h"
14#include "AliAnalysisManager.h"
15#include "AliESDInputHandler.h"
16#include "AliESDEvent.h"
17#include "AliESDMuonTrack.h"
18#include "AliAODInputHandler.h"
19#include "AliAODHandler.h"
20#include "AliAODEvent.h"
21#include "AliAnalysisTaskAODvsESD.h"
22
23ClassImp(AliAnalysisTaskAODvsESD)
24
25//________________________________________________________________________
26AliAnalysisTaskAODvsESD::AliAnalysisTaskAODvsESD(const char *name)
27: AliAnalysisTask(name, ""), fESD(0), fAOD(0), fList(0), fMuonNtuple(0), fMuonNtupleAOD(0), fInvMass(0), fInvMassAOD(0)
28{
29 // Constructor
30 // Define input and output slots here
31 // Input slot #0 works with a TChain
32 DefineInput(0, TChain::Class());
33 // Output slot #0 writes NTuple/histos into a TList
34 DefineOutput(0, TList::Class());
35}
36
37//________________________________________________________________________
38void AliAnalysisTaskAODvsESD::ConnectInputData(Option_t *)
39{
40 // Connect ESD here
41 TTree* esdTree = dynamic_cast<TTree*> (GetInputData(0));
42 if (!esdTree) {
43 Printf("ERROR: Could not read chain from input slot 0");
44 } else {
45 AliESDInputHandler *esdH = dynamic_cast<AliESDInputHandler*> (AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler());
46 if (!esdH) {
47 Printf("ERROR: Could not get ESDInputHandler");
48 } else
49 fESD = esdH->GetEvent();
50 }
51
52 // Connect AOD here
53 AliAODHandler *aodH = dynamic_cast<AliAODHandler*> (AliAnalysisManager::GetAnalysisManager()->GetOutputEventHandler());
54 if (!aodH) {
55 Printf("ERROR: Could not get AODHandler");
56 } else
57 fAOD = aodH->GetAOD();
58}
59
60//________________________________________________________________________
61void AliAnalysisTaskAODvsESD::CreateOutputObjects()
62{
63 // This method has to be called INSIDE the user redefined CreateOutputObjects
64 // method, before creating each object corresponding to the output containers
65 // that are to be written to a file. This need to be done in general for the big output
66 // objects that may not fit memory during processing.
67 OpenFile(0);
68
69 // Create Ntuples
70 // For single muons: thetaX, thetaY, ptInv, eta, phi, theta, px, py, pz,ch
71 fMuonNtuple = new TNtuple("fMuonNtuple","Muon information","thX:thY:ptI:eta:phi:theta:px:py:pz");
72 fMuonNtupleAOD = new TNtuple("fMuonNtupleAOD","Muon information","etaAOD:phiAOD:thetaAOD:pxAOD:pyAOD:pzAOD");
73 // Create histos for inv mass
74 fInvMass = new TH1F("fInvMass","Inv. mass from ESDs",140,0,7);
75 fInvMassAOD = new TH1F("fInvMassAOD","Inv. mass from AOD",140,0,7);
76
77 // Add Ntuples to the list
78 fList = new TList();
79 fList->Add(fMuonNtuple);
80 fList->Add(fMuonNtupleAOD);
81 fList->Add(fInvMass);
82 fList->Add(fInvMassAOD);
83}
84
85//________________________________________________________________________
86void AliAnalysisTaskAODvsESD::Exec(Option_t *)
87{
88 // Main loop, called for each event
89 if (!fESD) {
90 Printf("ERROR: fESD not available");
91 return;
92 }
93 if (!fAOD) {
94 Printf("ERROR: fAOD not available");
95 return;
96 }
97
98 // ESDs
99 // for muons
100 Float_t muonMass = 0.105658369;
101 Float_t thetaX1=0; Float_t thetaY1=0;
102 Float_t ptInv1=0; Float_t pYZ1=0;
103 Float_t pxM1=0; Float_t pyM1=0; Float_t pzM1=0;
104 Float_t etaM1=0; Float_t phiM1=0; Float_t thetaM1=0;
105 Int_t chargeM1=0; Float_t energyM1=0; TLorentzVector lvM1;
106 Float_t thetaX2=0; Float_t thetaY2=0;
107 Float_t ptInv2=0; Float_t pYZ2=0;
108 Float_t pxM2=0; Float_t pyM2=0; Float_t pzM2=0;
109 Int_t chargeM2=0; Float_t energyM2=0; TLorentzVector lvM2;
110 //for J/psi
111 Float_t invM=0;
112 TLorentzVector lvJpsi;
113
114 int nmt = fESD->GetNumberOfMuonTracks();
115 // first loop over muon tracks in event
116 for (Int_t mTrack = 0; mTrack < nmt; mTrack++) {
117 thetaX1=0; thetaY1=0; ptInv1=0; pYZ1=0; chargeM1=0;
118 pxM1=0; pyM1=0; pzM1=0; energyM1=0;
119 AliESDMuonTrack* muonTrack1 = fESD->GetMuonTrack(mTrack);
120 thetaX1 = muonTrack1->GetThetaX();
121 thetaY1 = muonTrack1->GetThetaY();
122 ptInv1 = TMath::Abs(muonTrack1->GetInverseBendingMomentum());
123 pYZ1 = 1/ptInv1;
124 pzM1 = - pYZ1 / TMath::Sqrt(1.0 + TMath::Tan(thetaY1)*TMath::Tan(thetaY1));
125 pxM1 = pzM1 * TMath::Tan(thetaX1);
126 pyM1 = pzM1 * TMath::Tan(thetaY1);
127 energyM1 = TMath::Sqrt(muonMass*muonMass + pxM1*pxM1 + pyM1*pyM1 + pzM1*pzM1);
128 lvM1.SetPxPyPzE(pxM1,pyM1,pzM1,energyM1);
129 chargeM1 = Int_t(TMath::Sign(1.,muonTrack1->GetInverseBendingMomentum()));
130 etaM1 = muonTrack1->Eta();
131 phiM1 = muonTrack1->Phi();
132 thetaM1 = muonTrack1->Theta();
133 fMuonNtuple->Fill(thetaX1,thetaY1,ptInv1,etaM1,phiM1,thetaM1,pxM1,pyM1,pzM1);
134 // second loop over muon tracks in event
135 for (Int_t mTrack2 = mTrack+1; mTrack2 < nmt; mTrack2++) {
136 thetaX2=0; thetaY2=0; ptInv2=0; pYZ2=0; chargeM2=0;
137 pxM2=0; pyM2=0; pzM2=0; energyM2=0;
138 AliESDMuonTrack* muonTrack2 = fESD->GetMuonTrack(mTrack2);
139 thetaX2 = muonTrack2->GetThetaX();
140 thetaY2 = muonTrack2->GetThetaY();
141 ptInv2 = TMath::Abs(muonTrack2->GetInverseBendingMomentum());
142 pYZ2 = 1/ptInv2;
143 pzM2 = - pYZ2 / TMath::Sqrt(1.0 + TMath::Tan(thetaY2)*TMath::Tan(thetaY2));
144 pxM2 = pzM2 * TMath::Tan(thetaX2);
145 pyM2 = pzM2 * TMath::Tan(thetaY2);
146 chargeM2 = Int_t(TMath::Sign(1.,muonTrack2->GetInverseBendingMomentum()));
147 energyM2 = TMath::Sqrt(muonMass*muonMass + pxM2*pxM2 + pyM2*pyM2 + pzM2*pzM2);
148 // if muons have opposite charge
149 if(chargeM1*chargeM2 == -1){
150 lvM2.SetPxPyPzE(pxM2, pyM2, pzM2,energyM2);
151 lvJpsi = lvM1 + lvM2;
152 invM = lvJpsi.M();
153 fInvMass->Fill(invM);
154 } // end if muons with opposite charge
155 } // end second loop over muon tracks in event
156 } // end first loop over muon tracks in event
157
158
159 // Created AOD
160 Float_t pxAodM1=0; Float_t pyAodM1=0; Float_t pzAodM1=0;
161 Float_t etaAodM1=0; Float_t phiAodM1=0; Float_t thetaAodM1=0;
162 Int_t chargeAodM1=0; Float_t energyAodM1=0; TLorentzVector lvAodM1;
163 Float_t pxAodM2=0; Float_t pyAodM2=0; Float_t pzAodM2=0;
164 Float_t etaAodM2=0; Float_t phiAodM2=0; Float_t thetaAodM2=0;
165 Int_t chargeAodM2=0; Float_t energyAodM2=0; TLorentzVector lvAodM2;
166 //for J/psi
167 Float_t invMAOD=0;
168 TLorentzVector lvJpsiAOD;
169
170 int nmtAOD = fAOD->GetNumberOfTracks();
171 // first loop over tracks
172 for (Int_t mTrack = 0; mTrack < nmtAOD; mTrack++) {
173 pxM1=0; pyM1=0; pzM1=0;
174 AliAODTrack* muonTrack1 = fAOD->GetTrack(mTrack);
175 if(muonTrack1->IsMuonTrack()){
176 etaAodM1 = muonTrack1->Eta();
177 phiAodM1 = muonTrack1->Phi();
178 thetaAodM1 = muonTrack1->Theta();
179 pxAodM1 = muonTrack1->Px();
180 pyAodM1 = muonTrack1->Py();
181 pzAodM1 = muonTrack1->Pz();
182 chargeAodM1 = muonTrack1->Charge();
183 energyAodM1 = TMath::Sqrt(muonMass*muonMass + pxAodM1*pxAodM1 + pyAodM1*pyAodM1 + pzAodM1*pzAodM1);
184 lvAodM1.SetPxPyPzE(pxAodM1, pyAodM1, pzAodM1,energyAodM1);
185 fMuonNtupleAOD->Fill(etaAodM1,phiAodM1,thetaAodM1,pxAodM1,pyAodM1,pzAodM1);
186 }
187 // second loop over tracks in event
188 for (Int_t mTrack2 = mTrack+1; mTrack2 < nmtAOD; mTrack2++) {
189 chargeAodM2=0;
190 pxAodM2=0; pyAodM2=0; pzAodM2=0; energyAodM2=0;
191 AliAODTrack* muonTrack2 = fAOD->GetTrack(mTrack2);
192 if(muonTrack2->IsMuonTrack()){
193 etaAodM2 = muonTrack2->Eta();
194 phiAodM2 = muonTrack2->Phi();
195 thetaAodM2 = muonTrack2->Theta();
196 pxAodM2 = muonTrack2->Px();
197 pyAodM2 = muonTrack2->Py();
198 pzAodM2 = muonTrack2->Pz();
199 energyAodM2 = TMath::Sqrt(muonMass*muonMass + pxAodM2*pxAodM2 + pyAodM2*pyAodM2 + pzAodM2*pzAodM2);
200 chargeAodM2 = muonTrack2->Charge();
201 // if muons of opposite charge
202 if(chargeAodM1*chargeAodM2 == -1){
203 lvAodM2.SetPxPyPzE(pxAodM2, pyAodM2, pzAodM2,energyAodM2);
204 lvJpsiAOD = lvAodM1 + lvAodM2;
205 invMAOD = lvJpsiAOD.M();
206 fInvMassAOD->Fill(invMAOD);
207 }// end if muons with opposite charge
208 }// end if muon track
209 }// end second loop over tracks in event
210 }// end first loop over tracks in event
211
212 // Post final data. Write histo list to a file with option "RECREATE"
213 PostData(0,fList);
214}
215
216//________________________________________________________________________
217void AliAnalysisTaskAODvsESD::Terminate(const Option_t*)
218{
219 // check if major differences between the two Ntuples (more comparisons can be added)
220 int n1 = fMuonNtuple->GetEntries();
221 int n2 = fMuonNtupleAOD->GetEntries();
222
223 if(n1!=n2){
224 printf("ERROR: Different number of entries in single muon Ntuples\n");
225 return;
226 }
227 else
228 printf("Same number of entries in single muon Ntuples\n");
229
230// TCanvas* cv1 = new TCanvas("cvn1","cvn1",500,350);
231// cv1->cd(1);
232// fInvMass->SetMarkerStyle(29);
233// fInvMass->SetMarkerColor(4);
234// fInvMass->Draw();
235// fInvMassAOD->SetMarkerStyle(28);
236// fInvMassAOD->SetMarkerColor(2);
237// fInvMassAOD->Draw("same");
238}
239