Bug fix for https://savannah.cern.ch/bugs/?58205, output data block types and extra...
authoraszostak <aszostak@f7af4fe6-9843-0410-8265-dc069ae4e863>
Tue, 10 Nov 2009 09:54:45 +0000 (09:54 +0000)
committeraszostak <aszostak@f7af4fe6-9843-0410-8265-dc069ae4e863>
Tue, 10 Nov 2009 09:54:45 +0000 (09:54 +0000)
HLT/BASE/AliHLTDataTypes.cxx
HLT/BASE/AliHLTDataTypes.h
HLT/BASE/AliHLTTriggerMenuItem.h
HLT/BASE/AliHLTTriggerMenuSymbol.h
HLT/trigger/AliHLTGlobalTriggerComponent.cxx
HLT/trigger/AliHLTGlobalTriggerComponent.h
HLT/trigger/AliHLTTrigger.cxx
HLT/trigger/AliHLTTrigger.h

index fd5cbc2588b239bf33858919b68d2baf9448ed95..a67941a9794354ba5070c4bef006ce6524ab4332 100644 (file)
@@ -138,6 +138,10 @@ const AliHLTComponentDataType kAliHLTDataTypeRunSummary = AliHLTComponentDataTyp
 const char kAliHLTTriggerDecisionDataTypeIDstring[8] = kAliHLTTriggerDecisionDataTypeID;
 const AliHLTComponentDataType kAliHLTDataTypeTriggerDecision = AliHLTComponentDataTypeInitializer(kAliHLTTriggerDecisionDataTypeIDstring, kAliHLTDataOriginOut);
 
+/** HLT readout list from trigger component */
+const char kAliHLTReadoutListDataTypeIDstring[8] = kAliHLTReadoutListDataTypeID;
+const AliHLTComponentDataType kAliHLTDataTypeReadoutList = AliHLTComponentDataTypeInitializer(kAliHLTReadoutListDataTypeIDstring, kAliHLTDataOriginOut);
+
 /** Global trigger decision */
 const char kAliHLTGlobalTriggerDataTypeIDstring[8] = kAliHLTGlobalTriggerDataTypeID;
 const AliHLTComponentDataType kAliHLTDataTypeGlobalTrigger = AliHLTComponentDataTypeInitializer(kAliHLTGlobalTriggerDataTypeIDstring, kAliHLTDataOriginOut);
index 220cfa61547e644ebda26949b72ffa75d2b0c1b9..372918811e3c3e447655d6bc9273add9e06eae7a 100644 (file)
@@ -249,6 +249,11 @@ const int kAliHLTComponentDataTypefIDsize=8;
  */
 # define kAliHLTDAQRDOUTDataTypeID "DAQRDOUT"
 
+/** HLT readout list.
+ * @ingroup alihlt_component_datatypes
+ */
+# define kAliHLTReadoutListDataTypeID {'H','L','T','R','D','L','S','T'}
+
 /** EventType event 
  * - empty payload, specification gives eventType
  * @ingroup alihlt_component_datatypes
@@ -966,6 +971,12 @@ extern "C" {
    */
   extern const AliHLTComponentDataType kAliHLTDataTypeTriggerDecision;   // {TRIG_DEC:HLT }
 
