]> git.uio.no Git - u/mrichter/AliRoot.git/blob - HLT/BASE/AliHLTHOMERBlockDesc.cxx
various fixes in the HLTOUT treatment
[u/mrichter/AliRoot.git] / HLT / BASE / AliHLTHOMERBlockDesc.cxx
1 /**************************************************************************
2  * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
3  *                                                                        *
4  * Authors: Jochen Thaeder <thaeder@kip.uni-heidelberg.de>                *
5  *          for The ALICE HLT Project.                                    *
6  *                                                                        *
7  * Permission to use, copy, modify and distribute this software and its   *
8  * documentation strictly for non-commercial purposes is hereby granted   *
9  * without fee, provided that the above copyright notice appears in all   *
10  * copies and that both the copyright notice and this permission notice   *
11  * appear in the supporting documentation. The authors make no claims     *
12  * about the suitability of this software for any purpose. It is          *
13  * provided "as is" without express or implied warranty.                  *
14  **************************************************************************/
15
16 /** @file   AliHLTHOMERBlockDesc.cxx
17     @author Jochen Thaeder
18     @date   
19     @brief  Container for HOMER Blocks
20 */
21
22 // see header file for class documentation
23 // or
24 // refer to README to build package
25 // or
26 // visit http://web.ift.uib.no/~kjeks/doc/alice-hlt
27
28 #if __GNUC__>= 3
29    using namespace std;
30 #endif
31
32 #include "AliHLTHOMERBlockDesc.h"
33 #include "AliHLTMessage.h"
34
35 #include "TMath.h"
36 #include "TClass.h"
37
38
39 ClassImp(AliHLTHOMERBlockDesc)
40
41 //##################################################################################
42 AliHLTHOMERBlockDesc::AliHLTHOMERBlockDesc() :
43   fData(NULL),
44   fSize(0),
45   fIsTObject(kFALSE),
46   fIsRawData(kFALSE),
47   fMessage(NULL),
48   fClassName(),
49   fDetector(),
50   fSubDetector(),
51   fSubSubDetector(),
52   fSpecification(0),
53   fDataType(),
54   fHasSubDetectorRange(kFALSE),
55   fHasSubSubDetectorRange(kFALSE) {
56   // see header file for class documentation
57   // or
58   // refer to README to build package
59   // or
60   // visit http://web.ift.uib.no/~kjeks/doc/alice-hlt
61 }
62
63 //##################################################################################
64 AliHLTHOMERBlockDesc::AliHLTHOMERBlockDesc( void * data, ULong_t size, TString origin, 
65                                             TString dataType, ULong_t specification ) :
66   fData(data),
67   fSize(size),
68   fIsTObject(kFALSE),
69   fIsRawData(kFALSE),
70   fMessage(NULL),
71   fClassName(),
72   fDetector(origin),
73   fSubDetector(),
74   fSubSubDetector(), 
75   fSpecification(specification),
76   fDataType(dataType),
77   fHasSubDetectorRange(kFALSE),
78   fHasSubSubDetectorRange(kFALSE) {
79   // see header file for class documentation
80   
81   // -- Set block parameters
82   SetBlockParameters();
83
84
85
86 //##################################################################################
87 AliHLTHOMERBlockDesc::~AliHLTHOMERBlockDesc() {
88   // see header file for class documentation
89
90   if ( fMessage != NULL )
91     delete fMessage;
92   fMessage = NULL;
93 }
94
95 //##################################################################################
96 void AliHLTHOMERBlockDesc::SetBlock( void * data, ULong_t size, TString origin, 
97                                      TString dataType, ULong_t specification ) {
98   // see header file for class documentation
99
100   fData = data;
101   fSize = size;
102   fDetector = origin; 
103   fDataType = dataType;
104   fSpecification = specification; 
105
106   // -- Set block parameters
107   SetBlockParameters();
108
109   return;
110 }
111
112 //##################################################################################
113 void AliHLTHOMERBlockDesc::SetBlockParameters() {
114   // see header file for class documentation
115
116   Int_t iError = 0;
117
118   // ---- SET CLASS NAME, DATA CONTENTS ----
119
120   // -- Check if block contains raw data
121   if ( ! CheckIfRawData() ) {
122
123     // -- Check if block contains TObject  
124     if ( ! CheckIfTObject() ) {
125
126       // -- Contains arbitrary data type
127       
128       // **** TPC ****
129       if ( ! fDetector.CompareTo("TPC") ) {
130         
131         if ( ! fDataType.CompareTo("CLUSTERS") )
132           fClassName = "AliHLTTPCSpacePoints";
133         else 
134           iError = 1;
135       }
136
137       // **** TRD ****
138       
139       else if ( ! fDetector.CompareTo("TRD") ) {
140         iError = 1;
141       }
142
143       // **** PHOS ****
144       
145       else if ( ! fDetector.CompareTo("PHOS") ) {
146         iError = 1;
147       }
148
149       // **** MUON ****
150       
151       else if ( ! fDetector.CompareTo("MUON") ) {
152         iError = 1;
153       }
154
155       // **** OTHER ****
156
157       else {
158         iError = 1;
159       }
160     }
161   } // if ( ! CheckIfRawData() ) {
162   
163   // -- Check if Data Type has been defined
164   if ( iError ) {
165     //AliError( Form("The data type %s for the detector %s has not been defined yet.", 
166     //             fDataType.Data(), fDetector.Data()) );
167   }
168   
169   // ---- SET SPECIFICATIONS ----
170   // -- Convert Specification to "SubDetector/SubSubDetector"
171
172   // **** TPC **** ( has special treatment )
173
174   if ( ! fDetector.CompareTo("TPC") ) {
175
176     Int_t minPatch  = (fSpecification & 0x000000FF);
177     Int_t maxPatch  = (fSpecification & 0x0000FF00) >> 8;
178     Int_t minSector = (fSpecification & 0x00FF0000) >> 16 ;
179     Int_t maxSector = (fSpecification & 0xFF000000) >> 24;
180     
181     fSubDetector += minSector;
182     fSubSubDetector += minPatch;
183   
184     // -- check for ranges
185     if ( minSector != maxSector )
186       fHasSubDetectorRange = kTRUE;
187
188     if ( minPatch != maxPatch )
189       fHasSubSubDetectorRange = kTRUE;
190   }
191   
192   // **** OTHER DETECTORS ****
193   
194   else {
195     
196     if ( fSpecification ) {
197       // find the max bin which is set to 1
198       fSubDetector += TMath::FloorNint( TMath::Log2(fSpecification) );
199
200       // -- check for ranges
201       if ( TMath::Log2(fSpecification) != ( (Double_t) TMath::FloorNint( TMath::Log2(fSpecification) ) ) )
202         fHasSubDetectorRange = kTRUE;
203
204     }
205   }
206
207   return;
208 }
209   
210 //##################################################################################
211 Bool_t AliHLTHOMERBlockDesc::CheckIfTObject() {
212   // see header file for class documentation
213
214   // -- Check Length - First 32 bit word of payload contains the length
215   UInt_t len = *( (UInt_t*) fData  );
216   
217   if ( len != ( fSize - sizeof(UInt_t) ) ) 
218     return fIsTObject;
219     
220   // -- set AliHLTMessage
221   if ( fMessage ) 
222     delete fMessage;
223   fMessage = NULL;    
224
225   fMessage = new AliHLTMessage( fData, fSize );
226   
227   // -- Check if TMessage payload is TObject
228   if ( fMessage->What() == kMESS_OBJECT ) {
229     fClassName = fMessage->GetClass()->GetName();
230     fIsTObject = kTRUE;
231   }
232
233   return fIsTObject;
234 }
235
236 //##################################################################################
237 Bool_t AliHLTHOMERBlockDesc::CheckIfRawData() {
238   // see header file for class documentation
239
240   if ( ! fDataType.CompareTo("DDL_RAW") )
241     fIsRawData = kTRUE;
242
243   return fIsRawData;
244 }
245  
246 //##################################################################################
247 TObject* AliHLTHOMERBlockDesc::GetTObject() {
248   // see header file for class documentation
249   
250   if ( fMessage ) {
251     TObject* obj = fMessage->ReadObject( fMessage->GetClass() );
252     fMessage->Reset();
253     return obj;
254   }
255  else
256    return NULL;
257 }