Fixing problem in handling old format of AliHLTEventTriggerData.
authoraszostak <aszostak@f7af4fe6-9843-0410-8265-dc069ae4e863>
Tue, 29 Jun 2010 16:57:35 +0000 (16:57 +0000)
committeraszostak <aszostak@f7af4fe6-9843-0410-8265-dc069ae4e863>
Tue, 29 Jun 2010 16:57:35 +0000 (16:57 +0000)
HLT/BASE/AliHLTComponent.cxx
HLT/BASE/test/testAliHLTEventDDLBackwardCompatibility.C

index 6f859b1..1cb1e4d 100644 (file)
@@ -2412,11 +2412,16 @@ int AliHLTComponent::ExtractTriggerData(
     return -ENOENT;
   }
   
+  // Get the size of the AliHLTEventTriggerData structure without the readout list part.
+  // The way we do this here should also handle memory alignment correctly.
+  AliHLTEventTriggerData* dummy = NULL;
+  size_t sizeWithoutReadout = (char*)(&dummy->fReadoutList) - (char*)(dummy);
+  
   // Check that the trigger data pointer points to data of a size we can handle.
-  // Either it is the size of AliHLTEventTriggerData or 32 bits less for the old
-  // version of AliHLTEventDDL, i.e. AliHLTEventDDLV0.
+  // Either it is the size of AliHLTEventTriggerData or the size of the old
+  // version of AliHLTEventTriggerData using AliHLTEventDDLV0.
   if (trigData.fDataSize != sizeof(AliHLTEventTriggerData) and
-      trigData.fDataSize != sizeof(AliHLTEventTriggerData) - sizeof(AliHLTUInt32_t)
+      trigData.fDataSize != sizeWithoutReadout + sizeof(AliHLTEventDDLV0)
      )
   {
     if (printErrors)
index 77fbbb1..538b9cf 100644 (file)
@@ -30,6 +30,8 @@
 #include "AliHLTDataTypes.h"
 #include "AliHLTReadoutList.h"
 #include "AliHLTDAQ.h"
+#include "AliHLTComponent.h"
+#include "AliRawDataHeader.h"
 #include "TRandom3.h"
 #include "TString.h"
 #include "TFile.h"
@@ -196,6 +198,110 @@ bool CheckReadoutListConvertedCorrectly()
 }
 
 /**
+ * Tests to see if AliHLTComponent::ExtractTriggerData recognises the old format
+ * of AliHLTEventTriggerData and handles it correctly.
+ */
+bool CheckHandlingOfOldAliHLTEventTriggerData()
+{
+       // Prepare old structure format.
+       struct AliHLTEventTriggerDataV0
+       {
+               AliHLTUInt8_t  fAttributes[gkAliHLTBlockDAttributeCount];
+               AliHLTUInt64_t fHLTStatus;
+               AliHLTUInt32_t fCommonHeaderWordCnt;
+               AliHLTUInt32_t fCommonHeader[gkAliHLTCommonHeaderCount];
+               AliHLTEventDDLV0 fReadoutListV0;
+       };
+       AliHLTEventTriggerDataV0 eventTrigData;
+       memset(&eventTrigData, 0x0, sizeof(eventTrigData));
+       eventTrigData.fCommonHeaderWordCnt = 8;
+       eventTrigData.fHLTStatus = 0x123;
+       eventTrigData.fReadoutListV0.fCount = gkAliHLTDDLListSizeV0;
+       eventTrigData.fReadoutListV0.fList[0] = 0x00000001; // kITSSPD
+       eventTrigData.fReadoutListV0.fList[1] = 0x00000001; // kITSSDD
+       eventTrigData.fReadoutListV0.fList[2] = 0x00000001; // kITSSSD
+       eventTrigData.fReadoutListV0.fList[3] = 0x00000001; // kTPC
+       eventTrigData.fReadoutListV0.fList[4] = 0x00000000; // kTPC
+       eventTrigData.fReadoutListV0.fList[5] = 0x00000000; // kTPC
+       eventTrigData.fReadoutListV0.fList[6] = 0x00000000; // kTPC
+       eventTrigData.fReadoutListV0.fList[7] = 0x00000000; // kTPC
+       eventTrigData.fReadoutListV0.fList[8] = 0x00000000; // kTPC
+       eventTrigData.fReadoutListV0.fList[9] = 0x00000000; // kTPC
+       eventTrigData.fReadoutListV0.fList[10] = 0x00000000; // kTPC
+       eventTrigData.fReadoutListV0.fList[11] = 0x00000001; // kTRD
+       eventTrigData.fReadoutListV0.fList[12] = 0x00000001; // kTOF
+       eventTrigData.fReadoutListV0.fList[13] = 0x00000000; // kTOF
+       eventTrigData.fReadoutListV0.fList[14] = 0x00000000; // kTOF
+       eventTrigData.fReadoutListV0.fList[15] = 0x00000001; // kHMPID
+       eventTrigData.fReadoutListV0.fList[16] = 0x00000001; // kPHOS
+       eventTrigData.fReadoutListV0.fList[17] = 0x00000001; // kCPV
+       eventTrigData.fReadoutListV0.fList[18] = 0x00000001; // kPMD
+       eventTrigData.fReadoutListV0.fList[19] = 0x00000001; // kMUONTRK
+       eventTrigData.fReadoutListV0.fList[20] = 0x00000001; // kMUONTRG
+       eventTrigData.fReadoutListV0.fList[21] = 0x00000001; // kFMD
+       eventTrigData.fReadoutListV0.fList[22] = 0x00000001; // kT0
+       eventTrigData.fReadoutListV0.fList[23] = 0x00000001; // kV0
+       eventTrigData.fReadoutListV0.fList[24] = 0x00000001; // kZDC
+       eventTrigData.fReadoutListV0.fList[25] = 0x00000001; // kACORDE
+       eventTrigData.fReadoutListV0.fList[26] = 0x00000001; // kTRG
+       eventTrigData.fReadoutListV0.fList[27] = 0x00000001; // kEMCAL
+       eventTrigData.fReadoutListV0.fList[28] = 0x00000001; // kDAQTEST
+       eventTrigData.fReadoutListV0.fList[29] = 0x00000001; // kHLT
+       
+       AliHLTComponentTriggerData trigData = {
+               sizeof(AliHLTComponentTriggerData),
+               sizeof(AliHLTEventTriggerDataV0),
+               &eventTrigData
+       };
+       
+       AliHLTReadoutList readoutlistExpected;
+       for (Int_t i = 0; i < AliHLTDAQ::NumberOfDetectors(); ++i)
+       {
+               Int_t ddlid = AliHLTDAQ::DdlIDOffset(i);
+               readoutlistExpected.EnableDDLBit(ddlid);
+       }
+       
+       const AliHLTUInt8_t (*attribs)[gkAliHLTBlockDAttributeCount];
+       AliHLTUInt64_t status = 0x0;
+       const AliRawDataHeader* cdh = NULL;
+       AliHLTReadoutList readoutlist;
+       
+       int result = AliHLTComponent::ExtractTriggerData(trigData, &attribs, &status, &cdh, &readoutlist, true);
+       if (result != 0)
+       {
+               cerr << "ERROR: The method AliHLTComponent::ExtractTriggerData"
+                       " fails for the old structure format." << endl;
+               return false;
+       }
+       if (attribs != &eventTrigData.fAttributes)
+       {
+               cerr << "ERROR: The method AliHLTComponent::ExtractTriggerData"
+                       " fails to locate the attributes structure correctly." << endl;
+               return false;
+       }
+       if (status != 0x123)
+       {
+               cerr << "ERROR: The method AliHLTComponent::ExtractTriggerData"
+                       " fails to locate the HLT status word correctly." << endl;
+               return false;
+       }
+       if ((const void*)cdh != (void*)&eventTrigData.fCommonHeader)
+       {
+               cerr << "ERROR: The method AliHLTComponent::ExtractTriggerData"
+                       " fails to locate the Common Data Header (CDH) structure correctly." << endl;
+               return false;
+       }
+       if (memcmp(readoutlist.Buffer(), readoutlistExpected.Buffer(), readoutlist.BufferSize()) != 0)
+       {
+               cerr << "ERROR: The method AliHLTComponent::ExtractTriggerData"
+                       " fails to extract the readout list correctly." << endl;
+               return false;
+       }
+       
+       return true;
+}
+
+/**
  * Tests to see if reading old AliHLTReadoutList versions from root files works.
  * \param filename  The name of the file generated by GenerateReadoutListFile.C,
  *      which contains the readout list objects to test.
@@ -339,6 +445,7 @@ bool CheckReadingOldFormat(const char* filename = "oldAliHLTReadoutListFormat.ro
 bool testAliHLTEventDDLBackwardCompatibility()
 {
        if (not CheckReadoutListConvertedCorrectly()) return false;
+       if (not CheckHandlingOfOldAliHLTEventTriggerData()) return false;
        if (not CheckReadingOldFormat()) return false;
        return true;
 }