]> git.uio.no Git - u/mrichter/AliRoot.git/blame - RAW/AliAltroDecoder.cxx
include optional use of AliTOFtrackerV1
[u/mrichter/AliRoot.git] / RAW / AliAltroDecoder.cxx
CommitLineData
31a920d3 1/**************************************************************************
2 * This file is property of and copyright by the ALICE HLT Project *
3 * All rights reserved. *
4 * *
5 * Primary Authors: Per Thomas Hille <perthi@fys.uio.no> *
6 * Øystein Djuvsland <oystein.djuvsland@gmail.com> *
7 * *
8 * Permission to use, copy, modify and distribute this software and its *
9 * documentation strictly for non-commercial purposes is hereby granted *
10 * without fee, provided that the above copyright notice appears in all *
11 * copies and that both the copyright notice and this permission notice *
12 * appear in the supporting documentation. The authors make no claims *
13 * about the suitability of this software for any purpose. It is *
14 * provided "as is" without express or implied warranty. *
15 **************************************************************************/
16
17#include <Riostream.h>
18#include "AliAltroDecoder.h"
19#include "AliAltroData.h"
20
21ClassImp(AliAltroDecoder)
22
23AliAltroDecoder::AliAltroDecoder() : f32DtaPtr(0),
24 f8DtaPtr(0),
25 fN32HeaderWords(8),
26 fN40AltroWords(0),
27 fN40RcuAltroWords(0),
28 fNDDLBlocks(0),
29 f32LastDDLBlockSize(5),
30 f32PayloadSize(0),
31 fOutBufferIndex(0),
32 fSize(0),
33 fNAltro10bitWords(0),
34 fComplete(0),
35 fInComplete(0),
36 fDecodeIfCorruptedTrailer(kTRUE),
37 fIsDecoded(kFALSE)
38{
39 // see header file for class documentation
40}
41
42
43AliAltroDecoder::~AliAltroDecoder()
44{
45 // see header file for class documentation
46}
47
48
49Bool_t AliAltroDecoder::CheckPayloadTrailer()
50{
51 // see header file for documentation
52 if(fN40AltroWords != fN40RcuAltroWords)
53 {
54 return kFALSE;
55 }
56 else
57 {
58 return kTRUE;
59 }
60}
61
62
63Bool_t AliAltroDecoder::Decode()
64{
65 // see header file for class documentation
66 fComplete = 0;
67 fInComplete = 0;
68
69 Int_t tmpcnt = countAAApaddings();
70
71 if(tmpcnt == 3)
72 {
73 fN40AltroWords = fN40AltroWords -1;
74 }
75 else if(tmpcnt == 5)
76 {
77 fN40AltroWords = fN40AltroWords -2;
78 }
79 else if(tmpcnt == 8)
80 {
81 fN40AltroWords = fN40AltroWords -3;
82 }
83
84 if( ((CheckPayloadTrailer() == kTRUE) || fDecodeIfCorruptedTrailer == kTRUE ) && (fSize > 32) )
85 {
86 // fDDLBlockCnt = 0;
87 fOutBufferIndex = 0;
88
89 for(Int_t i = 0; i < fNDDLBlocks; i++)
90 {
91 DecodeDDLBlock();
92 }
93
94 DecodeLastDDLBlock();
95 fOutBufferIndex = fN40AltroWords*4 - 1;
96
97 // DumpData(fOutBuffer, 400,4);
98
99 fIsDecoded = kTRUE;
100 return kTRUE;
101 }
102
103 else
104 {
105 cout <<" ERROR: data integrity check failed, discarding data" << endl;
106 cout << "Size of datablock is " << fSize << endl;
107 cout << "fN40AltroWords = " << fN40AltroWords << endl;
108 cout << "fN40RcuAltroWords = " << fN40RcuAltroWords << endl;
109 return kFALSE;
110 }
111}
112
113
114Bool_t AliAltroDecoder::NextChannel(AliAltroData *altroDataPtr)
115{
116 if(fIsDecoded != kTRUE)
117 {
118 cout <<"AliAltroDecoder::NextChanne, WARNING, buffer was not decoded, decoding now.. "<< endl;
119 Decode();
120 }
121
122 if(fOutBufferIndex > fN32HeaderWords)
123 {
124 if((fOutBuffer[fOutBufferIndex] << 4 ) | ((fOutBuffer[fOutBufferIndex-1] & 0x3c0) >> 6) == 0x2aaa)
125 {
126 altroDataPtr->SetIsComplete(kTRUE);
127 fComplete ++;
128 }
129 else
130 {
131 altroDataPtr->SetIsComplete(kFALSE);
132 fInComplete ++;
133 }
134
135 fOutBufferIndex --;
136 fNAltro10bitWords = ( (fOutBuffer[fOutBufferIndex] & 0x3f) << 4 ) | ((fOutBuffer[fOutBufferIndex -1] & (0xF << 6)) >> 6) ;
137 fOutBufferIndex --;
138 altroDataPtr->SetHadd( ((fOutBuffer[fOutBufferIndex] & 0x3)) << 10 | ( fOutBuffer[fOutBufferIndex-1] ) );
139 fOutBufferIndex --;
140
141 if(fNAltro10bitWords%4 == 0)
142 {
143 fOutBufferIndex = fOutBufferIndex - fNAltro10bitWords;
144 }
145 else
146 {
147 fOutBufferIndex = fOutBufferIndex - fNAltro10bitWords -(4 - fNAltro10bitWords%4);
148 }
149
150 altroDataPtr->SetData( &fOutBuffer[fOutBufferIndex] );
151 fOutBufferIndex --;
152 altroDataPtr->SetDataSize( fNAltro10bitWords );
153
154 return kTRUE;
155
156 }
157 else
158 {
159 return kFALSE;
160 }
161}
162
163
164
165Int_t AliAltroDecoder::countAAApaddings()
166{
167 UShort_t *tailPtr= (UShort_t *)(f32DtaPtr +f32PayloadSize);
168 Int_t cnt = 0;
169
170 tailPtr --;
171
172 while(*tailPtr == 0xaaaa)
173 {
174 cnt ++;
175 tailPtr --;
176 }
177
178 tailPtr = tailPtr + cnt +1;
179
180 return cnt;
181}
182
183
184Float_t AliAltroDecoder::GetFailureRate()
185{
186 // see header file for documentation
187 Float_t tmp = 0;
188 cout << "Number of Complete channles = " << fComplete <<endl;
189 cout << "Number of InComplete channles = " << fInComplete <<endl;
190 tmp = (100*(Float_t)fInComplete)/((Float_t)fComplete + (Float_t)fInComplete);
191 cout <<"There are "<< tmp <<"% incomplete channels"<<endl;
192 return tmp;
193}
194
195
196void AliAltroDecoder::PrintInfo(AliAltroData &altrodata, Int_t n, Int_t nPerLine)
197{
198 // see header file for documentation
199 cout << "altrodata.fDataSize = " << altrodata.GetDataSize() << endl;
200 cout << "altrodata.fHadd = " << altrodata.GetHadd() <<endl;
201 const UInt_t* data = altrodata.GetData();
202 for(Int_t i= 0; i< n; i++)
203 {
204 if( (i%nPerLine == 0) && (i != 0) )
205 {
206 printf("\n");
207 }
208 printf("%d\t", data[i]);
209 }
210 printf("\n");
211}
212
213
214void AliAltroDecoder::SetMemory(UChar_t *dtaPtr, UInt_t size)
215{
216 // see header file for documentation
217 Int_t tmpTrailerSize;
218 fIsDecoded = kFALSE;
219 f8DtaPtr =dtaPtr;
220 fSize = size;
221 f8DtaPtr =f8DtaPtr + fSize;
222 f32DtaPtr = (UInt_t *)f8DtaPtr;
223 tmpTrailerSize = *(f32DtaPtr - 1);
224
225 if(tmpTrailerSize <= MAX_TRAILER_WORDS)
226 {
227 tmpTrailerSize = tmpTrailerSize; //assume that the last word of the buffer gives the number of trailer words
228 }
229 else
230 {
231 tmpTrailerSize = 1; //assume that last word is ONE, and that the this word gives the number of 40 bit altro words
232 }
233
234 f32PayloadSize = fSize/4 - (fN32HeaderWords + tmpTrailerSize);
235 fN40AltroWords = (32*f32PayloadSize)/40;
236 fNDDLBlocks = f32PayloadSize/5;
237 f32LastDDLBlockSize = f32PayloadSize%DDL_32BLOCK_SIZE;
238 f32DtaPtr = f32DtaPtr - tmpTrailerSize;
239 fN40RcuAltroWords = *f32DtaPtr;
240 f32DtaPtr = (UInt_t *)dtaPtr + fN32HeaderWords;
241}
242
243
244void AliAltroDecoder::DecodeDDLBlock()
245{
246 // see header file for documentation
247 fOutBuffer[fOutBufferIndex] = *f32DtaPtr & 0x3ff; //s0
248 fOutBufferIndex ++;
249 fOutBuffer[fOutBufferIndex] = (*f32DtaPtr & 0xffc00) >> 10; //s1
250 fOutBufferIndex ++;
251 fOutBuffer[fOutBufferIndex] = (*f32DtaPtr & 0x3ff00000) >> 20; //s2
252 fOutBufferIndex ++;
253 fOutBuffer[fOutBufferIndex] = (*f32DtaPtr & 0xc0000000) >> 30; //s3_1
254 f32DtaPtr ++;
255 fOutBuffer[fOutBufferIndex] = fOutBuffer[fOutBufferIndex] | ((*f32DtaPtr & 0xff) << 2); //s3_2
256 fOutBufferIndex ++;
257 fOutBuffer[fOutBufferIndex] = (*f32DtaPtr & 0x3ff00) >> 8; //s4
258 fOutBufferIndex ++;
259 fOutBuffer[fOutBufferIndex] = (*f32DtaPtr & 0xffc0000) >> 18; //s5
260 fOutBufferIndex ++;
261 fOutBuffer[fOutBufferIndex] = (*f32DtaPtr & 0xf0000000) >> 28; //s6_1
262 f32DtaPtr ++;
263 fOutBuffer[fOutBufferIndex] = fOutBuffer[fOutBufferIndex] | ((*f32DtaPtr & 0x3f) << 4); //s6_2
264 fOutBufferIndex ++;
265 fOutBuffer[fOutBufferIndex] = (*f32DtaPtr & 0xffc0) >> 6; //s7
266 fOutBufferIndex ++;
267 fOutBuffer[fOutBufferIndex] = (*f32DtaPtr & 0x3ff0000) >> 16; //s8
268 fOutBufferIndex ++;
269 fOutBuffer[fOutBufferIndex] = (*f32DtaPtr & 0xFC000000) >> 26; //s9_1
270 f32DtaPtr ++;
271 fOutBuffer[fOutBufferIndex] = fOutBuffer[fOutBufferIndex] | ((*f32DtaPtr & 0xf) << 6); //s9_2
272 fOutBufferIndex ++;
273 fOutBuffer[fOutBufferIndex] = (*f32DtaPtr & 0x3ff0) >> 4; //s10
274 fOutBufferIndex ++;
275 fOutBuffer[fOutBufferIndex] = (*f32DtaPtr & 0xffc000) >> 14; //s11
276 fOutBufferIndex ++;
277 fOutBuffer[fOutBufferIndex] = (*f32DtaPtr & 0xff000000) >> 24; //s12_1
278 f32DtaPtr ++;
279 fOutBuffer[fOutBufferIndex] = fOutBuffer[fOutBufferIndex] | ((*f32DtaPtr & 0x3) << 8); //s12_2
280 fOutBufferIndex ++;
281 fOutBuffer[fOutBufferIndex] = (*f32DtaPtr & 0xffc) >> 2; //s13
282 fOutBufferIndex ++;
283 fOutBuffer[fOutBufferIndex] = (*f32DtaPtr & 0x3ff000) >> 12; //s14
284 fOutBufferIndex ++;
285 fOutBuffer[fOutBufferIndex] = (*f32DtaPtr & 0xffc00000) >> 22; //s15
286 f32DtaPtr ++;
287 fOutBufferIndex ++;
288}
289
290
291void AliAltroDecoder::DecodeLastDDLBlock()
292{
293 // see header file for documentation
294 for(Int_t i=0; i < f32LastDDLBlockSize; i++)
295 {
296 fDDLBlockDummy[i] = *f32DtaPtr;
297 f32DtaPtr ++;
298 }
299
300 f32DtaPtr = fDDLBlockDummy;
301 f32DtaPtr ++;
302 DecodeDDLBlock();
303}