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 ClassImp(AliTriggerAnalysis)
50 AliTriggerAnalysis::AliTriggerAnalysis() :
58 fZDCCutRefSum(-568.5),
59 fZDCCutRefDelta(-2.1),
60 fZDCCutSigmaSum(3.25),
61 fZDCCutSigmaDelta(2.25),
62 fZDCCutRefSumCorr(-65.5),
63 fZDCCutRefDeltaCorr(-2.1),
64 fZDCCutSigmaSumCorr(6.0),
65 fZDCCutSigmaDeltaCorr(1.2),
93 AliTriggerAnalysis::~AliTriggerAnalysis()
103 if (fHistFiredBitsSPD)
105 delete fHistFiredBitsSPD;
106 fHistFiredBitsSPD = 0;
109 if (fHistSPDClsVsTrk)
111 delete fHistSPDClsVsTrk;
112 fHistSPDClsVsTrk = 0;
142 if (fHistTimeCorrZDC)
144 delete fHistTimeCorrZDC;
145 fHistTimeCorrZDC = 0;
162 delete fHistFMDSingle;
180 fTriggerClasses->DeleteAll();
181 delete fTriggerClasses;
186 delete fEsdTrackCuts;
191 void AliTriggerAnalysis::EnableHistograms()
193 // creates the monitoring histograms
195 // do not add this hists to the directory
196 Bool_t oldStatus = TH1::AddDirectoryStatus();
197 TH1::AddDirectory(kFALSE);
199 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);
200 fHistFiredBitsSPD = new TH1F("fHistFiredBitsSPD", "SPD GFO Hardware;chip number;events", 1200, -0.5, 1199.5);
201 fHistSPDClsVsTrk = new TH2F("fHistSPDClsVsTrk", "SPD Clusters vs Tracklets", 300, -0.5, 2999.5, 1000, -0.5, 9999.5);
202 fHistV0A = new TH1F("fHistV0A", "V0A;leading time (ns);events", 400, -100, 100);
203 fHistV0C = new TH1F("fHistV0C", "V0C;leading time (ns);events", 400, -100, 100);
204 fHistZDC = new TH1F("fHistZDC", "ZDC;trigger bits;events", 8, -1.5, 6.5);
205 fHistTDCZDC = new TH1F("fHistTDCZDC", "ZDC;TDC bits;events", 32, -0.5, 32-0.5);
206 fHistTimeZDC = new TH2F("fHistTimeZDC", "ZDC;TDC timing A+C vs C-A; events", 120,-30,30,120,-600,-540);
207 fHistTimeCorrZDC = new TH2F("fHistTimeCorrZDC", "ZDC;Corrected TDC timing A+C vs C-A; events", 120,-30,30,260,-100,30);
210 fHistFMDA = new TH1F("fHistFMDA", "FMDA;combinations above threshold;events", 102, -1.5, 100.5);
211 fHistFMDC = new TH1F("fHistFMDC", "FMDC;combinations above threshold;events", 102, -1.5, 100.5);
212 fHistFMDSingle = new TH1F("fHistFMDSingle", "FMD single;multiplicity value;counts", 1000, 0, 10);
213 fHistFMDSum = new TH1F("fHistFMDSum", "FMD sum;multiplicity value;counts", 1000, 0, 10);
214 fHistT0 = new TH1F("fHistT0", "T0;time (ns);events", 100, -25, 25);
216 fTriggerClasses = new TMap;
217 fTriggerClasses->SetOwner();
219 TH1::AddDirectory(oldStatus);
222 //____________________________________________________________________
223 const char* AliTriggerAnalysis::GetTriggerName(Trigger trigger)
225 // returns the name of the requested trigger
226 // the returned string will only be valid until the next call to this function [not thread-safe]
230 UInt_t triggerNoFlags = (UInt_t) trigger % (UInt_t) kStartOfFlags;
232 switch (triggerNoFlags)
234 case kAcceptAll : str = "ACCEPT ALL (bypass!)"; break;
235 case kMB1 : str = "MB1"; break;
236 case kMB2 : str = "MB2"; break;
237 case kMB3 : str = "MB3"; break;
238 case kSPDGFO : str = "SPD GFO"; break;
239 case kSPDGFOBits : str = "SPD GFO Bits"; break;
240 case kSPDGFOL0 : str = "SPD GFO L0 (first layer)"; break;
241 case kSPDGFOL1 : str = "SPD GFO L1 (second layer)"; break;
242 case kSPDClsVsTrkBG : str = "Cluster vs Tracklets"; break;
243 case kV0A : str = "V0 A BB"; break;
244 case kV0C : str = "V0 C BB"; break;
245 case kV0OR : str = "V0 OR BB"; break;
246 case kV0AND : str = "V0 AND BB"; break;
247 case kV0ABG : str = "V0 A BG"; break;
248 case kV0CBG : str = "V0 C BG"; break;
249 case kZDC : str = "ZDC"; break;
250 case kZDCA : str = "ZDC A"; break;
251 case kZDCC : str = "ZDC C"; break;
252 case kZNA : str = "ZN A"; break;
253 case kZNC : str = "ZN C"; break;
254 case kZNABG : str = "ZN A BG"; break;
255 case kZNCBG : str = "ZN C BG"; break;
256 case kFMDA : str = "FMD A"; break;
257 case kFMDC : str = "FMD C"; break;
258 case kFPANY : str = "SPD GFO | V0 | ZDC | FMD"; break;
259 case kNSD1 : str = "NSD1"; break;
260 case kMB1Prime: str = "MB1prime"; break;
261 case kZDCTDCA : str = "ZDC TDC A"; break;
262 case kZDCTDCC : str = "ZDC TDC C"; break;
263 case kZDCTime : str = "ZDC Time Cut"; break;
264 case kCentral : str = "V0 Central"; break;
265 case kSemiCentral : str = "V0 Semi-central"; break;
266 case kEMCAL : str = "EMCAL"; break;
267 default: str = ""; break;
270 if (trigger & kOfflineFlag)
273 if (trigger & kOneParticle)
274 str += " OneParticle";
276 if (trigger & kOneTrack)
282 Bool_t AliTriggerAnalysis::IsTriggerFired(const AliESDEvent* aEsd, Trigger trigger)
284 // checks if an event has been triggered
286 if (trigger & kOfflineFlag)
287 return IsOfflineTriggerFired(aEsd, trigger);
289 return IsTriggerBitFired(aEsd, trigger);
292 Bool_t AliTriggerAnalysis::IsTriggerBitFired(const AliESDEvent* aEsd, Trigger trigger) const
294 // checks if an event is fired using the trigger bits
296 return IsTriggerBitFired(aEsd->GetTriggerMask(), trigger);
299 Bool_t AliTriggerAnalysis::IsTriggerBitFired(ULong64_t triggerMask, Trigger trigger) const
301 // checks if an event is fired using the trigger bits
303 // this function needs the branch TriggerMask in the ESD
305 // definitions from p-p.cfg
306 ULong64_t spdFO = (1 << 14);
307 ULong64_t v0left = (1 << 10);
308 ULong64_t v0right = (1 << 11);
319 if (triggerMask & spdFO || ((triggerMask & v0left) || (triggerMask & v0right)))
325 if (triggerMask & spdFO && ((triggerMask & v0left) || (triggerMask & v0right)))
331 if (triggerMask & spdFO && (triggerMask & v0left) && (triggerMask & v0right))
337 if (triggerMask & spdFO)
342 Printf("IsEventTriggered: ERROR: Trigger type %d not implemented in this method", (Int_t) trigger);
349 Bool_t AliTriggerAnalysis::IsTriggerBitFired(const AliESDEvent* aEsd, ULong64_t tclass) const
351 // Checks if corresponding bit in mask is on
353 ULong64_t trigmask = aEsd->GetTriggerMask();
354 return (trigmask & (1ull << (tclass-1)));
357 Int_t AliTriggerAnalysis::EvaluateTrigger(const AliESDEvent* aEsd, Trigger trigger)
359 // evaluates a given trigger "offline"
360 // trigger combinations are not supported, for that see IsOfflineTriggerFired
362 UInt_t triggerNoFlags = (UInt_t) trigger % (UInt_t) kStartOfFlags;
363 Bool_t offline = kFALSE;
364 if (trigger & kOfflineFlag)
368 switch (triggerNoFlags)
372 decision = SPDFiredChips(aEsd, (offline) ? 0 : 1);
377 decision = SPDFiredChips(aEsd, (offline) ? 0 : 1, kFALSE, 1);
382 decision = SPDFiredChips(aEsd, (offline) ? 0 : 1, kFALSE, 2);
388 AliFatal(Form("Online trigger not available for trigger %d", triggerNoFlags));
389 decision = IsSPDClusterVsTrackletBG(aEsd);
394 if (V0Trigger(aEsd, kASide, !offline) == kV0BB)
400 if (V0Trigger(aEsd, kCSide, !offline) == kV0BB)
406 if (V0Trigger(aEsd, kASide, !offline) == kV0BG)
412 if (V0Trigger(aEsd, kCSide, !offline) == kV0BG)
418 if (T0Trigger(aEsd, !offline) == kT0BB)
425 AliFatal(Form("Online trigger not available for trigger %d", triggerNoFlags));
426 if (T0Trigger(aEsd, !offline) == kT0DecBG)
433 AliFatal(Form("Online trigger not available for trigger %d", triggerNoFlags));
434 if (T0Trigger(aEsd, !offline) == kT0DecPileup)
441 AliFatal(Form("Online trigger not available for trigger %d", triggerNoFlags));
442 if (ZDCTrigger(aEsd, kASide))
449 AliFatal(Form("Online trigger not available for trigger %d", triggerNoFlags));
450 if (ZDCTrigger(aEsd, kCSide))
457 AliFatal(Form("Online trigger not available for trigger %d", triggerNoFlags));
458 if (ZDCTDCTrigger(aEsd, kASide))
465 AliFatal(Form("Online trigger not available for trigger %d", triggerNoFlags));
466 if (ZDCTDCTrigger(aEsd, kCSide))
473 AliFatal(Form("Online trigger not available for trigger %d", triggerNoFlags));
474 if (ZDCTimeTrigger(aEsd))
481 AliFatal(Form("Online trigger not available for trigger %d", triggerNoFlags));
482 if (ZDCTDCTrigger(aEsd,kASide,kTRUE,kFALSE,kFALSE))
489 AliFatal(Form("Online trigger not available for trigger %d", triggerNoFlags));
490 if (ZDCTDCTrigger(aEsd,kCSide,kTRUE,kFALSE,kFALSE))
497 AliFatal(Form("Online trigger not available for trigger %d", triggerNoFlags));
498 if (ZDCTimeBGTrigger(aEsd,kASide))
505 AliFatal(Form("Online trigger not available for trigger %d", triggerNoFlags));
506 if (ZDCTimeBGTrigger(aEsd,kCSide))
513 AliFatal(Form("Online trigger not available for trigger %d", triggerNoFlags));
514 if (FMDTrigger(aEsd, kASide))
521 AliFatal(Form("Online trigger not available for trigger %d", triggerNoFlags));
522 if (FMDTrigger(aEsd, kCSide))
529 AliFatal(Form("Offline trigger not available for trigger %d", triggerNoFlags));
530 if (IsL0InputFired(aEsd, 2))
537 AliFatal(Form("Offline trigger not available for trigger %d", triggerNoFlags));
538 if (IsL0InputFired(aEsd, 3))
542 case kTPCLaserWarmUp:
545 AliFatal(Form("Online trigger not available for trigger %d", triggerNoFlags));
546 return IsLaserWarmUpTPCEvent(aEsd);
551 AliFatal(Form("Offline trigger not available for trigger %d - use centrality selection", triggerNoFlags));
552 if (aEsd->GetVZEROData()) {
553 if (aEsd->GetVZEROData()->TestBit(AliESDVZERO::kTriggerChargeBitsFilled)) {
554 if (aEsd->GetVZEROData()->GetTriggerBits() & (1<<AliESDVZERO::kCTA2andCTC2))
558 AliWarning("V0 centrality trigger bits were not filled!");
565 AliFatal(Form("Offline trigger not available for trigger %d - use centrality selection", triggerNoFlags));
566 if (aEsd->GetVZEROData()) {
567 if (aEsd->GetVZEROData()->TestBit(AliESDVZERO::kTriggerChargeBitsFilled)) {
568 if (aEsd->GetVZEROData()->GetTriggerBits() & (1<<AliESDVZERO::kCTA1andCTC1))
572 AliWarning("V0 centrality trigger bits were not filled!");
579 AliFatal(Form("Online trigger not available for trigger %d", triggerNoFlags));
580 if (EMCALCellsTrigger(aEsd))
586 AliFatal(Form("Trigger type %d not implemented", triggerNoFlags));
593 Bool_t AliTriggerAnalysis::IsLaserWarmUpTPCEvent(const AliESDEvent* esd)
596 // This function flags noisy TPC events which can happen during laser warm-up.
599 Int_t trackCounter = 0;
600 for (Int_t i=0; i<esd->GetNumberOfTracks(); ++i)
602 AliESDtrack *track = esd->GetTrack(i);
606 if (track->GetTPCNcls() < 30) continue;
607 if (TMath::Abs(track->Eta()) > 0.005) continue;
608 if (track->Pt() < 4) continue;
609 if (track->GetKinkIndex(0) > 0) continue;
611 UInt_t status = track->GetStatus();
612 if ((status&AliESDtrack::kITSrefit)==AliESDtrack::kITSrefit) continue; // explicitly ask for tracks without ITS refit
613 if ((status&AliESDtrack::kTPCrefit)!=AliESDtrack::kTPCrefit) continue;
615 if (track->GetTPCsignal() > 10) continue; // explicitly ask for tracks without dE/dx
619 if (trackCounter > 15)
624 Bool_t AliTriggerAnalysis::IsOfflineTriggerFired(const AliESDEvent* aEsd, Trigger trigger)
626 // checks if an event has been triggered "offline"
628 UInt_t triggerNoFlags = (UInt_t) trigger % (UInt_t) kStartOfFlags;
630 Bool_t decision = kFALSE;
631 switch (triggerNoFlags)
640 if (SPDGFOTrigger(aEsd, 0) || V0Trigger(aEsd, kASide, kFALSE) == kV0BB || V0Trigger(aEsd, kCSide, kFALSE) == kV0BB)
646 if (SPDGFOTrigger(aEsd, 0) && (V0Trigger(aEsd, kASide, kFALSE) == kV0BB || V0Trigger(aEsd, kCSide, kFALSE) == kV0BB))
652 if (SPDGFOTrigger(aEsd, 0) && V0Trigger(aEsd, kASide, kFALSE) == kV0BB && V0Trigger(aEsd, kCSide, kFALSE) == kV0BB)
658 if (SPDGFOTrigger(aEsd, 0))
664 if (SPDGFOTrigger(aEsd, 1))
670 if (V0Trigger(aEsd, kASide, kFALSE) == kV0BB)
676 if (V0Trigger(aEsd, kCSide, kFALSE) == kV0BB)
682 if (V0Trigger(aEsd, kASide, kFALSE) == kV0BB || V0Trigger(aEsd, kCSide, kFALSE) == kV0BB)
688 if (V0Trigger(aEsd, kASide, kFALSE) == kV0BB && V0Trigger(aEsd, kCSide, kFALSE) == kV0BB)
694 if (V0Trigger(aEsd, kASide, kFALSE) == kV0BG)
700 if (V0Trigger(aEsd, kCSide, kFALSE) == kV0BG)
706 if (ZDCTrigger(aEsd, kASide) || ZDCTrigger(aEsd, kCentralBarrel) || ZDCTrigger(aEsd, kCSide))
712 if (ZDCTrigger(aEsd, kASide))
718 if (ZDCTrigger(aEsd, kCSide))
724 if (ZDCTDCTrigger(aEsd,kASide,kTRUE,kFALSE,kFALSE))
730 if (ZDCTDCTrigger(aEsd,kCSide,kTRUE,kFALSE,kFALSE))
736 if (ZDCTimeBGTrigger(aEsd,kASide))
742 if (ZDCTimeBGTrigger(aEsd,kCSide))
748 if (FMDTrigger(aEsd, kASide))
754 if (FMDTrigger(aEsd, kCSide))
760 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))
766 if (SPDFiredChips(aEsd, 0) >= 5 || (V0Trigger(aEsd, kASide, kFALSE) == kV0BB && V0Trigger(aEsd, kCSide, kFALSE) == kV0BB))
773 if (SPDGFOTrigger(aEsd, 0))
775 if (V0Trigger(aEsd, kASide, kFALSE) == kV0BB)
777 if (V0Trigger(aEsd, kCSide, kFALSE) == kV0BB)
787 if (EMCALCellsTrigger(aEsd))
793 AliFatal(Form("Trigger type %d not implemented", triggerNoFlags));
797 // hadron-level requirement
798 if (decision && (trigger & kOneParticle))
802 const AliESDVertex* vertex = aEsd->GetPrimaryVertexSPD();
803 const AliMultiplicity* mult = aEsd->GetMultiplicity();
805 if (mult && vertex && vertex->GetNContributors() > 0 && (!vertex->IsFromVertexerZ() || vertex->GetDispersion() < 0.02) && TMath::Abs(vertex->GetZv()) < 5.5)
807 for (Int_t i=0; i<mult->GetNumberOfTracklets(); ++i)
809 if (TMath::Abs(mult->GetEta(i)) < 1)
818 // hadron level definition for TPC tracks
820 if (decision && (trigger & kOneTrack))
823 const AliESDVertex* vertex =0x0;
824 vertex = aEsd->GetPrimaryVertexTracks();
825 if (!vertex || vertex->GetNContributors() <= 0)
827 vertex = aEsd->GetPrimaryVertexSPD();
829 Float_t ptmin, ptmax;
830 fEsdTrackCuts->GetPtRange(ptmin,ptmax);
831 AliDebug(3, Form("ptmin = %f, ptmax = %f\n",ptmin, ptmax));
833 if (vertex && vertex->GetNContributors() > 0 && (!vertex->IsFromVertexerZ() || vertex->GetDispersion() < 0.02) && TMath::Abs(vertex->GetZv()) < 10.) {
834 AliDebug(3,Form("Check on the vertex passed\n"));
835 for (Int_t i=0; i<aEsd->GetNumberOfTracks(); ++i){
836 if (fTPCOnly == kFALSE){
837 if (fEsdTrackCuts->AcceptTrack(aEsd->GetTrack(i))){
838 AliDebug(2, Form("pt of track = %f --> check passed\n",aEsd->GetTrack(i)->Pt()));
845 AliESDtrack *tpcTrack = fEsdTrackCuts->GetTPCOnlyTrack((AliESDEvent*)aEsd, i);
847 AliDebug(3,Form("track %d is NOT a TPC track",i));
851 AliDebug(3,Form("track %d IS a TPC track",i));
852 if (!(fEsdTrackCuts->AcceptTrack(tpcTrack))) {
853 AliDebug(2, Form("TPC track %d NOT ACCEPTED, pt = %f, eta = %f",i,tpcTrack->Pt(), tpcTrack->Eta()));
854 delete tpcTrack; tpcTrack = 0x0;
856 } // end if the TPC track is not accepted
858 AliDebug(2, Form("TPC track %d ACCEPTED, pt = %f, eta = %f",i,tpcTrack->Pt(), tpcTrack->Eta()));
860 delete tpcTrack; tpcTrack = 0x0;
862 } // end if the TPC track is accepted
863 } // end if it is a TPC track
864 } // end if you are looking at TPC only tracks
865 } // end loop on tracks
866 } // end check on vertex
868 AliDebug(4,Form("Check on the vertex not passed\n"));
869 for (Int_t i=0; i<aEsd->GetNumberOfTracks(); ++i){
870 if (fEsdTrackCuts->AcceptTrack(aEsd->GetTrack(i))){
871 AliDebug(4,Form("pt of track = %f --> check would be passed if the vertex was ok\n",aEsd->GetTrack(i)->Pt()));
876 if (!decision) AliDebug(3,("Check for kOneTrack NOT passed\n"));
882 Bool_t AliTriggerAnalysis::IsTriggerClassFired(const AliESDEvent* aEsd, const Char_t* tclass) const
884 // tclass is logical function of inputs, e.g. 01 && 02 || 03 && 11 && 21
885 // = L0 inp 1 && L0 inp 2 || L0 inp 3 && L1 inp 1 && L2 inp 1
886 // NO brackets in logical function !
887 // Spaces between operators and inputs.
888 // Not all logical functions are available in CTP=
889 // =any function of first 4 inputs; 'AND' of other inputs, check not done
890 // This method will be replaced/complemened by similar one
891 // which works withh class and inputs names as in CTP cfg file
893 TString TClass(tclass);
894 TObjArray* tcltokens = TClass.Tokenize(" ");
895 Char_t level=((TObjString*)tcltokens->At(0))->String()[0];
896 UInt_t input=atoi((((TObjString*)tcltokens->At(0))->String()).Remove(0));
897 Bool_t tcl = IsInputFired(aEsd,level,input);
899 for (Int_t i=1;i<tcltokens->GetEntriesFast();i=i+2) {
900 level=((TObjString*)tcltokens->At(i+1))->String()[0];
901 input=atoi((((TObjString*)tcltokens->At(i+1))->String()).Remove(0));
902 Bool_t inpnext = IsInputFired(aEsd,level,input);
903 Char_t op =((TObjString*)tcltokens->At(i))->String()[0];
904 if (op == '&') tcl=tcl && inpnext;
905 else if (op == '|') tcl =tcl || inpnext;
907 AliError(Form("Syntax error in %s", tclass));
910 // tcltokens->Delete();
916 // tcltokens->Delete();
920 Bool_t AliTriggerAnalysis::IsInputFired(const AliESDEvent* aEsd, Char_t level, UInt_t input) const
922 // Checks trigger input of any level
926 case '0': return IsL0InputFired(aEsd,input);
927 case '1': return IsL1InputFired(aEsd,input);
928 case '2': return IsL2InputFired(aEsd,input);
930 AliError(Form("Wrong level %i",level));
935 Bool_t AliTriggerAnalysis::IsL0InputFired(const AliESDEvent* aEsd, UInt_t input) const
937 // Checks if corresponding bit in mask is on
939 UInt_t inpmask = aEsd->GetHeader()->GetL0TriggerInputs();
940 return (inpmask & (1<<(input-1)));
943 Bool_t AliTriggerAnalysis::IsL1InputFired(const AliESDEvent* aEsd, UInt_t input) const
945 // Checks if corresponding bit in mask is on
947 UInt_t inpmask = aEsd->GetHeader()->GetL1TriggerInputs();
948 return (inpmask & (1<<(input-1)));
951 Bool_t AliTriggerAnalysis::IsL2InputFired(const AliESDEvent* aEsd, UInt_t input) const
953 // Checks if corresponding bit in mask is on
955 UInt_t inpmask = aEsd->GetHeader()->GetL2TriggerInputs();
956 return (inpmask & (1<<(input-1)));
959 void AliTriggerAnalysis::FillHistograms(const AliESDEvent* aEsd)
961 // fills the histograms with the info from the ESD
963 fHistBitsSPD->Fill(SPDFiredChips(aEsd, 0), SPDFiredChips(aEsd, 1, kTRUE));
965 V0Trigger(aEsd, kASide, kFALSE, kTRUE);
966 V0Trigger(aEsd, kCSide, kFALSE, kTRUE);
967 T0Trigger(aEsd, kFALSE, kTRUE);
968 ZDCTDCTrigger(aEsd,kASide,kFALSE,kFALSE,kTRUE);
969 ZDCTimeTrigger(aEsd,kTRUE);
970 IsSPDClusterVsTrackletBG(aEsd, kTRUE);
972 AliESDZDC* zdcData = aEsd->GetESDZDC();
975 UInt_t quality = zdcData->GetESDQuality();
977 // from Nora's presentation, general first physics meeting 16.10.09
978 static UInt_t zpc = 0x20;
979 static UInt_t znc = 0x10;
980 static UInt_t zem1 = 0x08;
981 static UInt_t zem2 = 0x04;
982 static UInt_t zpa = 0x02;
983 static UInt_t zna = 0x01;
985 fHistZDC->Fill(1, (quality & zna) ? 1 : 0);
986 fHistZDC->Fill(2, (quality & zpa) ? 1 : 0);
987 fHistZDC->Fill(3, (quality & zem2) ? 1 : 0);
988 fHistZDC->Fill(4, (quality & zem1) ? 1 : 0);
989 fHistZDC->Fill(5, (quality & znc) ? 1 : 0);
990 fHistZDC->Fill(6, (quality & zpc) ? 1 : 0);
995 AliError("AliESDZDC not available");
999 fHistFMDA->Fill(FMDHitCombinations(aEsd, kASide, kTRUE));
1000 fHistFMDC->Fill(FMDHitCombinations(aEsd, kCSide, kTRUE));
1004 void AliTriggerAnalysis::FillTriggerClasses(const AliESDEvent* aEsd)
1006 // fills trigger classes map
1008 TParameter<Long64_t>* count = dynamic_cast<TParameter<Long64_t>*> (fTriggerClasses->GetValue(aEsd->GetFiredTriggerClasses().Data()));
1011 count = new TParameter<Long64_t>(aEsd->GetFiredTriggerClasses(), 0);
1012 fTriggerClasses->Add(new TObjString(aEsd->GetFiredTriggerClasses().Data()), count);
1014 count->SetVal(count->GetVal() + 1);
1017 Int_t AliTriggerAnalysis::SSDClusters(const AliESDEvent* aEsd)
1019 // returns the number of clusters in the SSD
1020 const AliMultiplicity* mult = aEsd->GetMultiplicity();
1021 Int_t clusters = mult->GetNumberOfITSClusters(4)+mult->GetNumberOfITSClusters(5);
1026 Int_t AliTriggerAnalysis::SPDFiredChips(const AliESDEvent* aEsd, Int_t origin, Bool_t fillHists, Int_t layer)
1028 // returns the number of fired chips in the SPD
1030 // origin = 0 --> aEsd->GetMultiplicity()->GetNumberOfFiredChips() (filled from clusters)
1031 // origin = 1 --> aEsd->GetMultiplicity()->TestFastOrFiredChips() (from hardware bits)
1032 // layer = 0 --> both layers
1033 // layer = 1 --> inner
1034 // layer = 2 --> outer
1036 const AliMultiplicity* mult = aEsd->GetMultiplicity();
1039 AliError("AliMultiplicity not available");
1045 return mult->GetNumberOfFiredChips(0) + mult->GetNumberOfFiredChips(1);
1047 return mult->GetNumberOfFiredChips(layer-1);
1053 Int_t firstChip = 0;
1054 Int_t lastChip = 1200;
1060 for (Int_t i=firstChip; i<lastChip; i++)
1062 if (mult->TestFastOrFiredChips(i) == kTRUE)
1064 // efficiency simulation (if enabled)
1065 if (fSPDGFOEfficiency)
1067 if (gRandom->Uniform() > fSPDGFOEfficiency->GetBinContent(i+1))
1073 fHistFiredBitsSPD->Fill(i);
1082 Bool_t AliTriggerAnalysis::SPDGFOTrigger(const AliESDEvent* aEsd, Int_t origin)
1084 // Returns if the SPD gave a global Fast OR trigger
1086 Int_t firedChips = SPDFiredChips(aEsd, origin);
1088 if (firedChips >= fSPDGFOThreshold)
1093 Bool_t AliTriggerAnalysis::IsSPDClusterVsTrackletBG(const AliESDEvent* aEsd, Bool_t fillHists){
1094 //rejects BG based on the cluster vs tracklet correlation
1095 // returns true if the event is BG
1096 const AliMultiplicity* mult = aEsd->GetMultiplicity();
1098 AliFatal("No multiplicity object"); // TODO: Should this be fatal?
1100 Int_t ntracklet = mult->GetNumberOfTracklets();
1102 Int_t spdClusters = 0;
1103 for(Int_t ilayer = 0; ilayer < 2; ilayer++){
1104 spdClusters += mult->GetNumberOfITSClusters(ilayer);
1108 fHistSPDClsVsTrk->Fill(ntracklet,spdClusters);
1111 Bool_t isCvsTOk = kFALSE;
1112 Float_t limit = Float_t(fASPDCvsTCut) + Float_t(ntracklet) * fBSPDCvsTCut;
1113 if (spdClusters > limit) isCvsTOk = kTRUE;
1114 else isCvsTOk = kFALSE ;
1121 AliTriggerAnalysis::V0Decision AliTriggerAnalysis::V0Trigger(const AliESDEvent* aEsd, AliceSide side, Bool_t online, Bool_t fillHists)
1123 // Returns the V0 trigger decision in V0A | V0C
1125 // Returns kV0Fake if the calculated average time is in a window where neither BB nor BG is expected.
1126 // The rate of such triggers can be used to estimate the background. Note that the rate has to be
1127 // rescaled with the size of the windows (numerical values see below in the code)
1129 // argument 'online' is used as a switch between online and offline trigger algorithms
1131 // Based on an algorithm by Cvetan Cheshkov
1133 AliESDVZERO* esdV0 = aEsd->GetVZEROData();
1136 AliError("AliESDVZERO not available");
1139 AliDebug(2,Form("In V0Trigger: %f %f",esdV0->GetV0ATime(),esdV0->GetV0CTime()));
1149 else if (side == kCSide)
1157 if (esdV0->TestBit(AliESDVZERO::kDecisionFilled)) {
1159 if (esdV0->TestBit(AliESDVZERO::kOnlineBitsFilled)) {
1160 for (Int_t i = begin; i < end; ++i) {
1161 if (esdV0->GetBBFlag(i)) return kV0BB;
1163 for (Int_t i = begin; i < end; ++i) {
1164 if (esdV0->GetBGFlag(i)) return kV0BG;
1169 AliWarning("V0 online trigger analysis is not yet available!");
1176 if (side == kASide && fHistV0A)
1177 fHistV0A->Fill(esdV0->GetV0ATime());
1178 if (side == kCSide && fHistV0C)
1179 fHistV0C->Fill(esdV0->GetV0CTime());
1182 if (side == kASide) return (V0Decision)esdV0->GetV0ADecision();
1183 else if (side == kCSide) return (V0Decision)esdV0->GetV0CDecision();
1184 else return kV0Invalid;
1193 if (aEsd->GetRunNumber() <= 104803) runRange = 0;
1194 else if (aEsd->GetRunNumber() <= 104876) runRange = 1;
1197 Float_t factors[3][64] = {
1198 // runs: 104792-104803
1199 {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},
1200 // runs: 104841-104876
1201 {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},
1203 {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}
1205 Float_t dA = 77.4 - 11.0;
1206 Float_t dC = 77.4 - 2.9;
1207 // Time misalignment
1208 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};
1209 Float_t dA2 = 2.8, dC2 = 3.3;
1212 for (Int_t i = begin; i < end; ++i) {
1213 Float_t tempAdc = esdV0->GetAdc(i)/factors[runRange][i];
1214 Float_t tempTime = (i >= 32) ? esdV0->GetTime(i)+dA+timeShift[i]+dA2 : esdV0->GetTime(i)+dC+timeShift[i]+dC2;
1215 if (esdV0->GetTime(i) >= 1e-6 &&
1216 tempTime > fV0HwWinLow && tempTime < fV0HwWinHigh &&
1217 tempAdc > fV0HwAdcThr)
1223 for (Int_t i = begin; i < end; ++i) {
1224 Float_t tempAdc = esdV0->GetAdc(i)/factors[runRange][i];
1225 Float_t tempTime = (i >= 32) ? esdV0->GetTime(i)+dA : esdV0->GetTime(i)+dC;
1226 Float_t tempRawTime = (i >= 32) ? esdV0->GetTime(i)+dA+timeShift[i]+dA2 : esdV0->GetTime(i)+dC+timeShift[i]+dC2;
1227 if (esdV0->GetTime(i) >= 1e-6 &&
1228 tempRawTime < 125.0 &&
1229 tempAdc > fV0AdcThr) {
1238 for (Int_t i = begin; i < end; ++i) {
1239 if (esdV0->GetTime(i) >= 1e-6 &&
1240 esdV0->GetTime(i) > fV0HwWinLow && esdV0->GetTime(i) < fV0HwWinHigh &&
1241 esdV0->GetAdc(i) > fV0HwAdcThr)
1247 for (Int_t i = begin; i < end; ++i) {
1248 if (esdV0->GetTime(i) > 1e-6 && esdV0->GetAdc(i) > fV0AdcThr) {
1249 Float_t correctedTime = V0CorrectLeadingTime(i, esdV0->GetTime(i), esdV0->GetAdc(i),aEsd->GetRunNumber());
1250 Float_t timeWeight = V0LeadingTimeWeight(esdV0->GetAdc(i));
1251 time += correctedTime*timeWeight;
1253 weight += timeWeight;
1261 time += fV0TimeOffset;
1265 if (side == kASide && fHistV0A)
1266 fHistV0A->Fill(time);
1267 if (side == kCSide && fHistV0C)
1268 fHistV0C->Fill(time);
1273 if (time > 68 && time < 100)
1275 if (time > 54 && time < 57.5)
1277 if (time > 57.5 && time < 68)
1283 if (time > 75.5 && time < 100)
1285 if (time > 69.5 && time < 73)
1287 if (time > 55 && time < 69.5)
1294 Float_t AliTriggerAnalysis::V0CorrectLeadingTime(Int_t i, Float_t time, Float_t adc, Int_t runNumber) const
1296 // Correct for slewing and align the channels
1298 // Authors: Cvetan Cheshkov / Raphael Tieulent
1300 if (time == 0) return 0;
1303 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};
1305 if(runNumber < 106031)
1306 time -= timeShift[i];
1308 // Slewing correction
1309 if (adc == 0) return time;
1311 Float_t p1 = 1.57345e1;
1312 Float_t p2 =-4.25603e-1;
1314 if(runNumber >= 106031) adc *= (2.5/4.0);
1315 return (time - p1*TMath::Power(adc,p2));
1318 Float_t AliTriggerAnalysis::V0LeadingTimeWeight(Float_t adc) const
1320 if (adc < 1e-6) return 0;
1322 Float_t p1 = 40.211;
1323 Float_t p2 =-4.25603e-1;
1324 Float_t p3 = 0.5646;
1326 return 1./(p1*p1*TMath::Power(adc,2.*(p2-1.))+p3*p3);
1330 Bool_t AliTriggerAnalysis::ZDCTDCTrigger(const AliESDEvent* aEsd, AliceSide side, Bool_t useZN, Bool_t useZP, Bool_t fillHists) const
1332 // Returns if ZDC triggered, based on TDC information
1334 AliESDZDC *esdZDC = aEsd->GetESDZDC();
1336 Bool_t zdcNA = kFALSE;
1337 Bool_t zdcNC = kFALSE;
1338 Bool_t zdcPA = kFALSE;
1339 Bool_t zdcPC = kFALSE;
1342 // If it's MC, we use the energy
1343 Double_t minEnergy = 0;
1344 Double_t zNCEnergy = esdZDC->GetZDCN1Energy();
1345 Double_t zPCEnergy = esdZDC->GetZDCP1Energy();
1346 Double_t zNAEnergy = esdZDC->GetZDCN2Energy();
1347 Double_t zPAEnergy = esdZDC->GetZDCP2Energy();
1348 zdcNA = (zNAEnergy>minEnergy);
1349 zdcNC = (zNCEnergy>minEnergy);
1350 zdcPA = (zPAEnergy>minEnergy);
1351 zdcPC = (zPCEnergy>minEnergy);
1356 Bool_t tdc[32] = {kFALSE};
1357 for(Int_t itdc=0; itdc<32; itdc++){
1358 for(Int_t i=0; i<4; i++){
1359 if (esdZDC->GetZDCTDCData(itdc, i) != 0){
1363 if(fillHists && tdc[itdc]) {
1364 fHistTDCZDC->Fill(itdc);
1373 if (side == kASide) return ((useZP&&zdcPA) || (useZN&&zdcNA));
1374 if (side == kCSide) return ((useZP&&zdcPC) || (useZN&&zdcNC));
1378 Bool_t AliTriggerAnalysis::ZDCTimeTrigger(const AliESDEvent *aEsd, Bool_t fillHists) const
1380 // This method implements a selection
1381 // based on the timing in both sides of zdcN
1382 // It can be used in order to eliminate
1383 // parasitic collisions
1384 Bool_t zdcAccept = kFALSE;
1385 AliESDZDC *esdZDC = aEsd->GetESDZDC();
1388 UInt_t esdFlag = esdZDC->GetESDQuality();
1390 Bool_t znaFired=kFALSE, zpaFired=kFALSE;
1391 Bool_t zem1Fired=kFALSE, zem2Fired=kFALSE;
1392 Bool_t zncFired=kFALSE, zpcFired=kFALSE;
1394 // **** Trigger patterns
1395 if((esdFlag & 0x00000001) == 0x00000001) znaFired=kTRUE;
1396 if((esdFlag & 0x00000002) == 0x00000002) zpaFired=kTRUE;
1397 if((esdFlag & 0x00000004) == 0x00000004) zem1Fired=kTRUE;
1398 if((esdFlag & 0x00000008) == 0x00000008) zem2Fired=kTRUE;
1399 if((esdFlag & 0x00000010) == 0x00000010) zncFired=kTRUE;
1400 if((esdFlag & 0x00000020) == 0x00000020) zpcFired=kTRUE;
1401 zdcAccept = (znaFired | zncFired);
1404 for(Int_t i = 0; i < 4; ++i) {
1405 if (esdZDC->GetZDCTDCData(10,i) != 0) {
1406 Float_t tdcC = 0.025*(esdZDC->GetZDCTDCData(10,i)-esdZDC->GetZDCTDCData(14,i));
1407 Float_t tdcCcorr = esdZDC->GetZDCTDCCorrected(10,i);
1408 for(Int_t j = 0; j < 4; ++j) {
1409 if (esdZDC->GetZDCTDCData(12,j) != 0) {
1410 Float_t tdcA = 0.025*(esdZDC->GetZDCTDCData(12,j)-esdZDC->GetZDCTDCData(14,j));
1412 Float_t tdcAcorr = esdZDC->GetZDCTDCCorrected(12,j);
1414 fHistTimeZDC->Fill(tdcC-tdcA,tdcC+tdcA);
1415 fHistTimeCorrZDC->Fill(tdcCcorr-tdcAcorr,tdcCcorr+tdcAcorr);
1417 if (esdZDC->TestBit(AliESDZDC::kCorrectedTDCFilled)) {
1418 if (((tdcCcorr-tdcAcorr-fZDCCutRefDeltaCorr)*(tdcCcorr-tdcAcorr-fZDCCutRefDeltaCorr)/(fZDCCutSigmaDeltaCorr*fZDCCutSigmaDeltaCorr) +
1419 (tdcCcorr+tdcAcorr-fZDCCutRefSumCorr)*(tdcCcorr+tdcAcorr-fZDCCutRefSumCorr)/(fZDCCutSigmaSumCorr*fZDCCutSigmaSumCorr))< 1.0)
1423 if (((tdcC-tdcA-fZDCCutRefDelta)*(tdcC-tdcA-fZDCCutRefDelta)/(fZDCCutSigmaDelta*fZDCCutSigmaDelta) +
1424 (tdcC+tdcA-fZDCCutRefSum)*(tdcC+tdcA-fZDCCutRefSum)/(fZDCCutSigmaSum*fZDCCutSigmaSum))< 1.0)
1435 Bool_t AliTriggerAnalysis::ZDCTimeBGTrigger(const AliESDEvent *aEsd, AliceSide side) const
1437 // This method implements a selection
1438 // based on the timing in of zdcN
1439 // It can be used in order to flag background
1441 AliESDZDC *zdcData = aEsd->GetESDZDC();
1442 Bool_t zna = kFALSE;
1443 Bool_t znc = kFALSE;
1445 Float_t tdcC=999, tdcCcorr=999, tdcA=999, tdcAcorr=999;
1446 for(Int_t i = 0; i < 4; ++i) {
1447 if (zdcData->GetZDCTDCData(10,i) != 0) {
1449 tdcC = 0.025*(zdcData->GetZDCTDCData(10,i)-zdcData->GetZDCTDCData(14,i));
1450 tdcCcorr = zdcData->GetZDCTDCCorrected(10,i);
1453 for(Int_t j = 0; j < 4; ++j) {
1454 if (zdcData->GetZDCTDCData(12,j) != 0) {
1456 tdcA = 0.025*(zdcData->GetZDCTDCData(12,j)-zdcData->GetZDCTDCData(14,j));
1457 tdcAcorr = zdcData->GetZDCTDCCorrected(12,j);
1461 const Int_t runNumber = aEsd->GetRunNumber();
1462 if(runNumber<188124 || runNumber>188374){
1463 AliError(Form(" ZN BG time cut not implemented for run %d",runNumber));
1467 Bool_t znabg = (zna && (TMath::Abs(tdcAcorr)>2.0));
1468 Bool_t zncbg = (znc && (TMath::Abs(tdcCcorr)>5.0));
1470 // 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);
1471 // Printf("Checking ZN background (time) for run %d, A-BG = %d, C-BG = %d",runNumber,(Int_t)znabg,(Int_t)zncbg);
1473 if (side == kASide) return znabg;
1474 if (side == kCSide) return zncbg;
1478 Bool_t AliTriggerAnalysis::ZDCTrigger(const AliESDEvent* aEsd, AliceSide side) const
1480 // Returns if ZDC triggered
1482 AliESDZDC* zdcData = aEsd->GetESDZDC();
1485 AliError("AliESDZDC not available");
1489 UInt_t quality = zdcData->GetESDQuality();
1491 // from Nora's presentation, general first physics meeting 16.10.09
1492 static UInt_t zpc = 0x20;
1493 static UInt_t znc = 0x10;
1494 static UInt_t zem1 = 0x08;
1495 static UInt_t zem2 = 0x04;
1496 static UInt_t zpa = 0x02;
1497 static UInt_t zna = 0x01;
1499 if (side == kASide && ((quality & zpa) || (quality & zna)))
1501 if (side == kCentralBarrel && ((quality & zem1) || (quality & zem2)))
1503 if (side == kCSide && ((quality & zpc) || (quality & znc)))
1509 Int_t AliTriggerAnalysis::FMDHitCombinations(const AliESDEvent* aEsd, AliceSide side, Bool_t fillHists)
1511 // returns number of hit combinations agove threshold
1513 // Authors: FMD team, Hans Dalsgaard (code merged from FMD/AliFMDOfflineTrigger)
1518 // Workaround for AliESDEvent::GetFMDData is not const!
1519 const AliESDFMD* fmdData = (const_cast<AliESDEvent*>(aEsd))->GetFMDData();
1522 AliError("AliESDFMD not available");
1526 Int_t detFrom = (side == kASide) ? 1 : 3;
1527 Int_t detTo = (side == kASide) ? 2 : 3;
1530 Float_t totalMult = 0;
1531 for (UShort_t det=detFrom;det<=detTo;det++) {
1532 Int_t nRings = (det == 1 ? 1 : 2);
1533 for (UShort_t ir = 0; ir < nRings; ir++) {
1534 Char_t ring = (ir == 0 ? 'I' : 'O');
1535 UShort_t nsec = (ir == 0 ? 20 : 40);
1536 UShort_t nstr = (ir == 0 ? 512 : 256);
1537 for (UShort_t sec =0; sec < nsec; sec++) {
1538 for (UShort_t strip = 0; strip < nstr; strip++) {
1539 Float_t mult = fmdData->Multiplicity(det,ring,sec,strip);
1540 if (mult == AliESDFMD::kInvalidMult) continue;
1543 fHistFMDSingle->Fill(mult);
1545 if (mult > fFMDLowCut)
1546 totalMult = totalMult + mult;
1549 if (totalMult > fFMDHitCut)
1553 fHistFMDSum->Fill(totalMult);
1565 Bool_t AliTriggerAnalysis::FMDTrigger(const AliESDEvent* aEsd, AliceSide side)
1567 // Returns if the FMD triggered
1569 // Authors: FMD team, Hans Dalsgaard (code merged from FMD/AliFMDOfflineTrigger)
1571 Int_t triggers = FMDHitCombinations(aEsd, side, kFALSE);
1579 Long64_t AliTriggerAnalysis::Merge(TCollection* list)
1581 // Merge a list of AliMultiplicityCorrection objects with this (needed for
1583 // Returns the number of merged objects (including this).
1588 if (list->IsEmpty())
1591 TIterator* iter = list->MakeIterator();
1594 // collections of all histograms
1595 const Int_t nHists = 14;
1596 TList collections[nHists];
1599 while ((obj = iter->Next())) {
1601 AliTriggerAnalysis* entry = dynamic_cast<AliTriggerAnalysis*> (obj);
1606 collections[n++].Add(entry->fHistV0A);
1607 collections[n++].Add(entry->fHistV0C);
1608 collections[n++].Add(entry->fHistZDC);
1609 collections[n++].Add(entry->fHistTDCZDC);
1610 collections[n++].Add(entry->fHistTimeZDC);
1611 collections[n++].Add(entry->fHistTimeCorrZDC);
1612 collections[n++].Add(entry->fHistFMDA);
1613 collections[n++].Add(entry->fHistFMDC);
1614 collections[n++].Add(entry->fHistFMDSingle);
1615 collections[n++].Add(entry->fHistFMDSum);
1616 collections[n++].Add(entry->fHistBitsSPD);
1617 collections[n++].Add(entry->fHistFiredBitsSPD);
1618 collections[n++].Add(entry->fHistSPDClsVsTrk);
1619 collections[n++].Add(entry->fHistT0);
1621 // merge fTriggerClasses
1622 TIterator* iter2 = entry->fTriggerClasses->MakeIterator();
1623 TObjString* obj2 = 0;
1624 while ((obj2 = dynamic_cast<TObjString*> (iter2->Next())))
1626 TParameter<Long64_t>* param2 = static_cast<TParameter<Long64_t>*> (entry->fTriggerClasses->GetValue(obj2));
1628 TParameter<Long64_t>* param1 = dynamic_cast<TParameter<Long64_t>*> (fTriggerClasses->GetValue(obj2));
1631 param1->SetVal(param1->GetVal() + param2->GetVal());
1635 param1 = dynamic_cast<TParameter<Long64_t>*> (param2->Clone());
1636 fTriggerClasses->Add(new TObjString(obj2->String()), param1);
1646 fHistV0A->Merge(&collections[n++]);
1647 fHistV0C->Merge(&collections[n++]);
1648 fHistZDC->Merge(&collections[n++]);
1649 fHistTDCZDC->Merge(&collections[n++]);
1651 fHistTimeZDC->Merge(&collections[n++]);
1654 if (fHistTimeCorrZDC)
1655 fHistTimeCorrZDC->Merge(&collections[n++]);
1658 fHistFMDA->Merge(&collections[n++]);
1659 fHistFMDC->Merge(&collections[n++]);
1660 fHistFMDSingle->Merge(&collections[n++]);
1661 fHistFMDSum->Merge(&collections[n++]);
1662 fHistBitsSPD->Merge(&collections[n++]);
1663 fHistFiredBitsSPD->Merge(&collections[n++]);
1664 fHistSPDClsVsTrk->Merge(&collections[n++]);
1665 fHistT0->Merge(&collections[n++]);
1671 void AliTriggerAnalysis::SaveHistograms() const
1673 // write histograms to current directory
1679 fHistBitsSPD->Write();
1680 fHistBitsSPD->ProjectionX();
1681 fHistBitsSPD->ProjectionY();
1683 else Printf("Cannot save fHistBitsSPD");
1684 if (fHistFiredBitsSPD) fHistFiredBitsSPD->Write();
1685 else Printf("Cannot save fHistFiredBitsSPD");
1686 if (fHistV0A) fHistV0A->Write();
1687 else Printf("Cannot save fHistV0A");
1688 if (fHistV0C) fHistV0C->Write();
1689 else Printf("Cannot save fHistV0C");
1690 if (fHistZDC) fHistZDC->Write();
1691 else Printf("Cannot save fHistZDC");
1692 if (fHistTDCZDC) fHistTDCZDC->Write();
1693 else Printf("Cannot save fHistTDCZDC");
1694 if (fHistTimeZDC) fHistTimeZDC->Write();
1695 else Printf("Cannot save fHistTimeZDC");
1696 if (fHistTimeCorrZDC) fHistTimeCorrZDC->Write();
1697 else Printf("Cannot save fHistTimeCorrZDC");
1698 if (fHistFMDA) fHistFMDA->Write();
1699 else Printf("Cannot save fHistFMDA");
1700 if (fHistFMDC) fHistFMDC->Write();
1701 else Printf("Cannot save fHistFMDC");
1702 if (fHistFMDSingle) fHistFMDSingle->Write();
1703 else Printf("Cannot save fHistFMDSingle");
1704 if (fHistFMDSum) fHistFMDSum->Write();
1705 else Printf("Cannot save fHistFMDSum");
1706 if (fSPDGFOEfficiency) fSPDGFOEfficiency->Write("fSPDGFOEfficiency");
1707 if (fHistSPDClsVsTrk) fHistSPDClsVsTrk->Write("fHistSPDClsVsTrk");
1708 if (fHistT0) fHistT0->Write("fHistT0");
1710 // else Printf("Cannot save fSPDGFOEfficiency");
1712 fTriggerClasses->Write("fTriggerClasses", TObject::kSingleKey);
1715 void AliTriggerAnalysis::PrintTriggerClasses() const
1717 // print trigger classes
1719 Printf("Trigger Classes:");
1721 Printf("Event count for trigger combinations:");
1724 singleTrigger.SetOwner();
1726 TIterator* iter = fTriggerClasses->MakeIterator();
1727 TObjString* obj = 0;
1728 while ((obj = dynamic_cast<TObjString*> (iter->Next())))
1730 TParameter<Long64_t>* param = static_cast<TParameter<Long64_t>*> (fTriggerClasses->GetValue(obj));
1732 Printf(" %s: %ld triggers", obj->String().Data(), (Long_t)param->GetVal());
1734 TObjArray* tokens = obj->String().Tokenize(" ");
1735 for (Int_t i=0; i<tokens->GetEntries(); i++)
1737 TParameter<Long64_t>* count = dynamic_cast<TParameter<Long64_t>*> (singleTrigger.GetValue(((TObjString*) tokens->At(i))->String().Data()));
1740 count = new TParameter<Long64_t>(((TObjString*) tokens->At(i))->String().Data(), 0);
1741 singleTrigger.Add(new TObjString(((TObjString*) tokens->At(i))->String().Data()), count);
1743 count->SetVal(count->GetVal() + param->GetVal());
1750 Printf("Event count for single trigger:");
1752 iter = singleTrigger.MakeIterator();
1753 while ((obj = dynamic_cast<TObjString*> (iter->Next())))
1755 TParameter<Long64_t>* param = static_cast<TParameter<Long64_t>*> (singleTrigger.GetValue(obj));
1757 Printf(" %s: %ld triggers", obj->String().Data(), (Long_t)param->GetVal());
1761 singleTrigger.DeleteAll();
1765 //----------------------------------------------------------------------------------------------------
1766 AliTriggerAnalysis::T0Decision AliTriggerAnalysis::T0Trigger(const AliESDEvent* aEsd, Bool_t online, Bool_t fillHists)
1768 // Returns the T0 TVDC trigger decision
1770 // argument 'online' is used as a switch between online and offline trigger algorithms
1771 // in online mode return 0TVX
1772 // in offline mode in addition check pile-up and background :
1773 // pile-up readed from ESD: check if TVDC (0TVX module name) has more 1 hit;
1774 // backgroud flag readed from ESD : check in given time interval OrA and OrC were correct but TVDC not
1776 // Based on an algorithm by Alla Maevskaya
1778 const AliESDTZERO* esdT0 = aEsd->GetESDTZERO();
1781 AliError("AliESDTZERO not available");
1784 //???? AliDebug(2,Form("In T0Trigger: %f %f",esdV0->GetV0ATime(),esdV0->GetV0CTime()));
1786 for (Int_t ii=0; ii<5; ii++)
1787 tvdc[ii] = esdT0->GetTVDC(ii);
1788 Int_t trig=esdT0->GetT0Trig();
1789 // cout<<" T0 trig "<<trig<<endl;
1791 if(fillHists) fHistT0->Fill(tvdc[0]);
1794 if(trig&1) return kT0BB;
1798 if (esdT0->GetPileupFlag()) return kT0DecPileup;
1799 if (esdT0->GetBackgroundFlag()) return kT0DecBG;
1800 if (tvdc[0]>-5 && tvdc[0]<5 && tvdc[0] != 0) return kT0BB;
1804 if( esdT0->GetT0zVertex()>-12.3 && esdT0->GetT0zVertex() < 10.3) return kT0BB;
1809 //----------------------------------------------------------------------------------------------------
1810 Bool_t AliTriggerAnalysis::EMCALCellsTrigger(const AliESDEvent *aEsd)
1813 // Returns the EMCAL trigger decision
1814 // so far only implemented for LHC11a data
1815 // see http://alisoft.cern.ch/viewvc/trunk/PWGGA/EMCALTasks/AliEmcalPhysicsSelection.cxx?view=markup&root=AliRoot Revision 56136
1818 Bool_t isFired = kTRUE;
1819 const Int_t runNumber = aEsd->GetRunNumber();
1822 // Load EMCAL branches from the manager
1823 AliAnalysisManager *am = AliAnalysisManager::GetAnalysisManager();
1824 am->LoadBranch("EMCALCells.");
1825 am->LoadBranch("CaloClusters");
1829 AliVCaloCells *cells = aEsd->GetEMCALCells();
1830 const Short_t nCells = cells->GetNumberOfCells();
1832 // count cells above threshold per sm
1833 Int_t nCellCount[10] = {0,0,0,0,0,0,0,0,0,0};
1834 for(Int_t iCell=0; iCell<nCells; ++iCell) {
1835 Short_t cellId = cells->GetCellNumber(iCell);
1836 Double_t cellE = cells->GetCellAmplitude(cellId);
1837 Int_t sm = cellId / (24*48);
1842 // Trigger decision for LHC11a
1843 Bool_t isLedEvent = kFALSE;
1844 if ((runNumber>=144871) && (runNumber<=146860)) {
1845 if (nCellCount[4] > 100)
1848 if ((runNumber>=146858) && (runNumber<=146860)) {
1849 if (nCellCount[3]>=35)