]> git.uio.no Git - u/mrichter/AliRoot.git/blame - PWGPP/MUON/lite/AliAnalysisTaskMuonQA.cxx
Compatibility with the Root trunk
[u/mrichter/AliRoot.git] / PWGPP / MUON / lite / AliAnalysisTaskMuonQA.cxx
CommitLineData
94ef1a28 1/**************************************************************************
2 * Copyright(c) 1998-1999, 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
27de2dfb 16/* $Id$ */
17
94ef1a28 18#include <Riostream.h>
19
20// ROOT includes
21#include "TH1F.h"
22#include "TH2F.h"
23#include "TCanvas.h"
24#include "TROOT.h"
25#include "TString.h"
26#include "TObjArray.h"
27#include "TMath.h"
28#include "TFile.h"
03ac5989 29#include "TRegexp.h"
30#include "TMap.h"
31#include "TList.h"
32#include "TObjString.h"
94ef1a28 33
34// STEER includes
35#include "AliESDEvent.h"
36#include "AliESDMuonTrack.h"
37#include "AliESDMuonCluster.h"
38#include "AliESDInputHandler.h"
417d6f63 39#include "AliESDVZERO.h"
94ef1a28 40
41// ANALYSIS includes
94ef1a28 42#include "AliAnalysisDataSlot.h"
43#include "AliAnalysisManager.h"
44#include "AliAnalysisTaskMuonQA.h"
45#include "AliCounterCollection.h"
46
13bb4ca7 47// PWG includes
48#include "AliMuonTrackCuts.h"
49
c64cb1f6 50using std::cout;
51using std::endl;
52
94ef1a28 53ClassImp(AliAnalysisTaskMuonQA)
54
55const Int_t AliAnalysisTaskMuonQA::nCh = 10;
56
57const Int_t AliAnalysisTaskMuonQA::nDE = 1100;
58
59const Float_t AliAnalysisTaskMuonQA::dMax[5] = {176.6, 229.0, 308.84, 418.2, 522.0}; // cm
60
40be9f05 61//________________________________________________________________________
62AliAnalysisTaskMuonQA::AliAnalysisTaskMuonQA() :
63 AliAnalysisTaskSE(),
64 fList(0x0),
65 fListExpert(0x0),
66 fListNorm(0x0),
67 fTrackCounters(0x0),
68 fEventCounters(0x0),
69 fSelectCharge(0),
b4f7418a 70 fSelectPhysics(kFALSE),
03ac5989 71 fSelectTrigger(kFALSE),
72 fTriggerMask(0),
76e3d5d4 73 fSelectMatched(kFALSE),
417d6f63 74 fApplyAccCut(kFALSE),
03ac5989 75 fTriggerClass(0x0),
13bb4ca7 76 fSelectTriggerClass(0x0),
77 fTrackCuts(0x0),
78 fMuonTrigIndex()
40be9f05 79{
16dc5a7c 80 // Dummy constructor
40be9f05 81}
82
94ef1a28 83//________________________________________________________________________
84AliAnalysisTaskMuonQA::AliAnalysisTaskMuonQA(const char *name) :
85 AliAnalysisTaskSE(name),
86 fList(0x0),
87 fListExpert(0x0),
40be9f05 88 fListNorm(0x0),
94ef1a28 89 fTrackCounters(0x0),
90 fEventCounters(0x0),
91 fSelectCharge(0),
b4f7418a 92 fSelectPhysics(kFALSE),
03ac5989 93 fSelectTrigger(kFALSE),
94 fTriggerMask(0),
76e3d5d4 95 fSelectMatched(kFALSE),
417d6f63 96 fApplyAccCut(kFALSE),
03ac5989 97 fTriggerClass(0x0),
13bb4ca7 98 fSelectTriggerClass(0x0),
99 fTrackCuts(new AliMuonTrackCuts("stdMuonCuts","stdMuonCuts")),
100 fMuonTrigIndex()
94ef1a28 101{
102 /// Constructor
103
104 // Output slot #1 writes into a TObjArray container
105 DefineOutput(1,TObjArray::Class());
106 // Output slot #2 writes into a TObjArray container
107 DefineOutput(2,TObjArray::Class());
108 // Output slot #3 writes track counters
109 DefineOutput(3,AliCounterCollection::Class());
110 // Output slot #4 writes event counters
111 DefineOutput(4,AliCounterCollection::Class());
40be9f05 112 // Output slot #5 writes normalized histograms
113 DefineOutput(5,TObjArray::Class());
13bb4ca7 114
115 fTrackCuts->SetFilterMask(AliMuonTrackCuts::kMuEta | AliMuonTrackCuts::kMuThetaAbs | AliMuonTrackCuts::kMuPdca );
94ef1a28 116}
117
118//________________________________________________________________________
119AliAnalysisTaskMuonQA::~AliAnalysisTaskMuonQA()
120{
121 /// Destructor
417d6f63 122 if (!AliAnalysisManager::GetAnalysisManager()->IsProofMode()) {
123 delete fList;
124 delete fListExpert;
125 delete fTrackCounters;
126 delete fEventCounters;
4860c9db 127 delete fListNorm;
417d6f63 128 }
03ac5989 129 delete fTriggerClass;
130 delete fSelectTriggerClass;
13bb4ca7 131 delete fTrackCuts;
132}
133
134
135//___________________________________________________________________________
136void AliAnalysisTaskMuonQA::NotifyRun()
137{
138 /// Notify run
139 fTrackCuts->SetRun(fCurrentRunNumber);
94ef1a28 140}
141
13bb4ca7 142
143//___________________________________________________________________________
144void AliAnalysisTaskMuonQA::SetTrackCuts(AliMuonTrackCuts* trackCuts)
145{
146 /// Set track cuts
147 if ( fTrackCuts ) delete fTrackCuts;
148 fTrackCuts = new AliMuonTrackCuts(*trackCuts);
149}
150
151
94ef1a28 152//___________________________________________________________________________
153void AliAnalysisTaskMuonQA::UserCreateOutputObjects()
154{
155 /// Create histograms and counters
156
03ac5989 157 // set the list of trigger classes with corresponding short names
158 fTriggerClass = new TMap(20);
159 fTriggerClass->SetOwnerKeyValue();
417d6f63 160 // p-p trigger classes
161 fTriggerClass->Add(new TObjString("CBEAMB"), new TObjString("CBEAMB"));
162 fTriggerClass->Add(new TObjString("CINT1B-ABCE-NOPF-ALL"), new TObjString("CINT1B"));
163 fTriggerClass->Add(new TObjString("CMUS1B-ABCE-NOPF-MUON"), new TObjString("CMUS1B"));
164 fTriggerClass->Add(new TObjString("CINT1[AC]-"), new TObjString("CINT1AC"));
165 fTriggerClass->Add(new TObjString("CMUS1[AC]-"), new TObjString("CMUS1AC"));
166 fTriggerClass->Add(new TObjString("CINT1-E-"), new TObjString("CINT1E"));
63e2955d 167 fTriggerClass->Add(new TObjString("CINT5-E-"), new TObjString("CINT5E"));
417d6f63 168 fTriggerClass->Add(new TObjString("CMUS1-E-"), new TObjString("CMUS1E"));
63e2955d 169 fTriggerClass->Add(new TObjString("CMUS5-E-"), new TObjString("CMUS5E"));
417d6f63 170 fTriggerClass->Add(new TObjString("CINT1-B-"), new TObjString("CINT1B"));
63e2955d 171 fTriggerClass->Add(new TObjString("CINT5-B-"), new TObjString("CINT5B"));
417d6f63 172 fTriggerClass->Add(new TObjString("CMUS1-B-"), new TObjString("CMUS1B"));
63e2955d 173 fTriggerClass->Add(new TObjString("CMUS5-B-"), new TObjString("CMUS5B"));
417d6f63 174 fTriggerClass->Add(new TObjString("CINT1-AC-"), new TObjString("CINT1AC"));
63e2955d 175 fTriggerClass->Add(new TObjString("CINT5-AC-"), new TObjString("CINT5AC"));
417d6f63 176 fTriggerClass->Add(new TObjString("CMUS1-AC-"), new TObjString("CMUS1AC"));
63e2955d 177 fTriggerClass->Add(new TObjString("CMUS5-AC-"), new TObjString("CMUS5AC"));
417d6f63 178 fTriggerClass->Add(new TObjString("CSH1-B-"), new TObjString("CSH1B"));
63e2955d 179
180 TString side_pp[3] = {"B", "AC", "E"};
fef24632 181 for(Int_t i = 0; i< 3; i++){
182 fTriggerClass->Add(new TObjString(Form("CINT7-%s-", side_pp[i].Data())), new TObjString(Form("CINT7%s",side_pp[i].Data())));
183 fTriggerClass->Add(new TObjString(Form("CMUSH7-%s-",side_pp[i].Data())), new TObjString(Form("CMUSH7%s",side_pp[i].Data())));
184 fTriggerClass->Add(new TObjString(Form("CMUL7-%s-",side_pp[i].Data())), new TObjString(Form("CMUL7%s",side_pp[i].Data())));
185 fTriggerClass->Add(new TObjString(Form("CMUU7-%s-",side_pp[i].Data())), new TObjString(Form("CMUU7%s",side_pp[i].Data())));
186 fTriggerClass->Add(new TObjString(Form("CMUS7-%s-",side_pp[i].Data())), new TObjString(Form("CMUS7%s",side_pp[i].Data())));
187 }
b66f9801 188 fTriggerClass->Add(new TObjString("CINT7-I-"), new TObjString("CINT7I"));
189
417d6f63 190 // Pb-Pb trigger classes
191 TString side[4] = {"B", "A", "C", "E"};
192 for (Int_t i = 0; i < 4; i++) {
193 fTriggerClass->Add(new TObjString(Form("CMBACS2-%s-", side[i].Data())), new TObjString(Form("CMBACS2-%s", side[i].Data())));
194 fTriggerClass->Add(new TObjString(Form("CMBS2A-%s-", side[i].Data())), new TObjString(Form("CMBS2A-%s", side[i].Data())));
195 fTriggerClass->Add(new TObjString(Form("CMBS2C-%s-", side[i].Data())), new TObjString(Form("CMBS2C-%s", side[i].Data())));
196 fTriggerClass->Add(new TObjString(Form("CMBAC-%s-", side[i].Data())), new TObjString(Form("CMBAC-%s", side[i].Data())));
197 fTriggerClass->Add(new TObjString(Form("C0SMH-%s-", side[i].Data())), new TObjString(Form("C0SMH-%s", side[i].Data())));
198 }
03ac5989 199
200 // set the list of trigger classes that can be selected to fill histograms (in case the physics selection is not used)
201 fSelectTriggerClass = new TList();
202 fSelectTriggerClass->SetOwner();
417d6f63 203 // p-p trigger classes
204 fSelectTriggerClass->AddLast(new TObjString("CINT1B-ABCE-NOPF-ALL")); fSelectTriggerClass->Last()->SetUniqueID(AliVEvent::kMB);
205 fSelectTriggerClass->AddLast(new TObjString("CMUS1B-ABCE-NOPF-MUON")); fSelectTriggerClass->Last()->SetUniqueID(AliVEvent::kMUON);
206 fSelectTriggerClass->AddLast(new TObjString("CINT1-B-")); fSelectTriggerClass->Last()->SetUniqueID(AliVEvent::kMB);
63e2955d 207 fSelectTriggerClass->AddLast(new TObjString("CINT5-B-")); fSelectTriggerClass->Last()->SetUniqueID(AliVEvent::kCINT5);
417d6f63 208 fSelectTriggerClass->AddLast(new TObjString("CMUS1-B-")); fSelectTriggerClass->Last()->SetUniqueID(AliVEvent::kMUON);
63e2955d 209 fSelectTriggerClass->AddLast(new TObjString("CMUS5-B-")); fSelectTriggerClass->Last()->SetUniqueID(AliVEvent::kCMUS5);
fef24632 210 fSelectTriggerClass->AddLast(new TObjString("CINT7-B-")); fSelectTriggerClass->Last()->SetUniqueID(AliVEvent::kINT7);
b66f9801 211 fSelectTriggerClass->AddLast(new TObjString("CINT7-I-")); fSelectTriggerClass->Last()->SetUniqueID(AliVEvent::kINT7);
63e2955d 212 fSelectTriggerClass->AddLast(new TObjString("CMUSH7-B-")); fSelectTriggerClass->Last()->SetUniqueID(AliVEvent::kMUSH7);
fef24632 213 fSelectTriggerClass->AddLast(new TObjString("CMUS7-B-")); fSelectTriggerClass->Last()->SetUniqueID(AliVEvent::kMUS7);
63e2955d 214 fSelectTriggerClass->AddLast(new TObjString("CMUU7-B-")); fSelectTriggerClass->Last()->SetUniqueID(AliVEvent::kMUU7);
215 fSelectTriggerClass->AddLast(new TObjString("CMUL7-B-")); fSelectTriggerClass->Last()->SetUniqueID(AliVEvent::kMUL7);
417d6f63 216 fSelectTriggerClass->AddLast(new TObjString("CSH1-B-")); fSelectTriggerClass->Last()->SetUniqueID(AliVEvent::kHighMult);
63e2955d 217
417d6f63 218 // Pb-Pb trigger classes
219 fSelectTriggerClass->AddLast(new TObjString("CMBACS2-B-")); fSelectTriggerClass->Last()->SetUniqueID(AliVEvent::kMB);
220 fSelectTriggerClass->AddLast(new TObjString("CMBS2A-B-")); fSelectTriggerClass->Last()->SetUniqueID(AliVEvent::kMB);
221 fSelectTriggerClass->AddLast(new TObjString("CMBS2C-B-")); fSelectTriggerClass->Last()->SetUniqueID(AliVEvent::kMB);
222 fSelectTriggerClass->AddLast(new TObjString("CMBAC-B-")); fSelectTriggerClass->Last()->SetUniqueID(AliVEvent::kMB);
223 fSelectTriggerClass->AddLast(new TObjString("C0SMH-B-")); fSelectTriggerClass->Last()->SetUniqueID(AliVEvent::kHighMult);
03ac5989 224
225 // create histograms
94ef1a28 226 fList = new TObjArray(2000);
227 fList->SetOwner();
228 fListExpert = new TObjArray(2000);
229 fListExpert->SetOwner();
230
13bb4ca7 231 // event info
94ef1a28 232 TH1F* hNTracks = new TH1F("hNTracks", "number of tracks;n_{tracks}", 20, 0., 20.);
233 fList->AddAtAndExpand(hNTracks, kNTracks);
234
13bb4ca7 235 Int_t muonTrigIndex[] = { AliVEvent::kMuonUnlikePB, AliVEvent::kMuonLikePB, AliVEvent::kMUSHPB, AliVEvent::kMuonUnlikePB | AliVEvent::kMuonLikePB,
236 AliVEvent::kMuonUnlikePB | AliVEvent::kMUSHPB, AliVEvent::kMuonLikePB | AliVEvent::kMUSHPB,
237 AliVEvent::kMuonUnlikePB | AliVEvent::kMuonLikePB | AliVEvent::kMUSHPB};
238 const Int_t nTrigIndexes = sizeof(muonTrigIndex)/sizeof(muonTrigIndex[0]);
239 fMuonTrigIndex.Set(nTrigIndexes, muonTrigIndex);
240 TString label[nTrigIndexes] = {"Unlike","Like", "Single Hpt","Like&Unlike","Unlike&Hpt","Like&Hpt","Unlike&Like&Hpt"};
241 TH1I* hMuonTriggers = new TH1I("hMuonTriggers", "Muon triggers", nTrigIndexes, -0.5, -0.5+(Double_t)nTrigIndexes);
242 for(Int_t ibin=0; ibin<nTrigIndexes; ibin++) hMuonTriggers->GetXaxis()->SetBinLabel(ibin+1,label[ibin].Data());
243 fList->AddAtAndExpand(hMuonTriggers, kMuonTrig);
244
245 //track info
94ef1a28 246 TH1F* hMatchTrig = new TH1F("hMatchTrig", "number of tracks matched with trigger;n_{tracks}", 20, 0., 20.);
247 fList->AddAtAndExpand(hMatchTrig, kMatchTrig);
248
249 TH1F* hSign = new TH1F("hSign", "track sign;sign", 3, -1.5, 1.5);
250 fList->AddAtAndExpand(hSign, kSign);
251
252 TH1F* hDCA = new TH1F("hDCA", "DCA distribution;DCA (cm)", 500, 0., 500.);
253 fList->AddAtAndExpand(hDCA, kDCA);
254
255 TH1F* hP = new TH1F("hP", "momentum distribution;p (GeV/c)", 300, 0., 300.);
256 fList->AddAtAndExpand(hP, kP);
16dc5a7c 257
03ac5989 258 TH1F* hPMuPlus = new TH1F("hPMuPlus", "momentum distribution of #mu^{+};p (GeV/c)", 300, 0., 300.);
259 fList->AddAtAndExpand(hPMuPlus, kPMuPlus);
260
261 TH1F* hPMuMinus = new TH1F("hPMuMinus", "momentum distribution of #mu^{-};p (GeV/c)", 300, 0., 300.);
262 fList->AddAtAndExpand(hPMuMinus, kPMuMinus);
263
b8e17107 264 Int_t nPtBins = 300;
265 Double_t ptMin = 0., ptMax = 30.;
16dc5a7c 266
b8e17107 267 TH1F* hPt = new TH1F("hPt", "transverse momentum distribution;p_{t} (GeV/c)", nPtBins, ptMin, ptMax);
94ef1a28 268 fList->AddAtAndExpand(hPt, kPt);
269
b8e17107 270 TH1F* hPtMuPlus = new TH1F("hPtMuPlus", "transverse momentum distribution of #mu^{+};p_{t} (GeV/c)", nPtBins, ptMin, ptMax);
03ac5989 271 fList->AddAtAndExpand(hPtMuPlus, kPtMuPlus);
272
b8e17107 273 TH1F* hPtMuMinus = new TH1F("hPtMuMinus", "transverse momentum distribution of #mu^{-};p_{t} (GeV/c)", nPtBins, ptMin, ptMax);
03ac5989 274 fList->AddAtAndExpand(hPtMuMinus, kPtMuMinus);
275
94ef1a28 276 TH1F* hRapidity = new TH1F("hRapidity", "rapidity distribution;rapidity", 200, -4.5, -2.);
277 fList->AddAtAndExpand(hRapidity, kRapidity);
278
279 TH1F* hThetaX = new TH1F("hThetaX", "#theta_{X} distribution;#theta_{X} (degree)", 360, -180., 180);
280 fList->AddAtAndExpand(hThetaX, kThetaX);
281
282 TH1F* hThetaY = new TH1F("hThetaY", "#theta_{Y} distribution;#theta_{Y} (degree)", 360, -180., 180);
283 fList->AddAtAndExpand(hThetaY, kThetaY);
284
285 TH1F* hChi2 = new TH1F("hChi2", "normalized #chi^{2} distribution;#chi^{2} / ndf", 500, 0., 50.);
286 fList->AddAtAndExpand(hChi2, kChi2);
287
288 TH1F* hProbChi2 = new TH1F("hProbChi2", "distribution of probability of #chi^{2};prob(#chi^{2})", 100, 0., 1.);
289 fList->AddAtAndExpand(hProbChi2, kProbChi2);
290
291 // cluster info
292 TH1F* hNClustersPerTrack = new TH1F("hNClustersPerTrack", "number of associated clusters per track;n_{clusters}", 20, 0., 20.);
293 fList->AddAtAndExpand(hNClustersPerTrack, kNClustersPerTrack);
294
295 TH1F* hNChamberHitPerTrack = new TH1F("hNChamberHitPerTrack", "number of chambers hit per track;n_{chamber hit}", 15, 0., 15.);
296 fList->AddAtAndExpand(hNChamberHitPerTrack, kNChamberHitPerTrack);
16dc5a7c 297
b8e17107 298 // Matched tracks info
299 TH1F* hPtMatchLpt = new TH1F("hPtMatchLpt", "transverse momentum distribution matching Lpt;p_{t} (GeV/c)", nPtBins, ptMin, ptMax);
300 fList->AddAtAndExpand(hPtMatchLpt, kPtMatchLpt);
301
302 TH1F* hPtMatchHpt = new TH1F("hPtMatchHpt", "transverse momentum distribution matching Hpt;p_{t} (GeV/c)", nPtBins, ptMin, ptMax);
303 fList->AddAtAndExpand(hPtMatchHpt, kPtMatchHpt);
304
305 TH1F* hPtMuPlusMatchLpt = new TH1F("hPtMuPlusMatchLpt", "transverse momentum distribution of #mu^{+} matching Lpt;p_{t} (GeV/c)", nPtBins, ptMin, ptMax);
306 fList->AddAtAndExpand(hPtMuPlusMatchLpt, kPtMuPlusMatchLpt);
307
308 TH1F* hPtMuPlusMatchHpt = new TH1F("hPtMuPlusMatchHpt", "transverse momentum distribution of #mu^{+} matching Hpt;p_{t} (GeV/c)", nPtBins, ptMin, ptMax);
309 fList->AddAtAndExpand(hPtMuPlusMatchHpt, kPtMuPlusMatchHpt);
310
311 TH1F* hPtMuMinusMatchLpt = new TH1F("hPtMuMinusMatchLpt", "transverse momentum distribution of #mu^{-} matching Lpt;p_{t} (GeV/c)", nPtBins, ptMin, ptMax);
312 fList->AddAtAndExpand(hPtMuMinusMatchLpt, kPtMuMinusMatchLpt);
313
314 TH1F* hPtMuMinusMatchHpt = new TH1F("hPtMuMinusMatchHpt", "transverse momentum distribution of #mu^{-} matching Hpt;p_{t} (GeV/c)", nPtBins, ptMin, ptMax);
315 fList->AddAtAndExpand(hPtMuMinusMatchHpt, kPtMuMinusMatchHpt);
16dc5a7c 316
94ef1a28 317 TH1F* hNClustersPerCh = new TH1F("hNClustersPerCh", "averaged number of clusters per chamber per track;chamber ID;<n_{clusters}>", nCh, -0.5, nCh-0.5);
318 hNClustersPerCh->Sumw2();
319 hNClustersPerCh->SetOption("P");
320 hNClustersPerCh->SetMarkerStyle(kFullDotMedium);
321 hNClustersPerCh->SetMarkerColor(kBlue);
40be9f05 322 fListExpert->AddAtAndExpand(hNClustersPerCh, kNClustersPerCh);
94ef1a28 323
324 TH1F* hNClustersPerDE = new TH1F("hNClustersPerDE", "averaged number of clusters per DE per track;DetElem ID;<n_{clusters}>", nDE+1, -0.5, nDE+0.5);
325 hNClustersPerDE->Sumw2();
326 hNClustersPerDE->SetOption("P");
327 hNClustersPerDE->SetMarkerStyle(kFullDotMedium);
328 hNClustersPerDE->SetMarkerColor(kBlue);
40be9f05 329 fListExpert->AddAtAndExpand(hNClustersPerDE, kNClustersPerDE);
94ef1a28 330
331 for (Int_t i = 0; i < nCh; i++) {
332 Float_t rMax = 0.5*dMax[i/2];
333 TH2F* hClusterHitMapInCh = new TH2F(Form("hClusterHitMapInCh%d",i+1), Form("cluster position distribution in chamber %d;X (cm);Y (cm)",i+1),
16dc5a7c 334 100, -rMax, rMax, 100, -rMax, rMax);
94ef1a28 335 fListExpert->AddAtAndExpand(hClusterHitMapInCh, kClusterHitMapInCh+i);
336
337 TH1F* hClusterChargeInCh = new TH1F(Form("hClusterChargeInCh%d",i+1), Form("cluster charge distribution in chamber %d;charge (fC)",i+1), 100, 0., 1000.);
338 fListExpert->AddAtAndExpand(hClusterChargeInCh, kClusterChargeInCh+i);
339
340 TH1F* hClusterSizeInCh = new TH1F(Form("hClusterSizeInCh%d",i+1), Form("cluster size distribution in chamber %d;size (n_{pads})",i+1), 200, 0., 200.);
341 fListExpert->AddAtAndExpand(hClusterSizeInCh, kClusterSizeInCh+i);
342 }
343
344 TH2F* hClusterChargePerDE = new TH2F("hClusterChargePerDE", "cluster charge distribution per DE;DetElem ID;charge (fC)", nDE+1, -0.5, nDE+0.5, 100, 0., 1000.);
345 fListExpert->AddAtAndExpand(hClusterChargePerDE, kClusterChargePerDE);
346
347 TH2F* hClusterSizePerDE = new TH2F("hClusterSizePerDE", "cluster size distribution per DE;DetElem ID;size (n_{pads})", nDE+1, -0.5, nDE+0.5, 200, 0., 200.);
348 fListExpert->AddAtAndExpand(hClusterSizePerDE, kClusterSizePerDE);
349
94ef1a28 350 // initialize track counters
351 fTrackCounters = new AliCounterCollection("trackCounters");
03ac5989 352 fTrackCounters->AddRubric("track", "trackeronly/triggeronly/matched");
417d6f63 353 fTrackCounters->AddRubric("trigger", 1000000);
94ef1a28 354 fTrackCounters->AddRubric("run", 1000000);
355 fTrackCounters->AddRubric("selected", "yes/no");
356 fTrackCounters->AddRubric("triggerRO", "good/bad");
58e4dd21 357 fTrackCounters->AddRubric("v0mult", "low/int/high/any");
03ac5989 358 fTrackCounters->AddRubric("charge", "pos/neg/any");
359 fTrackCounters->AddRubric("pt", "low/high/any");
417d6f63 360 fTrackCounters->AddRubric("acc", "in/out");
13bb4ca7 361 fTrackCounters->AddRubric("tagTrack", "beamGas/good");
94ef1a28 362 fTrackCounters->Init();
363
364 // initialize event counters
365 fEventCounters = new AliCounterCollection("eventCounters");
366 fEventCounters->AddRubric("event", "muon/any");
417d6f63 367 fEventCounters->AddRubric("trigger", 1000000);
94ef1a28 368 fEventCounters->AddRubric("run", 1000000);
369 fEventCounters->AddRubric("selected", "yes/no");
370 fEventCounters->AddRubric("triggerRO", "good/bad");
58e4dd21 371 fEventCounters->AddRubric("v0mult", "low/int/high/any");
94ef1a28 372 fEventCounters->Init();
373
374 // Post data at least once per task to ensure data synchronisation (required for merging)
375 PostData(1, fList);
376 PostData(2, fListExpert);
377 PostData(3, fTrackCounters);
378 PostData(4, fEventCounters);
379}
380
381//________________________________________________________________________
382void AliAnalysisTaskMuonQA::UserExec(Option_t *)
383{
384 /// Called for each event
385
94ef1a28 386 AliESDEvent* fESD = dynamic_cast<AliESDEvent*>(InputEvent());
387 if (!fESD) {
388 Printf("ERROR: fESD not available");
389 return;
390 }
391
13bb4ca7 392 UInt_t geomAccMask = ( AliMuonTrackCuts::kMuEta | AliMuonTrackCuts::kMuThetaAbs );
393
03ac5989 394 // check physics selection
395 UInt_t triggerWord = (fInputHandler) ? fInputHandler->IsEventSelected() : 0;
396 Bool_t isPhysicsSelected = (triggerWord != 0);
397 TString selected = isPhysicsSelected ? "selected:yes" : "selected:no";
13bb4ca7 398
399 // fill muon trigger cases
400 for ( Int_t idx=0; idx<fMuonTrigIndex.GetSize(); idx++ ) {
401 UInt_t currMask = (UInt_t)fMuonTrigIndex[idx];
402 if ( ( triggerWord & currMask ) == currMask ) ((TH1I*)fList->UncheckedAt(kMuonTrig))->Fill(idx);
403 }
b4f7418a 404
03ac5989 405 // check trigger selection
406 TString FiredTriggerClasses = fESD->GetFiredTriggerClasses();
407 if (!fSelectPhysics) triggerWord = BuildTriggerWord(FiredTriggerClasses);
408 Bool_t isTriggerSelected = ((triggerWord & fTriggerMask) != 0);
409
13bb4ca7 410
417d6f63 411 // get the V0 multiplicity (except for p-p)
412 AliESDVZERO* v0Data = fESD->GetVZEROData();
413 Float_t v0Mult = 0.;
414 if (v0Data && strcmp(fESD->GetBeamType(),"p-p"))
415 for (Int_t i = 0 ; i < 64 ; i++) v0Mult += v0Data->GetMultiplicity(i);
416 TList listV0MultKey;
417 listV0MultKey.SetOwner();
418 listV0MultKey.AddLast(new TObjString("v0mult:any"));
58e4dd21 419 //if (v0Mult > 239. && v0Mult < 559.) listV0MultKey.AddLast(new TObjString("v0mult:low"));
420 if (v0Mult >= 239. && v0Mult < 1165.) listV0MultKey.AddLast(new TObjString("v0mult:low"));
421 else if (v0Mult >= 1165. && v0Mult < 12191.) listV0MultKey.AddLast(new TObjString("v0mult:int"));
422 else if (v0Mult >= 12191. && v0Mult < 20633.) listV0MultKey.AddLast(new TObjString("v0mult:high"));
417d6f63 423 TIter nextV0MultKey(&listV0MultKey);
424
03ac5989 425 // first loop over tracks to check for trigger readout problem
76e3d5d4 426 Int_t maxTriggerRO = (!strcmp(fESD->GetBeamType(),"p-p")) ? 10 : 1000;
03ac5989 427 Int_t nTracks = (Int_t) fESD->GetNumberOfMuonTracks();
94ef1a28 428 Int_t nTriggerTracks = 0;
03ac5989 429 for (Int_t iTrack = 0; iTrack < nTracks; ++iTrack)
430 if (fESD->GetMuonTrack(iTrack)->ContainTriggerData()) nTriggerTracks++;
76e3d5d4 431 TString triggerRO = (nTriggerTracks < maxTriggerRO) ? "triggerRO:good" : "triggerRO:bad";
94ef1a28 432
03ac5989 433 // --- fill event counters ---
434
435 // build the list of trigger cases
16dc5a7c 436 //TList* triggerCases = BuildListOfTriggerCases(FiredTriggerClasses);
437 TList* triggerCases = BuildListOfAllTriggerCases(FiredTriggerClasses);
438
03ac5989 439 // loop over trigger cases
440 TObjString* triggerKey = 0x0;
441 TIter nextTriggerCase(triggerCases);
442 while ((triggerKey = static_cast<TObjString*>(nextTriggerCase()))) {
94ef1a28 443
417d6f63 444 // loop over V0Mult cases
445 TObjString* v0MultKey = 0x0;
446 nextV0MultKey.Reset();
447 while ((v0MultKey = static_cast<TObjString*>(nextV0MultKey()))) {
448
449 // any event
450 fEventCounters->Count(Form("event:any/%s/run:%d/%s/%s/%s", triggerKey->GetName(), fCurrentRunNumber, selected.Data(), triggerRO.Data(), v0MultKey->GetName()));
451
452 // muon event
453 if (nTracks > 0) fEventCounters->Count(Form("event:muon/%s/run:%d/%s/%s/%s", triggerKey->GetName(), fCurrentRunNumber, selected.Data(), triggerRO.Data(), v0MultKey->GetName()));
454
455 }
03ac5989 456
457 }
458
459 // second loop over tracks to fill histograms and track counters
460 Int_t nSelectedTrackerTracks = 0;
461 Int_t nSelectedTrackMatchTrig = 0;
462 Int_t nPVTracks = fESD->GetPrimaryVertex()->GetNContributors();
463 for (Int_t iTrack = 0; iTrack < nTracks; ++iTrack) {
464
465 // get the ESD track
94ef1a28 466 AliESDMuonTrack* esdTrack = fESD->GetMuonTrack(iTrack);
94ef1a28 467
03ac5989 468 // --- fill track counters ---
469
470 // define the key words
471 TString trackKey = "track:";
417d6f63 472 TString accKey = "acc:";
13bb4ca7 473 Bool_t isBeamGas = kFALSE;
474 TList chargeKeyList;
475 chargeKeyList.SetOwner();
476 chargeKeyList.Add(new TObjString("charge:any"));
477 TList ptKeyList;
478 ptKeyList.SetOwner();
479 ptKeyList.Add(new TObjString("pt:any"));
03ac5989 480 if (esdTrack->ContainTrackerData()) {
481
482 if (esdTrack->ContainTriggerData()) trackKey += "matched";
483 else trackKey += "trackeronly";
484
485 Short_t trackCharge = esdTrack->Charge();
13bb4ca7 486 TString chargeKey = "charge:";
487 chargeKey += ( trackCharge < 0 ) ? "neg" : "pos";
488 chargeKeyList.Add(new TObjString(chargeKey));
417d6f63 489
13bb4ca7 490 UInt_t mask = fTrackCuts->GetSelectionMask(esdTrack);
491 Bool_t passGeomAccCuts = ( ( mask & geomAccMask ) == geomAccMask );
492 accKey += ( passGeomAccCuts ) ? "in" : "out";
493 if ( passGeomAccCuts && nPVTracks>0 ) {
494 Double_t trackPt = esdTrack->Pt();
495 if ( trackPt > 1. ) ptKeyList.Add(new TObjString("pt:low"));
496 if ( trackPt > 2. ) ptKeyList.Add(new TObjString("pt:high"));;
497 }
498 if ( ( mask & AliMuonTrackCuts::kMuPdca ) == 0 ) isBeamGas = kTRUE;
03ac5989 499 } else {
500
501 trackKey += "triggeronly";
417d6f63 502 accKey += "out"; // ghost are labelled out of the acceptance
13bb4ca7 503
03ac5989 504 }
94ef1a28 505
13bb4ca7 506 TString tagKey = "tagTrack:";
507 tagKey += ( isBeamGas ) ? "beamGas" : "good";
508
03ac5989 509 // loop over trigger cases and fill counters
510 nextTriggerCase.Reset();
511 while ((triggerKey = static_cast<TObjString*>(nextTriggerCase()))) {
512
417d6f63 513 // loop over V0Mult cases
514 TObjString* v0MultKey = 0x0;
515 nextV0MultKey.Reset();
516 while ((v0MultKey = static_cast<TObjString*>(nextV0MultKey()))) {
517
13bb4ca7 518 for ( Int_t icharge=0; icharge<chargeKeyList.GetEntries(); icharge++ ) {
519 for ( Int_t ipt=0; ipt<ptKeyList.GetEntries(); ipt++ ) {
520 fTrackCounters->Count(Form("%s/%s/run:%d/%s/%s/%s/%s/%s/%s/%s", trackKey.Data(), triggerKey->GetName(), fCurrentRunNumber,
521 selected.Data(), chargeKeyList.At(icharge)->GetName(), ptKeyList.At(ipt)->GetName(),
522 triggerRO.Data(), v0MultKey->GetName(), accKey.Data(), tagKey.Data()));
523 }
524 }
03ac5989 525 }
526
94ef1a28 527 }
528
529 // --- apply selections and fill histograms with selected tracks ---
530
03ac5989 531 // remove "ghost"
532 if (!esdTrack->ContainTrackerData()) continue;
533
94ef1a28 534 // select on "physics" before filling histograms
535 if (fSelectPhysics && !isPhysicsSelected) continue;
536
03ac5989 537 // select on trigger before filling histograms
538 if (fSelectTrigger && !isTriggerSelected) continue;
b4f7418a 539
94ef1a28 540 // select on track charge
541 if (fSelectCharge*esdTrack->Charge() < 0) continue;
542
76e3d5d4 543 // select on track matching
544 if (fSelectMatched && !esdTrack->ContainTriggerData()) continue;
545
417d6f63 546 // skip tracks that do not pass the acceptance cuts if required
547 if (fApplyAccCut && accKey.EndsWith("out")) continue;
548
94ef1a28 549 nSelectedTrackerTracks++;
550 if (esdTrack->ContainTriggerData()) nSelectedTrackMatchTrig++;
551
03ac5989 552 Double_t trackP = esdTrack->P();
553 Double_t trackPt = esdTrack->Pt();
554 Short_t trackCharge = esdTrack->Charge();
555 ((TH1F*)fList->UncheckedAt(kP))->Fill(trackP);
556 ((TH1F*)fList->UncheckedAt(kPt))->Fill(trackPt);
b8e17107 557 Bool_t matchTrigLpt = (esdTrack->GetMatchTrigger()>=2);
558 Bool_t matchTrigHpt = (esdTrack->GetMatchTrigger()>=3);
559 if ( matchTrigLpt ) ((TH1F*)fList->UncheckedAt(kPtMatchLpt))->Fill(trackPt);
560 if ( matchTrigHpt ) ((TH1F*)fList->UncheckedAt(kPtMatchHpt))->Fill(trackPt);
03ac5989 561 if (trackCharge < 0) {
562 ((TH1F*)fList->UncheckedAt(kPMuMinus))->Fill(trackP);
563 ((TH1F*)fList->UncheckedAt(kPtMuMinus))->Fill(trackPt);
b8e17107 564 if ( matchTrigLpt ) ((TH1F*)fList->UncheckedAt(kPtMuMinusMatchLpt))->Fill(trackPt);
565 if ( matchTrigHpt ) ((TH1F*)fList->UncheckedAt(kPtMuMinusMatchHpt))->Fill(trackPt);
03ac5989 566 } else {
567 ((TH1F*)fList->UncheckedAt(kPMuPlus))->Fill(trackP);
568 ((TH1F*)fList->UncheckedAt(kPtMuPlus))->Fill(trackPt);
b8e17107 569 if ( matchTrigLpt ) ((TH1F*)fList->UncheckedAt(kPtMuPlusMatchLpt))->Fill(trackPt);
570 if ( matchTrigHpt ) ((TH1F*)fList->UncheckedAt(kPtMuPlusMatchHpt))->Fill(trackPt);
03ac5989 571 }
94ef1a28 572 ((TH1F*)fList->UncheckedAt(kRapidity))->Fill(esdTrack->Y());
573 Int_t ndf = 2 * esdTrack->GetNHit() - 5;
574 ((TH1F*)fList->UncheckedAt(kChi2))->Fill(esdTrack->GetChi2()/ndf);
575 ((TH1F*)fList->UncheckedAt(kProbChi2))->Fill(TMath::Prob(esdTrack->GetChi2(),ndf));
576 ((TH1F*)fList->UncheckedAt(kThetaX))->Fill(ChangeThetaRange(esdTrack->GetThetaXUncorrected()));
577 ((TH1F*)fList->UncheckedAt(kThetaY))->Fill(ChangeThetaRange(esdTrack->GetThetaYUncorrected()));
578 ((TH1F*)fList->UncheckedAt(kNClustersPerTrack))->Fill(esdTrack->GetNHit());
03ac5989 579 ((TH1F*)fList->UncheckedAt(kSign))->Fill(trackCharge);
94ef1a28 580 ((TH1F*)fList->UncheckedAt(kDCA))->Fill(esdTrack->GetDCA());
581
582 Int_t nChamberHit = 0;
583 for (Int_t ich=0; ich<10; ich++) if (esdTrack->IsInMuonClusterMap(ich)) nChamberHit++;
584 ((TH1F*)fList->UncheckedAt(kNChamberHitPerTrack))->Fill(nChamberHit);
585
fe0324de 586 // loop over clusters
587 for (Int_t icl=0; icl<esdTrack->GetNClusters(); icl++) {
588
589 AliESDMuonCluster* esdCluster = esdTrack->GetESDEvent()->FindMuonCluster(esdTrack->GetClusterId(icl));
94ef1a28 590
591 Int_t chId = esdCluster->GetChamberId();
592 Int_t deId = esdCluster->GetDetElemId();
593
40be9f05 594 ((TH1F*)fListExpert->UncheckedAt(kNClustersPerCh))->Fill(chId);
595 ((TH1F*)fListExpert->UncheckedAt(kNClustersPerDE))->Fill(deId);
94ef1a28 596
597 ((TH1F*)fListExpert->UncheckedAt(kClusterHitMapInCh+chId))->Fill(esdCluster->GetX(), esdCluster->GetY());
598
599 ((TH1F*)fListExpert->UncheckedAt(kClusterChargeInCh+chId))->Fill(esdCluster->GetCharge());
600 ((TH1F*)fListExpert->UncheckedAt(kClusterChargePerDE))->Fill(deId, esdCluster->GetCharge());
601
602 if (esdCluster->PadsStored()) { // discard clusters with pad not stored in ESD
603 ((TH1F*)fListExpert->UncheckedAt(kClusterSizeInCh+chId))->Fill(esdCluster->GetNPads());
604 ((TH1F*)fListExpert->UncheckedAt(kClusterSizePerDE))->Fill(deId, esdCluster->GetNPads());
605 }
606
94ef1a28 607 }
608
609 }
610
03ac5989 611 if ((!fSelectPhysics || isPhysicsSelected) && (!fSelectTrigger || isTriggerSelected)) {
b4f7418a 612 ((TH1F*)fList->UncheckedAt(kNTracks))->Fill(nSelectedTrackerTracks);
613 ((TH1F*)fList->UncheckedAt(kMatchTrig))->Fill(nSelectedTrackMatchTrig);
13bb4ca7 614 }
94ef1a28 615
03ac5989 616 // clean memory
617 delete triggerCases;
94ef1a28 618
619 // Post final data. It will be written to a file with option "RECREATE"
620 PostData(1, fList);
621 PostData(2, fListExpert);
622 PostData(3, fTrackCounters);
623 PostData(4, fEventCounters);
624}
625
626//________________________________________________________________________
627void AliAnalysisTaskMuonQA::Terminate(Option_t *)
628{
629 /// Normalize histograms
630 /// Draw result to the screen
631 /// Print statistics
632
94ef1a28 633 // global statistic
40be9f05 634 fTrackCounters = static_cast<AliCounterCollection*>(GetOutputData(3));
635 fEventCounters = static_cast<AliCounterCollection*>(GetOutputData(4));
94ef1a28 636 if (fTrackCounters && fEventCounters) {
637 if (!gROOT->IsBatch()) {
638 cout<<"whole statistics without selection:"<<endl;
639 fEventCounters->Print("trigger/event");
640 fTrackCounters->Print("trigger/track");
641 cout<<"whole statistics of selected events:"<<endl;
642 fEventCounters->Print("trigger/event","selected:yes");
643 fTrackCounters->Print("trigger/track","selected:yes");
644 new TCanvas();
645 fEventCounters->Draw("event","trigger","");
646 new TCanvas();
647 fTrackCounters->Draw("track","trigger","");
648 new TCanvas();
649 fEventCounters->Draw("event","trigger","selected:yes");
650 new TCanvas();
651 fTrackCounters->Draw("track","trigger","selected:yes");
652 }
653 }
654
40be9f05 655 // recover output histograms
656 fList = static_cast<TObjArray*>(GetOutputData(1));
657 fListExpert = static_cast<TObjArray*>(GetOutputData(2));
658 if (!fList || !fListExpert) return;
659
660 // create summary plots
661 fListNorm = new TObjArray(1000);
662 fListNorm->SetOwner();
663
664 // mean/dispersion of cluster charge per chamber/DE
665 TH1F* hClusterChargePerChMean = new TH1F("hClusterChargePerChMean", "cluster mean charge per chamber;chamber ID;<charge> (fC)", nCh, -0.5, nCh-0.5);
666 hClusterChargePerChMean->SetOption("P");
667 hClusterChargePerChMean->SetMarkerStyle(kFullDotMedium);
668 hClusterChargePerChMean->SetMarkerColor(kBlue);
669 fListNorm->AddAtAndExpand(hClusterChargePerChMean, kClusterChargePerChMean);
670
671 TH1F* hClusterChargePerChSigma = new TH1F("hClusterChargePerChSigma", "cluster charge dispersion per chamber;chamber ID;#sigma_{charge} (fC)", nCh, -0.5, nCh-0.5);
672 hClusterChargePerChSigma->SetOption("P");
673 hClusterChargePerChSigma->SetMarkerStyle(kFullDotMedium);
674 hClusterChargePerChSigma->SetMarkerColor(kBlue);
675 fListNorm->AddAtAndExpand(hClusterChargePerChSigma, kClusterChargePerChSigma);
676
677 TH1F* hClusterChargePerDEMean = new TH1F("hClusterChargePerDEMean", "cluster mean charge per DE;DetElem ID;<charge> (fC)", nDE+1, -0.5, nDE+0.5);
678 hClusterChargePerDEMean->SetOption("P");
679 hClusterChargePerDEMean->SetMarkerStyle(kFullDotMedium);
680 hClusterChargePerDEMean->SetMarkerColor(kBlue);
681 fListNorm->AddAtAndExpand(hClusterChargePerDEMean, kClusterChargePerDEMean);
682
683 TH1F* hClusterChargePerDESigma = new TH1F("hClusterChargePerDESigma", "cluster charge dispersion per DE;DetElem ID;#sigma_{charge} (fC)", nDE+1, -0.5, nDE+0.5);
684 hClusterChargePerDESigma->SetOption("P");
685 hClusterChargePerDESigma->SetMarkerStyle(kFullDotMedium);
686 hClusterChargePerDESigma->SetMarkerColor(kBlue);
687 fListNorm->AddAtAndExpand(hClusterChargePerDESigma, kClusterChargePerDESigma);
688
689 // mean/dispersion of cluster size per chamber/DE
690 TH1F* hClusterSizePerChMean = new TH1F("hClusterSizePerChMean", "cluster mean size per chamber;chamber ID;<size> (n_{pads})", nCh, -0.5, nCh-0.5);
691 hClusterSizePerChMean->SetOption("P");
692 hClusterSizePerChMean->SetMarkerStyle(kFullDotMedium);
693 hClusterSizePerChMean->SetMarkerColor(kBlue);
694 fListNorm->AddAtAndExpand(hClusterSizePerChMean, kClusterSizePerChMean);
695
696 TH1F* hClusterSizePerChSigma = new TH1F("hClusterSizePerChSigma", "cluster size dispersion per chamber;chamber ID;#sigma_{size} (n_{pads})", nCh, -0.5, nCh-0.5);
697 hClusterSizePerChSigma->SetOption("P");
698 hClusterSizePerChSigma->SetMarkerStyle(kFullDotMedium);
699 hClusterSizePerChSigma->SetMarkerColor(kBlue);
700 fListNorm->AddAtAndExpand(hClusterSizePerChSigma, kClusterSizePerChSigma);
701
702 TH1F* hClusterSizePerDEMean = new TH1F("hClusterSizePerDEMean", "cluster mean size per DE;DetElem ID;<size> (n_{pads})", nDE+1, -0.5, nDE+0.5);
703 hClusterSizePerDEMean->SetOption("P");
704 hClusterSizePerDEMean->SetMarkerStyle(kFullDotMedium);
705 hClusterSizePerDEMean->SetMarkerColor(kBlue);
706 fListNorm->AddAtAndExpand(hClusterSizePerDEMean, kClusterSizePerDEMean);
707
708 TH1F* hClusterSizePerDESigma = new TH1F("hClusterSizePerDESigma", "cluster size dispersion per DE;DetElem ID;#sigma_{size} (n_{pads})", nDE+1, -0.5, nDE+0.5);
709 hClusterSizePerDESigma->SetOption("P");
710 hClusterSizePerDESigma->SetMarkerStyle(kFullDotMedium);
711 hClusterSizePerDESigma->SetMarkerColor(kBlue);
712 fListNorm->AddAtAndExpand(hClusterSizePerDESigma, kClusterSizePerDESigma);
713
714 // normalize histograms
94ef1a28 715 Float_t nTracks = ((TH1F*)fList->UncheckedAt(kNClustersPerTrack))->GetEntries();
716 if (nTracks > 0.) {
40be9f05 717 ((TH1F*)fListExpert->UncheckedAt(kNClustersPerCh))->Scale(1./nTracks);
718 ((TH1F*)fListExpert->UncheckedAt(kNClustersPerDE))->Scale(1./nTracks);
94ef1a28 719 }
76e3d5d4 720 fListNorm->AddAtAndExpand(((TH1F*)fListExpert->UncheckedAt(kNClustersPerCh))->Clone(), kNClustersPerChPerTrack);
721 fListNorm->AddAtAndExpand(((TH1F*)fListExpert->UncheckedAt(kNClustersPerDE))->Clone(), kNClustersPerDEPerTrack);
94ef1a28 722
723 // fill summary plots per chamber
94ef1a28 724 for (Int_t iCh = 0; iCh < nCh; iCh++) {
725
726 TH1* hClusterChargeInCh = ((TH1F*)fListExpert->UncheckedAt(kClusterChargeInCh+iCh));
727 hClusterChargePerChMean->SetBinContent(iCh+1, hClusterChargeInCh->GetMean());
728 hClusterChargePerChMean->SetBinError(iCh+1, hClusterChargeInCh->GetMeanError());
729 hClusterChargePerChSigma->SetBinContent(iCh+1, hClusterChargeInCh->GetRMS());
730 hClusterChargePerChSigma->SetBinError(iCh+1, hClusterChargeInCh->GetRMSError());
731
732 TH1* hClusterSizeInCh = ((TH1F*)fListExpert->UncheckedAt(kClusterSizeInCh+iCh));
733 hClusterSizePerChMean->SetBinContent(iCh+1, hClusterSizeInCh->GetMean());
734 hClusterSizePerChMean->SetBinError(iCh+1, hClusterSizeInCh->GetMeanError());
735 hClusterSizePerChSigma->SetBinContent(iCh+1, hClusterSizeInCh->GetRMS());
736 hClusterSizePerChSigma->SetBinError(iCh+1, hClusterSizeInCh->GetRMSError());
737
738 }
739
740 // fill summary plots per DE
741 TH2F* hClusterChargePerDE = ((TH2F*)fListExpert->UncheckedAt(kClusterChargePerDE));
94ef1a28 742 TH2F* hClusterSizePerDE = ((TH2F*)fListExpert->UncheckedAt(kClusterSizePerDE));
94ef1a28 743 for (Int_t iDE = 1; iDE < nDE+1; iDE++) {
744
745 TH1D *tmp = hClusterChargePerDE->ProjectionY("tmp",iDE,iDE,"e");
746 if (tmp->GetEntries() > 10.) {
747 hClusterChargePerDEMean->SetBinContent(iDE, tmp->GetMean());
748 hClusterChargePerDEMean->SetBinError(iDE, tmp->GetMeanError());
749 hClusterChargePerDESigma->SetBinContent(iDE, tmp->GetRMS());
750 hClusterChargePerDESigma->SetBinError(iDE, tmp->GetRMSError());
751 }
752 delete tmp;
753
754 tmp = hClusterSizePerDE->ProjectionY("tmp",iDE,iDE,"e");
755 if (tmp->GetEntries() > 10.) {
756 hClusterSizePerDEMean->SetBinContent(iDE, tmp->GetMean());
757 hClusterSizePerDEMean->SetBinError(iDE, tmp->GetMeanError());
758 hClusterSizePerDESigma->SetBinContent(iDE, tmp->GetRMS());
759 hClusterSizePerDESigma->SetBinError(iDE, tmp->GetRMSError());
760 }
761 delete tmp;
762
763 }
764
40be9f05 765 // Post summary data.
766 PostData(5, fListNorm);
94ef1a28 767}
768
769//________________________________________________________________________
770Double_t AliAnalysisTaskMuonQA::ChangeThetaRange(Double_t theta)
771{
03ac5989 772 /// set theta range from -180 to +180 degrees
94ef1a28 773 if(theta < -2.5) return (theta / TMath::Pi() + 1.) * 180.;
774 else if(theta > 2.5) return (theta / TMath::Pi() - 1.) * 180.;
775 else return theta / TMath::Pi() * 180.;
776}
777
13bb4ca7 778
03ac5989 779//________________________________________________________________________
780UInt_t AliAnalysisTaskMuonQA::BuildTriggerWord(TString& FiredTriggerClasses)
781{
782 /// build the trigger word from the fired trigger classes and the list of selectable trigger
783
784 UInt_t word = 0;
785
786 TObjString* trigClasseName = 0x0;
787 TIter nextTrigger(fSelectTriggerClass);
788 while ((trigClasseName = static_cast<TObjString*>(nextTrigger()))) {
789
790 TRegexp GenericTriggerClasseName(trigClasseName->String());
791 if (FiredTriggerClasses.Contains(GenericTriggerClasseName)) word |= trigClasseName->GetUniqueID();
792
793 }
794
795 return word;
796}
797
16dc5a7c 798//________________________________________________________________________
799TList* AliAnalysisTaskMuonQA::BuildListOfAllTriggerCases(TString& FiredTriggerClasses)
800{
801 /// build the list of trigger for the counters from the fired trigger classes
802 /// returned TList must be deleted by user
803
804 TList* list = new TList();
805 list->SetOwner();
806
807 // add case any
808 list->AddLast(new TObjString("trigger:any"));
809
16dc5a7c 810 TObjArray *obj = FiredTriggerClasses.Tokenize(" ");
811 if ( obj ){
812 TIter nextTrigger(obj);
79b4c269 813 TObjString* trigClasseName;
16dc5a7c 814 while ((trigClasseName = static_cast<TObjString*>(nextTrigger()))) {
815
816 //AliInfo(Form("trigger name %s %s",trigClasseName->GetName(),FiredTriggerClasses.Data()));
817
818 //Add specific trigger
819 list->AddLast(new TObjString(Form("trigger:%s",trigClasseName->GetName())));
820 }
821 delete obj;
16dc5a7c 822 }
823
824 // add case other if no specific trigger was found
825 if (list->GetSize() == 1) list->AddLast(new TObjString("trigger:other"));
826
827 return list;
828}
829
830
831//________________________________________________________________________
832TList* AliAnalysisTaskMuonQA::BuildListOfSelectedTriggerCases(TString& FiredTriggerClasses)
833{
834 /// build the list of trigger for the counters from the fired trigger classes
835 /// returned TList must be deleted by user
836
837 TList* list = new TList();
838 list->SetOwner();
839
840 // add case any
841 list->AddLast(new TObjString("trigger:any"));
842
843 TObjString* trigClasseName = 0x0;
844 TObjArray *obj = FiredTriggerClasses.Tokenize(" ");
845 if ( obj ){
846 TIter nextTrigger(obj);
847 while ((trigClasseName = static_cast<TObjString*>(nextTrigger()))) {
848
849 //AliInfo(Form("trigger name %s %s",trigClasseName->GetName(),FiredTriggerClasses.Data()));
850 //loop on rejected trigger if (trigClasseName.Contains()
851 //Add specific trigger
852 list->AddLast(new TObjString(Form("trigger:%s",trigClasseName->GetName())));
853 }
854 delete obj;
16dc5a7c 855 }
856
857 // add case other if no specific trigger was found
858 if (list->GetSize() == 1) list->AddLast(new TObjString("trigger:other"));
859
860 return list;
861}
862
03ac5989 863//________________________________________________________________________
864TList* AliAnalysisTaskMuonQA::BuildListOfTriggerCases(TString& FiredTriggerClasses)
865{
866 /// build the list of trigger for the counters from the fired trigger classes and the list of trigger classes
867 /// returned TList must be deleted by user
868
869 TList* list = new TList();
870 list->SetOwner();
76e3d5d4 871 Bool_t foundCINT1B = kFALSE;
872 Bool_t foundCMUS1B = kFALSE;
03ac5989 873
874 // add case any
875 list->AddLast(new TObjString("trigger:any"));
876
877 TObjString* trigClasseName = 0x0;
16dc5a7c 878
03ac5989 879 TIter nextTrigger(fTriggerClass);
880 while ((trigClasseName = static_cast<TObjString*>(nextTrigger()))) {
881
16dc5a7c 882 //AliInfo(Form("trigger name %s %s",trigClasseName->GetName(),FiredTriggerClasses.Data()));
883 // cout<<"trigger name loop on "<<trigClasseName->GetName()<<" to look for "<<FiredTriggerClasses.Data()<<endl;
03ac5989 884 TRegexp GenericTriggerClasseName(trigClasseName->String());
885 if (FiredTriggerClasses.Contains(GenericTriggerClasseName)) {
16dc5a7c 886 //AliInfo(Form("trigger names match = %s %s",trigClasseName->GetName(),FiredTriggerClasses.Data()));
887 //cout<<"trigger names match "<<trigClasseName->GetName()<<" and "<<FiredTriggerClasses.Data()<<endl;
03ac5989 888 // add specific trigger case
889 TObjString* trigShortName = static_cast<TObjString*>(fTriggerClass->GetValue(trigClasseName));
890 list->AddLast(new TObjString(Form("trigger:%s",trigShortName->GetName())));
891
76e3d5d4 892 // check for CINT1B and CMUS1B trigger
893 if (trigShortName->String() == "CINT1B") foundCINT1B = kTRUE;
894 else if (trigShortName->String() == "CMUS1B") foundCMUS1B = kTRUE;
03ac5989 895 }
03ac5989 896 }
16dc5a7c 897
76e3d5d4 898 // add the special case CINT1B+CMUS1B
899 if (foundCINT1B && foundCMUS1B) list->AddLast(new TObjString("trigger:CINT1B+CMUS1B"));
16dc5a7c 900
03ac5989 901 return list;
902}
903