using one instance of decoder for all events
[u/mrichter/AliRoot.git] / HLT / TPCLib / AliHLTTPCClusterAccessHLTOUT.h
1 //-*- Mode: C++ -*-
2 // $Id$
3 #ifndef ALIHLTTPCCLUSTERACCESSHLTOUT_H
4 #define ALIHLTTPCCLUSTERACCESSHLTOUT_H
5 //* This file is property of and copyright by the ALICE HLT Project        * 
6 //* ALICE Experiment at CERN, All rights reserved.                         *
7 //* See cxx source for full Copyright notice                               *
8
9 /// @file   AliHLTTPCClusterAccessHLTOUT.h
10 /// @author Matthias Richter
11 /// @date   2011-06-06
12 /// @brief  Interface to HLT TPC clusters
13 ///
14
15 #include "TObject.h"
16 #include "AliHLTDataTypes.h"
17 #include "AliHLTTPCClusterMCData.h"
18 #include "AliTPCclusterMI.h"
19 #include <map>
20
21 class AliTPCClustersRow;
22 class AliHLTOUT;
23 class TClonesArray;
24 class AliHLTTPCDataCompressionDecoder;
25
26 typedef std::map<AliHLTUInt32_t, AliHLTTPCClusterMCLabel> AliHLTTPCClusterMCDataList;
27
28 /**
29  * @class AliHLTTPCClusterAccessHLTOUT
30  * Generator for TPC cluster array from HLT TPC clusters in the HLTOUT
31  * data stream. It uses the TObject method interface. Combined with dynamic
32  * loading, any cross dependency between the TPC code and HLT libraries
33  * can be avoided.
34  *
35  * Creating the instance: 
36  * The class is implemented in libAliHLTTPC.so and can be loaded
37  * through the TClass interface (you might want to add
38  * further error messages on the various error conditions).
39  * <pre>
40  *     TObject* pClusterAccess=NULL;
41  *     TClass* pCl=NULL;
42  *     ROOT::NewFunc_t pNewFunc=NULL;
43  *     do {
44  *       pCl=TClass::GetClass("AliHLTTPCClusterAccessHLTOUT");
45  *     } while (!pCl && gSystem->Load("libAliHLTTPC.so")==0);
46  *     if (pCl && (pNewFunc=pCl->GetNew())!=NULL) {
47  *       void* p=(*pNewFunc)(NULL);
48  *       if (p) {
49  *         pClusterAccess=reinterpret_cast<TObject*>(p);
50  *       }
51  *     }
52  * </pre>
53  * 
54  * Usage:
55  * TObject::Execute can be used to execute commands. Command 'read'
56  * will get hold on the HLTOUT data and read the clusters. The const char*
57  * parameter 'param' is used to select the region.
58  * - param="sector=sectorno"
59  * 'sectorno' specifies sector number in the offline code, range 0 and 71,
60  * enumerating first the 36 inner (partitions 0+1)  and then 36 outer sectors
61  * (partitions 2-5).<br>
62  * If the error pointer parameter is provided the result code is returned
63  * - >=0 success, number of clusters
64  * - -ENODATA  no data in HLTOUT
65  * - -EINVAL   invalid parameter/argument
66  * - -ENOMEM   memory allocation failed
67  * - -EACCESS  no access to HLTOUT
68  * - -NODEV    internal error, can not get AliHLTSystem
69  * - -ENOBUFS  internal error, can not get cluster array
70  * 
71  * Command 'verbosity=level' sets the verbositylevel which is default 0
72  * (no info output).
73  *
74  * <pre>
75  *     pClusterAccess->Execute("read", param);
76  *     TObject* pClusterAccess->FindObject("clusterarray");
77  * </pre>
78  *
79  * After processing the loop of sectors, the instance should be cleaned.
80  * <pre>
81  *     pClusterAccess->Clear("event");
82  * </pre>
83  * 
84  * @ingroup alihlt_tpc
85  */
86 class AliHLTTPCClusterAccessHLTOUT : public TObject
87 {
88  public:
89   /** standard constructor */
90   AliHLTTPCClusterAccessHLTOUT();
91   /** destructor */
92   ~AliHLTTPCClusterAccessHLTOUT();
93
94   /// inherited from TObject: abstract command interface
95   virtual void        Execute(const char *method,  const char *params, Int_t *error=0);
96
97   /// inherited from TObject: return the cluster array if name id "clusterarray"
98   virtual TObject    *FindObject(const char *name) const;
99
100   /// inherited from TObject: cleanup
101   virtual void        Clear(Option_t * option ="");
102
103   /// inherited from TObject
104   virtual void        Print(Option_t *option="") const;
105
106   /// process the cluster data block of various formats from HLTOUT
107   int ProcessClusters(const char* params);
108
109   /// process the cluster mc data block {CLMCINFO:TPC } from HLTOUT
110   int ReadAliHLTTPCClusterMCData(AliHLTOUT* pHLTOUT, AliHLTTPCClusterMCDataList &tpcClusterLabels) const;
111
112   /// process the cluster data block {CLUSTERS:TPC } from HLTOUT
113   int ReadAliHLTTPCClusterData(AliHLTOUT* pHLTOUT, TClonesArray* pClusters, const AliHLTTPCClusterMCDataList *tpcClusterLabels=NULL) const;
114
115   /// process the cluster data block {CLUSTRAW:TPC } from HLTOUT
116   int ReadAliHLTTPCRawClusterData(AliHLTOUT* pHLTOUT, TClonesArray* pClusters, const AliHLTTPCClusterMCDataList *tpcClusterLabels);
117
118   /// process the clusters of type {REMCLSCM:TPC } from HLTOUT
119   int ReadRemainingClustersCompressed(AliHLTOUT* pHLTOUT, TClonesArray* pClusters, const AliHLTTPCClusterMCDataList *tpcClusterLabels);
120
121   /// process clusters encoded by AliHLTDataDeflaterSimple
122   int ReadAliHLTTPCRawClusterDataDeflateSimple(const AliHLTUInt8_t* pData, int dataSize,
123                                                int nofClusters, AliHLTUInt32_t specification,
124                                                TClonesArray* pClusters, const AliHLTTPCClusterMCDataList *tpcClusterLabels);
125
126   /**
127    * @class AliTPCclusterMIContainer
128    * Cluster read interface for offline.
129    * The class implements the interface to be used in the decoding
130    * of compressed TPC data.
131    */
132   class AliTPCclusterMIContainer {
133   public:
134     AliTPCclusterMIContainer();
135     virtual ~AliTPCclusterMIContainer();
136
137     struct AliClusterIdBlock {
138       AliClusterIdBlock() : fIds(NULL), fSize(0) {}
139       AliHLTUInt32_t* fIds; //!
140       AliHLTUInt32_t  fSize; //!
141     };
142
143     class iterator {
144     public:
145       iterator() : fClusterNo(-1), fData(NULL), fCluster(NULL), fClusterId(kAliHLTVoidDataSpec), fRowOffset(0) {}
146       iterator(AliTPCclusterMIContainer* pData) : fClusterNo(-1), fData(pData), fCluster(NULL), fClusterId(fData?fData->GetClusterId(fClusterNo):kAliHLTVoidDataSpec), fRowOffset(0) {}
147       iterator(const iterator& other) : fClusterNo(other.fClusterNo), fData(other.fData), fCluster(other.fCluster), fClusterId(other.fClusterId), fRowOffset(other.fRowOffset) {}
148       iterator& operator=(const iterator& other) {
149         if (this==&other) return *this;
150         fClusterNo=other.fClusterNo; fData=other.fData; fCluster=other.fCluster, fClusterId=other.fClusterId; fRowOffset=other.fRowOffset; return *this;
151       }
152       ~iterator() {}
153
154       void SetPadRow(int row)          {if (fCluster) fCluster->SetRow(row-fRowOffset);}
155       void SetPad(float pad)           {if (fCluster) fCluster->SetPad(pad);}
156       void SetTime(float time)         {if (fCluster) fCluster->SetTimeBin(time);}
157       void SetSigmaY2(float sigmaY2)   {if (fCluster) fCluster->SetSigmaY2(sigmaY2);}
158       void SetSigmaZ2(float sigmaZ2)   {if (fCluster) fCluster->SetSigmaZ2(sigmaZ2);}
159       void SetCharge(unsigned charge)  {if (fCluster) fCluster->SetQ(charge);}
160       void SetQMax(unsigned qmax)      {if (fCluster) fCluster->SetMax(qmax);}
161       void SetMC(const AliHLTTPCClusterMCLabel* pMC) {
162         if (!fCluster || !pMC) return;
163         for (int k=0; k<3; k++) fCluster->SetLabel(pMC->fClusterID[k].fMCID, k);
164       }
165
166       // switch to next cluster
167       iterator& Next(int slice, int partition);
168
169     private:
170       int fClusterNo; //! cluster no in the current block
171       AliTPCclusterMIContainer* fData; //! pointer to actual data
172       AliTPCclusterMI* fCluster; //! pointer to current cluster
173       AliHLTUInt32_t fClusterId; //! id of the cluster, from optional cluster id blocks
174       int fRowOffset;  //! row offset for current partition
175     };
176
177     /// iterator of remaining clusters block of specification
178     iterator& BeginRemainingClusterBlock(int count, AliHLTUInt32_t specification);
179     /// iterator of track model clusters
180     iterator& BeginTrackModelClusterBlock(int count);
181
182     /// add cluster mc data block
183     int AddClusterMCData(const AliHLTComponentBlockData* pDesc);
184     /// add cluster id block for remaining or track model clusters
185     int AddClusterIds(const AliHLTComponentBlockData* pDesc);
186     /// get the cluster id from the current cluster id block (optional)
187     AliHLTUInt32_t GetClusterId(int clusterNo) const;
188
189     /// internal cleanup
190     virtual void  Clear(Option_t * option="");
191     /// get the cluster array for a sector
192     TObjArray* GetSectorArray(unsigned sector) const;
193     /// print info
194     virtual void Print(Option_t *option=NULL) const;
195
196   protected:
197     /// load next cluster from array of the sepcific sector
198     AliTPCclusterMI* NextCluster(int slice, int partition);
199     /// set MC data for the cluster
200     int SetMC(AliTPCclusterMI* cluster, AliHLTUInt32_t clusterId);
201
202   private:
203     AliTPCclusterMIContainer(const AliTPCclusterMIContainer&);
204     AliTPCclusterMIContainer& operator=(const AliTPCclusterMIContainer&);
205
206     vector<TClonesArray*> fClusterArrays; //! cluster arrays per sector (offline notation 0-71)
207     vector<AliClusterIdBlock> fRemainingClusterIds; //! clusters ids for remaining cluster ids
208     AliClusterIdBlock fTrackModelClusterIds; //! cluster ids for track model clusters
209     AliClusterIdBlock* fCurrentClusterIds; //! id block currently active in the iteration
210     vector<const AliHLTTPCClusterMCData*> fClusterMCData; //! references to MC data blocks
211     iterator fIterator; //!
212   };
213
214  private:
215   /// copy constructor prohibited
216   AliHLTTPCClusterAccessHLTOUT(const AliHLTTPCClusterAccessHLTOUT&);
217   /// assignment operator prohibited
218   AliHLTTPCClusterAccessHLTOUT& operator=(const AliHLTTPCClusterAccessHLTOUT&);
219
220   enum EOptions {
221     // skip the track clusters
222     kSkipTrackClusters = BIT(15),
223     // skip the partition (remaining) clusters
224     kSkipPartitionClusters = BIT(16)
225   };
226
227   int fVerbosity; //! verbosity level
228   AliTPCclusterMIContainer* fClusters; //! cluster container
229   int fCurrentSector; //! current sector
230   AliHLTTPCDataCompressionDecoder* fpDecoder; //! decoder instance
231
232   ClassDef(AliHLTTPCClusterAccessHLTOUT, 0)
233 };
234 #endif