reading the CTP configuration in the initialization of the HLT reconstruction and
authorrichterm <richterm@f7af4fe6-9843-0410-8265-dc069ae4e863>
Sat, 7 Nov 2009 03:03:05 +0000 (03:03 +0000)
committerrichterm <richterm@f7af4fe6-9843-0410-8265-dc069ae4e863>
Sat, 7 Nov 2009 03:03:05 +0000 (03:03 +0000)
passing the trigger mask via the AliHLTTrigData structure to the components

HLT/BASE/AliHLTComponent.cxx
HLT/BASE/AliHLTSystem.cxx
HLT/BASE/AliHLTSystem.h
HLT/BASE/AliHLTTask.cxx
HLT/BASE/AliHLTTask.h
HLT/rec/AliHLTReconstructor.cxx
HLT/rec/AliHLTReconstructor.h

index 6264498..2ac2064 100644 (file)
@@ -2424,6 +2424,17 @@ int AliHLTComponent::ScanECSParam(const char* ecsParam)
   // format of the parameter string from ECS
   // <command>;<parameterkey>=<parametervalue>;<parameterkey>=<parametervalue>;...
   // search for a subset of the parameterkeys
+  //   RUN_TYPE=
+  //   RUN_NUMBER=
+  //   HLT_IN_DDL_LIST=
+  //   CTP_TRIGGER_CLASS=
+  //   DATA_FORMAT_VERSION=
+  //   BEAM_TYPE=
+  //   HLT_OUT_DDL_LIST=
+  //   HLT_TRIGGER_CODE=
+  //   DETECTOR_LIST=
+  //   HLT_MODE=
+  // The command apears not to be sent by the online framework
   int iResult=0;
   TString string=ecsParam;
   TObjArray* parameter=string.Tokenize(";");
index eb63d84..c738548 100644 (file)
@@ -41,6 +41,7 @@ using namespace std;
 #include "AliHLTOUTTask.h"
 #include "AliHLTControlTask.h"
 #include "AliHLTDataBuffer.h"
+#include "AliHLTMisc.h"
 #include <TObjArray.h>
 #include <TObjString.h>
 #include <TStopwatch.h>
@@ -83,6 +84,7 @@ AliHLTSystem::AliHLTSystem(AliHLTComponentLogSeverity loglevel, const char* name
   fpHLTOUTTask(NULL),
   fpControlTask(NULL),
   fName(name)
+  , fECSParams()
 {
   // see header file for class documentation
   // or
@@ -381,7 +383,7 @@ void AliHLTSystem::PrintTaskList()
   }
 }
 
-int AliHLTSystem::Run(Int_t iNofEvents, int bStop)
+int AliHLTSystem::Run(Int_t iNofEvents, int bStop, AliHLTUInt64_t trgMask)
 {
   // see header file for class documentation
   int iResult=0;
@@ -405,7 +407,7 @@ int AliHLTSystem::Run(Int_t iNofEvents, int bStop)
          // reset and prepare for new data
          fpHLTOUTTask->Reset();
        }
-       if ((iResult=ProcessTasks(i))>=0) {
+       if ((iResult=ProcessTasks(i, trgMask))>=0) {
          fGoodEvents++;
          iCount++;
        } else {
@@ -617,7 +619,7 @@ int AliHLTSystem::StartTasks()
   return iResult;
 }
 
-int AliHLTSystem::ProcessTasks(Int_t eventNo)
+int AliHLTSystem::ProcessTasks(Int_t eventNo, AliHLTUInt64_t trgMask)
 {
   // see header file for class documentation
   int iResult=0;
@@ -627,7 +629,7 @@ int AliHLTSystem::ProcessTasks(Int_t eventNo)
     TObject* obj=lnk->GetObject();
     if (obj) {
       AliHLTTask* pTask=(AliHLTTask*)obj;
-      iResult=pTask->ProcessTask(eventNo);
+      iResult=pTask->ProcessTask(eventNo, gkAliEventTypeData, trgMask);
 //       ProcInfo_t ProcInfo;
 //       gSystem->GetProcInfo(&ProcInfo);
 //       HLTInfo("task %s processed (%d), current memory usage %d %d", pTask->GetName(), iResult, ProcInfo.fMemResident, ProcInfo.fMemVirtual);
@@ -698,12 +700,12 @@ int AliHLTSystem::SendControlEvent(AliHLTComponentDataType dt)
   bd.fSpecification=kAliHLTVoidDataSpec;
   controlBlocks.push_back(bd);
 
-  // ECS parameter dummy of type kAliHLTDataTypeECSParam
-  // to be filled at some point from the trigger framework
+  // ECS parameter of type kAliHLTDataTypeECSParam
+  if (fECSParams.IsNull())
+    fECSParams="CTP_TRIGGER_CLASS=00:DUMMY-TRIGGER-ALL:00-01-02-03-04-05-06-07-08-09-10-11-12-13-14-15-16-17";
   AliHLTComponent::FillBlockData(bd);
-  TString ecsParam="CTP_TRIGGER_CLASS=00:DUMMY-TRIGGER-ALL:00-01-02-03-04-05-06-07-08-09-10-11-12-13-14-15-16-17";
-  bd.fPtr=(void*)ecsParam.Data();
-  bd.fSize=ecsParam.Length()+1;
+  bd.fPtr=(void*)fECSParams.Data();
+  bd.fSize=fECSParams.Length()+1;
   bd.fDataType=kAliHLTDataTypeECSParam;
   bd.fSpecification=kAliHLTVoidDataSpec;
   controlBlocks.push_back(bd);  
@@ -841,9 +843,10 @@ int AliHLTSystem::Reconstruct(int nofEvents, AliRunLoader* runLoader,
        }
       } else {
       if ((iResult=AliHLTOfflineInterface::SetParamsToComponents(runLoader, rawReader))>=0) {
+       AliHLTUInt64_t trgMask=AliHLTMisc::Instance().GetTriggerMask(rawReader);
        // the system always remains started after event processing, a specific
        // call with nofEvents==0 is needed to execute the stop sequence
-       if ((iResult=Run(nofEvents, 0))<0) SetStatusFlags(kError);
+       if ((iResult=Run(nofEvents, 0, trgMask))<0) SetStatusFlags(kError);
       }
       }
     } else {
@@ -1213,6 +1216,8 @@ int AliHLTSystem::ScanOptions(const char* options)
              HLTWarning("wrong argument for option \'libmode=\', use \'static\' or \'dynamic\'");
            }
          }
