]> git.uio.no Git - u/mrichter/AliRoot.git/blob - PWG0/AliOfflineTrigger.cxx
added FMD offline trigger
[u/mrichter/AliRoot.git] / PWG0 / AliOfflineTrigger.cxx
1 /* $Id: AliOfflineTrigger.cxx 35782 2009-10-22 11:54:31Z jgrosseo $ */
2
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
24 #include <AliOfflineTrigger.h>
25
26 #include <AliLog.h>
27
28 #include <AliESDEvent.h>
29
30 #include <AliMultiplicity.h>
31 #include <AliESDVZERO.h>
32 #include <AliESDZDC.h>
33 #include <AliESDFMD.h>
34
35 ClassImp(AliOfflineTrigger)
36
37 AliOfflineTrigger::AliOfflineTrigger() :
38   fSPDGFOThreshold(1),
39   fV0AThreshold(1),
40   fV0CThreshold(1),
41   fFMDLowCut(0.2),
42   fFMDHitCut(0.5)
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     }
95     case AliPWG0Helper::kZDC:
96     {
97       if (ZDCTrigger(aEsd, kASide) || ZDCTrigger(aEsd, kCentralBarrel) || ZDCTrigger(aEsd, kCSide))
98         return kTRUE;
99       break;
100     }
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     }
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:
126     {
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))
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
186 Bool_t AliOfflineTrigger::ZDCTrigger(const AliESDEvent* aEsd, AliceSide side) const
187 {
188   // Returns if ZDC triggered
189   
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;
213   
214   return kFALSE;
215 }
216
217 Bool_t AliOfflineTrigger::FMDTrigger(const AliESDEvent* aEsd, AliceSide side) const
218 {
219   // Returns if the FMD triggered
220   //
221   // Authors: FMD team, Hans Dalsgaard (code merged from FMD/AliFMDOfflineTrigger)
222
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);
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         }
256       }
257     }
258   }
259   return kFALSE;
260 }