]>
Commit | Line | Data |
---|---|---|
48265b32 | 1 | /************************************************************************** |
2 | * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. * | |
3 | * * | |
4 | * Author: The ALICE Off-line Project. * | |
5 | * Contributors are mentioned in the code where appropriate. * | |
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 | /* | |
17 | $Log$ | |
fb3305d1 | 18 | Revision 1.2 2007/10/12 13:36:27 cvetan |
19 | Coding convention fixes from Stefan | |
20 | ||
ca7b8371 | 21 | Revision 1.1 2007/09/17 10:23:31 cvetan |
22 | New TPC monitoring package from Stefan Kniege. The monitoring package can be started by running TPCMonitor.C macro located in macros folder. | |
23 | ||
48265b32 | 24 | */ |
25 | ||
ca7b8371 | 26 | //////////////////////////////////////////////////////////////////////// |
27 | //// | |
28 | //// AliTPCMonitorAltro class | |
29 | //// | |
30 | //// Class for decoding raw TPC data in the ALTRO format. | |
31 | //// Data are transformed from 32 bit words to 10 bit or 40 bit respectively. | |
32 | //// The whole payload is transformed at once and written to an array. | |
33 | //// The single channels are decoded starting from the trailer word which is | |
34 | //// decoded by DecodeTrailer(Int_t pos) | |
35 | //// | |
36 | //// Authors: Roland Bramm, | |
37 | //// Stefan Kniege, IKF, Frankfurt | |
38 | //// | |
39 | ///////////////////////////////////////////////////////////////////////// | |
40 | ||
48265b32 | 41 | |
42 | #include "AliTPCMonitorAltro.h" | |
ca7b8371 | 43 | #include "AliLog.h" |
44 | #include <Riostream.h> | |
fb3305d1 | 45 | using namespace std; |
ca7b8371 | 46 | ClassImp(AliTPCMonitorAltro) |
48265b32 | 47 | |
48 | //_____________________________________________________________________________________________ | |
ca7b8371 | 49 | AliTPCMonitorAltro::AliTPCMonitorAltro(UInt_t* memory, Int_t size, Int_t fformat) : |
50 | fverb(0), | |
51 | fmemory(memory), | |
52 | fsize(size), | |
53 | f40BitArray(0), | |
54 | f10BitArray(0), | |
55 | fdecoderPos(0), | |
56 | fallocate40BitArray(false), | |
57 | fallocate10BitArray(false), | |
58 | foffset(0), | |
59 | fwrite10bit(0), | |
60 | fTrailerNWords(0), | |
61 | fTrailerHwAddress(0), | |
62 | fTrailerDataPos(0), | |
63 | fTrailerBlockPos(0), | |
64 | fTrailerPos(0), | |
65 | fNextPos(0), | |
66 | ffilename(new Char_t[256]) | |
48265b32 | 67 | { |
ca7b8371 | 68 | // Constructor: Set different CDH offsets for ROOT (0) and date format |
69 | // Data offset can be changed via SetDataOffset(Int_t val) | |
70 | ||
48265b32 | 71 | if( fformat==0) foffset=7; // old CHD Format |
ca7b8371 | 72 | else if(fformat==1) foffset=8; // memory pointer from DATE (start CDH) |
73 | else if(fformat==2) foffset=0; // memory pointer from ROOT (after CDH) | |
48265b32 | 74 | } |
75 | ||
ca7b8371 | 76 | |
77 | //_____________________________________________________________________________________________ | |
78 | AliTPCMonitorAltro::AliTPCMonitorAltro(const AliTPCMonitorAltro &altro) : | |
79 | TNamed(altro), | |
80 | fverb(altro.fverb), | |
81 | fmemory(altro.fmemory), | |
82 | fsize(altro.fsize), | |
83 | f40BitArray(altro.f40BitArray), | |
84 | f10BitArray(altro.f10BitArray), | |
85 | fdecoderPos(altro.fdecoderPos), | |
86 | fallocate40BitArray(altro.fallocate40BitArray), | |
87 | fallocate10BitArray(altro.fallocate10BitArray), | |
88 | foffset(altro.foffset), | |
89 | fwrite10bit(altro.fwrite10bit), | |
90 | fTrailerNWords(altro.fTrailerNWords), | |
91 | fTrailerHwAddress(altro.fTrailerHwAddress), | |
92 | fTrailerDataPos(altro.fTrailerDataPos), | |
93 | fTrailerBlockPos(altro.fTrailerBlockPos), | |
94 | fTrailerPos(altro.fTrailerPos), | |
95 | fNextPos(altro.fNextPos), | |
96 | ffilename(new Char_t[strlen(altro.ffilename)+1]) | |
97 | { | |
98 | // copy constructor | |
99 | strcpy(ffilename,altro.ffilename); | |
100 | ||
101 | } | |
102 | ||
103 | //_____________________________________________________________________________________________ | |
104 | AliTPCMonitorAltro &AliTPCMonitorAltro::operator =(const AliTPCMonitorAltro& altro) | |
105 | { | |
106 | // assignement operator | |
107 | ||
108 | if(this!=&altro){ | |
109 | ((TNamed *)this)->operator=(altro); | |
110 | fverb=altro.fverb; | |
111 | fmemory=altro.fmemory; | |
112 | fsize=altro.fsize; | |
113 | f40BitArray=altro.f40BitArray; | |
114 | f10BitArray=altro.f10BitArray; | |
115 | fdecoderPos=altro.fdecoderPos; | |
116 | fallocate40BitArray=altro.fallocate40BitArray; | |
117 | fallocate10BitArray=altro.fallocate10BitArray; | |
118 | foffset=altro.foffset; | |
119 | fwrite10bit=altro.fwrite10bit; | |
120 | fTrailerNWords=altro.fTrailerNWords; | |
121 | fTrailerHwAddress=altro.fTrailerHwAddress; | |
122 | fTrailerDataPos=altro.fTrailerDataPos; | |
123 | fTrailerBlockPos=altro.fTrailerBlockPos; | |
124 | fTrailerPos=altro.fTrailerPos; | |
125 | fNextPos=altro.fNextPos; | |
126 | ffilename = new Char_t[strlen(altro.ffilename)+1]; | |
127 | strcpy(ffilename,altro.ffilename); | |
128 | } | |
129 | return *this; | |
130 | } | |
131 | ||
132 | ||
48265b32 | 133 | //_____________________________________________________________________________________________ |
134 | AliTPCMonitorAltro::~AliTPCMonitorAltro() { | |
135 | // Destructor | |
136 | if(fallocate40BitArray == true) delete[] f40BitArray; | |
137 | if(fallocate10BitArray == true) delete[] f10BitArray; | |
138 | delete[] ffilename; | |
139 | } | |
140 | ||
141 | //_____________________________________________________________________________________________ | |
142 | void AliTPCMonitorAltro::Allocate40BitArray() | |
143 | { | |
144 | // create array for 40 bit decoded data | |
145 | fallocate40BitArray = true; | |
146 | f40BitArray = new long long[Get40BitArraySize()]; | |
147 | } | |
148 | ||
149 | //_____________________________________________________________________________________________ | |
150 | void AliTPCMonitorAltro::Allocate10BitArray() | |
151 | { | |
152 | // Create array for 10 bit decoded data | |
153 | fallocate10BitArray = true; | |
154 | f10BitArray = new Short_t[Get10BitArraySize()]; | |
fb3305d1 | 155 | } |
48265b32 | 156 | |
157 | //_____________________________________________________________________________________________ | |
158 | long long *AliTPCMonitorAltro::Get40BitArray() | |
159 | { | |
160 | // Return pointer to array for 40 bit decoded data | |
161 | return f40BitArray; | |
162 | } | |
163 | ||
164 | //_____________________________________________________________________________________________ | |
165 | Short_t *AliTPCMonitorAltro::Get10BitArray() | |
166 | { | |
167 | // Return pointer to array for 10 bit decoded data | |
168 | return f10BitArray; | |
169 | } | |
170 | ||
fb3305d1 | 171 | // //_____________________________________________________________________________________________ |
172 | // Int_t AliTPCMonitorAltro::Get40BitArraySize() | |
173 | // { | |
174 | // // Return number of 40 bit words in payload | |
175 | // return fmemory[fsize-1]; | |
176 | // } | |
177 | ||
178 | // //_____________________________________________________________________________________________ | |
179 | // Int_t AliTPCMonitorAltro::Get10BitArraySize() | |
180 | // { | |
181 | // // Return number of 10 bit words in payload | |
182 | // return fmemory[fsize-1]*4; | |
183 | // } | |
48265b32 | 184 | |
185 | //_____________________________________________________________________________________________ | |
186 | void AliTPCMonitorAltro::Decodeto40Bit() | |
187 | { | |
188 | // Decode 32 bit words in fmemory to 40 bit words | |
189 | Long64_t blackbox = 0; | |
190 | Int_t rest; | |
191 | ||
192 | for(Int_t i = 0; i < Get40BitArraySize(); i++) | |
193 | { | |
194 | rest = i%4; | |
195 | switch(rest) { | |
196 | case 0: | |
ca7b8371 | 197 | blackbox = (fmemory[foffset]) + (((Long64_t)(fmemory[foffset+1]&fgk08BitOn))<<32); |
48265b32 | 198 | foffset +=1; |
199 | break; | |
200 | case 1: | |
ca7b8371 | 201 | blackbox = (fmemory[foffset]>>8 ) + (((Long64_t)(fmemory[foffset+1]&fgk16BitOn))<<24); |
48265b32 | 202 | foffset +=1; |
203 | break; | |
204 | case 2: | |
ca7b8371 | 205 | blackbox = (fmemory[foffset]>>16) + (((Long64_t)(fmemory[foffset+1]&fgk24BitOn))<<16); |
48265b32 | 206 | foffset +=1; |
207 | break; | |
208 | case 3: | |
209 | blackbox = (fmemory[foffset]>>24) + (((Long64_t)(fmemory[foffset+1] ))<< 8); | |
210 | foffset +=2; | |
211 | break; | |
212 | default: | |
213 | blackbox = 0; | |
214 | break; | |
215 | } | |
216 | f40BitArray[i] = blackbox; | |
217 | } | |
218 | } | |
219 | ||
220 | //_____________________________________________________________________________________________ | |
221 | void AliTPCMonitorAltro::Decodeto10Bit(Int_t equipment) | |
222 | { | |
223 | // Decode 32 bit words in fmemory to 10 bit words. | |
224 | // Write words to file if fwrite10bit ("Write 10 bit" in Monitor.C Gui ) is set | |
225 | ||
226 | Long64_t blackbox = 0; | |
227 | Int_t rest = 0; | |
228 | ||
229 | ofstream datout; | |
230 | if(fwrite10bit) | |
231 | { | |
232 | Char_t nameout[256] ; sprintf(nameout,"%s_PayloadEquipmentId_%03i.txt",ffilename,equipment); | |
233 | datout.open(nameout); | |
234 | AliInfo(Form("AliTPCMonitorAltro::decodeto10Bit : Write Data to %s",nameout)); | |
235 | if(foffset==0) datout << "Payload without CDH in 10bit words " << endl; | |
236 | else datout << "CDH in 32 bit hex words words (" << foffset << " lines ) followed by payload in 10 bit words " << endl; | |
237 | for(Int_t ih = 0; ih< foffset ; ih++) | |
238 | { | |
239 | datout << hex << fmemory[ih] << endl; | |
240 | } | |
241 | } | |
242 | ||
243 | for(Int_t ind = 0; ind < Get40BitArraySize(); ind++) | |
244 | { | |
245 | rest = ind%4; | |
246 | switch(rest) | |
247 | { | |
248 | case 0: | |
ca7b8371 | 249 | blackbox = (fmemory[foffset]) + (((Long64_t)(fmemory[foffset+1]&fgk08BitOn))<<32); |
48265b32 | 250 | foffset +=1; |
251 | break; | |
252 | case 1: | |
ca7b8371 | 253 | blackbox = (fmemory[foffset]>>8 ) + (((Long64_t)(fmemory[foffset+1]&fgk16BitOn))<<24); |
48265b32 | 254 | foffset +=1; |
255 | break; | |
256 | case 2: | |
ca7b8371 | 257 | blackbox = (fmemory[foffset]>>16) + (((Long64_t)(fmemory[foffset+1]&fgk24BitOn))<<16); |
48265b32 | 258 | foffset +=1; |
259 | break; | |
260 | case 3: | |
261 | blackbox = (fmemory[foffset]>>24) + (((Long64_t)(fmemory[foffset+1] ))<< 8); | |
262 | foffset +=2; | |
263 | break; | |
264 | default: | |
265 | blackbox = 0; | |
266 | break; | |
267 | } | |
ca7b8371 | 268 | f10BitArray[ind*4+0] = (Short_t)( blackbox & fgkmask10 ) ; |
269 | f10BitArray[ind*4+1] = (Short_t)((blackbox & fgkmask20)>>10); | |
270 | f10BitArray[ind*4+2] = (Short_t)((blackbox & fgkmask30)>>20); | |
271 | f10BitArray[ind*4+3] = (Short_t)((blackbox & fgkmask40)>>30); | |
48265b32 | 272 | } |
273 | if(fwrite10bit) | |
274 | { | |
275 | for(Int_t ind = 0; ind < Get40BitArraySize(); ind++) | |
276 | { | |
277 | datout << dec << f10BitArray[ind*4+0] << "\n"; | |
278 | datout << dec << f10BitArray[ind*4+1] << "\n"; | |
279 | datout << dec << f10BitArray[ind*4+2] << "\n"; | |
280 | datout << dec << f10BitArray[ind*4+3] << "\n"; | |
281 | } | |
282 | } | |
283 | ||
284 | if(fwrite10bit) datout.close(); | |
285 | } | |
286 | ||
287 | //_____________________________________________________________________________________________ | |
288 | Int_t AliTPCMonitorAltro::DecodeTrailer(Int_t pos) | |
289 | { | |
290 | // Decode the trailer word starting at position pos in fmemory | |
291 | // Check if information leads to proper next trailer position | |
292 | ||
293 | fTrailerPos = pos; | |
294 | if(pos<=4) return 0; | |
295 | ||
296 | Long64_t words = 0; | |
297 | Long64_t tail = 0; | |
298 | Long64_t trailer = 0; | |
299 | Long64_t carry = 0; | |
300 | Long64_t rest = 0 ; | |
301 | ||
302 | for(Long64_t iter = 0 ; iter<4;iter++) | |
303 | { | |
304 | carry = f10BitArray[pos-iter] ; | |
305 | carry = ( carry << (30- ((iter)*10))); | |
306 | trailer += carry ; | |
307 | } | |
308 | ||
ca7b8371 | 309 | fTrailerHwAddress = (trailer & ((Long64_t )fgkTrailerMaskHardw) ); |
310 | words = (Long64_t )( (trailer & ((Long64_t )fgkTrailerMaskNWords))>>16); | |
311 | tail = (Long64_t )( (trailer & ((Long64_t )fgkTrailerMaskTail ))>>26 ); | |
48265b32 | 312 | |
313 | if(words%4!=0) rest = 4-(words%4); | |
314 | fTrailerNWords = words+rest ; | |
315 | fTrailerDataPos = pos -4 -rest ; | |
316 | fTrailerBlockPos = pos -4 ; | |
317 | fNextPos = (pos -fTrailerNWords -4); | |
318 | ||
ca7b8371 | 319 | if( tail!=fgkTrailerTail ) { AliError(Form("Could not read Trailer. \"Write 10bit\" for this event. Last Trailer line (2AA): %i. Supp.next Trailer line (2AA): %i ",pos,fNextPos)); return -1; } |
48265b32 | 320 | else if( fNextPos==-1 ) { /* was last channel */ return 0; } |
321 | else if( fNextPos <0 ) { AliError("Next Trailer position < 0 "); return -1; } | |
322 | else if((f10BitArray[fNextPos]!=682)) { AliError(Form("Could not find tail (2AA) at next supposed position %i",fNextPos)); return -1; } | |
323 | else { return fNextPos;} | |
324 | ||
325 | } | |
326 | ||
327 | ||
328 |