1 /**************************************************************************
2 * Copyright(c) 1998-2008, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
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 **************************************************************************/
16 /////////////////////////////////////////////////////////////
18 // AliAnalysisTaskSE for the single muon and dimuon from HF analysis,
19 // using the classes AliMuonsHFHeader,
20 // AliMuonInfoStoreRD,
21 // AliDimuInfoStoreRD,
22 // AliMuonInfoStoreMC,
23 // AliDimuInfoStoreMC.
25 // Author: X-M. Zhang, zhang@clermont.in2p3.fr
26 // zhangxm@iopp.ccnu.edu.cn
27 /////////////////////////////////////////////////////////////
30 #include <TClonesArray.h>
32 #include "AliESDEvent.h"
33 #include "AliAODEvent.h"
34 #include "AliESDHeader.h"
35 #include "AliAODHeader.h"
36 #include "AliESDMuonTrack.h"
37 #include "AliAODTrack.h"
38 #include "AliCentrality.h"
39 #include "AliMuonsHFHeader.h"
40 #include "AliMuonInfoStoreRD.h"
41 #include "AliMuonInfoStoreMC.h"
42 #include "AliDimuInfoStoreRD.h"
43 #include "AliDimuInfoStoreMC.h"
44 #include "AliAnalysisManager.h"
45 #include "AliInputEventHandler.h"
46 #include "AliAnalysisTaskSEMuonsHF.h"
48 ClassImp(AliAnalysisTaskSEMuonsHF)
50 //_____________________________________________________________________________
51 AliAnalysisTaskSEMuonsHF::AliAnalysisTaskSEMuonsHF() :
54 fIsOutputTree(kFALSE),
62 // Default constructor
66 //_____________________________________________________________________________
67 AliAnalysisTaskSEMuonsHF::AliAnalysisTaskSEMuonsHF(const char *name) :
68 AliAnalysisTaskSE(name),
70 fIsOutputTree(kFALSE),
80 DefineOutput(1, TList::Class());
83 //_____________________________________________________________________________
84 AliAnalysisTaskSEMuonsHF::~AliAnalysisTaskSEMuonsHF()
89 if (fHeader) { delete fHeader; fHeader =NULL; }
90 if (fMuonClArr) { delete fMuonClArr; fMuonClArr =NULL; }
91 if (fDimuClArr) { delete fDimuClArr; fDimuClArr =NULL; }
92 if (fListOutput) { delete fListOutput; fListOutput=NULL; }
95 //_____________________________________________________________________________
96 void AliAnalysisTaskSEMuonsHF::Init()
99 // Setting and initializing the running mode and status
101 AliMuonsHFHeader::SetAnaMode(fAnaMode);
102 AliMuonsHFHeader::SetIsMC(fIsMC);
104 fHeader = new AliMuonsHFHeader();
105 fHeader->SetName(AliMuonsHFHeader::StdBranchName());
110 fMuonClArr = new TClonesArray("AliMuonInfoStoreMC", 0);
111 fMuonClArr->SetName(AliMuonInfoStoreMC::StdBranchName());
113 fMuonClArr = new TClonesArray("AliMuonInfoStoreRD", 0);
114 fMuonClArr->SetName(AliMuonInfoStoreRD::StdBranchName());
118 if (fAnaMode!=1 && !fDimuClArr) {
120 fDimuClArr = new TClonesArray("AliDimuInfoStoreMC", 0);
121 fDimuClArr->SetName(AliDimuInfoStoreMC::StdBranchName());
123 fDimuClArr = new TClonesArray("AliDimuInfoStoreRD", 0);
124 fDimuClArr->SetName(AliDimuInfoStoreRD::StdBranchName());
131 //_____________________________________________________________________________
132 void AliAnalysisTaskSEMuonsHF::UserCreateOutputObjects()
134 // Create the output container
136 if (!fListOutput) fListOutput = new TList();
137 fHeader->CreateHistograms(fListOutput);
140 AddAODBranch("AliMuonsHFHeader", &fHeader);
141 AddAODBranch("TClonesArray", &fMuonClArr);
142 if (fAnaMode!=1) AddAODBranch("TClonesArray", &fDimuClArr);
148 //_____________________________________________________________________________
149 void AliAnalysisTaskSEMuonsHF::UserExec(Option_t *)
151 // Execute analysis for current event:
152 // muon event header & (di)muon info store
156 if (MCEvent()->GetNumberOfTracks()<=0)
157 { AliError("MC event not found. Nothing done!"); return; }
158 } else { AliError("MC event not found. Nothing done!"); return; }
162 AliAODEvent *aod = 0;
163 AliESDEvent *esd = 0;
164 if (((TString)InputEvent()->IsA()->GetName())=="AliAODEvent") {
165 aod = dynamic_cast<AliAODEvent*>(InputEvent());
166 if (!aod) { AliError("AOD event not found. Nothing done!"); return; }
167 if (!fIsMC && (aod->GetHeader()->GetEventType()!=7)) return;
168 ntrks = aod->GetNTracks();
169 fHeader->SetFiredTriggerClass(aod->GetFiredTriggerClasses());
171 esd = dynamic_cast<AliESDEvent*>(InputEvent());
172 if (!esd) { AliError("ESD event not found. Nothing done!"); return; }
173 if (!fIsMC && (esd->GetHeader()->GetEventType()!=7)) return;
174 ntrks = esd->GetNumberOfMuonTracks();
175 fHeader->SetFiredTriggerClass(esd->GetFiredTriggerClasses());
176 AliCentrality *cent = esd->GetCentrality();
177 fHeader->SetCentrality(cent->GetCentralityPercentile("V0M")); // Just for ESD
180 if (fIsOutputTree) AliAnalysisManager::GetAnalysisManager()->GetOutputEventHandler()->SetFillAOD(kTRUE);
181 if (fInputHandler && fInputHandler->GetEventSelection()) fHeader->SetSelectionMask(fInputHandler->IsEventSelected());
182 fHeader->SetVertex(((AliVVertex*)InputEvent()->GetPrimaryVertex()));
183 fHeader->FillHistosEvnH(fListOutput);
185 fMuonClArr->Delete();
186 TClonesArray &muonRef = *fMuonClArr;
187 Int_t countN = fMuonClArr->GetEntriesFast();
189 AliAODTrack *trkAOD = 0;
190 AliESDMuonTrack *trkESD = 0;
191 AliMuonInfoStoreRD *muonRD = 0;
192 AliMuonInfoStoreMC *muonMC = 0;
193 for (Int_t itrk=0; itrk<ntrks; itrk++) { // loop over all tracks
195 trkAOD = (AliAODTrack*)aod->GetTrack(itrk);
196 if (!trkAOD->IsMuonTrack()) { trkAOD=0; continue; }
197 if (fIsMC) muonMC = new AliMuonInfoStoreMC(trkAOD, MCEvent());
198 else muonRD = new AliMuonInfoStoreRD(trkAOD);
201 trkESD = (AliESDMuonTrack*)esd->GetMuonTrack(itrk);
202 if (!trkESD->ContainTrackerData()) { trkESD=0; continue; }
203 if (fIsMC) muonMC = new AliMuonInfoStoreMC(trkESD, MCEvent());
204 else muonRD = new AliMuonInfoStoreRD(trkESD);
209 new(muonRef[countN++]) AliMuonInfoStoreRD(*muonRD);
210 if (fAnaMode!=2) fHeader->FillHistosMuon(fListOutput, muonRD);
213 new(muonRef[countN++]) AliMuonInfoStoreMC(*muonMC);
214 if (fAnaMode!=2) fHeader->FillHistosMuon(fListOutput, muonMC, muonMC->Source());
217 if (muonRD) { delete muonRD; muonRD=0; }
218 if (muonMC) { delete muonMC; muonMC=0; }
219 } // end loop of all tracks
222 if (fAnaMode==1) { PostData(1,fListOutput); return; }
224 fDimuClArr->Delete();
225 countN = fDimuClArr->GetEntriesFast();
226 TClonesArray &dimuRef = *fDimuClArr;
228 AliDimuInfoStoreRD *dimuRD = 0;
229 AliDimuInfoStoreMC *dimuMC = 0;
230 ntrks = fMuonClArr->GetEntriesFast();
231 for (Int_t itrk=0; itrk<ntrks-1; itrk++) { // 1st loop over muon tracks
232 for (Int_t jtrk=itrk+1; jtrk<ntrks; jtrk++) { // 2nd loop ofver muon tracks
234 dimuMC = new AliDimuInfoStoreMC((AliMuonInfoStoreMC*)fMuonClArr->At(itrk), (AliMuonInfoStoreMC*)fMuonClArr->At(jtrk));
236 dimuRD = new AliDimuInfoStoreRD((AliMuonInfoStoreRD*)fMuonClArr->At(itrk), (AliMuonInfoStoreRD*)fMuonClArr->At(jtrk));
240 fHeader->FillHistosDimu(fListOutput, dimuRD);
241 if (fIsOutputTree) new(dimuRef[countN++]) AliDimuInfoStoreRD(*dimuRD);
244 fHeader->FillHistosDimu(fListOutput, dimuMC, dimuMC->Source());
245 if (fIsOutputTree) new(dimuRef[countN++]) AliDimuInfoStoreMC(*dimuMC);
248 if (dimuRD) { delete dimuRD; dimuRD=0; }
249 if (dimuMC) { delete dimuMC; dimuMC=0; }
250 } // end 2nd loop of muon tracks
251 } // end 1st loop of muon tracks
253 PostData(1, fListOutput);
257 //_____________________________________________________________________________
258 void AliAnalysisTaskSEMuonsHF::Terminate(Option_t *)
260 // Terminate analysis
262 // add the correction matrix