6e6fdda9671e0ac6b2966cc981f567922c37bee4
[u/mrichter/AliRoot.git] / HLT / TPCLib / comp / AliHLTTPCDataCompressionDecoder.cxx
1 // $Id$
2 //**************************************************************************
3 //* This file is property of and copyright by the ALICE HLT Project        * 
4 //* ALICE Experiment at CERN, All rights reserved.                         *
5 //*                                                                        *
6 //* Primary Authors: Matthias Richter <Matthias.Richter@ift.uib.no>        *
7 //*                  for The ALICE HLT Project.                            *
8 //*                                                                        *
9 //* Permission to use, copy, modify and distribute this software and its   *
10 //* documentation strictly for non-commercial purposes is hereby granted   *
11 //* without fee, provided that the above copyright notice appears in all   *
12 //* copies and that both the copyright notice and this permission notice   *
13 //* appear in the supporting documentation. The authors make no claims     *
14 //* about the suitability of this software for any purpose. It is          *
15 //* provided "as is" without express or implied warranty.                  *
16 //**************************************************************************
17
18 /// @file   AliHLTTPCDataCompressionDecoder.cxx
19 /// @author Matthias Richter
20 /// @date   2011-10-04
21 /// @brief  Generic decoder class for compressed TPC data, works on a container
22 ///         class implementation which fills the actual target data struct
23
24 #include "AliHLTTPCDataCompressionDecoder.h"
25 #include "AliHLTDataInflaterSimple.h"
26 #include "AliHLTDataInflaterHuffman.h"
27 #include "TList.h"
28 #include <memory>
29
30 ClassImp(AliHLTTPCDataCompressionDecoder)
31
32 AliHLTTPCDataCompressionDecoder::AliHLTTPCDataCompressionDecoder()
33   : fPadShift(0.)
34   , fVerbosity(0)
35   , fpDataInflaterPartition(NULL)
36   , fpDataInflaterTrack(NULL)
37   , fpClusterMerger(NULL)
38 {
39   /// constructor
40 }
41
42 AliHLTTPCDataCompressionDecoder::~AliHLTTPCDataCompressionDecoder()
43 {
44   ///destructor
45   if (fpDataInflaterPartition) delete fpDataInflaterPartition;
46   fpDataInflaterPartition=NULL;
47   if (fpDataInflaterTrack) delete fpDataInflaterTrack;
48   fpDataInflaterTrack=NULL;
49   if (fpClusterMerger) delete fpClusterMerger;
50   fpClusterMerger=NULL;
51 }
52
53 AliHLTDataInflater* AliHLTTPCDataCompressionDecoder::CreateInflater(int deflater, int mode) const
54 {
55   // create the inflater for the specified mode
56   vector<AliHLTTPCDefinitions::AliClusterParameterId_t> parameterids;
57   switch (mode) {
58   case 1:
59     parameterids.push_back(AliHLTTPCDefinitions::kPadRow );
60     parameterids.push_back(AliHLTTPCDefinitions::kPad    );
61     parameterids.push_back(AliHLTTPCDefinitions::kTime   );
62     parameterids.push_back(AliHLTTPCDefinitions::kSigmaY2);
63     parameterids.push_back(AliHLTTPCDefinitions::kSigmaZ2);
64     parameterids.push_back(AliHLTTPCDefinitions::kCharge );
65     parameterids.push_back(AliHLTTPCDefinitions::kQMax   );
66     break;
67   case 2:
68     parameterids.push_back(AliHLTTPCDefinitions::kResidualPad );
69     parameterids.push_back(AliHLTTPCDefinitions::kResidualTime);
70     parameterids.push_back(AliHLTTPCDefinitions::kSigmaY2);
71     parameterids.push_back(AliHLTTPCDefinitions::kSigmaZ2);
72     parameterids.push_back(AliHLTTPCDefinitions::kCharge );
73     parameterids.push_back(AliHLTTPCDefinitions::kQMax   );
74     break;
75   default:
76     HLTError("invalid mode %d for inflater initialization", mode);
77   }
78
79   switch (deflater) {
80   case 1:
81     {
82       std::auto_ptr<AliHLTDataInflaterSimple> inflatersimple(new AliHLTDataInflaterSimple);
83       if (!inflatersimple.get()) return NULL;
84       for (vector<AliHLTTPCDefinitions::AliClusterParameterId_t>::const_iterator id=parameterids.begin();
85            id!=parameterids.end(); id++) {
86         const AliHLTTPCDefinitions::AliClusterParameter& parameter=AliHLTTPCDefinitions::fgkClusterParameterDefinitions[*id];
87         if (inflatersimple->AddParameterDefinition(parameter.fName,
88                                                    parameter.fBitLength,
89                                                    parameter.fOptional)<0) {
90           HLTError("error adding parameter definition %s to inflater", parameter.fName);
91           return NULL;
92         }
93       }
94       return inflatersimple.release();
95     }
96     break;
97   case 2:
98     {
99       std::auto_ptr<AliHLTDataInflaterHuffman> inflaterhuffman(new AliHLTDataInflaterHuffman);
100       if (!inflaterhuffman.get()) return NULL;
101       TString cdbPath("HLT/ConfigTPC/TPCDataCompressorHuffmanTables");
102       TObject* pConf=AliHLTMisc::Instance().ExtractObject(AliHLTMisc::Instance().LoadOCDBEntry(cdbPath));
103       if (!pConf) {
104         HLTError("can not load configuration object %s", cdbPath.Data());
105         return NULL;
106       }
107       if (dynamic_cast<TList*>(pConf)==NULL) {
108         HLTError("huffman table configuration object of inconsistent type");
109         return NULL;
110       }
111       inflaterhuffman->InitDecoders(dynamic_cast<TList*>(pConf));
112       for (vector<AliHLTTPCDefinitions::AliClusterParameterId_t>::const_iterator id=parameterids.begin();
113            id!=parameterids.end(); id++) {
114         const AliHLTTPCDefinitions::AliClusterParameter& parameter=AliHLTTPCDefinitions::fgkClusterParameterDefinitions[*id];
115         if (inflaterhuffman->AddParameterDefinition(parameter.fName,
116                                                     parameter.fBitLength)<0) {
117           HLTError("error adding parameter definition %s to inflater", parameter.fName);
118           return NULL;
119         }
120       }
121       return inflaterhuffman.release();
122     }
123     break;
124   default:
125     HLTError("unknown inflater requested %d", deflater);
126   }
127   return NULL;
128 }