]> git.uio.no Git - u/mrichter/AliRoot.git/blob - PWG/muon/AliAnalysisTaskSEMuonsHF.cxx
Enlarging window for DCS DPs retrieval for short runs for GRP + Keeping connection...
[u/mrichter/AliRoot.git] / PWG / muon / AliAnalysisTaskSEMuonsHF.cxx
1 /**************************************************************************
2  * Copyright(c) 1998-2008, 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 /* $Id$ */
17
18 /////////////////////////////////////////////////////////////
19 //
20 // AliAnalysisTaskSE for the single muon and dimuon from HF analysis,
21 // using the classes AliMuonsHFHeader,
22 //                   AliMuonInfoStoreRD,
23 //                   AliDimuInfoStoreRD,
24 //                   AliMuonInfoStoreMC,
25 //                   AliDimuInfoStoreMC.
26 //
27 // Author: X-M. Zhang, zhang@clermont.in2p3.fr
28 //                     zhangxm@iopp.ccnu.edu.cn
29 /////////////////////////////////////////////////////////////
30
31 #include <TList.h>
32 #include <TClonesArray.h>
33
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"
51
52 ClassImp(AliAnalysisTaskSEMuonsHF)
53
54 //_____________________________________________________________________________
55 AliAnalysisTaskSEMuonsHF::AliAnalysisTaskSEMuonsHF() :
56 AliAnalysisTaskSE(),
57 fAnaMode(0),
58 fIsOutputTree(kFALSE),
59 fIsMC(kFALSE),
60 fCutsMuon(0x0),
61 fCutsDimu(0x0),
62 fHeader(0),
63 fMuonClArr(0),
64 fDimuClArr(0),
65 fListOutput(0)
66 {
67   //
68   // Default constructor
69   //
70 }
71
72 //_____________________________________________________________________________
73 AliAnalysisTaskSEMuonsHF::AliAnalysisTaskSEMuonsHF(const char *name, const AliMuonTrackCuts& cutsMuon, const AliMuonPairCuts& cutsDimu) :
74 AliAnalysisTaskSE(name),
75 fAnaMode(0),
76 fIsOutputTree(kFALSE),
77 fIsMC(kFALSE),
78 fCutsMuon(new AliMuonTrackCuts(cutsMuon)),
79 fCutsDimu(new AliMuonPairCuts(cutsDimu)),
80 fHeader(0),
81 fMuonClArr(0),
82 fDimuClArr(0),
83 fListOutput(0)
84 {
85   //
86   // Constructor
87   //
88   DefineOutput(1, TList::Class());
89 }
90
91 //_____________________________________________________________________________
92 AliAnalysisTaskSEMuonsHF::~AliAnalysisTaskSEMuonsHF()
93 {
94   //
95   // Default destructor
96   //
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; }
103 }
104
105 //_____________________________________________________________________________
106 void AliAnalysisTaskSEMuonsHF::Init()
107 {
108   // Initialization
109   // Setting and initializing the running mode and status
110
111   AliMuonsHFHeader::SetAnaMode(fAnaMode);
112   AliMuonsHFHeader::SetIsMC(fIsMC);
113   if (!fHeader) {
114     fHeader = new AliMuonsHFHeader();
115     fHeader->SetName(AliMuonsHFHeader::StdBranchName());
116   }
117
118   if (!fMuonClArr) {
119     if (fIsMC) { 
120       fMuonClArr = new TClonesArray("AliMuonInfoStoreMC", 0);
121       fMuonClArr->SetName(AliMuonInfoStoreMC::StdBranchName());
122     } else {
123       fMuonClArr = new TClonesArray("AliMuonInfoStoreRD", 0);
124       fMuonClArr->SetName(AliMuonInfoStoreRD::StdBranchName());
125     }
126   }
127
128   if (fAnaMode!=1 && !fDimuClArr) {
129     if (fIsMC) {
130       fDimuClArr = new TClonesArray("AliDimuInfoStoreMC", 0);
131       fDimuClArr->SetName(AliDimuInfoStoreMC::StdBranchName());
132     } else {
133       fDimuClArr = new TClonesArray("AliDimuInfoStoreRD", 0);
134       fDimuClArr->SetName(AliDimuInfoStoreRD::StdBranchName());
135     }
136   }
137
138   return;
139 }
140
141 //_____________________________________________________________________________
142 void AliAnalysisTaskSEMuonsHF::UserCreateOutputObjects()
143 {
144   // Create the output container
145
146   if (!fListOutput) fListOutput = new TList();
147   fHeader->CreateHistograms(fListOutput);
148
149   if (fIsOutputTree) {
150     AddAODBranch("AliMuonsHFHeader", &fHeader);
151     AddAODBranch("TClonesArray", &fMuonClArr);
152     if (fAnaMode!=1) AddAODBranch("TClonesArray", &fDimuClArr);
153   }
154
155   fCutsMuon->Print("mask");
156   fCutsDimu->Print("mask");
157   return;
158 }
159
160 //_____________________________________________________________________________
161 void AliAnalysisTaskSEMuonsHF::UserExec(Option_t *)
162 {
163   // Execute analysis for current event:
164   // muon event header & (di)muon info store
165
166   if (fIsMC) {
167     if (MCEvent()) {
168       if (MCEvent()->GetNumberOfTracks()<=0)
169            { AliError("MC event not found. Nothing done!"); return; }
170     } else { AliError("MC event not found. Nothing done!"); return; }
171   }
172
173   if ( !fCutsMuon) { AliError("AliMuonTrackCuts should be loaded!"); return;}
174   if ((!fCutsDimu) && (fAnaMode!=1)) { AliError("AliMuonPairCuts should be loaded!"); return; }
175
176   Int_t ntrks = 0;
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->GetNumberOfTracks();
184   } else {
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);
190
191   fHeader->SetEventInfo(fInputHandler, MCEvent());
192   fHeader->FillHistosEvnH(fListOutput);
193
194   fMuonClArr->Delete();
195   TClonesArray &muonRef = *fMuonClArr;
196   Int_t countN = fMuonClArr->GetEntriesFast();
197
198   Int_t trkID[ntrks];
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
204     if (aod) {
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));
209       trkAOD = 0;
210     } else {
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));
215       trkESD = 0;
216     } if (muonRD) {
217       new(muonRef[countN++]) AliMuonInfoStoreRD(*muonRD);
218       if (fAnaMode!=2) fHeader->FillHistosMuon(fListOutput, muonRD);
219     } if (muonMC) {
220       new(muonRef[countN++]) AliMuonInfoStoreMC(*muonMC);
221       if (fAnaMode!=2) fHeader->FillHistosMuon(fListOutput, muonMC, muonMC->Source());
222     } trkID[countN-1] = itrk;
223
224     if (muonRD) { delete muonRD; muonRD=0; }
225     if (muonMC) { delete muonMC; muonMC=0; }
226   }  // end loop of all tracks
227
228   if (fAnaMode==1) { aod=0; esd=0; PostData(1,fListOutput); return; }
229
230   fDimuClArr->Delete();
231   countN = fDimuClArr->GetEntriesFast();
232   TClonesArray &dimuRef = *fDimuClArr;
233
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
239       UInt_t selMask = 0;
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]));
242
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);
245
246       if (dimuRD) {
247         fHeader->FillHistosDimu(fListOutput, dimuRD);
248         if (fIsOutputTree) new(dimuRef[countN++]) AliDimuInfoStoreRD(*dimuRD);
249       }
250       if (dimuMC) {
251         fHeader->FillHistosDimu(fListOutput, dimuMC, dimuMC->Source());
252         if (fIsOutputTree) new(dimuRef[countN++]) AliDimuInfoStoreMC(*dimuMC);
253       }
254
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
259
260   aod = 0; esd = 0;
261   PostData(1, fListOutput);
262   return;
263 }
264
265 //_____________________________________________________________________________
266 void AliAnalysisTaskSEMuonsHF::Terminate(Option_t *)
267 {
268   // Terminate analysis
269
270   // add the correction matrix
271
272   return;
273 }
274
275 void AliAnalysisTaskSEMuonsHF::NotifyRun()
276 {
277   // Notify of the current run number
278
279   if (fCutsMuon) fCutsMuon->SetRun(fInputHandler);
280   if (fCutsDimu) fCutsDimu->SetRun(fInputHandler);
281   return;
282 }