added FMD offline trigger
authorjgrosseo <jgrosseo@f7af4fe6-9843-0410-8265-dc069ae4e863>
Sun, 15 Nov 2009 13:35:52 +0000 (13:35 +0000)
committerjgrosseo <jgrosseo@f7af4fe6-9843-0410-8265-dc069ae4e863>
Sun, 15 Nov 2009 13:35:52 +0000 (13:35 +0000)
PWG0/AliOfflineTrigger.cxx
PWG0/AliOfflineTrigger.h
PWG0/AliPWG0Helper.cxx
PWG0/AliPWG0Helper.h
PWG0/trigger/AliTriggerTask.cxx

index 5337311..202029e 100644 (file)
@@ -1,5 +1,26 @@
 /* $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)
 {
 }
 
@@ -86,9 +110,21 @@ Bool_t AliOfflineTrigger::IsEventTriggered(const AliESDEvent* aEsd, AliPWG0Helpe
         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;
     }
@@ -178,11 +214,47 @@ Bool_t AliOfflineTrigger::ZDCTrigger(const AliESDEvent* aEsd, AliceSide side) co
   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;
 }
index 08cb354..9888a3c 100644 (file)
@@ -6,6 +6,15 @@
 #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
@@ -20,21 +29,27 @@ 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:
index ea2acbd..bd5a9ad 100644 (file)
@@ -602,7 +602,9 @@ const char* AliPWG0Helper::GetTriggerName(Trigger trigger)
     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;
   }
    
index 10bb19d..bd180c5 100644 (file)
@@ -22,7 +22,7 @@ class AliOfflineTrigger;
 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 };
index 1ff9da7..cb2a6e3 100644 (file)
@@ -37,9 +37,9 @@ AliTriggerTask::AliTriggerTask(const char* opt) :
   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];
@@ -188,13 +188,19 @@ void AliTriggerTask::Terminate(Option_t *)
   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");