+       } else if (token.BeginsWith("ECS=")) {
+         fECSParams=token.ReplaceAll("ECS=", "");
        } else if (token.BeginsWith("lib") && token.EndsWith(".so")) {
          libs+=token;
          libs+=" ";
index 72d76bd..0033a5b 100644 (file)
@@ -208,7 +208,7 @@ class AliHLTSystem : public AliHLTLogging {
    * @param bStop      stop the chain after processing
    * @return number of reconstructed events, neg error code if failed
    */
-  int Run(Int_t iNofEvents=1, int bStop=1);
+  int Run(Int_t iNofEvents=1, int bStop=1, AliHLTUInt64_t trgMask=0);
 
   /**
    * Init all tasks from the list.
@@ -264,7 +264,7 @@ class AliHLTSystem : public AliHLTLogging {
    * The @ref AliHLTTask::ProcessTask method is called for each task.
    * @return neg error code if failed
    */
-  int ProcessTasks(Int_t eventNo);
+  int ProcessTasks(Int_t eventNo, AliHLTUInt64_t trgMask=0);
 
   /**
    * Stop task list.
@@ -567,7 +567,10 @@ class AliHLTSystem : public AliHLTLogging {
   /** name of this system instance */
   TString fName;                                                   //!transient
 
-  ClassDef(AliHLTSystem, 12);
+  /// ECS parameter string
+  TString fECSParams;                                              //!transient
+
+  ClassDef(AliHLTSystem, 13);
 };
 
 #endif
index 024b6db..e3d5ab6 100644 (file)
@@ -445,7 +445,7 @@ int AliHLTTask::EndRun()
   return iResult;
 }
 
