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 **************************************************************************/
18 /////////////////////////////////////////////////////////////
20 // AliAnalysisTaskSE for the single muon and dimuon from HF analysis,
21 // using the classes AliMuonsHFHeader,
22 // AliMuonInfoStoreRD,
23 // AliDimuInfoStoreRD,
24 // AliMuonInfoStoreMC,
25 // AliDimuInfoStoreMC.
27 // Author: X-M. Zhang, zhang@clermont.in2p3.fr
28 // zhangxm@iopp.ccnu.edu.cn
29 /////////////////////////////////////////////////////////////
32 #include <TClonesArray.h>
34 #include "AliESDEvent.h"
35 #include "AliAODEvent.h"
36 #include "AliESDHeader.h"
37 #include "AliAODHeader.h"
38 #include "AliESDMuonTrack.h"
39 #include "AliAODTrack.h"
40 #include "AliCentrality.h"
41 #include "AliMuonsHFHeader.h"
42 #include "AliMuonInfoStoreRD.h"
43 #include "AliMuonInfoStoreMC.h"
44 #include "AliDimuInfoStoreRD.h"
45 #include "AliDimuInfoStoreMC.h"
46 #include "AliAnalysisManager.h"
47 #include "AliInputEventHandler.h"
48 #include "AliMuonTrackCuts.h"
49 #include "AliMuonPairCuts.h"
50 #include "AliAnalysisTaskSEMuonsHF.h"
52 ClassImp(AliAnalysisTaskSEMuonsHF)
54 //_____________________________________________________________________________
55 AliAnalysisTaskSEMuonsHF::AliAnalysisTaskSEMuonsHF() :
58 fIsOutputTree(kFALSE),
68 // Default constructor
72 //_____________________________________________________________________________
73 AliAnalysisTaskSEMuonsHF::AliAnalysisTaskSEMuonsHF(const char *name, const AliMuonTrackCuts& cutsMuon, const AliMuonPairCuts& cutsDimu) :
74 AliAnalysisTaskSE(name),
76 fIsOutputTree(kFALSE),
78 fCutsMuon(new AliMuonTrackCuts(cutsMuon)),
79 fCutsDimu(new AliMuonPairCuts(cutsDimu)),
88 DefineOutput(1, TList::Class());
91 //_____________________________________________________________________________
92 AliAnalysisTaskSEMuonsHF::~AliAnalysisTaskSEMuonsHF()
97 if (fCutsMuon) { delete fCutsMuon; fCutsMuon =NULL; }
98 if (fCutsDimu) { delete fCutsDimu; fCutsDimu =NULL; }
99 if (fHeader) { delete fHeader; fHeader =NULL; }
100 if (fMuonClArr) { delete fMuonClArr; fMuonClArr =NULL; }
101 if (fDimuClArr) { delete fDimuClArr; fDimuClArr =NULL; }
102 if (fListOutput) { delete fListOutput; fListOutput=NULL; }
105 //_____________________________________________________________________________
106 void AliAnalysisTaskSEMuonsHF::Init()
109 // Setting and initializing the running mode and status
111 AliMuonsHFHeader::SetAnaMode(fAnaMode);
112 AliMuonsHFHeader::SetIsMC(fIsMC);
114 fHeader = new AliMuonsHFHeader();
115 fHeader->SetName(AliMuonsHFHeader::StdBranchName());
120 fMuonClArr = new TClonesArray("AliMuonInfoStoreMC", 0);
121 fMuonClArr->SetName(AliMuonInfoStoreMC::StdBranchName());
123 fMuonClArr = new TClonesArray("AliMuonInfoStoreRD", 0);
124 fMuonClArr->SetName(AliMuonInfoStoreRD::StdBranchName());
128 if (fAnaMode!=1 && !fDimuClArr) {
130 fDimuClArr = new TClonesArray("AliDimuInfoStoreMC", 0);
131 fDimuClArr->SetName(AliDimuInfoStoreMC::StdBranchName());
133 fDimuClArr = new TClonesArray("AliDimuInfoStoreRD", 0);
134 fDimuClArr->SetName(AliDimuInfoStoreRD::StdBranchName());
141 //_____________________________________________________________________________
142 void AliAnalysisTaskSEMuonsHF::UserCreateOutputObjects()
144 // Create the output container
146 if (!fListOutput) fListOutput = new TList();
147 fHeader->CreateHistograms(fListOutput);
150 AddAODBranch("AliMuonsHFHeader", &fHeader);
151 AddAODBranch("TClonesArray", &fMuonClArr);
152 if (fAnaMode!=1) AddAODBranch("TClonesArray", &fDimuClArr);
155 fCutsMuon->Print("mask");
156 fCutsDimu->Print("mask");
160 //_____________________________________________________________________________
161 void AliAnalysisTaskSEMuonsHF::UserExec(Option_t *)
163 // Execute analysis for current event:
164 // muon event header & (di)muon info store
168 if (MCEvent()->GetNumberOfTracks()<=0)
169 { AliError("MC event not found. Nothing done!"); return; }
170 } else { AliError("MC event not found. Nothing done!"); return; }
173 if ( !fCutsMuon) { AliError("AliMuonTrackCuts should be loaded!"); return;}
174 if ((!fCutsDimu) && (fAnaMode!=1)) { AliError("AliMuonPairCuts should be loaded!"); return; }
177 AliAODEvent *aod = 0;
178 AliESDEvent *esd = 0;
179 if (((TString)InputEvent()->IsA()->GetName())=="AliAODEvent") {
180 aod = dynamic_cast<AliAODEvent*>(InputEvent());
181 if (!aod) { AliError("AOD event not found. Nothing done!"); return; }
182 if (!fIsMC && (aod->GetHeader()->GetEventType()!=7)) return;
183 ntrks = aod->GetNTracks();
185 esd = dynamic_cast<AliESDEvent*>(InputEvent());
186 if (!esd) { AliError("ESD event not found. Nothing done!"); return; }
187 if (!fIsMC && (esd->GetHeader()->GetEventType()!=7)) return;
188 ntrks = esd->GetNumberOfMuonTracks();
189 } if (fIsOutputTree) AliAnalysisManager::GetAnalysisManager()->GetOutputEventHandler()->SetFillAOD(kTRUE);
191 fHeader->SetEventInfo(fInputHandler, MCEvent());
192 fHeader->FillHistosEvnH(fListOutput);
194 fMuonClArr->Delete();
195 TClonesArray &muonRef = *fMuonClArr;
196 Int_t countN = fMuonClArr->GetEntriesFast();
199 AliAODTrack *trkAOD = 0;
200 AliESDMuonTrack *trkESD = 0;
201 AliMuonInfoStoreRD *muonRD = 0;
202 AliMuonInfoStoreMC *muonMC = 0;
203 for (Int_t itrk=0; itrk<ntrks; itrk++) { // loop over all tracks
205 trkAOD = (AliAODTrack*)aod->GetTrack(itrk);
206 if (!trkAOD->IsMuonTrack()) { trkAOD=0; continue; }
207 if (fIsMC) muonMC = new AliMuonInfoStoreMC(trkAOD,MCEvent(),fCutsMuon->GetSelectionMask(trkAOD));
208 else muonRD = new AliMuonInfoStoreRD(trkAOD,fCutsMuon->GetSelectionMask(trkAOD));
211 trkESD = (AliESDMuonTrack*)esd->GetMuonTrack(itrk);
212 if (!trkESD->ContainTrackerData()) { trkESD=0; continue; }
213 if (fIsMC) muonMC = new AliMuonInfoStoreMC(trkESD,MCEvent(),fCutsMuon->GetSelectionMask(trkESD));
214 else muonRD = new AliMuonInfoStoreRD(trkESD,fCutsMuon->GetSelectionMask(trkESD));
217 new(muonRef[countN++]) AliMuonInfoStoreRD(*muonRD);
218 if (fAnaMode!=2) fHeader->FillHistosMuon(fListOutput, muonRD);
220 new(muonRef[countN++]) AliMuonInfoStoreMC(*muonMC);
221 if (fAnaMode!=2) fHeader->FillHistosMuon(fListOutput, muonMC, muonMC->Source());
222 } trkID[countN-1] = itrk;
224 if (muonRD) { delete muonRD; muonRD=0; }
225 if (muonMC) { delete muonMC; muonMC=0; }
226 } // end loop of all tracks
228 if (fAnaMode==1) { aod=0; esd=0; PostData(1,fListOutput); return; }
230 fDimuClArr->Delete();
231 countN = fDimuClArr->GetEntriesFast();
232 TClonesArray &dimuRef = *fDimuClArr;
234 AliDimuInfoStoreRD *dimuRD = 0;
235 AliDimuInfoStoreMC *dimuMC = 0;
236 ntrks = fMuonClArr->GetEntriesFast();
237 for (Int_t itrk=0; itrk<ntrks-1; itrk++) { // 1st loop over muon tracks
238 for (Int_t jtrk=itrk+1; jtrk<ntrks; jtrk++) { // 2nd loop ofver muon tracks
240 if (aod) selMask = fCutsDimu->GetSelectionMask(aod->GetTrack( trkID[itrk]),aod->GetTrack( trkID[jtrk]));
241 else selMask = fCutsDimu->GetSelectionMask(esd->GetMuonTrack(trkID[itrk]),esd->GetMuonTrack(trkID[jtrk]));
243 if (fIsMC) dimuMC = new AliDimuInfoStoreMC((AliMuonInfoStoreMC*)fMuonClArr->At(itrk),(AliMuonInfoStoreMC*)fMuonClArr->At(jtrk),selMask);
244 else dimuRD = new AliDimuInfoStoreRD((AliMuonInfoStoreRD*)fMuonClArr->At(itrk),(AliMuonInfoStoreRD*)fMuonClArr->At(jtrk),selMask);
247 fHeader->FillHistosDimu(fListOutput, dimuRD);
248 if (fIsOutputTree) new(dimuRef[countN++]) AliDimuInfoStoreRD(*dimuRD);
251 fHeader->FillHistosDimu(fListOutput, dimuMC, dimuMC->Source());
252 if (fIsOutputTree) new(dimuRef[countN++]) AliDimuInfoStoreMC(*dimuMC);
255 if (dimuRD) { delete dimuRD; dimuRD=0; }
256 if (dimuMC) { delete dimuMC; dimuMC=0; }
257 } // end 2nd loop of muon tracks
258 } // end 1st loop of muon tracks
261 PostData(1, fListOutput);
265 //_____________________________________________________________________________
266 void AliAnalysisTaskSEMuonsHF::Terminate(Option_t *)
268 // Terminate analysis
270 // add the correction matrix
275 void AliAnalysisTaskSEMuonsHF::NotifyRun()
277 // Notify of the current run number
279 if (fCutsMuon) fCutsMuon->SetRun(fInputHandler);
280 if (fCutsDimu) fCutsDimu->SetRun(fInputHandler);