BlockFilter component added; minor corrections
authorrichterm <richterm@f7af4fe6-9843-0410-8265-dc069ae4e863>
Tue, 13 Nov 2007 08:16:12 +0000 (08:16 +0000)
committerrichterm <richterm@f7af4fe6-9843-0410-8265-dc069ae4e863>
Tue, 13 Nov 2007 08:16:12 +0000 (08:16 +0000)
HLT/BASE/util/AliHLTAgentUtil.cxx
HLT/BASE/util/AliHLTBlockFilterComponent.cxx [new file with mode: 0644]
HLT/BASE/util/AliHLTBlockFilterComponent.h [new file with mode: 0644]
HLT/BASE/util/AliHLTFileWriter.cxx
HLT/BASE/util/AliHLTRootFileWriterComponent.cxx
HLT/libAliHLTUtil.pkg

index 85ef9099fc1a0d5f9dfde7a714abb1b7af26673f..97d92604c14b7c7d596d0165034402b41d025363 100644 (file)
@@ -35,6 +35,7 @@
 #include "AliHLTRootFilePublisherComponent.h"
 #include "AliHLTFileWriter.h"
 #include "AliHLTFilePublisher.h"
+#include "AliHLTBlockFilterComponent.h"
 
 /** global instance for agent registration */
 AliHLTAgentUtil gAliHLTAgentUtil;
@@ -90,5 +91,6 @@ int AliHLTAgentUtil::RegisterComponents(AliHLTComponentHandler* pHandler) const
   pHandler->AddComponent(new AliHLTRootFilePublisherComponent);
   pHandler->AddComponent(new AliHLTFileWriter);
   pHandler->AddComponent(new AliHLTFilePublisher);
+  pHandler->AddComponent(new AliHLTBlockFilterComponent);
   return 0;
 }
