1 /* $Id: AliOfflineTrigger.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 AliOfflineTrigger
20 // This class provides offline triggers from data in the ESD
21 // Origin: Jan Fiete Grosse-Oetringhaus, CERN
22 //-------------------------------------------------------------------------
24 #include <AliOfflineTrigger.h>
28 #include <AliESDEvent.h>
30 #include <AliMultiplicity.h>
31 #include <AliESDVZERO.h>
32 #include <AliESDZDC.h>
33 #include <AliESDFMD.h>
35 ClassImp(AliOfflineTrigger)
37 AliOfflineTrigger::AliOfflineTrigger() :
46 Bool_t AliOfflineTrigger::IsEventTriggered(const AliESDEvent* aEsd, AliPWG0Helper::Trigger trigger) const
48 // checks if an event has been triggered "offline"
50 UInt_t triggerNoFlags = (UInt_t) trigger % (UInt_t) AliPWG0Helper::kStartOfFlags;
52 switch (triggerNoFlags)
54 case AliPWG0Helper::kAcceptAll:
59 case AliPWG0Helper::kMB1:
61 if (SPDGFOTrigger(aEsd) || V0Trigger(aEsd, kASide) || V0Trigger(aEsd, kCSide))
65 case AliPWG0Helper::kMB2:
67 if (SPDGFOTrigger(aEsd) && (V0Trigger(aEsd, kASide) || V0Trigger(aEsd, kCSide)))
71 case AliPWG0Helper::kMB3:
73 if (SPDGFOTrigger(aEsd) && V0Trigger(aEsd, kASide) && V0Trigger(aEsd, kCSide))
77 case AliPWG0Helper::kSPDGFO:
79 if (SPDGFOTrigger(aEsd))
83 case AliPWG0Helper::kV0A:
85 if (V0Trigger(aEsd, kASide))
89 case AliPWG0Helper::kV0C:
91 if (V0Trigger(aEsd, kCSide))
95 case AliPWG0Helper::kZDC:
97 if (ZDCTrigger(aEsd, kASide) || ZDCTrigger(aEsd, kCentralBarrel) || ZDCTrigger(aEsd, kCSide))
101 case AliPWG0Helper::kZDCA:
103 if (ZDCTrigger(aEsd, kASide))
107 case AliPWG0Helper::kZDCC:
109 if (ZDCTrigger(aEsd, kCSide))
113 case AliPWG0Helper::kFMDA:
115 if (FMDTrigger(aEsd, kASide))
119 case AliPWG0Helper::kFMDC:
121 if (FMDTrigger(aEsd, kCSide))
125 case AliPWG0Helper::kFPANY:
127 if (SPDGFOTrigger(aEsd) || V0Trigger(aEsd, kASide) || V0Trigger(aEsd, kCSide) || ZDCTrigger(aEsd, kASide) || ZDCTrigger(aEsd, kCentralBarrel) || ZDCTrigger(aEsd, kCSide) || FMDTrigger(aEsd, kASide) || FMDTrigger(aEsd, kCSide))
133 AliFatal(Form("Trigger type %d not implemented", triggerNoFlags));
140 Bool_t AliOfflineTrigger::SPDGFOTrigger(const AliESDEvent* aEsd) const
142 // Returns if the SPD gave a global Fast OR trigger
144 Int_t firedChips = 0;
145 const AliMultiplicity* mult = aEsd->GetMultiplicity();
148 AliError("AliMultiplicity not available");
151 firedChips = mult->GetNumberOfFiredChips(0) + mult->GetNumberOfFiredChips(1);
153 if (firedChips >= fSPDGFOThreshold)
158 Bool_t AliOfflineTrigger::V0Trigger(const AliESDEvent* aEsd, AliceSide side) const
160 // Returns if the V0 triggered
162 AliESDVZERO* v0Data = aEsd->GetVZEROData();
165 AliError("AliESDVZERO not available");
171 for (Int_t i=0; i<32; i++)
173 if (v0Data->BBTriggerV0A(i))
175 if (v0Data->BBTriggerV0C(i))
179 if (side == kASide && aCount >= fV0AThreshold)
181 if (side == kCSide && cCount >= fV0CThreshold)
186 Bool_t AliOfflineTrigger::ZDCTrigger(const AliESDEvent* aEsd, AliceSide side) const
188 // Returns if ZDC triggered
190 AliESDZDC* zdcData = aEsd->GetESDZDC();
193 AliError("AliESDZDC not available");
197 UInt_t quality = zdcData->GetESDQuality();
199 // from Nora's presentation, general first physics meeting 16.10.09
200 static UInt_t zpc = 0x20;
201 static UInt_t znc = 0x10;
202 static UInt_t zem1 = 0x08;
203 static UInt_t zem2 = 0x04;
204 static UInt_t zpa = 0x02;
205 static UInt_t zna = 0x01;
207 if (side == kASide && ((quality & zpa) || (quality & zna)))
209 if (side == kCentralBarrel && ((quality & zem1) || (quality & zem2)))
211 if (side == kCSide && ((quality & zpc) || (quality & znc)))
217 Bool_t AliOfflineTrigger::FMDTrigger(const AliESDEvent* aEsd, AliceSide side) const
219 // Returns if the FMD triggered
221 // Authors: FMD team, Hans Dalsgaard (code merged from FMD/AliFMDOfflineTrigger)
223 // Workaround for AliESDEvent::GetFMDData is not const!
224 const AliESDFMD* fmdData = (const_cast<AliESDEvent*>(aEsd))->GetFMDData();
227 AliError("AliESDFMD not available");
231 Int_t detFrom = (side == kASide) ? 1 : 3;
232 Int_t detTo = (side == kASide) ? 2 : 3;
234 Float_t totalMult = 0;
235 for (UShort_t det=detFrom;det<=detTo;det++) {
236 Int_t nRings = (det == 1 ? 1 : 2);
237 for (UShort_t ir = 0; ir < nRings; ir++) {
238 Char_t ring = (ir == 0 ? 'I' : 'O');
239 UShort_t nsec = (ir == 0 ? 20 : 40);
240 UShort_t nstr = (ir == 0 ? 512 : 256);
241 for (UShort_t sec =0; sec < nsec; sec++) {
242 for (UShort_t strip = 0; strip < nstr; strip++) {
243 Float_t mult = fmdData->Multiplicity(det,ring,sec,strip);
244 if (mult == AliESDFMD::kInvalidMult) continue;
246 if (mult > fFMDLowCut)
247 totalMult = totalMult + mult;
250 if( totalMult > fFMDHitCut) {