From 3daf4fbc42ae18dc57caa238d3cf4864b0ce40cb Mon Sep 17 00:00:00 2001 From: richterm Date: Sat, 24 Nov 2007 17:11:14 +0000 Subject: [PATCH] added libAliHLTTrigger (Jochen) --- HLT/Makefile.am | 8 +- HLT/configure.ac | 1 + HLT/libAliHLTTrigger.pkg | 51 ++++ ...AliHLTTriggerSelectiveReadoutComponent.cxx | 272 ++++++++++++++++++ .../AliHLTTriggerSelectiveReadoutComponent.h | 103 +++++++ HLT/trigger/Makefile.am | 102 +++++++ 6 files changed, 536 insertions(+), 1 deletion(-) create mode 100644 HLT/libAliHLTTrigger.pkg create mode 100644 HLT/trigger/AliHLTTriggerSelectiveReadoutComponent.cxx create mode 100644 HLT/trigger/AliHLTTriggerSelectiveReadoutComponent.h create mode 100644 HLT/trigger/Makefile.am diff --git a/HLT/Makefile.am b/HLT/Makefile.am index 0da7dfc4482..32d34d5a4a4 100644 --- a/HLT/Makefile.am +++ b/HLT/Makefile.am @@ -7,7 +7,7 @@ SAMPLE_DIR=SampleLib endif if EN_HLT_TPC -TPC_DIR=TPCLib +TPC_DIR=TPCLib endif if EN_HLT_PHOS @@ -26,6 +26,10 @@ if EN_HLT_COMP COMP_DIR=comp endif +#if EN_HLT_TRIGGER +TRIGGER_DIR=trigger +#endif + SUBDIRS = BASE \ sim \ rec \ @@ -35,6 +39,7 @@ SUBDIRS = BASE \ $(TRD_DIR) \ $(MUON_DIR) \ $(COMP_DIR) \ + $(TRIGGER_DIR) \ doc EXTRA_DIST = libHLTbase.pkg \ @@ -49,6 +54,7 @@ EXTRA_DIST = libHLTbase.pkg \ libAliHLTTRD.pkg \ libAliHLTMUON.pkg \ libAliHLTComp.pkg \ + libAliHLTTrigger.pkg \ hlt.conf DIST_SUBDIRS = $(SUBDIRS) diff --git a/HLT/configure.ac b/HLT/configure.ac index 6688f68266c..d958a823f81 100644 --- a/HLT/configure.ac +++ b/HLT/configure.ac @@ -788,6 +788,7 @@ AC_CONFIG_FILES([Makefile PHOS/Makefile TRD/Makefile MUON/Makefile + trigger/Makefile comp/Makefile doc/Makefile doc/doxygen.conf]) diff --git a/HLT/libAliHLTTrigger.pkg b/HLT/libAliHLTTrigger.pkg new file mode 100644 index 00000000000..b014758f3d9 --- /dev/null +++ b/HLT/libAliHLTTrigger.pkg @@ -0,0 +1,51 @@ +#-*- Mode: Makefile -*- +# $Id$ + +# This files defines the source and header files for the +# libAliHLTTrigger library and additional flags for the compilation +# and linking process. For further information refer to the +# README. + +include $(MODDIR)/hlt.conf + +# class header files, the link definition for the root dictionary +# will be created from the names of the header files +CLASS_HDRS:= \ + AliHLTTriggerSelectiveReadoutComponent.h + +# library sources +MODULE_SRCS:= $(CLASS_HDRS:.h=.cxx) + +# library headers +# in most cases you might have already added all the header files to +# the CLASS_HDRS variable. So we just use the content of this. You +# can simply add more header files which don't contain classes with +# ROOT dictionary support +MODULE_HDRS:= $(CLASS_HDRS) + +# The LinkDef file required by the ROOT dictionary generation can be +# generated automatically. For the all header files specified in +# CLASS_HDRS an entry will be generated +# pragma link C++ class +; +# +# If the default behavior is not enough, you can provide a custom +# *LinkDef.h to the MODULE_DHDR variable. Leave MODULE_DHDR empty to +# enable automatic generation. +MODULE_DHDR:= + +EINCLUDE := HLT/BASE HLT/trigger HLT/TPCLib + +############################################################################### +# +# do not change anything below this line +# +SRCS:=$(patsubst %,trigger/%,$(MODULE_SRCS)) +CINTHDRS:=$(patsubst %,trigger/%,$(CLASS_HDRS)) +HDRS:=$(patsubst %,trigger/%,$(MODULE_HDRS)) +DHDR:=$(patsubst %,trigger/%,$(MODULE_DHDR)) +CINTAUTOLINK:= $(shell test "x$(MODULE_DHDR)" = "x" &&! echo 1) + +EDEFINE := ${HLTDEFS} +PACKCXXFLAGS := ${HLTCXXFLAGS} +PACKCFLAGS := ${HLTCLFAGS} +PACKDCXXFLAGS:= ${HLTDCXXFLAGS} diff --git a/HLT/trigger/AliHLTTriggerSelectiveReadoutComponent.cxx b/HLT/trigger/AliHLTTriggerSelectiveReadoutComponent.cxx new file mode 100644 index 00000000000..a57aff6090a --- /dev/null +++ b/HLT/trigger/AliHLTTriggerSelectiveReadoutComponent.cxx @@ -0,0 +1,272 @@ +//-*- Mode: C++ -*- +// $Id$ +/************************************************************************** + * This file is property of and copyright by the ALICE HLT Project * + * ALICE Experiment at CERN, All rights reserved. * + * * + * Primary Authors: Jochen Thaeder * + * 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 AliHLTTriggerSelectiveReadoutComponent.cxx + @author Jochen Thaeder + @date + @brief Component for the Selective Readout Trigger +*/ + +// see header file for class documentation +// or +// refer to README to build package +// or +// visit http://web.ift.uib.no/~kjeks/doc/alice-hlt + +#if __GNUC__ >= 3 +using namespace std; +#endif + +#include "AliHLTTriggerSelectiveReadoutComponent.h" +#include "AliHLTTPCDefinitions.h" + +#include +#include + + +// ** This is a global object used for automatic component registration, do not use this +AliHLTTriggerSelectiveReadoutComponent gAliHLTTriggerSelectivereadoutComponent; + +ClassImp(AliHLTTriggerSelectiveReadoutComponent) + +AliHLTTriggerSelectiveReadoutComponent::AliHLTTriggerSelectiveReadoutComponent() : + fDetector(), + fEnableThresholdSize(kFALSE) { + // see header file for class documentation + // or + // refer to README to build package + // or + // visit http://web.ift.uib.no/~kjeks/doc/alice-hlt + + memset( fThreshold, 0, (fkNThreshold * sizeof(AliHLTUInt32_t)) ); +} + +AliHLTTriggerSelectiveReadoutComponent::~AliHLTTriggerSelectiveReadoutComponent() { + // see header file for class documentation +} + +// Public functions to implement AliHLTComponent's interface. +// These functions are required for the registration process + +const char* AliHLTTriggerSelectiveReadoutComponent::GetComponentID() { + // see header file for class documentation + return "TriggerSelectiveReadout"; +} + +void AliHLTTriggerSelectiveReadoutComponent::GetInputDataTypes(AliHLTComponentDataTypeList& list) { + // see header file for class documentation + + list.clear(); + list.push_back( kAliHLTDataTypeDDLRaw ); +} + +AliHLTComponentDataType AliHLTTriggerSelectiveReadoutComponent::GetOutputDataType() { + // see header file for class documentation + + return kAliHLTMultipleDataType; +} + +Int_t AliHLTTriggerSelectiveReadoutComponent::GetOutputDataTypes( AliHLTComponentDataTypeList& tgtList) { + // see header file for class documentation + + tgtList.clear(); + tgtList.push_back( kAliHLTDataTypeDDLRaw ); + tgtList.push_back( kAliHLTDataTypeDDL ); +} + +void AliHLTTriggerSelectiveReadoutComponent::GetOutputDataSize( unsigned long& constBase, double& inputMultiplier ) { + // see header file for class documentation + + constBase = sizeof( AliHLTEventDDL ); + + if ( ! fDetector.CompareTo("TPC") ) + inputMultiplier = 216.0; + else + HLTError("Output DataSize for Detector '%s' has not been implemented", fDetector.Data() ); +} + +// Spawn function, return new instance of this class +AliHLTComponent* AliHLTTriggerSelectiveReadoutComponent::Spawn() { + // see header file for class documentation + + return new AliHLTTriggerSelectiveReadoutComponent; +} + +Int_t AliHLTTriggerSelectiveReadoutComponent::DoInit( int argc, const char** argv ) { + // see header file for class documentation + + Int_t iResult = 0; + TString argument = ""; + TString parameter = ""; + Int_t bMissingParam=0; + + for ( Int_t ii=0; ii=0; ii++ ) { + + argument = argv[ii]; + + if ( argument.IsNull() ) continue; + + // -detector + if ( argument.CompareTo("-detector") == 0) { + + if ( ( bMissingParam=( ++ii >= argc ) ) ) break; + + fDetector = argv[ii]; + fDetector.Remove(TString::kLeading, ' '); + + fDetector = parameter; + HLTInfo( "Detector has been set to '%s'.", fDetector.Data() ); + } + + // -enableThreshold + else if ( ! argument.CompareTo("-enableThreshold") ) { + + if ( ( bMissingParam=( ++ii >= argc ) ) ) break; + + parameter = argv[ii]; + parameter.Remove(TString::kLeading, ' '); + + if ( ! parameter.CompareTo("size") ) { + fEnableThresholdSize = kTRUE; + HLTInfo( "Threshold on data 'size' has been enabled." ); + } + else { + HLTError( "This threshold '%s' has not been implemented.", parameter.Data() ); + iResult = -EPROTO; + } + } + + // -enableThreshold + else if ( ! argument.CompareTo("-treshold") ) { + HLTError("Not yet implemented '%s'", argument.Data() ); + } + + // - unknow parameter + else { + iResult = -EINVAL; + HLTError("Unknown argument '%s'", argument.Data() ); + } + + } // for ( Int_t ii=0; ii=0; ii++ ) { + + if ( bMissingParam ) { + HLTError( "Missing parameter for argument '%s'.", argument.Data() ); + iResult = -EPROTO; + } + + return iResult; +} + + +Int_t AliHLTTriggerSelectiveReadoutComponent::DoDeinit() { + // see header file for class documentation + + return 0; +} + +Int_t AliHLTTriggerSelectiveReadoutComponent::DoEvent( const AliHLTComponentEventData& /*evtData*/, AliHLTComponentTriggerData& trigData ) { + // see header file for class documentation + + // ** Create empty Readoutlist + AliHLTEventDDL readoutList; + memset( &readoutList, 0, sizeof(AliHLTEventDDL) ); + + const AliHLTComponentBlockData* iter = NULL; + Int_t ddlId = 0; + AliHLTUInt8_t patch = 0; + + // ** Loop over all input blocks and specify which data format should be read - only select Raw Data + iter = GetFirstInputBlock( kAliHLTDataTypeDDLRaw ); + + while ( iter != NULL ) { + + // ** Check if block has the origin as specified in fDetector + if ( fDetector.CompareTo( iter->fDataType.fOrigin ) == 0 ) { + iter = GetNextInputBlock(); + continue; + } + + // ** Check if block has only the CDH Header ( 32 Bytes = gkAliHLTCommonHeaderCount *sizeof(AliHLTUInt32_t) ) + if ( iter->fSize <= ( gkAliHLTCommonHeaderCount * sizeof(AliHLTUInt32_t) ) ) { + iter = GetNextInputBlock(); + continue; + } + + // + // ** Check for detector specifications + // + + // ** Check for TPC specifc specification + if ( fDetector.CompareTo("TPC") == 0 ) { + + // ** Get DDL ID + AliHLTUInt8_t slice = AliHLTTPCDefinitions::GetMinSliceNr( *iter ); + patch = AliHLTTPCDefinitions::GetMinPatchNr( *iter ); + + if (patch < 2) ddlId = 768 + (2 * slice) + patch; + else ddlId = 838 + (4*slice) + patch; + + HLTDebug ( "Input Data - TPC - Slice/Patch: %d/%d - EquipmentID : %d.", slice, patch, ddlId ); + } // if ( fDetector.CompareTo("TPC") == 0 ) { + + // ** Check for other detector specifc specification + else { + HLTError("Detector '%s' has not been implemented yet.", fDetector.Data() ); + iter = GetNextInputBlock(); + continue; + } + + // + // ** Check if threshold should be considerd + // + + if ( fEnableThresholdSize ) { + + // ** Check for TPC threshold + if ( ! fDetector.CompareTo("TPC") ) { + if ( patch < fkNThreshold ){ + + // ** if datablock to big, do not put it in HLT readout, enable for DAQ readout + if ( ( fThreshold[patch] !=0 ) && ( iter->fSize > fThreshold[patch] ) ) { + //----------------------SetEnableDDL( &readoutList, ddlId ); + iter = GetNextInputBlock(); + continue; + } + + } + } // if ( ! fDetector.CompareTo("TPC") ) { + + // ** Check for other detector threshold + else + HLTError("Check for size threshold as not been implemented yet for Detector '%s'.", fDetector.Data() ); + + } // if ( fEnableThresholdSize ) { + + // ** PushBack data block + PushBack( iter->fPtr , iter->fSize, iter->fDataType, iter->fSpecification); + + // ** Get next input block, with the same specification as defined in GetFirstInputBlock() + iter = GetNextInputBlock(); + + } // while ( iter != NULL ) { + + // ** PushBack readout list + PushBack( &readoutList, sizeof(AliHLTEventDDL), kAliHLTDataTypeDDL, (AliHLTUInt32_t) 0 ); + + return 0; +} diff --git a/HLT/trigger/AliHLTTriggerSelectiveReadoutComponent.h b/HLT/trigger/AliHLTTriggerSelectiveReadoutComponent.h new file mode 100644 index 00000000000..b9ca366b0b8 --- /dev/null +++ b/HLT/trigger/AliHLTTriggerSelectiveReadoutComponent.h @@ -0,0 +1,103 @@ +//-*- Mode: C++ -*- +// $Id$ +#ifndef ALIHLTTRIGGERSELECTIVEREADOUTCOMPONENT_H +#define ALIHLTTRIGGERSELECTIVEREADOUTCOMPONENT_H + +/* This file is property of and copyright by the ALICE HLT Project * + * ALICE Experiment at CERN, All rights reserved. * + * See cxx source for full Copyright notice */ + +/** @file AliHLTTriggerSelectiveReadoutComponent.h + @author Jochen Thaeder + @date + @brief Component for the Selective Readout Trigger +*/ + +// see below for class documentation +// or +// refer to README to build package +// or +// visit http://web.ift.uib.no/~kjeks/doc/alice-hlt + +#include "AliHLTProcessor.h" +#include "TString.h" + +/** + * @class AliHLTTriggerSelectiveReadoutComponent + * @brief Component for the Selective Readout Trigger + * + * This class is the trigger component for selective readout. It is not detector specific. + * However, a detector can be provided via the commandline arguments, in order to turn off the + * the whole detector for readout. + * + * If threshold has been enabled, incoming blocks with size > threshold, will not been + * forwarded and Bit for this readout partition in ReadoutList will be set for DAQ readout. + * + * The component has the following component arguments: + * -detector : Select Detector for discarding raw data. + * -enableThreshold : Enables threshold on size ( default is kFALSE ) + * -threshold < Int_t threshold[6]> : Size threshold in Byte for different patches for TPC -> This will be disappear later on, will be taken from xCDB entry. + * + * @ingroup alihlt_trigger + */ +class AliHLTTriggerSelectiveReadoutComponent : public AliHLTProcessor +{ + public: + + /** constructor */ + AliHLTTriggerSelectiveReadoutComponent(); + /** destructor */ + virtual ~AliHLTTriggerSelectiveReadoutComponent(); + + // Public functions to implement AliHLTComponent's interface. + // These functions are required for the registration process + + const char* GetComponentID(); + void GetInputDataTypes( AliHLTComponentDataTypeList& list ); + + AliHLTComponentDataType GetOutputDataType(); + Int_t GetOutputDataTypes( AliHLTComponentDataTypeList& tgtList ); + + virtual void GetOutputDataSize( unsigned long& constBase, double& inputMultiplier ); + AliHLTComponent* Spawn(); + + protected: + + using AliHLTProcessor::DoEvent; + + // Protected functions to implement AliHLTComponent's interface. + // These functions provide initialization as well as the actual processing + // capabilities of the component. + + /** Initialize the trigger component. */ + Int_t DoInit( int argc, const char** argv ); + + /** DeInitialize the trigger component. */ + Int_t DoDeinit(); + + /** Process the data in the trigger component */ + Int_t DoEvent( const AliHLTComponentEventData& evtData, AliHLTComponentTriggerData& trigData); + + private: + /** size of the threshold array */ + static const int fkNThreshold = 6; + + /** copy constructor prohibited */ + AliHLTTriggerSelectiveReadoutComponent(const AliHLTTriggerSelectiveReadoutComponent&); + + /** assignment operator prohibited */ + AliHLTTriggerSelectiveReadoutComponent& operator=(const AliHLTTriggerSelectiveReadoutComponent&); + + /** Detector name */ + TString fDetector; //! transient + + /** Enable of the size Threshold */ + Bool_t fEnableThresholdSize; //! transient + + /** Threshold in Bytes for each a readout partition */ + AliHLTUInt32_t fThreshold[fkNThreshold]; //! transient + + ClassDef(AliHLTTriggerSelectiveReadoutComponent, 0); + +}; +#endif diff --git a/HLT/trigger/Makefile.am b/HLT/trigger/Makefile.am new file mode 100644 index 00000000000..0176abc6108 --- /dev/null +++ b/HLT/trigger/Makefile.am @@ -0,0 +1,102 @@ +# $Id$ +# Makefile template for the libAliHLTTrigger library + +# This files defines the autotools-based build system of the +# libAliHLTTrigger library. All lines starting with a '#' are comments. +# Note: Source files definitions must be made in libAliHLTTrigger.pkg + +MODULE = AliHLTTrigger + +EXTRA_DIST = + +# include the pkg definition which actually contains the source +# file definitions +MODDIR = $(top_srcdir) +PKGDEF = $(MODDIR)/libAliHLTTrigger.pkg +include $(top_srcdir)/libAliHLTTrigger.pkg + + +# library definition +# The lib_LTLIBRARIES variable is a fixed variable of the autotools build +# system. All libraries defined by the Makefile template have to be added +# here. Since we aim for separated directories for different libraries +# there will be only one library. +lib_LTLIBRARIES = libAliHLTTrigger.la + +# version info for the library +# The libtool program is used to created the library, a version number can +# be specified by using the -version-info flag. This flag accepts an argument +# of the form current[:revision[:age]]. +# If either revision or age are omitted, they default to 0. Also note that +# age must be less than or equal to the current interface number. Here are a +# set of rules to help you update your library version information: +# +# 1. Start with version information of 0:0:0 for each libtool library. +# 2. Update the version information only immediately before a public release +# of your software. More frequent updates are unnecessary, and only +# guarantee that the current interface number gets larger faster. +# 3. If the library source code has changed at all since the last update, +# then increment revision (c:r:a becomes c:r+1:a). +# 4. If any interfaces have been added, removed, or changed since the last +# update, increment current, and set revision to 0. +# 5. If any interfaces have been added since the last public release, then +# increment age. +# 6. If any interfaces have been removed since the last public release, then +# set age to 0. +LIBRARY_VERSION = '0:0:0' + +# library sources +# The source files are specified in libAliHLTTrigger.pkg +libAliHLTTrigger_la_SOURCES = $(MODULE_SRCS) + +# library headers +# The header files are specified in libAliHLTTrigger.pkg +noinst_HEADERS = $(MODULE_HDRS) + +# compilation flags of the library +# This is the place to add further include directories if you are +# using external modules. The AliRoot/STEER and ROOT directories +# are the default include directories. +# Include paths within the HLT modules are automatically taken from the +# EINCLUDE variable of the pkg definition +# other AliRoot dependencies might need to added +AM_CPPFLAGS = -DMODULE=$(MODULE) \ + @HLTBASE_CPPFLAGS@ \ + @ALIROOT_CPPFLAGS@ \ + @ROOTCFLAGS@ \ + $(foreach i, $(EINCLUDE), \ + $(shell echo $(i) | sed -e "/HLT\//!d" -e "s|HLT/|-I$(top_srcdir)/|")) \ + $(foreach i, $(EINCLUDE), \ + $(shell echo $(i) | sed -e "/HLT\//d" -e "s|^|-I$(ALICE_ROOT)/|")) + +# linking flags of the library +# This is the place to add further libraries if you are +# using external modules. The AliRoot, ROOT and HLT base libraries +# are added by default. +# Also the version of the library +#libAliHLTTPC_la_LIBADD = $(top_builddir)/BASE/TPCLib/libAliHLTTPC.la +libAliHLTTrigger_la_LDFLAGS = -L@ROOTLIBDIR@ \ + @ROOTLIBS@ \ + @HLTBASE_LDFLAGS@ \ + @ALIROOT_LDFLAGS@ \ + @ALIROOT_LIBS@ \ + -version-info $(LIBRARY_VERSION) + +# automatic generation of data and time of library build +COMPILE_INFO = AliHLTTriggerCompileInfo.cxx + +# set the file name for the generated root dictionary +DICTCPP = AliHLTTrigger-DICT.cxx +nodist_libAliHLTTrigger_la_SOURCES= $(COMPILE_INFO) \ + $(DICTCPP) + +CLEANFILES = $(COMPILE_INFO) + +include $(top_srcdir)/make.dict + +$(COMPILE_INFO): $(libAliHLTTrigger_la_SOURCES) $(pkginclude_HEADERS) $(noinst_HEADERS) Makefile.am + @echo '//automatically generated compilation info' > $@ + @echo '//!!! DO NOT EDIT THIS FILE !!!' >> $@ + @echo '//add changes in Makefile.am' >> $@ + @echo 'extern "C" void CompileInfo( char*& date, char*& time)' >> $@ + @echo '{date=__DATE__; time=__TIME__; return;}' >> $@ -- 2.43.0