Updates required for new readout list bit pattern format.
authoraszostak <aszostak@f7af4fe6-9843-0410-8265-dc069ae4e863>
Wed, 23 Jun 2010 17:43:54 +0000 (17:43 +0000)
committeraszostak <aszostak@f7af4fe6-9843-0410-8265-dc069ae4e863>
Wed, 23 Jun 2010 17:43:54 +0000 (17:43 +0000)
HLT/BASE/AliHLTDataTypes.h
HLT/BASE/AliHLTReadoutList.cxx
HLT/BASE/AliHLTReadoutList.h
HLT/BASE/HLTbaseLinkDef.h
HLT/BASE/test/testAliHLTReadoutList.C

index 89efbfae80c52ee350ed35b7d31c921afccc62eb..4769a2353fad6c6eb28cfb26ef4ac03298bb7544 100644 (file)
@@ -707,26 +707,48 @@ extern "C" {
   /** field size of fCommonHeader */
   const int gkAliHLTCommonHeaderCount = 8;
 
+  /** size of the DDL list first version */
+  const int gkAliHLTDDLListSizeV0 = 30;
+
+  /** size of the DDL list after DCAL added to EMCAL */
+  const int gkAliHLTDDLListSizeV1 = 31;
+
   /** size of the DDL list */
-  const int gkAliHLTDDLListSize = 30;
+  const int gkAliHLTDDLListSize = gkAliHLTDDLListSizeV1;
 
   /** Number of Trigger Classes of CTP in CDH */
   const int gkNCTPTriggerClasses = 50;
 
   /**
-   * @struct AliHLTEventDDL
-   * DDL list event.
+   * @struct AliHLTEventDDLV0
+   * First version of the DDL list event.
    * The struct is send with the DDLLIST event.
    * Used in the trigger structure for internal apperance of 
    * the DLLs as well as for the HLT readout list send to DAQ 
    * ( as DataType : kAliHLTDataTypeDDL )
    */
-  struct AliHLTEventDDL
+  struct AliHLTEventDDLV0
   {
     AliHLTUInt32_t fCount;                       /// Indicates the number of words in fList.
-    AliHLTUInt32_t fList[gkAliHLTDDLListSize];   /// The list of DDL enable/disable bits.
+    AliHLTUInt32_t fList[gkAliHLTDDLListSizeV0];   /// The list of DDL enable/disable bits.
   };
 
+  /**
+   * @struct AliHLTEventDDLV1
+   * DDL list event structure with extra word for DCAL bits.
+   */
+  struct AliHLTEventDDLV1
+  {
+    AliHLTUInt32_t fCount;                       /// Indicates the number of words in fList.
+    AliHLTUInt32_t fList[gkAliHLTDDLListSizeV1];   /// The list of DDL enable/disable bits.
+  };
+  
+  /**
+   * @typedef AliHLTEventDDL
+   * Current used default version of the AliHLTEventDDL structure.
+   */
+  typedef AliHLTEventDDLV1 AliHLTEventDDL;
+
   /**
    * @struct AliHLTEventTriggerData
    */
@@ -736,7 +758,12 @@ extern "C" {
     AliHLTUInt64_t fHLTStatus; /// Bit field 
     AliHLTUInt32_t fCommonHeaderWordCnt;  /// Number of words in fCommonHeader.
     AliHLTUInt32_t fCommonHeader[gkAliHLTCommonHeaderCount];  /// The common header words.
-    AliHLTEventDDL fReadoutList;   /// The readout list structure.
+    union
+    {
+      AliHLTEventDDL fReadoutList;   /// The default readout list structure.
+      AliHLTEventDDLV0 fReadoutListV0;   /// Access to the old version of the readout list structure.
+      AliHLTEventDDLV1 fReadoutListV1;   /// Access to the readout list structure with DCAL included.
+    };
   };
 
   /**
index fa686b29be746c68c2ee4e5f8815532c5dfc94fd..14b65cddd40a6ec40582b6063d3b4e262ce9a8ba 100644 (file)
@@ -205,22 +205,32 @@ bool AliHLTReadoutList::DecodeDDLID(Int_t ddlId, Int_t& wordIndex, Int_t& bitInd
   case 15: // ZDC
   case 16: // ACORDE
   case 17: // TRG
-  case 18: // EMCAL
-  case 19: // DAQTEST
     if (ddlNum >= 32) return false; // only have 1 32-bit word.
-    // all other detectors fit into one word, the offset is due to
+    // all these detectors fit into one word, the offset is due to
     // TPC and TOF
     wordIndex = detNum + 9;
     break;
+  case 18: // EMCAL
+    if (ddlNum >= 2*32) return false; // only have 2 32-bit words.
+    // 2 words for EMCAL + DCAL
+    wordIndex = detNum + 7;
+    wordIndex = 27 + (ddlNum >> 5);
+    break;
+  case 19: // DAQTEST
+    if (ddlNum >= 32) return false; // only have 1 32-bit word.
+    wordIndex = 29;
+    break;
   case 30: // HLT
     if (ddlNum >= 32) return false; // only have 1 32-bit word.
     // the HLT bitfield is in the last word
-    wordIndex = 29;
+    wordIndex = 30;
     break;
   default:
     return false;
   }
   
+  if (ddlNum >= AliHLTDAQ::NumberOfDdls(detNum == 30 ? 20 : detNum)) return false;
+  
   // The bit index within the word indicated by wordIndex.
   bitIndex = ddlNum % 32;
   return true;
@@ -293,9 +303,13 @@ void AliHLTReadoutList::Enable(Int_t detector)
   if ((detector & kZDC) != 0) fReadoutList.fList[24] = 0x00000001;
   if ((detector & kACORDE) != 0) fReadoutList.fList[25] = 0x00000001;
   if ((detector & kTRG) != 0) fReadoutList.fList[26] = 0x00000001;
-  if ((detector & kEMCAL) != 0) fReadoutList.fList[27] = 0x00FFFFFF;
-  if ((detector & kDAQTEST) != 0) fReadoutList.fList[28] = 0x00000001;
-  if ((detector & kHLT) != 0) fReadoutList.fList[29] = 0x000003FF;
+  if ((detector & kEMCAL) != 0)
+  {
+    fReadoutList.fList[27] = 0xFFFFFFFF;
+    fReadoutList.fList[28] = 0x00003FFF;
+  }
+  if ((detector & kDAQTEST) != 0) fReadoutList.fList[29] = 0x00000001;
+  if ((detector & kHLT) != 0) fReadoutList.fList[30] = 0x000003FF;
 }
 
 
@@ -337,9 +351,13 @@ void AliHLTReadoutList::Disable(Int_t detector)
   if ((detector & kZDC) != 0) fReadoutList.fList[24] = 0x00000000;
   if ((detector & kACORDE) != 0) fReadoutList.fList[25] = 0x00000000;
   if ((detector & kTRG) != 0) fReadoutList.fList[26] = 0x00000000;
-  if ((detector & kEMCAL) != 0) fReadoutList.fList[27] = 0x00000000;
-  if ((detector & kDAQTEST) != 0) fReadoutList.fList[28] = 0x00000000;
-  if ((detector & kHLT) != 0) fReadoutList.fList[29] = 0x00000000;
+  if ((detector & kEMCAL) != 0)
+  {
+    fReadoutList.fList[27] = 0x00000000;
+    fReadoutList.fList[28] = 0x00000000;
+  }
+  if ((detector & kDAQTEST) != 0) fReadoutList.fList[29] = 0x00000000;
+  if ((detector & kHLT) != 0) fReadoutList.fList[30] = 0x00000000;
 }
 
 
@@ -381,9 +399,13 @@ bool AliHLTReadoutList::DetectorEnabled(Int_t detector) const
   if ((detector & kZDC) != 0) result &= fReadoutList.fList[24] == 0x00000001;
   if ((detector & kACORDE) != 0) result &= fReadoutList.fList[25] == 0x00000001;
   if ((detector & kTRG) != 0) result &= fReadoutList.fList[26] == 0x00000001;
-  if ((detector & kEMCAL) != 0) result &= fReadoutList.fList[27] == 0x00FFFFFF;
-  if ((detector & kDAQTEST) != 0) result &= fReadoutList.fList[28] == 0x00000001;
-  if ((detector & kHLT) != 0) result &= fReadoutList.fList[29] == 0x000003FF;
+  if ((detector & kEMCAL) != 0)
+  {
+    result &= fReadoutList.fList[27] == 0xFFFFFFFF;
+    result &= fReadoutList.fList[28] == 0x00003FFF;
+  }
+  if ((detector & kDAQTEST) != 0) result &= fReadoutList.fList[29] == 0x00000001;
+  if ((detector & kHLT) != 0) result &= fReadoutList.fList[30] == 0x000003FF;
   
   return result;
 }
@@ -544,9 +566,10 @@ AliHLTReadoutList AliHLTReadoutList::operator ~ () const
   readoutlist.fReadoutList.fList[24] = 0x00000001 & (~fReadoutList.fList[24]);
   readoutlist.fReadoutList.fList[25] = 0x00000001 & (~fReadoutList.fList[25]);
   readoutlist.fReadoutList.fList[26] = 0x00000001 & (~fReadoutList.fList[26]);
-  readoutlist.fReadoutList.fList[27] = 0x00FFFFFF & (~fReadoutList.fList[27]);
-  readoutlist.fReadoutList.fList[28] = 0x00000001 & (~fReadoutList.fList[28]);
-  readoutlist.fReadoutList.fList[29] = 0x000003FF & (~fReadoutList.fList[29]);
+  readoutlist.fReadoutList.fList[27] = 0xFFFFFFFF & (~fReadoutList.fList[27]);
+  readoutlist.fReadoutList.fList[28] = 0x00003FFF & (~fReadoutList.fList[28]);
+  readoutlist.fReadoutList.fList[29] = 0x00000001 & (~fReadoutList.fList[29]);
+  readoutlist.fReadoutList.fList[30] = 0x000003FF & (~fReadoutList.fList[30]);
   return readoutlist;
 }
 
index 6d227a6211e2ee4ec8ac1f815b1a004121ade2db..f835d6d0c525c15f789c311dbf4f13f6e4efeda2 100644 (file)
@@ -353,7 +353,7 @@ class AliHLTReadoutList : public TNamed
   
   AliHLTEventDDL fReadoutList; /// The DDL readout list structure.
   
-  ClassDef(AliHLTReadoutList, 2) // Readout list object used for manipulating and storing an AliHLTEventDDL structure.
+  ClassDef(AliHLTReadoutList, 3) // Readout list object used for manipulating and storing an AliHLTEventDDL structure.
 
 };
 
index 0314a51ccd9ce944b5d59b787f1cadb8645bd72e..6a34ba1782fd150323f34f533f1ff79d9343add8 100644 (file)
@@ -62,7 +62,7 @@
 #pragma link C++ struct AliHLTComponentEventData+;
 #pragma link C++ struct AliHLTComponentBlockData+;
 #pragma link C++ struct AliHLTComponentDataType+;
-#pragma link C++ struct AliHLTEventDDL+;
+#pragma link C++ struct AliHLTEventDDLV1+; // Only added to have proper dictionary generation and ROOT I/O for AliHLTReadoutList class.
 #pragma link C++ struct AliHLTRunDesc+;
 #pragma link C++ struct AliHLTComponentStatistics+;
 #pragma link C++ struct AliHLTComponentTableEntry;
index e7aec0bd6bc014da98db6acc16d4a1f6a76db5c0..bc21bfbda0957367934c135c265d95389a792374 100644 (file)
@@ -301,6 +301,59 @@ bool CheckEnablingDisablingDDLs()
        return true;
 }
 
+/**
+ * Tests if using incorrect DDL IDs returns zero or is ignored as expected.
+ */
+bool CheckIncorrectIDs()
+{
+       for (int i = 0; i < 1000000; ++i)
+       {
+               // Get random DDL ID outside the valid range.
+               int ddlid = -1;
+               int det = gRandom->Integer(AliHLTDAQ::NumberOfDetectors()+1);
+               if (det != AliHLTDAQ::NumberOfDetectors())
+               {
+                       int maxddls = AliHLTDAQ::NumberOfDdls(det);
+                       int ddlindex = gRandom->Integer(0xFF - maxddls) + maxddls;
+                       ddlid = AliHLTDAQ::DdlIDOffset(det) | (ddlindex & 0xFF);
+               }
+               else
+               {
+                       det = gRandom->Integer(11) + 20;
+                       if (det == 30) det = 31;
+                       int ddlindex = gRandom->Integer(0xFF);
+                       ddlid = (det << 8) | (ddlindex & 0xFF);
+               }
+               
+               AliHLTReadoutList rl;
+               if (rl.GetDDLBit(ddlid) != kFALSE)
+               {
+                       cerr << "ERROR: Received a non zero result for invalid DDL " << ddlid << "." << endl;
+                       return false;
+               }
+               AliHLTEventDDL before = rl;
+               rl.EnableDDLBit(ddlid);
+               AliHLTEventDDL after = rl;
+               if (memcmp(&before, &after, sizeof(AliHLTEventDDL)) != 0)
+               {
+                       cerr << "ERROR: Modified AliHLTReadoutList structure using an invalid DDL "
+                               << ddlid << "." << endl;
+                       cerr << "========== Dump of bits before modification ==========" << endl;
+                       for (unsigned int j = 0; j < before.fCount; ++j)
+                       {
+                               cerr << "[word " << dec << j << "] = " << hex << before.fList[j] << dec << endl;
+                       }
+                       cerr << "========== Dump of bits after modification ==========" << endl;
+                       for (unsigned int j = 0; j < after.fCount; ++j)
+                       {
+                               cerr << "[word " << dec << j << "] = " << hex << after.fList[j] << dec << endl;
+                       }
+                       return false;
+               }
+       }
+       return true;
+}
+
 /**
  * Runs the unit test for the AliHLTReadoutList class.
  * \returns true if the class passed the test and false otherwise.
@@ -322,6 +375,7 @@ bool testAliHLTReadoutList()
        if (not CheckEmptyAndClear()) return false;
        if (not CheckEnablingDisabling()) return false;
        if (not CheckEnablingDisablingDDLs()) return false;
+       if (not CheckIncorrectIDs()) return false;
        
        return true;
 }