+  /** Trigger decision
+   * - origin : kAliHLTDataOriginOut ( HLT )
+   * @ingroup alihlt_component_datatypes
+   */
+  extern const AliHLTComponentDataType kAliHLTDataTypeReadoutList;   // {HLTRDLST:HLT }
+
   /** Global trigger decision
    * - origin : kAliHLTDataOriginOut ( HLT )
    * @ingroup alihlt_component_datatypes
index 5859caf56ed224fa90737f90f6aec0596e49f870..a6b42f0584b637f81b5546840c23070de8ed035e 100644 (file)
  * HLT global trigger menu AliHLTTriggerMenu.
  * It stores information about the trigger condition, trigger domain merging
  * expression, trigger priority and the prescalar to apply.
- * The trigger condition is an expression which indicates that must be true
+ * The trigger condition is an expression which indicates what must be true
  * for the trigger menu entry to be fired. A fired item will then use the trigger
  * domain merging expression for the computation of the final global trigger domain.
+ * All expressions must be valid C++.
+ *
+ * The symbols used in the trigger condition expressions are assumed to be AliHLTTrigger
+ * names, unless they are predefined in the trigger menu symbols table. All symbols should
+ * be valid C++ symbol names. However, the '-' character is allowed as a special extention.
+ * The '-' character must not be the first character of the symbol and there cannot be
+ * any spaces between it and the alphanumeric characters. If there are any spaces then
+ * the '-' character is treated as the normal C++ minus operator. For example,
+ * "abc-xyz" is a single whole symbol, while "abc - xyz" are two symbols, abc and xyz,
+ * separated by a minus operator.
+ *
+ * Merging expressions can use all the symbols defined in the trigger menu symbols table
+ * including all the implicit symbols used in the trigger conditions which are assumed
+ * to be AliHLTTrigger names. If a AliHLTTrigger name is not used in a trigger condition
+ * expression, but one wants to use the trigger domain in a merging expression, then a
+ * predefined symbol must be added to the trigger menu symbol table. As an example, in
+ * the following manner:
+ * \code
+ * AliHLTGlobalTriggerConfig config("test config");
+ * config.AddSymbol("myTriggerName", "bool", "this->Result()", "0", "AliHLTTriggerDecision");
+ * \endcode
+ * The trigger name "myTriggerName" should be replaced with the actual name of the
+ * AliHLTTrigger from which one wants to use the trigger domain result.
+ * Symbols with the '-' sign are be handled automatically and will be replaced
+ * by their appropriate versions with the minus signs replaced by underscores.
+ * This means that a minus sign in any other location is always treated as an operator.
+ * If uncertain then just put spaces around the minus operator.
  *
  * \note The following symbol names are reserved and should not be used in either
  * the trigger condition or merging expressions:
index 420fa1f85ba0ac3970d95ed500e21eca00d105ce..c915d4fe8320fecec03f068930c5e58bd87134ce 100644 (file)
@@ -84,12 +84,12 @@ class AliHLTTriggerMenuSymbol : public TObject
   const char* RealName() const;
   
   /**
-   * Returns the symbol name.
+   * Returns the valid C++ symbol name.
    */
   const char* Name() const { return fName.Data(); }
 
   /**
-   * Set the symbol name.
+   * Set the symbol name. It can contain '-' characters.
    */
   void Name(const char* value);
   
@@ -172,7 +172,9 @@ class AliHLTTriggerMenuSymbol : public TObject
   /**
    * Set the expression to assign the symbol value.
    * The keyword 'this' is used as the place holder of the object in the matched
-   * data block.
+   * data block. For example if we want to get a public attribute names xyz from
+   * the object to assign to the symbol we would write the assignment expression
+   * as "this->xyz".
    */
   void AssignExpression(const char* value) { fAssignExpr = value; }
   
@@ -188,7 +190,7 @@ class AliHLTTriggerMenuSymbol : public TObject
 
  private:
   
-  TString fName;  /// The name of the symbol (Must be a valid C++ variable name).
+  TString fName;  /// The name of the symbol (Must be a valid C++ variable name but can contain the '-' character as an extention).
   TString fType;  /// The data type of the symbol (Must be a valid C++ type name).
   AliHLTDomainEntry fBlockType;  /// The data block type and specification this symbol is fetched from.
   TString fClass;  /// The class name of the object to read from (Must be a valid C++ class name).
index fff175806f9090beb0542f9635bed7b8438a2df1..7902bc55429e9d74fdecd496f9f32f2d054af915 100644 (file)
@@ -100,6 +100,13 @@ AliHLTGlobalTriggerComponent::~AliHLTGlobalTriggerComponent()
 }
 
 
