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
1440 // ** So far only implemented for the 2012 pA run **
1442 if(fMC) return kFALSE;
1444 AliESDZDC *zdcData = aEsd->GetESDZDC();
1445 Bool_t zna = kFALSE;
1446 Bool_t znc = kFALSE;
1448 Float_t tdcC=999, tdcCcorr=999, tdcA=999, tdcAcorr=999;
1449 for(Int_t i = 0; i < 4; ++i) {
1450 if (zdcData->GetZDCTDCData(10,i) != 0) {
1452 tdcC = 0.025*(zdcData->GetZDCTDCData(10,i)-zdcData->GetZDCTDCData(14,i));
1453 tdcCcorr = zdcData->GetZDCTDCCorrected(10,i);
1456 for(Int_t j = 0; j < 4; ++j) {
1457 if (zdcData->GetZDCTDCData(12,j) != 0) {
1459 tdcA = 0.025*(zdcData->GetZDCTDCData(12,j)-zdcData->GetZDCTDCData(14,j));
1460 tdcAcorr = zdcData->GetZDCTDCCorrected(12,j);
1464 const Int_t runNumber = aEsd->GetRunNumber();
1465 if(runNumber<188124 || runNumber>188374){
1466 AliError(Form(" ZN BG time cut not implemented for run %d",runNumber));
1470 Bool_t znabg = (zna && (TMath::Abs(tdcAcorr)>2.0));
1471 Bool_t zncbg = (znc && (TMath::Abs(tdcCcorr)>5.0));
1473 // 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);
1474 // Printf("Checking ZN background (time) for run %d, A-BG = %d, C-BG = %d",runNumber,(Int_t)znabg,(Int_t)zncbg);
1476 if (side == kASide) return znabg;
1477 if (side == kCSide) return zncbg;
1481 Bool_t AliTriggerAnalysis::ZDCTrigger(const AliESDEvent* aEsd, AliceSide side) const
1483 // Returns if ZDC triggered
1485 AliESDZDC* zdcData = aEsd->GetESDZDC();
1488 AliError("AliESDZDC not available");
1492 UInt_t quality = zdcData->GetESDQuality();
1494 // from Nora's presentation, general first physics meeting 16.10.09
1495 static UInt_t zpc = 0x20;
1496 static UInt_t znc = 0x10;
1497 static UInt_t zem1 = 0x08;
1498 static UInt_t zem2 = 0x04;
1499 static UInt_t zpa = 0x02;
1500 static UInt_t zna = 0x01;
1502 if (side == kASide && ((quality & zpa) || (quality & zna)))
1504 if (side == kCentralBarrel && ((quality & zem1) || (quality & zem2)))
1506 if (side == kCSide && ((quality & zpc) || (quality & znc)))
1512 Int_t AliTriggerAnalysis::FMDHitCombinations(const AliESDEvent* aEsd, AliceSide side, Bool_t fillHists)
1514 // returns number of hit combinations agove threshold
1516 // Authors: FMD team, Hans Dalsgaard (code merged from FMD/AliFMDOfflineTrigger)
1521 // Workaround for AliESDEvent::GetFMDData is not const!
1522 const AliESDFMD* fmdData = (const_cast<AliESDEvent*>(aEsd))->GetFMDData();
1525 AliError("AliESDFMD not available");
1529 Int_t detFrom = (side == kASide) ? 1 : 3;
1530 Int_t detTo = (side == kASide) ? 2 : 3;
1533 Float_t totalMult = 0;
1534 for (UShort_t det=detFrom;det<=detTo;det++) {
1535 Int_t nRings = (det == 1 ? 1 : 2);
1536 for (UShort_t ir = 0; ir < nRings; ir++) {
1537 Char_t ring = (ir == 0 ? 'I' : 'O');
1538 UShort_t nsec = (ir == 0 ? 20 : 40);
1539 UShort_t nstr = (ir == 0 ? 512 : 256);
1540 for (UShort_t sec =0; sec < nsec; sec++) {
1541 for (UShort_t strip = 0; strip < nstr; strip++) {
1542 Float_t mult = fmdData->Multiplicity(det,ring,sec,strip);
1543 if (mult == AliESDFMD::kInvalidMult) continue;
1546 fHistFMDSingle->Fill(mult);
1548 if (mult > fFMDLowCut)
1549 totalMult = totalMult + mult;
1552 if (totalMult > fFMDHitCut)
1556 fHistFMDSum->Fill(totalMult);
1568 Bool_t AliTriggerAnalysis::FMDTrigger(const AliESDEvent* aEsd, AliceSide side)
1570 // Returns if the FMD triggered
1572 // Authors: FMD team, Hans Dalsgaard (code merged from FMD/AliFMDOfflineTrigger)
1574 Int_t triggers = FMDHitCombinations(aEsd, side, kFALSE);
1582 Long64_t AliTriggerAnalysis::Merge(TCollection* list)
1584 // Merge a list of AliMultiplicityCorrection objects with this (needed for
1586 // Returns the number of merged objects (including this).
1591 if (list->IsEmpty())
1594 TIterator* iter = list->MakeIterator();
1597 // collections of all histograms
1598 const Int_t nHists = 14;
1599 TList collections[nHists];
1602 while ((obj = iter->Next())) {
1604 AliTriggerAnalysis* entry = dynamic_cast<AliTriggerAnalysis*> (obj);
1609 collections[n++].Add(entry->fHistV0A);
1610 collections[n++].Add(entry->fHistV0C);
1611 collections[n++].Add(entry->fHistZDC);
1612 collections[n++].Add(entry->fHistTDCZDC);
1613 collections[n++].Add(entry->fHistTimeZDC);
1614 collections[n++].Add(entry->fHistTimeCorrZDC);
1615 collections[n++].Add(entry->fHistFMDA);
1616 collections[n++].Add(entry->fHistFMDC);
1617 collections[n++].Add(entry->fHistFMDSingle);
1618 collections[n++].Add(entry->fHistFMDSum);
1619 collections[n++].Add(entry->fHistBitsSPD);
1620 collections[n++].Add(entry->fHistFiredBitsSPD);
1621 collections[n++].Add(entry->fHistSPDClsVsTrk);
1622 collections[n++].Add(entry->fHistT0);
1624 // merge fTriggerClasses
1625 TIterator* iter2 = entry->fTriggerClasses->MakeIterator();
1626 TObjString* obj2 = 0;
1627 while ((obj2 = dynamic_cast<TObjString*> (iter2->Next())))
1629 TParameter<Long64_t>* param2 = static_cast<TParameter<Long64_t>*> (entry->fTriggerClasses->GetValue(obj2));
1631 TParameter<Long64_t>* param1 = dynamic_cast<TParameter<Long64_t>*> (fTriggerClasses->GetValue(obj2));
1634 param1->SetVal(param1->GetVal() + param2->GetVal());
1638 param1 = dynamic_cast<TParameter<Long64_t>*> (param2->Clone());
1639 fTriggerClasses->Add(new TObjString(obj2->String()), param1);
1649 fHistV0A->Merge(&collections[n++]);
1650 fHistV0C->Merge(&collections[n++]);
1651 fHistZDC->Merge(&collections[n++]);
1652 fHistTDCZDC->Merge(&collections[n++]);
1654 fHistTimeZDC->Merge(&collections[n++]);
1657 if (fHistTimeCorrZDC)
1658 fHistTimeCorrZDC->Merge(&collections[n++]);
1661 fHistFMDA->Merge(&collections[n++]);
1662 fHistFMDC->Merge(&collections[n++]);
1663 fHistFMDSingle->Merge(&collections[n++]);
1664 fHistFMDSum->Merge(&collections[n++]);
1665 fHistBitsSPD->Merge(&collections[n++]);
1666 fHistFiredBitsSPD->Merge(&collections[n++]);
1667 fHistSPDClsVsTrk->Merge(&collections[n++]);
1668 fHistT0->Merge(&collections[n++]);
1674 void AliTriggerAnalysis::SaveHistograms() const
1676 // write histograms to current directory
1682 fHistBitsSPD->Write();
1683 fHistBitsSPD->ProjectionX();
1684 fHistBitsSPD->ProjectionY();
1686 else Printf("Cannot save fHistBitsSPD");
1687 if (fHistFiredBitsSPD) fHistFiredBitsSPD->Write();
1688 else Printf("Cannot save fHistFiredBitsSPD");
1689 if (fHistV0A) fHistV0A->Write();
1690 else Printf("Cannot save fHistV0A");
1691 if (fHistV0C) fHistV0C->Write();
1692 else Printf("Cannot save fHistV0C");
1693 if (fHistZDC) fHistZDC->Write();
1694 else Printf("Cannot save fHistZDC");
1695 if (fHistTDCZDC) fHistTDCZDC->Write();
1696 else Printf("Cannot save fHistTDCZDC");
1697 if (fHistTimeZDC) fHistTimeZDC->Write();
1698 else Printf("Cannot save fHistTimeZDC");
1699 if (fHistTimeCorrZDC) fHistTimeCorrZDC->Write();
1700 else Printf("Cannot save fHistTimeCorrZDC");
1701 if (fHistFMDA) fHistFMDA->Write();
1702 else Printf("Cannot save fHistFMDA");
1703 if (fHistFMDC) fHistFMDC->Write();
1704 else Printf("Cannot save fHistFMDC");
1705 if (fHistFMDSingle) fHistFMDSingle->Write();
1706 else Printf("Cannot save fHistFMDSingle");
1707 if (fHistFMDSum) fHistFMDSum->Write();
1708 else Printf("Cannot save fHistFMDSum");
1709 if (fSPDGFOEfficiency) fSPDGFOEfficiency->Write("fSPDGFOEfficiency");
1710 if (fHistSPDClsVsTrk) fHistSPDClsVsTrk->Write("fHistSPDClsVsTrk");
1711 if (fHistT0) fHistT0->Write("fHistT0");
1713 // else Printf("Cannot save fSPDGFOEfficiency");
1715 fTriggerClasses->Write("fTriggerClasses", TObject::kSingleKey);
1718 void AliTriggerAnalysis::PrintTriggerClasses() const
1720 // print trigger classes
1722 Printf("Trigger Classes:");
1724 Printf("Event count for trigger combinations:");
1727 singleTrigger.SetOwner();
1729 TIterator* iter = fTriggerClasses->MakeIterator();
1730 TObjString* obj = 0;
1731 while ((obj = dynamic_cast<TObjString*> (iter->Next())))
1733 TParameter<Long64_t>* param = static_cast<TParameter<Long64_t>*> (fTriggerClasses->GetValue(obj));
1735 Printf(" %s: %ld triggers", obj->String().Data(), (Long_t)param->GetVal());
1737 TObjArray* tokens = obj->String().Tokenize(" ");
1738 for (Int_t i=0; i<tokens->GetEntries(); i++)
1740 TParameter<Long64_t>* count = dynamic_cast<TParameter<Long64_t>*> (singleTrigger.GetValue(((TObjString*) tokens->At(i))->String().Data()));
1743 count = new TParameter<Long64_t>(((TObjString*) tokens->At(i))->String().Data(), 0);
1744 singleTrigger.Add(new TObjString(((TObjString*) tokens->At(i))->String().Data()), count);
1746 count->SetVal(count->GetVal() + param->GetVal());
1753 Printf("Event count for single trigger:");
1755 iter = singleTrigger.MakeIterator();
1756 while ((obj = dynamic_cast<TObjString*> (iter->Next())))
1758 TParameter<Long64_t>* param = static_cast<TParameter<Long64_t>*> (singleTrigger.GetValue(obj));
1760 Printf(" %s: %ld triggers", obj->String().Data(), (Long_t)param->GetVal());
1764 singleTrigger.DeleteAll();
1768 //----------------------------------------------------------------------------------------------------
1769 AliTriggerAnalysis::T0Decision AliTriggerAnalysis::T0Trigger(const AliESDEvent* aEsd, Bool_t online, Bool_t fillHists)
1771 // Returns the T0 TVDC trigger decision
1773 // argument 'online' is used as a switch between online and offline trigger algorithms
1774 // in online mode return 0TVX
1775 // in offline mode in addition check pile-up and background :
1776 // pile-up readed from ESD: check if TVDC (0TVX module name) has more 1 hit;
1777 // backgroud flag readed from ESD : check in given time interval OrA and OrC were correct but TVDC not
1779 // Based on an algorithm by Alla Maevskaya
1781 const AliESDTZERO* esdT0 = aEsd->GetESDTZERO();
1784 AliError("AliESDTZERO not available");
1787 //???? AliDebug(2,Form("In T0Trigger: %f %f",esdV0->GetV0ATime(),esdV0->GetV0CTime()));
1789 for (Int_t ii=0; ii<5; ii++)
1790 tvdc[ii] = esdT0->GetTVDC(ii);
1791 Int_t trig=esdT0->GetT0Trig();
1792 // cout<<" T0 trig "<<trig<<endl;
1794 if(fillHists) fHistT0->Fill(tvdc[0]);
1797 if(trig&1) return kT0BB;
1801 if (esdT0->GetPileupFlag()) return kT0DecPileup;
1802 if (esdT0->GetBackgroundFlag()) return kT0DecBG;
1803 if (tvdc[0]>-5 && tvdc[0]<5 && tvdc[0] != 0) return kT0BB;
1807 if( esdT0->GetT0zVertex()>-12.3 && esdT0->GetT0zVertex() < 10.3) return kT0BB;
1812 //----------------------------------------------------------------------------------------------------
1813 Bool_t AliTriggerAnalysis::EMCALCellsTrigger(const AliESDEvent *aEsd)
1816 // Returns the EMCAL trigger decision
1817 // so far only implemented for LHC11a data
1818 // see http://alisoft.cern.ch/viewvc/trunk/PWGGA/EMCALTasks/AliEmcalPhysicsSelection.cxx?view=markup&root=AliRoot Revision 56136
1821 Bool_t isFired = kTRUE;
1822 const Int_t runNumber = aEsd->GetRunNumber();
1825 // Load EMCAL branches from the manager
1826 AliAnalysisManager *am = AliAnalysisManager::GetAnalysisManager();
1827 am->LoadBranch("EMCALCells.");
1828 am->LoadBranch("CaloClusters");
1832 AliVCaloCells *cells = aEsd->GetEMCALCells();
1833 const Short_t nCells = cells->GetNumberOfCells();
1835 // count cells above threshold per sm
1836 Int_t nCellCount[10] = {0,0,0,0,0,0,0,0,0,0};
1837 for(Int_t iCell=0; iCell<nCells; ++iCell) {
1838 Short_t cellId = cells->GetCellNumber(iCell);
1839 Double_t cellE = cells->GetCellAmplitude(cellId);
1840 Int_t sm = cellId / (24*48);
1845 // Trigger decision for LHC11a
1846 Bool_t isLedEvent = kFALSE;
1847 if ((runNumber>=144871) && (runNumber<=146860)) {
1848 if (nCellCount[4] > 100)
1851 if ((runNumber>=146858) && (runNumber<=146860)) {
1852 if (nCellCount[3]>=35)