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", 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 (!esd->IsDetectorOn(AliDAQ::kTPC)) return kTRUE;
714 Bool_t AliTriggerAnalysis::IsIncompleteEvent(const AliESDEvent* esd)
717 // Check whether the event is incomplete
718 // (due to DAQ-HLT issues, it could be only part of the event was saved)
720 if ((esd->GetEventType() == 7) &&
721 (esd->GetDAQDetectorPattern() & (1<<4)) &&
722 !(esd->GetDAQAttributes() & (1<<7))) return kTRUE;
728 Bool_t AliTriggerAnalysis::IsOfflineTriggerFired(const AliESDEvent* aEsd, Trigger trigger)
730 // checks if an event has been triggered "offline"
732 UInt_t triggerNoFlags = (UInt_t) trigger % (UInt_t) kStartOfFlags;
734 Bool_t decision = kFALSE;
735 switch (triggerNoFlags)
744 if (SPDGFOTrigger(aEsd, 0) || V0Trigger(aEsd, kASide, kFALSE) == kV0BB || V0Trigger(aEsd, kCSide, kFALSE) == kV0BB)
750 if (SPDGFOTrigger(aEsd, 0) && (V0Trigger(aEsd, kASide, kFALSE) == kV0BB || V0Trigger(aEsd, kCSide, kFALSE) == kV0BB))
756 if (SPDGFOTrigger(aEsd, 0) && V0Trigger(aEsd, kASide, kFALSE) == kV0BB && V0Trigger(aEsd, kCSide, kFALSE) == kV0BB)
762 if (SPDGFOTrigger(aEsd, 0))
768 if (SPDGFOTrigger(aEsd, 1))
774 if (V0Trigger(aEsd, kASide, kFALSE) == kV0BB)
780 if (V0Trigger(aEsd, kCSide, kFALSE) == kV0BB)
786 if (V0Trigger(aEsd, kASide, kFALSE) == kV0BB || V0Trigger(aEsd, kCSide, kFALSE) == kV0BB)
792 if (V0Trigger(aEsd, kASide, kFALSE) == kV0BB && V0Trigger(aEsd, kCSide, kFALSE) == kV0BB)
798 if (V0Trigger(aEsd, kASide, kFALSE) == kV0BG)
804 if (V0Trigger(aEsd, kCSide, kFALSE) == kV0BG)
810 if (ZDCTrigger(aEsd, kASide) || ZDCTrigger(aEsd, kCentralBarrel) || ZDCTrigger(aEsd, kCSide))
816 if (ZDCTrigger(aEsd, kASide))
822 if (ZDCTrigger(aEsd, kCSide))
828 if (ZDCTDCTrigger(aEsd,kASide,kTRUE,kFALSE,kFALSE))
834 if (ZDCTDCTrigger(aEsd,kCSide,kTRUE,kFALSE,kFALSE))
840 if (ZDCTimeBGTrigger(aEsd,kASide))
846 if (ZDCTimeBGTrigger(aEsd,kCSide))
852 if (FMDTrigger(aEsd, kASide))
858 if (FMDTrigger(aEsd, kCSide))
864 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))
870 if (SPDFiredChips(aEsd, 0) >= 5 || (V0Trigger(aEsd, kASide, kFALSE) == kV0BB && V0Trigger(aEsd, kCSide, kFALSE) == kV0BB))
877 if (SPDGFOTrigger(aEsd, 0))
879 if (V0Trigger(aEsd, kASide, kFALSE) == kV0BB)
881 if (V0Trigger(aEsd, kCSide, kFALSE) == kV0BB)
891 if (EMCALCellsTrigger(aEsd))
897 if(TRDTrigger(aEsd,kTRDHCO))
903 if(TRDTrigger(aEsd,kTRDHJT))
909 if(TRDTrigger(aEsd,kTRDHSE))
915 if(TRDTrigger(aEsd,kTRDHQU))
921 if(TRDTrigger(aEsd,kTRDHEE))
927 AliFatal(Form("Trigger type %d not implemented", triggerNoFlags));
931 // hadron-level requirement
932 if (decision && (trigger & kOneParticle))
936 const AliESDVertex* vertex = aEsd->GetPrimaryVertexSPD();
937 const AliMultiplicity* mult = aEsd->GetMultiplicity();
939 if (mult && vertex && vertex->GetNContributors() > 0 && (!vertex->IsFromVertexerZ() || vertex->GetDispersion() < 0.02) && TMath::Abs(vertex->GetZv()) < 5.5)
941 for (Int_t i=0; i<mult->GetNumberOfTracklets(); ++i)
943 if (TMath::Abs(mult->GetEta(i)) < 1)
952 // hadron level definition for TPC tracks
954 if (decision && (trigger & kOneTrack))
957 const AliESDVertex* vertex =0x0;
958 vertex = aEsd->GetPrimaryVertexTracks();
959 if (!vertex || vertex->GetNContributors() <= 0)
961 vertex = aEsd->GetPrimaryVertexSPD();
963 Float_t ptmin, ptmax;
964 fEsdTrackCuts->GetPtRange(ptmin,ptmax);
965 AliDebug(3, Form("ptmin = %f, ptmax = %f\n",ptmin, ptmax));
967 if (vertex && vertex->GetNContributors() > 0 && (!vertex->IsFromVertexerZ() || vertex->GetDispersion() < 0.02) && TMath::Abs(vertex->GetZv()) < 10.) {
968 AliDebug(3,Form("Check on the vertex passed\n"));
969 for (Int_t i=0; i<aEsd->GetNumberOfTracks(); ++i){
970 if (fTPCOnly == kFALSE){
971 if (fEsdTrackCuts->AcceptTrack(aEsd->GetTrack(i))){
972 AliDebug(2, Form("pt of track = %f --> check passed\n",aEsd->GetTrack(i)->Pt()));
979 AliESDtrack *tpcTrack = fEsdTrackCuts->GetTPCOnlyTrack((AliESDEvent*)aEsd, i);
981 AliDebug(3,Form("track %d is NOT a TPC track",i));
985 AliDebug(3,Form("track %d IS a TPC track",i));
986 if (!(fEsdTrackCuts->AcceptTrack(tpcTrack))) {
987 AliDebug(2, Form("TPC track %d NOT ACCEPTED, pt = %f, eta = %f",i,tpcTrack->Pt(), tpcTrack->Eta()));
988 delete tpcTrack; tpcTrack = 0x0;
990 } // end if the TPC track is not accepted
992 AliDebug(2, Form("TPC track %d ACCEPTED, pt = %f, eta = %f",i,tpcTrack->Pt(), tpcTrack->Eta()));
994 delete tpcTrack; tpcTrack = 0x0;
996 } // end if the TPC track is accepted
997 } // end if it is a TPC track
998 } // end if you are looking at TPC only tracks
999 } // end loop on tracks
1000 } // end check on vertex
1002 AliDebug(4,Form("Check on the vertex not passed\n"));
1003 for (Int_t i=0; i<aEsd->GetNumberOfTracks(); ++i){
1004 if (fEsdTrackCuts->AcceptTrack(aEsd->GetTrack(i))){
1005 AliDebug(4,Form("pt of track = %f --> check would be passed if the vertex was ok\n",aEsd->GetTrack(i)->Pt()));
1010 if (!decision) AliDebug(3,("Check for kOneTrack NOT passed\n"));
1016 Bool_t AliTriggerAnalysis::IsTriggerClassFired(const AliESDEvent* aEsd, const Char_t* tclass) const
1018 // tclass is logical function of inputs, e.g. 01 && 02 || 03 && 11 && 21
1019 // = L0 inp 1 && L0 inp 2 || L0 inp 3 && L1 inp 1 && L2 inp 1
1020 // NO brackets in logical function !
1021 // Spaces between operators and inputs.
1022 // Not all logical functions are available in CTP=
1023 // =any function of first 4 inputs; 'AND' of other inputs, check not done
1024 // This method will be replaced/complemened by similar one
1025 // which works withh class and inputs names as in CTP cfg file
1027 TString TClass(tclass);
1028 TObjArray* tcltokens = TClass.Tokenize(" ");
1029 Char_t level=((TObjString*)tcltokens->At(0))->String()[0];
1030 UInt_t input=atoi((((TObjString*)tcltokens->At(0))->String()).Remove(0));
1031 Bool_t tcl = IsInputFired(aEsd,level,input);
1033 for (Int_t i=1;i<tcltokens->GetEntriesFast();i=i+2) {
1034 level=((TObjString*)tcltokens->At(i+1))->String()[0];
1035 input=atoi((((TObjString*)tcltokens->At(i+1))->String()).Remove(0));
1036 Bool_t inpnext = IsInputFired(aEsd,level,input);
1037 Char_t op =((TObjString*)tcltokens->At(i))->String()[0];
1038 if (op == '&') tcl=tcl && inpnext;
1039 else if (op == '|') tcl =tcl || inpnext;
1041 AliError(Form("Syntax error in %s", tclass));
1044 // tcltokens->Delete();
1050 // tcltokens->Delete();
1054 Bool_t AliTriggerAnalysis::IsInputFired(const AliESDEvent* aEsd, Char_t level, UInt_t input) const
1056 // Checks trigger input of any level
1060 case '0': return IsL0InputFired(aEsd,input);
1061 case '1': return IsL1InputFired(aEsd,input);
1062 case '2': return IsL2InputFired(aEsd,input);
1064 AliError(Form("Wrong level %i",level));
1069 Bool_t AliTriggerAnalysis::IsL0InputFired(const AliESDEvent* aEsd, UInt_t input) const
1071 // Checks if corresponding bit in mask is on
1073 UInt_t inpmask = aEsd->GetHeader()->GetL0TriggerInputs();
1074 return (inpmask & (1<<(input-1)));
1077 Bool_t AliTriggerAnalysis::IsL1InputFired(const AliESDEvent* aEsd, UInt_t input) const
1079 // Checks if corresponding bit in mask is on
1081 UInt_t inpmask = aEsd->GetHeader()->GetL1TriggerInputs();
1082 return (inpmask & (1<<(input-1)));
1085 Bool_t AliTriggerAnalysis::IsL2InputFired(const AliESDEvent* aEsd, UInt_t input) const
1087 // Checks if corresponding bit in mask is on
1089 UInt_t inpmask = aEsd->GetHeader()->GetL2TriggerInputs();
1090 return (inpmask & (1<<(input-1)));
1093 void AliTriggerAnalysis::FillHistograms(const AliESDEvent* aEsd)
1095 // fills the histograms with the info from the ESD
1097 fHistBitsSPD->Fill(SPDFiredChips(aEsd, 0), SPDFiredChips(aEsd, 1, kTRUE));
1099 V0Trigger(aEsd, kASide, kFALSE, kTRUE);
1100 V0Trigger(aEsd, kCSide, kFALSE, kTRUE);
1101 T0Trigger(aEsd, kFALSE, kTRUE);
1102 ZDCTDCTrigger(aEsd,kASide,kFALSE,kFALSE,kTRUE);
1103 ZDCTimeTrigger(aEsd,kTRUE);
1104 IsSPDClusterVsTrackletBG(aEsd, kTRUE);
1106 AliESDZDC* zdcData = aEsd->GetESDZDC();
1109 UInt_t quality = zdcData->GetESDQuality();
1111 // from Nora's presentation, general first physics meeting 16.10.09
1112 static UInt_t zpc = 0x20;
1113 static UInt_t znc = 0x10;
1114 static UInt_t zem1 = 0x08;
1115 static UInt_t zem2 = 0x04;
1116 static UInt_t zpa = 0x02;
1117 static UInt_t zna = 0x01;
1119 fHistZDC->Fill(1, (quality & zna) ? 1 : 0);
1120 fHistZDC->Fill(2, (quality & zpa) ? 1 : 0);
1121 fHistZDC->Fill(3, (quality & zem2) ? 1 : 0);
1122 fHistZDC->Fill(4, (quality & zem1) ? 1 : 0);
1123 fHistZDC->Fill(5, (quality & znc) ? 1 : 0);
1124 fHistZDC->Fill(6, (quality & zpc) ? 1 : 0);
1129 AliError("AliESDZDC not available");
1133 fHistFMDA->Fill(FMDHitCombinations(aEsd, kASide, kTRUE));
1134 fHistFMDC->Fill(FMDHitCombinations(aEsd, kCSide, kTRUE));
1138 void AliTriggerAnalysis::FillTriggerClasses(const AliESDEvent* aEsd)
1140 // fills trigger classes map
1142 TParameter<Long64_t>* count = dynamic_cast<TParameter<Long64_t>*> (fTriggerClasses->GetValue(aEsd->GetFiredTriggerClasses().Data()));
1145 count = new TParameter<Long64_t>(aEsd->GetFiredTriggerClasses(), 0);
1146 fTriggerClasses->Add(new TObjString(aEsd->GetFiredTriggerClasses().Data()), count);
1148 count->SetVal(count->GetVal() + 1);
1151 Int_t AliTriggerAnalysis::SSDClusters(const AliESDEvent* aEsd)
1153 // returns the number of clusters in the SSD
1154 const AliMultiplicity* mult = aEsd->GetMultiplicity();
1155 Int_t clusters = mult->GetNumberOfITSClusters(4)+mult->GetNumberOfITSClusters(5);
1160 Int_t AliTriggerAnalysis::SPDFiredChips(const AliESDEvent* aEsd, Int_t origin, Bool_t fillHists, Int_t layer)
1162 // returns the number of fired chips in the SPD
1164 // origin = 0 --> aEsd->GetMultiplicity()->GetNumberOfFiredChips() (filled from clusters)
1165 // origin = 1 --> aEsd->GetMultiplicity()->TestFastOrFiredChips() (from hardware bits)
1166 // layer = 0 --> both layers
1167 // layer = 1 --> inner
1168 // layer = 2 --> outer
1170 const AliMultiplicity* mult = aEsd->GetMultiplicity();
1173 AliError("AliMultiplicity not available");
1179 return mult->GetNumberOfFiredChips(0) + mult->GetNumberOfFiredChips(1);
1181 return mult->GetNumberOfFiredChips(layer-1);
1187 Int_t firstChip = 0;
1188 Int_t lastChip = 1200;
1194 for (Int_t i=firstChip; i<lastChip; i++)
1196 if (mult->TestFastOrFiredChips(i) == kTRUE)
1198 // efficiency simulation (if enabled)
1199 if (fSPDGFOEfficiency)
1201 if (gRandom->Uniform() > fSPDGFOEfficiency->GetBinContent(i+1))
1207 fHistFiredBitsSPD->Fill(i);
1216 Bool_t AliTriggerAnalysis::SPDGFOTrigger(const AliESDEvent* aEsd, Int_t origin)
1218 // Returns if the SPD gave a global Fast OR trigger
1220 Int_t firedChips = SPDFiredChips(aEsd, origin);
1222 if (firedChips >= fSPDGFOThreshold)
1227 Bool_t AliTriggerAnalysis::IsSPDClusterVsTrackletBG(const AliESDEvent* aEsd, Bool_t fillHists){
1228 //rejects BG based on the cluster vs tracklet correlation
1229 // returns true if the event is BG
1230 const AliMultiplicity* mult = aEsd->GetMultiplicity();
1232 AliFatal("No multiplicity object"); // TODO: Should this be fatal?
1234 Int_t ntracklet = mult->GetNumberOfTracklets();
1236 Int_t spdClusters = 0;
1237 for(Int_t ilayer = 0; ilayer < 2; ilayer++){
1238 spdClusters += mult->GetNumberOfITSClusters(ilayer);
1242 fHistSPDClsVsTrk->Fill(ntracklet,spdClusters);
1245 Bool_t isCvsTOk = kFALSE;
1246 Float_t limit = Float_t(fASPDCvsTCut) + Float_t(ntracklet) * fBSPDCvsTCut;
1247 if (spdClusters > limit) isCvsTOk = kTRUE;
1248 else isCvsTOk = kFALSE ;
1255 AliTriggerAnalysis::V0Decision AliTriggerAnalysis::V0Trigger(const AliESDEvent* aEsd, AliceSide side, Bool_t online, Bool_t fillHists)
1257 // Returns the V0 trigger decision in V0A | V0C
1259 // Returns kV0Fake if the calculated average time is in a window where neither BB nor BG is expected.
1260 // The rate of such triggers can be used to estimate the background. Note that the rate has to be
1261 // rescaled with the size of the windows (numerical values see below in the code)
1263 // argument 'online' is used as a switch between online and offline trigger algorithms
1265 // Based on an algorithm by Cvetan Cheshkov
1267 AliESDVZERO* esdV0 = aEsd->GetVZEROData();
1270 AliError("AliESDVZERO not available");
1273 AliDebug(2,Form("In V0Trigger: %f %f",esdV0->GetV0ATime(),esdV0->GetV0CTime()));
1283 else if (side == kCSide)
1291 if (esdV0->TestBit(AliESDVZERO::kDecisionFilled)) {
1293 if (esdV0->TestBit(AliESDVZERO::kOnlineBitsFilled)) {
1294 for (Int_t i = begin; i < end; ++i) {
1295 if (esdV0->GetBBFlag(i)) return kV0BB;
1297 for (Int_t i = begin; i < end; ++i) {
1298 if (esdV0->GetBGFlag(i)) return kV0BG;
1303 AliWarning("V0 online trigger analysis is not yet available!");
1310 if (side == kASide && fHistV0A)
1311 fHistV0A->Fill(esdV0->GetV0ATime());
1312 if (side == kCSide && fHistV0C)
1313 fHistV0C->Fill(esdV0->GetV0CTime());
1316 if (side == kASide) return (V0Decision)esdV0->GetV0ADecision();
1317 else if (side == kCSide) return (V0Decision)esdV0->GetV0CDecision();
1318 else return kV0Invalid;
1327 if (aEsd->GetRunNumber() <= 104803) runRange = 0;
1328 else if (aEsd->GetRunNumber() <= 104876) runRange = 1;
1331 Float_t factors[3][64] = {
1332 // runs: 104792-104803
1333 {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},
1334 // runs: 104841-104876
1335 {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},
1337 {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}
1339 Float_t dA = 77.4 - 11.0;
1340 Float_t dC = 77.4 - 2.9;
1341 // Time misalignment
1342 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};
1343 Float_t dA2 = 2.8, dC2 = 3.3;
1346 for (Int_t i = begin; i < end; ++i) {
1347 Float_t tempAdc = esdV0->GetAdc(i)/factors[runRange][i];
1348 Float_t tempTime = (i >= 32) ? esdV0->GetTime(i)+dA+timeShift[i]+dA2 : esdV0->GetTime(i)+dC+timeShift[i]+dC2;
1349 if (esdV0->GetTime(i) >= 1e-6 &&
1350 tempTime > fV0HwWinLow && tempTime < fV0HwWinHigh &&
1351 tempAdc > fV0HwAdcThr)
1357 for (Int_t i = begin; i < end; ++i) {
1358 Float_t tempAdc = esdV0->GetAdc(i)/factors[runRange][i];
1359 Float_t tempTime = (i >= 32) ? esdV0->GetTime(i)+dA : esdV0->GetTime(i)+dC;
1360 Float_t tempRawTime = (i >= 32) ? esdV0->GetTime(i)+dA+timeShift[i]+dA2 : esdV0->GetTime(i)+dC+timeShift[i]+dC2;
1361 if (esdV0->GetTime(i) >= 1e-6 &&
1362 tempRawTime < 125.0 &&
1363 tempAdc > fV0AdcThr) {
1372 for (Int_t i = begin; i < end; ++i) {
1373 if (esdV0->GetTime(i) >= 1e-6 &&
1374 esdV0->GetTime(i) > fV0HwWinLow && esdV0->GetTime(i) < fV0HwWinHigh &&
1375 esdV0->GetAdc(i) > fV0HwAdcThr)
1381 for (Int_t i = begin; i < end; ++i) {
1382 if (esdV0->GetTime(i) > 1e-6 && esdV0->GetAdc(i) > fV0AdcThr) {
1383 Float_t correctedTime = V0CorrectLeadingTime(i, esdV0->GetTime(i), esdV0->GetAdc(i),aEsd->GetRunNumber());
1384 Float_t timeWeight = V0LeadingTimeWeight(esdV0->GetAdc(i));
1385 time += correctedTime*timeWeight;
1387 weight += timeWeight;
1395 time += fV0TimeOffset;
1399 if (side == kASide && fHistV0A)
1400 fHistV0A->Fill(time);
1401 if (side == kCSide && fHistV0C)
1402 fHistV0C->Fill(time);
1407 if (time > 68 && time < 100)
1409 if (time > 54 && time < 57.5)
1411 if (time > 57.5 && time < 68)
1417 if (time > 75.5 && time < 100)
1419 if (time > 69.5 && time < 73)
1421 if (time > 55 && time < 69.5)
1428 Float_t AliTriggerAnalysis::V0CorrectLeadingTime(Int_t i, Float_t time, Float_t adc, Int_t runNumber) const
1430 // Correct for slewing and align the channels
1432 // Authors: Cvetan Cheshkov / Raphael Tieulent
1434 if (time == 0) return 0;
1437 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};
1439 if(runNumber < 106031)
1440 time -= timeShift[i];
1442 // Slewing correction
1443 if (adc == 0) return time;
1445 Float_t p1 = 1.57345e1;
1446 Float_t p2 =-4.25603e-1;
1448 if(runNumber >= 106031) adc *= (2.5/4.0);
1449 return (time - p1*TMath::Power(adc,p2));
1452 Float_t AliTriggerAnalysis::V0LeadingTimeWeight(Float_t adc) const
1454 if (adc < 1e-6) return 0;
1456 Float_t p1 = 40.211;
1457 Float_t p2 =-4.25603e-1;
1458 Float_t p3 = 0.5646;
1460 return 1./(p1*p1*TMath::Power(adc,2.*(p2-1.))+p3*p3);
1464 Bool_t AliTriggerAnalysis::ZDCTDCTrigger(const AliESDEvent* aEsd, AliceSide side, Bool_t useZN, Bool_t useZP, Bool_t fillHists) const
1466 // Returns if ZDC triggered, based on TDC information
1468 AliESDZDC *esdZDC = aEsd->GetESDZDC();
1470 Bool_t zdcNA = kFALSE;
1471 Bool_t zdcNC = kFALSE;
1472 Bool_t zdcPA = kFALSE;
1473 Bool_t zdcPC = kFALSE;
1476 // If it's MC, we use the energy
1477 Double_t minEnergy = 0;
1478 Double_t zNCEnergy = esdZDC->GetZDCN1Energy();
1479 Double_t zPCEnergy = esdZDC->GetZDCP1Energy();
1480 Double_t zNAEnergy = esdZDC->GetZDCN2Energy();
1481 Double_t zPAEnergy = esdZDC->GetZDCP2Energy();
1482 zdcNA = (zNAEnergy>minEnergy);
1483 zdcNC = (zNCEnergy>minEnergy);
1484 zdcPA = (zPAEnergy>minEnergy);
1485 zdcPC = (zPCEnergy>minEnergy);
1490 Bool_t tdc[32] = {kFALSE};
1491 for(Int_t itdc=0; itdc<32; itdc++){
1492 for(Int_t i=0; i<4; i++){
1493 if (esdZDC->GetZDCTDCData(itdc, i) != 0){
1497 if(fillHists && tdc[itdc]) {
1498 fHistTDCZDC->Fill(itdc);
1507 if (side == kASide) return ((useZP&&zdcPA) || (useZN&&zdcNA));
1508 if (side == kCSide) return ((useZP&&zdcPC) || (useZN&&zdcNC));
1512 Bool_t AliTriggerAnalysis::ZDCTimeTrigger(const AliESDEvent *aEsd, Bool_t fillHists) const
1514 // This method implements a selection
1515 // based on the timing in both sides of zdcN
1516 // It can be used in order to eliminate
1517 // parasitic collisions
1518 Bool_t zdcAccept = kFALSE;
1519 AliESDZDC *esdZDC = aEsd->GetESDZDC();
1522 UInt_t esdFlag = esdZDC->GetESDQuality();
1524 Bool_t znaFired=kFALSE, zpaFired=kFALSE;
1525 Bool_t zem1Fired=kFALSE, zem2Fired=kFALSE;
1526 Bool_t zncFired=kFALSE, zpcFired=kFALSE;
1528 // **** Trigger patterns
1529 if((esdFlag & 0x00000001) == 0x00000001) znaFired=kTRUE;
1530 if((esdFlag & 0x00000002) == 0x00000002) zpaFired=kTRUE;
1531 if((esdFlag & 0x00000004) == 0x00000004) zem1Fired=kTRUE;
1532 if((esdFlag & 0x00000008) == 0x00000008) zem2Fired=kTRUE;
1533 if((esdFlag & 0x00000010) == 0x00000010) zncFired=kTRUE;
1534 if((esdFlag & 0x00000020) == 0x00000020) zpcFired=kTRUE;
1535 zdcAccept = (znaFired | zncFired);
1538 for(Int_t i = 0; i < 4; ++i) {
1539 if (esdZDC->GetZDCTDCData(10,i) != 0) {
1540 Float_t tdcC = 0.025*(esdZDC->GetZDCTDCData(10,i)-esdZDC->GetZDCTDCData(14,i));
1541 Float_t tdcCcorr = esdZDC->GetZDCTDCCorrected(10,i);
1542 for(Int_t j = 0; j < 4; ++j) {
1543 if (esdZDC->GetZDCTDCData(12,j) != 0) {
1544 Float_t tdcA = 0.025*(esdZDC->GetZDCTDCData(12,j)-esdZDC->GetZDCTDCData(14,j));
1546 Float_t tdcAcorr = esdZDC->GetZDCTDCCorrected(12,j);
1548 fHistTimeZDC->Fill(tdcC-tdcA,tdcC+tdcA);
1549 fHistTimeCorrZDC->Fill(tdcCcorr-tdcAcorr,tdcCcorr+tdcAcorr);
1551 if (esdZDC->TestBit(AliESDZDC::kCorrectedTDCFilled)) {
1552 if (((tdcCcorr-tdcAcorr-fZDCCutRefDeltaCorr)*(tdcCcorr-tdcAcorr-fZDCCutRefDeltaCorr)/(fZDCCutSigmaDeltaCorr*fZDCCutSigmaDeltaCorr) +
1553 (tdcCcorr+tdcAcorr-fZDCCutRefSumCorr)*(tdcCcorr+tdcAcorr-fZDCCutRefSumCorr)/(fZDCCutSigmaSumCorr*fZDCCutSigmaSumCorr))< 1.0)
1557 if (((tdcC-tdcA-fZDCCutRefDelta)*(tdcC-tdcA-fZDCCutRefDelta)/(fZDCCutSigmaDelta*fZDCCutSigmaDelta) +
1558 (tdcC+tdcA-fZDCCutRefSum)*(tdcC+tdcA-fZDCCutRefSum)/(fZDCCutSigmaSum*fZDCCutSigmaSum))< 1.0)
1569 Bool_t AliTriggerAnalysis::ZDCTimeBGTrigger(const AliESDEvent *aEsd, AliceSide side) const
1571 // This method implements a selection
1572 // based on the timing in of zdcN
1573 // It can be used in order to flag background
1574 // ** So far only implemented for the 2012 pA run **
1576 if(fMC) return kFALSE;
1578 AliESDZDC *zdcData = aEsd->GetESDZDC();
1579 Bool_t zna = kFALSE;
1580 Bool_t znc = kFALSE;
1581 Bool_t znabadhit = kFALSE;
1582 Bool_t zncbadhit = kFALSE;
1584 Float_t tdcC=999, tdcCcorr=999, tdcA=999, tdcAcorr=999;
1585 for(Int_t i = 0; i < 4; ++i) {
1586 if (zdcData->GetZDCTDCData(10,i) != 0) {
1588 tdcC = 0.025*(zdcData->GetZDCTDCData(10,i)-zdcData->GetZDCTDCData(14,i));
1589 tdcCcorr = zdcData->GetZDCTDCCorrected(10,i);
1590 if((TMath::Abs(tdcCcorr)<fZDCCutZNCTimeCorrMax) && (TMath::Abs(tdcCcorr)>fZDCCutZNCTimeCorrMin)) zncbadhit = kTRUE;
1593 for(Int_t j = 0; j < 4; ++j) {
1594 if (zdcData->GetZDCTDCData(12,j) != 0) {
1596 tdcA = 0.025*(zdcData->GetZDCTDCData(12,j)-zdcData->GetZDCTDCData(14,j));
1597 tdcAcorr = zdcData->GetZDCTDCCorrected(12,j);
1598 if((TMath::Abs(tdcAcorr)<fZDCCutZNATimeCorrMax) && (TMath::Abs(tdcAcorr)>fZDCCutZNATimeCorrMin)) znabadhit = kTRUE;
1602 const Int_t runNumber = aEsd->GetRunNumber();
1603 if(runNumber<188124 || (runNumber>188374 && runNumber<194713)){ // FIXME: end of pA-run is not known
1604 AliDebug(3,Form(" ZN BG time cut not implemented for run %d",runNumber));
1608 Bool_t znabg = (zna && znabadhit);
1609 Bool_t zncbg = (znc && zncbadhit);
1611 // 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);
1612 // Printf("Checking ZN background (time) for run %d, A-BG = %d, C-BG = %d",runNumber,(Int_t)znabg,(Int_t)zncbg);
1614 if (side == kASide) return znabg;
1615 if (side == kCSide) return zncbg;
1619 Bool_t AliTriggerAnalysis::ZDCTrigger(const AliESDEvent* aEsd, AliceSide side) const
1621 // Returns if ZDC triggered
1623 AliESDZDC* zdcData = aEsd->GetESDZDC();
1626 AliError("AliESDZDC not available");
1630 UInt_t quality = zdcData->GetESDQuality();
1632 // from Nora's presentation, general first physics meeting 16.10.09
1633 static UInt_t zpc = 0x20;
1634 static UInt_t znc = 0x10;
1635 static UInt_t zem1 = 0x08;
1636 static UInt_t zem2 = 0x04;
1637 static UInt_t zpa = 0x02;
1638 static UInt_t zna = 0x01;
1640 if (side == kASide && ((quality & zpa) || (quality & zna)))
1642 if (side == kCentralBarrel && ((quality & zem1) || (quality & zem2)))
1644 if (side == kCSide && ((quality & zpc) || (quality & znc)))
1650 Int_t AliTriggerAnalysis::FMDHitCombinations(const AliESDEvent* aEsd, AliceSide side, Bool_t fillHists)
1652 // returns number of hit combinations agove threshold
1654 // Authors: FMD team, Hans Dalsgaard (code merged from FMD/AliFMDOfflineTrigger)
1659 // Workaround for AliESDEvent::GetFMDData is not const!
1660 const AliESDFMD* fmdData = (const_cast<AliESDEvent*>(aEsd))->GetFMDData();
1663 AliError("AliESDFMD not available");
1667 Int_t detFrom = (side == kASide) ? 1 : 3;
1668 Int_t detTo = (side == kASide) ? 2 : 3;
1671 Float_t totalMult = 0;
1672 for (UShort_t det=detFrom;det<=detTo;det++) {
1673 Int_t nRings = (det == 1 ? 1 : 2);
1674 for (UShort_t ir = 0; ir < nRings; ir++) {
1675 Char_t ring = (ir == 0 ? 'I' : 'O');
1676 UShort_t nsec = (ir == 0 ? 20 : 40);
1677 UShort_t nstr = (ir == 0 ? 512 : 256);
1678 for (UShort_t sec =0; sec < nsec; sec++) {
1679 for (UShort_t strip = 0; strip < nstr; strip++) {
1680 Float_t mult = fmdData->Multiplicity(det,ring,sec,strip);
1681 if (mult == AliESDFMD::kInvalidMult) continue;
1684 fHistFMDSingle->Fill(mult);
1686 if (mult > fFMDLowCut)
1687 totalMult = totalMult + mult;
1690 if (totalMult > fFMDHitCut)
1694 fHistFMDSum->Fill(totalMult);
1706 Bool_t AliTriggerAnalysis::FMDTrigger(const AliESDEvent* aEsd, AliceSide side)
1708 // Returns if the FMD triggered
1710 // Authors: FMD team, Hans Dalsgaard (code merged from FMD/AliFMDOfflineTrigger)
1712 Int_t triggers = FMDHitCombinations(aEsd, side, kFALSE);
1720 Long64_t AliTriggerAnalysis::Merge(TCollection* list)
1722 // Merge a list of AliMultiplicityCorrection objects with this (needed for
1724 // Returns the number of merged objects (including this).
1729 if (list->IsEmpty())
1732 TIterator* iter = list->MakeIterator();
1735 // collections of all histograms
1736 const Int_t nHists = 14;
1737 TList collections[nHists];
1740 while ((obj = iter->Next())) {
1742 AliTriggerAnalysis* entry = dynamic_cast<AliTriggerAnalysis*> (obj);
1747 collections[n++].Add(entry->fHistV0A);
1748 collections[n++].Add(entry->fHistV0C);
1749 collections[n++].Add(entry->fHistZDC);
1750 collections[n++].Add(entry->fHistTDCZDC);
1751 collections[n++].Add(entry->fHistTimeZDC);
1752 collections[n++].Add(entry->fHistTimeCorrZDC);
1753 collections[n++].Add(entry->fHistFMDA);
1754 collections[n++].Add(entry->fHistFMDC);
1755 collections[n++].Add(entry->fHistFMDSingle);
1756 collections[n++].Add(entry->fHistFMDSum);
1757 collections[n++].Add(entry->fHistBitsSPD);
1758 collections[n++].Add(entry->fHistFiredBitsSPD);
1759 collections[n++].Add(entry->fHistSPDClsVsTrk);
1760 collections[n++].Add(entry->fHistT0);
1762 // merge fTriggerClasses
1763 TIterator* iter2 = entry->fTriggerClasses->MakeIterator();
1764 TObjString* obj2 = 0;
1765 while ((obj2 = dynamic_cast<TObjString*> (iter2->Next())))
1767 TParameter<Long64_t>* param2 = static_cast<TParameter<Long64_t>*> (entry->fTriggerClasses->GetValue(obj2));
1769 TParameter<Long64_t>* param1 = dynamic_cast<TParameter<Long64_t>*> (fTriggerClasses->GetValue(obj2));
1772 param1->SetVal(param1->GetVal() + param2->GetVal());
1776 param1 = dynamic_cast<TParameter<Long64_t>*> (param2->Clone());
1777 fTriggerClasses->Add(new TObjString(obj2->String()), param1);
1787 fHistV0A->Merge(&collections[n++]);
1788 fHistV0C->Merge(&collections[n++]);
1789 fHistZDC->Merge(&collections[n++]);
1790 fHistTDCZDC->Merge(&collections[n++]);
1792 fHistTimeZDC->Merge(&collections[n++]);
1795 if (fHistTimeCorrZDC)
1796 fHistTimeCorrZDC->Merge(&collections[n++]);
1799 fHistFMDA->Merge(&collections[n++]);
1800 fHistFMDC->Merge(&collections[n++]);
1801 fHistFMDSingle->Merge(&collections[n++]);
1802 fHistFMDSum->Merge(&collections[n++]);
1803 fHistBitsSPD->Merge(&collections[n++]);
1804 fHistFiredBitsSPD->Merge(&collections[n++]);
1805 fHistSPDClsVsTrk->Merge(&collections[n++]);
1806 fHistT0->Merge(&collections[n++]);
1812 void AliTriggerAnalysis::SaveHistograms() const
1814 // write histograms to current directory
1820 fHistBitsSPD->Write();
1821 //fHistBitsSPD->ProjectionX();
1822 //fHistBitsSPD->ProjectionY();
1824 else Printf("Cannot save fHistBitsSPD");
1825 if (fHistFiredBitsSPD) fHistFiredBitsSPD->Write();
1826 else Printf("Cannot save fHistFiredBitsSPD");
1827 if (fHistV0A) fHistV0A->Write();
1828 else Printf("Cannot save fHistV0A");
1829 if (fHistV0C) fHistV0C->Write();
1830 else Printf("Cannot save fHistV0C");
1831 if (fHistZDC) fHistZDC->Write();
1832 else Printf("Cannot save fHistZDC");
1833 if (fHistTDCZDC) fHistTDCZDC->Write();
1834 else Printf("Cannot save fHistTDCZDC");
1835 if (fHistTimeZDC) fHistTimeZDC->Write();
1836 else Printf("Cannot save fHistTimeZDC");
1837 if (fHistTimeCorrZDC) fHistTimeCorrZDC->Write();
1838 else Printf("Cannot save fHistTimeCorrZDC");
1839 if (fHistFMDA) fHistFMDA->Write();
1840 else Printf("Cannot save fHistFMDA");
1841 if (fHistFMDC) fHistFMDC->Write();
1842 else Printf("Cannot save fHistFMDC");
1843 if (fHistFMDSingle) fHistFMDSingle->Write();
1844 else Printf("Cannot save fHistFMDSingle");
1845 if (fHistFMDSum) fHistFMDSum->Write();
1846 else Printf("Cannot save fHistFMDSum");
1847 if (fSPDGFOEfficiency) fSPDGFOEfficiency->Write("fSPDGFOEfficiency");
1848 if (fHistSPDClsVsTrk) fHistSPDClsVsTrk->Write("fHistSPDClsVsTrk");
1849 if (fHistT0) fHistT0->Write("fHistT0");
1851 // else Printf("Cannot save fSPDGFOEfficiency");
1853 fTriggerClasses->Write("fTriggerClasses", TObject::kSingleKey);
1856 void AliTriggerAnalysis::PrintTriggerClasses() const
1858 // print trigger classes
1860 Printf("Trigger Classes:");
1862 Printf("Event count for trigger combinations:");
1865 singleTrigger.SetOwner();
1867 TIterator* iter = fTriggerClasses->MakeIterator();
1868 TObjString* obj = 0;
1869 while ((obj = dynamic_cast<TObjString*> (iter->Next())))
1871 TParameter<Long64_t>* param = static_cast<TParameter<Long64_t>*> (fTriggerClasses->GetValue(obj));
1873 Printf(" %s: %ld triggers", obj->String().Data(), (Long_t)param->GetVal());
1875 TObjArray* tokens = obj->String().Tokenize(" ");
1876 for (Int_t i=0; i<tokens->GetEntries(); i++)
1878 TParameter<Long64_t>* count = dynamic_cast<TParameter<Long64_t>*> (singleTrigger.GetValue(((TObjString*) tokens->At(i))->String().Data()));
1881 count = new TParameter<Long64_t>(((TObjString*) tokens->At(i))->String().Data(), 0);
1882 singleTrigger.Add(new TObjString(((TObjString*) tokens->At(i))->String().Data()), count);
1884 count->SetVal(count->GetVal() + param->GetVal());
1891 Printf("Event count for single trigger:");
1893 iter = singleTrigger.MakeIterator();
1894 while ((obj = dynamic_cast<TObjString*> (iter->Next())))
1896 TParameter<Long64_t>* param = static_cast<TParameter<Long64_t>*> (singleTrigger.GetValue(obj));
1898 Printf(" %s: %ld triggers", obj->String().Data(), (Long_t)param->GetVal());
1902 singleTrigger.DeleteAll();
1906 //----------------------------------------------------------------------------------------------------
1907 AliTriggerAnalysis::T0Decision AliTriggerAnalysis::T0Trigger(const AliESDEvent* aEsd, Bool_t online, Bool_t fillHists)
1909 // Returns the T0 TVDC trigger decision
1911 // argument 'online' is used as a switch between online and offline trigger algorithms
1912 // in online mode return 0TVX
1913 // in offline mode in addition check pile-up and background :
1914 // pile-up readed from ESD: check if TVDC (0TVX module name) has more 1 hit;
1915 // backgroud flag readed from ESD : check in given time interval OrA and OrC were correct but TVDC not
1917 // Based on an algorithm by Alla Maevskaya
1919 const AliESDTZERO* esdT0 = aEsd->GetESDTZERO();
1922 AliError("AliESDTZERO not available");
1925 //???? AliDebug(2,Form("In T0Trigger: %f %f",esdV0->GetV0ATime(),esdV0->GetV0CTime()));
1927 for (Int_t ii=0; ii<5; ii++)
1928 tvdc[ii] = esdT0->GetTVDC(ii);
1929 // Int_t trig=esdT0->GetT0Trig();
1930 // cout<<" T0 trig "<<trig<<endl;
1932 if(fillHists) fHistT0->Fill(tvdc[0]);
1935 if(aEsd->GetHeader()->GetFiredTriggerInputs().Contains("0TVX") ) return kT0BB;
1939 if (esdT0->GetPileupFlag()) return kT0DecPileup;
1940 if (esdT0->GetBackgroundFlag()) return kT0DecBG;
1941 if (tvdc[0]>-5 && tvdc[0]<5 && tvdc[0] != 0) return kT0BB;
1945 if( esdT0->GetT0zVertex()>-12.3 && esdT0->GetT0zVertex() < 10.3) return kT0BB;
1950 //----------------------------------------------------------------------------------------------------
1951 Bool_t AliTriggerAnalysis::EMCALCellsTrigger(const AliESDEvent *aEsd)
1954 // Returns the EMCAL trigger decision
1955 // so far only implemented for LHC11a data
1956 // see http://alisoft.cern.ch/viewvc/trunk/PWGGA/EMCALTasks/AliEmcalPhysicsSelection.cxx?view=markup&root=AliRoot Revision 56136
1959 Bool_t isFired = kTRUE;
1960 const Int_t runNumber = aEsd->GetRunNumber();
1963 // Load EMCAL branches from the manager
1964 AliAnalysisManager *am = AliAnalysisManager::GetAnalysisManager();
1965 am->LoadBranch("EMCALCells.");
1966 am->LoadBranch("CaloClusters");
1970 AliVCaloCells *cells = aEsd->GetEMCALCells();
1971 const Short_t nCells = cells->GetNumberOfCells();
1973 // count cells above threshold per sm
1974 Int_t nCellCount[10] = {0,0,0,0,0,0,0,0,0,0};
1975 for(Int_t iCell=0; iCell<nCells; ++iCell) {
1976 Short_t cellId = cells->GetCellNumber(iCell);
1977 Double_t cellE = cells->GetCellAmplitude(cellId);
1978 Int_t sm = cellId / (24*48);
1983 // Trigger decision for LHC11a
1984 Bool_t isLedEvent = kFALSE;
1985 if ((runNumber>=144871) && (runNumber<=146860)) {
1986 if (nCellCount[4] > 100)
1989 if ((runNumber>=146858) && (runNumber<=146860)) {
1990 if (nCellCount[3]>=35)
2003 //__________________________________________________________________________________________
2004 Bool_t AliTriggerAnalysis::TRDTrigger(const AliESDEvent *esd, Trigger trigger)
2006 // evaluate the TRD trigger conditions,
2007 // so far HCO, HSE, HQU, HJT, HEE
2009 Bool_t isFired = kFALSE;
2011 if(trigger!=kTRDHCO && trigger!=kTRDHJT && trigger!=kTRDHSE && trigger!=kTRDHQU && trigger!=kTRDHEE) {
2012 AliWarning("Beware you are erroneously trying to use this function (wrong trigger)");
2017 AliErrorClass("ESD event pointer is null");
2021 Int_t nTrdTracks = esd->GetNumberOfTrdTracks();
2023 if (nTrdTracks > 0 && (trigger==kTRDHCO) ) {
2028 if(trigger!=kTRDHJT) {
2029 for (Int_t iTrack = 0; iTrack < nTrdTracks; ++iTrack) {
2031 AliESDTrdTrack *trdTrack = esd->GetTrdTrack(iTrack);
2032 if (!trdTrack) continue;
2034 // for the electron triggers we only consider matched tracks
2035 if(trigger==kTRDHQU)
2036 if ( (TMath::Abs(trdTrack->Pt()) > fTRDptHQU) && (trdTrack->GetPID() > fTRDpidHQU) ) {
2041 if(trigger==kTRDHSE)
2042 if ( (TMath::Abs(trdTrack->Pt()) > fTRDptHSE) && (trdTrack->GetPID() > fTRDpidHSE) ) {
2047 if(trigger==kTRDHEE)
2048 if ( (trdTrack->GetSector() >= fTRDminSectorHEE) && (trdTrack->GetSector() <= fTRDmaxSectorHEE) &&
2049 (TMath::Abs(trdTrack->Pt()) > fTRDptHSE) && (trdTrack->GetPID() > fTRDpidHSE) ) {
2055 } else if(trigger==kTRDHJT) {
2057 Int_t nTracks[90] = { 0 }; // stack-wise counted number of tracks above pt threshold
2059 for (Int_t iTrack = 0; iTrack < nTrdTracks; ++iTrack) {
2061 AliESDTrdTrack *trdTrack = esd->GetTrdTrack(iTrack);
2062 if (!trdTrack) continue;
2064 Int_t globalStack = 5*trdTrack->GetSector() + trdTrack->GetStack();
2066 // stack-wise counting of tracks above pt threshold for jet trigger
2067 if (TMath::Abs(trdTrack->GetPt()) >= fTRDptHJT) {
2068 ++nTracks[globalStack];
2072 // check if HJT condition is fulfilled in any stack
2073 for (Int_t iStack = 0; iStack < 90; iStack++) {
2074 if (nTracks[iStack] >= fTRDnHJT) {