+void AliHLTGlobalTriggerComponent::GetOutputDataTypes(AliHLTComponentDataTypeList& list) const
+{
+  // Returns the kAliHLTDataTypeGlobalTrigger type as output.
+  list.push_back(kAliHLTDataTypeGlobalTrigger);
+}
+
+
 void AliHLTGlobalTriggerComponent::GetOutputDataSize(unsigned long& constBase, double& inputMultiplier)
 {
   // Returns the output data size estimate.
@@ -404,7 +411,7 @@ int AliHLTGlobalTriggerComponent::DoTrigger()
 
   CreateEventDoneReadoutFilter(decision.TriggerDomain(), 3);
   CreateEventDoneReadoutFilter(decision.TriggerDomain(), 4);
-  if (TriggerEvent(&decision) == -ENOSPC)
+  if (TriggerEvent(&decision, kAliHLTDataTypeGlobalTrigger) == -ENOSPC)
   {
     // Increase the estimated buffer space required if the PushBack methods in TriggerEvent
     // returned the "no buffer space" error code. Also remember to set the trigger counters
@@ -686,11 +693,11 @@ int AliHLTGlobalTriggerComponent::GenerateTrigger(
   for (Int_t i = 0; i < symbols.GetEntriesFast(); i++)
   {
     AliHLTTriggerMenuSymbol* symbol = static_cast<AliHLTTriggerMenuSymbol*>( symbols.UncheckedAt(i) );
-    code << "      if (strcmp(symbol->Name(), \"" << symbol->RealName() << "\") == 0) {" << endl;
+    code << "      if (strcmp(symbol->RealName(), \"" << symbol->RealName() << "\") == 0) {" << endl;
     if (fDebugMode)
     {
       code << "        HLTDebug(Form(\"Assinging domain entry value corresponding with symbol '%s' to '%s'.\","
-              " symbol->Name(), symbol->BlockType().AsString().Data()));" << endl;
+              " symbol->RealName(), symbol->BlockType().AsString().Data()));" << endl;
     }
     code << "        " << symbol->Name() << "DomainEntry = symbol->BlockType();" << endl;
     code << "        continue;" << endl;
@@ -1268,6 +1275,12 @@ int AliHLTGlobalTriggerComponent::BuildSymbolList(const AliHLTTriggerMenu* menu,
   // implementation class.
   // See header for more details.
   
+  // Note: when we build the symbol list we must use the symbol name as returned
+  // by the Name() method and not the RealName() method when using FindSymbol.
+  // This is so that we avoid problems with the generated code not compiling
+  // because names like "abc-xyz" and "abc_xyz" are synonymous.
+  // Name() returns the converted C++ symbol name as used in the generated code.
+  
   for (UInt_t i = 0; i < menu->NumberOfSymbols(); i++)
   {
     const AliHLTTriggerMenuSymbol* symbol = menu->Symbol(i);
@@ -1323,14 +1336,16 @@ int AliHLTGlobalTriggerComponent::BuildSymbolList(const AliHLTTriggerMenu* menu,
         continue;
       }
 
-      if (FindSymbol(s.Data(), list) == -1)
+      // Need to create the symbols first and check if its name is in the list
+      // before actually adding it to the symbols list.
+      AliHLTTriggerMenuSymbol newSymbol;
+      newSymbol.Name(s.Data());
+      newSymbol.Type("bool");
+      newSymbol.ObjectClass("AliHLTTriggerDecision");
+      newSymbol.AssignExpression("this->Result()");
+      newSymbol.DefaultValue("false");
+      if (FindSymbol(newSymbol.Name(), list) == -1)
       {
-        AliHLTTriggerMenuSymbol newSymbol;
-        newSymbol.Name(s.Data());
-        newSymbol.Type("bool");
-        newSymbol.ObjectClass("AliHLTTriggerDecision");
-        newSymbol.AssignExpression("this->Result()");
-        newSymbol.DefaultValue("false");
         new (list[list.GetEntriesFast()]) AliHLTTriggerMenuSymbol(newSymbol);
       }
     }
index 6a18f29ebba6e74185e409ec6894c0f1c4c50db3..6fb958d258da1ea4b2ae6ba61c87a847bf7fd98d 100644 (file)
@@ -98,6 +98,13 @@ class AliHLTGlobalTriggerComponent : public AliHLTTrigger
    * @return string containing the global trigger name.
    */
   virtual const char* GetTriggerName() const { return "HLTGlobalTrigger"; };
+
+  /**
+   * Inherited from AliHLTTrigger.
+   * This returns kAliHLTDataTypeGlobalTrigger by default.
+   * @param list <i>[out]</i>: The list of data types to be filled.
+   */
+  virtual void GetOutputDataTypes(AliHLTComponentDataTypeList& list) const;
   
   /**
    * Get a ratio by how much the data volume is shrunk or enhanced.
index e911c62a30a3666a83bb385b5ff24e4adad0d4ac..6f0273ccbfba6ac3b2dc0e02bdc8f58ae9dac77d 100644 (file)
@@ -53,6 +53,20 @@ AliHLTTrigger::~AliHLTTrigger()
 }
 
 
+void AliHLTTrigger::GetInputDataTypes(AliHLTComponentDataTypeList& list) const
+{
+  // Returns the kAliHLTAnyDataType type as input.
+  list.push_back(kAliHLTAnyDataType);
+}
+
+
+void AliHLTTrigger::GetOutputDataTypes(AliHLTComponentDataTypeList& list) const
+{
+  // Returns the kAliHLTDataTypeTriggerDecision type as output.
+  list.push_back(kAliHLTDataTypeTriggerDecision);
+}
+
+
 void AliHLTTrigger::GetOutputDataSize(unsigned long& constBase, double& inputMultiplier)
 {
   // Returns output data size estimate.
@@ -109,7 +123,7 @@ int AliHLTTrigger::TriggerEvent(bool value)
   AliHLTTriggerDecision triggerResult(value, GetTriggerName(), fTriggerDomain, fDescription);
   // Append the readout list if it contains anything.
   triggerResult.TriggerDomain().Add(fReadoutList);
-  return TriggerEvent(&triggerResult, kAliHLTDataTypeTObject|kAliHLTDataOriginOut);
+  return TriggerEvent(&triggerResult, kAliHLTDataTypeTriggerDecision);
 }
 
 
@@ -124,7 +138,7 @@ int AliHLTTrigger::TriggerEvent(
   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*/);
+    fTriggerEventResult = PushBack(result->ReadoutList().Buffer(), result->ReadoutList().BufferSize(), kAliHLTDataTypeReadoutList);
   }
   
   if (fTriggerEventResult == 0) fDecisionMade = true;
@@ -151,7 +165,7 @@ int AliHLTTrigger::GetOutputDataTypes(AliHLTComponentDataTypeList& list)
   // of the GetOutputDataTypes method.
   const AliHLTTrigger* t = this;
   t->GetOutputDataTypes(list);
-  list.push_back(kAliHLTDataTypeTObject|kAliHLTDataOriginOut);
+  list.push_back(kAliHLTDataTypeReadoutList);
   return list.size();
 }
 
index 4c8938fbc8b2b0938a443af2cb82860fbf0e8fa7..75648ba47486b7a65c65033d873fe20a60542217 100644 (file)
@@ -74,6 +74,11 @@ class AliHLTTrigger : public AliHLTProcessor
    * Returns the name of the trigger. This must be unique across the system.
    * This method is pure virtual and must be implemented by child classes.
    * @return string containing the trigger name.
+   * \note The name returned by this method should be a valid C++ symbol name.
+   *    Otherwise the global trigger component will not be able to handle the
+   *    derived trigger component properly.
+   *    As an extention the '-' character is allowed in the symbol name,
+   *    but not as the first character.
    */
   virtual const char* GetTriggerName() const = 0;
   
@@ -88,19 +93,16 @@ class AliHLTTrigger : public AliHLTProcessor
    * This method returns kAliHLTAnyDataType by default.
    * @param list <i>[out]</i>: The list of data types to be filled.
    */
-  virtual void GetInputDataTypes(AliHLTComponentDataTypeList& list) const
-  {
-    list.push_back(kAliHLTAnyDataType);
-  }
+  virtual void GetInputDataTypes(AliHLTComponentDataTypeList& list) const;
 
   /**
    * Returns extra output data types this trigger generates.
-   * This returns an empty list by default.
+   * This returns kAliHLTDataTypeTriggerDecision by default.
    * @param list <i>[out]</i>: The list of data types to be filled.
    * \note The underlying non const version of GetOutputDataTypes adds the value
-   *    kAliHLTDataTypeTObject to the list.
+   *    kAliHLTDataTypeReadoutList to the list automatically.
    */
-  virtual void GetOutputDataTypes(AliHLTComponentDataTypeList& /*list*/) const {}
+  virtual void GetOutputDataTypes(AliHLTComponentDataTypeList& list) const;
 
   /**
    * Get a ratio by how much the data volume is shrunk or enhanced.