From 7c69da514ec5a649b9c7cb91ff969eaa2fd42c35 Mon Sep 17 00:00:00 2001 From: aszostak Date: Fri, 25 Jun 2010 14:46:42 +0000 Subject: [PATCH] Adding tests for backward compatibility of AliHLTReadoutList class. --- HLT/BASE/AliHLTReadoutList.cxx | 41 ++ HLT/BASE/AliHLTReadoutList.h | 8 + HLT/BASE/test/GenerateReadoutListFile.C | 76 ++++ HLT/BASE/test/Makefile.am | 8 + HLT/BASE/test/oldAliHLTReadoutListFormat.root | Bin 0 -> 9429 bytes .../testAliHLTEventDDLBackwardCompatibility.C | 355 ++++++++++++++++++ HLT/BASE/test/testAliHLTReadoutList.C | 20 +- 7 files changed, 507 insertions(+), 1 deletion(-) create mode 100644 HLT/BASE/test/GenerateReadoutListFile.C create mode 100644 HLT/BASE/test/oldAliHLTReadoutListFormat.root create mode 100644 HLT/BASE/test/testAliHLTEventDDLBackwardCompatibility.C diff --git a/HLT/BASE/AliHLTReadoutList.cxx b/HLT/BASE/AliHLTReadoutList.cxx index 287002a460a..ddd30da26a7 100644 --- a/HLT/BASE/AliHLTReadoutList.cxx +++ b/HLT/BASE/AliHLTReadoutList.cxx @@ -570,6 +570,47 @@ Int_t AliHLTReadoutList::GetWordCount(EDetectorId detector) } +AliHLTReadoutList::EDetectorId AliHLTReadoutList::GetDetectorFromWord(Int_t wordindex) +{ + // See header file for more details. + switch (wordindex) + { + case 0: return kITSSPD; + case 1: return kITSSDD; + case 2: return kITSSSD; + case 3: return kTPC; + case 4: return kTPC; + case 5: return kTPC; + case 6: return kTPC; + case 7: return kTPC; + case 8: return kTPC; + case 9: return kTPC; + case 10: return kTPC; + case 11: return kTRD; + case 12: return kTOF; + case 13: return kTOF; + case 14: return kTOF; + case 15: return kHMPID; + case 16: return kPHOS; + case 17: return kCPV; + case 18: return kPMD; + case 19: return kMUONTRK; + case 20: return kMUONTRG; + case 21: return kFMD; + case 22: return kT0; + case 23: return kV0; + case 24: return kZDC; + case 25: return kACORDE; + case 26: return kTRG; + case 27: return kEMCAL; + case 28: return kEMCAL; + case 29: return kDAQTEST; + case 30: return kHLT; + default: return kNoDetector; + } +} + + AliHLTReadoutList::EDetectorId AliHLTReadoutList::GetFirstUsedDetector(EDetectorId startAfter) const { // See header file for more details. diff --git a/HLT/BASE/AliHLTReadoutList.h b/HLT/BASE/AliHLTReadoutList.h index 932ada33d2b..9415a34cc00 100644 --- a/HLT/BASE/AliHLTReadoutList.h +++ b/HLT/BASE/AliHLTReadoutList.h @@ -221,6 +221,14 @@ class AliHLTReadoutList : public TNamed */ static Int_t GetWordCount(EDetectorId detector); + /** + * Returns the corresponding detector ID code for the given word index into the + * internal data structure. + * \param wordindex The position of the word from the start of the DDL readout bit list. + * \returns the code of the corresponding detector or kNoDetector if invalid. + */ + static EDetectorId GetDetectorFromWord(Int_t wordindex); + /** * Returns the first detector with non-zero DDL bits. * \param startAfter The detector code after which to start looking from. diff --git a/HLT/BASE/test/GenerateReadoutListFile.C b/HLT/BASE/test/GenerateReadoutListFile.C new file mode 100644 index 00000000000..5e57c3552fb --- /dev/null +++ b/HLT/BASE/test/GenerateReadoutListFile.C @@ -0,0 +1,76 @@ +// $Id: $ + +/************************************************************************** + * This file is property of and copyright by the ALICE HLT Project * + * ALICE Experiment at CERN, All rights reserved. * + * * + * Primary Authors: Artur Szostak * + * for The ALICE HLT Project. * + * * + * Permission to use, copy, modify and distribute this software and its * + * documentation strictly for non-commercial purposes is hereby granted * + * without fee, provided that the above copyright notice appears in all * + * copies and that both the copyright notice and this permission notice * + * appear in the supporting documentation. The authors make no claims * + * about the suitability of this software for any purpose. It is * + * provided "as is" without express or implied warranty. * + **************************************************************************/ + +/// @file GenerateReadoutListFile.C +/// @author Artur Szostak +/// @date 25 June 2010 +/// @brief Macro for generating AliHLTReadoutList readout list objects for testing. +/// +/// This macro generates AliHLTReadoutList objects and writes them to a ROOT file +/// directly as an object and also in a TTree to check the behaviour of the streamers. +/// The generated file should be used by testAliHLTEventDDLBackwardCompatibility.C +/// to test the backward compatibility of AliHLTReadoutList objects. +/// +/// The macro can be run as follows: +/// \code +/// aliroot -b -q GenerateReadoutListFile.C\(\"myoutputfile.root\"\) +/// \endcode +/// This will generate the file myoutputfile.root in the current directory. +/// By omitting the file name the default file name "output.root" will be used. + +#if !defined(__CINT__) || defined(__MAKECINT__) +#include "AliHLTReadoutList.h" +#include "TFile.h" +#include "TTree.h" +#include "Riostream.h" +#endif + +void GenerateReadoutListFile(const char* filename = "output.root") +{ + /// Generates the test file with readout list objects. + + TFile* file = new TFile(filename, "RECREATE"); + if (file == NULL) + { + cerr << "ERROR: Could not create file: " << filename << endl; + return; + } + + AliHLTReadoutList* r = new AliHLTReadoutList(); + TTree* tree = new TTree("rltree","Tree containing readout list objects."); + tree->Branch("readoutlist", "AliHLTReadoutList", &r); + + r->Enable(AliHLTReadoutList::kTRG); + r->Write("readoutlist1", TObject::kOverwrite); + tree->Fill(); + r->Enable(AliHLTReadoutList::kEMCAL); + r->Write("readoutlist2", TObject::kOverwrite); + tree->Fill(); + r->Enable(AliHLTReadoutList::kDAQTEST); + r->Write("readoutlist3", TObject::kOverwrite); + tree->Fill(); + r->Enable(AliHLTReadoutList::kHLT); + r->Write("readoutlist4", TObject::kOverwrite); + tree->Fill(); + r->Disable(AliHLTReadoutList::kEMCAL); + r->Write("readoutlist5", TObject::kOverwrite); + tree->Fill(); + + tree->Write("rltree", TObject::kOverwrite); + delete file; +} diff --git a/HLT/BASE/test/Makefile.am b/HLT/BASE/test/Makefile.am index d63e4191207..6b34881e303 100644 --- a/HLT/BASE/test/Makefile.am +++ b/HLT/BASE/test/Makefile.am @@ -10,6 +10,7 @@ check_PROGRAMS = testAliHLTBlockDataCollection \ testAliHLTCTPData \ testAliHLTDataBuffer \ testAliHLTReadoutList \ + testAliHLTEventDDLBackwardCompatibility \ dtOperators \ testDefaultDataTypes @@ -44,4 +45,11 @@ testAliHLTReadoutList_LDADD = $(top_builddir)/BASE/libHLTbase.la \ @ALIROOT_LDFLAGS@ \ @ALIROOT_LIBS@ +testAliHLTEventDDLBackwardCompatibility_SOURCES = testAliHLTEventDDLBackwardCompatibility.C +testAliHLTEventDDLBackwardCompatibility_LDADD = $(top_builddir)/BASE/libHLTbase.la \ + -L@ROOTLIBDIR@ \ + @ROOTLIBS@ \ + @ALIROOT_LDFLAGS@ \ + @ALIROOT_LIBS@ + TESTS = $(check_PROGRAMS) diff --git a/HLT/BASE/test/oldAliHLTReadoutListFormat.root b/HLT/BASE/test/oldAliHLTReadoutListFormat.root new file mode 100644 index 0000000000000000000000000000000000000000..eaf31228fd0375effc020c3cda2482bdc2c9b765 GIT binary patch literal 9429 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 * + * for The ALICE HLT Project. * + * * + * Permission to use, copy, modify and distribute this software and its * + * documentation strictly for non-commercial purposes is hereby granted * + * without fee, provided that the above copyright notice appears in all * + * copies and that both the copyright notice and this permission notice * + * appear in the supporting documentation. The authors make no claims * + * about the suitability of this software for any purpose. It is * + * provided "as is" without express or implied warranty. * + **************************************************************************/ + +/// @file testAliHLTEventDDLBackwardCompatibility.C +/// @author Artur Szostak +/// @date 25 June 2010 +/// @brief Test program for backward compatibility of the AliHLTEventDDL structure. +/// + +#if defined(__CINT__) && (! defined(__MAKECINT__)) +#error This macro must be compiled. Try running as testAliHLTEventDDLBackwardCompatibility.C++. +#endif + +#if !defined(__CINT__) || defined(__MAKECINT__) +#include "AliHLTDataTypes.h" +#include "AliHLTReadoutList.h" +#include "AliHLTDAQ.h" +#include "TRandom3.h" +#include "TString.h" +#include "TFile.h" +#include "TTree.h" +#include "Riostream.h" +#include +#include +#endif + +/** + * Tests to see if the AliHLTReadoutList class handles both AliHLTEventDDLV0 + * and AliHLTEventDDLV1 correctly. + */ +bool CheckReadoutListConvertedCorrectly() +{ + // Initialise the different versions of the structures so that every detector + // has only its first DDL set. + union + { + AliHLTEventDDL eventddlV0; + AliHLTEventDDLV0 bitsV0; + }; + bitsV0.fCount = gkAliHLTDDLListSizeV0; + if (gkAliHLTDDLListSizeV0 != 30) + { + cerr << "ERROR: gkAliHLTDDLListSizeV0 has a value of " << gkAliHLTDDLListSizeV0 + << " but expected a value of 30." << endl; + return false; + } + bitsV0.fList[0] = 0x00000001; // kITSSPD + bitsV0.fList[1] = 0x00000001; // kITSSDD + bitsV0.fList[2] = 0x00000001; // kITSSSD + bitsV0.fList[3] = 0x00000001; // kTPC + bitsV0.fList[4] = 0x00000000; // kTPC + bitsV0.fList[5] = 0x00000000; // kTPC + bitsV0.fList[6] = 0x00000000; // kTPC + bitsV0.fList[7] = 0x00000000; // kTPC + bitsV0.fList[8] = 0x00000000; // kTPC + bitsV0.fList[9] = 0x00000000; // kTPC + bitsV0.fList[10] = 0x00000000; // kTPC + bitsV0.fList[11] = 0x00000001; // kTRD + bitsV0.fList[12] = 0x00000001; // kTOF + bitsV0.fList[13] = 0x00000000; // kTOF + bitsV0.fList[14] = 0x00000000; // kTOF + bitsV0.fList[15] = 0x00000001; // kHMPID + bitsV0.fList[16] = 0x00000001; // kPHOS + bitsV0.fList[17] = 0x00000001; // kCPV + bitsV0.fList[18] = 0x00000001; // kPMD + bitsV0.fList[19] = 0x00000001; // kMUONTRK + bitsV0.fList[20] = 0x00000001; // kMUONTRG + bitsV0.fList[21] = 0x00000001; // kFMD + bitsV0.fList[22] = 0x00000001; // kT0 + bitsV0.fList[23] = 0x00000001; // kV0 + bitsV0.fList[24] = 0x00000001; // kZDC + bitsV0.fList[25] = 0x00000001; // kACORDE + bitsV0.fList[26] = 0x00000001; // kTRG + bitsV0.fList[27] = 0x00000001; // kEMCAL + bitsV0.fList[28] = 0x00000001; // kDAQTEST + bitsV0.fList[29] = 0x00000001; // kHLT + + union + { + AliHLTEventDDL eventddlV1; + AliHLTEventDDLV1 bitsV1; + }; + bitsV1.fCount = gkAliHLTDDLListSizeV1; + if (gkAliHLTDDLListSizeV1 != 31) + { + cerr << "ERROR: gkAliHLTDDLListSizeV1 has a value of " << gkAliHLTDDLListSizeV1 + << " but expected a value of 31." << endl; + return false; + } + bitsV1.fList[0] = 0x00000001; // kITSSPD + bitsV1.fList[1] = 0x00000001; // kITSSDD + bitsV1.fList[2] = 0x00000001; // kITSSSD + bitsV1.fList[3] = 0x00000001; // kTPC + bitsV1.fList[4] = 0x00000000; // kTPC + bitsV1.fList[5] = 0x00000000; // kTPC + bitsV1.fList[6] = 0x00000000; // kTPC + bitsV1.fList[7] = 0x00000000; // kTPC + bitsV1.fList[8] = 0x00000000; // kTPC + bitsV1.fList[9] = 0x00000000; // kTPC + bitsV1.fList[10] = 0x00000000; // kTPC + bitsV1.fList[11] = 0x00000001; // kTRD + bitsV1.fList[12] = 0x00000001; // kTOF + bitsV1.fList[13] = 0x00000000; // kTOF + bitsV1.fList[14] = 0x00000000; // kTOF + bitsV1.fList[15] = 0x00000001; // kHMPID + bitsV1.fList[16] = 0x00000001; // kPHOS + bitsV1.fList[17] = 0x00000001; // kCPV + bitsV1.fList[18] = 0x00000001; // kPMD + bitsV1.fList[19] = 0x00000001; // kMUONTRK + bitsV1.fList[20] = 0x00000001; // kMUONTRG + bitsV1.fList[21] = 0x00000001; // kFMD + bitsV1.fList[22] = 0x00000001; // kT0 + bitsV1.fList[23] = 0x00000001; // kV0 + bitsV1.fList[24] = 0x00000001; // kZDC + bitsV1.fList[25] = 0x00000001; // kACORDE + bitsV1.fList[26] = 0x00000001; // kTRG + bitsV1.fList[27] = 0x00000001; // kEMCAL + bitsV1.fList[28] = 0x00000000; // kEMCAL + bitsV1.fList[29] = 0x00000001; // kDAQTEST + bitsV1.fList[30] = 0x00000001; // kHLT + + AliHLTReadoutList rlV0(eventddlV0); + AliHLTReadoutList rlV1(eventddlV1); + + // Check that for both readout list versions only the first DDLs are + // enabled as expected. + for (Int_t i = 0; i < AliHLTDAQ::NumberOfDetectors(); ++i) + for (Int_t j = 0; j < AliHLTDAQ::NumberOfDdls(i); ++j) + { + Int_t ddlid = AliHLTDAQ::DdlIDOffset(i) | (j & 0xFF); + if (j == 0) + { + if (rlV0.IsDDLDisabled(ddlid)) + { + cerr << "ERROR: The first DDL for detector " << AliHLTDAQ::DetectorName(i) + << " was not enabled for readout list initialised from AliHLTEventDDLV0." + << endl; + return false; + } + if (rlV1.IsDDLDisabled(ddlid)) + { + cerr << "ERROR: The first DDL for detector " << AliHLTDAQ::DetectorName(i) + << " was not enabled for readout list initialised from AliHLTEventDDLV1." + << endl; + return false; + } + } + else + { + if (rlV0.IsDDLEnabled(ddlid)) + { + cerr << "ERROR: DDL " << ddlid << " for detector " << AliHLTDAQ::DetectorName(i) + << " was marked enabled for readout list initialised from AliHLTEventDDLV0." + << endl; + return false; + } + if (rlV1.IsDDLEnabled(ddlid)) + { + cerr << "ERROR: DDL " << ddlid << " for detector " << AliHLTDAQ::DetectorName(i) + << " was marked enabled for readout list initialised from AliHLTEventDDLV1." + << endl; + return false; + } + } + } + + // Check that the internal buffers are identical. + if (rlV0.BufferSize() != rlV1.BufferSize()) + { + cerr << "ERROR: Buffer sizes for readout lists are different: rlV0.BufferSize() = " + << rlV0.BufferSize() << ", rlV1.BufferSize() = " << rlV1.BufferSize() << endl; + return false; + } + if (memcmp(rlV0.Buffer(), rlV1.Buffer(), rlV0.BufferSize()) != 0) + { + cerr << "ERROR: Buffers for the two readout list versions are different." << 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. + */ +bool CheckReadingOldFormat(const char* filename = "oldAliHLTReadoutListFormat.root") +{ + TFile file(filename, "READ"); + + // Load the readout list objects. + AliHLTReadoutList* rl[5] = {NULL, NULL, NULL, NULL, NULL}; + for (int i = 0; i < 5; ++i) + { + char name[1024]; + sprintf(name, "readoutlist%d", i+1); + rl[i] = dynamic_cast(file.Get(name)); + if (rl[i] == NULL) + { + cerr << "ERROR: Could not get object '" << name + << "' from file '" << filename << "'." << endl; + return false; + } + } + + // Now load the tree and see that the objects are the same as the readout + // list objects stored directly to the TFile. + const char* treename = "rltree"; + TTree* tree = dynamic_cast(file.Get(treename)); + if (tree == NULL) + { + cerr << "ERROR: Could not get TTree '" << treename + << "' from file '" << filename << "'." << endl; + return false; + } + AliHLTReadoutList* r = new AliHLTReadoutList; + tree->SetBranchAddress("readoutlist", &r); + for (int i = 0; i < 5; ++i) + { + tree->GetEvent(i); + if (r->BufferSize() != rl[i]->BufferSize()) + { + cerr << "ERROR: readoutlist" << i+1 + << " and the one from the TTree have different sizes." + << endl; + return false; + } + if (memcmp(r->Buffer(), rl[i]->Buffer(), r->BufferSize()) != 0) + { + cerr << "ERROR: readoutlist" << i+1 + << " and the one from the TTree are different." + << endl; + return false; + } + } + + // Now check each readout list individually. + typedef AliHLTReadoutList RL; + Int_t alwaysoff = RL::kITSSPD + | RL::kITSSDD + | RL::kITSSSD + | RL::kTPC + | RL::kTRD + | RL::kTOF + | RL::kHMPID + | RL::kPHOS + | RL::kCPV + | RL::kPMD + | RL::kMUONTRK + | RL::kMUONTRG + | RL::kFMD + | RL::kT0 + | RL::kV0 + | RL::kZDC + | RL::kACORDE; + + // We will need to try and set the missing EMCAL DDL bits. + // Otherwise the DetectorEnabled and DetectorDisabled methods will not + // give the expected answers. + for (int i = 24; i < AliHLTDAQ::NumberOfDdls("EMCAL"); ++i) + { + for (int j = 1; j <= 3; ++j) + { + Int_t ddlid = AliHLTDAQ::DdlIDOffset("EMCAL") | (i & 0xFF); + rl[j]->EnableDDLBit(ddlid); + } + } + + int rlnum = 0; + if (not (rl[rlnum]->DetectorEnabled(RL::kTRG) and + rl[rlnum]->DetectorDisabled(alwaysoff | RL::kEMCAL | RL::kDAQTEST | RL::kHLT) + )) + { + rl[0]->Print(); + cerr << "ERROR: readoutlist" << rlnum+1 << " does not have the correct bits set." << endl; + rl[rlnum]->Print(); + return false; + } + rlnum = 1; + if (not (rl[rlnum]->DetectorEnabled(RL::kTRG | RL::kEMCAL) and + rl[rlnum]->DetectorDisabled(alwaysoff | RL::kDAQTEST | RL::kHLT) + )) + { + cerr << "ERROR: readoutlist" << rlnum+1 << " does not have the correct bits set." << endl; + rl[rlnum]->Print(); + return false; + } + rlnum = 2; + if (not (rl[rlnum]->DetectorEnabled(RL::kTRG | RL::kEMCAL | RL::kDAQTEST) and + rl[rlnum]->DetectorDisabled(alwaysoff | RL::kHLT) + )) + { + cerr << "ERROR: readoutlist" << rlnum+1 << " does not have the correct bits set." << endl; + rl[rlnum]->Print(); + return false; + } + rlnum = 3; + if (not (rl[rlnum]->DetectorEnabled(RL::kTRG | RL::kEMCAL | RL::kDAQTEST | RL::kHLT) and + rl[rlnum]->DetectorDisabled(alwaysoff) + )) + { + cerr << "ERROR: readoutlist" << rlnum+1 << " does not have the correct bits set." << endl; + rl[rlnum]->Print(); + return false; + } + rlnum = 4; + if (not (rl[rlnum]->DetectorEnabled(RL::kTRG | RL::kDAQTEST | RL::kHLT) and + rl[rlnum]->DetectorDisabled(alwaysoff | RL::kEMCAL) + )) + { + cerr << "ERROR: readoutlist" << rlnum+1 << " does not have the correct bits set." << endl; + rl[rlnum]->Print(); + return false; + } + + return true; +} + +/** + * Runs the unit tests for backward compatibility of AliHLTEventDDL succeeded. + * \returns true if the tests were passed and false otherwise. + */ +bool testAliHLTEventDDLBackwardCompatibility() +{ + if (not CheckReadoutListConvertedCorrectly()) return false; + if (not CheckReadingOldFormat()) return false; + return true; +} + +#ifndef __MAKECINT__ + +int main(int /*argc*/, const char** /*argv*/) +{ + bool resultOk = testAliHLTEventDDLBackwardCompatibility(); + if (not resultOk) return 1; + return 0; +} + +#endif // __MAKECINT__ diff --git a/HLT/BASE/test/testAliHLTReadoutList.C b/HLT/BASE/test/testAliHLTReadoutList.C index 653aada7217..a9151f27656 100644 --- a/HLT/BASE/test/testAliHLTReadoutList.C +++ b/HLT/BASE/test/testAliHLTReadoutList.C @@ -399,7 +399,8 @@ bool CheckIncorrectIDs() } /** - * Tests if using incorrect DDL IDs returns zero or is ignored as expected. + * Tests the mapping of the AliHLTReadoutList::GetFirstWord, AliHLTReadoutList::GetWordCount + * and AliHLTReadoutList::GetDetectorFromWord methods. */ bool CheckWordIndexAndCount() { @@ -474,6 +475,23 @@ bool CheckWordIndexAndCount() } } + // Check the mapping of GetDetectorFromWord + for (int j = 0; j < gkAliHLTDDLListSize; ++j) + { + AliHLTReadoutList::EDetectorId det = AliHLTReadoutList::GetDetectorFromWord(j); + Int_t firstword = AliHLTReadoutList::GetFirstWord(det); + Int_t lastword = firstword + AliHLTReadoutList::GetWordCount(det); + if (not (firstword <= j and j < lastword)) + { + cerr << "ERROR: The function AliHLTReadoutList::GetDetectorFromWord returns " + << AliHLTReadoutList::DetectorIdToString(det) + << " for word " << j + << " but the GetFirstWord and GetWordCount methods indicate a different range." + << " The mapping is probably incorrect." << endl; + return false; + } + } + return true; } -- 2.43.0