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