-int AliHLTTask::ProcessTask(Int_t eventNo, AliHLTUInt32_t eventType)
+int AliHLTTask::ProcessTask(Int_t eventNo, AliHLTUInt32_t eventType, AliHLTUInt64_t trgMask)
 {
   // see header file for function documentation
   int iResult=0;
@@ -574,11 +574,9 @@ int AliHLTTask::ProcessTask(Int_t eventNo, AliHLTUInt32_t eventType)
       trigData.fDataSize=sizeof(AliHLTEventTriggerData);
       memset(&evtTrigData, 0, trigData.fDataSize);
       evtTrigData.fCommonHeaderWordCnt=gkAliHLTCommonHeaderCount;
-      // TODO 2009-09-30
-      // Whenever the trigger framework is implemented and provides more than
-      // just a dummy CT_TRIGGER_CLASS, this needs to be changed. Now for
-      // all events the first bit in the trigger mask is set
-      evtTrigData.fCommonHeader[5]=0x1;
+      evtTrigData.fCommonHeader[5]=trgMask&0xffffffff;
+      trgMask>>=32;
+      evtTrigData.fCommonHeader[6]=trgMask&0xfffffff;
       trigData.fData=&evtTrigData;
       iLastOutputDataSize=iOutputDataSize;
       AliHLTUInt32_t size=iOutputDataSize;
index 5eb6749..f4474dc 100644 (file)
@@ -206,7 +206,7 @@ class AliHLTTask : public TObject, public AliHLTLogging {
    * processing, the data blocks are released. <br>
    * The @ref StartRun method must be called before.
    */
-  int ProcessTask(Int_t eventNo, AliHLTUInt32_t eventType=gkAliEventTypeData);
+  int ProcessTask(Int_t eventNo, AliHLTUInt32_t eventType=gkAliEventTypeData, AliHLTUInt64_t trgMask=0);
 
   /**
    * Determine the number of matching data block between the component and the
index 8cce9c9..0b61f5a 100644 (file)
 #include "AliCDBManager.h"
 #include "AliCDBEntry.h"
 #include "AliHLTMessage.h"
+#include "AliCentralTrigger.h"
+#include "AliTriggerConfiguration.h"
+#include "AliTriggerClass.h"
+#include "AliTriggerCluster.h"
+#include "AliDAQ.h"
 
 class AliCDBEntry;
 
@@ -161,6 +166,19 @@ void AliHLTReconstructor::Init()
     delete pTokens;
   }
 
+  TString ecsParam;
+  TString ctpParam;
+  if (BuildCTPTriggerClassString(ctpParam)>=0) {
+    if (!ecsParam.IsNull()) ecsParam+=";";
+    ecsParam+="CTP_TRIGGER_CLASS=";
+    ecsParam+=ctpParam;
+  }
+
+  if (!ecsParam.IsNull()) {
+    option+=" ECS=";
+    option+=ecsParam;
+  }
+
   if (!libs.IsNull() &&
       (!pSystem->CheckStatus(AliHLTSystem::kLibrariesLoaded)) &&
       (pSystem->LoadComponentLibraries(libs.Data())<0)) {
@@ -545,3 +563,55 @@ void AliHLTReconstructor::PrintHLTOUTContent(AliHLTOUT* pHLTOUT) const
     AliInfo(Form("   %s  0x%x: size %d", AliHLTComponent::DataType2Text(dt).c_str(), spec, size));
   }
 }
+
+int AliHLTReconstructor::BuildCTPTriggerClassString(TString& triggerclasses) const
+{
+  // build the CTP trigger class string from the OCDB entry of the CTP trigger
+  int iResult=0;
+  
+  triggerclasses.Clear();
+  AliCentralTrigger* pCTP = new AliCentralTrigger();
+  AliTriggerConfiguration *config=NULL;
+  TString configstr("");
+  if (pCTP->LoadConfiguration(configstr) && 
+      (config = pCTP->GetConfiguration())!=NULL) {
+    const TObjArray& classesArray = config->GetClasses();
+    int nclasses = classesArray.GetEntriesFast();
+    for( int iclass=0; iclass < nclasses; iclass++ ) {
+      AliTriggerClass* trclass = NULL;
+      if (classesArray.At(iclass) && (trclass=dynamic_cast<AliTriggerClass*>(classesArray.At(iclass)))!=NULL) {
+       TString entry;
+       int trindex = TMath::Nint(TMath::Log2(trclass->GetMask()));
+       entry.Form("%02d:%s:", trindex, trclass->GetName());
+       AliTriggerCluster* cluster=NULL;
+       TObject* clusterobj=config->GetClusters().FindObject(trclass->GetCluster());
+       if (clusterobj && (cluster=dynamic_cast<AliTriggerCluster*>(clusterobj))!=NULL) {
+         TString detectors=cluster->GetDetectorsInCluster();
+         TObjArray* pTokens=detectors.Tokenize(" ");
+         if (pTokens) {
+           for (int dix=0; dix<pTokens->GetEntriesFast(); dix++) {
+             int id=AliDAQ::DetectorID(((TObjString*)pTokens->At(dix))->GetString());
+             if (id>=0) {
+               TString detstr; detstr.Form("%s%02d", dix>0?"-":"", id);
+               entry+=detstr;
+             } else {
+               AliError(Form("invalid detector name extracted from trigger cluster: %s (%s)", ((TObjString*)pTokens->At(dix))->GetString().Data(), detectors.Data()));
+               iResult=-EPROTO;
+               break;
+             }
+           }
+           delete pTokens;
+         }
+       } else {
+         AliError(Form("can not find trigger cluster %s in config", trclass->GetCluster()));
+         iResult=-EPROTO;
+         break;
+       }
+       if (!triggerclasses.IsNull()) triggerclasses+=",";
+       triggerclasses+=entry;
+      }
+    }
+  }
+
+  return iResult;
+}
index 3a1d9e6..207a96b 100644 (file)
@@ -217,6 +217,11 @@ public:
    */
   int InitStreamerInfos(TObjArray* pSchemas) const;
 
+  /**
+   * Build the CTP_TRIGGER_CLASSES string from CTP trigger configuration
+   */
+  int BuildCTPTriggerClassString(TString& triggerclasses) const;
+
   /**
    * This Reconstructor function is not applicable for the AliHLTReconstructor
    * as it gets a detector specific digits tree. But HLT processes all detectors.