/* $Id: AliOfflineTrigger.cxx 35782 2009-10-22 11:54:31Z jgrosseo $ */
+/**************************************************************************
+ * Copyright(c) 1998-2009, ALICE Experiment at CERN, All rights reserved. *
+ * *
+ * Author: The ALICE Off-line Project. *
+ * Contributors are mentioned in the code where appropriate. *
+ * *
+ * Permission to use, copy, modify and distribute this software and its *
+ * documentation strictly for non-commercial purposes is hereby granted *
+ * without fee, provided that the above copyright notice appears in all *
+ * copies and that both the copyright notice and this permission notice *
+ * appear in the supporting documentation. The authors make no claims *
+ * about the suitability of this software for any purpose. It is *
+ * provided "as is" without express or implied warranty. *
+ **************************************************************************/
+
+//-------------------------------------------------------------------------
+// Implementation of Class AliOfflineTrigger
+// This class provides offline triggers from data in the ESD
+// Origin: Jan Fiete Grosse-Oetringhaus, CERN
+//-------------------------------------------------------------------------
+
#include <AliOfflineTrigger.h>
#include <AliLog.h>
#include <AliMultiplicity.h>
#include <AliESDVZERO.h>
#include <AliESDZDC.h>
+#include <AliESDFMD.h>
ClassImp(AliOfflineTrigger)
AliOfflineTrigger::AliOfflineTrigger() :
fSPDGFOThreshold(1),
fV0AThreshold(1),
- fV0CThreshold(1)
+ fV0CThreshold(1),
+ fFMDLowCut(0.2),
+ fFMDHitCut(0.5)
{
}
return kTRUE;
break;
}
- case AliPWG0Helper::kFMD:
+ case AliPWG0Helper::kFMDA:
+ {
+ if (FMDTrigger(aEsd, kASide))
+ return kTRUE;
+ break;
+ }
+ case AliPWG0Helper::kFMDC:
+ {
+ if (FMDTrigger(aEsd, kCSide))
+ return kTRUE;
+ break;
+ }
+ case AliPWG0Helper::kFPANY:
{
- if (FMDTrigger(aEsd))
+ if (SPDGFOTrigger(aEsd) || V0Trigger(aEsd, kASide) || V0Trigger(aEsd, kCSide) || ZDCTrigger(aEsd, kASide) || ZDCTrigger(aEsd, kCentralBarrel) || ZDCTrigger(aEsd, kCSide) || FMDTrigger(aEsd, kASide) || FMDTrigger(aEsd, kCSide))
return kTRUE;
break;
}
return kFALSE;
}
-Bool_t AliOfflineTrigger::FMDTrigger(const AliESDEvent* /* aEsd */) const
+Bool_t AliOfflineTrigger::FMDTrigger(const AliESDEvent* aEsd, AliceSide side) const
{
// Returns if the FMD triggered
+ //
+ // Authors: FMD team, Hans Dalsgaard (code merged from FMD/AliFMDOfflineTrigger)
- AliFatal("Not implemented");
-
+ // Workaround for AliESDEvent::GetFMDData is not const!
+ const AliESDFMD* fmdData = (const_cast<AliESDEvent*>(aEsd))->GetFMDData();
+ if (!fmdData)
+ {
+ AliError("AliESDFMD not available");
+ return kFALSE;
+ }
+
+ Int_t detFrom = (side == kASide) ? 1 : 3;
+ Int_t detTo = (side == kASide) ? 2 : 3;
+
+ Float_t totalMult = 0;
+ for (UShort_t det=detFrom;det<=detTo;det++) {
+ Int_t nRings = (det == 1 ? 1 : 2);
+ for (UShort_t ir = 0; ir < nRings; ir++) {
+ Char_t ring = (ir == 0 ? 'I' : 'O');
+ UShort_t nsec = (ir == 0 ? 20 : 40);
+ UShort_t nstr = (ir == 0 ? 512 : 256);
+ for (UShort_t sec =0; sec < nsec; sec++) {
+ for (UShort_t strip = 0; strip < nstr; strip++) {
+ Float_t mult = fmdData->Multiplicity(det,ring,sec,strip);
+ if (mult == AliESDFMD::kInvalidMult) continue;
+
+ if (mult > fFMDLowCut)
+ totalMult = totalMult + mult;
+ else
+ {
+ if( totalMult > fFMDHitCut) {
+ return kTRUE;
+ }
+ else totalMult = 0 ;
+ }
+ }
+ }
+ }
+ }
return kFALSE;
}
#include <TObject.h>
#include <AliPWG0Helper.h>
+/* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
+ * See cxx source for full Copyright notice */
+
+//-------------------------------------------------------------------------
+// Implementation of Class AliOfflineTrigger
+// This class provides offline triggers from data in the ESD
+// Origin: Jan Fiete Grosse-Oetringhaus, CERN
+//-------------------------------------------------------------------------
+
class AliESDEvent;
class AliOfflineTrigger : public TObject
void SetSPDGFOThreshhold(Int_t t) { fSPDGFOThreshold = t; }
void SetV0Threshhold(Int_t aSide, Int_t cSide) { fV0AThreshold = aSide; fV0CThreshold = cSide; }
+ void SetFMDThreshold(Float_t low, Float_t hit) { fFMDLowCut = low; fFMDHitCut = hit; }
Int_t GetSPDGFOThreshhold() const { return fSPDGFOThreshold; }
Int_t GetV0AThreshold() const { return fV0AThreshold; }
Int_t GetV0CThreshold() const { return fV0CThreshold; }
+ Float_t GetFMDLowThreshold() const { return fFMDLowCut; }
+ Float_t GetFMDHitThreshold() const { return fFMDHitCut; }
protected:
Bool_t SPDGFOTrigger(const AliESDEvent* aEsd) const;
Bool_t V0Trigger(const AliESDEvent* aEsd, AliceSide side) const;
Bool_t ZDCTrigger(const AliESDEvent* aEsd, AliceSide side) const;
- Bool_t FMDTrigger(const AliESDEvent* aEsd) const;
+ Bool_t FMDTrigger(const AliESDEvent* aEsd, AliceSide side) const;
Int_t fSPDGFOThreshold; // number of chips to accept a SPD GF0 trigger
Int_t fV0AThreshold; // threshold for number of BB triggers in V0A
Int_t fV0CThreshold; // threshold for number of BB triggers in V0C
+ Float_t fFMDLowCut; //
+ Float_t fFMDHitCut; //
+
ClassDef(AliOfflineTrigger, 0)
private:
case kZDC : str = "ZDC"; break;
case kZDCA : str = "ZDC A"; break;
case kZDCC : str = "ZDC C"; break;
- case kFMD : str = "FMD"; break;
+ case kFMDA : str = "FMD A"; break;
+ case kFMDC : str = "FMD C"; break;
+ case kFPANY : str = "SPD GFO | V0 | ZDC | FMD"; break;
default: str = ""; break;
}
class AliPWG0Helper : public TObject
{
public:
- enum Trigger { kAcceptAll = 1, kMB1 = 2, kMB2, kMB3, kSPDGFO, kV0A, kV0C, kZDC, kZDCA, kZDCC, kFMD, kStartOfFlags = 0x0100, kOfflineFlag = 0x8000 }; // MB1, MB2, MB3 definition from ALICE-INT-2005-025
+ enum Trigger { kAcceptAll = 1, kMB1 = 2, kMB2, kMB3, kSPDGFO, kV0A, kV0C, kZDC, kZDCA, kZDCC, kFMDA, kFMDC, kFPANY, kStartOfFlags = 0x0100, kOfflineFlag = 0x8000 }; // MB1, MB2, MB3 definition from ALICE-INT-2005-025
enum AnalysisMode { kInvalid = -1, kSPD = 0x1, kTPC = 0x2, kTPCITS = 0x4, kFieldOn = 0x8 };
// in case we want to use bitmaps...
enum MCProcessType { kInvalidProcess = -1, kND = 0x1, kDD = 0x2, kSD = 0x4 };
DefineInput(0, TChain::Class());
DefineOutput(0, TList::Class());
- fNTriggers = 10;
+ fNTriggers = 13;
- static AliPWG0Helper::Trigger triggerList[] = { AliPWG0Helper::kAcceptAll, AliPWG0Helper::kMB1, AliPWG0Helper::kMB2, AliPWG0Helper::kMB3, AliPWG0Helper::kSPDGFO, AliPWG0Helper::kV0A, AliPWG0Helper::kV0C, AliPWG0Helper::kZDC, AliPWG0Helper::kZDCA, AliPWG0Helper::kZDCC };
+ static AliPWG0Helper::Trigger triggerList[] = { AliPWG0Helper::kAcceptAll, AliPWG0Helper::kFPANY, AliPWG0Helper::kMB1, AliPWG0Helper::kMB2, AliPWG0Helper::kMB3, AliPWG0Helper::kSPDGFO, AliPWG0Helper::kV0A, AliPWG0Helper::kV0C, AliPWG0Helper::kZDC, AliPWG0Helper::kZDCA, AliPWG0Helper::kZDCC, AliPWG0Helper::kFMDA, AliPWG0Helper::kFMDC };
fTriggerList = triggerList;
fStats = new TH1*[fNTriggers];
c->Divide(nX, nY);
Printf("+++++++++ TRIGGER STATS:");
+
+ Int_t base = 1;
+ if (fStats[0])
+ base = (Int_t) fStats[0]->Integral();
+
+ Int_t length = fEndTime - fStartTime;
for (Int_t i=0; i<fNTriggers; i++)
if (fStats[i])
{
c->cd(i+1);
fStats[i]->Draw();
- Printf("%s: %d triggers", AliPWG0Helper::GetTriggerName(fTriggerList[i]), (UInt_t) fStats[i]->Integral());
+ Printf("%s: %d triggers | %f %% of all triggered | Rate: %f Hz", AliPWG0Helper::GetTriggerName(fTriggerList[i]), (UInt_t) fStats[i]->Integral(), fStats[i]->Integral() / base, (length > 0) ? (fStats[i]->Integral() / length) : -1);
}
Printf("Writting result to trigger.root");