1 /* $Id: AliTriggerAnalysis.cxx 35782 2009-10-22 11:54:31Z jgrosseo $ */
3 /**************************************************************************
4 * Copyright(c) 1998-2009, ALICE Experiment at CERN, All rights reserved. *
6 * Author: The ALICE Off-line Project. *
7 * Contributors are mentioned in the code where appropriate. *
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 **************************************************************************/
18 //-------------------------------------------------------------------------
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
22 // Origin: Jan Fiete Grosse-Oetringhaus, CERN
23 //-------------------------------------------------------------------------
25 #include <Riostream.h>
29 #include <TIterator.h>
30 #include "TParameter.h"
34 #include <AliTriggerAnalysis.h>
37 #include <AliAnalysisManager.h>
39 #include <AliESDEvent.h>
41 #include <AliMultiplicity.h>
42 #include <AliESDVZERO.h>
43 #include <AliESDZDC.h>
44 #include <AliESDFMD.h>
45 #include <AliESDVertex.h>
46 #include <AliESDtrackCuts.h>
48 #include <AliESDTrdTrack.h>
50 ClassImp(AliTriggerAnalysis)
52 AliTriggerAnalysis::AliTriggerAnalysis() :
60 fZDCCutRefSum(-568.5),
61 fZDCCutRefDelta(-2.1),
62 fZDCCutSigmaSum(3.25),
63 fZDCCutSigmaDelta(2.25),
64 fZDCCutRefSumCorr(-65.5),
65 fZDCCutRefDeltaCorr(-2.1),
66 fZDCCutSigmaSumCorr(6.0),
67 fZDCCutSigmaDeltaCorr(1.2),
68 fZDCCutZNATimeCorrMin(0.0),
69 fZDCCutZNATimeCorrMax(2.0),
70 fZDCCutZNCTimeCorrMin(0.0),
71 fZDCCutZNCTimeCorrMax(5.0),
109 AliTriggerAnalysis::~AliTriggerAnalysis()
119 if (fHistFiredBitsSPD)
121 delete fHistFiredBitsSPD;
122 fHistFiredBitsSPD = 0;
125 if (fHistSPDClsVsTrk)
127 delete fHistSPDClsVsTrk;
128 fHistSPDClsVsTrk = 0;
158 if (fHistTimeCorrZDC)
160 delete fHistTimeCorrZDC;
161 fHistTimeCorrZDC = 0;
178 delete fHistFMDSingle;
196 fTriggerClasses->DeleteAll();
197 delete fTriggerClasses;
202 delete fEsdTrackCuts;
207 void AliTriggerAnalysis::EnableHistograms(Bool_t isLowFlux)
209 // creates the monitoring histograms (dynamical range of histograms can be adapted for pp and pPb via isLowFlux flag)
211 // do not add this hists to the directory
212 Bool_t oldStatus = TH1::AddDirectoryStatus();
213 TH1::AddDirectory(kFALSE);
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);
218 fHistFiredBitsSPD = new TH1F("fHistFiredBitsSPD", "SPD GFO Hardware;chip number;events", 1200, -0.5, 1199.5);
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; n tracklets; n clusters", nBinsX, -0.5, xMax, nBinsY, -0.5, yMax);
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);
228 fHistZDC = new TH1F("fHistZDC", "ZDC;trigger bits;events", 8, -1.5, 6.5);
229 fHistTDCZDC = new TH1F("fHistTDCZDC", "ZDC;TDC bits;events", 32, -0.5, 32-0.5);
230 fHistTimeZDC = new TH2F("fHistTimeZDC", "ZDC;TDC timing A+C vs C-A; events", 120,-30,30,120,-600,-540);
231 fHistTimeCorrZDC = new TH2F("fHistTimeCorrZDC", "ZDC;Corrected TDC timing A+C vs C-A; events", 120,-30,30,260,-100,30);
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);
238 fHistT0 = new TH1F("fHistT0", "T0;time (ns);events", 100, -25, 25);
240 fTriggerClasses = new TMap;
241 fTriggerClasses->SetOwner();
243 TH1::AddDirectory(oldStatus);
246 //____________________________________________________________________
247 const char* AliTriggerAnalysis::GetTriggerName(Trigger trigger)
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]
254 UInt_t triggerNoFlags = (UInt_t) trigger % (UInt_t) kStartOfFlags;
256 switch (triggerNoFlags)
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;
263 case kSPDGFOBits : str = "SPD GFO Bits"; break;
264 case kSPDGFOL0 : str = "SPD GFO L0 (first layer)"; break;
265 case kSPDGFOL1 : str = "SPD GFO L1 (second layer)"; break;
266 case kSPDClsVsTrkBG : str = "Cluster vs Tracklets"; break;
267 case kV0A : str = "V0 A BB"; break;
268 case kV0C : str = "V0 C BB"; break;
269 case kV0OR : str = "V0 OR BB"; break;
270 case kV0AND : str = "V0 AND BB"; break;
271 case kV0ABG : str = "V0 A BG"; break;
272 case kV0CBG : str = "V0 C BG"; break;
273 case kZDC : str = "ZDC"; break;
274 case kZDCA : str = "ZDC A"; break;
275 case kZDCC : str = "ZDC C"; break;
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;
280 case kFMDA : str = "FMD A"; break;
281 case kFMDC : str = "FMD C"; break;
282 case kFPANY : str = "SPD GFO | V0 | ZDC | FMD"; break;
283 case kNSD1 : str = "NSD1"; break;
284 case kMB1Prime: str = "MB1prime"; break;
285 case kZDCTDCA : str = "ZDC TDC A"; break;
286 case kZDCTDCC : str = "ZDC TDC C"; break;
287 case kZDCTime : str = "ZDC Time Cut"; break;
288 case kCentral : str = "V0 Central"; break;
289 case kSemiCentral : str = "V0 Semi-central"; break;
290 case kEMCAL : str = "EMCAL"; break;
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;
296 default: str = ""; break;
299 if (trigger & kOfflineFlag)
302 if (trigger & kOneParticle)
303 str += " OneParticle";
305 if (trigger & kOneTrack)
311 Bool_t AliTriggerAnalysis::IsTriggerFired(const AliESDEvent* aEsd, Trigger trigger)
313 // checks if an event has been triggered
315 if (trigger & kOfflineFlag)
316 return IsOfflineTriggerFired(aEsd, trigger);
318 return IsTriggerBitFired(aEsd, trigger);
321 Bool_t AliTriggerAnalysis::IsTriggerBitFired(const AliESDEvent* aEsd, Trigger trigger) const
323 // checks if an event is fired using the trigger bits
325 return IsTriggerBitFired(aEsd->GetTriggerMask(), trigger);
328 Bool_t AliTriggerAnalysis::IsTriggerBitFired(ULong64_t triggerMask, Trigger trigger) const
330 // checks if an event is fired using the trigger bits
332 // this function needs the branch TriggerMask in the ESD
334 // definitions from p-p.cfg
335 ULong64_t spdFO = (1 << 14);
336 ULong64_t v0left = (1 << 10);
337 ULong64_t v0right = (1 << 11);
348 if (triggerMask & spdFO || ((triggerMask & v0left) || (triggerMask & v0right)))
354 if (triggerMask & spdFO && ((triggerMask & v0left) || (triggerMask & v0right)))
360 if (triggerMask & spdFO && (triggerMask & v0left) && (triggerMask & v0right))
366 if (triggerMask & spdFO)
371 Printf("IsEventTriggered: ERROR: Trigger type %d not implemented in this method", (Int_t) trigger);
378 Bool_t AliTriggerAnalysis::IsTriggerBitFired(const AliESDEvent* aEsd, ULong64_t tclass) const
380 // Checks if corresponding bit in mask is on
382 ULong64_t trigmask = aEsd->GetTriggerMask();
383 return (trigmask & (1ull << (tclass-1)));
386 Int_t AliTriggerAnalysis::EvaluateTrigger(const AliESDEvent* aEsd, Trigger trigger)
388 // evaluates a given trigger "offline"
389 // trigger combinations are not supported, for that see IsOfflineTriggerFired
391 UInt_t triggerNoFlags = (UInt_t) trigger % (UInt_t) kStartOfFlags;
392 Bool_t offline = kFALSE;
393 if (trigger & kOfflineFlag)
397 switch (triggerNoFlags)
401 decision = SPDFiredChips(aEsd, (offline) ? 0 : 1);
406 decision = SPDFiredChips(aEsd, (offline) ? 0 : 1, kFALSE, 1);
411 decision = SPDFiredChips(aEsd, (offline) ? 0 : 1, kFALSE, 2);
417 AliFatal(Form("Online trigger not available for trigger %d", triggerNoFlags));
418 decision = IsSPDClusterVsTrackletBG(aEsd);
423 if (V0Trigger(aEsd, kASide, !offline) == kV0BB)
429 if (V0Trigger(aEsd, kCSide, !offline) == kV0BB)
435 if (V0Trigger(aEsd, kASide, !offline) == kV0BG)
441 if (V0Trigger(aEsd, kCSide, !offline) == kV0BG)
447 if (T0Trigger(aEsd, !offline) == kT0BB)
454 AliFatal(Form("Online trigger not available for trigger %d", triggerNoFlags));
455 if (T0Trigger(aEsd, !offline) == kT0DecBG)
462 AliFatal(Form("Online trigger not available for trigger %d", triggerNoFlags));
463 if (T0Trigger(aEsd, !offline) == kT0DecPileup)
470 AliFatal(Form("Online trigger not available for trigger %d", triggerNoFlags));
471 if (ZDCTrigger(aEsd, kASide))
478 AliFatal(Form("Online trigger not available for trigger %d", triggerNoFlags));
479 if (ZDCTrigger(aEsd, kCSide))
486 AliFatal(Form("Online trigger not available for trigger %d", triggerNoFlags));
487 if (ZDCTDCTrigger(aEsd, kASide))
494 AliFatal(Form("Online trigger not available for trigger %d", triggerNoFlags));
495 if (ZDCTDCTrigger(aEsd, kCSide))
502 AliFatal(Form("Online trigger not available for trigger %d", triggerNoFlags));
503 if (ZDCTimeTrigger(aEsd))
510 AliFatal(Form("Online trigger not available for trigger %d", triggerNoFlags));
511 if (ZDCTDCTrigger(aEsd,kASide,kTRUE,kFALSE,kFALSE))
518 AliFatal(Form("Online trigger not available for trigger %d", triggerNoFlags));
519 if (ZDCTDCTrigger(aEsd,kCSide,kTRUE,kFALSE,kFALSE))
526 AliFatal(Form("Online trigger not available for trigger %d", triggerNoFlags));
527 if (ZDCTimeBGTrigger(aEsd,kASide))
534 AliFatal(Form("Online trigger not available for trigger %d", triggerNoFlags));
535 if (ZDCTimeBGTrigger(aEsd,kCSide))
542 AliFatal(Form("Online trigger not available for trigger %d", triggerNoFlags));
543 if (FMDTrigger(aEsd, kASide))
550 AliFatal(Form("Online trigger not available for trigger %d", triggerNoFlags));
551 if (FMDTrigger(aEsd, kCSide))
558 AliFatal(Form("Offline trigger not available for trigger %d", triggerNoFlags));
559 if (IsL0InputFired(aEsd, 2))
566 AliFatal(Form("Offline trigger not available for trigger %d", triggerNoFlags));
567 if (IsL0InputFired(aEsd, 3))
571 case kTPCLaserWarmUp:
574 AliFatal(Form("Online trigger not available for trigger %d", triggerNoFlags));
575 return IsLaserWarmUpTPCEvent(aEsd);
580 AliFatal(Form("Online trigger not available for trigger %d", triggerNoFlags));
581 return IsHVdipTPCEvent(aEsd);
583 case kIncompleteEvent:
586 AliFatal(Form("Online trigger not available for trigger %d", triggerNoFlags));
587 return IsIncompleteEvent(aEsd);
592 AliFatal(Form("Offline trigger not available for trigger %d - use centrality selection", triggerNoFlags));
593 if (aEsd->GetVZEROData()) {
594 if (aEsd->GetVZEROData()->TestBit(AliESDVZERO::kTriggerChargeBitsFilled)) {
595 if (aEsd->GetVZEROData()->GetTriggerBits() & (1<<AliESDVZERO::kCTA2andCTC2))
599 AliWarning("V0 centrality trigger bits were not filled!");
606 AliFatal(Form("Offline trigger not available for trigger %d - use centrality selection", triggerNoFlags));
607 if (aEsd->GetVZEROData()) {
608 if (aEsd->GetVZEROData()->TestBit(AliESDVZERO::kTriggerChargeBitsFilled)) {
609 if (aEsd->GetVZEROData()->GetTriggerBits() & (1<<AliESDVZERO::kCTA1andCTC1))
613 AliWarning("V0 centrality trigger bits were not filled!");
620 AliFatal(Form("Online trigger not available for trigger %d", triggerNoFlags));
621 if (EMCALCellsTrigger(aEsd))
628 AliFatal(Form("Online trigger not available for trigger %d", triggerNoFlags));
629 if(TRDTrigger(aEsd,kTRDHCO))
636 AliFatal(Form("Online trigger not available for trigger %d", triggerNoFlags));
637 if(TRDTrigger(aEsd,kTRDHJT))
644 AliFatal(Form("Online trigger not available for trigger %d", triggerNoFlags));
645 if(TRDTrigger(aEsd,kTRDHSE))
652 AliFatal(Form("Online trigger not available for trigger %d", triggerNoFlags));
653 if(TRDTrigger(aEsd,kTRDHQU))
660 AliFatal(Form("Online trigger not available for trigger %d", triggerNoFlags));
661 if(TRDTrigger(aEsd,kTRDHEE))
667 AliFatal(Form("Trigger type %d not implemented", triggerNoFlags));
674 Bool_t AliTriggerAnalysis::IsLaserWarmUpTPCEvent(const AliESDEvent* esd)
677 // This function flags noisy TPC events which can happen during laser warm-up.
680 Int_t trackCounter = 0;
681 for (Int_t i=0; i<esd->GetNumberOfTracks(); ++i)
683 AliESDtrack *track = esd->GetTrack(i);
687 if (track->GetTPCNcls() < 30) continue;
688 if (TMath::Abs(track->Eta()) > 0.005) continue;
689 if (track->Pt() < 4) continue;
690 if (track->GetKinkIndex(0) > 0) continue;
692 UInt_t status = track->GetStatus();
693 if ((status&AliESDtrack::kITSrefit)==AliESDtrack::kITSrefit) continue; // explicitly ask for tracks without ITS refit
694 if ((status&AliESDtrack::kTPCrefit)!=AliESDtrack::kTPCrefit) continue;
696 if (track->GetTPCsignal() > 10) continue; // explicitly ask for tracks without dE/dx
700 if (trackCounter > 15)
705 Bool_t AliTriggerAnalysis::IsHVdipTPCEvent(const AliESDEvent* esd) {
707 // This function flags events in which the TPC chamber HV is not at its nominal value
709 if (fMC) return kFALSE; // there are no dip events in MC
710 if (!esd->IsDetectorOn(AliDAQ::kTPC)) return kTRUE;
715 Bool_t AliTriggerAnalysis::IsIncompleteEvent(const AliESDEvent* esd)
718 // Check whether the event is incomplete
719 // (due to DAQ-HLT issues, it could be only part of the event was saved)
721 if (fMC) return kFALSE; // there are no incomplete events on MC
722 if ((esd->GetEventType() == 7) &&
723 (esd->GetDAQDetectorPattern() & (1<<4)) &&
724 !(esd->GetDAQAttributes() & (1<<7))) return kTRUE;
730 Bool_t AliTriggerAnalysis::IsOfflineTriggerFired(const AliESDEvent* aEsd, Trigger trigger)
732 // checks if an event has been triggered "offline"
734 UInt_t triggerNoFlags = (UInt_t) trigger % (UInt_t) kStartOfFlags;
736 Bool_t decision = kFALSE;
737 switch (triggerNoFlags)
746 if (SPDGFOTrigger(aEsd, 0) || V0Trigger(aEsd, kASide, kFALSE) == kV0BB || V0Trigger(aEsd, kCSide, kFALSE) == kV0BB)
752 if (SPDGFOTrigger(aEsd, 0) && (V0Trigger(aEsd, kASide, kFALSE) == kV0BB || V0Trigger(aEsd, kCSide, kFALSE) == kV0BB))
758 if (SPDGFOTrigger(aEsd, 0) && V0Trigger(aEsd, kASide, kFALSE) == kV0BB && V0Trigger(aEsd, kCSide, kFALSE) == kV0BB)
764 if (SPDGFOTrigger(aEsd, 0))
770 if (SPDGFOTrigger(aEsd, 1))
776 if (V0Trigger(aEsd, kASide, kFALSE) == kV0BB)
782 if (V0Trigger(aEsd, kCSide, kFALSE) == kV0BB)
788 if (V0Trigger(aEsd, kASide, kFALSE) == kV0BB || V0Trigger(aEsd, kCSide, kFALSE) == kV0BB)
794 if (V0Trigger(aEsd, kASide, kFALSE) == kV0BB && V0Trigger(aEsd, kCSide, kFALSE) == kV0BB)
800 if (V0Trigger(aEsd, kASide, kFALSE) == kV0BG)
806 if (V0Trigger(aEsd, kCSide, kFALSE) == kV0BG)
812 if (ZDCTrigger(aEsd, kASide) || ZDCTrigger(aEsd, kCentralBarrel) || ZDCTrigger(aEsd, kCSide))
818 if (ZDCTrigger(aEsd, kASide))
824 if (ZDCTrigger(aEsd, kCSide))
830 if (ZDCTDCTrigger(aEsd,kASide,kTRUE,kFALSE,kFALSE))
836 if (ZDCTDCTrigger(aEsd,kCSide,kTRUE,kFALSE,kFALSE))
842 if (ZDCTimeBGTrigger(aEsd,kASide))
848 if (ZDCTimeBGTrigger(aEsd,kCSide))
854 if (FMDTrigger(aEsd, kASide))
860 if (FMDTrigger(aEsd, kCSide))
866 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))
872 if (SPDFiredChips(aEsd, 0) >= 5 || (V0Trigger(aEsd, kASide, kFALSE) == kV0BB && V0Trigger(aEsd, kCSide, kFALSE) == kV0BB))
879 if (SPDGFOTrigger(aEsd, 0))
881 if (V0Trigger(aEsd, kASide, kFALSE) == kV0BB)
883 if (V0Trigger(aEsd, kCSide, kFALSE) == kV0BB)
893 if (EMCALCellsTrigger(aEsd))
899 if(TRDTrigger(aEsd,kTRDHCO))
905 if(TRDTrigger(aEsd,kTRDHJT))
911 if(TRDTrigger(aEsd,kTRDHSE))
917 if(TRDTrigger(aEsd,kTRDHQU))
923 if(TRDTrigger(aEsd,kTRDHEE))
929 AliFatal(Form("Trigger type %d not implemented", triggerNoFlags));
933 // hadron-level requirement
934 if (decision && (trigger & kOneParticle))
938 const AliESDVertex* vertex = aEsd->GetPrimaryVertexSPD();
939 const AliMultiplicity* mult = aEsd->GetMultiplicity();
941 if (mult && vertex && vertex->GetNContributors() > 0 && (!vertex->IsFromVertexerZ() || vertex->GetDispersion() < 0.02) && TMath::Abs(vertex->GetZv()) < 5.5)
943 for (Int_t i=0; i<mult->GetNumberOfTracklets(); ++i)
945 if (TMath::Abs(mult->GetEta(i)) < 1)
954 // hadron level definition for TPC tracks
956 if (decision && (trigger & kOneTrack))
959 const AliESDVertex* vertex =0x0;
960 vertex = aEsd->GetPrimaryVertexTracks();
961 if (!vertex || vertex->GetNContributors() <= 0)
963 vertex = aEsd->GetPrimaryVertexSPD();
965 Float_t ptmin, ptmax;
966 fEsdTrackCuts->GetPtRange(ptmin,ptmax);
967 AliDebug(3, Form("ptmin = %f, ptmax = %f\n",ptmin, ptmax));
969 if (vertex && vertex->GetNContributors() > 0 && (!vertex->IsFromVertexerZ() || vertex->GetDispersion() < 0.02) && TMath::Abs(vertex->GetZv()) < 10.) {
970 AliDebug(3,Form("Check on the vertex passed\n"));
971 for (Int_t i=0; i<aEsd->GetNumberOfTracks(); ++i){
972 if (fTPCOnly == kFALSE){
973 if (fEsdTrackCuts->AcceptTrack(aEsd->GetTrack(i))){
974 AliDebug(2, Form("pt of track = %f --> check passed\n",aEsd->GetTrack(i)->Pt()));
981 AliESDtrack *tpcTrack = fEsdTrackCuts->GetTPCOnlyTrack((AliESDEvent*)aEsd, i);
983 AliDebug(3,Form("track %d is NOT a TPC track",i));
987 AliDebug(3,Form("track %d IS a TPC track",i));
988 if (!(fEsdTrackCuts->AcceptTrack(tpcTrack))) {
989 AliDebug(2, Form("TPC track %d NOT ACCEPTED, pt = %f, eta = %f",i,tpcTrack->Pt(), tpcTrack->Eta()));
990 delete tpcTrack; tpcTrack = 0x0;
992 } // end if the TPC track is not accepted
994 AliDebug(2, Form("TPC track %d ACCEPTED, pt = %f, eta = %f",i,tpcTrack->Pt(), tpcTrack->Eta()));
996 delete tpcTrack; tpcTrack = 0x0;
998 } // end if the TPC track is accepted
999 } // end if it is a TPC track
1000 } // end if you are looking at TPC only tracks
1001 } // end loop on tracks
1002 } // end check on vertex
1004 AliDebug(4,Form("Check on the vertex not passed\n"));
1005 for (Int_t i=0; i<aEsd->GetNumberOfTracks(); ++i){
1006 if (fEsdTrackCuts->AcceptTrack(aEsd->GetTrack(i))){
1007 AliDebug(4,Form("pt of track = %f --> check would be passed if the vertex was ok\n",aEsd->GetTrack(i)->Pt()));
1012 if (!decision) AliDebug(3,("Check for kOneTrack NOT passed\n"));
1018 Bool_t AliTriggerAnalysis::IsTriggerClassFired(const AliESDEvent* aEsd, const Char_t* tclass) const
1020 // tclass is logical function of inputs, e.g. 01 && 02 || 03 && 11 && 21
1021 // = L0 inp 1 && L0 inp 2 || L0 inp 3 && L1 inp 1 && L2 inp 1
1022 // NO brackets in logical function !
1023 // Spaces between operators and inputs.
1024 // Not all logical functions are available in CTP=
1025 // =any function of first 4 inputs; 'AND' of other inputs, check not done
1026 // This method will be replaced/complemened by similar one
1027 // which works withh class and inputs names as in CTP cfg file
1029 TString TClass(tclass);
1030 TObjArray* tcltokens = TClass.Tokenize(" ");
1031 Char_t level=((TObjString*)tcltokens->At(0))->String()[0];
1032 UInt_t input=atoi((((TObjString*)tcltokens->At(0))->String()).Remove(0));
1033 Bool_t tcl = IsInputFired(aEsd,level,input);
1035 for (Int_t i=1;i<tcltokens->GetEntriesFast();i=i+2) {
1036 level=((TObjString*)tcltokens->At(i+1))->String()[0];
1037 input=atoi((((TObjString*)tcltokens->At(i+1))->String()).Remove(0));
1038 Bool_t inpnext = IsInputFired(aEsd,level,input);
1039 Char_t op =((TObjString*)tcltokens->At(i))->String()[0];
1040 if (op == '&') tcl=tcl && inpnext;
1041 else if (op == '|') tcl =tcl || inpnext;
1043 AliError(Form("Syntax error in %s", tclass));
1046 // tcltokens->Delete();
1052 // tcltokens->Delete();
1056 Bool_t AliTriggerAnalysis::IsInputFired(const AliESDEvent* aEsd, Char_t level, UInt_t input) const
1058 // Checks trigger input of any level
1062 case '0': return IsL0InputFired(aEsd,input);
1063 case '1': return IsL1InputFired(aEsd,input);
1064 case '2': return IsL2InputFired(aEsd,input);
1066 AliError(Form("Wrong level %i",level));
1071 Bool_t AliTriggerAnalysis::IsL0InputFired(const AliESDEvent* aEsd, UInt_t input) const
1073 // Checks if corresponding bit in mask is on
1075 UInt_t inpmask = aEsd->GetHeader()->GetL0TriggerInputs();
1076 return (inpmask & (1<<(input-1)));
1079 Bool_t AliTriggerAnalysis::IsL1InputFired(const AliESDEvent* aEsd, UInt_t input) const
1081 // Checks if corresponding bit in mask is on
1083 UInt_t inpmask = aEsd->GetHeader()->GetL1TriggerInputs();
1084 return (inpmask & (1<<(input-1)));
1087 Bool_t AliTriggerAnalysis::IsL2InputFired(const AliESDEvent* aEsd, UInt_t input) const
1089 // Checks if corresponding bit in mask is on
1091 UInt_t inpmask = aEsd->GetHeader()->GetL2TriggerInputs();
1092 return (inpmask & (1<<(input-1)));
1095 void AliTriggerAnalysis::FillHistograms(const AliESDEvent* aEsd)
1097 // fills the histograms with the info from the ESD
1099 fHistBitsSPD->Fill(SPDFiredChips(aEsd, 0), SPDFiredChips(aEsd, 1, kTRUE));
1101 V0Trigger(aEsd, kASide, kFALSE, kTRUE);
1102 V0Trigger(aEsd, kCSide, kFALSE, kTRUE);
1103 T0Trigger(aEsd, kFALSE, kTRUE);
1104 ZDCTDCTrigger(aEsd,kASide,kFALSE,kFALSE,kTRUE);
1105 ZDCTimeTrigger(aEsd,kTRUE);
1106 IsSPDClusterVsTrackletBG(aEsd, kTRUE);
1108 AliESDZDC* zdcData = aEsd->GetESDZDC();
1111 UInt_t quality = zdcData->GetESDQuality();
1113 // from Nora's presentation, general first physics meeting 16.10.09
1114 static UInt_t zpc = 0x20;
1115 static UInt_t znc = 0x10;
1116 static UInt_t zem1 = 0x08;
1117 static UInt_t zem2 = 0x04;
1118 static UInt_t zpa = 0x02;
1119 static UInt_t zna = 0x01;
1121 fHistZDC->Fill(1, (quality & zna) ? 1 : 0);
1122 fHistZDC->Fill(2, (quality & zpa) ? 1 : 0);
1123 fHistZDC->Fill(3, (quality & zem2) ? 1 : 0);
1124 fHistZDC->Fill(4, (quality & zem1) ? 1 : 0);
1125 fHistZDC->Fill(5, (quality & znc) ? 1 : 0);
1126 fHistZDC->Fill(6, (quality & zpc) ? 1 : 0);
1131 AliError("AliESDZDC not available");
1135 fHistFMDA->Fill(FMDHitCombinations(aEsd, kASide, kTRUE));
1136 fHistFMDC->Fill(FMDHitCombinations(aEsd, kCSide, kTRUE));
1140 void AliTriggerAnalysis::FillTriggerClasses(const AliESDEvent* aEsd)
1142 // fills trigger classes map
1144 TParameter<Long64_t>* count = dynamic_cast<TParameter<Long64_t>*> (fTriggerClasses->GetValue(aEsd->GetFiredTriggerClasses().Data()));
1147 count = new TParameter<Long64_t>(aEsd->GetFiredTriggerClasses(), 0);
1148 fTriggerClasses->Add(new TObjString(aEsd->GetFiredTriggerClasses().Data()), count);
1150 count->SetVal(count->GetVal() + 1);
1153 Int_t AliTriggerAnalysis::SSDClusters(const AliESDEvent* aEsd)
1155 // returns the number of clusters in the SSD
1156 const AliMultiplicity* mult = aEsd->GetMultiplicity();
1157 Int_t clusters = mult->GetNumberOfITSClusters(4)+mult->GetNumberOfITSClusters(5);
1162 Int_t AliTriggerAnalysis::SPDFiredChips(const AliESDEvent* aEsd, Int_t origin, Bool_t fillHists, Int_t layer)
1164 // returns the number of fired chips in the SPD
1166 // origin = 0 --> aEsd->GetMultiplicity()->GetNumberOfFiredChips() (filled from clusters)
1167 // origin = 1 --> aEsd->GetMultiplicity()->TestFastOrFiredChips() (from hardware bits)
1168 // layer = 0 --> both layers
1169 // layer = 1 --> inner
1170 // layer = 2 --> outer
1172 const AliMultiplicity* mult = aEsd->GetMultiplicity();
1175 AliError("AliMultiplicity not available");
1181 return mult->GetNumberOfFiredChips(0) + mult->GetNumberOfFiredChips(1);
1183 return mult->GetNumberOfFiredChips(layer-1);
1189 Int_t firstChip = 0;
1190 Int_t lastChip = 1200;
1196 for (Int_t i=firstChip; i<lastChip; i++)
1198 if (mult->TestFastOrFiredChips(i) == kTRUE)
1200 // efficiency simulation (if enabled)
1201 if (fSPDGFOEfficiency)
1203 if (gRandom->Uniform() > fSPDGFOEfficiency->GetBinContent(i+1))
1209 fHistFiredBitsSPD->Fill(i);
1218 Bool_t AliTriggerAnalysis::SPDGFOTrigger(const AliESDEvent* aEsd, Int_t origin)
1220 // Returns if the SPD gave a global Fast OR trigger
1222 Int_t firedChips = SPDFiredChips(aEsd, origin);
1224 if (firedChips >= fSPDGFOThreshold)
1229 Bool_t AliTriggerAnalysis::IsSPDClusterVsTrackletBG(const AliESDEvent* aEsd, Bool_t fillHists){
1230 //rejects BG based on the cluster vs tracklet correlation
1231 // returns true if the event is BG
1232 const AliMultiplicity* mult = aEsd->GetMultiplicity();
1234 AliFatal("No multiplicity object"); // TODO: Should this be fatal?
1236 Int_t ntracklet = mult->GetNumberOfTracklets();
1238 Int_t spdClusters = 0;
1239 for(Int_t ilayer = 0; ilayer < 2; ilayer++){
1240 spdClusters += mult->GetNumberOfITSClusters(ilayer);
1244 fHistSPDClsVsTrk->Fill(ntracklet,spdClusters);
1247 Bool_t isCvsTOk = kFALSE;
1248 Float_t limit = Float_t(fASPDCvsTCut) + Float_t(ntracklet) * fBSPDCvsTCut;
1249 if (spdClusters > limit) isCvsTOk = kTRUE;
1250 else isCvsTOk = kFALSE ;
1257 AliTriggerAnalysis::V0Decision AliTriggerAnalysis::V0Trigger(const AliESDEvent* aEsd, AliceSide side, Bool_t online, Bool_t fillHists)
1259 // Returns the V0 trigger decision in V0A | V0C
1261 // Returns kV0Fake if the calculated average time is in a window where neither BB nor BG is expected.
1262 // The rate of such triggers can be used to estimate the background. Note that the rate has to be
1263 // rescaled with the size of the windows (numerical values see below in the code)
1265 // argument 'online' is used as a switch between online and offline trigger algorithms
1267 // Based on an algorithm by Cvetan Cheshkov
1269 AliESDVZERO* esdV0 = aEsd->GetVZEROData();
1272 AliError("AliESDVZERO not available");
1275 AliDebug(2,Form("In V0Trigger: %f %f",esdV0->GetV0ATime(),esdV0->GetV0CTime()));
1285 else if (side == kCSide)
1293 if (esdV0->TestBit(AliESDVZERO::kDecisionFilled)) {
1295 if (esdV0->TestBit(AliESDVZERO::kOnlineBitsFilled)) {
1296 for (Int_t i = begin; i < end; ++i) {
1297 if (esdV0->GetBBFlag(i)) return kV0BB;
1299 for (Int_t i = begin; i < end; ++i) {
1300 if (esdV0->GetBGFlag(i)) return kV0BG;
1305 AliWarning("V0 online trigger analysis is not yet available!");
1312 if (side == kASide && fHistV0A)
1313 fHistV0A->Fill(esdV0->GetV0ATime());
1314 if (side == kCSide && fHistV0C)
1315 fHistV0C->Fill(esdV0->GetV0CTime());
1318 if (side == kASide) return (V0Decision)esdV0->GetV0ADecision();
1319 else if (side == kCSide) return (V0Decision)esdV0->GetV0CDecision();
1320 else return kV0Invalid;
1329 if (aEsd->GetRunNumber() <= 104803) runRange = 0;
1330 else if (aEsd->GetRunNumber() <= 104876) runRange = 1;
1333 Float_t factors[3][64] = {
1334 // runs: 104792-104803
1335 {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},
1336 // runs: 104841-104876
1337 {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},
1339 {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}
1341 Float_t dA = 77.4 - 11.0;
1342 Float_t dC = 77.4 - 2.9;
1343 // Time misalignment
1344 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};
1345 Float_t dA2 = 2.8, dC2 = 3.3;
1348 for (Int_t i = begin; i < end; ++i) {
1349 Float_t tempAdc = esdV0->GetAdc(i)/factors[runRange][i];
1350 Float_t tempTime = (i >= 32) ? esdV0->GetTime(i)+dA+timeShift[i]+dA2 : esdV0->GetTime(i)+dC+timeShift[i]+dC2;
1351 if (esdV0->GetTime(i) >= 1e-6 &&
1352 tempTime > fV0HwWinLow && tempTime < fV0HwWinHigh &&
1353 tempAdc > fV0HwAdcThr)
1359 for (Int_t i = begin; i < end; ++i) {
1360 Float_t tempAdc = esdV0->GetAdc(i)/factors[runRange][i];
1361 Float_t tempTime = (i >= 32) ? esdV0->GetTime(i)+dA : esdV0->GetTime(i)+dC;
1362 Float_t tempRawTime = (i >= 32) ? esdV0->GetTime(i)+dA+timeShift[i]+dA2 : esdV0->GetTime(i)+dC+timeShift[i]+dC2;
1363 if (esdV0->GetTime(i) >= 1e-6 &&
1364 tempRawTime < 125.0 &&
1365 tempAdc > fV0AdcThr) {
1374 for (Int_t i = begin; i < end; ++i) {
1375 if (esdV0->GetTime(i) >= 1e-6 &&
1376 esdV0->GetTime(i) > fV0HwWinLow && esdV0->GetTime(i) < fV0HwWinHigh &&
1377 esdV0->GetAdc(i) > fV0HwAdcThr)
1383 for (Int_t i = begin; i < end; ++i) {
1384 if (esdV0->GetTime(i) > 1e-6 && esdV0->GetAdc(i) > fV0AdcThr) {
1385 Float_t correctedTime = V0CorrectLeadingTime(i, esdV0->GetTime(i), esdV0->GetAdc(i),aEsd->GetRunNumber());
1386 Float_t timeWeight = V0LeadingTimeWeight(esdV0->GetAdc(i));
1387 time += correctedTime*timeWeight;
1389 weight += timeWeight;
1397 time += fV0TimeOffset;
1401 if (side == kASide && fHistV0A)
1402 fHistV0A->Fill(time);
1403 if (side == kCSide && fHistV0C)
1404 fHistV0C->Fill(time);
1409 if (time > 68 && time < 100)
1411 if (time > 54 && time < 57.5)
1413 if (time > 57.5 && time < 68)
1419 if (time > 75.5 && time < 100)
1421 if (time > 69.5 && time < 73)
1423 if (time > 55 && time < 69.5)
1430 Float_t AliTriggerAnalysis::V0CorrectLeadingTime(Int_t i, Float_t time, Float_t adc, Int_t runNumber) const
1432 // Correct for slewing and align the channels
1434 // Authors: Cvetan Cheshkov / Raphael Tieulent
1436 if (time == 0) return 0;
1439 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};
1441 if(runNumber < 106031)
1442 time -= timeShift[i];
1444 // Slewing correction
1445 if (adc == 0) return time;
1447 Float_t p1 = 1.57345e1;
1448 Float_t p2 =-4.25603e-1;
1450 if(runNumber >= 106031) adc *= (2.5/4.0);
1451 return (time - p1*TMath::Power(adc,p2));
1454 Float_t AliTriggerAnalysis::V0LeadingTimeWeight(Float_t adc) const
1456 if (adc < 1e-6) return 0;
1458 Float_t p1 = 40.211;
1459 Float_t p2 =-4.25603e-1;
1460 Float_t p3 = 0.5646;
1462 return 1./(p1*p1*TMath::Power(adc,2.*(p2-1.))+p3*p3);
1466 Bool_t AliTriggerAnalysis::ZDCTDCTrigger(const AliESDEvent* aEsd, AliceSide side, Bool_t useZN, Bool_t useZP, Bool_t fillHists) const
1468 // Returns if ZDC triggered, based on TDC information
1470 AliESDZDC *esdZDC = aEsd->GetESDZDC();
1472 Bool_t zdcNA = kFALSE;
1473 Bool_t zdcNC = kFALSE;
1474 Bool_t zdcPA = kFALSE;
1475 Bool_t zdcPC = kFALSE;
1478 // If it's MC, we use the energy
1479 Double_t minEnergy = 0;
1480 Double_t zNCEnergy = esdZDC->GetZDCN1Energy();
1481 Double_t zPCEnergy = esdZDC->GetZDCP1Energy();
1482 Double_t zNAEnergy = esdZDC->GetZDCN2Energy();
1483 Double_t zPAEnergy = esdZDC->GetZDCP2Energy();
1484 zdcNA = (zNAEnergy>minEnergy);
1485 zdcNC = (zNCEnergy>minEnergy);
1486 zdcPA = (zPAEnergy>minEnergy);
1487 zdcPC = (zPCEnergy>minEnergy);
1492 Bool_t tdc[32] = {kFALSE};
1493 for(Int_t itdc=0; itdc<32; itdc++){
1494 for(Int_t i=0; i<4; i++){
1495 if (esdZDC->GetZDCTDCData(itdc, i) != 0){
1499 if(fillHists && tdc[itdc]) {
1500 fHistTDCZDC->Fill(itdc);
1509 if (side == kASide) return ((useZP&&zdcPA) || (useZN&&zdcNA));
1510 if (side == kCSide) return ((useZP&&zdcPC) || (useZN&&zdcNC));
1514 Bool_t AliTriggerAnalysis::ZDCTimeTrigger(const AliESDEvent *aEsd, Bool_t fillHists) const
1516 // This method implements a selection
1517 // based on the timing in both sides of zdcN
1518 // It can be used in order to eliminate
1519 // parasitic collisions
1520 Bool_t zdcAccept = kFALSE;
1521 AliESDZDC *esdZDC = aEsd->GetESDZDC();
1524 UInt_t esdFlag = esdZDC->GetESDQuality();
1526 Bool_t znaFired=kFALSE, zpaFired=kFALSE;
1527 Bool_t zem1Fired=kFALSE, zem2Fired=kFALSE;
1528 Bool_t zncFired=kFALSE, zpcFired=kFALSE;
1530 // **** Trigger patterns
1531 if((esdFlag & 0x00000001) == 0x00000001) znaFired=kTRUE;
1532 if((esdFlag & 0x00000002) == 0x00000002) zpaFired=kTRUE;
1533 if((esdFlag & 0x00000004) == 0x00000004) zem1Fired=kTRUE;
1534 if((esdFlag & 0x00000008) == 0x00000008) zem2Fired=kTRUE;
1535 if((esdFlag & 0x00000010) == 0x00000010) zncFired=kTRUE;
1536 if((esdFlag & 0x00000020) == 0x00000020) zpcFired=kTRUE;
1537 zdcAccept = (znaFired | zncFired);
1540 for(Int_t i = 0; i < 4; ++i) {
1541 if (esdZDC->GetZDCTDCData(10,i) != 0) {
1542 Float_t tdcC = 0.025*(esdZDC->GetZDCTDCData(10,i)-esdZDC->GetZDCTDCData(14,i));
1543 Float_t tdcCcorr = esdZDC->GetZDCTDCCorrected(10,i);
1544 for(Int_t j = 0; j < 4; ++j) {
1545 if (esdZDC->GetZDCTDCData(12,j) != 0) {
1546 Float_t tdcA = 0.025*(esdZDC->GetZDCTDCData(12,j)-esdZDC->GetZDCTDCData(14,j));
1548 Float_t tdcAcorr = esdZDC->GetZDCTDCCorrected(12,j);
1550 fHistTimeZDC->Fill(tdcC-tdcA,tdcC+tdcA);
1551 fHistTimeCorrZDC->Fill(tdcCcorr-tdcAcorr,tdcCcorr+tdcAcorr);
1553 if (esdZDC->TestBit(AliESDZDC::kCorrectedTDCFilled)) {
1554 if (((tdcCcorr-tdcAcorr-fZDCCutRefDeltaCorr)*(tdcCcorr-tdcAcorr-fZDCCutRefDeltaCorr)/(fZDCCutSigmaDeltaCorr*fZDCCutSigmaDeltaCorr) +
1555 (tdcCcorr+tdcAcorr-fZDCCutRefSumCorr)*(tdcCcorr+tdcAcorr-fZDCCutRefSumCorr)/(fZDCCutSigmaSumCorr*fZDCCutSigmaSumCorr))< 1.0)
1559 if (((tdcC-tdcA-fZDCCutRefDelta)*(tdcC-tdcA-fZDCCutRefDelta)/(fZDCCutSigmaDelta*fZDCCutSigmaDelta) +
1560 (tdcC+tdcA-fZDCCutRefSum)*(tdcC+tdcA-fZDCCutRefSum)/(fZDCCutSigmaSum*fZDCCutSigmaSum))< 1.0)
1571 Bool_t AliTriggerAnalysis::ZDCTimeBGTrigger(const AliESDEvent *aEsd, AliceSide side) const
1573 // This method implements a selection
1574 // based on the timing in of zdcN
1575 // It can be used in order to flag background
1576 // ** So far only implemented for the 2012 pA run **
1578 if(fMC) return kFALSE;
1580 AliESDZDC *zdcData = aEsd->GetESDZDC();
1581 Bool_t zna = kFALSE;
1582 Bool_t znc = kFALSE;
1583 Bool_t znabadhit = kFALSE;
1584 Bool_t zncbadhit = kFALSE;
1586 // Float_t tdcC=999, tdcA=999;
1587 Float_t tdcCcorr=999, tdcAcorr=999;
1588 for(Int_t i = 0; i < 4; ++i) {
1589 if (zdcData->GetZDCTDCData(10,i) != 0) {
1591 // tdcC = 0.025*(zdcData->GetZDCTDCData(10,i)-zdcData->GetZDCTDCData(14,i));
1592 tdcCcorr = zdcData->GetZDCTDCCorrected(10,i);
1593 if((TMath::Abs(tdcCcorr)<fZDCCutZNCTimeCorrMax) && (TMath::Abs(tdcCcorr)>fZDCCutZNCTimeCorrMin)) zncbadhit = kTRUE;
1596 for(Int_t j = 0; j < 4; ++j) {
1597 if (zdcData->GetZDCTDCData(12,j) != 0) {
1599 // tdcA = 0.025*(zdcData->GetZDCTDCData(12,j)-zdcData->GetZDCTDCData(14,j));
1600 tdcAcorr = zdcData->GetZDCTDCCorrected(12,j);
1601 if((TMath::Abs(tdcAcorr)<fZDCCutZNATimeCorrMax) && (TMath::Abs(tdcAcorr)>fZDCCutZNATimeCorrMin)) znabadhit = kTRUE;
1605 const Int_t runNumber = aEsd->GetRunNumber();
1606 if(runNumber<188124 || (runNumber>188374 && runNumber<194713)){ // FIXME: end of pA-run is not known
1607 AliDebug(3,Form(" ZN BG time cut not implemented for run %d",runNumber));
1611 Bool_t znabg = (zna && znabadhit);
1612 Bool_t zncbg = (znc && zncbadhit);
1614 // 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);
1615 // Printf("Checking ZN background (time) for run %d, A-BG = %d, C-BG = %d",runNumber,(Int_t)znabg,(Int_t)zncbg);
1617 if (side == kASide) return znabg;
1618 if (side == kCSide) return zncbg;
1622 Bool_t AliTriggerAnalysis::ZDCTrigger(const AliESDEvent* aEsd, AliceSide side) const
1624 // Returns if ZDC triggered
1626 AliESDZDC* zdcData = aEsd->GetESDZDC();
1629 AliError("AliESDZDC not available");
1633 UInt_t quality = zdcData->GetESDQuality();
1635 // from Nora's presentation, general first physics meeting 16.10.09
1636 static UInt_t zpc = 0x20;
1637 static UInt_t znc = 0x10;
1638 static UInt_t zem1 = 0x08;
1639 static UInt_t zem2 = 0x04;
1640 static UInt_t zpa = 0x02;
1641 static UInt_t zna = 0x01;
1643 if (side == kASide && ((quality & zpa) || (quality & zna)))
1645 if (side == kCentralBarrel && ((quality & zem1) || (quality & zem2)))
1647 if (side == kCSide && ((quality & zpc) || (quality & znc)))
1653 Int_t AliTriggerAnalysis::FMDHitCombinations(const AliESDEvent* aEsd, AliceSide side, Bool_t fillHists)
1655 // returns number of hit combinations agove threshold
1657 // Authors: FMD team, Hans Dalsgaard (code merged from FMD/AliFMDOfflineTrigger)
1662 // Workaround for AliESDEvent::GetFMDData is not const!
1663 const AliESDFMD* fmdData = (const_cast<AliESDEvent*>(aEsd))->GetFMDData();
1666 AliError("AliESDFMD not available");
1670 Int_t detFrom = (side == kASide) ? 1 : 3;
1671 Int_t detTo = (side == kASide) ? 2 : 3;
1674 Float_t totalMult = 0;
1675 for (UShort_t det=detFrom;det<=detTo;det++) {
1676 Int_t nRings = (det == 1 ? 1 : 2);
1677 for (UShort_t ir = 0; ir < nRings; ir++) {
1678 Char_t ring = (ir == 0 ? 'I' : 'O');
1679 UShort_t nsec = (ir == 0 ? 20 : 40);
1680 UShort_t nstr = (ir == 0 ? 512 : 256);
1681 for (UShort_t sec =0; sec < nsec; sec++) {
1682 for (UShort_t strip = 0; strip < nstr; strip++) {
1683 Float_t mult = fmdData->Multiplicity(det,ring,sec,strip);
1684 if (mult == AliESDFMD::kInvalidMult) continue;
1687 fHistFMDSingle->Fill(mult);
1689 if (mult > fFMDLowCut)
1690 totalMult = totalMult + mult;
1693 if (totalMult > fFMDHitCut)
1697 fHistFMDSum->Fill(totalMult);
1709 Bool_t AliTriggerAnalysis::FMDTrigger(const AliESDEvent* aEsd, AliceSide side)
1711 // Returns if the FMD triggered
1713 // Authors: FMD team, Hans Dalsgaard (code merged from FMD/AliFMDOfflineTrigger)
1715 Int_t triggers = FMDHitCombinations(aEsd, side, kFALSE);
1723 Long64_t AliTriggerAnalysis::Merge(TCollection* list)
1725 // Merge a list of AliMultiplicityCorrection objects with this (needed for
1727 // Returns the number of merged objects (including this).
1732 if (list->IsEmpty())
1735 TIterator* iter = list->MakeIterator();
1738 // collections of all histograms
1739 const Int_t nHists = 14;
1740 TList collections[nHists];
1743 while ((obj = iter->Next())) {
1745 AliTriggerAnalysis* entry = dynamic_cast<AliTriggerAnalysis*> (obj);
1750 collections[n++].Add(entry->fHistV0A);
1751 collections[n++].Add(entry->fHistV0C);
1752 collections[n++].Add(entry->fHistZDC);
1753 collections[n++].Add(entry->fHistTDCZDC);
1754 collections[n++].Add(entry->fHistTimeZDC);
1755 collections[n++].Add(entry->fHistTimeCorrZDC);
1756 collections[n++].Add(entry->fHistFMDA);
1757 collections[n++].Add(entry->fHistFMDC);
1758 collections[n++].Add(entry->fHistFMDSingle);
1759 collections[n++].Add(entry->fHistFMDSum);
1760 collections[n++].Add(entry->fHistBitsSPD);
1761 collections[n++].Add(entry->fHistFiredBitsSPD);
1762 collections[n++].Add(entry->fHistSPDClsVsTrk);
1763 collections[n++].Add(entry->fHistT0);
1765 // merge fTriggerClasses
1766 TIterator* iter2 = entry->fTriggerClasses->MakeIterator();
1767 TObjString* obj2 = 0;
1768 while ((obj2 = dynamic_cast<TObjString*> (iter2->Next())))
1770 TParameter<Long64_t>* param2 = static_cast<TParameter<Long64_t>*> (entry->fTriggerClasses->GetValue(obj2));
1772 TParameter<Long64_t>* param1 = dynamic_cast<TParameter<Long64_t>*> (fTriggerClasses->GetValue(obj2));
1775 param1->SetVal(param1->GetVal() + param2->GetVal());
1779 param1 = dynamic_cast<TParameter<Long64_t>*> (param2->Clone());
1780 fTriggerClasses->Add(new TObjString(obj2->String()), param1);
1790 fHistV0A->Merge(&collections[n++]);
1791 fHistV0C->Merge(&collections[n++]);
1792 fHistZDC->Merge(&collections[n++]);
1793 fHistTDCZDC->Merge(&collections[n++]);
1795 fHistTimeZDC->Merge(&collections[n++]);
1798 if (fHistTimeCorrZDC)
1799 fHistTimeCorrZDC->Merge(&collections[n++]);
1802 fHistFMDA->Merge(&collections[n++]);
1803 fHistFMDC->Merge(&collections[n++]);
1804 fHistFMDSingle->Merge(&collections[n++]);
1805 fHistFMDSum->Merge(&collections[n++]);
1806 fHistBitsSPD->Merge(&collections[n++]);
1807 fHistFiredBitsSPD->Merge(&collections[n++]);
1808 fHistSPDClsVsTrk->Merge(&collections[n++]);
1809 fHistT0->Merge(&collections[n++]);
1815 void AliTriggerAnalysis::SaveHistograms() const
1817 // write histograms to current directory
1823 fHistBitsSPD->Write();
1824 //fHistBitsSPD->ProjectionX();
1825 //fHistBitsSPD->ProjectionY();
1827 else Printf("Cannot save fHistBitsSPD");
1828 if (fHistFiredBitsSPD) fHistFiredBitsSPD->Write();
1829 else Printf("Cannot save fHistFiredBitsSPD");
1830 if (fHistV0A) fHistV0A->Write();
1831 else Printf("Cannot save fHistV0A");
1832 if (fHistV0C) fHistV0C->Write();
1833 else Printf("Cannot save fHistV0C");
1834 if (fHistZDC) fHistZDC->Write();
1835 else Printf("Cannot save fHistZDC");
1836 if (fHistTDCZDC) fHistTDCZDC->Write();
1837 else Printf("Cannot save fHistTDCZDC");
1838 if (fHistTimeZDC) fHistTimeZDC->Write();
1839 else Printf("Cannot save fHistTimeZDC");
1840 if (fHistTimeCorrZDC) fHistTimeCorrZDC->Write();
1841 else Printf("Cannot save fHistTimeCorrZDC");
1842 if (fHistFMDA) fHistFMDA->Write();
1843 else Printf("Cannot save fHistFMDA");
1844 if (fHistFMDC) fHistFMDC->Write();
1845 else Printf("Cannot save fHistFMDC");
1846 if (fHistFMDSingle) fHistFMDSingle->Write();
1847 else Printf("Cannot save fHistFMDSingle");
1848 if (fHistFMDSum) fHistFMDSum->Write();
1849 else Printf("Cannot save fHistFMDSum");
1850 if (fSPDGFOEfficiency) fSPDGFOEfficiency->Write("fSPDGFOEfficiency");
1851 if (fHistSPDClsVsTrk) fHistSPDClsVsTrk->Write("fHistSPDClsVsTrk");
1852 if (fHistT0) fHistT0->Write("fHistT0");
1854 // else Printf("Cannot save fSPDGFOEfficiency");
1856 fTriggerClasses->Write("fTriggerClasses", TObject::kSingleKey);
1859 void AliTriggerAnalysis::PrintTriggerClasses() const
1861 // print trigger classes
1863 Printf("Trigger Classes:");
1865 Printf("Event count for trigger combinations:");
1868 singleTrigger.SetOwner();
1870 TIterator* iter = fTriggerClasses->MakeIterator();
1871 TObjString* obj = 0;
1872 while ((obj = dynamic_cast<TObjString*> (iter->Next())))
1874 TParameter<Long64_t>* param = static_cast<TParameter<Long64_t>*> (fTriggerClasses->GetValue(obj));
1876 Printf(" %s: %ld triggers", obj->String().Data(), (Long_t)param->GetVal());
1878 TObjArray* tokens = obj->String().Tokenize(" ");
1879 for (Int_t i=0; i<tokens->GetEntries(); i++)
1881 TParameter<Long64_t>* count = dynamic_cast<TParameter<Long64_t>*> (singleTrigger.GetValue(((TObjString*) tokens->At(i))->String().Data()));
1884 count = new TParameter<Long64_t>(((TObjString*) tokens->At(i))->String().Data(), 0);
1885 singleTrigger.Add(new TObjString(((TObjString*) tokens->At(i))->String().Data()), count);
1887 count->SetVal(count->GetVal() + param->GetVal());
1894 Printf("Event count for single trigger:");
1896 iter = singleTrigger.MakeIterator();
1897 while ((obj = dynamic_cast<TObjString*> (iter->Next())))
1899 TParameter<Long64_t>* param = static_cast<TParameter<Long64_t>*> (singleTrigger.GetValue(obj));
1901 Printf(" %s: %ld triggers", obj->String().Data(), (Long_t)param->GetVal());
1905 singleTrigger.DeleteAll();
1909 //----------------------------------------------------------------------------------------------------
1910 AliTriggerAnalysis::T0Decision AliTriggerAnalysis::T0Trigger(const AliESDEvent* aEsd, Bool_t online, Bool_t fillHists)
1912 // Returns the T0 TVDC trigger decision
1914 // argument 'online' is used as a switch between online and offline trigger algorithms
1915 // in online mode return 0TVX
1916 // in offline mode in addition check pile-up and background :
1917 // pile-up readed from ESD: check if TVDC (0TVX module name) has more 1 hit;
1918 // backgroud flag readed from ESD : check in given time interval OrA and OrC were correct but TVDC not
1920 // Based on an algorithm by Alla Maevskaya
1922 const AliESDTZERO* esdT0 = aEsd->GetESDTZERO();
1925 AliError("AliESDTZERO not available");
1928 //???? AliDebug(2,Form("In T0Trigger: %f %f",esdV0->GetV0ATime(),esdV0->GetV0CTime()));
1930 for (Int_t ii=0; ii<5; ii++)
1931 tvdc[ii] = esdT0->GetTVDC(ii);
1932 // Int_t trig=esdT0->GetT0Trig();
1933 // cout<<" T0 trig "<<trig<<endl;
1935 if(fillHists) fHistT0->Fill(tvdc[0]);
1938 if(aEsd->GetHeader()->GetFiredTriggerInputs().Contains("0TVX") ) return kT0BB;
1942 if (esdT0->GetPileupFlag()) return kT0DecPileup;
1943 if (esdT0->GetBackgroundFlag()) return kT0DecBG;
1944 if (tvdc[0]>-5 && tvdc[0]<5 && tvdc[0] != 0) return kT0BB;
1948 if( esdT0->GetT0zVertex()>-12.3 && esdT0->GetT0zVertex() < 10.3) return kT0BB;
1953 //----------------------------------------------------------------------------------------------------
1954 Bool_t AliTriggerAnalysis::EMCALCellsTrigger(const AliESDEvent *aEsd)
1957 // Returns the EMCAL trigger decision
1958 // so far only implemented for LHC11a data
1959 // see http://alisoft.cern.ch/viewvc/trunk/PWGGA/EMCALTasks/AliEmcalPhysicsSelection.cxx?view=markup&root=AliRoot Revision 56136
1962 Bool_t isFired = kTRUE;
1963 const Int_t runNumber = aEsd->GetRunNumber();
1966 // Load EMCAL branches from the manager
1967 AliAnalysisManager *am = AliAnalysisManager::GetAnalysisManager();
1968 am->LoadBranch("EMCALCells.");
1969 am->LoadBranch("CaloClusters");
1973 AliVCaloCells *cells = aEsd->GetEMCALCells();
1974 const Short_t nCells = cells->GetNumberOfCells();
1976 // count cells above threshold per sm
1977 Int_t nCellCount[10] = {0,0,0,0,0,0,0,0,0,0};
1978 for(Int_t iCell=0; iCell<nCells; ++iCell) {
1979 Short_t cellId = cells->GetCellNumber(iCell);
1980 Double_t cellE = cells->GetCellAmplitude(cellId);
1981 Int_t sm = cellId / (24*48);
1986 // Trigger decision for LHC11a
1987 Bool_t isLedEvent = kFALSE;
1988 if ((runNumber>=144871) && (runNumber<=146860)) {
1989 if (nCellCount[4] > 100)
1992 if ((runNumber>=146858) && (runNumber<=146860)) {
1993 if (nCellCount[3]>=35)
2006 //__________________________________________________________________________________________
2007 Bool_t AliTriggerAnalysis::TRDTrigger(const AliESDEvent *esd, Trigger trigger)
2009 // evaluate the TRD trigger conditions,
2010 // so far HCO, HSE, HQU, HJT, HEE
2012 Bool_t isFired = kFALSE;
2014 if(trigger!=kTRDHCO && trigger!=kTRDHJT && trigger!=kTRDHSE && trigger!=kTRDHQU && trigger!=kTRDHEE) {
2015 AliWarning("Beware you are erroneously trying to use this function (wrong trigger)");
2020 AliErrorClass("ESD event pointer is null");
2024 Int_t nTrdTracks = esd->GetNumberOfTrdTracks();
2026 if (nTrdTracks > 0 && (trigger==kTRDHCO) ) {
2031 if(trigger!=kTRDHJT) {
2032 for (Int_t iTrack = 0; iTrack < nTrdTracks; ++iTrack) {
2034 AliESDTrdTrack *trdTrack = esd->GetTrdTrack(iTrack);
2035 if (!trdTrack) continue;
2037 // for the electron triggers we only consider matched tracks
2038 if(trigger==kTRDHQU)
2039 if ( (TMath::Abs(trdTrack->Pt()) > fTRDptHQU) && (trdTrack->GetPID() > fTRDpidHQU) ) {
2044 if(trigger==kTRDHSE)
2045 if ( (TMath::Abs(trdTrack->Pt()) > fTRDptHSE) && (trdTrack->GetPID() > fTRDpidHSE) ) {
2050 if(trigger==kTRDHEE)
2051 if ( (trdTrack->GetSector() >= fTRDminSectorHEE) && (trdTrack->GetSector() <= fTRDmaxSectorHEE) &&
2052 (TMath::Abs(trdTrack->Pt()) > fTRDptHSE) && (trdTrack->GetPID() > fTRDpidHSE) ) {
2058 } else if(trigger==kTRDHJT) {
2060 Int_t nTracks[90] = { 0 }; // stack-wise counted number of tracks above pt threshold
2062 for (Int_t iTrack = 0; iTrack < nTrdTracks; ++iTrack) {
2064 AliESDTrdTrack *trdTrack = esd->GetTrdTrack(iTrack);
2065 if (!trdTrack) continue;
2067 Int_t globalStack = 5*trdTrack->GetSector() + trdTrack->GetStack();
2069 // stack-wise counting of tracks above pt threshold for jet trigger
2070 if (TMath::Abs(trdTrack->GetPt()) >= fTRDptHJT) {
2071 ++nTracks[globalStack];
2075 // check if HJT condition is fulfilled in any stack
2076 for (Int_t iStack = 0; iStack < 90; iStack++) {
2077 if (nTracks[iStack] >= fTRDnHJT) {