to keep backward compatibility for the cluster merger.
At the moment the descriptor only says if the clusters should be merged during unpacking, or they were already merged in the HLT,
AliHLTTPCDataCompressionDecoder& decoder=*fpDecoder;
decoder.Clear();
decoder.SetVerbosity(fVerbosity);
- //decoder.EnableClusterMerger();
bool bNextBlock=false;
// add cluster id and mc information data blocks
if (pHLTOUT->GetDataBlockDescription(desc.fDataType, desc.fSpecification)<0) {
continue;
}
+ if (desc.fDataType==AliHLTTPCDefinitions::DataCompressionDescriptorDataType()) {
+ // header
+ if ((iResult=decoder.AddCompressionDescriptor(&desc))<0) {
+ return iResult;
+ }
+ }
if (desc.fDataType==AliHLTTPCDefinitions::AliHLTDataTypeClusterMCInfo()) {
// add mc information
if ((iResult=decoder.AddClusterMCData(&desc))<0) {
AliHLTTPCDataCompressionDecoder& decoder=*fpDecoder;
decoder.Clear();
- decoder.SetVerbosity(GetVerbosity());
- decoder.EnableClusterMerger();
+ decoder.SetVerbosity(GetVerbosity());
bool bNextBlock=false;
// add cluster id and mc information data blocks
if ((iResult=pHLTOUT->GetDataBuffer(desc))<0) {
continue;
}
+ if (desc.fDataType==AliHLTTPCDefinitions::DataCompressionDescriptorDataType()) {
+ // header
+ if ((iResult=decoder.AddCompressionDescriptor(&desc))<0) {
+ return iResult;
+ }
+ }
if (desc.fDataType==AliHLTTPCDefinitions::AliHLTDataTypeClusterMCInfo()) {
// add mc information
if ((iResult=decoder.AddClusterMCData(&desc))<0) {
const AliHLTComponentDataType AliHLTTPCDefinitions::fgkTrackSegmentsDataType = AliHLTComponentDataTypeInitializer("TRAKSEGS", kAliHLTDataOriginTPC);
const AliHLTComponentDataType AliHLTTPCDefinitions::fgkTracksDataType = AliHLTComponentDataTypeInitializer("TRACKS ", kAliHLTDataOriginTPC);
-const AliHLTComponentDataType AliHLTTPCDefinitions::fgkClusterTracksModelDataType = AliHLTComponentDataTypeInitializer("CLSTRKMD", kAliHLTDataOriginTPC);
+const AliHLTComponentDataType AliHLTTPCDefinitions::fgkDataCompressionDescriptorDataType = AliHLTComponentDataTypeInitializer("COMPDESC", kAliHLTDataOriginTPC);
+const AliHLTComponentDataType AliHLTTPCDefinitions::fgkClusterTracksModelDataType = AliHLTComponentDataTypeInitializer("CLSTRKMD", kAliHLTDataOriginTPC);
const AliHLTComponentDataType AliHLTTPCDefinitions::fgkRemainingClustersModelDataType = AliHLTComponentDataTypeInitializer("REMCLSMD", kAliHLTDataOriginTPC);
const AliHLTComponentDataType AliHLTTPCDefinitions::fgkClusterTracksCompressedDataType = AliHLTComponentDataTypeInitializer("CLSTRKCM", kAliHLTDataOriginTPC);
const AliHLTComponentDataType AliHLTTPCDefinitions::fgkRemainingClustersCompressedDataType = AliHLTComponentDataTypeInitializer("REMCLSCM", kAliHLTDataOriginTPC);
static AliHLTComponentDataType dt = AliHLTComponentDataTypeInitializer("TRACKS ", kAliHLTDataOriginTPC);
return dt;
}
-
+const AliHLTComponentDataType& AliHLTTPCDefinitions::DataCompressionDescriptorDataType() {
+ static AliHLTComponentDataType dt = AliHLTComponentDataTypeInitializer("COMPDESC", kAliHLTDataOriginTPC);
+ return dt;
+}
const AliHLTComponentDataType& AliHLTTPCDefinitions::ClusterTracksModelDataType() {
static AliHLTComponentDataType dt = AliHLTComponentDataTypeInitializer("CLSTRKMD", kAliHLTDataOriginTPC);
return dt;
static const AliHLTComponentDataType& VertexDataType();
// Cluster & Tracks model data
+ /** data compression descriptor*/
+ static const AliHLTComponentDataType fgkDataCompressionDescriptorDataType; // see above
+ static const AliHLTComponentDataType& DataCompressionDescriptorDataType();
/** cluster tracks model data type */
static const AliHLTComponentDataType fgkClusterTracksModelDataType; // see above
static const AliHLTComponentDataType& ClusterTracksModelDataType();
#include "AliHLTTPCDataCompressionComponent.h"
#include "AliHLTTPCDefinitions.h"
+#include "AliHLTTPCDataCompressionDescriptor.h"
#include "AliHLTTPCTrackGeometry.h"
#include "AliHLTTPCSpacePointContainer.h"
#include "AliHLTTPCRawSpacePointContainer.h"
{
/// inherited from AliHLTComponent: multiple output data types of the component.
tgtList.clear();
+ tgtList.push_back(AliHLTTPCDefinitions::DataCompressionDescriptorDataType());
tgtList.push_back(AliHLTTPCDefinitions::RawClustersDataType());
tgtList.push_back(AliHLTTPCDefinitions::RemainingClustersCompressedDataType());
tgtList.push_back(AliHLTTPCDefinitions::RemainingClusterIdsDataType());
}
// Process an event
+
// Loop over all input blocks in the event
bool bHaveMC=(GetFirstInputBlock(AliHLTTPCDefinitions::fgkAliHLTDataTypeClusterMCInfo | kAliHLTDataOriginTPC))!=NULL;
if ((bHaveMC || fVerificationMode>0) && fpWrittenAssociatedClusterIds==NULL) {
if (GetBenchmarkInstance()) {
GetBenchmarkInstance()->Start(2);
}
+
+ // Write header block
+ {
+ AliHLTComponent_BlockData bd;
+ FillBlockData(bd);
+ bd.fOffset = size;
+ bd.fSize = sizeof(AliHLTTPCDataCompressionDescriptor);
+ bd.fDataType = AliHLTTPCDefinitions::DataCompressionDescriptorDataType();
+ if( capacity < size + bd.fSize ){
+ iResult = -ENOMEM;
+ return iResult;
+ }
+ AliHLTTPCDataCompressionDescriptor desc;
+ desc.SetMergedClustersFlag(1);
+ *(AliHLTTPCDataCompressionDescriptor*)(outputPtr + bd.fOffset ) = desc;
+ outputBlocks.push_back(bd);
+ size += bd.fSize;
+ outputDataSize+=bd.fSize;
+ HLTBenchmark("header data block of size %d", bd.fSize);
+ }
// transformed clusters
// the transformed clusters have not been used yet
/// class implementation which fills the actual target data struct
#include "AliHLTTPCDataCompressionDecoder.h"
+#include "AliHLTTPCDataCompressionDescriptor.h"
#include "AliHLTDataInflaterSimple.h"
#include "AliHLTDataInflaterHuffman.h"
#include "TList.h"
AliHLTTPCDataCompressionDecoder::AliHLTTPCDataCompressionDecoder()
: fPadShift(0.)
, fVerbosity(0)
+ , fUseClusterMerger(kTRUE)
, fpDataInflaterPartition(NULL)
, fpDataInflaterTrack(NULL)
, fpClusterMerger(NULL)
return 0;
}
+int AliHLTTPCDataCompressionDecoder::AddCompressionDescriptor(const AliHLTComponentBlockData* pDesc)
+{
+ /// read descriptor
+ if (!pDesc) return -EINVAL;
+ if (pDesc->fDataType!=AliHLTTPCDefinitions::DataCompressionDescriptorDataType()) return -ENODATA;
+ const AliHLTTPCDataCompressionDescriptor* pHeader=reinterpret_cast<const AliHLTTPCDataCompressionDescriptor*>(pDesc->fPtr);
+ if (! pHeader->CheckSize( pDesc->fSize ) ) return -EINVAL;
+ if( pHeader->GetMergedClustersFlag() == 0 ){
+ fUseClusterMerger = kTRUE;
+ } else if( pHeader->GetMergedClustersFlag() == 1 ){
+ fUseClusterMerger = kFALSE;
+ } else return -EINVAL;
+ return 0;
+}
+
int AliHLTTPCDataCompressionDecoder::AddClusterMCData(const AliHLTComponentBlockData* pDesc)
{
/// add cluster mc data block
fPartitionClusterIds.clear();
fTrackModelClusterIds.Clear();
fClusterMCData.clear();
+ fUseClusterMerger = kTRUE;
}
void SetPadShift(float padShift) {fPadShift=padShift;}
float PadShift() const {return fPadShift;}
void SetVerbosity(int verbosity) {fVerbosity=verbosity;}
- void EnableClusterMerger() {if (!fpClusterMerger) fpClusterMerger=new AliHLTTPCHWClusterMerger;}
int InitPartitionClusterDecoding(AliHLTUInt32_t specification);
int InitTrackModelClusterClusterDecoding();
+ int AddCompressionDescriptor(const AliHLTComponentBlockData* pDesc);
int AddClusterMCData(const AliHLTComponentBlockData* pDesc);
int AddClusterIds(const AliHLTComponentBlockData* pDesc);
AliHLTUInt32_t GetClusterId(int clusterNo) const;
float fPadShift; //! pad shift
int fVerbosity; //! verbosity level
+ Bool_t fUseClusterMerger; // flag to run the cluster merger
AliHLTDataInflater* fpDataInflaterPartition; //! instance of inflater for partition clusters
AliHLTDataInflater* fpDataInflaterTrack; //! instance of inflater for track clusters
AliHLTTPCHWClusterMerger* fpClusterMerger; //! merger instance
bool bNextCluster=true;
bool bReadSuccess=true;
AliHLTTPCRawCluster rawCluster;
+
+ if( fUseClusterMerger && !fpClusterMerger ){
+ fpClusterMerger = new AliHLTTPCHWClusterMerger;
+ }
+
if (fpClusterMerger)
fpClusterMerger->Clear();
if (parameterId>=AliHLTTPCDefinitions::kLast) {
AliHLTUInt32_t id=GetClusterId(decodedClusterCnt);
const AliHLTTPCClusterMCLabel* pMC=GetMCLabel(id);
- if (fpClusterMerger && fpClusterMerger->CheckCandidate(slice, partition, rawCluster)) {
+ if (fUseClusterMerger && fpClusterMerger && fpClusterMerger->CheckCandidate(slice, partition, rawCluster)) {
fpClusterMerger->AddCandidate(slice, partition, id, rawCluster, pMC);
} else {
c.Next(slice, partition);
}
pInflater->CloseBitDataInput();
int mergedClusterCnt=0;
- if (fpClusterMerger) {
+ if (fUseClusterMerger && fpClusterMerger) {
mergedClusterCnt=fpClusterMerger->Merge();
int remainingCnt=0;
if (mergedClusterCnt>=0) {
--- /dev/null
+#ifndef ALIHLTTPCDATACOMPRESSIONDESCRIPTOR_H
+#define ALIHLTTPCDATACOMPRESSIONDESCRIPTOR_H
+
+#include "Rtypes.h"
+
+/**
+ * @struct AliHLTTPCDataCompressionDescriptor
+ * The class describes properties of the compressed data
+ * @ingroup alihlt_tpc_datastructs
+ */
+class AliHLTTPCDataCompressionDescriptor
+{
+ public:
+
+ AliHLTTPCDataCompressionDescriptor(): fVersion(0), fMergedClustersFlag(1){}
+ ~AliHLTTPCDataCompressionDescriptor(){}
+ AliHLTTPCDataCompressionDescriptor(const AliHLTTPCDataCompressionDescriptor& other)
+ : fVersion(other.fVersion)
+ , fMergedClustersFlag(other.fMergedClustersFlag)
+ {}
+
+ AliHLTTPCDataCompressionDescriptor& operator=(const AliHLTTPCDataCompressionDescriptor& other){
+ fVersion = other.fVersion;
+ fMergedClustersFlag = other.fMergedClustersFlag;
+ return *this;
+ }
+
+ Bool_t CheckSize( UInt_t size ) const {
+ if( size<sizeof(UInt_t) ) return 0;
+ if( fVersion==0 ) return ( size==sizeof(AliHLTTPCDataCompressionDescriptor));
+ return 0;
+ }
+
+ UInt_t GetVersion() const { return fVersion; }
+ Int_t GetMergedClustersFlag() const { return fMergedClustersFlag; }
+
+ void SetMergedClustersFlag( Int_t flag ){ fMergedClustersFlag=flag; }
+
+ private:
+
+ UInt_t fVersion; // version number
+ Int_t fMergedClustersFlag; // flag tells if the clusters were merged at the branch borders
+};
+
+#endif