]> git.uio.no Git - u/mrichter/AliRoot.git/blame - ANALYSIS/AliTriggerAnalysis.cxx
Modification of histo range (Riccardo)
[u/mrichter/AliRoot.git] / ANALYSIS / AliTriggerAnalysis.cxx
CommitLineData
70fdd197 1/* $Id: AliTriggerAnalysis.cxx 35782 2009-10-22 11:54:31Z jgrosseo $ */
ff8c4f30 2
7a11141c 3/**************************************************************************
4 * Copyright(c) 1998-2009, ALICE Experiment at CERN, All rights reserved. *
5 * *
6 * Author: The ALICE Off-line Project. *
7 * Contributors are mentioned in the code where appropriate. *
8 * *
9 * Permission to use, copy, modify and distribute this software and its *
10 * documentation strictly for non-commercial purposes is hereby granted *
11 * without fee, provided that the above copyright notice appears in all *
12 * copies and that both the copyright notice and this permission notice *
13 * appear in the supporting documentation. The authors make no claims *
14 * about the suitability of this software for any purpose. It is *
15 * provided "as is" without express or implied warranty. *
16 **************************************************************************/
17
18//-------------------------------------------------------------------------
70fdd197 19// Implementation of Class AliTriggerAnalysis
20// This class provides function to check if events have been triggered based on the data in the ESD
21// The trigger bits, trigger class inputs and only the data (offline trigger) can be used
7a11141c 22// Origin: Jan Fiete Grosse-Oetringhaus, CERN
23//-------------------------------------------------------------------------
24
70fdd197 25#include <Riostream.h>
907972ff 26#include <TH1F.h>
90dc86e9 27#include <TH2F.h>
907972ff 28#include <TList.h>
29#include <TIterator.h>
c01a136b 30#include "TParameter.h"
31#include <TMap.h>
733f0542 32#include <TRandom.h>
907972ff 33
70fdd197 34#include <AliTriggerAnalysis.h>
ff8c4f30 35
36#include <AliLog.h>
8d5a14d6 37#include <AliAnalysisManager.h>
ff8c4f30 38
39#include <AliESDEvent.h>
40
41#include <AliMultiplicity.h>
42#include <AliESDVZERO.h>
c8d3e441 43#include <AliESDZDC.h>
7a11141c 44#include <AliESDFMD.h>
225667ea 45#include <AliESDVertex.h>
449618cd 46#include <AliESDtrackCuts.h>
b68d0b5e 47#include <AliDAQ.h>
48#include <AliESDTrdTrack.h>
ff8c4f30 49
70fdd197 50ClassImp(AliTriggerAnalysis)
ff8c4f30 51
70fdd197 52AliTriggerAnalysis::AliTriggerAnalysis() :
90dc86e9 53 fSPDGFOThreshold(2),
733f0542 54 fSPDGFOEfficiency(0),
61899827 55 fV0TimeOffset(0),
97fa3cbc 56 fV0AdcThr(0),
57 fV0HwAdcThr(2.5),
58 fV0HwWinLow(61.5),
59 fV0HwWinHigh(86.5),
7c55ebd9 60 fZDCCutRefSum(-568.5),
61 fZDCCutRefDelta(-2.1),
62 fZDCCutSigmaSum(3.25),
63 fZDCCutSigmaDelta(2.25),
d6305a15 64 fZDCCutRefSumCorr(-65.5),
65 fZDCCutRefDeltaCorr(-2.1),
66 fZDCCutSigmaSumCorr(6.0),
67 fZDCCutSigmaDeltaCorr(1.2),
b68d0b5e 68 fZDCCutZNATimeCorrMin(0.0),
69 fZDCCutZNATimeCorrMax(2.0),
70 fZDCCutZNCTimeCorrMin(0.0),
71 fZDCCutZNCTimeCorrMax(5.0),
1ea7a921 72 fASPDCvsTCut(65),
73 fBSPDCvsTCut(4),
b68d0b5e 74 fTRDptHSE(3.),
75 fTRDpidHSE(144),
76 fTRDptHQU(2.),
77 fTRDpidHQU(164.),
78 fTRDptHEE(3.),
79 fTRDpidHEE(144),
80 fTRDminSectorHEE(6),
81 fTRDmaxSectorHEE(8),
82 fTRDptHJT(3.),
83 fTRDnHJT(3),
4011b280 84 fDoFMD(kTRUE),
90dc86e9 85 fFMDLowCut(0.2),
86 fFMDHitCut(0.5),
90dc86e9 87 fHistBitsSPD(0),
c2fff146 88 fHistFiredBitsSPD(0),
1ea7a921 89 fHistSPDClsVsTrk(0),
907972ff 90 fHistV0A(0),
61899827 91 fHistV0C(0),
907972ff 92 fHistZDC(0),
ce08cb1f 93 fHistTDCZDC(0),
102cfd12 94 fHistTimeZDC(0),
fcb18b05 95 fHistTimeCorrZDC(0),
907972ff 96 fHistFMDA(0),
97 fHistFMDC(0),
98 fHistFMDSingle(0),
c01a136b 99 fHistFMDSum(0),
559b5ed7 100 fHistT0(0),
a2ce3799 101 fTriggerClasses(0),
449618cd 102 fMC(kFALSE),
52f3b98d 103 fEsdTrackCuts(0),
104 fTPCOnly(kFALSE)
ff8c4f30 105{
61899827 106 // constructor
107}
108
109AliTriggerAnalysis::~AliTriggerAnalysis()
110{
111 // destructor
112
113 if (fHistBitsSPD)
114 {
115 delete fHistBitsSPD;
116 fHistBitsSPD = 0;
117 }
118
119 if (fHistFiredBitsSPD)
120 {
121 delete fHistFiredBitsSPD;
122 fHistFiredBitsSPD = 0;
123 }
124
1ea7a921 125 if (fHistSPDClsVsTrk)
126 {
127 delete fHistSPDClsVsTrk;
128 fHistSPDClsVsTrk = 0;
129 }
130
61899827 131 if (fHistV0A)
132 {
133 delete fHistV0A;
134 fHistV0A = 0;
135 }
136
137 if (fHistV0C)
138 {
139 delete fHistV0C;
140 fHistV0C = 0;
141 }
142
143 if (fHistZDC)
144 {
145 delete fHistZDC;
146 fHistZDC = 0;
147 }
ce08cb1f 148 if (fHistTDCZDC)
149 {
102cfd12 150 delete fHistTDCZDC;
151 fHistTDCZDC = 0;
152 }
153 if (fHistTimeZDC)
154 {
155 delete fHistTimeZDC;
156 fHistTimeZDC = 0;
ce08cb1f 157 }
fcb18b05 158 if (fHistTimeCorrZDC)
159 {
160 delete fHistTimeCorrZDC;
161 fHistTimeCorrZDC = 0;
162 }
61899827 163
164 if (fHistFMDA)
165 {
166 delete fHistFMDA;
167 fHistFMDA = 0;
168 }
169
170 if (fHistFMDC)
171 {
172 delete fHistFMDC;
173 fHistFMDC = 0;
174 }
175
176 if (fHistFMDSingle)
177 {
178 delete fHistFMDSingle;
179 fHistFMDSingle = 0;
180 }
181
182 if (fHistFMDSum)
183 {
184 delete fHistFMDSum;
185 fHistFMDSum = 0;
186 }
187
559b5ed7 188 if (fHistT0)
189 {
190 delete fHistT0;
191 fHistT0 = 0;
192 }
193
61899827 194 if (fTriggerClasses)
195 {
35fb1e58 196 fTriggerClasses->DeleteAll();
61899827 197 delete fTriggerClasses;
198 fTriggerClasses = 0;
199 }
449618cd 200
201 if (fEsdTrackCuts){
202 delete fEsdTrackCuts;
203 fEsdTrackCuts =0;
204 }
ff8c4f30 205}
206
891c67bd 207void AliTriggerAnalysis::EnableHistograms(Bool_t isLowFlux)
907972ff 208{
891c67bd 209 // creates the monitoring histograms (dynamical range of histograms can be adapted for pp and pPb via isLowFlux flag)
907972ff 210
296dd262 211 // do not add this hists to the directory
212 Bool_t oldStatus = TH1::AddDirectoryStatus();
213 TH1::AddDirectory(kFALSE);
891c67bd 214 //
215 Int_t nBins = isLowFlux ? 600 : 1202;
216 fHistBitsSPD = new TH2F("fHistBitsSPD", "SPD GFO;number of fired chips (offline);number of fired chips (hardware)", nBins, -1.5, -1.5 + nBins, nBins, -1.5, -1.5+nBins);
217 //
c01a136b 218 fHistFiredBitsSPD = new TH1F("fHistFiredBitsSPD", "SPD GFO Hardware;chip number;events", 1200, -0.5, 1199.5);
891c67bd 219 //
220 Int_t nBinsX = isLowFlux ? 100 : 300;
221 Int_t nBinsY = isLowFlux ? 500 : 1000;
222 Float_t xMax = isLowFlux ? 400 : 2999.5;
223 Float_t yMax = isLowFlux ? 4000 : 9999.5;
224 fHistSPDClsVsTrk = new TH2F("fHistSPDClsVsTrk", "SPD Clusters vs Tracklets", nBinsX, -0.5, xMax, nBinsY, -0.5, yMax);
225 //
988dd3a4 226 fHistV0A = new TH1F("fHistV0A", "V0A;leading time (ns);events", 400, -100, 100);
227 fHistV0C = new TH1F("fHistV0C", "V0C;leading time (ns);events", 400, -100, 100);
907972ff 228 fHistZDC = new TH1F("fHistZDC", "ZDC;trigger bits;events", 8, -1.5, 6.5);
ce08cb1f 229 fHistTDCZDC = new TH1F("fHistTDCZDC", "ZDC;TDC bits;events", 32, -0.5, 32-0.5);
102cfd12 230 fHistTimeZDC = new TH2F("fHistTimeZDC", "ZDC;TDC timing A+C vs C-A; events", 120,-30,30,120,-600,-540);
8195aa81 231 fHistTimeCorrZDC = new TH2F("fHistTimeCorrZDC", "ZDC;Corrected TDC timing A+C vs C-A; events", 120,-30,30,260,-100,30);
907972ff 232
233 // TODO check limits
234 fHistFMDA = new TH1F("fHistFMDA", "FMDA;combinations above threshold;events", 102, -1.5, 100.5);
235 fHistFMDC = new TH1F("fHistFMDC", "FMDC;combinations above threshold;events", 102, -1.5, 100.5);
236 fHistFMDSingle = new TH1F("fHistFMDSingle", "FMD single;multiplicity value;counts", 1000, 0, 10);
237 fHistFMDSum = new TH1F("fHistFMDSum", "FMD sum;multiplicity value;counts", 1000, 0, 10);
559b5ed7 238 fHistT0 = new TH1F("fHistT0", "T0;time (ns);events", 100, -25, 25);
c01a136b 239
240 fTriggerClasses = new TMap;
61899827 241 fTriggerClasses->SetOwner();
296dd262 242
243 TH1::AddDirectory(oldStatus);
907972ff 244}
245
70fdd197 246//____________________________________________________________________
247const char* AliTriggerAnalysis::GetTriggerName(Trigger trigger)
248{
249 // returns the name of the requested trigger
250 // the returned string will only be valid until the next call to this function [not thread-safe]
251
252 static TString str;
253
254 UInt_t triggerNoFlags = (UInt_t) trigger % (UInt_t) kStartOfFlags;
255
256 switch (triggerNoFlags)
257 {
258 case kAcceptAll : str = "ACCEPT ALL (bypass!)"; break;
259 case kMB1 : str = "MB1"; break;
260 case kMB2 : str = "MB2"; break;
261 case kMB3 : str = "MB3"; break;
262 case kSPDGFO : str = "SPD GFO"; break;
c2fff146 263 case kSPDGFOBits : str = "SPD GFO Bits"; break;
7c55ebd9 264 case kSPDGFOL0 : str = "SPD GFO L0 (first layer)"; break;
265 case kSPDGFOL1 : str = "SPD GFO L1 (second layer)"; break;
1ea7a921 266 case kSPDClsVsTrkBG : str = "Cluster vs Tracklets"; break;
61899827 267 case kV0A : str = "V0 A BB"; break;
268 case kV0C : str = "V0 C BB"; break;
733f0542 269 case kV0OR : str = "V0 OR BB"; break;
270 case kV0AND : str = "V0 AND BB"; break;
61899827 271 case kV0ABG : str = "V0 A BG"; break;
272 case kV0CBG : str = "V0 C BG"; break;
70fdd197 273 case kZDC : str = "ZDC"; break;
274 case kZDCA : str = "ZDC A"; break;
275 case kZDCC : str = "ZDC C"; break;
0d12ffff 276 case kZNA : str = "ZN A"; break;
277 case kZNC : str = "ZN C"; break;
278 case kZNABG : str = "ZN A BG"; break;
279 case kZNCBG : str = "ZN C BG"; break;
70fdd197 280 case kFMDA : str = "FMD A"; break;
281 case kFMDC : str = "FMD C"; break;
282 case kFPANY : str = "SPD GFO | V0 | ZDC | FMD"; break;
733f0542 283 case kNSD1 : str = "NSD1"; break;
97fa3cbc 284 case kMB1Prime: str = "MB1prime"; break;
7c55ebd9 285 case kZDCTDCA : str = "ZDC TDC A"; break;
286 case kZDCTDCC : str = "ZDC TDC C"; break;
287 case kZDCTime : str = "ZDC Time Cut"; break;
889c27e3 288 case kCentral : str = "V0 Central"; break;
289 case kSemiCentral : str = "V0 Semi-central"; break;
8d5a14d6 290 case kEMCAL : str = "EMCAL"; break;
b68d0b5e 291 case kTRDHCO : str = "TRD cosmics"; break;
292 case kTRDHJT : str = "TRD Jet"; break;
293 case kTRDHSE : str = "TRD Single Electron"; break;
294 case kTRDHQU : str = "TRD Quarkonia"; break;
295 case kTRDHEE : str = "TRD Dielectron"; break;
70fdd197 296 default: str = ""; break;
297 }
298
299 if (trigger & kOfflineFlag)
300 str += " OFFLINE";
301
225667ea 302 if (trigger & kOneParticle)
303 str += " OneParticle";
304
449618cd 305 if (trigger & kOneTrack)
306 str += " OneTrack";
307
70fdd197 308 return str;
309}
310
61899827 311Bool_t AliTriggerAnalysis::IsTriggerFired(const AliESDEvent* aEsd, Trigger trigger)
70fdd197 312{
313 // checks if an event has been triggered
314
315 if (trigger & kOfflineFlag)
316 return IsOfflineTriggerFired(aEsd, trigger);
317
318 return IsTriggerBitFired(aEsd, trigger);
319}
320
321Bool_t AliTriggerAnalysis::IsTriggerBitFired(const AliESDEvent* aEsd, Trigger trigger) const
322{
323 // checks if an event is fired using the trigger bits
324
325 return IsTriggerBitFired(aEsd->GetTriggerMask(), trigger);
326}
327
328Bool_t AliTriggerAnalysis::IsTriggerBitFired(ULong64_t triggerMask, Trigger trigger) const
329{
330 // checks if an event is fired using the trigger bits
331 //
332 // this function needs the branch TriggerMask in the ESD
333
334 // definitions from p-p.cfg
335 ULong64_t spdFO = (1 << 14);
336 ULong64_t v0left = (1 << 10);
337 ULong64_t v0right = (1 << 11);
338
339 switch (trigger)
340 {
341 case kAcceptAll:
342 {
343 return kTRUE;
344 break;
345 }
346 case kMB1:
347 {
348 if (triggerMask & spdFO || ((triggerMask & v0left) || (triggerMask & v0right)))
349 return kTRUE;
350 break;
351 }
352 case kMB2:
353 {
354 if (triggerMask & spdFO && ((triggerMask & v0left) || (triggerMask & v0right)))
355 return kTRUE;
356 break;
357 }
358 case kMB3:
359 {
360 if (triggerMask & spdFO && (triggerMask & v0left) && (triggerMask & v0right))
361 return kTRUE;
362 break;
363 }
364 case kSPDGFO:
365 {
366 if (triggerMask & spdFO)
367 return kTRUE;
368 break;
369 }
370 default:
371 Printf("IsEventTriggered: ERROR: Trigger type %d not implemented in this method", (Int_t) trigger);
372 break;
373 }
374
375 return kFALSE;
376}
377
378Bool_t AliTriggerAnalysis::IsTriggerBitFired(const AliESDEvent* aEsd, ULong64_t tclass) const
379{
380 // Checks if corresponding bit in mask is on
381
382 ULong64_t trigmask = aEsd->GetTriggerMask();
383 return (trigmask & (1ull << (tclass-1)));
384}
7c55ebd9 385
386Int_t AliTriggerAnalysis::EvaluateTrigger(const AliESDEvent* aEsd, Trigger trigger)
387{
388 // evaluates a given trigger "offline"
389 // trigger combinations are not supported, for that see IsOfflineTriggerFired
390
391 UInt_t triggerNoFlags = (UInt_t) trigger % (UInt_t) kStartOfFlags;
392 Bool_t offline = kFALSE;
393 if (trigger & kOfflineFlag)
394 offline = kTRUE;
395
396 Int_t decision = 0;
397 switch (triggerNoFlags)
398 {
399 case kSPDGFO:
400 {
401 decision = SPDFiredChips(aEsd, (offline) ? 0 : 1);
402 break;
403 }
404 case kSPDGFOL0:
405 {
406 decision = SPDFiredChips(aEsd, (offline) ? 0 : 1, kFALSE, 1);
407 break;
408 }
409 case kSPDGFOL1:
410 {
411 decision = SPDFiredChips(aEsd, (offline) ? 0 : 1, kFALSE, 2);
412 break;
1ea7a921 413 }
414 case kSPDClsVsTrkBG:
415 {
416 if(!offline)
417 AliFatal(Form("Online trigger not available for trigger %d", triggerNoFlags));
418 decision = IsSPDClusterVsTrackletBG(aEsd);
419 break;
7c55ebd9 420 }
421 case kV0A:
422 {
423 if (V0Trigger(aEsd, kASide, !offline) == kV0BB)
424 decision = 1;
425 break;
426 }
427 case kV0C:
428 {
429 if (V0Trigger(aEsd, kCSide, !offline) == kV0BB)
430 decision = 1;
431 break;
432 }
433 case kV0ABG:
434 {
435 if (V0Trigger(aEsd, kASide, !offline) == kV0BG)
436 decision = 1;
437 break;
438 }
439 case kV0CBG:
440 {
441 if (V0Trigger(aEsd, kCSide, !offline) == kV0BG)
442 decision = 1;
443 break;
444 }
559b5ed7 445 case kT0:
446 {
447 if (T0Trigger(aEsd, !offline) == kT0BB)
448 decision = 1;
449 break;
450 }
451 case kT0BG:
452 {
453 if (!offline)
454 AliFatal(Form("Online trigger not available for trigger %d", triggerNoFlags));
455 if (T0Trigger(aEsd, !offline) == kT0DecBG)
456 decision = 1;
457 break;
458 }
459 case kT0Pileup:
460 {
461 if (!offline)
462 AliFatal(Form("Online trigger not available for trigger %d", triggerNoFlags));
463 if (T0Trigger(aEsd, !offline) == kT0DecPileup)
464 decision = 1;
465 break;
466 }
7c55ebd9 467 case kZDCA:
468 {
469 if (!offline)
470 AliFatal(Form("Online trigger not available for trigger %d", triggerNoFlags));
471 if (ZDCTrigger(aEsd, kASide))
472 decision = 1;
473 break;
474 }
475 case kZDCC:
476 {
477 if (!offline)
478 AliFatal(Form("Online trigger not available for trigger %d", triggerNoFlags));
479 if (ZDCTrigger(aEsd, kCSide))
480 decision = 1;
481 break;
482 }
483 case kZDCTDCA:
484 {
485 if (!offline)
486 AliFatal(Form("Online trigger not available for trigger %d", triggerNoFlags));
487 if (ZDCTDCTrigger(aEsd, kASide))
488 decision = 1;
489 break;
490 }
491 case kZDCTDCC:
492 {
493 if (!offline)
494 AliFatal(Form("Online trigger not available for trigger %d", triggerNoFlags));
495 if (ZDCTDCTrigger(aEsd, kCSide))
496 decision = 1;
497 break;
498 }
499 case kZDCTime:
500 {
501 if (!offline)
502 AliFatal(Form("Online trigger not available for trigger %d", triggerNoFlags));
503 if (ZDCTimeTrigger(aEsd))
504 decision = 1;
505 break;
506 }
0d12ffff 507 case kZNA:
508 {
509 if (!offline)
510 AliFatal(Form("Online trigger not available for trigger %d", triggerNoFlags));
511 if (ZDCTDCTrigger(aEsd,kASide,kTRUE,kFALSE,kFALSE))
512 decision = 1;
513 break;
514 }
515 case kZNC:
516 {
517 if (!offline)
518 AliFatal(Form("Online trigger not available for trigger %d", triggerNoFlags));
519 if (ZDCTDCTrigger(aEsd,kCSide,kTRUE,kFALSE,kFALSE))
520 decision = 1;
521 break;
522 }
523 case kZNABG:
524 {
525 if (!offline)
526 AliFatal(Form("Online trigger not available for trigger %d", triggerNoFlags));
527 if (ZDCTimeBGTrigger(aEsd,kASide))
528 decision = 1;
529 break;
530 }
531 case kZNCBG:
532 {
533 if (!offline)
534 AliFatal(Form("Online trigger not available for trigger %d", triggerNoFlags));
535 if (ZDCTimeBGTrigger(aEsd,kCSide))
536 decision = 1;
537 break;
538 }
7c55ebd9 539 case kFMDA:
540 {
541 if (!offline)
542 AliFatal(Form("Online trigger not available for trigger %d", triggerNoFlags));
543 if (FMDTrigger(aEsd, kASide))
544 decision = 1;
545 break;
546 }
547 case kFMDC:
548 {
549 if (!offline)
550 AliFatal(Form("Online trigger not available for trigger %d", triggerNoFlags));
551 if (FMDTrigger(aEsd, kCSide))
552 decision = 1;
553 break;
554 }
555 case kCTPV0A:
556 {
557 if (offline)
558 AliFatal(Form("Offline trigger not available for trigger %d", triggerNoFlags));
559 if (IsL0InputFired(aEsd, 2))
560 decision = 1;
561 break;
562 }
563 case kCTPV0C:
564 {
565 if (offline)
566 AliFatal(Form("Offline trigger not available for trigger %d", triggerNoFlags));
567 if (IsL0InputFired(aEsd, 3))
568 decision = 1;
569 break;
570 }
571 case kTPCLaserWarmUp:
572 {
573 if (!offline)
574 AliFatal(Form("Online trigger not available for trigger %d", triggerNoFlags));
575 return IsLaserWarmUpTPCEvent(aEsd);
576 }
b68d0b5e 577 case kTPCHVdip:
578 {
579 if (!offline)
580 AliFatal(Form("Online trigger not available for trigger %d", triggerNoFlags));
581 return IsHVdipTPCEvent(aEsd);
582 }
889c27e3 583 case kCentral:
584 {
585 if (offline)
586 AliFatal(Form("Offline trigger not available for trigger %d - use centrality selection", triggerNoFlags));
587 if (aEsd->GetVZEROData()) {
588 if (aEsd->GetVZEROData()->TestBit(AliESDVZERO::kTriggerChargeBitsFilled)) {
589 if (aEsd->GetVZEROData()->GetTriggerBits() & (1<<AliESDVZERO::kCTA2andCTC2))
590 decision = kTRUE;
591 }
592 else
593 AliWarning("V0 centrality trigger bits were not filled!");
594 }
595 break;
596 }
597 case kSemiCentral:
598 {
599 if (offline)
600 AliFatal(Form("Offline trigger not available for trigger %d - use centrality selection", triggerNoFlags));
601 if (aEsd->GetVZEROData()) {
602 if (aEsd->GetVZEROData()->TestBit(AliESDVZERO::kTriggerChargeBitsFilled)) {
603 if (aEsd->GetVZEROData()->GetTriggerBits() & (1<<AliESDVZERO::kCTA1andCTC1))
604 decision = kTRUE;
605 }
606 else
607 AliWarning("V0 centrality trigger bits were not filled!");
608 }
609 break;
610 }
8d5a14d6 611 case kEMCAL:
612 {
613 if(!offline)
614 AliFatal(Form("Online trigger not available for trigger %d", triggerNoFlags));
615 if (EMCALCellsTrigger(aEsd))
616 decision = kTRUE;
617 break;
618 }
b68d0b5e 619 case kTRDHCO:
620 {
621 if(!offline)
622 AliFatal(Form("Online trigger not available for trigger %d", triggerNoFlags));
623 if(TRDTrigger(aEsd,kTRDHCO))
624 decision = kTRUE;
625 break;
626 }
627 case kTRDHJT:
628 {
629 if(!offline)
630 AliFatal(Form("Online trigger not available for trigger %d", triggerNoFlags));
631 if(TRDTrigger(aEsd,kTRDHJT))
632 decision = kTRUE;
633 break;
634 }
635 case kTRDHSE:
636 {
637 if(!offline)
638 AliFatal(Form("Online trigger not available for trigger %d", triggerNoFlags));
639 if(TRDTrigger(aEsd,kTRDHSE))
640 decision = kTRUE;
641 break;
642 }
643 case kTRDHQU:
644 {
645 if(!offline)
646 AliFatal(Form("Online trigger not available for trigger %d", triggerNoFlags));
647 if(TRDTrigger(aEsd,kTRDHQU))
648 decision = kTRUE;
649 break;
650 }
651 case kTRDHEE:
652 {
653 if(!offline)
654 AliFatal(Form("Online trigger not available for trigger %d", triggerNoFlags));
655 if(TRDTrigger(aEsd,kTRDHEE))
656 decision = kTRUE;
657 break;
658 }
7c55ebd9 659 default:
660 {
661 AliFatal(Form("Trigger type %d not implemented", triggerNoFlags));
662 }
663 }
664
665 return decision;
666}
667
668Bool_t AliTriggerAnalysis::IsLaserWarmUpTPCEvent(const AliESDEvent* esd)
669{
670 //
671 // This function flags noisy TPC events which can happen during laser warm-up.
672 //
673
674 Int_t trackCounter = 0;
675 for (Int_t i=0; i<esd->GetNumberOfTracks(); ++i)
676 {
677 AliESDtrack *track = esd->GetTrack(i);
678 if (!track)
679 continue;
680
681 if (track->GetTPCNcls() < 30) continue;
7c55ebd9 682 if (TMath::Abs(track->Eta()) > 0.005) continue;
683 if (track->Pt() < 4) continue;
684 if (track->GetKinkIndex(0) > 0) continue;
685
686 UInt_t status = track->GetStatus();
9eb74f86 687 if ((status&AliESDtrack::kITSrefit)==AliESDtrack::kITSrefit) continue; // explicitly ask for tracks without ITS refit
688 if ((status&AliESDtrack::kTPCrefit)!=AliESDtrack::kTPCrefit) continue;
7c55ebd9 689
690 if (track->GetTPCsignal() > 10) continue; // explicitly ask for tracks without dE/dx
691
7c55ebd9 692 trackCounter++;
693 }
694 if (trackCounter > 15)
695 return kTRUE;
696 return kFALSE;
697}
70fdd197 698
b68d0b5e 699Bool_t AliTriggerAnalysis::IsHVdipTPCEvent(const AliESDEvent* esd) {
700 //
701 // This function flags events in which the TPC chamber HV is not at its nominal value
702 //
703 if (!esd->IsDetectorOn(AliDAQ::kTPC)) return kTRUE;
704 return kFALSE;
705
706}
707
708
61899827 709Bool_t AliTriggerAnalysis::IsOfflineTriggerFired(const AliESDEvent* aEsd, Trigger trigger)
ff8c4f30 710{
711 // checks if an event has been triggered "offline"
712
70fdd197 713 UInt_t triggerNoFlags = (UInt_t) trigger % (UInt_t) kStartOfFlags;
ff8c4f30 714
225667ea 715 Bool_t decision = kFALSE;
ff8c4f30 716 switch (triggerNoFlags)
717 {
70fdd197 718 case kAcceptAll:
ff8c4f30 719 {
225667ea 720 decision = kTRUE;
ff8c4f30 721 break;
722 }
70fdd197 723 case kMB1:
ff8c4f30 724 {
97fa3cbc 725 if (SPDGFOTrigger(aEsd, 0) || V0Trigger(aEsd, kASide, kFALSE) == kV0BB || V0Trigger(aEsd, kCSide, kFALSE) == kV0BB)
225667ea 726 decision = kTRUE;
ff8c4f30 727 break;
728 }
70fdd197 729 case kMB2:
ff8c4f30 730 {
97fa3cbc 731 if (SPDGFOTrigger(aEsd, 0) && (V0Trigger(aEsd, kASide, kFALSE) == kV0BB || V0Trigger(aEsd, kCSide, kFALSE) == kV0BB))
225667ea 732 decision = kTRUE;
ff8c4f30 733 break;
734 }
70fdd197 735 case kMB3:
ff8c4f30 736 {
97fa3cbc 737 if (SPDGFOTrigger(aEsd, 0) && V0Trigger(aEsd, kASide, kFALSE) == kV0BB && V0Trigger(aEsd, kCSide, kFALSE) == kV0BB)
225667ea 738 decision = kTRUE;
ff8c4f30 739 break;
740 }
70fdd197 741 case kSPDGFO:
ff8c4f30 742 {
c2fff146 743 if (SPDGFOTrigger(aEsd, 0))
225667ea 744 decision = kTRUE;
c2fff146 745 break;
746 }
747 case kSPDGFOBits:
748 {
749 if (SPDGFOTrigger(aEsd, 1))
225667ea 750 decision = kTRUE;
ff8c4f30 751 break;
752 }
70fdd197 753 case kV0A:
ff8c4f30 754 {
97fa3cbc 755 if (V0Trigger(aEsd, kASide, kFALSE) == kV0BB)
225667ea 756 decision = kTRUE;
ff8c4f30 757 break;
758 }
70fdd197 759 case kV0C:
ff8c4f30 760 {
97fa3cbc 761 if (V0Trigger(aEsd, kCSide, kFALSE) == kV0BB)
225667ea 762 decision = kTRUE;
ff8c4f30 763 break;
764 }
733f0542 765 case kV0OR:
766 {
97fa3cbc 767 if (V0Trigger(aEsd, kASide, kFALSE) == kV0BB || V0Trigger(aEsd, kCSide, kFALSE) == kV0BB)
225667ea 768 decision = kTRUE;
733f0542 769 break;
770 }
771 case kV0AND:
772 {
97fa3cbc 773 if (V0Trigger(aEsd, kASide, kFALSE) == kV0BB && V0Trigger(aEsd, kCSide, kFALSE) == kV0BB)
225667ea 774 decision = kTRUE;
733f0542 775 break;
776 }
61899827 777 case kV0ABG:
778 {
97fa3cbc 779 if (V0Trigger(aEsd, kASide, kFALSE) == kV0BG)
225667ea 780 decision = kTRUE;
61899827 781 break;
782 }
783 case kV0CBG:
784 {
97fa3cbc 785 if (V0Trigger(aEsd, kCSide, kFALSE) == kV0BG)
225667ea 786 decision = kTRUE;
61899827 787 break;
788 }
70fdd197 789 case kZDC:
c8d3e441 790 {
791 if (ZDCTrigger(aEsd, kASide) || ZDCTrigger(aEsd, kCentralBarrel) || ZDCTrigger(aEsd, kCSide))
225667ea 792 decision = kTRUE;
c8d3e441 793 break;
794 }
70fdd197 795 case kZDCA:
ff8c4f30 796 {
797 if (ZDCTrigger(aEsd, kASide))
225667ea 798 decision = kTRUE;
ff8c4f30 799 break;
800 }
70fdd197 801 case kZDCC:
ff8c4f30 802 {
803 if (ZDCTrigger(aEsd, kCSide))
225667ea 804 decision = kTRUE;
ff8c4f30 805 break;
806 }
0d12ffff 807 case kZNA:
808 {
809 if (ZDCTDCTrigger(aEsd,kASide,kTRUE,kFALSE,kFALSE))
810 decision = kTRUE;
811 break;
812 }
813 case kZNC:
814 {
815 if (ZDCTDCTrigger(aEsd,kCSide,kTRUE,kFALSE,kFALSE))
816 decision = kTRUE;
817 break;
818 }
819 case kZNABG:
820 {
821 if (ZDCTimeBGTrigger(aEsd,kASide))
822 decision = kTRUE;
823 break;
824 }
825 case kZNCBG:
826 {
827 if (ZDCTimeBGTrigger(aEsd,kCSide))
828 decision = kTRUE;
829 break;
830 }
70fdd197 831 case kFMDA:
7a11141c 832 {
833 if (FMDTrigger(aEsd, kASide))
225667ea 834 decision = kTRUE;
7a11141c 835 break;
836 }
70fdd197 837 case kFMDC:
7a11141c 838 {
839 if (FMDTrigger(aEsd, kCSide))
225667ea 840 decision = kTRUE;
7a11141c 841 break;
842 }
70fdd197 843 case kFPANY:
ff8c4f30 844 {
97fa3cbc 845 if (SPDGFOTrigger(aEsd, 0) || V0Trigger(aEsd, kASide, kFALSE) == kV0BB || V0Trigger(aEsd, kCSide, kFALSE) == kV0BB || ZDCTrigger(aEsd, kASide) || ZDCTrigger(aEsd, kCentralBarrel) || ZDCTrigger(aEsd, kCSide) || FMDTrigger(aEsd, kASide) || FMDTrigger(aEsd, kCSide))
225667ea 846 decision = kTRUE;
ff8c4f30 847 break;
848 }
733f0542 849 case kNSD1:
850 {
97fa3cbc 851 if (SPDFiredChips(aEsd, 0) >= 5 || (V0Trigger(aEsd, kASide, kFALSE) == kV0BB && V0Trigger(aEsd, kCSide, kFALSE) == kV0BB))
225667ea 852 decision = kTRUE;
733f0542 853 break;
854 }
97fa3cbc 855 case kMB1Prime:
856 {
857 Int_t count = 0;
858 if (SPDGFOTrigger(aEsd, 0))
859 count++;
860 if (V0Trigger(aEsd, kASide, kFALSE) == kV0BB)
861 count++;
862 if (V0Trigger(aEsd, kCSide, kFALSE) == kV0BB)
863 count++;
864
865 if (count >= 2)
225667ea 866 decision = kTRUE;
97fa3cbc 867
868 break;
869 }
8d5a14d6 870 case kEMCAL:
ff8c4f30 871 {
8d5a14d6 872 if (EMCALCellsTrigger(aEsd))
873 decision = kTRUE;
874 break;
b68d0b5e 875 }
876 case kTRDHCO:
877 {
878 if(TRDTrigger(aEsd,kTRDHCO))
879 decision = kTRUE;
880 break;
881 }
882 case kTRDHJT:
883 {
884 if(TRDTrigger(aEsd,kTRDHJT))
885 decision = kTRUE;
886 break;
887 }
888 case kTRDHSE:
889 {
890 if(TRDTrigger(aEsd,kTRDHSE))
891 decision = kTRUE;
892 break;
893 }
894 case kTRDHQU:
895 {
896 if(TRDTrigger(aEsd,kTRDHQU))
897 decision = kTRUE;
898 break;
899 }
900 case kTRDHEE:
901 {
902 if(TRDTrigger(aEsd,kTRDHEE))
903 decision = kTRUE;
904 break;
8d5a14d6 905 }
906 default:
907 {
ff8c4f30 908 AliFatal(Form("Trigger type %d not implemented", triggerNoFlags));
909 }
910 }
911
225667ea 912 // hadron-level requirement
913 if (decision && (trigger & kOneParticle))
914 {
915 decision = kFALSE;
916
917 const AliESDVertex* vertex = aEsd->GetPrimaryVertexSPD();
918 const AliMultiplicity* mult = aEsd->GetMultiplicity();
ff8c4f30 919
225667ea 920 if (mult && vertex && vertex->GetNContributors() > 0 && (!vertex->IsFromVertexerZ() || vertex->GetDispersion() < 0.02) && TMath::Abs(vertex->GetZv()) < 5.5)
921 {
922 for (Int_t i=0; i<mult->GetNumberOfTracklets(); ++i)
923 {
924 if (TMath::Abs(mult->GetEta(i)) < 1)
925 {
926 decision = kTRUE;
927 break;
928 }
929 }
930 }
931 }
932
449618cd 933 // hadron level definition for TPC tracks
934
935 if (decision && (trigger & kOneTrack))
936 {
937 decision = kFALSE;
b256fde9 938 const AliESDVertex* vertex =0x0;
939 vertex = aEsd->GetPrimaryVertexTracks();
940 if (!vertex || vertex->GetNContributors() <= 0)
941 {
942 vertex = aEsd->GetPrimaryVertexSPD();
943 }
449618cd 944 Float_t ptmin, ptmax;
945 fEsdTrackCuts->GetPtRange(ptmin,ptmax);
946 AliDebug(3, Form("ptmin = %f, ptmax = %f\n",ptmin, ptmax));
947
948 if (vertex && vertex->GetNContributors() > 0 && (!vertex->IsFromVertexerZ() || vertex->GetDispersion() < 0.02) && TMath::Abs(vertex->GetZv()) < 10.) {
949 AliDebug(3,Form("Check on the vertex passed\n"));
950 for (Int_t i=0; i<aEsd->GetNumberOfTracks(); ++i){
52f3b98d 951 if (fTPCOnly == kFALSE){
952 if (fEsdTrackCuts->AcceptTrack(aEsd->GetTrack(i))){
953 AliDebug(2, Form("pt of track = %f --> check passed\n",aEsd->GetTrack(i)->Pt()));
954 decision = kTRUE;
955 break;
956 }
957 }
958 else {
959 // TPC only tracks
960 AliESDtrack *tpcTrack = fEsdTrackCuts->GetTPCOnlyTrack((AliESDEvent*)aEsd, i);
961 if (!tpcTrack){
962 AliDebug(3,Form("track %d is NOT a TPC track",i));
963 continue;
964 }
965 else{
966 AliDebug(3,Form("track %d IS a TPC track",i));
967 if (!(fEsdTrackCuts->AcceptTrack(tpcTrack))) {
968 AliDebug(2, Form("TPC track %d NOT ACCEPTED, pt = %f, eta = %f",i,tpcTrack->Pt(), tpcTrack->Eta()));
969 delete tpcTrack; tpcTrack = 0x0;
970 continue;
971 } // end if the TPC track is not accepted
972 else{
973 AliDebug(2, Form("TPC track %d ACCEPTED, pt = %f, eta = %f",i,tpcTrack->Pt(), tpcTrack->Eta()));
974 decision = kTRUE;
975 delete tpcTrack; tpcTrack = 0x0;
976 break;
977 } // end if the TPC track is accepted
978 } // end if it is a TPC track
979 } // end if you are looking at TPC only tracks
980 } // end loop on tracks
981 } // end check on vertex
449618cd 982 else{
983 AliDebug(4,Form("Check on the vertex not passed\n"));
984 for (Int_t i=0; i<aEsd->GetNumberOfTracks(); ++i){
985 if (fEsdTrackCuts->AcceptTrack(aEsd->GetTrack(i))){
986 AliDebug(4,Form("pt of track = %f --> check would be passed if the vertex was ok\n",aEsd->GetTrack(i)->Pt()));
987 break;
988 }
989 }
990 }
991 if (!decision) AliDebug(3,("Check for kOneTrack NOT passed\n"));
992 }
993
225667ea 994 return decision;
995}
70fdd197 996
997Bool_t AliTriggerAnalysis::IsTriggerClassFired(const AliESDEvent* aEsd, const Char_t* tclass) const
998{
999 // tclass is logical function of inputs, e.g. 01 && 02 || 03 && 11 && 21
1000 // = L0 inp 1 && L0 inp 2 || L0 inp 3 && L1 inp 1 && L2 inp 1
1001 // NO brackets in logical function !
1002 // Spaces between operators and inputs.
1003 // Not all logical functions are available in CTP=
1004 // =any function of first 4 inputs; 'AND' of other inputs, check not done
1005 // This method will be replaced/complemened by similar one
1006 // which works withh class and inputs names as in CTP cfg file
1007
1008 TString TClass(tclass);
1009 TObjArray* tcltokens = TClass.Tokenize(" ");
1010 Char_t level=((TObjString*)tcltokens->At(0))->String()[0];
1011 UInt_t input=atoi((((TObjString*)tcltokens->At(0))->String()).Remove(0));
1012 Bool_t tcl = IsInputFired(aEsd,level,input);
1013
1014 for (Int_t i=1;i<tcltokens->GetEntriesFast();i=i+2) {
1015 level=((TObjString*)tcltokens->At(i+1))->String()[0];
1016 input=atoi((((TObjString*)tcltokens->At(i+1))->String()).Remove(0));
1017 Bool_t inpnext = IsInputFired(aEsd,level,input);
1018 Char_t op =((TObjString*)tcltokens->At(i))->String()[0];
1019 if (op == '&') tcl=tcl && inpnext;
1020 else if (op == '|') tcl =tcl || inpnext;
1021 else {
1022 AliError(Form("Syntax error in %s", tclass));
8dec6e35 1023 delete tcltokens;
1024 tcltokens = 0;
1025 // tcltokens->Delete();
70fdd197 1026 return kFALSE;
1027 }
1028 }
8dec6e35 1029 delete tcltokens;
1030 tcltokens = 0;
1031 // tcltokens->Delete();
70fdd197 1032 return tcl;
1033}
1034
1035Bool_t AliTriggerAnalysis::IsInputFired(const AliESDEvent* aEsd, Char_t level, UInt_t input) const
1036{
1037 // Checks trigger input of any level
1038
1039 switch (level)
1040 {
1041 case '0': return IsL0InputFired(aEsd,input);
1042 case '1': return IsL1InputFired(aEsd,input);
1043 case '2': return IsL2InputFired(aEsd,input);
1044 default:
1045 AliError(Form("Wrong level %i",level));
1046 return kFALSE;
1047 }
1048}
1049
1050Bool_t AliTriggerAnalysis::IsL0InputFired(const AliESDEvent* aEsd, UInt_t input) const
1051{
1052 // Checks if corresponding bit in mask is on
1053
1054 UInt_t inpmask = aEsd->GetHeader()->GetL0TriggerInputs();
1055 return (inpmask & (1<<(input-1)));
1056}
1057
1058Bool_t AliTriggerAnalysis::IsL1InputFired(const AliESDEvent* aEsd, UInt_t input) const
1059{
1060 // Checks if corresponding bit in mask is on
1061
1062 UInt_t inpmask = aEsd->GetHeader()->GetL1TriggerInputs();
1063 return (inpmask & (1<<(input-1)));
1064}
1065
1066Bool_t AliTriggerAnalysis::IsL2InputFired(const AliESDEvent* aEsd, UInt_t input) const
1067{
1068 // Checks if corresponding bit in mask is on
1069
1070 UInt_t inpmask = aEsd->GetHeader()->GetL2TriggerInputs();
1071 return (inpmask & (1<<(input-1)));
1072}
1073
1074void AliTriggerAnalysis::FillHistograms(const AliESDEvent* aEsd)
ff8c4f30 1075{
907972ff 1076 // fills the histograms with the info from the ESD
1077
c2fff146 1078 fHistBitsSPD->Fill(SPDFiredChips(aEsd, 0), SPDFiredChips(aEsd, 1, kTRUE));
907972ff 1079
97fa3cbc 1080 V0Trigger(aEsd, kASide, kFALSE, kTRUE);
1081 V0Trigger(aEsd, kCSide, kFALSE, kTRUE);
559b5ed7 1082 T0Trigger(aEsd, kFALSE, kTRUE);
ce08cb1f 1083 ZDCTDCTrigger(aEsd,kASide,kFALSE,kFALSE,kTRUE);
102cfd12 1084 ZDCTimeTrigger(aEsd,kTRUE);
1ea7a921 1085 IsSPDClusterVsTrackletBG(aEsd, kTRUE);
ce08cb1f 1086
907972ff 1087 AliESDZDC* zdcData = aEsd->GetESDZDC();
1088 if (zdcData)
1089 {
1090 UInt_t quality = zdcData->GetESDQuality();
1091
1092 // from Nora's presentation, general first physics meeting 16.10.09
1093 static UInt_t zpc = 0x20;
1094 static UInt_t znc = 0x10;
1095 static UInt_t zem1 = 0x08;
1096 static UInt_t zem2 = 0x04;
1097 static UInt_t zpa = 0x02;
1098 static UInt_t zna = 0x01;
1099
15695e03 1100 fHistZDC->Fill(1, (quality & zna) ? 1 : 0);
1101 fHistZDC->Fill(2, (quality & zpa) ? 1 : 0);
1102 fHistZDC->Fill(3, (quality & zem2) ? 1 : 0);
1103 fHistZDC->Fill(4, (quality & zem1) ? 1 : 0);
1104 fHistZDC->Fill(5, (quality & znc) ? 1 : 0);
1105 fHistZDC->Fill(6, (quality & zpc) ? 1 : 0);
907972ff 1106 }
1107 else
1108 {
1109 fHistZDC->Fill(-1);
1110 AliError("AliESDZDC not available");
1111 }
1112
4011b280 1113 if (fDoFMD) {
1114 fHistFMDA->Fill(FMDHitCombinations(aEsd, kASide, kTRUE));
1115 fHistFMDC->Fill(FMDHitCombinations(aEsd, kCSide, kTRUE));
1116 }
907972ff 1117}
c01a136b 1118
1119void AliTriggerAnalysis::FillTriggerClasses(const AliESDEvent* aEsd)
1120{
1121 // fills trigger classes map
1122
1123 TParameter<Long64_t>* count = dynamic_cast<TParameter<Long64_t>*> (fTriggerClasses->GetValue(aEsd->GetFiredTriggerClasses().Data()));
1124 if (!count)
1125 {
1126 count = new TParameter<Long64_t>(aEsd->GetFiredTriggerClasses(), 0);
1127 fTriggerClasses->Add(new TObjString(aEsd->GetFiredTriggerClasses().Data()), count);
1128 }
1129 count->SetVal(count->GetVal() + 1);
c01a136b 1130}
907972ff 1131
85c71ba7 1132Int_t AliTriggerAnalysis::SSDClusters(const AliESDEvent* aEsd)
1133{
1134 // returns the number of clusters in the SSD
1135 const AliMultiplicity* mult = aEsd->GetMultiplicity();
1136 Int_t clusters = mult->GetNumberOfITSClusters(4)+mult->GetNumberOfITSClusters(5);
1137 return clusters;
1138}
1139
1140
29533987 1141Int_t AliTriggerAnalysis::SPDFiredChips(const AliESDEvent* aEsd, Int_t origin, Bool_t fillHists, Int_t layer)
907972ff 1142{
1143 // returns the number of fired chips in the SPD
90dc86e9 1144 //
1145 // origin = 0 --> aEsd->GetMultiplicity()->GetNumberOfFiredChips() (filled from clusters)
1146 // origin = 1 --> aEsd->GetMultiplicity()->TestFastOrFiredChips() (from hardware bits)
29533987 1147 // layer = 0 --> both layers
1148 // layer = 1 --> inner
1149 // layer = 2 --> outer
ff8c4f30 1150
ff8c4f30 1151 const AliMultiplicity* mult = aEsd->GetMultiplicity();
1152 if (!mult)
1153 {
1154 AliError("AliMultiplicity not available");
907972ff 1155 return -1;
ff8c4f30 1156 }
90dc86e9 1157
29533987 1158 if (origin == 0){
1159 if (layer == 0)
1160 return mult->GetNumberOfFiredChips(0) + mult->GetNumberOfFiredChips(1);
1161
1162 return mult->GetNumberOfFiredChips(layer-1);
1163 }
90dc86e9 1164
1165 if (origin == 1)
1166 {
1167 Int_t nChips = 0;
29533987 1168 Int_t firstChip = 0;
1169 Int_t lastChip = 1200;
1170 if(layer == 1)
1171 lastChip = 400;
1172 if(layer == 2)
1173 firstChip = 400;
1174
8dec6e35 1175 for (Int_t i=firstChip; i<lastChip; i++)
733f0542 1176 {
90dc86e9 1177 if (mult->TestFastOrFiredChips(i) == kTRUE)
c2fff146 1178 {
733f0542 1179 // efficiency simulation (if enabled)
1180 if (fSPDGFOEfficiency)
1181 {
1182 if (gRandom->Uniform() > fSPDGFOEfficiency->GetBinContent(i+1))
1183 continue;
1184 }
1185
90dc86e9 1186 nChips++;
61899827 1187 if (fillHists)
c2fff146 1188 fHistFiredBitsSPD->Fill(i);
1189 }
733f0542 1190 }
90dc86e9 1191 return nChips;
1192 }
1193
1194 return -1;
907972ff 1195}
1196
61899827 1197Bool_t AliTriggerAnalysis::SPDGFOTrigger(const AliESDEvent* aEsd, Int_t origin)
907972ff 1198{
1199 // Returns if the SPD gave a global Fast OR trigger
1200
c2fff146 1201 Int_t firedChips = SPDFiredChips(aEsd, origin);
ff8c4f30 1202
1203 if (firedChips >= fSPDGFOThreshold)
1204 return kTRUE;
1205 return kFALSE;
1206}
1207
1ea7a921 1208Bool_t AliTriggerAnalysis::IsSPDClusterVsTrackletBG(const AliESDEvent* aEsd, Bool_t fillHists){
1209 //rejects BG based on the cluster vs tracklet correlation
1210 // returns true if the event is BG
1211 const AliMultiplicity* mult = aEsd->GetMultiplicity();
1212 if (!mult){
1213 AliFatal("No multiplicity object"); // TODO: Should this be fatal?
1214 }
1215 Int_t ntracklet = mult->GetNumberOfTracklets();
1216
1217 Int_t spdClusters = 0;
1218 for(Int_t ilayer = 0; ilayer < 2; ilayer++){
1219 spdClusters += mult->GetNumberOfITSClusters(ilayer);
1220 }
1221
1222 if(fillHists) {
1223 fHistSPDClsVsTrk->Fill(ntracklet,spdClusters);
1224 }
1225
1226 Bool_t isCvsTOk = kFALSE;
1227 Float_t limit = Float_t(fASPDCvsTCut) + Float_t(ntracklet) * fBSPDCvsTCut;
1228 if (spdClusters > limit) isCvsTOk = kTRUE;
1229 else isCvsTOk = kFALSE ;
1230
1231 return isCvsTOk;
1232
1233}
1234
1235
97fa3cbc 1236AliTriggerAnalysis::V0Decision AliTriggerAnalysis::V0Trigger(const AliESDEvent* aEsd, AliceSide side, Bool_t online, Bool_t fillHists)
ff8c4f30 1237{
c01a136b 1238 // Returns the V0 trigger decision in V0A | V0C
1239 //
733f0542 1240 // Returns kV0Fake if the calculated average time is in a window where neither BB nor BG is expected.
1241 // The rate of such triggers can be used to estimate the background. Note that the rate has to be
1242 // rescaled with the size of the windows (numerical values see below in the code)
1243 //
97fa3cbc 1244 // argument 'online' is used as a switch between online and offline trigger algorithms
1245 //
733f0542 1246 // Based on an algorithm by Cvetan Cheshkov
b85bbd53 1247
c01a136b 1248 AliESDVZERO* esdV0 = aEsd->GetVZEROData();
1249 if (!esdV0)
ff8c4f30 1250 {
1251 AliError("AliESDVZERO not available");
c01a136b 1252 return kV0Invalid;
ff8c4f30 1253 }
b85bbd53 1254 AliDebug(2,Form("In V0Trigger: %f %f",esdV0->GetV0ATime(),esdV0->GetV0CTime()));
97fa3cbc 1255
b85bbd53 1256 Int_t begin = -1;
1257 Int_t end = -1;
1258
1259 if (side == kASide)
1260 {
1261 begin = 32;
1262 end = 64;
1263 }
1264 else if (side == kCSide)
1265 {
1266 begin = 0;
1267 end = 32;
1268 }
1269 else
1270 return kV0Invalid;
1271
1272 if (esdV0->TestBit(AliESDVZERO::kDecisionFilled)) {
988dd3a4 1273 if (online) {
b85bbd53 1274 if (esdV0->TestBit(AliESDVZERO::kOnlineBitsFilled)) {
1275 for (Int_t i = begin; i < end; ++i) {
1276 if (esdV0->GetBBFlag(i)) return kV0BB;
1277 }
1278 for (Int_t i = begin; i < end; ++i) {
1279 if (esdV0->GetBGFlag(i)) return kV0BG;
1280 }
1281 return kV0Empty;
1282 }
1283 else {
1284 AliWarning("V0 online trigger analysis is not yet available!");
1285 return kV0BB;
1286 }
988dd3a4 1287 }
1288 else {
1289
1290 if (fillHists) {
1291 if (side == kASide && fHistV0A)
1292 fHistV0A->Fill(esdV0->GetV0ATime());
1293 if (side == kCSide && fHistV0C)
1294 fHistV0C->Fill(esdV0->GetV0CTime());
1295 }
1296
1297 if (side == kASide) return (V0Decision)esdV0->GetV0ADecision();
1298 else if (side == kCSide) return (V0Decision)esdV0->GetV0CDecision();
1299 else return kV0Invalid;
1300 }
1301 }
1302
c01a136b 1303 Float_t time = 0;
bcd135ec 1304 Float_t weight = 0;
97fa3cbc 1305 if (fMC)
1306 {
1307 Int_t runRange;
1308 if (aEsd->GetRunNumber() <= 104803) runRange = 0;
1309 else if (aEsd->GetRunNumber() <= 104876) runRange = 1;
1310 else runRange = 2;
1311
1312 Float_t factors[3][64] = {
1313 // runs: 104792-104803
1314 {4.6,5.9,6.3,6.0,4.7,5.9,4.9,5.4,4.8,4.1,4.9,4.6,4.5,5.5,5.1,5.8,4.3,4.0,4.0,3.3,3.1,2.9,3.0,5.6,3.3,4.9,3.9,5.3,4.1,4.4,3.9,5.5,5.7,9.5,5.1,5.3,6.6,7.1,8.9,4.4,4.1,5.9,9.0,4.5,4.1,6.0,4.7,7.1,4.2,4.7,3.9,6.3,5.9,4.8,4.7,4.5,4.7,5.4,5.8,5.0,5.1,5.9,5.3,3.6},
1315 // runs: 104841-104876
1316 {4.6,4.8,4.9,4.8,4.3,4.9,4.4,4.5,4.6,5.0,4.7,4.6,4.7,4.6,4.6,5.5,4.7,4.5,4.7,5.0,6.5,7.6,5.3,4.9,5.5,4.8,4.6,4.9,4.5,4.5,4.6,4.9,5.7,9.8,4.9,5.2,7.1,7.1,8.1,4.4,4.0,6.0,8.3,4.6,4.2,5.6,4.6,6.4,4.4,4.7,4.5,6.5,6.0,4.7,4.5,4.4,4.8,5.5,5.9,5.3,5.0,5.7,5.1,3.6},
1317 // runs: 104890-92
1318 {4.7,5.2,4.8,5.0,4.4,5.0,4.4,4.6,4.6,4.5,4.4,4.6,4.5,4.6,4.8,5.5,4.8,4.5,4.4,4.3,5.4,7.7,5.6,5.0,5.4,4.3,4.5,4.8,4.5,4.5,4.6,5.3,5.7,9.6,4.9,5.4,6.1,7.2,8.6,4.4,4.0,5.4,8.8,4.4,4.2,5.8,4.7,6.7,4.3,4.7,4.0,6.1,6.0,4.9,4.8,4.6,4.7,5.2,5.7,5.0,5.0,5.8,5.3,3.6}
1319 };
1320 Float_t dA = 77.4 - 11.0;
1321 Float_t dC = 77.4 - 2.9;
1322 // Time misalignment
1323 Float_t timeShift[64] = {0.477957 , 0.0889999 , 0.757669 , 0.205439 , 0.239666 , -0.183705 , 0.442873 , -0.281366 , 0.260976 , 0.788995 , 0.974758 , 0.548532 , 0.495023 , 0.868472 , 0.661167 , 0.358307 , 0.221243 , 0.530179 , 1.26696 , 1.33082 , 1.27086 , 1.77133 , 1.10253 , 0.634806 , 2.14838 , 1.50212 , 1.59253 , 1.66122 , 1.16957 , 1.52056 , 1.47791 , 1.81905 , -1.94123 , -1.29124 , -2.16045 , -1.78939 , -3.11111 , -1.87178 , -1.57671 , -1.70311 , -1.81208 , -1.94475 , -2.53058 , -1.7042 , -2.08109 , -1.84416 , -0.61073 , -1.77145 , 0.16999 , -0.0585339 , 0.00401133 , 0.397726 , 0.851111 , 0.264187 , 0.59573 , -0.158263 , 0.584362 , 1.20835 , 0.927573 , 1.13895 , 0.64648 , 2.18747 , 1.68909 , 0.451194};
1324 Float_t dA2 = 2.8, dC2 = 3.3;
1325
1326 if (online) {
1327 for (Int_t i = begin; i < end; ++i) {
1328 Float_t tempAdc = esdV0->GetAdc(i)/factors[runRange][i];
1329 Float_t tempTime = (i >= 32) ? esdV0->GetTime(i)+dA+timeShift[i]+dA2 : esdV0->GetTime(i)+dC+timeShift[i]+dC2;
1330 if (esdV0->GetTime(i) >= 1e-6 &&
1331 tempTime > fV0HwWinLow && tempTime < fV0HwWinHigh &&
1332 tempAdc > fV0HwAdcThr)
1333 return kV0BB;
1334 }
1335 return kV0Empty;
1336 }
1337 else {
1338 for (Int_t i = begin; i < end; ++i) {
1339 Float_t tempAdc = esdV0->GetAdc(i)/factors[runRange][i];
1340 Float_t tempTime = (i >= 32) ? esdV0->GetTime(i)+dA : esdV0->GetTime(i)+dC;
1341 Float_t tempRawTime = (i >= 32) ? esdV0->GetTime(i)+dA+timeShift[i]+dA2 : esdV0->GetTime(i)+dC+timeShift[i]+dC2;
1342 if (esdV0->GetTime(i) >= 1e-6 &&
1343 tempRawTime < 125.0 &&
1344 tempAdc > fV0AdcThr) {
1345 weight += 1.0;
1346 time += tempTime;
1347 }
1348 }
1349 }
1350 }
1351 else {
8b16e464 1352 if (online) {
1353 for (Int_t i = begin; i < end; ++i) {
1354 if (esdV0->GetTime(i) >= 1e-6 &&
1355 esdV0->GetTime(i) > fV0HwWinLow && esdV0->GetTime(i) < fV0HwWinHigh &&
1356 esdV0->GetAdc(i) > fV0HwAdcThr)
1357 return kV0BB;
1358 }
1359 return kV0Empty;
1360 }
1361 else {
1362 for (Int_t i = begin; i < end; ++i) {
1363 if (esdV0->GetTime(i) > 1e-6 && esdV0->GetAdc(i) > fV0AdcThr) {
2078f478 1364 Float_t correctedTime = V0CorrectLeadingTime(i, esdV0->GetTime(i), esdV0->GetAdc(i),aEsd->GetRunNumber());
8b16e464 1365 Float_t timeWeight = V0LeadingTimeWeight(esdV0->GetAdc(i));
1366 time += correctedTime*timeWeight;
97fa3cbc 1367
8b16e464 1368 weight += timeWeight;
1369 }
97fa3cbc 1370 }
c01a136b 1371 }
1372 }
907972ff 1373
bcd135ec 1374 if (weight > 0)
1375 time /= weight;
90a4610a 1376 time += fV0TimeOffset;
c01a136b 1377
1378 if (fillHists)
1379 {
1380 if (side == kASide && fHistV0A)
1381 fHistV0A->Fill(time);
1382 if (side == kCSide && fHistV0C)
1383 fHistV0C->Fill(time);
1384 }
907972ff 1385
c01a136b 1386 if (side == kASide)
1387 {
6dc2503d 1388 if (time > 68 && time < 100)
c01a136b 1389 return kV0BB;
bcd135ec 1390 if (time > 54 && time < 57.5)
c01a136b 1391 return kV0BG;
6dc2503d 1392 if (time > 57.5 && time < 68)
733f0542 1393 return kV0Fake;
c01a136b 1394 }
907972ff 1395
c01a136b 1396 if (side == kCSide)
1397 {
6dc2503d 1398 if (time > 75.5 && time < 100)
c01a136b 1399 return kV0BB;
bcd135ec 1400 if (time > 69.5 && time < 73)
c01a136b 1401 return kV0BG;
733f0542 1402 if (time > 55 && time < 69.5)
1403 return kV0Fake;
c01a136b 1404 }
1405
1406 return kV0Empty;
1407}
1408
2078f478 1409Float_t AliTriggerAnalysis::V0CorrectLeadingTime(Int_t i, Float_t time, Float_t adc, Int_t runNumber) const
c01a136b 1410{
1411 // Correct for slewing and align the channels
1412 //
bcd135ec 1413 // Authors: Cvetan Cheshkov / Raphael Tieulent
c01a136b 1414
1415 if (time == 0) return 0;
1416
bcd135ec 1417 // Time alignment
1418 Float_t timeShift[64] = {0.477957 , 0.0889999 , 0.757669 , 0.205439 , 0.239666 , -0.183705 , 0.442873 , -0.281366 , 0.260976 , 0.788995 , 0.974758 , 0.548532 , 0.495023 , 0.868472 , 0.661167 , 0.358307 , 0.221243 , 0.530179 , 1.26696 , 1.33082 , 1.27086 , 1.77133 , 1.10253 , 0.634806 , 2.14838 , 1.50212 , 1.59253 , 1.66122 , 1.16957 , 1.52056 , 1.47791 , 1.81905 , -1.94123 , -1.29124 , -2.16045 , -1.78939 , -3.11111 , -1.87178 , -1.57671 , -1.70311 , -1.81208 , -1.94475 , -2.53058 , -1.7042 , -2.08109 , -1.84416 , -0.61073 , -1.77145 , 0.16999 , -0.0585339 , 0.00401133 , 0.397726 , 0.851111 , 0.264187 , 0.59573 , -0.158263 , 0.584362 , 1.20835 , 0.927573 , 1.13895 , 0.64648 , 2.18747 , 1.68909 , 0.451194};
1419
2078f478 1420 if(runNumber < 106031)
1421 time -= timeShift[i];
c01a136b 1422
1423 // Slewing correction
1424 if (adc == 0) return time;
1425
bcd135ec 1426 Float_t p1 = 1.57345e1;
1427 Float_t p2 =-4.25603e-1;
1428
2078f478 1429 if(runNumber >= 106031) adc *= (2.5/4.0);
bcd135ec 1430 return (time - p1*TMath::Power(adc,p2));
1431}
1432
1433Float_t AliTriggerAnalysis::V0LeadingTimeWeight(Float_t adc) const
1434{
1435 if (adc < 1e-6) return 0;
1436
1437 Float_t p1 = 40.211;
1438 Float_t p2 =-4.25603e-1;
1439 Float_t p3 = 0.5646;
1440
1441 return 1./(p1*p1*TMath::Power(adc,2.*(p2-1.))+p3*p3);
ff8c4f30 1442}
1443
ce08cb1f 1444
1445Bool_t AliTriggerAnalysis::ZDCTDCTrigger(const AliESDEvent* aEsd, AliceSide side, Bool_t useZN, Bool_t useZP, Bool_t fillHists) const
1446{
1447 // Returns if ZDC triggered, based on TDC information
1448
1449 AliESDZDC *esdZDC = aEsd->GetESDZDC();
1450
6a7f284a 1451 Bool_t zdcNA = kFALSE;
1452 Bool_t zdcNC = kFALSE;
1453 Bool_t zdcPA = kFALSE;
1454 Bool_t zdcPC = kFALSE;
1455
1456 if (fMC) {
1457 // If it's MC, we use the energy
1458 Double_t minEnergy = 0;
1459 Double_t zNCEnergy = esdZDC->GetZDCN1Energy();
1460 Double_t zPCEnergy = esdZDC->GetZDCP1Energy();
1461 Double_t zNAEnergy = esdZDC->GetZDCN2Energy();
1462 Double_t zPAEnergy = esdZDC->GetZDCP2Energy();
1463 zdcNA = (zNAEnergy>minEnergy);
1464 zdcNC = (zNCEnergy>minEnergy);
1465 zdcPA = (zPAEnergy>minEnergy);
1466 zdcPC = (zPCEnergy>minEnergy);
1467
1468 }
1469 else {
1470
1471 Bool_t tdc[32] = {kFALSE};
1472 for(Int_t itdc=0; itdc<32; itdc++){
1473 for(Int_t i=0; i<4; i++){
102cfd12 1474 if (esdZDC->GetZDCTDCData(itdc, i) != 0){
6a7f284a 1475 tdc[itdc] = kTRUE;
1476 }
ce08cb1f 1477 }
6a7f284a 1478 if(fillHists && tdc[itdc]) {
1479 fHistTDCZDC->Fill(itdc);
1480 }
ce08cb1f 1481 }
6a7f284a 1482 zdcNA = tdc[12];
1483 zdcNC = tdc[10];
1484 zdcPA = tdc[13];
1485 zdcPC = tdc[11];
ce08cb1f 1486 }
ce08cb1f 1487
1488 if (side == kASide) return ((useZP&&zdcPA) || (useZN&&zdcNA));
1489 if (side == kCSide) return ((useZP&&zdcPC) || (useZN&&zdcNC));
1490 return kFALSE;
1491}
1492
102cfd12 1493Bool_t AliTriggerAnalysis::ZDCTimeTrigger(const AliESDEvent *aEsd, Bool_t fillHists) const
1494{
1495 // This method implements a selection
1496 // based on the timing in both sides of zdcN
1497 // It can be used in order to eliminate
1498 // parasitic collisions
1499 Bool_t zdcAccept = kFALSE;
102cfd12 1500 AliESDZDC *esdZDC = aEsd->GetESDZDC();
1501
869f9767 1502 if(fMC) {
1503 UInt_t esdFlag = esdZDC->GetESDQuality();
1504
1505 Bool_t znaFired=kFALSE, zpaFired=kFALSE;
1506 Bool_t zem1Fired=kFALSE, zem2Fired=kFALSE;
1507 Bool_t zncFired=kFALSE, zpcFired=kFALSE;
1508 //
1509 // **** Trigger patterns
1510 if((esdFlag & 0x00000001) == 0x00000001) znaFired=kTRUE;
1511 if((esdFlag & 0x00000002) == 0x00000002) zpaFired=kTRUE;
1512 if((esdFlag & 0x00000004) == 0x00000004) zem1Fired=kTRUE;
1513 if((esdFlag & 0x00000008) == 0x00000008) zem2Fired=kTRUE;
1514 if((esdFlag & 0x00000010) == 0x00000010) zncFired=kTRUE;
1515 if((esdFlag & 0x00000020) == 0x00000020) zpcFired=kTRUE;
1516 zdcAccept = (znaFired | zncFired);
1517 }
1518 else {
869f9767 1519 for(Int_t i = 0; i < 4; ++i) {
1520 if (esdZDC->GetZDCTDCData(10,i) != 0) {
1521 Float_t tdcC = 0.025*(esdZDC->GetZDCTDCData(10,i)-esdZDC->GetZDCTDCData(14,i));
fcb18b05 1522 Float_t tdcCcorr = esdZDC->GetZDCTDCCorrected(10,i);
869f9767 1523 for(Int_t j = 0; j < 4; ++j) {
1524 if (esdZDC->GetZDCTDCData(12,j) != 0) {
1525 Float_t tdcA = 0.025*(esdZDC->GetZDCTDCData(12,j)-esdZDC->GetZDCTDCData(14,j));
7c55ebd9 1526
fcb18b05 1527 Float_t tdcAcorr = esdZDC->GetZDCTDCCorrected(12,j);
1528 if(fillHists) {
1529 fHistTimeZDC->Fill(tdcC-tdcA,tdcC+tdcA);
1530 fHistTimeCorrZDC->Fill(tdcCcorr-tdcAcorr,tdcCcorr+tdcAcorr);
1531 }
1532 if (esdZDC->TestBit(AliESDZDC::kCorrectedTDCFilled)) {
d6305a15 1533 if (((tdcCcorr-tdcAcorr-fZDCCutRefDeltaCorr)*(tdcCcorr-tdcAcorr-fZDCCutRefDeltaCorr)/(fZDCCutSigmaDeltaCorr*fZDCCutSigmaDeltaCorr) +
1534 (tdcCcorr+tdcAcorr-fZDCCutRefSumCorr)*(tdcCcorr+tdcAcorr-fZDCCutRefSumCorr)/(fZDCCutSigmaSumCorr*fZDCCutSigmaSumCorr))< 1.0)
fcb18b05 1535 zdcAccept = kTRUE;
1536 }
1537 else {
7c55ebd9 1538 if (((tdcC-tdcA-fZDCCutRefDelta)*(tdcC-tdcA-fZDCCutRefDelta)/(fZDCCutSigmaDelta*fZDCCutSigmaDelta) +
1539 (tdcC+tdcA-fZDCCutRefSum)*(tdcC+tdcA-fZDCCutRefSum)/(fZDCCutSigmaSum*fZDCCutSigmaSum))< 1.0)
fcb18b05 1540 zdcAccept = kTRUE;
1541 }
869f9767 1542 }
102cfd12 1543 }
1544 }
1545 }
1546 }
102cfd12 1547 return zdcAccept;
1548}
1549
0d12ffff 1550Bool_t AliTriggerAnalysis::ZDCTimeBGTrigger(const AliESDEvent *aEsd, AliceSide side) const
1551{
1552 // This method implements a selection
1553 // based on the timing in of zdcN
37c099e8 1554 // It can be used in order to flag background
1555 // ** So far only implemented for the 2012 pA run **
1556
1557 if(fMC) return kFALSE;
0d12ffff 1558
1559 AliESDZDC *zdcData = aEsd->GetESDZDC();
1560 Bool_t zna = kFALSE;
1561 Bool_t znc = kFALSE;
b68d0b5e 1562 Bool_t znabadhit = kFALSE;
1563 Bool_t zncbadhit = kFALSE;
0d12ffff 1564
1565 Float_t tdcC=999, tdcCcorr=999, tdcA=999, tdcAcorr=999;
1566 for(Int_t i = 0; i < 4; ++i) {
1567 if (zdcData->GetZDCTDCData(10,i) != 0) {
1568 znc = kTRUE;
1569 tdcC = 0.025*(zdcData->GetZDCTDCData(10,i)-zdcData->GetZDCTDCData(14,i));
1570 tdcCcorr = zdcData->GetZDCTDCCorrected(10,i);
b68d0b5e 1571 if((TMath::Abs(tdcCcorr)<fZDCCutZNCTimeCorrMax) && (TMath::Abs(tdcCcorr)>fZDCCutZNCTimeCorrMin)) zncbadhit = kTRUE;
0d12ffff 1572 }
1573 }
1574 for(Int_t j = 0; j < 4; ++j) {
1575 if (zdcData->GetZDCTDCData(12,j) != 0) {
1576 zna = kTRUE;
1577 tdcA = 0.025*(zdcData->GetZDCTDCData(12,j)-zdcData->GetZDCTDCData(14,j));
1578 tdcAcorr = zdcData->GetZDCTDCCorrected(12,j);
b68d0b5e 1579 if((TMath::Abs(tdcAcorr)<fZDCCutZNATimeCorrMax) && (TMath::Abs(tdcAcorr)>fZDCCutZNATimeCorrMin)) znabadhit = kTRUE;
0d12ffff 1580 }
1581 }
1582
1583 const Int_t runNumber = aEsd->GetRunNumber();
22bb9681 1584 if(runNumber<188124 || (runNumber>188374 && runNumber<194713)){ // FIXME: end of pA-run is not known
5ec5f893 1585 AliDebug(3,Form(" ZN BG time cut not implemented for run %d",runNumber));
0d12ffff 1586 return kFALSE;
1587 }
1588
b68d0b5e 1589 Bool_t znabg = (zna && znabadhit);
1590 Bool_t zncbg = (znc && zncbadhit);
0d12ffff 1591
1592 // Printf("Checking ZN background (time) for run %d, A = %d, time=%2.2f, C = %d, time=%2.2f",runNumber,(Int_t)zna,tdcAcorr,(Int_t)znc,tdcCcorr);
1593 // Printf("Checking ZN background (time) for run %d, A-BG = %d, C-BG = %d",runNumber,(Int_t)znabg,(Int_t)zncbg);
1594
1595 if (side == kASide) return znabg;
1596 if (side == kCSide) return zncbg;
1597 return kFALSE;
1598}
1599
70fdd197 1600Bool_t AliTriggerAnalysis::ZDCTrigger(const AliESDEvent* aEsd, AliceSide side) const
ff8c4f30 1601{
1602 // Returns if ZDC triggered
1603
c8d3e441 1604 AliESDZDC* zdcData = aEsd->GetESDZDC();
1605 if (!zdcData)
1606 {
1607 AliError("AliESDZDC not available");
1608 return kFALSE;
1609 }
1610
1611 UInt_t quality = zdcData->GetESDQuality();
1612
1613 // from Nora's presentation, general first physics meeting 16.10.09
1614 static UInt_t zpc = 0x20;
1615 static UInt_t znc = 0x10;
1616 static UInt_t zem1 = 0x08;
1617 static UInt_t zem2 = 0x04;
1618 static UInt_t zpa = 0x02;
1619 static UInt_t zna = 0x01;
1620
1621 if (side == kASide && ((quality & zpa) || (quality & zna)))
1622 return kTRUE;
1623 if (side == kCentralBarrel && ((quality & zem1) || (quality & zem2)))
1624 return kTRUE;
1625 if (side == kCSide && ((quality & zpc) || (quality & znc)))
1626 return kTRUE;
ff8c4f30 1627
1628 return kFALSE;
1629}
1630
61899827 1631Int_t AliTriggerAnalysis::FMDHitCombinations(const AliESDEvent* aEsd, AliceSide side, Bool_t fillHists)
ff8c4f30 1632{
907972ff 1633 // returns number of hit combinations agove threshold
7a11141c 1634 //
1635 // Authors: FMD team, Hans Dalsgaard (code merged from FMD/AliFMDOfflineTrigger)
ff8c4f30 1636
4011b280 1637 if (!fDoFMD)
1638 return -1;
1639
7a11141c 1640 // Workaround for AliESDEvent::GetFMDData is not const!
1641 const AliESDFMD* fmdData = (const_cast<AliESDEvent*>(aEsd))->GetFMDData();
1642 if (!fmdData)
1643 {
1644 AliError("AliESDFMD not available");
907972ff 1645 return -1;
7a11141c 1646 }
1647
1648 Int_t detFrom = (side == kASide) ? 1 : 3;
1649 Int_t detTo = (side == kASide) ? 2 : 3;
1650
907972ff 1651 Int_t triggers = 0;
7a11141c 1652 Float_t totalMult = 0;
1653 for (UShort_t det=detFrom;det<=detTo;det++) {
1654 Int_t nRings = (det == 1 ? 1 : 2);
1655 for (UShort_t ir = 0; ir < nRings; ir++) {
1656 Char_t ring = (ir == 0 ? 'I' : 'O');
1657 UShort_t nsec = (ir == 0 ? 20 : 40);
1658 UShort_t nstr = (ir == 0 ? 512 : 256);
039db886 1659 for (UShort_t sec =0; sec < nsec; sec++) {
1660 for (UShort_t strip = 0; strip < nstr; strip++) {
1661 Float_t mult = fmdData->Multiplicity(det,ring,sec,strip);
1662 if (mult == AliESDFMD::kInvalidMult) continue;
1663
61899827 1664 if (fillHists)
907972ff 1665 fHistFMDSingle->Fill(mult);
1666
039db886 1667 if (mult > fFMDLowCut)
1668 totalMult = totalMult + mult;
1669 else
907972ff 1670 {
1671 if (totalMult > fFMDHitCut)
1672 triggers++;
1673
61899827 1674 if (fillHists)
907972ff 1675 fHistFMDSum->Fill(totalMult);
1676
1677 totalMult = 0;
1678 }
039db886 1679 }
7a11141c 1680 }
1681 }
1682 }
907972ff 1683
1684 return triggers;
1685}
1686
61899827 1687Bool_t AliTriggerAnalysis::FMDTrigger(const AliESDEvent* aEsd, AliceSide side)
907972ff 1688{
1689 // Returns if the FMD triggered
1690 //
1691 // Authors: FMD team, Hans Dalsgaard (code merged from FMD/AliFMDOfflineTrigger)
1692
1693 Int_t triggers = FMDHitCombinations(aEsd, side, kFALSE);
1694
1695 if (triggers > 0)
1696 return kTRUE;
1697
ff8c4f30 1698 return kFALSE;
1699}
907972ff 1700
70fdd197 1701Long64_t AliTriggerAnalysis::Merge(TCollection* list)
907972ff 1702{
1703 // Merge a list of AliMultiplicityCorrection objects with this (needed for
1704 // PROOF).
1705 // Returns the number of merged objects (including this).
1706
1707 if (!list)
1708 return 0;
1709
1710 if (list->IsEmpty())
1711 return 1;
1712
1713 TIterator* iter = list->MakeIterator();
1714 TObject* obj;
1715
1716 // collections of all histograms
559b5ed7 1717 const Int_t nHists = 14;
907972ff 1718 TList collections[nHists];
1719
1720 Int_t count = 0;
1721 while ((obj = iter->Next())) {
1722
70fdd197 1723 AliTriggerAnalysis* entry = dynamic_cast<AliTriggerAnalysis*> (obj);
907972ff 1724 if (entry == 0)
1725 continue;
1726
c01a136b 1727 Int_t n = 0;
1728 collections[n++].Add(entry->fHistV0A);
1729 collections[n++].Add(entry->fHistV0C);
1730 collections[n++].Add(entry->fHistZDC);
ce08cb1f 1731 collections[n++].Add(entry->fHistTDCZDC);
102cfd12 1732 collections[n++].Add(entry->fHistTimeZDC);
fcb18b05 1733 collections[n++].Add(entry->fHistTimeCorrZDC);
c01a136b 1734 collections[n++].Add(entry->fHistFMDA);
1735 collections[n++].Add(entry->fHistFMDC);
1736 collections[n++].Add(entry->fHistFMDSingle);
1737 collections[n++].Add(entry->fHistFMDSum);
1738 collections[n++].Add(entry->fHistBitsSPD);
1739 collections[n++].Add(entry->fHistFiredBitsSPD);
1ea7a921 1740 collections[n++].Add(entry->fHistSPDClsVsTrk);
559b5ed7 1741 collections[n++].Add(entry->fHistT0);
c01a136b 1742
1743 // merge fTriggerClasses
1744 TIterator* iter2 = entry->fTriggerClasses->MakeIterator();
73dc876a 1745 TObjString* obj2 = 0;
1746 while ((obj2 = dynamic_cast<TObjString*> (iter2->Next())))
c01a136b 1747 {
c2a5a2b9 1748 TParameter<Long64_t>* param2 = static_cast<TParameter<Long64_t>*> (entry->fTriggerClasses->GetValue(obj2));
c01a136b 1749
73dc876a 1750 TParameter<Long64_t>* param1 = dynamic_cast<TParameter<Long64_t>*> (fTriggerClasses->GetValue(obj2));
c01a136b 1751 if (param1)
1752 {
1753 param1->SetVal(param1->GetVal() + param2->GetVal());
1754 }
1755 else
1756 {
1757 param1 = dynamic_cast<TParameter<Long64_t>*> (param2->Clone());
73dc876a 1758 fTriggerClasses->Add(new TObjString(obj2->String()), param1);
c01a136b 1759 }
1760 }
1761
1762 delete iter2;
1763
907972ff 1764 count++;
1765 }
1766
c01a136b 1767 Int_t n = 0;
1768 fHistV0A->Merge(&collections[n++]);
1769 fHistV0C->Merge(&collections[n++]);
1770 fHistZDC->Merge(&collections[n++]);
ce08cb1f 1771 fHistTDCZDC->Merge(&collections[n++]);
92b1d068 1772 if (fHistTimeZDC)
1773 fHistTimeZDC->Merge(&collections[n++]);
1774 else
1775 n++;
fcb18b05 1776 if (fHistTimeCorrZDC)
1777 fHistTimeCorrZDC->Merge(&collections[n++]);
1778 else
1779 n++;
c01a136b 1780 fHistFMDA->Merge(&collections[n++]);
1781 fHistFMDC->Merge(&collections[n++]);
1782 fHistFMDSingle->Merge(&collections[n++]);
1783 fHistFMDSum->Merge(&collections[n++]);
1784 fHistBitsSPD->Merge(&collections[n++]);
1785 fHistFiredBitsSPD->Merge(&collections[n++]);
1ea7a921 1786 fHistSPDClsVsTrk->Merge(&collections[n++]);
559b5ed7 1787 fHistT0->Merge(&collections[n++]);
907972ff 1788 delete iter;
1789
1790 return count+1;
1791}
1792
61899827 1793void AliTriggerAnalysis::SaveHistograms() const
907972ff 1794{
1795 // write histograms to current directory
1796
c01a136b 1797 if (!fHistBitsSPD)
907972ff 1798 return;
1799
d988bfb0 1800 if (fHistBitsSPD) {
1801 fHistBitsSPD->Write();
891c67bd 1802 //fHistBitsSPD->ProjectionX();
1803 //fHistBitsSPD->ProjectionY();
d988bfb0 1804 }
1805 else Printf("Cannot save fHistBitsSPD");
1806 if (fHistFiredBitsSPD) fHistFiredBitsSPD->Write();
1807 else Printf("Cannot save fHistFiredBitsSPD");
1808 if (fHistV0A) fHistV0A->Write();
1809 else Printf("Cannot save fHistV0A");
1810 if (fHistV0C) fHistV0C->Write();
1811 else Printf("Cannot save fHistV0C");
1812 if (fHistZDC) fHistZDC->Write();
1813 else Printf("Cannot save fHistZDC");
1814 if (fHistTDCZDC) fHistTDCZDC->Write();
1815 else Printf("Cannot save fHistTDCZDC");
1816 if (fHistTimeZDC) fHistTimeZDC->Write();
1817 else Printf("Cannot save fHistTimeZDC");
fcb18b05 1818 if (fHistTimeCorrZDC) fHistTimeCorrZDC->Write();
1819 else Printf("Cannot save fHistTimeCorrZDC");
d988bfb0 1820 if (fHistFMDA) fHistFMDA->Write();
1821 else Printf("Cannot save fHistFMDA");
1822 if (fHistFMDC) fHistFMDC->Write();
1823 else Printf("Cannot save fHistFMDC");
1824 if (fHistFMDSingle) fHistFMDSingle->Write();
1825 else Printf("Cannot save fHistFMDSingle");
1826 if (fHistFMDSum) fHistFMDSum->Write();
1827 else Printf("Cannot save fHistFMDSum");
1828 if (fSPDGFOEfficiency) fSPDGFOEfficiency->Write("fSPDGFOEfficiency");
1ea7a921 1829 if (fHistSPDClsVsTrk) fHistSPDClsVsTrk->Write("fHistSPDClsVsTrk");
559b5ed7 1830 if (fHistT0) fHistT0->Write("fHistT0");
1831
8dec6e35 1832 // else Printf("Cannot save fSPDGFOEfficiency");
733f0542 1833
c01a136b 1834 fTriggerClasses->Write("fTriggerClasses", TObject::kSingleKey);
1835}
1836
1837void AliTriggerAnalysis::PrintTriggerClasses() const
1838{
1839 // print trigger classes
1840
1841 Printf("Trigger Classes:");
1842
35fb1e58 1843 Printf("Event count for trigger combinations:");
1844
1845 TMap singleTrigger;
1846 singleTrigger.SetOwner();
1847
c01a136b 1848 TIterator* iter = fTriggerClasses->MakeIterator();
1849 TObjString* obj = 0;
1850 while ((obj = dynamic_cast<TObjString*> (iter->Next())))
1851 {
35fb1e58 1852 TParameter<Long64_t>* param = static_cast<TParameter<Long64_t>*> (fTriggerClasses->GetValue(obj));
1853
e8b839ab 1854 Printf(" %s: %ld triggers", obj->String().Data(), (Long_t)param->GetVal());
c01a136b 1855
35fb1e58 1856 TObjArray* tokens = obj->String().Tokenize(" ");
1857 for (Int_t i=0; i<tokens->GetEntries(); i++)
1858 {
1859 TParameter<Long64_t>* count = dynamic_cast<TParameter<Long64_t>*> (singleTrigger.GetValue(((TObjString*) tokens->At(i))->String().Data()));
1860 if (!count)
1861 {
1862 count = new TParameter<Long64_t>(((TObjString*) tokens->At(i))->String().Data(), 0);
1863 singleTrigger.Add(new TObjString(((TObjString*) tokens->At(i))->String().Data()), count);
1864 }
1865 count->SetVal(count->GetVal() + param->GetVal());
1866 }
1867
1868 delete tokens;
c01a136b 1869 }
35fb1e58 1870 delete iter;
1871
1872 Printf("Event count for single trigger:");
1873
1874 iter = singleTrigger.MakeIterator();
1875 while ((obj = dynamic_cast<TObjString*> (iter->Next())))
1876 {
1877 TParameter<Long64_t>* param = static_cast<TParameter<Long64_t>*> (singleTrigger.GetValue(obj));
1878
e8b839ab 1879 Printf(" %s: %ld triggers", obj->String().Data(), (Long_t)param->GetVal());
35fb1e58 1880 }
1881 delete iter;
1882
1883 singleTrigger.DeleteAll();
907972ff 1884}
7c55ebd9 1885
1886
559b5ed7 1887//----------------------------------------------------------------------------------------------------
1888AliTriggerAnalysis::T0Decision AliTriggerAnalysis::T0Trigger(const AliESDEvent* aEsd, Bool_t online, Bool_t fillHists)
1889{
1890 // Returns the T0 TVDC trigger decision
1891 //
1892 // argument 'online' is used as a switch between online and offline trigger algorithms
1893 // in online mode return 0TVX
1894 // in offline mode in addition check pile-up and background :
1895 // pile-up readed from ESD: check if TVDC (0TVX module name) has more 1 hit;
1896 // backgroud flag readed from ESD : check in given time interval OrA and OrC were correct but TVDC not
1897 //
1898 // Based on an algorithm by Alla Maevskaya
1899
1900 const AliESDTZERO* esdT0 = aEsd->GetESDTZERO();
1901 if (!esdT0)
1902 {
1903 AliError("AliESDTZERO not available");
1904 return kT0Invalid;
1905 }
1906 //???? AliDebug(2,Form("In T0Trigger: %f %f",esdV0->GetV0ATime(),esdV0->GetV0CTime()));
1907 Float_t tvdc[5] ;
1908 for (Int_t ii=0; ii<5; ii++)
1909 tvdc[ii] = esdT0->GetTVDC(ii);
68ed9ebd 1910 // Int_t trig=esdT0->GetT0Trig();
559b5ed7 1911 // cout<<" T0 trig "<<trig<<endl;
1912
1913 if(fillHists) fHistT0->Fill(tvdc[0]);
1914
1915 if (online) {
f56ee636 1916 if(aEsd->GetHeader()->GetFiredTriggerInputs().Contains("0TVX") ) return kT0BB;
559b5ed7 1917 }
1918 else {
1919
559b5ed7 1920 if (esdT0->GetPileupFlag()) return kT0DecPileup;
1921 if (esdT0->GetBackgroundFlag()) return kT0DecBG;
7d9295b3 1922 if (tvdc[0]>-5 && tvdc[0]<5 && tvdc[0] != 0) return kT0BB;
559b5ed7 1923 }
1924
1925 if (fMC)
7b00906b 1926 if( esdT0->GetT0zVertex()>-12.3 && esdT0->GetT0zVertex() < 10.3) return kT0BB;
559b5ed7 1927
1928 return kT0Empty;
1929}
8d5a14d6 1930
1931//----------------------------------------------------------------------------------------------------
1932Bool_t AliTriggerAnalysis::EMCALCellsTrigger(const AliESDEvent *aEsd)
1933{
1934 //
1935 // Returns the EMCAL trigger decision
1936 // so far only implemented for LHC11a data
1937 // see http://alisoft.cern.ch/viewvc/trunk/PWGGA/EMCALTasks/AliEmcalPhysicsSelection.cxx?view=markup&root=AliRoot Revision 56136
1938 //
1939
1940 Bool_t isFired = kTRUE;
1941 const Int_t runNumber = aEsd->GetRunNumber();
1942
1943 /*
1944 // Load EMCAL branches from the manager
1945 AliAnalysisManager *am = AliAnalysisManager::GetAnalysisManager();
1946 am->LoadBranch("EMCALCells.");
1947 am->LoadBranch("CaloClusters");
1948 */
1949
1950 // Get EMCAL cells
1951 AliVCaloCells *cells = aEsd->GetEMCALCells();
1952 const Short_t nCells = cells->GetNumberOfCells();
1953
1954 // count cells above threshold per sm
1955 Int_t nCellCount[10] = {0,0,0,0,0,0,0,0,0,0};
1956 for(Int_t iCell=0; iCell<nCells; ++iCell) {
1957 Short_t cellId = cells->GetCellNumber(iCell);
1958 Double_t cellE = cells->GetCellAmplitude(cellId);
1959 Int_t sm = cellId / (24*48);
1960 if (cellE>0.1)
1961 ++nCellCount[sm];
1962 }
1963
1964 // Trigger decision for LHC11a
1965 Bool_t isLedEvent = kFALSE;
1966 if ((runNumber>=144871) && (runNumber<=146860)) {
1967 if (nCellCount[4] > 100)
1968 isLedEvent = kTRUE;
1969 else {
1970 if ((runNumber>=146858) && (runNumber<=146860)) {
1971 if (nCellCount[3]>=35)
1972 isLedEvent = kTRUE;
1973 }
1974 }
1975 }
1976
1977 if (isLedEvent) {
1978 isFired = kFALSE;
1979 }
1980
1981 return isFired;
1982}
b68d0b5e 1983
1984//__________________________________________________________________________________________
1985Bool_t AliTriggerAnalysis::TRDTrigger(const AliESDEvent *esd, Trigger trigger)
1986{
1987 // evaluate the TRD trigger conditions,
1988 // so far HCO, HSE, HQU, HJT, HEE
1989
1990 Bool_t isFired = kFALSE;
1991
1992 if(trigger!=kTRDHCO && trigger!=kTRDHJT && trigger!=kTRDHSE && trigger!=kTRDHQU && trigger!=kTRDHEE) {
1993 AliWarning("Beware you are erroneously trying to use this function (wrong trigger)");
1994 return isFired;
1995 }
1996
1997 if (!esd) {
1998 AliErrorClass("ESD event pointer is null");
1999 return isFired;
2000 }
2001
2002 Int_t nTrdTracks = esd->GetNumberOfTrdTracks();
2003
2004 if (nTrdTracks > 0 && (trigger==kTRDHCO) ) {
2005 isFired = kTRUE;
2006 return isFired;
2007 }
2008
2009 if(trigger!=kTRDHJT) {
2010 for (Int_t iTrack = 0; iTrack < nTrdTracks; ++iTrack) {
2011
2012 AliESDTrdTrack *trdTrack = esd->GetTrdTrack(iTrack);
2013 if (!trdTrack) continue;
33561da5 2014
b68d0b5e 2015 // for the electron triggers we only consider matched tracks
2016 if(trigger==kTRDHQU)
2017 if ( (TMath::Abs(trdTrack->Pt()) > fTRDptHQU) && (trdTrack->GetPID() > fTRDpidHQU) ) {
2018 isFired = kTRUE;
2019 return isFired;
2020 }
2021
2022 if(trigger==kTRDHSE)
2023 if ( (TMath::Abs(trdTrack->Pt()) > fTRDptHSE) && (trdTrack->GetPID() > fTRDpidHSE) ) {
2024 isFired = kTRUE;
2025 return isFired;
2026 }
2027
2028 if(trigger==kTRDHEE)
2029 if ( (trdTrack->GetSector() >= fTRDminSectorHEE) && (trdTrack->GetSector() <= fTRDmaxSectorHEE) &&
2030 (TMath::Abs(trdTrack->Pt()) > fTRDptHSE) && (trdTrack->GetPID() > fTRDpidHSE) ) {
2031 isFired = kTRUE;
2032 return isFired;
2033 }
2034
2035 }
2036 } else if(trigger==kTRDHJT) {
2037
2038 Int_t nTracks[90] = { 0 }; // stack-wise counted number of tracks above pt threshold
2039
2040 for (Int_t iTrack = 0; iTrack < nTrdTracks; ++iTrack) {
2041
2042 AliESDTrdTrack *trdTrack = esd->GetTrdTrack(iTrack);
2043 if (!trdTrack) continue;
2044
2045 Int_t globalStack = 5*trdTrack->GetSector() + trdTrack->GetStack();
2046
2047 // stack-wise counting of tracks above pt threshold for jet trigger
2048 if (TMath::Abs(trdTrack->GetPt()) >= fTRDptHJT) {
2049 ++nTracks[globalStack];
2050 }
2051 }
2052
2053 // check if HJT condition is fulfilled in any stack
2054 for (Int_t iStack = 0; iStack < 90; iStack++) {
2055 if (nTracks[iStack] >= fTRDnHJT) {
2056 isFired = kTRUE;
2057 break;
2058 }
2059 }
2060
2061 }
2062
2063 return isFired;
2064}