diff --git a/HLT/BASE/util/AliHLTBlockFilterComponent.cxx b/HLT/BASE/util/AliHLTBlockFilterComponent.cxx
new file mode 100644 (file)
index 0000000..0787942
--- /dev/null
@@ -0,0 +1,199 @@
+// @(#) $Id$
+
+/**************************************************************************
+ * This file is property of and copyright by the ALICE HLT Project        * 
+ * ALICE Experiment at CERN, All rights reserved.                         *
+ *                                                                        *
+ * Primary Authors: Matthias Richter <Matthias.Richter@ift.uib.no>        *
+ *                  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   AliHLTBlockFilterComponent.cxx
+    @author Matthias Richter
+    @date   
+    @brief  A simple data block filter and merger, merges block descriptors
+
+                                                                          */
+// see header file for class documentation
+// or
+// refer to README to build package
+// or
+// visit http://web.ift.uib.no/~kjeks/doc/alice-hlt
+
+#include <cstdlib>
+#include "AliHLTBlockFilterComponent.h"
+#include "TString.h"
+
+/** ROOT macro for the implementation of ROOT specific class methods */
+ClassImp(AliHLTBlockFilterComponent)
+
+AliHLTBlockFilterComponent::AliHLTBlockFilterComponent()
+{
+  // see header file for class documentation
+  // or
+  // refer to README to build package
+  // or
+  // visit http://web.ift.uib.no/~kjeks/doc/alice-hlt
+}
+
+AliHLTBlockFilterComponent::~AliHLTBlockFilterComponent()
+{
+  // see header file for class documentation
+}
+
+void AliHLTBlockFilterComponent::GetInputDataTypes(AliHLTComponentDataTypeList& list)
+{
+  // see header file for class documentation
+  list.clear();
+  list.push_back(kAliHLTAnyDataType);
+}
+
+AliHLTComponentDataType AliHLTBlockFilterComponent::GetOutputDataType()
+{
+  // see header file for class documentation
+  if (fFilterRules.size()==1) return fFilterRules[0].fDataType;
+  if (fFilterRules.size()==0) return kAliHLTVoidDataType;
+  return kAliHLTMultipleDataType;
+}
+
+int AliHLTBlockFilterComponent::GetOutputDataTypes(AliHLTComponentDataTypeList& tgtList)
+{
+  // see header file for class documentation
+  tgtList.clear();
+  AliHLTComponentBlockDataList::iterator desc=fFilterRules.begin();
+  while (desc!=fFilterRules.end()) {
+    AliHLTComponentDataTypeList::iterator type=tgtList.begin();
+    while (type!=tgtList.end()) {
+      if (*type==(*desc).fDataType) break;
+      type++;
+    }
+    if (type==tgtList.end()) tgtList.push_back((*desc).fDataType);
+    desc++;
+  }
+  return tgtList.size();
+}
+
+void AliHLTBlockFilterComponent::GetOutputDataSize( unsigned long& constBase, double& inputMultiplier )
+{
+  // see header file for class documentation
+  constBase=0;
+  inputMultiplier=0.0; // there is no new data, just forwarded descriptors
+}
+
+int AliHLTBlockFilterComponent::DoInit( int argc, const char** argv )
+{
+  int iResult=0;
+  TString argument="";
+  int bMissingParam=0;
+  AliHLTComponentBlockData rule;
+  FillBlockData(rule);
+  for (int i=0; i<argc && iResult>=0; i++) {
+    argument=argv[i];
+    if (argument.IsNull()) continue;
+
+    // -datatype
+    if (argument.CompareTo("-datatype")==0) {
+      if ((bMissingParam=(i+2>=argc))) break;
+
+      if (rule.fDataType!=kAliHLTAnyDataType) {
+       // the data type has already been set, add to list
+       // and reset
+       fFilterRules.push_back(rule);
+       FillBlockData(rule);
+      }
+
+      SetDataType(rule.fDataType, argv[i+1], argv[i+2]);
+      i+=2;
+
+      // -dataspec
+    } else if (argument.CompareTo("-dataspec")==0) {
+      if ((bMissingParam=(++i>=argc))) break;
+
+      if (rule.fSpecification!=kAliHLTVoidDataSpec) {
+       // the specification has already been set, add to list
+       // and reset
+       fFilterRules.push_back(rule);
+       FillBlockData(rule);
+      }
+
+      TString parameter(argv[i]);
+      parameter.Remove(TString::kLeading, ' '); // remove all blanks
+      char* pRemnant=NULL;
+      rule.fSpecification=strtoul(parameter.Data(), &pRemnant, 0);
+      if (pRemnant!=NULL && pRemnant[0]!=0) {
+       HLTError("invalid parameter/remnant (%s) for argument %s, number expected", pRemnant, argument.Data());
+       iResult=-EINVAL;
+      }
+    } else {
+      HLTError("unknown argument %s", argument.Data());
+      iResult=-EINVAL;
+      break;
+    }
+  }
+  if (iResult>=0 && (rule.fSpecification!=kAliHLTVoidDataSpec || rule.fDataType!=kAliHLTAnyDataType)) {
+    // add the pending rule
+    fFilterRules.push_back(rule);
+    FillBlockData(rule);
+  }
+  return iResult;
+}
+
+int AliHLTBlockFilterComponent::DoDeinit()
+{
+  int iResult=0;
+  fFilterRules.clear();
+  return iResult;
+}
+
+int AliHLTBlockFilterComponent::DoEvent( const AliHLTComponentEventData& evtData,
+                                        const AliHLTComponentBlockData* blocks, 
+                                        AliHLTComponentTriggerData& /*trigData*/,
+                                        AliHLTUInt8_t* /*outputPtr*/, 
+                                        AliHLTUInt32_t& size,
+                                        AliHLTComponentBlockDataList& outputBlocks )
+{
+  // see header file for class documentation
+  int iResult=0;
+  for (int n=0; n<(int)evtData.fBlockCnt; n++ ) {
+    if (IsSelected(blocks[n])) {
+      HLTDebug("block %d type %s %#x (ptr=%p offset=%d size=%d) selected by filter rules", 
+              n, DataType2Text(blocks[n].fDataType).c_str(), blocks[n].fSpecification, 
+              blocks[n].fPtr, blocks[n].fOffset, blocks[n].fSize);
+      outputBlocks.push_back(blocks[n]);
+    } else {
+      HLTDebug("block %d type %s %#x discarded by filter rules", n, DataType2Text(blocks[n].fDataType).c_str(), blocks[n].fSpecification);
+    }
+  }
+  size=0;
+  return iResult;
+}
+
+int AliHLTBlockFilterComponent::IsSelected(const AliHLTComponentBlockData& block)
+{
+  // see header file for class documentation
+  AliHLTComponentBlockDataList::iterator desc=fFilterRules.begin();
+  //HLTDebug("check block: %s spec %#x", DataType2Text(block.fDataType, 1).c_str(), block.fSpecification);
+  if (desc==fFilterRules.end()) return 1; // no filter rules
+  do {
+    // match if
+    // 1. data types match or filter data type not set
+    // 2. data spec match or filter data wpec not set
+    // 3. either filter data type or spec is set
+    //HLTDebug("check rule : %s spec %#x", DataType2Text((*desc).fDataType, 2).c_str(), block.fSpecification);
+    if (((*desc).fDataType==block.fDataType || (*desc).fDataType==kAliHLTAnyDataType) &&
+       ((*desc).fSpecification==block.fSpecification || (*desc).fSpecification==kAliHLTVoidDataSpec) &&
+       ((*desc).fDataType!=kAliHLTAnyDataType || (*desc).fSpecification!=kAliHLTVoidDataSpec)) {
+      return 1;
+    }
+  } while (++desc!=fFilterRules.end());
+  
+  return 0;
+}
diff --git a/HLT/BASE/util/AliHLTBlockFilterComponent.h b/HLT/BASE/util/AliHLTBlockFilterComponent.h
new file mode 100644 (file)
index 0000000..6f0e2bd
--- /dev/null
@@ -0,0 +1,125 @@
+// -*- Mode: C++ -*-
+// @(#) $Id$
+
+#ifndef ALIHLTBLOCKFILTERCOMPONENT_H
+#define ALIHLTBLOCKFILTERCOMPONENT_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   AliHLTBlockFilterComponent.h
+    @author Matthias Richter
+    @date   
+    @brief  A simple data block filter and merger, merges block descriptors
+
+// 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"
+
+/**
+ * @class AliHLTBlockFilterComponent
+ * A data block merger and filter.
+ * It merges data block descriptors fulfilling the filtering rules and
+ * forwards the descriptors to the output. The actual data is not touched.
+ */
+class AliHLTBlockFilterComponent : public AliHLTProcessor
+{
+ public:
+  /** standard constructor */
+  AliHLTBlockFilterComponent();
+  /** destructor */
+  virtual ~AliHLTBlockFilterComponent();
+
+  /**
+   * The id of the component.
+   * @return component id (string)
+   */
+  virtual const char* GetComponentID() {return "BlockFilter";};
+
+  /**
+   * Get the input data types of the component.
+   * @return list of data types in the vector reference
+   */
+  void GetInputDataTypes( AliHLTComponentDataTypeList& );
+
+  /**
+   * Get the output data type of the component.
+   * If @ref kAliHLTMultipleDataType is returned, the framework invokes
+   * @ref GetOutputDataTypes.
+   * @return output data type
+   */
+  AliHLTComponentDataType GetOutputDataType();
+
+  /**
+   * Get the output data types of the component.
+   * The function can be implemented to indicate multiple output data types
+   * in the target array.
+   * @ref GetOutputDataType must return @ref kAliHLTMultipleDataType in order
+   * to invoke this method.
+   * @param tgtList          list to receive the data types
+   * @return no of output data types, data types in the target list
+   */
+  int GetOutputDataTypes(AliHLTComponentDataTypeList& tgtList);
+
+  /**
+   * Get a ratio by how much the data volume is shrinked or enhanced.
+   * @param constBase        <i>return</i>: additive part, independent of the
+   *                                   input data volume  
+   * @param inputMultiplier  <i>return</i>: multiplication ratio
+   * @return values in the reference variables
+   */
+  void GetOutputDataSize( unsigned long& constBase, double& inputMultiplier );
+
+  /**
+   * Spawn function.
+   * @return new class instance
+   */
+  virtual AliHLTComponent* Spawn() {return new AliHLTBlockFilterComponent;}
+
+ protected:
+
+  /**
+   * Data processing method for the component.
+   * Filters the incoming data descriptors according to the rules and forwards
+   * them into the output.
+   * @return neg. error code if failed 
+   */
+  int DoEvent( const AliHLTComponentEventData& evtData,
+              const AliHLTComponentBlockData* blocks, 
+              AliHLTComponentTriggerData& trigData,
+              AliHLTUInt8_t* outputPtr, 
+              AliHLTUInt32_t& size,
+              AliHLTComponentBlockDataList& outputBlocks );
+
+  /**
+   * Component initialisation and argument scan.
+   */
+  int DoInit( int argc, const char** argv );
+
+  /**
+   * Component cleanup.
+   */
+  int DoDeinit();
+
+ private:
+  /** copy constructor prohibited */
+  AliHLTBlockFilterComponent(const AliHLTBlockFilterComponent&);
+  /** assignment operator prohibited */
+  AliHLTBlockFilterComponent& operator=(const AliHLTBlockFilterComponent&);
+
+  /**
+   * Check if the data block is selected by the filter rules.
+   * @return 1 if selected
+   */
+  int IsSelected(const AliHLTComponentBlockData& block);
+
+  /** filtering rules, only the data type and specification members are use */
+  AliHLTComponentBlockDataList fFilterRules;                       //! transient
+
+  ClassDef(AliHLTBlockFilterComponent, 0)
+};
+#endif
index bbb9007afeda6dcdee7bc9d879067266b91e1374..4ee692087337888f4298338e00b1400ddbd1668a 100644 (file)
@@ -253,7 +253,7 @@ int AliHLTFileWriter::DumpEvent( const AliHLTComponentEventData& evtData,
   for (int n=0; n<(int)evtData.fBlockCnt; n++ ) {
     //HLTDebug("block %d out of %d", n, evtData.fBlockCnt);
     TString filename;
-    HLTDebug("dataspec 0x%x", blocks[n].fSpecification);
+    //HLTDebug("dataspec 0x%x", blocks[n].fSpecification);
     iResult=BuildFileName(evtData.fEventID, n, blocks[n].fDataType, blocks[n].fSpecification, filename);
     ios::openmode filemode=(ios::openmode)0;
     if (fCurrentFileName.CompareTo(filename)==0) {
index f0076ec526ecf308515d64dfe7a2583c28275914..38d6dfd0f205f325bb384f5e9b76e70e1e970a4c 100644 (file)
@@ -27,6 +27,9 @@
 #include "TFile.h"
 #include "TString.h"
 
+/** the global object for component registration */
+AliHLTRootFileWriterComponent gAliHLTRootFileWriterComponent;
+
 /** ROOT macro for the implementation of ROOT specific class methods */
 ClassImp(AliHLTRootFileWriterComponent)
 
index 723397a0d24aa2d532264919889c01ad61e06f68..d8288584ed0ffe9bbd356178ee57194d96f9f0e7 100644 (file)
@@ -11,6 +11,7 @@ CLASS_HDRS:=          AliHLTFilePublisher.h \
                AliHLTLoaderPublisherComponent.h \
                AliHLTRawReaderPublisherComponent.h \
                AliHLTDataGenerator.h \
+               AliHLTBlockFilterComponent.h \
                AliHLTAgentUtil.h
 
 MODULE_SRCS=   $(CLASS_HDRS:.h=.cxx)