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 //-------------------------------------------------------------------------
26 #include <TIterator.h>
28 #include <AliOfflineTrigger.h>
32 #include <AliESDEvent.h>
34 #include <AliMultiplicity.h>
35 #include <AliESDVZERO.h>
36 #include <AliESDZDC.h>
37 #include <AliESDFMD.h>
39 ClassImp(AliOfflineTrigger)
41 AliOfflineTrigger::AliOfflineTrigger() :
58 void AliOfflineTrigger::EnableHistograms()
60 // creates the monitoring histograms
62 fHistSPD = new TH1F("fHistSPD", "SPD GFO;number of fired chips;events", 1202, -1.5, 1200.5);
63 fHistV0A = new TH1F("fHistV0A", "V0A;number of BB triggers;events", 34, -1.5, 32.5);
64 fHistV0C = new TH1F("fHistV0C", "V0C;number of BB triggers;events", 34, -1.5, 32.5);
65 fHistZDC = new TH1F("fHistZDC", "ZDC;trigger bits;events", 8, -1.5, 6.5);
68 fHistFMDA = new TH1F("fHistFMDA", "FMDA;combinations above threshold;events", 102, -1.5, 100.5);
69 fHistFMDC = new TH1F("fHistFMDC", "FMDC;combinations above threshold;events", 102, -1.5, 100.5);
70 fHistFMDSingle = new TH1F("fHistFMDSingle", "FMD single;multiplicity value;counts", 1000, 0, 10);
71 fHistFMDSum = new TH1F("fHistFMDSum", "FMD sum;multiplicity value;counts", 1000, 0, 10);
74 Bool_t AliOfflineTrigger::IsEventTriggered(const AliESDEvent* aEsd, AliPWG0Helper::Trigger trigger) const
76 // checks if an event has been triggered "offline"
78 UInt_t triggerNoFlags = (UInt_t) trigger % (UInt_t) AliPWG0Helper::kStartOfFlags;
80 switch (triggerNoFlags)
82 case AliPWG0Helper::kAcceptAll:
87 case AliPWG0Helper::kMB1:
89 if (SPDGFOTrigger(aEsd) || V0Trigger(aEsd, kASide) || V0Trigger(aEsd, kCSide))
93 case AliPWG0Helper::kMB2:
95 if (SPDGFOTrigger(aEsd) && (V0Trigger(aEsd, kASide) || V0Trigger(aEsd, kCSide)))
99 case AliPWG0Helper::kMB3:
101 if (SPDGFOTrigger(aEsd) && V0Trigger(aEsd, kASide) && V0Trigger(aEsd, kCSide))
105 case AliPWG0Helper::kSPDGFO:
107 if (SPDGFOTrigger(aEsd))
111 case AliPWG0Helper::kV0A:
113 if (V0Trigger(aEsd, kASide))
117 case AliPWG0Helper::kV0C:
119 if (V0Trigger(aEsd, kCSide))
123 case AliPWG0Helper::kZDC:
125 if (ZDCTrigger(aEsd, kASide) || ZDCTrigger(aEsd, kCentralBarrel) || ZDCTrigger(aEsd, kCSide))
129 case AliPWG0Helper::kZDCA:
131 if (ZDCTrigger(aEsd, kASide))
135 case AliPWG0Helper::kZDCC:
137 if (ZDCTrigger(aEsd, kCSide))
141 case AliPWG0Helper::kFMDA:
143 if (FMDTrigger(aEsd, kASide))
147 case AliPWG0Helper::kFMDC:
149 if (FMDTrigger(aEsd, kCSide))
153 case AliPWG0Helper::kFPANY:
155 if (SPDGFOTrigger(aEsd) || V0Trigger(aEsd, kASide) || V0Trigger(aEsd, kCSide) || ZDCTrigger(aEsd, kASide) || ZDCTrigger(aEsd, kCentralBarrel) || ZDCTrigger(aEsd, kCSide) || FMDTrigger(aEsd, kASide) || FMDTrigger(aEsd, kCSide))
161 AliFatal(Form("Trigger type %d not implemented", triggerNoFlags));
168 void AliOfflineTrigger::FillHistograms(const AliESDEvent* aEsd)
170 // fills the histograms with the info from the ESD
172 fHistSPD->Fill(SPDFiredChips(aEsd));
174 fHistV0A->Fill(V0BBTriggers(aEsd, kASide));
175 fHistV0C->Fill(V0BBTriggers(aEsd, kCSide));
177 AliESDZDC* zdcData = aEsd->GetESDZDC();
180 UInt_t quality = zdcData->GetESDQuality();
182 // from Nora's presentation, general first physics meeting 16.10.09
183 static UInt_t zpc = 0x20;
184 static UInt_t znc = 0x10;
185 static UInt_t zem1 = 0x08;
186 static UInt_t zem2 = 0x04;
187 static UInt_t zpa = 0x02;
188 static UInt_t zna = 0x01;
190 fHistZDC->Fill(1, quality & zna);
191 fHistZDC->Fill(2, quality & zpa);
192 fHistZDC->Fill(3, quality & zem2);
193 fHistZDC->Fill(4, quality & zem1);
194 fHistZDC->Fill(5, quality & znc);
195 fHistZDC->Fill(6, quality & zpc);
200 AliError("AliESDZDC not available");
203 fHistFMDA->Fill(FMDHitCombinations(aEsd, kASide, kTRUE));
204 fHistFMDC->Fill(FMDHitCombinations(aEsd, kCSide, kTRUE));
207 Int_t AliOfflineTrigger::SPDFiredChips(const AliESDEvent* aEsd) const
209 // returns the number of fired chips in the SPD
211 const AliMultiplicity* mult = aEsd->GetMultiplicity();
214 AliError("AliMultiplicity not available");
217 return mult->GetNumberOfFiredChips(0) + mult->GetNumberOfFiredChips(1);
220 Bool_t AliOfflineTrigger::SPDGFOTrigger(const AliESDEvent* aEsd) const
222 // Returns if the SPD gave a global Fast OR trigger
224 Int_t firedChips = SPDFiredChips(aEsd);
226 if (firedChips >= fSPDGFOThreshold)
231 Int_t AliOfflineTrigger::V0BBTriggers(const AliESDEvent* aEsd, AliceSide side) const
233 // returns the number of BB triggers in V0A | V0C
235 AliESDVZERO* v0Data = aEsd->GetVZEROData();
238 AliError("AliESDVZERO not available");
243 for (Int_t i=0; i<32; i++)
245 if (side == kASide && v0Data->BBTriggerV0A(i))
247 if (side == kCSide && v0Data->BBTriggerV0C(i))
254 Bool_t AliOfflineTrigger::V0Trigger(const AliESDEvent* aEsd, AliceSide side) const
256 // Returns if the V0 triggered
258 Int_t count = V0BBTriggers(aEsd, side);
260 if (side == kASide && count >= fV0AThreshold)
262 if (side == kCSide && count >= fV0CThreshold)
267 Bool_t AliOfflineTrigger::ZDCTrigger(const AliESDEvent* aEsd, AliceSide side) const
269 // Returns if ZDC triggered
271 AliESDZDC* zdcData = aEsd->GetESDZDC();
274 AliError("AliESDZDC not available");
278 UInt_t quality = zdcData->GetESDQuality();
280 // from Nora's presentation, general first physics meeting 16.10.09
281 static UInt_t zpc = 0x20;
282 static UInt_t znc = 0x10;
283 static UInt_t zem1 = 0x08;
284 static UInt_t zem2 = 0x04;
285 static UInt_t zpa = 0x02;
286 static UInt_t zna = 0x01;
288 if (side == kASide && ((quality & zpa) || (quality & zna)))
290 if (side == kCentralBarrel && ((quality & zem1) || (quality & zem2)))
292 if (side == kCSide && ((quality & zpc) || (quality & znc)))
298 Int_t AliOfflineTrigger::FMDHitCombinations(const AliESDEvent* aEsd, AliceSide side, Bool_t fillHistograms) const
300 // returns number of hit combinations agove threshold
302 // Authors: FMD team, Hans Dalsgaard (code merged from FMD/AliFMDOfflineTrigger)
304 // Workaround for AliESDEvent::GetFMDData is not const!
305 const AliESDFMD* fmdData = (const_cast<AliESDEvent*>(aEsd))->GetFMDData();
308 AliError("AliESDFMD not available");
312 Int_t detFrom = (side == kASide) ? 1 : 3;
313 Int_t detTo = (side == kASide) ? 2 : 3;
316 Float_t totalMult = 0;
317 for (UShort_t det=detFrom;det<=detTo;det++) {
318 Int_t nRings = (det == 1 ? 1 : 2);
319 for (UShort_t ir = 0; ir < nRings; ir++) {
320 Char_t ring = (ir == 0 ? 'I' : 'O');
321 UShort_t nsec = (ir == 0 ? 20 : 40);
322 UShort_t nstr = (ir == 0 ? 512 : 256);
323 for (UShort_t sec =0; sec < nsec; sec++) {
324 for (UShort_t strip = 0; strip < nstr; strip++) {
325 Float_t mult = fmdData->Multiplicity(det,ring,sec,strip);
326 if (mult == AliESDFMD::kInvalidMult) continue;
329 fHistFMDSingle->Fill(mult);
331 if (mult > fFMDLowCut)
332 totalMult = totalMult + mult;
335 if (totalMult > fFMDHitCut)
339 fHistFMDSum->Fill(totalMult);
351 Bool_t AliOfflineTrigger::FMDTrigger(const AliESDEvent* aEsd, AliceSide side) const
353 // Returns if the FMD triggered
355 // Authors: FMD team, Hans Dalsgaard (code merged from FMD/AliFMDOfflineTrigger)
357 Int_t triggers = FMDHitCombinations(aEsd, side, kFALSE);
365 Long64_t AliOfflineTrigger::Merge(TCollection* list)
367 // Merge a list of AliMultiplicityCorrection objects with this (needed for
369 // Returns the number of merged objects (including this).
377 TIterator* iter = list->MakeIterator();
380 // collections of all histograms
381 const Int_t nHists = 8;
382 TList collections[nHists];
385 while ((obj = iter->Next())) {
387 AliOfflineTrigger* entry = dynamic_cast<AliOfflineTrigger*> (obj);
391 collections[0].Add(entry->fHistSPD);
392 collections[1].Add(entry->fHistV0A);
393 collections[2].Add(entry->fHistV0C);
394 collections[3].Add(entry->fHistZDC);
395 collections[4].Add(entry->fHistFMDA);
396 collections[5].Add(entry->fHistFMDC);
397 collections[6].Add(entry->fHistFMDSingle);
398 collections[7].Add(entry->fHistFMDSum);
403 fHistSPD->Merge(&collections[0]);
404 fHistV0A->Merge(&collections[1]);
405 fHistV0C->Merge(&collections[2]);
406 fHistZDC->Merge(&collections[3]);
407 fHistFMDA->Merge(&collections[4]);
408 fHistFMDC->Merge(&collections[5]);
409 fHistFMDSingle->Merge(&collections[6]);
410 fHistFMDSum->Merge(&collections[7]);
417 void AliOfflineTrigger::WriteHistograms() const
419 // write histograms to current directory
430 fHistFMDSingle->Write();
431 fHistFMDSum->Write();