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()
209 // creates the monitoring histograms
211 // do not add this hists to the directory
212 Bool_t oldStatus = TH1::AddDirectoryStatus();
213 TH1::AddDirectory(kFALSE);
215 fHistBitsSPD = new TH2F("fHistBitsSPD", "SPD GFO;number of fired chips (offline);number of fired chips (hardware)", 1202, -1.5, 1200.5, 1202, -1.5, 1200.5);
216 fHistFiredBitsSPD = new TH1F("fHistFiredBitsSPD", "SPD GFO Hardware;chip number;events", 1200, -0.5, 1199.5);
217 fHistSPDClsVsTrk = new TH2F("fHistSPDClsVsTrk", "SPD Clusters vs Tracklets", 300, -0.5, 2999.5, 1000, -0.5, 9999.5);
218 fHistV0A = new TH1F("fHistV0A", "V0A;leading time (ns);events", 400, -100, 100);
219 fHistV0C = new TH1F("fHistV0C", "V0C;leading time (ns);events", 400, -100, 100);
220 fHistZDC = new TH1F("fHistZDC", "ZDC;trigger bits;events", 8, -1.5, 6.5);
221 fHistTDCZDC = new TH1F("fHistTDCZDC", "ZDC;TDC bits;events", 32, -0.5, 32-0.5);
222 fHistTimeZDC = new TH2F("fHistTimeZDC", "ZDC;TDC timing A+C vs C-A; events", 120,-30,30,120,-600,-540);
223 fHistTimeCorrZDC = new TH2F("fHistTimeCorrZDC", "ZDC;Corrected TDC timing A+C vs C-A; events", 120,-30,30,260,-100,30);
226 fHistFMDA = new TH1F("fHistFMDA", "FMDA;combinations above threshold;events", 102, -1.5, 100.5);
227 fHistFMDC = new TH1F("fHistFMDC", "FMDC;combinations above threshold;events", 102, -1.5, 100.5);
228 fHistFMDSingle = new TH1F("fHistFMDSingle", "FMD single;multiplicity value;counts", 1000, 0, 10);
229 fHistFMDSum = new TH1F("fHistFMDSum", "FMD sum;multiplicity value;counts", 1000, 0, 10);
230 fHistT0 = new TH1F("fHistT0", "T0;time (ns);events", 100, -25, 25);
232 fTriggerClasses = new TMap;
233 fTriggerClasses->SetOwner();
235 TH1::AddDirectory(oldStatus);
238 //____________________________________________________________________
239 const char* AliTriggerAnalysis::GetTriggerName(Trigger trigger)
241 // returns the name of the requested trigger
242 // the returned string will only be valid until the next call to this function [not thread-safe]
246 UInt_t triggerNoFlags = (UInt_t) trigger % (UInt_t) kStartOfFlags;
248 switch (triggerNoFlags)
250 case kAcceptAll : str = "ACCEPT ALL (bypass!)"; break;
251 case kMB1 : str = "MB1"; break;
252 case kMB2 : str = "MB2"; break;
253 case kMB3 : str = "MB3"; break;
254 case kSPDGFO : str = "SPD GFO"; break;
255 case kSPDGFOBits : str = "SPD GFO Bits"; break;
256 case kSPDGFOL0 : str = "SPD GFO L0 (first layer)"; break;
257 case kSPDGFOL1 : str = "SPD GFO L1 (second layer)"; break;
258 case kSPDClsVsTrkBG : str = "Cluster vs Tracklets"; break;
259 case kV0A : str = "V0 A BB"; break;
260 case kV0C : str = "V0 C BB"; break;
261 case kV0OR : str = "V0 OR BB"; break;
262 case kV0AND : str = "V0 AND BB"; break;
263 case kV0ABG : str = "V0 A BG"; break;
264 case kV0CBG : str = "V0 C BG"; break;
265 case kZDC : str = "ZDC"; break;
266 case kZDCA : str = "ZDC A"; break;
267 case kZDCC : str = "ZDC C"; break;
268 case kZNA : str = "ZN A"; break;
269 case kZNC : str = "ZN C"; break;
270 case kZNABG : str = "ZN A BG"; break;
271 case kZNCBG : str = "ZN C BG"; break;
272 case kFMDA : str = "FMD A"; break;
273 case kFMDC : str = "FMD C"; break;
274 case kFPANY : str = "SPD GFO | V0 | ZDC | FMD"; break;
275 case kNSD1 : str = "NSD1"; break;
276 case kMB1Prime: str = "MB1prime"; break;
277 case kZDCTDCA : str = "ZDC TDC A"; break;
278 case kZDCTDCC : str = "ZDC TDC C"; break;
279 case kZDCTime : str = "ZDC Time Cut"; break;
280 case kCentral : str = "V0 Central"; break;
281 case kSemiCentral : str = "V0 Semi-central"; break;
282 case kEMCAL : str = "EMCAL"; break;
283 case kTRDHCO : str = "TRD cosmics"; break;
284 case kTRDHJT : str = "TRD Jet"; break;
285 case kTRDHSE : str = "TRD Single Electron"; break;
286 case kTRDHQU : str = "TRD Quarkonia"; break;
287 case kTRDHEE : str = "TRD Dielectron"; break;
288 default: str = ""; break;
291 if (trigger & kOfflineFlag)
294 if (trigger & kOneParticle)
295 str += " OneParticle";
297 if (trigger & kOneTrack)
303 Bool_t AliTriggerAnalysis::IsTriggerFired(const AliESDEvent* aEsd, Trigger trigger)
305 // checks if an event has been triggered
307 if (trigger & kOfflineFlag)
308 return IsOfflineTriggerFired(aEsd, trigger);
310 return IsTriggerBitFired(aEsd, trigger);
313 Bool_t AliTriggerAnalysis::IsTriggerBitFired(const AliESDEvent* aEsd, Trigger trigger) const
315 // checks if an event is fired using the trigger bits
317 return IsTriggerBitFired(aEsd->GetTriggerMask(), trigger);
320 Bool_t AliTriggerAnalysis::IsTriggerBitFired(ULong64_t triggerMask, Trigger trigger) const
322 // checks if an event is fired using the trigger bits
324 // this function needs the branch TriggerMask in the ESD
326 // definitions from p-p.cfg
327 ULong64_t spdFO = (1 << 14);
328 ULong64_t v0left = (1 << 10);
329 ULong64_t v0right = (1 << 11);
340 if (triggerMask & spdFO || ((triggerMask & v0left) || (triggerMask & v0right)))
346 if (triggerMask & spdFO && ((triggerMask & v0left) || (triggerMask & v0right)))
352 if (triggerMask & spdFO && (triggerMask & v0left) && (triggerMask & v0right))
358 if (triggerMask & spdFO)
363 Printf("IsEventTriggered: ERROR: Trigger type %d not implemented in this method", (Int_t) trigger);
370 Bool_t AliTriggerAnalysis::IsTriggerBitFired(const AliESDEvent* aEsd, ULong64_t tclass) const
372 // Checks if corresponding bit in mask is on
374 ULong64_t trigmask = aEsd->GetTriggerMask();
375 return (trigmask & (1ull << (tclass-1)));
378 Int_t AliTriggerAnalysis::EvaluateTrigger(const AliESDEvent* aEsd, Trigger trigger)
380 // evaluates a given trigger "offline"
381 // trigger combinations are not supported, for that see IsOfflineTriggerFired
383 UInt_t triggerNoFlags = (UInt_t) trigger % (UInt_t) kStartOfFlags;
384 Bool_t offline = kFALSE;
385 if (trigger & kOfflineFlag)
389 switch (triggerNoFlags)
393 decision = SPDFiredChips(aEsd, (offline) ? 0 : 1);
398 decision = SPDFiredChips(aEsd, (offline) ? 0 : 1, kFALSE, 1);
403 decision = SPDFiredChips(aEsd, (offline) ? 0 : 1, kFALSE, 2);
409 AliFatal(Form("Online trigger not available for trigger %d", triggerNoFlags));
410 decision = IsSPDClusterVsTrackletBG(aEsd);
415 if (V0Trigger(aEsd, kASide, !offline) == kV0BB)
421 if (V0Trigger(aEsd, kCSide, !offline) == kV0BB)
427 if (V0Trigger(aEsd, kASide, !offline) == kV0BG)
433 if (V0Trigger(aEsd, kCSide, !offline) == kV0BG)
439 if (T0Trigger(aEsd, !offline) == kT0BB)
446 AliFatal(Form("Online trigger not available for trigger %d", triggerNoFlags));
447 if (T0Trigger(aEsd, !offline) == kT0DecBG)
454 AliFatal(Form("Online trigger not available for trigger %d", triggerNoFlags));
455 if (T0Trigger(aEsd, !offline) == kT0DecPileup)
462 AliFatal(Form("Online trigger not available for trigger %d", triggerNoFlags));
463 if (ZDCTrigger(aEsd, kASide))
470 AliFatal(Form("Online trigger not available for trigger %d", triggerNoFlags));
471 if (ZDCTrigger(aEsd, kCSide))
478 AliFatal(Form("Online trigger not available for trigger %d", triggerNoFlags));
479 if (ZDCTDCTrigger(aEsd, kASide))
486 AliFatal(Form("Online trigger not available for trigger %d", triggerNoFlags));
487 if (ZDCTDCTrigger(aEsd, kCSide))
494 AliFatal(Form("Online trigger not available for trigger %d", triggerNoFlags));
495 if (ZDCTimeTrigger(aEsd))
502 AliFatal(Form("Online trigger not available for trigger %d", triggerNoFlags));
503 if (ZDCTDCTrigger(aEsd,kASide,kTRUE,kFALSE,kFALSE))
510 AliFatal(Form("Online trigger not available for trigger %d", triggerNoFlags));
511 if (ZDCTDCTrigger(aEsd,kCSide,kTRUE,kFALSE,kFALSE))
518 AliFatal(Form("Online trigger not available for trigger %d", triggerNoFlags));
519 if (ZDCTimeBGTrigger(aEsd,kASide))
526 AliFatal(Form("Online trigger not available for trigger %d", triggerNoFlags));
527 if (ZDCTimeBGTrigger(aEsd,kCSide))
534 AliFatal(Form("Online trigger not available for trigger %d", triggerNoFlags));
535 if (FMDTrigger(aEsd, kASide))
542 AliFatal(Form("Online trigger not available for trigger %d", triggerNoFlags));
543 if (FMDTrigger(aEsd, kCSide))
550 AliFatal(Form("Offline trigger not available for trigger %d", triggerNoFlags));
551 if (IsL0InputFired(aEsd, 2))
558 AliFatal(Form("Offline trigger not available for trigger %d", triggerNoFlags));
559 if (IsL0InputFired(aEsd, 3))
563 case kTPCLaserWarmUp:
566 AliFatal(Form("Online trigger not available for trigger %d", triggerNoFlags));
567 return IsLaserWarmUpTPCEvent(aEsd);
572 AliFatal(Form("Online trigger not available for trigger %d", triggerNoFlags));
573 return IsHVdipTPCEvent(aEsd);
578 AliFatal(Form("Offline trigger not available for trigger %d - use centrality selection", triggerNoFlags));
579 if (aEsd->GetVZEROData()) {
580 if (aEsd->GetVZEROData()->TestBit(AliESDVZERO::kTriggerChargeBitsFilled)) {
581 if (aEsd->GetVZEROData()->GetTriggerBits() & (1<<AliESDVZERO::kCTA2andCTC2))
585 AliWarning("V0 centrality trigger bits were not filled!");
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::kCTA1andCTC1))
599 AliWarning("V0 centrality trigger bits were not filled!");
606 AliFatal(Form("Online trigger not available for trigger %d", triggerNoFlags));
607 if (EMCALCellsTrigger(aEsd))
614 AliFatal(Form("Online trigger not available for trigger %d", triggerNoFlags));
615 if(TRDTrigger(aEsd,kTRDHCO))
622 AliFatal(Form("Online trigger not available for trigger %d", triggerNoFlags));
623 if(TRDTrigger(aEsd,kTRDHJT))
630 AliFatal(Form("Online trigger not available for trigger %d", triggerNoFlags));
631 if(TRDTrigger(aEsd,kTRDHSE))
638 AliFatal(Form("Online trigger not available for trigger %d", triggerNoFlags));
639 if(TRDTrigger(aEsd,kTRDHQU))
646 AliFatal(Form("Online trigger not available for trigger %d", triggerNoFlags));
647 if(TRDTrigger(aEsd,kTRDHEE))
653 AliFatal(Form("Trigger type %d not implemented", triggerNoFlags));
660 Bool_t AliTriggerAnalysis::IsLaserWarmUpTPCEvent(const AliESDEvent* esd)
663 // This function flags noisy TPC events which can happen during laser warm-up.
666 Int_t trackCounter = 0;
667 for (Int_t i=0; i<esd->GetNumberOfTracks(); ++i)
669 AliESDtrack *track = esd->GetTrack(i);
673 if (track->GetTPCNcls() < 30) continue;
674 if (TMath::Abs(track->Eta()) > 0.005) continue;
675 if (track->Pt() < 4) continue;
676 if (track->GetKinkIndex(0) > 0) continue;
678 UInt_t status = track->GetStatus();
679 if ((status&AliESDtrack::kITSrefit)==AliESDtrack::kITSrefit) continue; // explicitly ask for tracks without ITS refit
680 if ((status&AliESDtrack::kTPCrefit)!=AliESDtrack::kTPCrefit) continue;
682 if (track->GetTPCsignal() > 10) continue; // explicitly ask for tracks without dE/dx
686 if (trackCounter > 15)
691 Bool_t AliTriggerAnalysis::IsHVdipTPCEvent(const AliESDEvent* esd) {
693 // This function flags events in which the TPC chamber HV is not at its nominal value
695 if (!esd->IsDetectorOn(AliDAQ::kTPC)) return kTRUE;
701 Bool_t AliTriggerAnalysis::IsOfflineTriggerFired(const AliESDEvent* aEsd, Trigger trigger)
703 // checks if an event has been triggered "offline"
705 UInt_t triggerNoFlags = (UInt_t) trigger % (UInt_t) kStartOfFlags;
707 Bool_t decision = kFALSE;
708 switch (triggerNoFlags)
717 if (SPDGFOTrigger(aEsd, 0) || V0Trigger(aEsd, kASide, kFALSE) == kV0BB || V0Trigger(aEsd, kCSide, kFALSE) == kV0BB)
723 if (SPDGFOTrigger(aEsd, 0) && (V0Trigger(aEsd, kASide, kFALSE) == kV0BB || V0Trigger(aEsd, kCSide, kFALSE) == kV0BB))
729 if (SPDGFOTrigger(aEsd, 0) && V0Trigger(aEsd, kASide, kFALSE) == kV0BB && V0Trigger(aEsd, kCSide, kFALSE) == kV0BB)
735 if (SPDGFOTrigger(aEsd, 0))
741 if (SPDGFOTrigger(aEsd, 1))
747 if (V0Trigger(aEsd, kASide, kFALSE) == kV0BB)
753 if (V0Trigger(aEsd, kCSide, kFALSE) == kV0BB)
759 if (V0Trigger(aEsd, kASide, kFALSE) == kV0BB || V0Trigger(aEsd, kCSide, kFALSE) == kV0BB)
765 if (V0Trigger(aEsd, kASide, kFALSE) == kV0BB && V0Trigger(aEsd, kCSide, kFALSE) == kV0BB)
771 if (V0Trigger(aEsd, kASide, kFALSE) == kV0BG)
777 if (V0Trigger(aEsd, kCSide, kFALSE) == kV0BG)
783 if (ZDCTrigger(aEsd, kASide) || ZDCTrigger(aEsd, kCentralBarrel) || ZDCTrigger(aEsd, kCSide))
789 if (ZDCTrigger(aEsd, kASide))
795 if (ZDCTrigger(aEsd, kCSide))
801 if (ZDCTDCTrigger(aEsd,kASide,kTRUE,kFALSE,kFALSE))
807 if (ZDCTDCTrigger(aEsd,kCSide,kTRUE,kFALSE,kFALSE))
813 if (ZDCTimeBGTrigger(aEsd,kASide))
819 if (ZDCTimeBGTrigger(aEsd,kCSide))
825 if (FMDTrigger(aEsd, kASide))
831 if (FMDTrigger(aEsd, kCSide))
837 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))
843 if (SPDFiredChips(aEsd, 0) >= 5 || (V0Trigger(aEsd, kASide, kFALSE) == kV0BB && V0Trigger(aEsd, kCSide, kFALSE) == kV0BB))
850 if (SPDGFOTrigger(aEsd, 0))
852 if (V0Trigger(aEsd, kASide, kFALSE) == kV0BB)
854 if (V0Trigger(aEsd, kCSide, kFALSE) == kV0BB)
864 if (EMCALCellsTrigger(aEsd))
870 if(TRDTrigger(aEsd,kTRDHCO))
876 if(TRDTrigger(aEsd,kTRDHJT))
882 if(TRDTrigger(aEsd,kTRDHSE))
888 if(TRDTrigger(aEsd,kTRDHQU))
894 if(TRDTrigger(aEsd,kTRDHEE))
900 AliFatal(Form("Trigger type %d not implemented", triggerNoFlags));
904 // hadron-level requirement
905 if (decision && (trigger & kOneParticle))
909 const AliESDVertex* vertex = aEsd->GetPrimaryVertexSPD();
910 const AliMultiplicity* mult = aEsd->GetMultiplicity();
912 if (mult && vertex && vertex->GetNContributors() > 0 && (!vertex->IsFromVertexerZ() || vertex->GetDispersion() < 0.02) && TMath::Abs(vertex->GetZv()) < 5.5)
914 for (Int_t i=0; i<mult->GetNumberOfTracklets(); ++i)
916 if (TMath::Abs(mult->GetEta(i)) < 1)
925 // hadron level definition for TPC tracks
927 if (decision && (trigger & kOneTrack))
930 const AliESDVertex* vertex =0x0;
931 vertex = aEsd->GetPrimaryVertexTracks();
932 if (!vertex || vertex->GetNContributors() <= 0)
934 vertex = aEsd->GetPrimaryVertexSPD();
936 Float_t ptmin, ptmax;
937 fEsdTrackCuts->GetPtRange(ptmin,ptmax);
938 AliDebug(3, Form("ptmin = %f, ptmax = %f\n",ptmin, ptmax));
940 if (vertex && vertex->GetNContributors() > 0 && (!vertex->IsFromVertexerZ() || vertex->GetDispersion() < 0.02) && TMath::Abs(vertex->GetZv()) < 10.) {
941 AliDebug(3,Form("Check on the vertex passed\n"));
942 for (Int_t i=0; i<aEsd->GetNumberOfTracks(); ++i){
943 if (fTPCOnly == kFALSE){
944 if (fEsdTrackCuts->AcceptTrack(aEsd->GetTrack(i))){
945 AliDebug(2, Form("pt of track = %f --> check passed\n",aEsd->GetTrack(i)->Pt()));
952 AliESDtrack *tpcTrack = fEsdTrackCuts->GetTPCOnlyTrack((AliESDEvent*)aEsd, i);
954 AliDebug(3,Form("track %d is NOT a TPC track",i));
958 AliDebug(3,Form("track %d IS a TPC track",i));
959 if (!(fEsdTrackCuts->AcceptTrack(tpcTrack))) {
960 AliDebug(2, Form("TPC track %d NOT ACCEPTED, pt = %f, eta = %f",i,tpcTrack->Pt(), tpcTrack->Eta()));
961 delete tpcTrack; tpcTrack = 0x0;
963 } // end if the TPC track is not accepted
965 AliDebug(2, Form("TPC track %d ACCEPTED, pt = %f, eta = %f",i,tpcTrack->Pt(), tpcTrack->Eta()));
967 delete tpcTrack; tpcTrack = 0x0;
969 } // end if the TPC track is accepted
970 } // end if it is a TPC track
971 } // end if you are looking at TPC only tracks
972 } // end loop on tracks
973 } // end check on vertex
975 AliDebug(4,Form("Check on the vertex not passed\n"));
976 for (Int_t i=0; i<aEsd->GetNumberOfTracks(); ++i){
977 if (fEsdTrackCuts->AcceptTrack(aEsd->GetTrack(i))){
978 AliDebug(4,Form("pt of track = %f --> check would be passed if the vertex was ok\n",aEsd->GetTrack(i)->Pt()));
983 if (!decision) AliDebug(3,("Check for kOneTrack NOT passed\n"));
989 Bool_t AliTriggerAnalysis::IsTriggerClassFired(const AliESDEvent* aEsd, const Char_t* tclass) const
991 // tclass is logical function of inputs, e.g. 01 && 02 || 03 && 11 && 21
992 // = L0 inp 1 && L0 inp 2 || L0 inp 3 && L1 inp 1 && L2 inp 1
993 // NO brackets in logical function !
994 // Spaces between operators and inputs.
995 // Not all logical functions are available in CTP=
996 // =any function of first 4 inputs; 'AND' of other inputs, check not done
997 // This method will be replaced/complemened by similar one
998 // which works withh class and inputs names as in CTP cfg file
1000 TString TClass(tclass);
1001 TObjArray* tcltokens = TClass.Tokenize(" ");
1002 Char_t level=((TObjString*)tcltokens->At(0))->String()[0];
1003 UInt_t input=atoi((((TObjString*)tcltokens->At(0))->String()).Remove(0));
1004 Bool_t tcl = IsInputFired(aEsd,level,input);
1006 for (Int_t i=1;i<tcltokens->GetEntriesFast();i=i+2) {
1007 level=((TObjString*)tcltokens->At(i+1))->String()[0];
1008 input=atoi((((TObjString*)tcltokens->At(i+1))->String()).Remove(0));
1009 Bool_t inpnext = IsInputFired(aEsd,level,input);
1010 Char_t op =((TObjString*)tcltokens->At(i))->String()[0];
1011 if (op == '&') tcl=tcl && inpnext;
1012 else if (op == '|') tcl =tcl || inpnext;
1014 AliError(Form("Syntax error in %s", tclass));
1017 // tcltokens->Delete();
1023 // tcltokens->Delete();
1027 Bool_t AliTriggerAnalysis::IsInputFired(const AliESDEvent* aEsd, Char_t level, UInt_t input) const
1029 // Checks trigger input of any level
1033 case '0': return IsL0InputFired(aEsd,input);
1034 case '1': return IsL1InputFired(aEsd,input);
1035 case '2': return IsL2InputFired(aEsd,input);
1037 AliError(Form("Wrong level %i",level));
1042 Bool_t AliTriggerAnalysis::IsL0InputFired(const AliESDEvent* aEsd, UInt_t input) const
1044 // Checks if corresponding bit in mask is on
1046 UInt_t inpmask = aEsd->GetHeader()->GetL0TriggerInputs();
1047 return (inpmask & (1<<(input-1)));
1050 Bool_t AliTriggerAnalysis::IsL1InputFired(const AliESDEvent* aEsd, UInt_t input) const
1052 // Checks if corresponding bit in mask is on
1054 UInt_t inpmask = aEsd->GetHeader()->GetL1TriggerInputs();
1055 return (inpmask & (1<<(input-1)));
1058 Bool_t AliTriggerAnalysis::IsL2InputFired(const AliESDEvent* aEsd, UInt_t input) const
1060 // Checks if corresponding bit in mask is on
1062 UInt_t inpmask = aEsd->GetHeader()->GetL2TriggerInputs();
1063 return (inpmask & (1<<(input-1)));
1066 void AliTriggerAnalysis::FillHistograms(const AliESDEvent* aEsd)
1068 // fills the histograms with the info from the ESD
1070 fHistBitsSPD->Fill(SPDFiredChips(aEsd, 0), SPDFiredChips(aEsd, 1, kTRUE));
1072 V0Trigger(aEsd, kASide, kFALSE, kTRUE);
1073 V0Trigger(aEsd, kCSide, kFALSE, kTRUE);
1074 T0Trigger(aEsd, kFALSE, kTRUE);
1075 ZDCTDCTrigger(aEsd,kASide,kFALSE,kFALSE,kTRUE);
1076 ZDCTimeTrigger(aEsd,kTRUE);
1077 IsSPDClusterVsTrackletBG(aEsd, kTRUE);
1079 AliESDZDC* zdcData = aEsd->GetESDZDC();
1082 UInt_t quality = zdcData->GetESDQuality();
1084 // from Nora's presentation, general first physics meeting 16.10.09
1085 static UInt_t zpc = 0x20;
1086 static UInt_t znc = 0x10;
1087 static UInt_t zem1 = 0x08;
1088 static UInt_t zem2 = 0x04;
1089 static UInt_t zpa = 0x02;
1090 static UInt_t zna = 0x01;
1092 fHistZDC->Fill(1, (quality & zna) ? 1 : 0);
1093 fHistZDC->Fill(2, (quality & zpa) ? 1 : 0);
1094 fHistZDC->Fill(3, (quality & zem2) ? 1 : 0);
1095 fHistZDC->Fill(4, (quality & zem1) ? 1 : 0);
1096 fHistZDC->Fill(5, (quality & znc) ? 1 : 0);
1097 fHistZDC->Fill(6, (quality & zpc) ? 1 : 0);
1102 AliError("AliESDZDC not available");
1106 fHistFMDA->Fill(FMDHitCombinations(aEsd, kASide, kTRUE));
1107 fHistFMDC->Fill(FMDHitCombinations(aEsd, kCSide, kTRUE));
1111 void AliTriggerAnalysis::FillTriggerClasses(const AliESDEvent* aEsd)
1113 // fills trigger classes map
1115 TParameter<Long64_t>* count = dynamic_cast<TParameter<Long64_t>*> (fTriggerClasses->GetValue(aEsd->GetFiredTriggerClasses().Data()));
1118 count = new TParameter<Long64_t>(aEsd->GetFiredTriggerClasses(), 0);
1119 fTriggerClasses->Add(new TObjString(aEsd->GetFiredTriggerClasses().Data()), count);
1121 count->SetVal(count->GetVal() + 1);
1124 Int_t AliTriggerAnalysis::SSDClusters(const AliESDEvent* aEsd)
1126 // returns the number of clusters in the SSD
1127 const AliMultiplicity* mult = aEsd->GetMultiplicity();
1128 Int_t clusters = mult->GetNumberOfITSClusters(4)+mult->GetNumberOfITSClusters(5);
1133 Int_t AliTriggerAnalysis::SPDFiredChips(const AliESDEvent* aEsd, Int_t origin, Bool_t fillHists, Int_t layer)
1135 // returns the number of fired chips in the SPD
1137 // origin = 0 --> aEsd->GetMultiplicity()->GetNumberOfFiredChips() (filled from clusters)
1138 // origin = 1 --> aEsd->GetMultiplicity()->TestFastOrFiredChips() (from hardware bits)
1139 // layer = 0 --> both layers
1140 // layer = 1 --> inner
1141 // layer = 2 --> outer
1143 const AliMultiplicity* mult = aEsd->GetMultiplicity();
1146 AliError("AliMultiplicity not available");
1152 return mult->GetNumberOfFiredChips(0) + mult->GetNumberOfFiredChips(1);
1154 return mult->GetNumberOfFiredChips(layer-1);
1160 Int_t firstChip = 0;
1161 Int_t lastChip = 1200;
1167 for (Int_t i=firstChip; i<lastChip; i++)
1169 if (mult->TestFastOrFiredChips(i) == kTRUE)
1171 // efficiency simulation (if enabled)
1172 if (fSPDGFOEfficiency)
1174 if (gRandom->Uniform() > fSPDGFOEfficiency->GetBinContent(i+1))
1180 fHistFiredBitsSPD->Fill(i);
1189 Bool_t AliTriggerAnalysis::SPDGFOTrigger(const AliESDEvent* aEsd, Int_t origin)
1191 // Returns if the SPD gave a global Fast OR trigger
1193 Int_t firedChips = SPDFiredChips(aEsd, origin);
1195 if (firedChips >= fSPDGFOThreshold)
1200 Bool_t AliTriggerAnalysis::IsSPDClusterVsTrackletBG(const AliESDEvent* aEsd, Bool_t fillHists){
1201 //rejects BG based on the cluster vs tracklet correlation
1202 // returns true if the event is BG
1203 const AliMultiplicity* mult = aEsd->GetMultiplicity();
1205 AliFatal("No multiplicity object"); // TODO: Should this be fatal?
1207 Int_t ntracklet = mult->GetNumberOfTracklets();
1209 Int_t spdClusters = 0;
1210 for(Int_t ilayer = 0; ilayer < 2; ilayer++){
1211 spdClusters += mult->GetNumberOfITSClusters(ilayer);
1215 fHistSPDClsVsTrk->Fill(ntracklet,spdClusters);
1218 Bool_t isCvsTOk = kFALSE;
1219 Float_t limit = Float_t(fASPDCvsTCut) + Float_t(ntracklet) * fBSPDCvsTCut;
1220 if (spdClusters > limit) isCvsTOk = kTRUE;
1221 else isCvsTOk = kFALSE ;
1228 AliTriggerAnalysis::V0Decision AliTriggerAnalysis::V0Trigger(const AliESDEvent* aEsd, AliceSide side, Bool_t online, Bool_t fillHists)
1230 // Returns the V0 trigger decision in V0A | V0C
1232 // Returns kV0Fake if the calculated average time is in a window where neither BB nor BG is expected.
1233 // The rate of such triggers can be used to estimate the background. Note that the rate has to be
1234 // rescaled with the size of the windows (numerical values see below in the code)
1236 // argument 'online' is used as a switch between online and offline trigger algorithms
1238 // Based on an algorithm by Cvetan Cheshkov
1240 AliESDVZERO* esdV0 = aEsd->GetVZEROData();
1243 AliError("AliESDVZERO not available");
1246 AliDebug(2,Form("In V0Trigger: %f %f",esdV0->GetV0ATime(),esdV0->GetV0CTime()));
1256 else if (side == kCSide)
1264 if (esdV0->TestBit(AliESDVZERO::kDecisionFilled)) {
1266 if (esdV0->TestBit(AliESDVZERO::kOnlineBitsFilled)) {
1267 for (Int_t i = begin; i < end; ++i) {
1268 if (esdV0->GetBBFlag(i)) return kV0BB;
1270 for (Int_t i = begin; i < end; ++i) {
1271 if (esdV0->GetBGFlag(i)) return kV0BG;
1276 AliWarning("V0 online trigger analysis is not yet available!");
1283 if (side == kASide && fHistV0A)
1284 fHistV0A->Fill(esdV0->GetV0ATime());
1285 if (side == kCSide && fHistV0C)
1286 fHistV0C->Fill(esdV0->GetV0CTime());
1289 if (side == kASide) return (V0Decision)esdV0->GetV0ADecision();
1290 else if (side == kCSide) return (V0Decision)esdV0->GetV0CDecision();
1291 else return kV0Invalid;
1300 if (aEsd->GetRunNumber() <= 104803) runRange = 0;
1301 else if (aEsd->GetRunNumber() <= 104876) runRange = 1;
1304 Float_t factors[3][64] = {
1305 // runs: 104792-104803
1306 {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},
1307 // runs: 104841-104876
1308 {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},
1310 {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}
1312 Float_t dA = 77.4 - 11.0;
1313 Float_t dC = 77.4 - 2.9;
1314 // Time misalignment
1315 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};
1316 Float_t dA2 = 2.8, dC2 = 3.3;
1319 for (Int_t i = begin; i < end; ++i) {
1320 Float_t tempAdc = esdV0->GetAdc(i)/factors[runRange][i];
1321 Float_t tempTime = (i >= 32) ? esdV0->GetTime(i)+dA+timeShift[i]+dA2 : esdV0->GetTime(i)+dC+timeShift[i]+dC2;
1322 if (esdV0->GetTime(i) >= 1e-6 &&
1323 tempTime > fV0HwWinLow && tempTime < fV0HwWinHigh &&
1324 tempAdc > fV0HwAdcThr)
1330 for (Int_t i = begin; i < end; ++i) {
1331 Float_t tempAdc = esdV0->GetAdc(i)/factors[runRange][i];
1332 Float_t tempTime = (i >= 32) ? esdV0->GetTime(i)+dA : esdV0->GetTime(i)+dC;
1333 Float_t tempRawTime = (i >= 32) ? esdV0->GetTime(i)+dA+timeShift[i]+dA2 : esdV0->GetTime(i)+dC+timeShift[i]+dC2;
1334 if (esdV0->GetTime(i) >= 1e-6 &&
1335 tempRawTime < 125.0 &&
1336 tempAdc > fV0AdcThr) {
1345 for (Int_t i = begin; i < end; ++i) {
1346 if (esdV0->GetTime(i) >= 1e-6 &&
1347 esdV0->GetTime(i) > fV0HwWinLow && esdV0->GetTime(i) < fV0HwWinHigh &&
1348 esdV0->GetAdc(i) > fV0HwAdcThr)
1354 for (Int_t i = begin; i < end; ++i) {
1355 if (esdV0->GetTime(i) > 1e-6 && esdV0->GetAdc(i) > fV0AdcThr) {
1356 Float_t correctedTime = V0CorrectLeadingTime(i, esdV0->GetTime(i), esdV0->GetAdc(i),aEsd->GetRunNumber());
1357 Float_t timeWeight = V0LeadingTimeWeight(esdV0->GetAdc(i));
1358 time += correctedTime*timeWeight;
1360 weight += timeWeight;
1368 time += fV0TimeOffset;
1372 if (side == kASide && fHistV0A)
1373 fHistV0A->Fill(time);
1374 if (side == kCSide && fHistV0C)
1375 fHistV0C->Fill(time);
1380 if (time > 68 && time < 100)
1382 if (time > 54 && time < 57.5)
1384 if (time > 57.5 && time < 68)
1390 if (time > 75.5 && time < 100)
1392 if (time > 69.5 && time < 73)
1394 if (time > 55 && time < 69.5)
1401 Float_t AliTriggerAnalysis::V0CorrectLeadingTime(Int_t i, Float_t time, Float_t adc, Int_t runNumber) const
1403 // Correct for slewing and align the channels
1405 // Authors: Cvetan Cheshkov / Raphael Tieulent
1407 if (time == 0) return 0;
1410 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};
1412 if(runNumber < 106031)
1413 time -= timeShift[i];
1415 // Slewing correction
1416 if (adc == 0) return time;
1418 Float_t p1 = 1.57345e1;
1419 Float_t p2 =-4.25603e-1;
1421 if(runNumber >= 106031) adc *= (2.5/4.0);
1422 return (time - p1*TMath::Power(adc,p2));
1425 Float_t AliTriggerAnalysis::V0LeadingTimeWeight(Float_t adc) const
1427 if (adc < 1e-6) return 0;
1429 Float_t p1 = 40.211;
1430 Float_t p2 =-4.25603e-1;
1431 Float_t p3 = 0.5646;
1433 return 1./(p1*p1*TMath::Power(adc,2.*(p2-1.))+p3*p3);
1437 Bool_t AliTriggerAnalysis::ZDCTDCTrigger(const AliESDEvent* aEsd, AliceSide side, Bool_t useZN, Bool_t useZP, Bool_t fillHists) const
1439 // Returns if ZDC triggered, based on TDC information
1441 AliESDZDC *esdZDC = aEsd->GetESDZDC();
1443 Bool_t zdcNA = kFALSE;
1444 Bool_t zdcNC = kFALSE;
1445 Bool_t zdcPA = kFALSE;
1446 Bool_t zdcPC = kFALSE;
1449 // If it's MC, we use the energy
1450 Double_t minEnergy = 0;
1451 Double_t zNCEnergy = esdZDC->GetZDCN1Energy();
1452 Double_t zPCEnergy = esdZDC->GetZDCP1Energy();
1453 Double_t zNAEnergy = esdZDC->GetZDCN2Energy();
1454 Double_t zPAEnergy = esdZDC->GetZDCP2Energy();
1455 zdcNA = (zNAEnergy>minEnergy);
1456 zdcNC = (zNCEnergy>minEnergy);
1457 zdcPA = (zPAEnergy>minEnergy);
1458 zdcPC = (zPCEnergy>minEnergy);
1463 Bool_t tdc[32] = {kFALSE};
1464 for(Int_t itdc=0; itdc<32; itdc++){
1465 for(Int_t i=0; i<4; i++){
1466 if (esdZDC->GetZDCTDCData(itdc, i) != 0){
1470 if(fillHists && tdc[itdc]) {
1471 fHistTDCZDC->Fill(itdc);
1480 if (side == kASide) return ((useZP&&zdcPA) || (useZN&&zdcNA));
1481 if (side == kCSide) return ((useZP&&zdcPC) || (useZN&&zdcNC));
1485 Bool_t AliTriggerAnalysis::ZDCTimeTrigger(const AliESDEvent *aEsd, Bool_t fillHists) const
1487 // This method implements a selection
1488 // based on the timing in both sides of zdcN
1489 // It can be used in order to eliminate
1490 // parasitic collisions
1491 Bool_t zdcAccept = kFALSE;
1492 AliESDZDC *esdZDC = aEsd->GetESDZDC();
1495 UInt_t esdFlag = esdZDC->GetESDQuality();
1497 Bool_t znaFired=kFALSE, zpaFired=kFALSE;
1498 Bool_t zem1Fired=kFALSE, zem2Fired=kFALSE;
1499 Bool_t zncFired=kFALSE, zpcFired=kFALSE;
1501 // **** Trigger patterns
1502 if((esdFlag & 0x00000001) == 0x00000001) znaFired=kTRUE;
1503 if((esdFlag & 0x00000002) == 0x00000002) zpaFired=kTRUE;
1504 if((esdFlag & 0x00000004) == 0x00000004) zem1Fired=kTRUE;
1505 if((esdFlag & 0x00000008) == 0x00000008) zem2Fired=kTRUE;
1506 if((esdFlag & 0x00000010) == 0x00000010) zncFired=kTRUE;
1507 if((esdFlag & 0x00000020) == 0x00000020) zpcFired=kTRUE;
1508 zdcAccept = (znaFired | zncFired);
1511 for(Int_t i = 0; i < 4; ++i) {
1512 if (esdZDC->GetZDCTDCData(10,i) != 0) {
1513 Float_t tdcC = 0.025*(esdZDC->GetZDCTDCData(10,i)-esdZDC->GetZDCTDCData(14,i));
1514 Float_t tdcCcorr = esdZDC->GetZDCTDCCorrected(10,i);
1515 for(Int_t j = 0; j < 4; ++j) {
1516 if (esdZDC->GetZDCTDCData(12,j) != 0) {
1517 Float_t tdcA = 0.025*(esdZDC->GetZDCTDCData(12,j)-esdZDC->GetZDCTDCData(14,j));
1519 Float_t tdcAcorr = esdZDC->GetZDCTDCCorrected(12,j);
1521 fHistTimeZDC->Fill(tdcC-tdcA,tdcC+tdcA);
1522 fHistTimeCorrZDC->Fill(tdcCcorr-tdcAcorr,tdcCcorr+tdcAcorr);
1524 if (esdZDC->TestBit(AliESDZDC::kCorrectedTDCFilled)) {
1525 if (((tdcCcorr-tdcAcorr-fZDCCutRefDeltaCorr)*(tdcCcorr-tdcAcorr-fZDCCutRefDeltaCorr)/(fZDCCutSigmaDeltaCorr*fZDCCutSigmaDeltaCorr) +
1526 (tdcCcorr+tdcAcorr-fZDCCutRefSumCorr)*(tdcCcorr+tdcAcorr-fZDCCutRefSumCorr)/(fZDCCutSigmaSumCorr*fZDCCutSigmaSumCorr))< 1.0)
1530 if (((tdcC-tdcA-fZDCCutRefDelta)*(tdcC-tdcA-fZDCCutRefDelta)/(fZDCCutSigmaDelta*fZDCCutSigmaDelta) +
1531 (tdcC+tdcA-fZDCCutRefSum)*(tdcC+tdcA-fZDCCutRefSum)/(fZDCCutSigmaSum*fZDCCutSigmaSum))< 1.0)
1542 Bool_t AliTriggerAnalysis::ZDCTimeBGTrigger(const AliESDEvent *aEsd, AliceSide side) const
1544 // This method implements a selection
1545 // based on the timing in of zdcN
1546 // It can be used in order to flag background
1547 // ** So far only implemented for the 2012 pA run **
1549 if(fMC) return kFALSE;
1551 AliESDZDC *zdcData = aEsd->GetESDZDC();
1552 Bool_t zna = kFALSE;
1553 Bool_t znc = kFALSE;
1554 Bool_t znabadhit = kFALSE;
1555 Bool_t zncbadhit = kFALSE;
1557 Float_t tdcC=999, tdcCcorr=999, tdcA=999, tdcAcorr=999;
1558 for(Int_t i = 0; i < 4; ++i) {
1559 if (zdcData->GetZDCTDCData(10,i) != 0) {
1561 tdcC = 0.025*(zdcData->GetZDCTDCData(10,i)-zdcData->GetZDCTDCData(14,i));
1562 tdcCcorr = zdcData->GetZDCTDCCorrected(10,i);
1563 if((TMath::Abs(tdcCcorr)<fZDCCutZNCTimeCorrMax) && (TMath::Abs(tdcCcorr)>fZDCCutZNCTimeCorrMin)) zncbadhit = kTRUE;
1566 for(Int_t j = 0; j < 4; ++j) {
1567 if (zdcData->GetZDCTDCData(12,j) != 0) {
1569 tdcA = 0.025*(zdcData->GetZDCTDCData(12,j)-zdcData->GetZDCTDCData(14,j));
1570 tdcAcorr = zdcData->GetZDCTDCCorrected(12,j);
1571 if((TMath::Abs(tdcAcorr)<fZDCCutZNATimeCorrMax) && (TMath::Abs(tdcAcorr)>fZDCCutZNATimeCorrMin)) znabadhit = kTRUE;
1575 const Int_t runNumber = aEsd->GetRunNumber();
1576 if(runNumber<188124 || (runNumber>188374 && runNumber<194713)){ // FIXME: end of pA-run is not known
1577 AliDebug(3,Form(" ZN BG time cut not implemented for run %d",runNumber));
1581 Bool_t znabg = (zna && znabadhit);
1582 Bool_t zncbg = (znc && zncbadhit);
1584 // 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);
1585 // Printf("Checking ZN background (time) for run %d, A-BG = %d, C-BG = %d",runNumber,(Int_t)znabg,(Int_t)zncbg);
1587 if (side == kASide) return znabg;
1588 if (side == kCSide) return zncbg;
1592 Bool_t AliTriggerAnalysis::ZDCTrigger(const AliESDEvent* aEsd, AliceSide side) const
1594 // Returns if ZDC triggered
1596 AliESDZDC* zdcData = aEsd->GetESDZDC();
1599 AliError("AliESDZDC not available");
1603 UInt_t quality = zdcData->GetESDQuality();
1605 // from Nora's presentation, general first physics meeting 16.10.09
1606 static UInt_t zpc = 0x20;
1607 static UInt_t znc = 0x10;
1608 static UInt_t zem1 = 0x08;
1609 static UInt_t zem2 = 0x04;
1610 static UInt_t zpa = 0x02;
1611 static UInt_t zna = 0x01;
1613 if (side == kASide && ((quality & zpa) || (quality & zna)))
1615 if (side == kCentralBarrel && ((quality & zem1) || (quality & zem2)))
1617 if (side == kCSide && ((quality & zpc) || (quality & znc)))
1623 Int_t AliTriggerAnalysis::FMDHitCombinations(const AliESDEvent* aEsd, AliceSide side, Bool_t fillHists)
1625 // returns number of hit combinations agove threshold
1627 // Authors: FMD team, Hans Dalsgaard (code merged from FMD/AliFMDOfflineTrigger)
1632 // Workaround for AliESDEvent::GetFMDData is not const!
1633 const AliESDFMD* fmdData = (const_cast<AliESDEvent*>(aEsd))->GetFMDData();
1636 AliError("AliESDFMD not available");
1640 Int_t detFrom = (side == kASide) ? 1 : 3;
1641 Int_t detTo = (side == kASide) ? 2 : 3;
1644 Float_t totalMult = 0;
1645 for (UShort_t det=detFrom;det<=detTo;det++) {
1646 Int_t nRings = (det == 1 ? 1 : 2);
1647 for (UShort_t ir = 0; ir < nRings; ir++) {
1648 Char_t ring = (ir == 0 ? 'I' : 'O');
1649 UShort_t nsec = (ir == 0 ? 20 : 40);
1650 UShort_t nstr = (ir == 0 ? 512 : 256);
1651 for (UShort_t sec =0; sec < nsec; sec++) {
1652 for (UShort_t strip = 0; strip < nstr; strip++) {
1653 Float_t mult = fmdData->Multiplicity(det,ring,sec,strip);
1654 if (mult == AliESDFMD::kInvalidMult) continue;
1657 fHistFMDSingle->Fill(mult);
1659 if (mult > fFMDLowCut)
1660 totalMult = totalMult + mult;
1663 if (totalMult > fFMDHitCut)
1667 fHistFMDSum->Fill(totalMult);
1679 Bool_t AliTriggerAnalysis::FMDTrigger(const AliESDEvent* aEsd, AliceSide side)
1681 // Returns if the FMD triggered
1683 // Authors: FMD team, Hans Dalsgaard (code merged from FMD/AliFMDOfflineTrigger)
1685 Int_t triggers = FMDHitCombinations(aEsd, side, kFALSE);
1693 Long64_t AliTriggerAnalysis::Merge(TCollection* list)
1695 // Merge a list of AliMultiplicityCorrection objects with this (needed for
1697 // Returns the number of merged objects (including this).
1702 if (list->IsEmpty())
1705 TIterator* iter = list->MakeIterator();
1708 // collections of all histograms
1709 const Int_t nHists = 14;
1710 TList collections[nHists];
1713 while ((obj = iter->Next())) {
1715 AliTriggerAnalysis* entry = dynamic_cast<AliTriggerAnalysis*> (obj);
1720 collections[n++].Add(entry->fHistV0A);
1721 collections[n++].Add(entry->fHistV0C);
1722 collections[n++].Add(entry->fHistZDC);
1723 collections[n++].Add(entry->fHistTDCZDC);
1724 collections[n++].Add(entry->fHistTimeZDC);
1725 collections[n++].Add(entry->fHistTimeCorrZDC);
1726 collections[n++].Add(entry->fHistFMDA);
1727 collections[n++].Add(entry->fHistFMDC);
1728 collections[n++].Add(entry->fHistFMDSingle);
1729 collections[n++].Add(entry->fHistFMDSum);
1730 collections[n++].Add(entry->fHistBitsSPD);
1731 collections[n++].Add(entry->fHistFiredBitsSPD);
1732 collections[n++].Add(entry->fHistSPDClsVsTrk);
1733 collections[n++].Add(entry->fHistT0);
1735 // merge fTriggerClasses
1736 TIterator* iter2 = entry->fTriggerClasses->MakeIterator();
1737 TObjString* obj2 = 0;
1738 while ((obj2 = dynamic_cast<TObjString*> (iter2->Next())))
1740 TParameter<Long64_t>* param2 = static_cast<TParameter<Long64_t>*> (entry->fTriggerClasses->GetValue(obj2));
1742 TParameter<Long64_t>* param1 = dynamic_cast<TParameter<Long64_t>*> (fTriggerClasses->GetValue(obj2));
1745 param1->SetVal(param1->GetVal() + param2->GetVal());
1749 param1 = dynamic_cast<TParameter<Long64_t>*> (param2->Clone());
1750 fTriggerClasses->Add(new TObjString(obj2->String()), param1);
1760 fHistV0A->Merge(&collections[n++]);
1761 fHistV0C->Merge(&collections[n++]);
1762 fHistZDC->Merge(&collections[n++]);
1763 fHistTDCZDC->Merge(&collections[n++]);
1765 fHistTimeZDC->Merge(&collections[n++]);
1768 if (fHistTimeCorrZDC)
1769 fHistTimeCorrZDC->Merge(&collections[n++]);
1772 fHistFMDA->Merge(&collections[n++]);
1773 fHistFMDC->Merge(&collections[n++]);
1774 fHistFMDSingle->Merge(&collections[n++]);
1775 fHistFMDSum->Merge(&collections[n++]);
1776 fHistBitsSPD->Merge(&collections[n++]);
1777 fHistFiredBitsSPD->Merge(&collections[n++]);
1778 fHistSPDClsVsTrk->Merge(&collections[n++]);
1779 fHistT0->Merge(&collections[n++]);
1785 void AliTriggerAnalysis::SaveHistograms() const
1787 // write histograms to current directory
1793 fHistBitsSPD->Write();
1794 fHistBitsSPD->ProjectionX();
1795 fHistBitsSPD->ProjectionY();
1797 else Printf("Cannot save fHistBitsSPD");
1798 if (fHistFiredBitsSPD) fHistFiredBitsSPD->Write();
1799 else Printf("Cannot save fHistFiredBitsSPD");
1800 if (fHistV0A) fHistV0A->Write();
1801 else Printf("Cannot save fHistV0A");
1802 if (fHistV0C) fHistV0C->Write();
1803 else Printf("Cannot save fHistV0C");
1804 if (fHistZDC) fHistZDC->Write();
1805 else Printf("Cannot save fHistZDC");
1806 if (fHistTDCZDC) fHistTDCZDC->Write();
1807 else Printf("Cannot save fHistTDCZDC");
1808 if (fHistTimeZDC) fHistTimeZDC->Write();
1809 else Printf("Cannot save fHistTimeZDC");
1810 if (fHistTimeCorrZDC) fHistTimeCorrZDC->Write();
1811 else Printf("Cannot save fHistTimeCorrZDC");
1812 if (fHistFMDA) fHistFMDA->Write();
1813 else Printf("Cannot save fHistFMDA");
1814 if (fHistFMDC) fHistFMDC->Write();
1815 else Printf("Cannot save fHistFMDC");
1816 if (fHistFMDSingle) fHistFMDSingle->Write();
1817 else Printf("Cannot save fHistFMDSingle");
1818 if (fHistFMDSum) fHistFMDSum->Write();
1819 else Printf("Cannot save fHistFMDSum");
1820 if (fSPDGFOEfficiency) fSPDGFOEfficiency->Write("fSPDGFOEfficiency");
1821 if (fHistSPDClsVsTrk) fHistSPDClsVsTrk->Write("fHistSPDClsVsTrk");
1822 if (fHistT0) fHistT0->Write("fHistT0");
1824 // else Printf("Cannot save fSPDGFOEfficiency");
1826 fTriggerClasses->Write("fTriggerClasses", TObject::kSingleKey);
1829 void AliTriggerAnalysis::PrintTriggerClasses() const
1831 // print trigger classes
1833 Printf("Trigger Classes:");
1835 Printf("Event count for trigger combinations:");
1838 singleTrigger.SetOwner();
1840 TIterator* iter = fTriggerClasses->MakeIterator();
1841 TObjString* obj = 0;
1842 while ((obj = dynamic_cast<TObjString*> (iter->Next())))
1844 TParameter<Long64_t>* param = static_cast<TParameter<Long64_t>*> (fTriggerClasses->GetValue(obj));
1846 Printf(" %s: %ld triggers", obj->String().Data(), (Long_t)param->GetVal());
1848 TObjArray* tokens = obj->String().Tokenize(" ");
1849 for (Int_t i=0; i<tokens->GetEntries(); i++)
1851 TParameter<Long64_t>* count = dynamic_cast<TParameter<Long64_t>*> (singleTrigger.GetValue(((TObjString*) tokens->At(i))->String().Data()));
1854 count = new TParameter<Long64_t>(((TObjString*) tokens->At(i))->String().Data(), 0);
1855 singleTrigger.Add(new TObjString(((TObjString*) tokens->At(i))->String().Data()), count);
1857 count->SetVal(count->GetVal() + param->GetVal());
1864 Printf("Event count for single trigger:");
1866 iter = singleTrigger.MakeIterator();
1867 while ((obj = dynamic_cast<TObjString*> (iter->Next())))
1869 TParameter<Long64_t>* param = static_cast<TParameter<Long64_t>*> (singleTrigger.GetValue(obj));
1871 Printf(" %s: %ld triggers", obj->String().Data(), (Long_t)param->GetVal());
1875 singleTrigger.DeleteAll();
1879 //----------------------------------------------------------------------------------------------------
1880 AliTriggerAnalysis::T0Decision AliTriggerAnalysis::T0Trigger(const AliESDEvent* aEsd, Bool_t online, Bool_t fillHists)
1882 // Returns the T0 TVDC trigger decision
1884 // argument 'online' is used as a switch between online and offline trigger algorithms
1885 // in online mode return 0TVX
1886 // in offline mode in addition check pile-up and background :
1887 // pile-up readed from ESD: check if TVDC (0TVX module name) has more 1 hit;
1888 // backgroud flag readed from ESD : check in given time interval OrA and OrC were correct but TVDC not
1890 // Based on an algorithm by Alla Maevskaya
1892 const AliESDTZERO* esdT0 = aEsd->GetESDTZERO();
1895 AliError("AliESDTZERO not available");
1898 //???? AliDebug(2,Form("In T0Trigger: %f %f",esdV0->GetV0ATime(),esdV0->GetV0CTime()));
1900 for (Int_t ii=0; ii<5; ii++)
1901 tvdc[ii] = esdT0->GetTVDC(ii);
1902 // Int_t trig=esdT0->GetT0Trig();
1903 // cout<<" T0 trig "<<trig<<endl;
1905 if(fillHists) fHistT0->Fill(tvdc[0]);
1908 if(aEsd->GetHeader()->GetFiredTriggerInputs().Contains("0TVX") ) return kT0BB;
1912 if (esdT0->GetPileupFlag()) return kT0DecPileup;
1913 if (esdT0->GetBackgroundFlag()) return kT0DecBG;
1914 if (tvdc[0]>-5 && tvdc[0]<5 && tvdc[0] != 0) return kT0BB;
1918 if( esdT0->GetT0zVertex()>-12.3 && esdT0->GetT0zVertex() < 10.3) return kT0BB;
1923 //----------------------------------------------------------------------------------------------------
1924 Bool_t AliTriggerAnalysis::EMCALCellsTrigger(const AliESDEvent *aEsd)
1927 // Returns the EMCAL trigger decision
1928 // so far only implemented for LHC11a data
1929 // see http://alisoft.cern.ch/viewvc/trunk/PWGGA/EMCALTasks/AliEmcalPhysicsSelection.cxx?view=markup&root=AliRoot Revision 56136
1932 Bool_t isFired = kTRUE;
1933 const Int_t runNumber = aEsd->GetRunNumber();
1936 // Load EMCAL branches from the manager
1937 AliAnalysisManager *am = AliAnalysisManager::GetAnalysisManager();
1938 am->LoadBranch("EMCALCells.");
1939 am->LoadBranch("CaloClusters");
1943 AliVCaloCells *cells = aEsd->GetEMCALCells();
1944 const Short_t nCells = cells->GetNumberOfCells();
1946 // count cells above threshold per sm
1947 Int_t nCellCount[10] = {0,0,0,0,0,0,0,0,0,0};
1948 for(Int_t iCell=0; iCell<nCells; ++iCell) {
1949 Short_t cellId = cells->GetCellNumber(iCell);
1950 Double_t cellE = cells->GetCellAmplitude(cellId);
1951 Int_t sm = cellId / (24*48);
1956 // Trigger decision for LHC11a
1957 Bool_t isLedEvent = kFALSE;
1958 if ((runNumber>=144871) && (runNumber<=146860)) {
1959 if (nCellCount[4] > 100)
1962 if ((runNumber>=146858) && (runNumber<=146860)) {
1963 if (nCellCount[3]>=35)
1976 //__________________________________________________________________________________________
1977 Bool_t AliTriggerAnalysis::TRDTrigger(const AliESDEvent *esd, Trigger trigger)
1979 // evaluate the TRD trigger conditions,
1980 // so far HCO, HSE, HQU, HJT, HEE
1982 Bool_t isFired = kFALSE;
1984 if(trigger!=kTRDHCO && trigger!=kTRDHJT && trigger!=kTRDHSE && trigger!=kTRDHQU && trigger!=kTRDHEE) {
1985 AliWarning("Beware you are erroneously trying to use this function (wrong trigger)");
1990 AliErrorClass("ESD event pointer is null");
1994 Int_t nTrdTracks = esd->GetNumberOfTrdTracks();
1996 if (nTrdTracks > 0 && (trigger==kTRDHCO) ) {
2001 if(trigger!=kTRDHJT) {
2002 for (Int_t iTrack = 0; iTrack < nTrdTracks; ++iTrack) {
2004 AliESDTrdTrack *trdTrack = esd->GetTrdTrack(iTrack);
2005 if (!trdTrack) continue;
2007 // for the electron triggers we only consider matched tracks
2008 if(trigger==kTRDHQU)
2009 if ( (TMath::Abs(trdTrack->Pt()) > fTRDptHQU) && (trdTrack->GetPID() > fTRDpidHQU) ) {
2014 if(trigger==kTRDHSE)
2015 if ( (TMath::Abs(trdTrack->Pt()) > fTRDptHSE) && (trdTrack->GetPID() > fTRDpidHSE) ) {
2020 if(trigger==kTRDHEE)
2021 if ( (trdTrack->GetSector() >= fTRDminSectorHEE) && (trdTrack->GetSector() <= fTRDmaxSectorHEE) &&
2022 (TMath::Abs(trdTrack->Pt()) > fTRDptHSE) && (trdTrack->GetPID() > fTRDpidHSE) ) {
2028 } else if(trigger==kTRDHJT) {
2030 Int_t nTracks[90] = { 0 }; // stack-wise counted number of tracks above pt threshold
2032 for (Int_t iTrack = 0; iTrack < nTrdTracks; ++iTrack) {
2034 AliESDTrdTrack *trdTrack = esd->GetTrdTrack(iTrack);
2035 if (!trdTrack) continue;
2037 Int_t globalStack = 5*trdTrack->GetSector() + trdTrack->GetStack();
2039 // stack-wise counting of tracks above pt threshold for jet trigger
2040 if (TMath::Abs(trdTrack->GetPt()) >= fTRDptHJT) {
2041 ++nTracks[globalStack];
2045 // check if HJT condition is fulfilled in any stack
2046 for (Int_t iStack = 0; iStack < 90; iStack++) {
2047 if (nTracks[iStack] >= fTRDnHJT) {