1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
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 **************************************************************************/
18 #include <Riostream.h>
26 #include "TObjArray.h"
32 #include "TObjString.h"
35 #include "AliESDEvent.h"
36 #include "AliESDMuonTrack.h"
37 #include "AliESDMuonCluster.h"
38 #include "AliESDInputHandler.h"
39 #include "AliESDVZERO.h"
42 #include "AliAnalysisDataSlot.h"
43 #include "AliAnalysisManager.h"
44 #include "AliAnalysisTaskMuonQA.h"
45 #include "AliCounterCollection.h"
46 #include "AliPhysicsSelection.h"
47 #include "AliTriggerAnalysis.h"
50 #include "AliAnalysisMuonUtility.h"
51 #include "AliMuonTrackCuts.h"
56 ClassImp(AliAnalysisTaskMuonQA)
58 const Int_t AliAnalysisTaskMuonQA::nCh = 10;
60 const Int_t AliAnalysisTaskMuonQA::nDE = 1100;
62 const Float_t AliAnalysisTaskMuonQA::dMax[5] = {176.6, 229.0, 308.84, 418.2, 522.0}; // cm
64 //________________________________________________________________________
65 AliAnalysisTaskMuonQA::AliAnalysisTaskMuonQA() :
73 fSelectPhysics(kFALSE),
74 fSelectTrigger(kFALSE),
76 fSelectMatched(kFALSE),
79 fSelectTriggerClass(0x0),
86 //________________________________________________________________________
87 AliAnalysisTaskMuonQA::AliAnalysisTaskMuonQA(const char *name) :
88 AliAnalysisTaskSE(name),
95 fSelectPhysics(kFALSE),
96 fSelectTrigger(kFALSE),
98 fSelectMatched(kFALSE),
101 fSelectTriggerClass(0x0),
102 fTrackCuts(new AliMuonTrackCuts("stdMuonCuts","stdMuonCuts")),
107 // Output slot #1 writes into a TObjArray container
108 DefineOutput(1,TObjArray::Class());
109 // Output slot #2 writes into a TObjArray container
110 DefineOutput(2,TObjArray::Class());
111 // Output slot #3 writes track counters
112 DefineOutput(3,AliCounterCollection::Class());
113 // Output slot #4 writes event counters
114 DefineOutput(4,AliCounterCollection::Class());
115 // Output slot #5 writes normalized histograms
116 DefineOutput(5,TObjArray::Class());
118 fTrackCuts->SetFilterMask(AliMuonTrackCuts::kMuEta | AliMuonTrackCuts::kMuThetaAbs | AliMuonTrackCuts::kMuPdca );
119 fTrackCuts->SetAllowDefaultParams(kTRUE);
122 //________________________________________________________________________
123 AliAnalysisTaskMuonQA::~AliAnalysisTaskMuonQA()
126 if (!AliAnalysisManager::GetAnalysisManager()->IsProofMode()) {
129 delete fTrackCounters;
130 delete fEventCounters;
133 delete fTriggerClass;
134 delete fSelectTriggerClass;
139 //___________________________________________________________________________
140 void AliAnalysisTaskMuonQA::NotifyRun()
143 fTrackCuts->SetRun(fInputHandler);
147 //___________________________________________________________________________
148 void AliAnalysisTaskMuonQA::SetTrackCuts(AliMuonTrackCuts* trackCuts)
151 if ( fTrackCuts ) delete fTrackCuts;
152 fTrackCuts = new AliMuonTrackCuts(*trackCuts);
156 //___________________________________________________________________________
157 void AliAnalysisTaskMuonQA::UserCreateOutputObjects()
159 /// Create histograms and counters
161 // set the list of trigger classes with corresponding short names
162 fTriggerClass = new TMap(20);
163 fTriggerClass->SetOwnerKeyValue();
164 // p-p trigger classes
165 fTriggerClass->Add(new TObjString("CBEAMB"), new TObjString("CBEAMB"));
166 fTriggerClass->Add(new TObjString("CINT1B-ABCE-NOPF-ALL"), new TObjString("CINT1B"));
167 fTriggerClass->Add(new TObjString("CMUS1B-ABCE-NOPF-MUON"), new TObjString("CMUS1B"));
168 fTriggerClass->Add(new TObjString("CINT1[AC]-"), new TObjString("CINT1AC"));
169 fTriggerClass->Add(new TObjString("CMUS1[AC]-"), new TObjString("CMUS1AC"));
170 fTriggerClass->Add(new TObjString("CINT1-E-"), new TObjString("CINT1E"));
171 fTriggerClass->Add(new TObjString("CINT5-E-"), new TObjString("CINT5E"));
172 fTriggerClass->Add(new TObjString("CMUS1-E-"), new TObjString("CMUS1E"));
173 fTriggerClass->Add(new TObjString("CMUS5-E-"), new TObjString("CMUS5E"));
174 fTriggerClass->Add(new TObjString("CINT1-B-"), new TObjString("CINT1B"));
175 fTriggerClass->Add(new TObjString("CINT5-B-"), new TObjString("CINT5B"));
176 fTriggerClass->Add(new TObjString("CMUS1-B-"), new TObjString("CMUS1B"));
177 fTriggerClass->Add(new TObjString("CMUS5-B-"), new TObjString("CMUS5B"));
178 fTriggerClass->Add(new TObjString("CINT1-AC-"), new TObjString("CINT1AC"));
179 fTriggerClass->Add(new TObjString("CINT5-AC-"), new TObjString("CINT5AC"));
180 fTriggerClass->Add(new TObjString("CMUS1-AC-"), new TObjString("CMUS1AC"));
181 fTriggerClass->Add(new TObjString("CMUS5-AC-"), new TObjString("CMUS5AC"));
182 fTriggerClass->Add(new TObjString("CSH1-B-"), new TObjString("CSH1B"));
184 TString side_pp[3] = {"B", "AC", "E"};
185 for(Int_t i = 0; i< 3; i++){
186 fTriggerClass->Add(new TObjString(Form("CINT7-%s-", side_pp[i].Data())), new TObjString(Form("CINT7%s",side_pp[i].Data())));
187 fTriggerClass->Add(new TObjString(Form("CMUSH7-%s-",side_pp[i].Data())), new TObjString(Form("CMUSH7%s",side_pp[i].Data())));
188 fTriggerClass->Add(new TObjString(Form("CMUL7-%s-",side_pp[i].Data())), new TObjString(Form("CMUL7%s",side_pp[i].Data())));
189 fTriggerClass->Add(new TObjString(Form("CMUU7-%s-",side_pp[i].Data())), new TObjString(Form("CMUU7%s",side_pp[i].Data())));
190 fTriggerClass->Add(new TObjString(Form("CMUS7-%s-",side_pp[i].Data())), new TObjString(Form("CMUS7%s",side_pp[i].Data())));
192 fTriggerClass->Add(new TObjString("CINT7-I-"), new TObjString("CINT7I"));
194 // Pb-Pb trigger classes
195 TString side[4] = {"B", "A", "C", "E"};
196 for (Int_t i = 0; i < 4; i++) {
197 fTriggerClass->Add(new TObjString(Form("CMBACS2-%s-", side[i].Data())), new TObjString(Form("CMBACS2-%s", side[i].Data())));
198 fTriggerClass->Add(new TObjString(Form("CMBS2A-%s-", side[i].Data())), new TObjString(Form("CMBS2A-%s", side[i].Data())));
199 fTriggerClass->Add(new TObjString(Form("CMBS2C-%s-", side[i].Data())), new TObjString(Form("CMBS2C-%s", side[i].Data())));
200 fTriggerClass->Add(new TObjString(Form("CMBAC-%s-", side[i].Data())), new TObjString(Form("CMBAC-%s", side[i].Data())));
201 fTriggerClass->Add(new TObjString(Form("C0SMH-%s-", side[i].Data())), new TObjString(Form("C0SMH-%s", side[i].Data())));
204 // set the list of trigger classes that can be selected to fill histograms (in case the physics selection is not used)
205 fSelectTriggerClass = new TList();
206 fSelectTriggerClass->SetOwner();
207 // p-p trigger classes
208 fSelectTriggerClass->AddLast(new TObjString("CINT1B-ABCE-NOPF-ALL")); fSelectTriggerClass->Last()->SetUniqueID(AliVEvent::kMB);
209 fSelectTriggerClass->AddLast(new TObjString("CMUS1B-ABCE-NOPF-MUON")); fSelectTriggerClass->Last()->SetUniqueID(AliVEvent::kMUON);
210 fSelectTriggerClass->AddLast(new TObjString("CINT1-B-")); fSelectTriggerClass->Last()->SetUniqueID(AliVEvent::kMB);
211 fSelectTriggerClass->AddLast(new TObjString("CINT5-B-")); fSelectTriggerClass->Last()->SetUniqueID(AliVEvent::kCINT5);
212 fSelectTriggerClass->AddLast(new TObjString("CMUS1-B-")); fSelectTriggerClass->Last()->SetUniqueID(AliVEvent::kMUON);
213 fSelectTriggerClass->AddLast(new TObjString("CMUS5-B-")); fSelectTriggerClass->Last()->SetUniqueID(AliVEvent::kCMUS5);
214 fSelectTriggerClass->AddLast(new TObjString("CINT7-B-")); fSelectTriggerClass->Last()->SetUniqueID(AliVEvent::kINT7);
215 fSelectTriggerClass->AddLast(new TObjString("CINT7-I-")); fSelectTriggerClass->Last()->SetUniqueID(AliVEvent::kINT7);
216 fSelectTriggerClass->AddLast(new TObjString("CMUSH7-B-")); fSelectTriggerClass->Last()->SetUniqueID(AliVEvent::kMUSH7);
217 fSelectTriggerClass->AddLast(new TObjString("CMUS7-B-")); fSelectTriggerClass->Last()->SetUniqueID(AliVEvent::kMUS7);
218 fSelectTriggerClass->AddLast(new TObjString("CMUU7-B-")); fSelectTriggerClass->Last()->SetUniqueID(AliVEvent::kMUU7);
219 fSelectTriggerClass->AddLast(new TObjString("CMUL7-B-")); fSelectTriggerClass->Last()->SetUniqueID(AliVEvent::kMUL7);
220 fSelectTriggerClass->AddLast(new TObjString("CSH1-B-")); fSelectTriggerClass->Last()->SetUniqueID(AliVEvent::kHighMult);
222 // Pb-Pb trigger classes
223 fSelectTriggerClass->AddLast(new TObjString("CMBACS2-B-")); fSelectTriggerClass->Last()->SetUniqueID(AliVEvent::kMB);
224 fSelectTriggerClass->AddLast(new TObjString("CMBS2A-B-")); fSelectTriggerClass->Last()->SetUniqueID(AliVEvent::kMB);
225 fSelectTriggerClass->AddLast(new TObjString("CMBS2C-B-")); fSelectTriggerClass->Last()->SetUniqueID(AliVEvent::kMB);
226 fSelectTriggerClass->AddLast(new TObjString("CMBAC-B-")); fSelectTriggerClass->Last()->SetUniqueID(AliVEvent::kMB);
227 fSelectTriggerClass->AddLast(new TObjString("C0SMH-B-")); fSelectTriggerClass->Last()->SetUniqueID(AliVEvent::kHighMult);
230 fList = new TObjArray(2000);
232 fListExpert = new TObjArray(2000);
233 fListExpert->SetOwner();
236 TH1F* hNTracks = new TH1F("hNTracks", "number of tracks;n_{tracks}", 20, 0., 20.);
237 fList->AddAtAndExpand(hNTracks, kNTracks);
239 Int_t muonTrigIndex[] = { AliVEvent::kMuonUnlikePB, AliVEvent::kMuonLikePB, AliVEvent::kMUSHPB, AliVEvent::kMuonUnlikePB | AliVEvent::kMuonLikePB,
240 AliVEvent::kMuonUnlikePB | AliVEvent::kMUSHPB, AliVEvent::kMuonLikePB | AliVEvent::kMUSHPB,
241 AliVEvent::kMuonUnlikePB | AliVEvent::kMuonLikePB | AliVEvent::kMUSHPB};
242 const Int_t nTrigIndexes = sizeof(muonTrigIndex)/sizeof(muonTrigIndex[0]);
243 fMuonTrigIndex.Set(nTrigIndexes, muonTrigIndex);
244 TString label[nTrigIndexes] = {"Unlike","Like", "Single Hpt","Like&Unlike","Unlike&Hpt","Like&Hpt","Unlike&Like&Hpt"};
245 TH1I* hMuonTriggers = new TH1I("hMuonTriggers", "Muon triggers", nTrigIndexes, -0.5, -0.5+(Double_t)nTrigIndexes);
246 for(Int_t ibin=0; ibin<nTrigIndexes; ibin++) hMuonTriggers->GetXaxis()->SetBinLabel(ibin+1,label[ibin].Data());
247 fList->AddAtAndExpand(hMuonTriggers, kMuonTrig);
250 TH1F* hMatchTrig = new TH1F("hMatchTrig", "number of tracks matched with trigger;n_{tracks}", 20, 0., 20.);
251 fList->AddAtAndExpand(hMatchTrig, kMatchTrig);
253 TH1F* hSign = new TH1F("hSign", "track sign;sign", 3, -1.5, 1.5);
254 fList->AddAtAndExpand(hSign, kSign);
256 TH1F* hDCA = new TH1F("hDCA", "DCA distribution;DCA (cm)", 500, 0., 500.);
257 fList->AddAtAndExpand(hDCA, kDCA);
259 TH1F* hP = new TH1F("hP", "momentum distribution;p (GeV/c)", 300, 0., 300.);
260 fList->AddAtAndExpand(hP, kP);
262 TH1F* hPMuPlus = new TH1F("hPMuPlus", "momentum distribution of #mu^{+};p (GeV/c)", 300, 0., 300.);
263 fList->AddAtAndExpand(hPMuPlus, kPMuPlus);
265 TH1F* hPMuMinus = new TH1F("hPMuMinus", "momentum distribution of #mu^{-};p (GeV/c)", 300, 0., 300.);
266 fList->AddAtAndExpand(hPMuMinus, kPMuMinus);
269 Double_t ptMin = 0., ptMax = 30.;
271 TH1F* hPt = new TH1F("hPt", "transverse momentum distribution;p_{t} (GeV/c)", nPtBins, ptMin, ptMax);
272 fList->AddAtAndExpand(hPt, kPt);
274 TH1F* hPtMuPlus = new TH1F("hPtMuPlus", "transverse momentum distribution of #mu^{+};p_{t} (GeV/c)", nPtBins, ptMin, ptMax);
275 fList->AddAtAndExpand(hPtMuPlus, kPtMuPlus);
277 TH1F* hPtMuMinus = new TH1F("hPtMuMinus", "transverse momentum distribution of #mu^{-};p_{t} (GeV/c)", nPtBins, ptMin, ptMax);
278 fList->AddAtAndExpand(hPtMuMinus, kPtMuMinus);
280 TH1F* hRapidity = new TH1F("hRapidity", "rapidity distribution;rapidity", 200, -4.5, -2.);
281 fList->AddAtAndExpand(hRapidity, kRapidity);
283 TH1F* hThetaX = new TH1F("hThetaX", "#theta_{X} distribution;#theta_{X} (degree)", 360, -180., 180);
284 fList->AddAtAndExpand(hThetaX, kThetaX);
286 TH1F* hThetaY = new TH1F("hThetaY", "#theta_{Y} distribution;#theta_{Y} (degree)", 360, -180., 180);
287 fList->AddAtAndExpand(hThetaY, kThetaY);
289 TH1F* hChi2 = new TH1F("hChi2", "normalized #chi^{2} distribution;#chi^{2} / ndf", 500, 0., 50.);
290 fList->AddAtAndExpand(hChi2, kChi2);
292 TH1F* hProbChi2 = new TH1F("hProbChi2", "distribution of probability of #chi^{2};prob(#chi^{2})", 100, 0., 1.);
293 fList->AddAtAndExpand(hProbChi2, kProbChi2);
296 TH1F* hNClustersPerTrack = new TH1F("hNClustersPerTrack", "number of associated clusters per track;n_{clusters}", 20, 0., 20.);
297 fList->AddAtAndExpand(hNClustersPerTrack, kNClustersPerTrack);
299 TH1F* hNChamberHitPerTrack = new TH1F("hNChamberHitPerTrack", "number of chambers hit per track;n_{chamber hit}", 15, 0., 15.);
300 fList->AddAtAndExpand(hNChamberHitPerTrack, kNChamberHitPerTrack);
302 // Matched tracks info
303 TH1F* hPtMatchLpt = new TH1F("hPtMatchLpt", "transverse momentum distribution matching Lpt;p_{t} (GeV/c)", nPtBins, ptMin, ptMax);
304 fList->AddAtAndExpand(hPtMatchLpt, kPtMatchLpt);
306 TH1F* hPtMatchHpt = new TH1F("hPtMatchHpt", "transverse momentum distribution matching Hpt;p_{t} (GeV/c)", nPtBins, ptMin, ptMax);
307 fList->AddAtAndExpand(hPtMatchHpt, kPtMatchHpt);
309 TH1F* hPtMuPlusMatchLpt = new TH1F("hPtMuPlusMatchLpt", "transverse momentum distribution of #mu^{+} matching Lpt;p_{t} (GeV/c)", nPtBins, ptMin, ptMax);
310 fList->AddAtAndExpand(hPtMuPlusMatchLpt, kPtMuPlusMatchLpt);
312 TH1F* hPtMuPlusMatchHpt = new TH1F("hPtMuPlusMatchHpt", "transverse momentum distribution of #mu^{+} matching Hpt;p_{t} (GeV/c)", nPtBins, ptMin, ptMax);
313 fList->AddAtAndExpand(hPtMuPlusMatchHpt, kPtMuPlusMatchHpt);
315 TH1F* hPtMuMinusMatchLpt = new TH1F("hPtMuMinusMatchLpt", "transverse momentum distribution of #mu^{-} matching Lpt;p_{t} (GeV/c)", nPtBins, ptMin, ptMax);
316 fList->AddAtAndExpand(hPtMuMinusMatchLpt, kPtMuMinusMatchLpt);
318 TH1F* hPtMuMinusMatchHpt = new TH1F("hPtMuMinusMatchHpt", "transverse momentum distribution of #mu^{-} matching Hpt;p_{t} (GeV/c)", nPtBins, ptMin, ptMax);
319 fList->AddAtAndExpand(hPtMuMinusMatchHpt, kPtMuMinusMatchHpt);
321 TH1F* hNClustersPerCh = new TH1F("hNClustersPerCh", "averaged number of clusters per chamber per track;chamber ID;<n_{clusters}>", nCh, -0.5, nCh-0.5);
322 hNClustersPerCh->Sumw2();
323 hNClustersPerCh->SetOption("P");
324 hNClustersPerCh->SetMarkerStyle(kFullDotMedium);
325 hNClustersPerCh->SetMarkerColor(kBlue);
326 fListExpert->AddAtAndExpand(hNClustersPerCh, kNClustersPerCh);
328 TH1F* hNClustersPerDE = new TH1F("hNClustersPerDE", "averaged number of clusters per DE per track;DetElem ID;<n_{clusters}>", nDE+1, -0.5, nDE+0.5);
329 hNClustersPerDE->Sumw2();
330 hNClustersPerDE->SetOption("P");
331 hNClustersPerDE->SetMarkerStyle(kFullDotMedium);
332 hNClustersPerDE->SetMarkerColor(kBlue);
333 fListExpert->AddAtAndExpand(hNClustersPerDE, kNClustersPerDE);
335 for (Int_t i = 0; i < nCh; i++) {
336 Float_t rMax = 0.5*dMax[i/2];
337 TH2F* hClusterHitMapInCh = new TH2F(Form("hClusterHitMapInCh%d",i+1), Form("cluster position distribution in chamber %d;X (cm);Y (cm)",i+1),
338 100, -rMax, rMax, 100, -rMax, rMax);
339 fListExpert->AddAtAndExpand(hClusterHitMapInCh, kClusterHitMapInCh+i);
341 TH1F* hClusterChargeInCh = new TH1F(Form("hClusterChargeInCh%d",i+1), Form("cluster charge distribution in chamber %d;charge (fC)",i+1), 100, 0., 1000.);
342 fListExpert->AddAtAndExpand(hClusterChargeInCh, kClusterChargeInCh+i);
344 TH1F* hClusterSizeInCh = new TH1F(Form("hClusterSizeInCh%d",i+1), Form("cluster size distribution in chamber %d;size (n_{pads})",i+1), 200, 0., 200.);
345 fListExpert->AddAtAndExpand(hClusterSizeInCh, kClusterSizeInCh+i);
348 TH2F* hClusterChargePerDE = new TH2F("hClusterChargePerDE", "cluster charge distribution per DE;DetElem ID;charge (fC)", nDE+1, -0.5, nDE+0.5, 100, 0., 1000.);
349 fListExpert->AddAtAndExpand(hClusterChargePerDE, kClusterChargePerDE);
351 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.);
352 fListExpert->AddAtAndExpand(hClusterSizePerDE, kClusterSizePerDE);
354 // initialize track counters
355 fTrackCounters = new AliCounterCollection("trackCounters");
356 fTrackCounters->AddRubric("track", "trackeronly/triggeronly/matched");
357 fTrackCounters->AddRubric("trigger", 1000000);
358 fTrackCounters->AddRubric("run", 1000000);
359 fTrackCounters->AddRubric("selected", "yes/no");
360 fTrackCounters->AddRubric("triggerRO", "good/bad");
361 fTrackCounters->AddRubric("v0mult", "low/int/high/any");
362 fTrackCounters->AddRubric("charge", "pos/neg/any");
363 fTrackCounters->AddRubric("pt", "low/high/any");
364 fTrackCounters->AddRubric("acc", "in/out");
365 fTrackCounters->AddRubric("tagTrack", "beamGas/good");
366 fTrackCounters->AddRubric("t0pileup", "yes/no");
367 fTrackCounters->AddRubric("bgID", "yes/no");
368 fTrackCounters->AddRubric("spdpileup", "yes/no");
369 fTrackCounters->Init();
372 // initialize event counters
373 fEventCounters = new AliCounterCollection("eventCounters");
374 fEventCounters->AddRubric("event", "muon/any");
375 fEventCounters->AddRubric("trigger", 1000000);
376 fEventCounters->AddRubric("run", 1000000);
377 fEventCounters->AddRubric("selected", "yes/no");
378 fEventCounters->AddRubric("triggerRO", "good/bad");
379 fEventCounters->AddRubric("v0mult", "low/int/high/any");
380 fEventCounters->AddRubric("t0pileup", "yes/no");
381 fEventCounters->AddRubric("spdpileup", "yes/no");
382 fEventCounters->AddRubric("bgID", "yes/no");
383 fEventCounters->Init();
385 // Post data at least once per task to ensure data synchronisation (required for merging)
387 PostData(2, fListExpert);
388 PostData(3, fTrackCounters);
389 PostData(4, fEventCounters);
392 //________________________________________________________________________
393 void AliAnalysisTaskMuonQA::UserExec(Option_t *)
395 /// Called for each event
397 AliESDEvent* fESD = dynamic_cast<AliESDEvent*>(InputEvent());
399 Printf("ERROR: fESD not available");
403 //Flag for T0Pileup, SPDPileup and bgID (SPD cluster vs tracket)
404 Bool_t t0PileUp = kFALSE, spdPileUp = kFALSE, bgID = kFALSE;
405 spdPileUp = fESD->IsPileupFromSPDInMultBins();
406 AliPhysicsSelection *physicsSelection = (AliPhysicsSelection*)((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->GetEventSelection();
407 AliTriggerAnalysis * triggerAnalysis = (AliTriggerAnalysis*)physicsSelection->GetTriggerAnalysis();
408 if ( physicsSelection && triggerAnalysis ) {
409 t0PileUp = triggerAnalysis->EvaluateTrigger(fESD, (AliTriggerAnalysis::Trigger) (AliTriggerAnalysis::kOfflineFlag | AliTriggerAnalysis::kT0Pileup));
410 bgID = triggerAnalysis->EvaluateTrigger(fESD, (AliTriggerAnalysis::Trigger) (AliTriggerAnalysis::kSPDClsVsTrkBG | AliTriggerAnalysis::kOfflineFlag));
413 UInt_t geomAccMask = ( AliMuonTrackCuts::kMuEta | AliMuonTrackCuts::kMuThetaAbs );
415 // check physics selection
416 UInt_t triggerWord = (fInputHandler) ? fInputHandler->IsEventSelected() : 0;
417 Bool_t isPhysicsSelected = (triggerWord != 0);
418 TString selected = isPhysicsSelected ? "selected:yes" : "selected:no";
419 selected += t0PileUp ? "/t0pileup:yes" : "/t0pileup:no";
420 selected += bgID ? "/bgID:yes" : "/bgID:no";
421 selected += spdPileUp ? "/spdpileup:yes" : "/spdpileup:no";
423 // fill muon trigger cases
424 for ( Int_t idx=0; idx<fMuonTrigIndex.GetSize(); idx++ ) {
425 UInt_t currMask = (UInt_t)fMuonTrigIndex[idx];
426 if ( ( triggerWord & currMask ) == currMask ) ((TH1I*)fList->UncheckedAt(kMuonTrig))->Fill(idx);
429 // check trigger selection
430 TString FiredTriggerClasses = fESD->GetFiredTriggerClasses();
431 if (!fSelectPhysics) triggerWord = BuildTriggerWord(FiredTriggerClasses);
432 Bool_t isTriggerSelected = ((triggerWord & fTriggerMask) != 0);
434 // get the V0 multiplicity (except for p-p)
435 AliESDVZERO* v0Data = fESD->GetVZEROData();
437 const Int_t nV0MultRange = 4;
438 const Int_t nCollType = 2;
439 //define rough V0 mult. range (~ 80%, 60%, 10%, 0%)
440 Int_t v0MultRange[nCollType][nV0MultRange]= {{239,1165,12191,20633},{25,60,200,800}};
444 if (!strcmp(fESD->GetBeamType(),"A-A")){
446 for (Int_t i = 0 ; i < 64 ; i++) v0Mult += v0Data->GetMultiplicity(i);
448 else if (!strcmp(fESD->GetBeamType(),"p-A")){
450 for (Int_t i = 0 ; i < 32 ; i++) v0Mult += v0Data->GetMultiplicityV0A(i);
452 else if (!strcmp(fESD->GetBeamType(),"A-p")){
454 for (Int_t i = 0 ; i < 32 ; i++) v0Mult += v0Data->GetMultiplicityV0C(i);
459 listV0MultKey.SetOwner();
460 listV0MultKey.AddLast(new TObjString("v0mult:any"));
461 if (v0Mult >= v0MultRange[iCollType][0] && v0Mult < v0MultRange[iCollType][1]) listV0MultKey.AddLast(new TObjString("v0mult:low"));
462 else if (v0Mult >= v0MultRange[iCollType][1] && v0Mult < v0MultRange[iCollType][2]) listV0MultKey.AddLast(new TObjString("v0mult:int"));
463 else if (v0Mult >= v0MultRange[iCollType][2] && v0Mult < v0MultRange[iCollType][3]) listV0MultKey.AddLast(new TObjString("v0mult:high"));
465 TIter nextV0MultKey(&listV0MultKey);
467 // first loop over tracks to check for trigger readout problem
468 Int_t maxTriggerRO = (!strcmp(fESD->GetBeamType(),"p-p")) ? 10 : 1000;
469 Int_t nTracks = (Int_t) fESD->GetNumberOfMuonTracks();
470 Int_t nTriggerTracks = 0;
471 for (Int_t iTrack = 0; iTrack < nTracks; ++iTrack)
472 if (fESD->GetMuonTrack(iTrack)->ContainTriggerData()) nTriggerTracks++;
473 TString triggerRO = (nTriggerTracks < maxTriggerRO) ? "triggerRO:good" : "triggerRO:bad";
475 // --- fill event counters ---
477 // build the list of trigger cases
478 //TList* triggerCases = BuildListOfTriggerCases(FiredTriggerClasses);
479 TList* triggerCases = BuildListOfAllTriggerCases(FiredTriggerClasses);
481 // loop over trigger cases
482 TObjString* triggerKey = 0x0;
483 TIter nextTriggerCase(triggerCases);
484 while ((triggerKey = static_cast<TObjString*>(nextTriggerCase()))) {
486 // loop over V0Mult cases
487 TObjString* v0MultKey = 0x0;
488 nextV0MultKey.Reset();
489 while ((v0MultKey = static_cast<TObjString*>(nextV0MultKey()))) {
492 fEventCounters->Count(Form("event:any/%s/run:%d/%s/%s/%s", triggerKey->GetName(), fCurrentRunNumber, selected.Data(), triggerRO.Data(), v0MultKey->GetName()));
495 if (nTracks > 0) fEventCounters->Count(Form("event:muon/%s/run:%d/%s/%s/%s", triggerKey->GetName(), fCurrentRunNumber, selected.Data(), triggerRO.Data(), v0MultKey->GetName()));
501 // second loop over tracks to fill histograms and track counters
502 Int_t nSelectedTrackerTracks = 0;
503 Int_t nSelectedTrackMatchTrig = 0;
504 Int_t nPVTracks = fESD->GetPrimaryVertex()->GetNContributors();
505 for (Int_t iTrack = 0; iTrack < nTracks; ++iTrack) {
508 AliESDMuonTrack* esdTrack = fESD->GetMuonTrack(iTrack);
510 // --- fill track counters ---
512 // define the key words
513 TString trackKey = "track:";
514 TString accKey = "acc:";
515 Bool_t isBeamGas = kFALSE;
517 chargeKeyList.SetOwner();
518 chargeKeyList.Add(new TObjString("charge:any"));
520 ptKeyList.SetOwner();
521 ptKeyList.Add(new TObjString("pt:any"));
522 if (esdTrack->ContainTrackerData()) {
524 if (esdTrack->ContainTriggerData()) trackKey += "matched";
525 else trackKey += "trackeronly";
527 Short_t trackCharge = esdTrack->Charge();
528 TString chargeKey = "charge:";
529 chargeKey += ( trackCharge < 0 ) ? "neg" : "pos";
530 chargeKeyList.Add(new TObjString(chargeKey));
532 UInt_t mask = fTrackCuts->GetSelectionMask(esdTrack);
533 Bool_t passGeomAccCuts = ( ( mask & geomAccMask ) == geomAccMask );
534 accKey += ( passGeomAccCuts ) ? "in" : "out";
535 if ( passGeomAccCuts && nPVTracks>0 ) {
536 Double_t trackPt = esdTrack->Pt();
537 if ( trackPt > 1. ) ptKeyList.Add(new TObjString("pt:low"));
538 if ( trackPt > 2. ) ptKeyList.Add(new TObjString("pt:high"));;
540 if ( ( mask & AliMuonTrackCuts::kMuPdca ) == 0 ) isBeamGas = kTRUE;
543 trackKey += "triggeronly";
544 accKey += "out"; // ghost are labelled out of the acceptance
548 TString tagKey = "tagTrack:";
549 tagKey += ( isBeamGas ) ? "beamGas" : "good";
551 // loop over trigger cases and fill counters
552 nextTriggerCase.Reset();
553 while ((triggerKey = static_cast<TObjString*>(nextTriggerCase()))) {
555 // loop over V0Mult cases
556 TObjString* v0MultKey = 0x0;
557 nextV0MultKey.Reset();
558 while ((v0MultKey = static_cast<TObjString*>(nextV0MultKey()))) {
560 for ( Int_t icharge=0; icharge<chargeKeyList.GetEntries(); icharge++ ) {
561 for ( Int_t ipt=0; ipt<ptKeyList.GetEntries(); ipt++ ) {
562 fTrackCounters->Count(Form("%s/%s/run:%d/%s/%s/%s/%s/%s/%s/%s", trackKey.Data(), triggerKey->GetName(), fCurrentRunNumber,
563 selected.Data(), chargeKeyList.At(icharge)->GetName(), ptKeyList.At(ipt)->GetName(),
564 triggerRO.Data(), v0MultKey->GetName(), accKey.Data(), tagKey.Data()));
571 // --- apply selections and fill histograms with selected tracks ---
574 if (!esdTrack->ContainTrackerData()) continue;
576 // select on "physics" before filling histograms
577 if (fSelectPhysics && !isPhysicsSelected) continue;
579 // select on trigger before filling histograms
580 if (fSelectTrigger && !isTriggerSelected) continue;
582 // select on track charge
583 if (fSelectCharge*esdTrack->Charge() < 0) continue;
585 // select on track matching
586 if (fSelectMatched && !esdTrack->ContainTriggerData()) continue;
588 // skip tracks that do not pass the acceptance cuts if required
589 if (fApplyAccCut && accKey.EndsWith("out")) continue;
591 nSelectedTrackerTracks++;
592 if (esdTrack->ContainTriggerData()) nSelectedTrackMatchTrig++;
594 Double_t trackP = esdTrack->P();
595 Double_t trackPt = esdTrack->Pt();
596 Short_t trackCharge = esdTrack->Charge();
597 ((TH1F*)fList->UncheckedAt(kP))->Fill(trackP);
598 ((TH1F*)fList->UncheckedAt(kPt))->Fill(trackPt);
599 Bool_t matchTrigLpt = (esdTrack->GetMatchTrigger()>=2);
600 Bool_t matchTrigHpt = (esdTrack->GetMatchTrigger()>=3);
601 if ( matchTrigLpt ) ((TH1F*)fList->UncheckedAt(kPtMatchLpt))->Fill(trackPt);
602 if ( matchTrigHpt ) ((TH1F*)fList->UncheckedAt(kPtMatchHpt))->Fill(trackPt);
603 if (trackCharge < 0) {
604 ((TH1F*)fList->UncheckedAt(kPMuMinus))->Fill(trackP);
605 ((TH1F*)fList->UncheckedAt(kPtMuMinus))->Fill(trackPt);
606 if ( matchTrigLpt ) ((TH1F*)fList->UncheckedAt(kPtMuMinusMatchLpt))->Fill(trackPt);
607 if ( matchTrigHpt ) ((TH1F*)fList->UncheckedAt(kPtMuMinusMatchHpt))->Fill(trackPt);
609 ((TH1F*)fList->UncheckedAt(kPMuPlus))->Fill(trackP);
610 ((TH1F*)fList->UncheckedAt(kPtMuPlus))->Fill(trackPt);
611 if ( matchTrigLpt ) ((TH1F*)fList->UncheckedAt(kPtMuPlusMatchLpt))->Fill(trackPt);
612 if ( matchTrigHpt ) ((TH1F*)fList->UncheckedAt(kPtMuPlusMatchHpt))->Fill(trackPt);
614 ((TH1F*)fList->UncheckedAt(kRapidity))->Fill(esdTrack->Y());
615 Int_t ndf = 2 * esdTrack->GetNHit() - 5;
616 ((TH1F*)fList->UncheckedAt(kChi2))->Fill(esdTrack->GetChi2()/ndf);
617 ((TH1F*)fList->UncheckedAt(kProbChi2))->Fill(TMath::Prob(esdTrack->GetChi2(),ndf));
618 ((TH1F*)fList->UncheckedAt(kThetaX))->Fill(ChangeThetaRange(esdTrack->GetThetaXUncorrected()));
619 ((TH1F*)fList->UncheckedAt(kThetaY))->Fill(ChangeThetaRange(esdTrack->GetThetaYUncorrected()));
620 ((TH1F*)fList->UncheckedAt(kNClustersPerTrack))->Fill(esdTrack->GetNHit());
621 ((TH1F*)fList->UncheckedAt(kSign))->Fill(trackCharge);
622 ((TH1F*)fList->UncheckedAt(kDCA))->Fill(esdTrack->GetDCA());
624 Int_t nChamberHit = 0;
625 for (Int_t ich=0; ich<10; ich++) if (esdTrack->IsInMuonClusterMap(ich)) nChamberHit++;
626 ((TH1F*)fList->UncheckedAt(kNChamberHitPerTrack))->Fill(nChamberHit);
628 // loop over clusters
629 for (Int_t icl=0; icl<esdTrack->GetNClusters(); icl++) {
631 AliESDMuonCluster* esdCluster = esdTrack->GetESDEvent()->FindMuonCluster(esdTrack->GetClusterId(icl));
633 Int_t chId = esdCluster->GetChamberId();
634 Int_t deId = esdCluster->GetDetElemId();
636 ((TH1F*)fListExpert->UncheckedAt(kNClustersPerCh))->Fill(chId);
637 ((TH1F*)fListExpert->UncheckedAt(kNClustersPerDE))->Fill(deId);
639 ((TH1F*)fListExpert->UncheckedAt(kClusterHitMapInCh+chId))->Fill(esdCluster->GetX(), esdCluster->GetY());
641 ((TH1F*)fListExpert->UncheckedAt(kClusterChargeInCh+chId))->Fill(esdCluster->GetCharge());
642 ((TH1F*)fListExpert->UncheckedAt(kClusterChargePerDE))->Fill(deId, esdCluster->GetCharge());
644 if (esdCluster->PadsStored()) { // discard clusters with pad not stored in ESD
645 ((TH1F*)fListExpert->UncheckedAt(kClusterSizeInCh+chId))->Fill(esdCluster->GetNPads());
646 ((TH1F*)fListExpert->UncheckedAt(kClusterSizePerDE))->Fill(deId, esdCluster->GetNPads());
653 if ((!fSelectPhysics || isPhysicsSelected) && (!fSelectTrigger || isTriggerSelected)) {
654 ((TH1F*)fList->UncheckedAt(kNTracks))->Fill(nSelectedTrackerTracks);
655 ((TH1F*)fList->UncheckedAt(kMatchTrig))->Fill(nSelectedTrackMatchTrig);
661 // Post final data. It will be written to a file with option "RECREATE"
663 PostData(2, fListExpert);
664 PostData(3, fTrackCounters);
665 PostData(4, fEventCounters);
668 //________________________________________________________________________
669 void AliAnalysisTaskMuonQA::Terminate(Option_t *)
671 /// Normalize histograms
672 /// Draw result to the screen
676 fTrackCounters = static_cast<AliCounterCollection*>(GetOutputData(3));
677 fEventCounters = static_cast<AliCounterCollection*>(GetOutputData(4));
678 if (fTrackCounters && fEventCounters) {
679 if (!gROOT->IsBatch()) {
680 cout<<"whole statistics without selection:"<<endl;
681 fEventCounters->Print("trigger/event");
682 fTrackCounters->Print("trigger/track");
683 cout<<"whole statistics of selected events:"<<endl;
684 fEventCounters->Print("trigger/event","selected:yes");
685 fTrackCounters->Print("trigger/track","selected:yes");
687 fEventCounters->Draw("event","trigger","");
689 fTrackCounters->Draw("track","trigger","");
691 fEventCounters->Draw("event","trigger","selected:yes");
693 fTrackCounters->Draw("track","trigger","selected:yes");
697 // recover output histograms
698 fList = static_cast<TObjArray*>(GetOutputData(1));
699 fListExpert = static_cast<TObjArray*>(GetOutputData(2));
700 if (!fList || !fListExpert) return;
702 // create summary plots
703 fListNorm = new TObjArray(1000);
704 fListNorm->SetOwner();
706 // mean/dispersion of cluster charge per chamber/DE
707 TH1F* hClusterChargePerChMean = new TH1F("hClusterChargePerChMean", "cluster mean charge per chamber;chamber ID;<charge> (fC)", nCh, -0.5, nCh-0.5);
708 hClusterChargePerChMean->SetOption("P");
709 hClusterChargePerChMean->SetMarkerStyle(kFullDotMedium);
710 hClusterChargePerChMean->SetMarkerColor(kBlue);
711 fListNorm->AddAtAndExpand(hClusterChargePerChMean, kClusterChargePerChMean);
713 TH1F* hClusterChargePerChSigma = new TH1F("hClusterChargePerChSigma", "cluster charge dispersion per chamber;chamber ID;#sigma_{charge} (fC)", nCh, -0.5, nCh-0.5);
714 hClusterChargePerChSigma->SetOption("P");
715 hClusterChargePerChSigma->SetMarkerStyle(kFullDotMedium);
716 hClusterChargePerChSigma->SetMarkerColor(kBlue);
717 fListNorm->AddAtAndExpand(hClusterChargePerChSigma, kClusterChargePerChSigma);
719 TH1F* hClusterChargePerDEMean = new TH1F("hClusterChargePerDEMean", "cluster mean charge per DE;DetElem ID;<charge> (fC)", nDE+1, -0.5, nDE+0.5);
720 hClusterChargePerDEMean->SetOption("P");
721 hClusterChargePerDEMean->SetMarkerStyle(kFullDotMedium);
722 hClusterChargePerDEMean->SetMarkerColor(kBlue);
723 fListNorm->AddAtAndExpand(hClusterChargePerDEMean, kClusterChargePerDEMean);
725 TH1F* hClusterChargePerDESigma = new TH1F("hClusterChargePerDESigma", "cluster charge dispersion per DE;DetElem ID;#sigma_{charge} (fC)", nDE+1, -0.5, nDE+0.5);
726 hClusterChargePerDESigma->SetOption("P");
727 hClusterChargePerDESigma->SetMarkerStyle(kFullDotMedium);
728 hClusterChargePerDESigma->SetMarkerColor(kBlue);
729 fListNorm->AddAtAndExpand(hClusterChargePerDESigma, kClusterChargePerDESigma);
731 // mean/dispersion of cluster size per chamber/DE
732 TH1F* hClusterSizePerChMean = new TH1F("hClusterSizePerChMean", "cluster mean size per chamber;chamber ID;<size> (n_{pads})", nCh, -0.5, nCh-0.5);
733 hClusterSizePerChMean->SetOption("P");
734 hClusterSizePerChMean->SetMarkerStyle(kFullDotMedium);
735 hClusterSizePerChMean->SetMarkerColor(kBlue);
736 fListNorm->AddAtAndExpand(hClusterSizePerChMean, kClusterSizePerChMean);
738 TH1F* hClusterSizePerChSigma = new TH1F("hClusterSizePerChSigma", "cluster size dispersion per chamber;chamber ID;#sigma_{size} (n_{pads})", nCh, -0.5, nCh-0.5);
739 hClusterSizePerChSigma->SetOption("P");
740 hClusterSizePerChSigma->SetMarkerStyle(kFullDotMedium);
741 hClusterSizePerChSigma->SetMarkerColor(kBlue);
742 fListNorm->AddAtAndExpand(hClusterSizePerChSigma, kClusterSizePerChSigma);
744 TH1F* hClusterSizePerDEMean = new TH1F("hClusterSizePerDEMean", "cluster mean size per DE;DetElem ID;<size> (n_{pads})", nDE+1, -0.5, nDE+0.5);
745 hClusterSizePerDEMean->SetOption("P");
746 hClusterSizePerDEMean->SetMarkerStyle(kFullDotMedium);
747 hClusterSizePerDEMean->SetMarkerColor(kBlue);
748 fListNorm->AddAtAndExpand(hClusterSizePerDEMean, kClusterSizePerDEMean);
750 TH1F* hClusterSizePerDESigma = new TH1F("hClusterSizePerDESigma", "cluster size dispersion per DE;DetElem ID;#sigma_{size} (n_{pads})", nDE+1, -0.5, nDE+0.5);
751 hClusterSizePerDESigma->SetOption("P");
752 hClusterSizePerDESigma->SetMarkerStyle(kFullDotMedium);
753 hClusterSizePerDESigma->SetMarkerColor(kBlue);
754 fListNorm->AddAtAndExpand(hClusterSizePerDESigma, kClusterSizePerDESigma);
756 // normalize histograms
757 Float_t nTracks = ((TH1F*)fList->UncheckedAt(kNClustersPerTrack))->GetEntries();
759 ((TH1F*)fListExpert->UncheckedAt(kNClustersPerCh))->Scale(1./nTracks);
760 ((TH1F*)fListExpert->UncheckedAt(kNClustersPerDE))->Scale(1./nTracks);
762 fListNorm->AddAtAndExpand(((TH1F*)fListExpert->UncheckedAt(kNClustersPerCh))->Clone(), kNClustersPerChPerTrack);
763 fListNorm->AddAtAndExpand(((TH1F*)fListExpert->UncheckedAt(kNClustersPerDE))->Clone(), kNClustersPerDEPerTrack);
765 // fill summary plots per chamber
766 for (Int_t iCh = 0; iCh < nCh; iCh++) {
768 TH1* hClusterChargeInCh = ((TH1F*)fListExpert->UncheckedAt(kClusterChargeInCh+iCh));
769 hClusterChargePerChMean->SetBinContent(iCh+1, hClusterChargeInCh->GetMean());
770 hClusterChargePerChMean->SetBinError(iCh+1, hClusterChargeInCh->GetMeanError());
771 hClusterChargePerChSigma->SetBinContent(iCh+1, hClusterChargeInCh->GetRMS());
772 hClusterChargePerChSigma->SetBinError(iCh+1, hClusterChargeInCh->GetRMSError());
774 TH1* hClusterSizeInCh = ((TH1F*)fListExpert->UncheckedAt(kClusterSizeInCh+iCh));
775 hClusterSizePerChMean->SetBinContent(iCh+1, hClusterSizeInCh->GetMean());
776 hClusterSizePerChMean->SetBinError(iCh+1, hClusterSizeInCh->GetMeanError());
777 hClusterSizePerChSigma->SetBinContent(iCh+1, hClusterSizeInCh->GetRMS());
778 hClusterSizePerChSigma->SetBinError(iCh+1, hClusterSizeInCh->GetRMSError());
782 // fill summary plots per DE
783 TH2F* hClusterChargePerDE = ((TH2F*)fListExpert->UncheckedAt(kClusterChargePerDE));
784 TH2F* hClusterSizePerDE = ((TH2F*)fListExpert->UncheckedAt(kClusterSizePerDE));
785 for (Int_t iDE = 1; iDE < nDE+1; iDE++) {
787 TH1D *tmp = hClusterChargePerDE->ProjectionY("tmp",iDE,iDE,"e");
788 if (tmp->GetEntries() > 10.) {
789 hClusterChargePerDEMean->SetBinContent(iDE, tmp->GetMean());
790 hClusterChargePerDEMean->SetBinError(iDE, tmp->GetMeanError());
791 hClusterChargePerDESigma->SetBinContent(iDE, tmp->GetRMS());
792 hClusterChargePerDESigma->SetBinError(iDE, tmp->GetRMSError());
796 tmp = hClusterSizePerDE->ProjectionY("tmp",iDE,iDE,"e");
797 if (tmp->GetEntries() > 10.) {
798 hClusterSizePerDEMean->SetBinContent(iDE, tmp->GetMean());
799 hClusterSizePerDEMean->SetBinError(iDE, tmp->GetMeanError());
800 hClusterSizePerDESigma->SetBinContent(iDE, tmp->GetRMS());
801 hClusterSizePerDESigma->SetBinError(iDE, tmp->GetRMSError());
807 // Post summary data.
808 PostData(5, fListNorm);
811 //________________________________________________________________________
812 Double_t AliAnalysisTaskMuonQA::ChangeThetaRange(Double_t theta)
814 /// set theta range from -180 to +180 degrees
815 if(theta < -2.5) return (theta / TMath::Pi() + 1.) * 180.;
816 else if(theta > 2.5) return (theta / TMath::Pi() - 1.) * 180.;
817 else return theta / TMath::Pi() * 180.;
821 //________________________________________________________________________
822 UInt_t AliAnalysisTaskMuonQA::BuildTriggerWord(TString& FiredTriggerClasses)
824 /// build the trigger word from the fired trigger classes and the list of selectable trigger
828 TObjString* trigClasseName = 0x0;
829 TIter nextTrigger(fSelectTriggerClass);
830 while ((trigClasseName = static_cast<TObjString*>(nextTrigger()))) {
832 TRegexp GenericTriggerClasseName(trigClasseName->String());
833 if (FiredTriggerClasses.Contains(GenericTriggerClasseName)) word |= trigClasseName->GetUniqueID();
840 //________________________________________________________________________
841 TList* AliAnalysisTaskMuonQA::BuildListOfAllTriggerCases(TString& FiredTriggerClasses)
843 /// build the list of trigger for the counters from the fired trigger classes
844 /// returned TList must be deleted by user
846 TList* list = new TList();
850 list->AddLast(new TObjString("trigger:any"));
852 TObjArray *obj = FiredTriggerClasses.Tokenize(" ");
854 TIter nextTrigger(obj);
855 TObjString* trigClasseName;
856 while ((trigClasseName = static_cast<TObjString*>(nextTrigger()))) {
858 //AliInfo(Form("trigger name %s %s",trigClasseName->GetName(),FiredTriggerClasses.Data()));
860 //Add specific trigger
861 list->AddLast(new TObjString(Form("trigger:%s",trigClasseName->GetName())));
866 // add case other if no specific trigger was found
867 if (list->GetSize() == 1) list->AddLast(new TObjString("trigger:other"));
873 //________________________________________________________________________
874 TList* AliAnalysisTaskMuonQA::BuildListOfSelectedTriggerCases(TString& FiredTriggerClasses)
876 /// build the list of trigger for the counters from the fired trigger classes
877 /// returned TList must be deleted by user
879 TList* list = new TList();
883 list->AddLast(new TObjString("trigger:any"));
885 TObjString* trigClasseName = 0x0;
886 TObjArray *obj = FiredTriggerClasses.Tokenize(" ");
888 TIter nextTrigger(obj);
889 while ((trigClasseName = static_cast<TObjString*>(nextTrigger()))) {
891 //AliInfo(Form("trigger name %s %s",trigClasseName->GetName(),FiredTriggerClasses.Data()));
892 //loop on rejected trigger if (trigClasseName.Contains()
893 //Add specific trigger
894 list->AddLast(new TObjString(Form("trigger:%s",trigClasseName->GetName())));
899 // add case other if no specific trigger was found
900 if (list->GetSize() == 1) list->AddLast(new TObjString("trigger:other"));
905 //________________________________________________________________________
906 TList* AliAnalysisTaskMuonQA::BuildListOfTriggerCases(TString& FiredTriggerClasses)
908 /// build the list of trigger for the counters from the fired trigger classes and the list of trigger classes
909 /// returned TList must be deleted by user
911 TList* list = new TList();
913 Bool_t foundCINT1B = kFALSE;
914 Bool_t foundCMUS1B = kFALSE;
917 list->AddLast(new TObjString("trigger:any"));
919 TObjString* trigClasseName = 0x0;
921 TIter nextTrigger(fTriggerClass);
922 while ((trigClasseName = static_cast<TObjString*>(nextTrigger()))) {
924 //AliInfo(Form("trigger name %s %s",trigClasseName->GetName(),FiredTriggerClasses.Data()));
925 // cout<<"trigger name loop on "<<trigClasseName->GetName()<<" to look for "<<FiredTriggerClasses.Data()<<endl;
926 TRegexp GenericTriggerClasseName(trigClasseName->String());
927 if (FiredTriggerClasses.Contains(GenericTriggerClasseName)) {
928 //AliInfo(Form("trigger names match = %s %s",trigClasseName->GetName(),FiredTriggerClasses.Data()));
929 //cout<<"trigger names match "<<trigClasseName->GetName()<<" and "<<FiredTriggerClasses.Data()<<endl;
930 // add specific trigger case
931 TObjString* trigShortName = static_cast<TObjString*>(fTriggerClass->GetValue(trigClasseName));
932 list->AddLast(new TObjString(Form("trigger:%s",trigShortName->GetName())));
934 // check for CINT1B and CMUS1B trigger
935 if (trigShortName->String() == "CINT1B") foundCINT1B = kTRUE;
936 else if (trigShortName->String() == "CMUS1B") foundCMUS1B = kTRUE;
940 // add the special case CINT1B+CMUS1B
941 if (foundCINT1B && foundCMUS1B) list->AddLast(new TObjString("trigger:CINT1B+CMUS1B"));