]>
Commit | Line | Data |
---|---|---|
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 | ||
21 | ClassImp(AliAltroDecoder) | |
22 | ||
23 | AliAltroDecoder::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 | ||
43 | AliAltroDecoder::~AliAltroDecoder() | |
44 | { | |
45 | // see header file for class documentation | |
46 | } | |
47 | ||
48 | ||
49 | Bool_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 | ||
63 | Bool_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 | ||
114 | Bool_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 | ||
165 | Int_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 | ||
184 | Float_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 | ||
196 | void 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 | ||
214 | void 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 | ||
244 | void 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 | ||
291 | void 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 | } |