]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - HLT/trigger/AliHLTTrigger.cxx
including the CTPData to the input objects of the HLTGlobalTriggerDecision
[u/mrichter/AliRoot.git] / HLT / trigger / AliHLTTrigger.cxx
index ed33337f379b493f8c78866f58989cbca879733a..e911c62a30a3666a83bb385b5ff24e4adad0d4ac 100644 (file)
@@ -1,3 +1,4 @@
+// $Id$
 /**************************************************************************
  * This file is property of and copyright by the ALICE HLT Project        *
  * ALICE Experiment at CERN, All rights reserved.                         *
  * provided "as is" without express or implied warranty.                  *
  **************************************************************************/
 
+/// @file   AliHLTTrigger.h
+/// @author Artur Szostak <artursz@iafrica.com>
+/// @date   12 Aug 2008
+/// @brief  Implementation of the AliHLTTrigger base component class.
+///
+/// The AliHLTTrigger class is the base class from which all HLT trigger components
+/// should be derived.
+
 #include "AliHLTTrigger.h"
-#include "TObjString.h"
+#include "AliHLTTriggerDecision.h"
+#include "AliHLTReadoutList.h"
+#include "AliHLTTriggerDomain.h"
+#include "AliHLTDomainEntry.h"
 
 ClassImp(AliHLTTrigger)
 
@@ -25,37 +37,52 @@ AliHLTTrigger::AliHLTTrigger() :
        fEventData(NULL),
        fTriggerData(NULL),
        fDecisionMade(false),
+       fClearInfo(true),
        fTriggerEventResult(0),
