2 #include "AliAODEvent.h"
3 #include "AliAODMCParticle.h"
4 #include "AliAODMCHeader.h"
5 #include "AliAnalysisTaskMFTExample.h"
6 #include "TDatabasePDG.h"
7 #include "AliMUONTrackParam.h"
8 #include "AliMUONTrackExtrap.h"
9 #include "AliAODDimuon.h"
10 #include "AliAODTrack.h"
11 #include "AliAODHeader.h"
12 #include "TClonesArray.h"
13 #include "AliMFTConstants.h"
14 #include "AliMFTSupport.h"
17 ClassImp(AliAnalysisTaskMFTExample)
19 //====================================================================================================================================================
21 AliAnalysisTaskMFTExample::AliAnalysisTaskMFTExample() :
24 fHistPtSingleMuons(0),
25 fHistPtSingleMuonsFromJpsi(0),
27 fHistMassDimuonsOS(0),
28 fHistPtDimuonsJpsi(0),
29 fHistMassDimuonsJpsi(0),
30 fHistResidualXVtxJpsi(0),
31 fHistResidualYVtxJpsi(0),
32 fHistResidualZVtxJpsi(0) {
34 // Default constructor
36 for (Int_t i=0; i<3; i++) fPrimaryVertex[i] = 0;
37 fVtxResolutionITS[0] = 5.e-4;
38 fVtxResolutionITS[1] = 5.e-4;
39 fVtxResolutionITS[2] = 4.e-4;
43 //====================================================================================================================================================
45 AliAnalysisTaskMFTExample::AliAnalysisTaskMFTExample(const Char_t *name) :
46 AliAnalysisTaskSE(name),
48 fHistPtSingleMuons(0),
49 fHistPtSingleMuonsFromJpsi(0),
51 fHistMassDimuonsOS(0),
52 fHistPtDimuonsJpsi(0),
53 fHistMassDimuonsJpsi(0),
54 fHistResidualXVtxJpsi(0),
55 fHistResidualYVtxJpsi(0),
56 fHistResidualZVtxJpsi(0) {
60 for (Int_t i=0; i<3; i++) fPrimaryVertex[i] = 0;
61 fVtxResolutionITS[0] = 5.e-4;
62 fVtxResolutionITS[1] = 5.e-4;
63 fVtxResolutionITS[2] = 4.e-4;
65 // Define input and output slots here
66 DefineOutput(1, TH1D::Class());
67 DefineOutput(2, TH1D::Class());
68 DefineOutput(3, TH1D::Class());
69 DefineOutput(4, TH1D::Class());
70 DefineOutput(5, TH1D::Class());
71 DefineOutput(6, TH1D::Class());
72 DefineOutput(7, TH1D::Class());
73 DefineOutput(8, TH1D::Class());
74 DefineOutput(9, TH1D::Class());
78 //====================================================================================================================================================
80 void AliAnalysisTaskMFTExample::UserCreateOutputObjects() {
84 fHistPtSingleMuons = new TH1D("fHistPtSingleMuons","p_{T} of single muons (All)", 100, 0, 10);
85 fHistPtSingleMuons -> SetXTitle("p_{T} [GeV/c]");
86 fHistPtSingleMuons -> Sumw2();
88 fHistPtSingleMuonsFromJpsi = new TH1D("fHistPtSingleMuonsFromJpsi", "p_{T} of single muons (from J/#psi)", 100, 0, 10);
89 fHistPtSingleMuonsFromJpsi -> SetXTitle("p_{T} [GeV/c]");
90 fHistPtSingleMuonsFromJpsi -> Sumw2();
92 fHistMassDimuonsOS = new TH1D("fHistMassDimuonsOS", "Mass of OS dimuons", 500, 0, 10);
93 fHistMassDimuonsOS -> SetXTitle("Mass [GeV/c^{2}]");
94 fHistMassDimuonsOS -> Sumw2();
96 fHistMassDimuonsJpsi = new TH1D("fHistMassDimuonsJpsi", "Mass of J/#psi dimuons", 500, 0, 10);
97 fHistMassDimuonsJpsi -> SetXTitle("Mass [GeV/c^{2}]");
98 fHistMassDimuonsJpsi -> Sumw2();
100 fHistPtDimuonsOS = new TH1D("fHistPtDimuonsOS", "p_{T} of OS dimuons", 100, 0, 10);
101 fHistPtDimuonsOS -> SetXTitle("p_{T} [GeV/c]");
102 fHistPtDimuonsOS -> Sumw2();
104 fHistPtDimuonsJpsi = new TH1D("fHistPtDimuonsJpsi", "p_{T} of J/#psi dimuons", 100, 0, 10);
105 fHistPtDimuonsJpsi -> SetXTitle("p_{T} [GeV/c]");
106 fHistPtDimuonsJpsi -> Sumw2();
108 fHistResidualXVtxJpsi = new TH1D("fHistResidualXVtxJpsi", "J/#psi vertex residuals along x", 100, -100, 100);
109 fHistResidualXVtxJpsi -> SetXTitle("Residual [#mum]");
110 fHistResidualXVtxJpsi -> Sumw2();
112 fHistResidualYVtxJpsi = new TH1D("fHistResidualYVtxJpsi", "J/#psi vertex residuals along y", 100, -100, 100);
113 fHistResidualYVtxJpsi -> SetXTitle("Residual [#mum]");
114 fHistResidualYVtxJpsi -> Sumw2();
116 fHistResidualZVtxJpsi = new TH1D("fHistResidualZVtxJpsi", "J/#psi vertex residuals along z", 100, -1000, 1000);
117 fHistResidualZVtxJpsi -> SetXTitle("Residual [#mum]");
118 fHistResidualZVtxJpsi -> Sumw2();
120 PostData(1, fHistPtSingleMuons);
121 PostData(2, fHistPtSingleMuonsFromJpsi);
122 PostData(3, fHistMassDimuonsOS);
123 PostData(4, fHistMassDimuonsJpsi);
124 PostData(5, fHistPtDimuonsOS);
125 PostData(6, fHistPtDimuonsJpsi);
126 PostData(7, fHistResidualXVtxJpsi);
127 PostData(8, fHistResidualYVtxJpsi);
128 PostData(9, fHistResidualZVtxJpsi);
132 //====================================================================================================================================================
134 void AliAnalysisTaskMFTExample::UserExec(Option_t *) {
137 // Called for each event
139 AliAODEvent *aodEv = dynamic_cast<AliAODEvent*>(InputEvent());
142 aodEv->GetHeader()->InitMagneticField();
143 AliMUONTrackExtrap::SetField();
145 TClonesArray *stackMC = (TClonesArray*) (aodEv->GetList()->FindObject(AliAODMCParticle::StdBranchName()));
147 // Getting primary vertex, either from the generation or from the reconstruction -------------------
149 if (fVertexMode == kGenerated) {
150 AliAODMCHeader *mcHeader = (AliAODMCHeader*) (aodEv->GetList()->FindObject(AliAODMCHeader::StdBranchName()));
151 mcHeader->GetVertex(fPrimaryVertex);
152 for (Int_t i=0; i<3; i++) fPrimaryVertex[i] = gRandom->Gaus(fPrimaryVertex[i], fVtxResolutionITS[i]);
154 else if (fVertexMode == kReconstructed) {
155 aodEv->GetPrimaryVertex()->GetXYZ(fPrimaryVertex);
158 // -------------------------------------------------------------------------------------------------
160 AliAODTrack *recMuon1=0, *recMuon2=0;
161 AliAODMCParticle *mcMuon1=0, *mcMuon2=0;
162 AliAODMCParticle *mcMother1=0;
163 Bool_t isMuon1FromJpsi=0;
165 // Loop over MUON+MFT muons
167 //--------------------------------------------------------------------------------------------------
169 for (Int_t iTrack=0; iTrack<aodEv->GetNumberOfTracks(); iTrack++) {
171 if (!(aodEv->GetTrack(iTrack)->IsMuonGlobalTrack())) continue;
173 recMuon1 = aodEv->GetTrack(iTrack);
174 isMuon1FromJpsi = kFALSE;
177 fHistPtSingleMuons -> Fill(recMuon1->Pt());
179 // pt muons from J/psi
180 if (recMuon1->GetLabel() >= 0) {
181 mcMuon1 = (AliAODMCParticle*) stackMC->At(recMuon1->GetLabel());
183 if (mcMuon1->GetMother()>=0) {
184 mcMother1 = (AliAODMCParticle*) stackMC->At(mcMuon1->GetMother());
185 if (mcMother1->PdgCode()==443) {
186 isMuon1FromJpsi = kTRUE;
187 fHistPtSingleMuonsFromJpsi -> Fill(recMuon1->Pt());
193 for (Int_t jTrack=0; jTrack<iTrack; jTrack++) {
195 if (!(aodEv->GetTrack(jTrack)->IsMuonGlobalTrack())) continue;
197 recMuon2 = aodEv->GetTrack(jTrack);
199 AliAODDimuon *dimuon = new AliAODDimuon(recMuon1, recMuon2);
200 if (dimuon->Charge()) continue;
202 // pt and mass all OS dimuons
203 fHistPtDimuonsOS -> Fill(dimuon->Pt());
204 fHistMassDimuonsOS -> Fill(dimuon->Mass());
206 // pt and mass J/psi dimuons
207 if (!isMuon1FromJpsi) continue;
208 if (recMuon2->GetLabel() >= 0) {
209 mcMuon2 = (AliAODMCParticle*) stackMC->At(recMuon2->GetLabel());
211 if (mcMuon2->GetMother() == mcMuon1->GetMother()) {
212 Double_t vertex[3]={0};
213 TLorentzVector kinem(0,0,0,0);
214 if (!AliMFTSupport::RefitAODDimuonWithCommonVertex(dimuon, vertex, kinem)) continue;
215 fHistPtDimuonsJpsi -> Fill(kinem.Pt());
216 fHistMassDimuonsJpsi -> Fill(kinem.M());
217 fHistResidualXVtxJpsi -> Fill(1.e4*(vertex[0] - fPrimaryVertex[0]));
218 fHistResidualYVtxJpsi -> Fill(1.e4*(vertex[1] - fPrimaryVertex[1]));
219 fHistResidualZVtxJpsi -> Fill(1.e4*(vertex[2] - fPrimaryVertex[2]));
224 } // end of loop on 2nd muon
226 } // end of loop on 1st muon
228 //--------------------------------------------------------------------------------------------------
230 PostData(1, fHistPtSingleMuons);
231 PostData(2, fHistPtSingleMuonsFromJpsi);
232 PostData(3, fHistMassDimuonsOS);
233 PostData(4, fHistMassDimuonsJpsi);
234 PostData(5, fHistPtDimuonsOS);
235 PostData(6, fHistPtDimuonsJpsi);
236 PostData(7, fHistResidualXVtxJpsi);
237 PostData(8, fHistResidualYVtxJpsi);
238 PostData(9, fHistResidualZVtxJpsi);
242 //====================================================================================================================================================
244 void AliAnalysisTaskMFTExample::Terminate(Option_t *) {
246 // Draw result to the screen
247 // Called once at the end of the query
251 //====================================================================================================================================================