]>
Commit | Line | Data |
---|---|---|
ff8c4f30 | 1 | /* $Id: AliOfflineTrigger.cxx 35782 2009-10-22 11:54:31Z jgrosseo $ */ |
2 | ||
7a11141c | 3 | /************************************************************************** |
4 | * Copyright(c) 1998-2009, ALICE Experiment at CERN, All rights reserved. * | |
5 | * * | |
6 | * Author: The ALICE Off-line Project. * | |
7 | * Contributors are mentioned in the code where appropriate. * | |
8 | * * | |
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 | **************************************************************************/ | |
17 | ||
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 | //------------------------------------------------------------------------- | |
23 | ||
ff8c4f30 | 24 | #include <AliOfflineTrigger.h> |
25 | ||
26 | #include <AliLog.h> | |
27 | ||
28 | #include <AliESDEvent.h> | |
29 | ||
30 | #include <AliMultiplicity.h> | |
31 | #include <AliESDVZERO.h> | |
c8d3e441 | 32 | #include <AliESDZDC.h> |
7a11141c | 33 | #include <AliESDFMD.h> |
ff8c4f30 | 34 | |
35 | ClassImp(AliOfflineTrigger) | |
36 | ||
37 | AliOfflineTrigger::AliOfflineTrigger() : | |
38 | fSPDGFOThreshold(1), | |
39 | fV0AThreshold(1), | |
7a11141c | 40 | fV0CThreshold(1), |
41 | fFMDLowCut(0.2), | |
42 | fFMDHitCut(0.5) | |
ff8c4f30 | 43 | { |
44 | } | |
45 | ||
46 | Bool_t AliOfflineTrigger::IsEventTriggered(const AliESDEvent* aEsd, AliPWG0Helper::Trigger trigger) const | |
47 | { | |
48 | // checks if an event has been triggered "offline" | |
49 | ||
50 | UInt_t triggerNoFlags = (UInt_t) trigger % (UInt_t) AliPWG0Helper::kStartOfFlags; | |
51 | ||
52 | switch (triggerNoFlags) | |
53 | { | |
54 | case AliPWG0Helper::kAcceptAll: | |
55 | { | |
56 | return kTRUE; | |
57 | break; | |
58 | } | |
59 | case AliPWG0Helper::kMB1: | |
60 | { | |
61 | if (SPDGFOTrigger(aEsd) || V0Trigger(aEsd, kASide) || V0Trigger(aEsd, kCSide)) | |
62 | return kTRUE; | |
63 | break; | |
64 | } | |
65 | case AliPWG0Helper::kMB2: | |
66 | { | |
67 | if (SPDGFOTrigger(aEsd) && (V0Trigger(aEsd, kASide) || V0Trigger(aEsd, kCSide))) | |
68 | return kTRUE; | |
69 | break; | |
70 | } | |
71 | case AliPWG0Helper::kMB3: | |
72 | { | |
73 | if (SPDGFOTrigger(aEsd) && V0Trigger(aEsd, kASide) && V0Trigger(aEsd, kCSide)) | |
74 | return kTRUE; | |
75 | break; | |
76 | } | |
77 | case AliPWG0Helper::kSPDGFO: | |
78 | { | |
79 | if (SPDGFOTrigger(aEsd)) | |
80 | return kTRUE; | |
81 | break; | |
82 | } | |
83 | case AliPWG0Helper::kV0A: | |
84 | { | |
85 | if (V0Trigger(aEsd, kASide)) | |
86 | return kTRUE; | |
87 | break; | |
88 | } | |
89 | case AliPWG0Helper::kV0C: | |
90 | { | |
91 | if (V0Trigger(aEsd, kCSide)) | |
92 | return kTRUE; | |
93 | break; | |
94 | } | |
c8d3e441 | 95 | case AliPWG0Helper::kZDC: |
96 | { | |
97 | if (ZDCTrigger(aEsd, kASide) || ZDCTrigger(aEsd, kCentralBarrel) || ZDCTrigger(aEsd, kCSide)) | |
98 | return kTRUE; | |
99 | break; | |
100 | } | |
ff8c4f30 | 101 | case AliPWG0Helper::kZDCA: |
102 | { | |
103 | if (ZDCTrigger(aEsd, kASide)) | |
104 | return kTRUE; | |
105 | break; | |
106 | } | |
107 | case AliPWG0Helper::kZDCC: | |
108 | { | |
109 | if (ZDCTrigger(aEsd, kCSide)) | |
110 | return kTRUE; | |
111 | break; | |
112 | } | |
7a11141c | 113 | case AliPWG0Helper::kFMDA: |
114 | { | |
115 | if (FMDTrigger(aEsd, kASide)) | |
116 | return kTRUE; | |
117 | break; | |
118 | } | |
119 | case AliPWG0Helper::kFMDC: | |
120 | { | |
121 | if (FMDTrigger(aEsd, kCSide)) | |
122 | return kTRUE; | |
123 | break; | |
124 | } | |
125 | case AliPWG0Helper::kFPANY: | |
ff8c4f30 | 126 | { |
7a11141c | 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)) |
ff8c4f30 | 128 | return kTRUE; |
129 | break; | |
130 | } | |
131 | default: | |
132 | { | |
133 | AliFatal(Form("Trigger type %d not implemented", triggerNoFlags)); | |
134 | } | |
135 | } | |
136 | ||
137 | return kFALSE; | |
138 | } | |
139 | ||
140 | Bool_t AliOfflineTrigger::SPDGFOTrigger(const AliESDEvent* aEsd) const | |
141 | { | |
142 | // Returns if the SPD gave a global Fast OR trigger | |
143 | ||
144 | Int_t firedChips = 0; | |
145 | const AliMultiplicity* mult = aEsd->GetMultiplicity(); | |
146 | if (!mult) | |
147 | { | |
148 | AliError("AliMultiplicity not available"); | |
149 | return kFALSE; | |
150 | } | |
151 | firedChips = mult->GetNumberOfFiredChips(0) + mult->GetNumberOfFiredChips(1); | |
152 | ||
153 | if (firedChips >= fSPDGFOThreshold) | |
154 | return kTRUE; | |
155 | return kFALSE; | |
156 | } | |
157 | ||
158 | Bool_t AliOfflineTrigger::V0Trigger(const AliESDEvent* aEsd, AliceSide side) const | |
159 | { | |
160 | // Returns if the V0 triggered | |
161 | ||
162 | AliESDVZERO* v0Data = aEsd->GetVZEROData(); | |
163 | if (!v0Data) | |
164 | { | |
165 | AliError("AliESDVZERO not available"); | |
166 | return kFALSE; | |
167 | } | |
168 | ||
169 | Int_t aCount = 0; | |
170 | Int_t cCount = 0; | |
171 | for (Int_t i=0; i<32; i++) | |
172 | { | |
173 | if (v0Data->BBTriggerV0A(i)) | |
174 | aCount++; | |
175 | if (v0Data->BBTriggerV0C(i)) | |
176 | cCount++; | |
177 | } | |
178 | ||
179 | if (side == kASide && aCount >= fV0AThreshold) | |
180 | return kTRUE; | |
181 | if (side == kCSide && cCount >= fV0CThreshold) | |
182 | return kTRUE; | |
183 | return kFALSE; | |
184 | } | |
185 | ||
c8d3e441 | 186 | Bool_t AliOfflineTrigger::ZDCTrigger(const AliESDEvent* aEsd, AliceSide side) const |
ff8c4f30 | 187 | { |
188 | // Returns if ZDC triggered | |
189 | ||
c8d3e441 | 190 | AliESDZDC* zdcData = aEsd->GetESDZDC(); |
191 | if (!zdcData) | |
192 | { | |
193 | AliError("AliESDZDC not available"); | |
194 | return kFALSE; | |
195 | } | |
196 | ||
197 | UInt_t quality = zdcData->GetESDQuality(); | |
198 | ||
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; | |
206 | ||
207 | if (side == kASide && ((quality & zpa) || (quality & zna))) | |
208 | return kTRUE; | |
209 | if (side == kCentralBarrel && ((quality & zem1) || (quality & zem2))) | |
210 | return kTRUE; | |
211 | if (side == kCSide && ((quality & zpc) || (quality & znc))) | |
212 | return kTRUE; | |
ff8c4f30 | 213 | |
214 | return kFALSE; | |
215 | } | |
216 | ||
7a11141c | 217 | Bool_t AliOfflineTrigger::FMDTrigger(const AliESDEvent* aEsd, AliceSide side) const |
ff8c4f30 | 218 | { |
219 | // Returns if the FMD triggered | |
7a11141c | 220 | // |
221 | // Authors: FMD team, Hans Dalsgaard (code merged from FMD/AliFMDOfflineTrigger) | |
ff8c4f30 | 222 | |
7a11141c | 223 | // Workaround for AliESDEvent::GetFMDData is not const! |
224 | const AliESDFMD* fmdData = (const_cast<AliESDEvent*>(aEsd))->GetFMDData(); | |
225 | if (!fmdData) | |
226 | { | |
227 | AliError("AliESDFMD not available"); | |
228 | return kFALSE; | |
229 | } | |
230 | ||
231 | Int_t detFrom = (side == kASide) ? 1 : 3; | |
232 | Int_t detTo = (side == kASide) ? 2 : 3; | |
233 | ||
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); | |
039db886 | 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; | |
245 | ||
246 | if (mult > fFMDLowCut) | |
247 | totalMult = totalMult + mult; | |
248 | else | |
249 | { | |
250 | if( totalMult > fFMDHitCut) { | |
251 | return kTRUE; | |
252 | } | |
253 | else totalMult = 0 ; | |
254 | } | |
255 | } | |
7a11141c | 256 | } |
257 | } | |
258 | } | |
ff8c4f30 | 259 | return kFALSE; |
260 | } |