-       fReadoutList()
+       fDescription(),
+       fReadoutList(),
+       fTriggerDomain()
 {
-  /// Default constructor sets pointers to NULL.
+  // Default constructor sets pointers to NULL.
 }
 
 
 AliHLTTrigger::~AliHLTTrigger()
 {
-  /// Default destructor.
+  // Default destructor.
 }
 
 
 void AliHLTTrigger::GetOutputDataSize(unsigned long& constBase, double& inputMultiplier)
 {
-  /// Returns output data size estimate.
+  // Returns output data size estimate.
+  // See header file for more details.
 
-  constBase = strlen(GetTriggerName()) + sizeof(TObjString) + 1;
+  // Matthias 2009-07-03 this is presumably to small as the streamed object might be
+  // bigger. This is actually the case in root v5-24-00
+  // Just take 2x the size of the object
+  constBase = 2*sizeof(AliHLTTriggerDecision);
   inputMultiplier = 1;
 }
 
 
 int AliHLTTrigger::DoEvent(const AliHLTComponentEventData& evtData, AliHLTComponentTriggerData& trigData)
 {
-  /// Sets the pointers to the evtData and trigData, then calls the DoTrigger to
-  /// execute the actual trigger algorithm.
+  // Sets the pointers to the evtData and trigData, then calls the DoTrigger to
+  // execute the actual trigger algorithm.
 
   fEventData = &evtData;
   fTriggerData = &trigData;
   fDecisionMade = false;
   fTriggerEventResult = 0;
+  // Reset the description, readout list and trigger domain used by TriggerEvent
+  // if requested to do so.
+  if (fClearInfo)
+  {
+    fDescription = "";
+    fReadoutList.Clear();
+    fTriggerDomain.Clear();
+  }
   
   int result = DoTrigger();
   if (result != 0) return result;
@@ -66,10 +93,6 @@ int AliHLTTrigger::DoEvent(const AliHLTComponentEventData& evtData, AliHLTCompon
     TriggerEvent(false);
   }
 
-//TODO
-//  result = PushBack(&fReadoutList, kAliHLTDataTypeTObject|kAliHLTDataOriginOut);
-//  if (result != 0) return result;
-
   // Cleanup
   fEventData = NULL;
   fTriggerData = NULL;
@@ -77,13 +100,103 @@ int AliHLTTrigger::DoEvent(const AliHLTComponentEventData& evtData, AliHLTCompon
 }
 
 
-void AliHLTTrigger::TriggerEvent(bool value)
+int AliHLTTrigger::TriggerEvent(bool value)
+{
+  // Sets the trigger decision for the current event.
+  // See header file for more details.
+  
+  if (fTriggerEventResult != 0) return fTriggerEventResult;  // Do not do anything if a previous call failed.
+  AliHLTTriggerDecision triggerResult(value, GetTriggerName(), fTriggerDomain, fDescription);
+  // Append the readout list if it contains anything.
+  triggerResult.TriggerDomain().Add(fReadoutList);
+  return TriggerEvent(&triggerResult, kAliHLTDataTypeTObject|kAliHLTDataOriginOut);
+}
+
+
+int AliHLTTrigger::TriggerEvent(
+    AliHLTTriggerDecision* result, const AliHLTComponentDataType& type,
+    AliHLTUInt32_t spec
+  )
+{
+  // Sets a custom trigger decision for the current event.
+  // See header file for more details.
+  
+  if (fTriggerEventResult != 0) return fTriggerEventResult;  // Do not do anything if a previous call failed.
+  fTriggerEventResult = PushBack(result, type, spec);
+  if (fTriggerEventResult == 0) {
+    fTriggerEventResult = PushBack(result->ReadoutList().Buffer(), result->ReadoutList().BufferSize(), "HLTRDLST", "HLT "/*kAliHLTDataTypeDAQRDOUT|kAliHLTDataOriginOut*/);
+  }
+  
+  if (fTriggerEventResult == 0) fDecisionMade = true;
+  return fTriggerEventResult;
+}
+
+
+void AliHLTTrigger::GetInputDataTypes(AliHLTComponentDataTypeList& list)
+{
+  // Calls the const version of this method.
+  
+  // Assign to const temporary variable to make sure we call the constant version
+  // of the GetOutputDataTypes method.
+  const AliHLTTrigger* t = this;
+  t->GetInputDataTypes(list);
+}
+
+
+int AliHLTTrigger::GetOutputDataTypes(AliHLTComponentDataTypeList& list)
 {
-  /// Sets the trigger decision for the current event.
+  // Calls the const version of this method.
   
-  if (fTriggerEventResult != 0) return;  // Do not do anything if a previous call failed.
-  TObjString triggerResult(GetTriggerName());
-  triggerResult.SetBit(BIT(14), value);  // Use bit 14 for the boolean decision.
-  fTriggerEventResult = PushBack(&triggerResult, kAliHLTDataTypeTObject|kAliHLTDataOriginOut);
+  // Assign to const temporary variable to make sure we call the constant version
+  // of the GetOutputDataTypes method.
+  const AliHLTTrigger* t = this;
+  t->GetOutputDataTypes(list);
+  list.push_back(kAliHLTDataTypeTObject|kAliHLTDataOriginOut);
+  return list.size();
 }
 
+int AliHLTTrigger::CreateEventDoneReadoutFilter(const AliHLTTriggerDomain& domain, unsigned type)
+{
+  // add a readout filter to the EventDoneData
+  int iResult=0;
+  unsigned nofEntries=domain.GetNofEntries();
+  // we need:
+  //   1 word eventually for the monitor event command
+  //   1 word for the readout filter command
+  //   1 word for the readout filter size
+  // 4*n words for the filter list
+  if ((iResult=ReserveEventDoneData((nofEntries*4 + 3) * sizeof(AliHLTUInt32_t)))<0) return iResult;
+  AliHLTUInt32_t eddbuffer[4];
+  if (type==4) {
+    // in the case of the monitoring filter we also add the monitor event command
+    eddbuffer[0]=5;
+    if ((iResult=PushEventDoneData(eddbuffer[0]))<0) return iResult;
+  }
+
+  // now the readout list command and the block count
+  eddbuffer[0]=type;
+  if ((iResult=PushEventDoneData(eddbuffer[0]))<0) return iResult;
+
+  // find the valid entries
+  unsigned block=0;
+  vector<const AliHLTDomainEntry*> entries;
+  for (block=0; block<nofEntries; block++) {
+    // skip all DAQ readout entries as they are handled by the readout list
+    if (domain[block]==AliHLTDomainEntry(kAliHLTDataTypeDAQRDOUT)) continue;
+    if (domain[block].Exclusive()) {
+      HLTWarning("exclusive trigger domain entries are currently not handled, skipping entry %s", domain[block].AsString().Data());
+      continue;
+    }
+    entries.push_back(&(domain[block]));
+  }
+  eddbuffer[0]=entries.size();
+  if ((iResult=PushEventDoneData(eddbuffer[0]))<0) return iResult;
+
+  for (vector<const AliHLTDomainEntry*>::iterator entry=entries.begin();
+       entry!=entries.end(); entry++) {
+    (*entry)->AsBinary(eddbuffer);
+    for (int n=0; n<4; n++)
+      if ((iResult=PushEventDoneData(eddbuffer[n]))<0) return iResult;
+  }
+  return iResult;
+}