adding a member for the active CTP trigger mask to the CTP data object and setting...
[u/mrichter/AliRoot.git] / HLT / BASE / AliHLTCTPData.cxx
index 6611f3271633946fee8b7f9db8c4d31f5aaac8b9..4d5b7ea05f414fb4ce0ac6a219eaa6ed6476a13e 100644 (file)
@@ -5,7 +5,6 @@
 //* ALICE Experiment at CERN, All rights reserved.                         *
 //*                                                                        *
 //* Primary Authors: Matthias Richter <Matthias.Richter@ift.uib.no>        *
-//*                  Timm Steinbeck <timm@kip.uni-heidelberg.de>           *
 //*                  for The ALICE HLT Project.                            *
 //*                                                                        *
 //* Permission to use, copy, modify and distribute this software and its   *
@@ -36,8 +35,9 @@ AliHLTCTPData::AliHLTCTPData()
   : TNamed("AliHLTCTPData", "HLT counters for the CTP")
   , AliHLTLogging()
   , fMask(0)
+  , fTriggers(0)
   , fClassIds(AliHLTReadoutList::Class(), gkNCTPTriggerClasses)
-  , fCounters()
+  , fCounters(gkNCTPTriggerClasses)
 {
   // see header file for class documentation
   // or
@@ -50,8 +50,9 @@ AliHLTCTPData::AliHLTCTPData(const char* parameter)
   : TNamed("AliHLTCTPData", "HLT counters for the CTP")
   , AliHLTLogging()
   , fMask(0)
+  , fTriggers(0)
   , fClassIds(AliHLTReadoutList::Class(), gkNCTPTriggerClasses)
-  , fCounters()
+  , fCounters(gkNCTPTriggerClasses)
 {
   // see header file for class documentation
   InitCTPTriggerClasses(parameter);
@@ -63,6 +64,96 @@ AliHLTCTPData::~AliHLTCTPData()
   fClassIds.Delete();
 }
 
+AliHLTCTPData::AliHLTCTPData(const AliHLTCTPData& src)
+  : TNamed(src.GetName(), src.GetTitle())
+  , AliHLTLogging()
+  , fMask(src.Mask())
+  , fTriggers(src.fTriggers)
+  , fClassIds(src.fClassIds)
+  , fCounters(src.Counters())
+{
+  // see header file for class documentation
+}
+
+AliHLTCTPData& AliHLTCTPData::operator=(const AliHLTCTPData& src)
+{
+  // see header file for class documentation
+  if (this!=&src) {
+    SetName(src.GetName());
+    SetTitle(src.GetTitle());
+    fMask=src.Mask();
+    fClassIds.Delete();
+    fClassIds.ExpandCreate(gkNCTPTriggerClasses);
+    for (int i=0; i<gkNCTPTriggerClasses; i++) {
+      ((TNamed*)fClassIds.At(i))->SetName(src.fClassIds.At(i)->GetName());
+      ((TNamed*)fClassIds.At(i))->SetTitle(src.fClassIds.At(i)->GetTitle());
+    }
+    fCounters=src.Counters();
+  }
+
+  return *this;
+}
+
+int AliHLTCTPData::Add(const AliHLTCTPData& src, int factor, int &skipped)
+{
+  // see header file for class documentation
+  
+  skipped=0;
+  for (int i=0; i<gkNCTPTriggerClasses; i++) {
+    TString c;
+    c=fClassIds.At(i)->GetName();
+    if (c.IsNull()) continue;
+    if (c.CompareTo(src.fClassIds.At(i)->GetName())==0) {
+      fCounters[i]+=factor*src.Counter(i);
+    } else {
+      skipped++;
+    }
+  }
+  return 0;
+}
+
+AliHLTCTPData& AliHLTCTPData::operator += (const AliHLTCTPData& src)
+{
+  // see header file for class documentation
+  
+  int nofInconsistencies=0;
+  Add(src, 1, nofInconsistencies);
+  if (nofInconsistencies>0) {
+    HLTError("Inconsistent operants: skipping %d of %d CTP classes for operation", nofInconsistencies, gkNCTPTriggerClasses);
+  }
+  return *this;
+}
+
+AliHLTCTPData& AliHLTCTPData::operator -= (const AliHLTCTPData& src)
+{
+  // see header file for class documentation
+  
+  int nofInconsistencies=0;
+  Add(src, -1, nofInconsistencies);
+  if (nofInconsistencies>0) {
+    HLTError("Inconsistent operants: skipping %d of %d CTP classes for operation", nofInconsistencies, gkNCTPTriggerClasses);
+  }
+  return *this;
+}
+
+AliHLTCTPData AliHLTCTPData::operator + (const AliHLTCTPData& src) const
+{
+  // see header file for class documentation
+
+  AliHLTCTPData result(*this);
+  result+=src;
+  return result;
+}
+
+AliHLTCTPData AliHLTCTPData::operator - (const AliHLTCTPData& src) const
+{
+  // see header file for class documentation
+
+  AliHLTCTPData result(*this);
+  result-=src;
+  return result;
+}
+
 int AliHLTCTPData::InitCTPTriggerClasses(const char* ctpString)
 {
   // see header file for function documentation
@@ -127,7 +218,21 @@ int AliHLTCTPData::InitCTPTriggerClasses(const char* ctpString)
   return 0;
 }
 
-bool AliHLTCTPData::EvaluateCTPTriggerClass(const char* expression, AliHLTComponentTriggerData& trigData) const
+AliHLTUInt64_t AliHLTCTPData::ActiveTriggers(const AliHLTComponentTriggerData& trigData)
+{
+  // extract active triggers from the trigger data
+  if (trigData.fDataSize != sizeof(AliHLTEventTriggerData)) return (AliHLTUInt64_t)0;
+
+  // trigger mask is 50 bit wide and is stored in word 5 and 6 of the CDH
+  AliHLTEventTriggerData* evtData=reinterpret_cast<AliHLTEventTriggerData*>(trigData.fData);
+  AliHLTUInt64_t triggerMask=evtData->fCommonHeader[6]&0x3ffff;
+  triggerMask<<=32;
+  triggerMask|=evtData->fCommonHeader[5];
+  return triggerMask;
+}
+
+bool AliHLTCTPData::EvaluateCTPTriggerClass(const char* expression, const AliHLTComponentTriggerData& trigData) const
 {
   // see header file for function documentation
   if (trigData.fDataSize != sizeof(AliHLTEventTriggerData)) {
@@ -147,6 +252,13 @@ bool AliHLTCTPData::EvaluateCTPTriggerClass(const char* expression, AliHLTCompon
     return false;
   }
 
+  return EvaluateCTPTriggerClass(expression, triggerMask);
+}
+
+bool AliHLTCTPData::EvaluateCTPTriggerClass(const char* expression, AliHLTUInt64_t triggerMask) const
+{
+  // see header file for function documentation
+
   // use a TFormula to interprete the expression
   // all classname are replaced by '[n]' which means the n'th parameter in the formula
   // the parameters are set to 0 or 1 depending on the bit in the trigger mask
@@ -296,14 +408,7 @@ AliHLTEventDDL AliHLTCTPData::ReadoutList(const AliHLTComponentTriggerData& trig
     if (i>fClassIds.GetLast()) break;
     if ((triggerMask&((AliHLTUInt64_t)0x1<<i))==0) continue;
     AliHLTReadoutList* tcrl=(AliHLTReadoutList*)fClassIds.At(i);
-    // 2009-08-27: this is a temorary bugfix:
-    // the operator functions of the AliHLTReadoutList class did not work
-    // when running online on the HLT cluster. The fix for the moment is
-    // to send out the readout list only for the first matching trigger
-    // class instead of merging the list. This is sufficient for the
-    // current trigger setups but needs to be corrected
-    return *tcrl;
-    list|=*tcrl;
+    list.OrEq(*tcrl);
   }
 
   return list;
@@ -312,7 +417,8 @@ AliHLTEventDDL AliHLTCTPData::ReadoutList(const AliHLTComponentTriggerData& trig
 void AliHLTCTPData::Print(Option_t* /*option*/) const
 {
   // see header file for function documentation
-  cout << "CTP counters:" << endl;
+  cout << GetTitle() << endl;
+  cout << "\tactive trigger mask: 0x" << hex << fTriggers << dec << endl;
   int count=0;
   for (int i=0; i<gkNCTPTriggerClasses; i++) {
     if (i>=Counters().GetSize()) break;