]>
Commit | Line | Data |
---|---|---|
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 | 50 | using std::cout; |
51 | using std::endl; | |
52 | ||
94ef1a28 | 53 | ClassImp(AliAnalysisTaskMuonQA) |
54 | ||
55 | const Int_t AliAnalysisTaskMuonQA::nCh = 10; | |
56 | ||
57 | const Int_t AliAnalysisTaskMuonQA::nDE = 1100; | |
58 | ||
59 | const Float_t AliAnalysisTaskMuonQA::dMax[5] = {176.6, 229.0, 308.84, 418.2, 522.0}; // cm | |
60 | ||
40be9f05 | 61 | //________________________________________________________________________ |
62 | AliAnalysisTaskMuonQA::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 | //________________________________________________________________________ |
84 | AliAnalysisTaskMuonQA::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 | //________________________________________________________________________ | |
119 | AliAnalysisTaskMuonQA::~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 | //___________________________________________________________________________ | |
136 | void AliAnalysisTaskMuonQA::NotifyRun() | |
137 | { | |
138 | /// Notify run | |
139 | fTrackCuts->SetRun(fCurrentRunNumber); | |
94ef1a28 | 140 | } |
141 | ||
13bb4ca7 | 142 | |
143 | //___________________________________________________________________________ | |
144 | void AliAnalysisTaskMuonQA::SetTrackCuts(AliMuonTrackCuts* trackCuts) | |
145 | { | |
146 | /// Set track cuts | |
147 | if ( fTrackCuts ) delete fTrackCuts; | |
148 | fTrackCuts = new AliMuonTrackCuts(*trackCuts); | |
149 | } | |
150 | ||
151 | ||
94ef1a28 | 152 | //___________________________________________________________________________ |
153 | void 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 | //________________________________________________________________________ | |
382 | void 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 | //________________________________________________________________________ | |
627 | void 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 | //________________________________________________________________________ | |
770 | Double_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 | //________________________________________________________________________ |
780 | UInt_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 | //________________________________________________________________________ |
799 | TList* 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 | //________________________________________________________________________ | |
832 | TList* 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 | //________________________________________________________________________ |
864 | TList* 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 |