1515#ifndef ALICEO2_DATAFORMATSTPC_COMPRESSED_CLUSTERS_H
1616#define ALICEO2_DATAFORMATSTPC_COMPRESSED_CLUSTERS_H
1717
18+ #include " GPUCommonDef.h"
1819#include " GPUCommonRtypes.h"
1920
2021namespace o2
@@ -29,52 +30,75 @@ struct CompressedClustersCounters {
2930 unsigned int nSliceRows = 36 * 152 ;
3031 unsigned char nComppressionModes = 0 ;
3132
32- ClassDefNV (CompressedClustersCounters, 1 );
33+ ClassDefNV (CompressedClustersCounters, 2 );
3334};
3435
35- template <class T >
36- struct CompressedClustersPtrs_helper : public T {
37- unsigned short * qTotA = nullptr ; // ! [nAttachedClusters]
38- unsigned short * qMaxA = nullptr ; // ! [nAttachedClusters]
39- unsigned char * flagsA = nullptr ; // ! [nAttachedClusters]
40- unsigned char * rowDiffA = nullptr ; // ! [nAttachedClustersReduced]
41- unsigned char * sliceLegDiffA = nullptr ; // ! [nAttachedClustersReduced]
42- unsigned short * padResA = nullptr ; // ! [nAttachedClustersReduced]
43- unsigned int * timeResA = nullptr ; // ! [nAttachedClustersReduced]
44- unsigned char * sigmaPadA = nullptr ; // ! [nAttachedClusters]
45- unsigned char * sigmaTimeA = nullptr ; // ! [nAttachedClusters]
46-
47- unsigned char * qPtA = nullptr ; // ! [nTracks]
48- unsigned char * rowA = nullptr ; // ! [nTracks]
49- unsigned char * sliceA = nullptr ; // ! [nTracks]
50- unsigned int * timeA = nullptr ; // ! [nTracks]
51- unsigned short * padA = nullptr ; // ! [nTracks]
52-
53- unsigned short * qTotU = nullptr ; // ! [nUnattachedClusters]
54- unsigned short * qMaxU = nullptr ; // ! [nUnattachedClusters]
55- unsigned char * flagsU = nullptr ; // ! [nUnattachedClusters]
56- unsigned short * padDiffU = nullptr ; // ! [nUnattachedClusters]
57- unsigned int * timeDiffU = nullptr ; // ! [nUnattachedClusters]
58- unsigned char * sigmaPadU = nullptr ; // ! [nUnattachedClusters]
59- unsigned char * sigmaTimeU = nullptr ; // ! [nUnattachedClusters]
60-
61- unsigned short * nTrackClusters = nullptr ; // ! [nTracks]
62- unsigned int * nSliceRowClusters = nullptr ; // ! [nSliceRows]
36+ template <class TCHAR , class TSHORT , class TINT >
37+ struct CompressedClustersPtrs_x {
38+ TSHORT qTotA = 0 ; // !
39+ TSHORT qMaxA = 0 ; // !
40+ TCHAR flagsA = 0 ; // !
41+ TCHAR rowDiffA = 0 ; // !
42+ TCHAR sliceLegDiffA = 0 ; // !
43+ TSHORT padResA = 0 ; // !
44+ TINT timeResA = 0 ; // !
45+ TCHAR sigmaPadA = 0 ; // !
46+ TCHAR sigmaTimeA = 0 ; // !
6347
48+ TCHAR qPtA = 0 ; // !
49+ TCHAR rowA = 0 ; // !
50+ TCHAR sliceA = 0 ; // !
51+ TINT timeA = 0 ; // !
52+ TSHORT padA = 0 ; // !
53+
54+ TSHORT qTotU = 0 ; // !
55+ TSHORT qMaxU = 0 ; // !
56+ TCHAR flagsU = 0 ; // !
57+ TSHORT padDiffU = 0 ; // !
58+ TINT timeDiffU = 0 ; // !
59+ TCHAR sigmaPadU = 0 ; // !
60+ TCHAR sigmaTimeU = 0 ; // !
61+
62+ TSHORT nTrackClusters = 0 ; // !
63+ TINT nSliceRowClusters = 0 ; // !
64+
65+ ClassDefNV (CompressedClustersPtrs_x, 2 );
66+ };
67+
68+ struct CompressedClustersPtrs : public CompressedClustersPtrs_x <unsigned char *, unsigned short *, unsigned int *> {
69+ };
70+
71+ struct CompressedClustersOffsets : public CompressedClustersPtrs_x <size_t , size_t , size_t > {
72+ };
73+
74+ struct CompressedClustersFlat ;
75+
76+ struct CompressedClusters : public CompressedClustersCounters , public CompressedClustersPtrs {
77+ CompressedClusters () CON_DEFAULT;
78+ ~CompressedClusters () CON_DEFAULT;
79+ CompressedClusters (const CompressedClustersFlat& c);
80+
81+ ClassDefNV (CompressedClusters, 2 );
82+ };
83+
84+ struct CompressedClustersROOT : public CompressedClusters {
85+ CompressedClustersROOT () CON_DEFAULT;
86+ CompressedClustersROOT (const CompressedClustersFlat& v) : CompressedClusters(v) {}
6487 // flatbuffer used for streaming
6588 int flatdataSize = 0 ;
6689 char * flatdata = nullptr ; // [flatdataSize]
6790
68- ClassDefNV (CompressedClustersPtrs_helper , 2 );
91+ ClassDefNV (CompressedClustersROOT , 2 );
6992};
7093
71- struct CompressedClustersDummy_helper {
94+ struct CompressedClustersFlat : private CompressedClustersCounters , private CompressedClustersOffsets {
95+ friend struct CompressedClusters ; // We don't want anyone to access the members directly, should only be used to construct a CompressedClusters struct
96+ CompressedClustersFlat () CON_DELETE; // Must not be constructed, but just reinterpret_casted from void* array (void* to enforce alignment)
97+ size_t totalDataSize = 0 ;
98+
99+ void set (size_t bufferSize, const CompressedClusters& v);
72100};
73101
74- // Version with valid ROOT streamers for storage
75- using CompressedClusters = CompressedClustersPtrs_helper<CompressedClustersCounters>;
76- // Slightly smaller version with pointers only for GPU constant cache
77- using CompressedClustersPtrsOnly = CompressedClustersPtrs_helper<CompressedClustersDummy_helper>;
78102} // namespace tpc
79103} // namespace o2
80104
0 commit comments