]> git.uio.no Git - u/mrichter/AliRoot.git/blame - PWG3/muon/AliAnalysisTaskMuonQA.cxx
Fixes for bug #77230: PWG3 par files
[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");
417d6f63 274 fTrackCounters->AddRubric("v0mult", "low/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");
417d6f63 287 fEventCounters->AddRubric("v0mult", "low/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"));
326 if (v0Mult > 559. && v0Mult < 1165.) listV0MultKey.AddLast(new TObjString("v0mult:low")); // 60-80%
327 else if (v0Mult > 12191. && v0Mult < 20633.) listV0MultKey.AddLast(new TObjString("v0mult:high")); // 0-10%
328 TIter nextV0MultKey(&listV0MultKey);
329
03ac5989 330 // first loop over tracks to check for trigger readout problem
76e3d5d4 331 Int_t maxTriggerRO = (!strcmp(fESD->GetBeamType(),"p-p")) ? 10 : 1000;
03ac5989 332 Int_t nTracks = (Int_t) fESD->GetNumberOfMuonTracks();
94ef1a28 333 Int_t nTriggerTracks = 0;
03ac5989 334 for (Int_t iTrack = 0; iTrack < nTracks; ++iTrack)
335 if (fESD->GetMuonTrack(iTrack)->ContainTriggerData()) nTriggerTracks++;
76e3d5d4 336 TString triggerRO = (nTriggerTracks < maxTriggerRO) ? "triggerRO:good" : "triggerRO:bad";
94ef1a28 337
03ac5989 338 // --- fill event counters ---
339
340 // build the list of trigger cases
341 TList* triggerCases = BuildListOfTriggerCases(FiredTriggerClasses);
342
343 // loop over trigger cases
344 TObjString* triggerKey = 0x0;
345 TIter nextTriggerCase(triggerCases);
346 while ((triggerKey = static_cast<TObjString*>(nextTriggerCase()))) {
94ef1a28 347
417d6f63 348 // loop over V0Mult cases
349 TObjString* v0MultKey = 0x0;
350 nextV0MultKey.Reset();
351 while ((v0MultKey = static_cast<TObjString*>(nextV0MultKey()))) {
352
353 // any event
354 fEventCounters->Count(Form("event:any/%s/run:%d/%s/%s/%s", triggerKey->GetName(), fCurrentRunNumber, selected.Data(), triggerRO.Data(), v0MultKey->GetName()));
355
356 // muon event
357 if (nTracks > 0) fEventCounters->Count(Form("event:muon/%s/run:%d/%s/%s/%s", triggerKey->GetName(), fCurrentRunNumber, selected.Data(), triggerRO.Data(), v0MultKey->GetName()));
358
359 }
03ac5989 360
361 }
362
363 // second loop over tracks to fill histograms and track counters
364 Int_t nSelectedTrackerTracks = 0;
365 Int_t nSelectedTrackMatchTrig = 0;
366 Int_t nPVTracks = fESD->GetPrimaryVertex()->GetNContributors();
367 for (Int_t iTrack = 0; iTrack < nTracks; ++iTrack) {
368
369 // get the ESD track
94ef1a28 370 AliESDMuonTrack* esdTrack = fESD->GetMuonTrack(iTrack);
94ef1a28 371
03ac5989 372 // --- fill track counters ---
373
374 // define the key words
375 TString trackKey = "track:";
376 TString chargeKey = "charge:";
417d6f63 377 TString accKey = "acc:";
03ac5989 378 Bool_t lowPt = kFALSE;
379 Bool_t highPt = kFALSE;
380 if (esdTrack->ContainTrackerData()) {
381
382 if (esdTrack->ContainTriggerData()) trackKey += "matched";
383 else trackKey += "trackeronly";
384
385 Short_t trackCharge = esdTrack->Charge();
386 if (trackCharge < 0) chargeKey += "neg";
387 else chargeKey += "pos";
388
389 Double_t thetaTrackAbsEnd = TMath::ATan(esdTrack->GetRAtAbsorberEnd()/505.) * TMath::RadToDeg();
390 Double_t trackPt = esdTrack->Pt();
391 if (trackPt > 1. && nPVTracks>0 && thetaTrackAbsEnd>2. ) lowPt = kTRUE;
392 if (trackPt > 2. && nPVTracks>0 && thetaTrackAbsEnd>2. ) highPt = kTRUE;
393
417d6f63 394 Double_t eta = esdTrack->Eta();
395 if (thetaTrackAbsEnd < 2. || thetaTrackAbsEnd > 9. || eta < -4. || eta > -2.5) accKey += "out";
396 else accKey += "in";
397
03ac5989 398 } else {
399
400 trackKey += "triggeronly";
417d6f63 401 chargeKey = ""; // ghost have no charge specified
402 accKey += "out"; // ghost are labelled out of the acceptance
03ac5989 403
404 }
94ef1a28 405
03ac5989 406 // loop over trigger cases and fill counters
407 nextTriggerCase.Reset();
408 while ((triggerKey = static_cast<TObjString*>(nextTriggerCase()))) {
409
417d6f63 410 // loop over V0Mult cases
411 TObjString* v0MultKey = 0x0;
412 nextV0MultKey.Reset();
413 while ((v0MultKey = static_cast<TObjString*>(nextV0MultKey()))) {
414
415 // any charge / any pt
416 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 417
417d6f63 418 // any charge / specific pt
419 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()));
420 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 421
417d6f63 422 if (!chargeKey.IsNull()) {
423
424 // specific charge / any pt
425 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()));
426
427 // specific charge / specific pt
428 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()));
429 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()));
430
431 }
03ac5989 432
433 }
434
94ef1a28 435 }
436
437 // --- apply selections and fill histograms with selected tracks ---
438
03ac5989 439 // remove "ghost"
440 if (!esdTrack->ContainTrackerData()) continue;
441
94ef1a28 442 // select on "physics" before filling histograms
443 if (fSelectPhysics && !isPhysicsSelected) continue;
444
03ac5989 445 // select on trigger before filling histograms
446 if (fSelectTrigger && !isTriggerSelected) continue;
b4f7418a 447
94ef1a28 448 // select on track charge
449 if (fSelectCharge*esdTrack->Charge() < 0) continue;
450
76e3d5d4 451 // select on track matching
452 if (fSelectMatched && !esdTrack->ContainTriggerData()) continue;
453
417d6f63 454 // skip tracks that do not pass the acceptance cuts if required
455 if (fApplyAccCut && accKey.EndsWith("out")) continue;
456
94ef1a28 457 nSelectedTrackerTracks++;
458 if (esdTrack->ContainTriggerData()) nSelectedTrackMatchTrig++;
459
03ac5989 460 Double_t trackP = esdTrack->P();
461 Double_t trackPt = esdTrack->Pt();
462 Short_t trackCharge = esdTrack->Charge();
463 ((TH1F*)fList->UncheckedAt(kP))->Fill(trackP);
464 ((TH1F*)fList->UncheckedAt(kPt))->Fill(trackPt);
465 if (trackCharge < 0) {
466 ((TH1F*)fList->UncheckedAt(kPMuMinus))->Fill(trackP);
467 ((TH1F*)fList->UncheckedAt(kPtMuMinus))->Fill(trackPt);
468 } else {
469 ((TH1F*)fList->UncheckedAt(kPMuPlus))->Fill(trackP);
470 ((TH1F*)fList->UncheckedAt(kPtMuPlus))->Fill(trackPt);
471 }
94ef1a28 472 ((TH1F*)fList->UncheckedAt(kRapidity))->Fill(esdTrack->Y());
473 Int_t ndf = 2 * esdTrack->GetNHit() - 5;
474 ((TH1F*)fList->UncheckedAt(kChi2))->Fill(esdTrack->GetChi2()/ndf);
475 ((TH1F*)fList->UncheckedAt(kProbChi2))->Fill(TMath::Prob(esdTrack->GetChi2(),ndf));
476 ((TH1F*)fList->UncheckedAt(kThetaX))->Fill(ChangeThetaRange(esdTrack->GetThetaXUncorrected()));
477 ((TH1F*)fList->UncheckedAt(kThetaY))->Fill(ChangeThetaRange(esdTrack->GetThetaYUncorrected()));
478 ((TH1F*)fList->UncheckedAt(kNClustersPerTrack))->Fill(esdTrack->GetNHit());
03ac5989 479 ((TH1F*)fList->UncheckedAt(kSign))->Fill(trackCharge);
94ef1a28 480 ((TH1F*)fList->UncheckedAt(kDCA))->Fill(esdTrack->GetDCA());
481
482 Int_t nChamberHit = 0;
483 for (Int_t ich=0; ich<10; ich++) if (esdTrack->IsInMuonClusterMap(ich)) nChamberHit++;
484 ((TH1F*)fList->UncheckedAt(kNChamberHitPerTrack))->Fill(nChamberHit);
485
486 // what follows concern clusters
487 if(!esdTrack->ClustersStored()) continue;
488
489 AliESDMuonCluster *esdCluster = (AliESDMuonCluster*) esdTrack->GetClusters().First();
490 while (esdCluster) {
491
492 Int_t chId = esdCluster->GetChamberId();
493 Int_t deId = esdCluster->GetDetElemId();
494
40be9f05 495 ((TH1F*)fListExpert->UncheckedAt(kNClustersPerCh))->Fill(chId);
496 ((TH1F*)fListExpert->UncheckedAt(kNClustersPerDE))->Fill(deId);
94ef1a28 497
498 ((TH1F*)fListExpert->UncheckedAt(kClusterHitMapInCh+chId))->Fill(esdCluster->GetX(), esdCluster->GetY());
499
500 ((TH1F*)fListExpert->UncheckedAt(kClusterChargeInCh+chId))->Fill(esdCluster->GetCharge());
501 ((TH1F*)fListExpert->UncheckedAt(kClusterChargePerDE))->Fill(deId, esdCluster->GetCharge());
502
503 if (esdCluster->PadsStored()) { // discard clusters with pad not stored in ESD
504 ((TH1F*)fListExpert->UncheckedAt(kClusterSizeInCh+chId))->Fill(esdCluster->GetNPads());
505 ((TH1F*)fListExpert->UncheckedAt(kClusterSizePerDE))->Fill(deId, esdCluster->GetNPads());
506 }
507
508 esdCluster = (AliESDMuonCluster*) esdTrack->GetClusters().After(esdCluster);
509 }
510
511 }
512
03ac5989 513 if ((!fSelectPhysics || isPhysicsSelected) && (!fSelectTrigger || isTriggerSelected)) {
b4f7418a 514 ((TH1F*)fList->UncheckedAt(kNTracks))->Fill(nSelectedTrackerTracks);
515 ((TH1F*)fList->UncheckedAt(kMatchTrig))->Fill(nSelectedTrackMatchTrig);
516 }
94ef1a28 517
03ac5989 518 // clean memory
519 delete triggerCases;
94ef1a28 520
521 // Post final data. It will be written to a file with option "RECREATE"
522 PostData(1, fList);
523 PostData(2, fListExpert);
524 PostData(3, fTrackCounters);
525 PostData(4, fEventCounters);
526}
527
528//________________________________________________________________________
529void AliAnalysisTaskMuonQA::Terminate(Option_t *)
530{
531 /// Normalize histograms
532 /// Draw result to the screen
533 /// Print statistics
534
94ef1a28 535 // global statistic
40be9f05 536 fTrackCounters = static_cast<AliCounterCollection*>(GetOutputData(3));
537 fEventCounters = static_cast<AliCounterCollection*>(GetOutputData(4));
94ef1a28 538 if (fTrackCounters && fEventCounters) {
539 if (!gROOT->IsBatch()) {
540 cout<<"whole statistics without selection:"<<endl;
541 fEventCounters->Print("trigger/event");
542 fTrackCounters->Print("trigger/track");
543 cout<<"whole statistics of selected events:"<<endl;
544 fEventCounters->Print("trigger/event","selected:yes");
545 fTrackCounters->Print("trigger/track","selected:yes");
546 new TCanvas();
547 fEventCounters->Draw("event","trigger","");
548 new TCanvas();
549 fTrackCounters->Draw("track","trigger","");
550 new TCanvas();
551 fEventCounters->Draw("event","trigger","selected:yes");
552 new TCanvas();
553 fTrackCounters->Draw("track","trigger","selected:yes");
554 }
555 }
556
40be9f05 557 // recover output histograms
558 fList = static_cast<TObjArray*>(GetOutputData(1));
559 fListExpert = static_cast<TObjArray*>(GetOutputData(2));
560 if (!fList || !fListExpert) return;
561
562 // create summary plots
563 fListNorm = new TObjArray(1000);
564 fListNorm->SetOwner();
565
566 // mean/dispersion of cluster charge per chamber/DE
567 TH1F* hClusterChargePerChMean = new TH1F("hClusterChargePerChMean", "cluster mean charge per chamber;chamber ID;<charge> (fC)", nCh, -0.5, nCh-0.5);
568 hClusterChargePerChMean->SetOption("P");
569 hClusterChargePerChMean->SetMarkerStyle(kFullDotMedium);
570 hClusterChargePerChMean->SetMarkerColor(kBlue);
571 fListNorm->AddAtAndExpand(hClusterChargePerChMean, kClusterChargePerChMean);
572
573 TH1F* hClusterChargePerChSigma = new TH1F("hClusterChargePerChSigma", "cluster charge dispersion per chamber;chamber ID;#sigma_{charge} (fC)", nCh, -0.5, nCh-0.5);
574 hClusterChargePerChSigma->SetOption("P");
575 hClusterChargePerChSigma->SetMarkerStyle(kFullDotMedium);
576 hClusterChargePerChSigma->SetMarkerColor(kBlue);
577 fListNorm->AddAtAndExpand(hClusterChargePerChSigma, kClusterChargePerChSigma);
578
579 TH1F* hClusterChargePerDEMean = new TH1F("hClusterChargePerDEMean", "cluster mean charge per DE;DetElem ID;<charge> (fC)", nDE+1, -0.5, nDE+0.5);
580 hClusterChargePerDEMean->SetOption("P");
581 hClusterChargePerDEMean->SetMarkerStyle(kFullDotMedium);
582 hClusterChargePerDEMean->SetMarkerColor(kBlue);
583 fListNorm->AddAtAndExpand(hClusterChargePerDEMean, kClusterChargePerDEMean);
584
585 TH1F* hClusterChargePerDESigma = new TH1F("hClusterChargePerDESigma", "cluster charge dispersion per DE;DetElem ID;#sigma_{charge} (fC)", nDE+1, -0.5, nDE+0.5);
586 hClusterChargePerDESigma->SetOption("P");
587 hClusterChargePerDESigma->SetMarkerStyle(kFullDotMedium);
588 hClusterChargePerDESigma->SetMarkerColor(kBlue);
589 fListNorm->AddAtAndExpand(hClusterChargePerDESigma, kClusterChargePerDESigma);
590
591 // mean/dispersion of cluster size per chamber/DE
592 TH1F* hClusterSizePerChMean = new TH1F("hClusterSizePerChMean", "cluster mean size per chamber;chamber ID;<size> (n_{pads})", nCh, -0.5, nCh-0.5);
593 hClusterSizePerChMean->SetOption("P");
594 hClusterSizePerChMean->SetMarkerStyle(kFullDotMedium);
595 hClusterSizePerChMean->SetMarkerColor(kBlue);
596 fListNorm->AddAtAndExpand(hClusterSizePerChMean, kClusterSizePerChMean);
597
598 TH1F* hClusterSizePerChSigma = new TH1F("hClusterSizePerChSigma", "cluster size dispersion per chamber;chamber ID;#sigma_{size} (n_{pads})", nCh, -0.5, nCh-0.5);
599 hClusterSizePerChSigma->SetOption("P");
600 hClusterSizePerChSigma->SetMarkerStyle(kFullDotMedium);
601 hClusterSizePerChSigma->SetMarkerColor(kBlue);
602 fListNorm->AddAtAndExpand(hClusterSizePerChSigma, kClusterSizePerChSigma);
603
604 TH1F* hClusterSizePerDEMean = new TH1F("hClusterSizePerDEMean", "cluster mean size per DE;DetElem ID;<size> (n_{pads})", nDE+1, -0.5, nDE+0.5);
605 hClusterSizePerDEMean->SetOption("P");
606 hClusterSizePerDEMean->SetMarkerStyle(kFullDotMedium);
607 hClusterSizePerDEMean->SetMarkerColor(kBlue);
608 fListNorm->AddAtAndExpand(hClusterSizePerDEMean, kClusterSizePerDEMean);
609
610 TH1F* hClusterSizePerDESigma = new TH1F("hClusterSizePerDESigma", "cluster size dispersion per DE;DetElem ID;#sigma_{size} (n_{pads})", nDE+1, -0.5, nDE+0.5);
611 hClusterSizePerDESigma->SetOption("P");
612 hClusterSizePerDESigma->SetMarkerStyle(kFullDotMedium);
613 hClusterSizePerDESigma->SetMarkerColor(kBlue);
614 fListNorm->AddAtAndExpand(hClusterSizePerDESigma, kClusterSizePerDESigma);
615
616 // normalize histograms
94ef1a28 617 Float_t nTracks = ((TH1F*)fList->UncheckedAt(kNClustersPerTrack))->GetEntries();
618 if (nTracks > 0.) {
40be9f05 619 ((TH1F*)fListExpert->UncheckedAt(kNClustersPerCh))->Scale(1./nTracks);
620 ((TH1F*)fListExpert->UncheckedAt(kNClustersPerDE))->Scale(1./nTracks);
94ef1a28 621 }
76e3d5d4 622 fListNorm->AddAtAndExpand(((TH1F*)fListExpert->UncheckedAt(kNClustersPerCh))->Clone(), kNClustersPerChPerTrack);
623 fListNorm->AddAtAndExpand(((TH1F*)fListExpert->UncheckedAt(kNClustersPerDE))->Clone(), kNClustersPerDEPerTrack);
94ef1a28 624
625 // fill summary plots per chamber
94ef1a28 626 for (Int_t iCh = 0; iCh < nCh; iCh++) {
627
628 TH1* hClusterChargeInCh = ((TH1F*)fListExpert->UncheckedAt(kClusterChargeInCh+iCh));
629 hClusterChargePerChMean->SetBinContent(iCh+1, hClusterChargeInCh->GetMean());
630 hClusterChargePerChMean->SetBinError(iCh+1, hClusterChargeInCh->GetMeanError());
631 hClusterChargePerChSigma->SetBinContent(iCh+1, hClusterChargeInCh->GetRMS());
632 hClusterChargePerChSigma->SetBinError(iCh+1, hClusterChargeInCh->GetRMSError());
633
634 TH1* hClusterSizeInCh = ((TH1F*)fListExpert->UncheckedAt(kClusterSizeInCh+iCh));
635 hClusterSizePerChMean->SetBinContent(iCh+1, hClusterSizeInCh->GetMean());
636 hClusterSizePerChMean->SetBinError(iCh+1, hClusterSizeInCh->GetMeanError());
637 hClusterSizePerChSigma->SetBinContent(iCh+1, hClusterSizeInCh->GetRMS());
638 hClusterSizePerChSigma->SetBinError(iCh+1, hClusterSizeInCh->GetRMSError());
639
640 }
641
642 // fill summary plots per DE
643 TH2F* hClusterChargePerDE = ((TH2F*)fListExpert->UncheckedAt(kClusterChargePerDE));
94ef1a28 644 TH2F* hClusterSizePerDE = ((TH2F*)fListExpert->UncheckedAt(kClusterSizePerDE));
94ef1a28 645 for (Int_t iDE = 1; iDE < nDE+1; iDE++) {
646
647 TH1D *tmp = hClusterChargePerDE->ProjectionY("tmp",iDE,iDE,"e");
648 if (tmp->GetEntries() > 10.) {
649 hClusterChargePerDEMean->SetBinContent(iDE, tmp->GetMean());
650 hClusterChargePerDEMean->SetBinError(iDE, tmp->GetMeanError());
651 hClusterChargePerDESigma->SetBinContent(iDE, tmp->GetRMS());
652 hClusterChargePerDESigma->SetBinError(iDE, tmp->GetRMSError());
653 }
654 delete tmp;
655
656 tmp = hClusterSizePerDE->ProjectionY("tmp",iDE,iDE,"e");
657 if (tmp->GetEntries() > 10.) {
658 hClusterSizePerDEMean->SetBinContent(iDE, tmp->GetMean());
659 hClusterSizePerDEMean->SetBinError(iDE, tmp->GetMeanError());
660 hClusterSizePerDESigma->SetBinContent(iDE, tmp->GetRMS());
661 hClusterSizePerDESigma->SetBinError(iDE, tmp->GetRMSError());
662 }
663 delete tmp;
664
665 }
666
40be9f05 667 // Post summary data.
668 PostData(5, fListNorm);
94ef1a28 669}
670
671//________________________________________________________________________
672Double_t AliAnalysisTaskMuonQA::ChangeThetaRange(Double_t theta)
673{
03ac5989 674 /// set theta range from -180 to +180 degrees
94ef1a28 675 if(theta < -2.5) return (theta / TMath::Pi() + 1.) * 180.;
676 else if(theta > 2.5) return (theta / TMath::Pi() - 1.) * 180.;
677 else return theta / TMath::Pi() * 180.;
678}
679
03ac5989 680//________________________________________________________________________
681UInt_t AliAnalysisTaskMuonQA::BuildTriggerWord(TString& FiredTriggerClasses)
682{
683 /// build the trigger word from the fired trigger classes and the list of selectable trigger
684
685 UInt_t word = 0;
686
687 TObjString* trigClasseName = 0x0;
688 TIter nextTrigger(fSelectTriggerClass);
689 while ((trigClasseName = static_cast<TObjString*>(nextTrigger()))) {
690
691 TRegexp GenericTriggerClasseName(trigClasseName->String());
692 if (FiredTriggerClasses.Contains(GenericTriggerClasseName)) word |= trigClasseName->GetUniqueID();
693
694 }
695
696 return word;
697}
698
699//________________________________________________________________________
700TList* AliAnalysisTaskMuonQA::BuildListOfTriggerCases(TString& FiredTriggerClasses)
701{
702 /// build the list of trigger for the counters from the fired trigger classes and the list of trigger classes
703 /// returned TList must be deleted by user
704
705 TList* list = new TList();
706 list->SetOwner();
76e3d5d4 707 Bool_t foundCINT1B = kFALSE;
708 Bool_t foundCMUS1B = kFALSE;
03ac5989 709
710 // add case any
711 list->AddLast(new TObjString("trigger:any"));
712
713 TObjString* trigClasseName = 0x0;
714 TIter nextTrigger(fTriggerClass);
715 while ((trigClasseName = static_cast<TObjString*>(nextTrigger()))) {
716
717 TRegexp GenericTriggerClasseName(trigClasseName->String());
718 if (FiredTriggerClasses.Contains(GenericTriggerClasseName)) {
719
720 // add specific trigger case
721 TObjString* trigShortName = static_cast<TObjString*>(fTriggerClass->GetValue(trigClasseName));
722 list->AddLast(new TObjString(Form("trigger:%s",trigShortName->GetName())));
723
76e3d5d4 724 // check for CINT1B and CMUS1B trigger
725 if (trigShortName->String() == "CINT1B") foundCINT1B = kTRUE;
726 else if (trigShortName->String() == "CMUS1B") foundCMUS1B = kTRUE;
727
03ac5989 728 }
729
730 }
731
76e3d5d4 732 // add the special case CINT1B+CMUS1B
733 if (foundCINT1B && foundCMUS1B) list->AddLast(new TObjString("trigger:CINT1B+CMUS1B"));
734
03ac5989 735 // add case other if no specific trigger was found
736 if (list->GetSize() == 1) list->AddLast(new TObjString("trigger:other"));
737
738 return list;
739}
740