]>
Commit | Line | Data |
---|---|---|
2906f4c2 | 1 | /************************************************************************** |
1fd93b67 | 2 | * Copyright(c) 2007-2009, ALICE Experiment at CERN, All rights reserved. * |
2906f4c2 | 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 | /* $Id$ */ | |
17 | ||
18 | /////////////////////////////////////////////////////////////////////////////// | |
19 | /// | |
20 | /// This class provides access to ITS SPD digits in raw data. | |
21 | /// | |
22 | /////////////////////////////////////////////////////////////////////////////// | |
23 | ||
24 | #include "AliITSRawStreamSPD.h" | |
25 | #include "AliRawReader.h" | |
d9edae7b | 26 | #include "AliLog.h" |
2906f4c2 | 27 | |
28 | ClassImp(AliITSRawStreamSPD) | |
29 | ||
30 | ||
c42b9ed0 | 31 | // this map has to change, waiting for the new geometry |
2906f4c2 | 32 | const Int_t AliITSRawStreamSPD::fgkDDLModuleMap[kDDLsNumber][kModulesPerDDL] = { |
33 | { 0, 1, 4, 5, 80, 81, 84, 85, 88, 89, 92, 93}, | |
2906f4c2 | 34 | { 8, 9,12,13, 96, 97,100,101,104,105,108,109}, |
2906f4c2 | 35 | {16,17,20,21,112,113,116,117,120,121,124,125}, |
2906f4c2 | 36 | {24,25,28,29,128,129,132,133,136,137,140,141}, |
2906f4c2 | 37 | {32,33,36,37,144,145,148,149,152,153,156,157}, |
2906f4c2 | 38 | {40,41,44,45,160,161,164,165,168,169,172,173}, |
2906f4c2 | 39 | {48,49,52,53,176,177,180,181,184,185,188,189}, |
2906f4c2 | 40 | {56,57,60,61,192,193,196,197,200,201,204,205}, |
2906f4c2 | 41 | {64,65,68,69,208,209,212,213,216,217,220,221}, |
2906f4c2 | 42 | {72,73,76,77,224,225,228,229,232,233,236,237}, |
72600597 | 43 | { 2, 3, 6, 7, 82, 83, 86, 87, 90, 91, 94, 95}, |
44 | {10,11,14,15, 98, 99,102,103,106,107,110,111}, | |
45 | {18,19,22,23,114,115,118,119,122,123,126,127}, | |
46 | {26,27,30,31,130,131,134,135,138,139,142,143}, | |
47 | {34,35,38,39,146,147,150,151,154,155,158,159}, | |
48 | {42,43,46,47,162,163,166,167,170,171,174,175}, | |
49 | {50,51,54,55,178,179,182,183,186,187,190,191}, | |
50 | {58,59,62,63,194,195,198,199,202,203,206,207}, | |
51 | {66,67,70,71,210,211,214,215,218,219,222,223}, | |
2906f4c2 | 52 | {74,75,78,79,226,227,230,231,234,235,238,239} |
53 | }; | |
54 | ||
55 | ||
56 | AliITSRawStreamSPD::AliITSRawStreamSPD(AliRawReader* rawReader) : | |
57 | AliITSRawStream(rawReader), | |
d9edae7b | 58 | fEventNumber(-1),fChipAddr(0),fHalfStaveNr(0),fCol(0),fRow(0), |
c42b9ed0 | 59 | fData(0),fOffset(0),fHitCount(0), |
60 | fDataChar1(0),fDataChar2(0),fDataChar3(0),fDataChar4(0), | |
61 | fFirstWord(kTRUE),fPrevEventId(0xffffffff) | |
2906f4c2 | 62 | { |
c42b9ed0 | 63 | // create an object to read ITS SPD raw digits |
362c9d61 | 64 | fRawReader->Select("ITSSPD"); |
c42b9ed0 | 65 | // reset calib header words |
66 | for (UInt_t iword=0; iword<kCalHeadLenMax; iword++) { | |
67 | fCalHeadWord[iword]=0xffffffff; | |
68 | } | |
69 | NewEvent(); | |
2906f4c2 | 70 | } |
71 | ||
72600597 | 72 | Bool_t AliITSRawStreamSPD::ReadNextShort() |
73 | { | |
c42b9ed0 | 74 | // read next 16 bit word into fData |
72600597 | 75 | if (fFirstWord) { |
72600597 | 76 | Bool_t b1 = fRawReader->ReadNextChar(fDataChar1); |
77 | if (!b1) return kFALSE; | |
78 | Bool_t b2, b3, b4; | |
79 | b2 = fRawReader->ReadNextChar(fDataChar2); | |
80 | b3 = fRawReader->ReadNextChar(fDataChar3); | |
81 | b4 = fRawReader->ReadNextChar(fDataChar4); | |
82 | if (!(b2 && b3 && b4)) { | |
83 | return kFALSE; | |
84 | } | |
85 | fData = fDataChar3+(fDataChar4<<8); | |
c42b9ed0 | 86 | if ((*fRawReader->GetEventId())!=fPrevEventId) { // if new event... |
87 | NewEvent(); | |
88 | fPrevEventId=(*fRawReader->GetEventId()); | |
89 | } | |
90 | fFirstWord=kFALSE; | |
72600597 | 91 | } |
92 | else { | |
93 | fFirstWord=kTRUE; | |
94 | fData = fDataChar1+(fDataChar2<<8); | |
95 | } | |
96 | ||
97 | return kTRUE; | |
98 | } | |
99 | ||
c42b9ed0 | 100 | Bool_t AliITSRawStreamSPD::ReadNextInt() |
72600597 | 101 | { |
c42b9ed0 | 102 | // reads next 32 bit into fDataChar1..4 |
103 | // (if first 16 bits read already, just completes the present word) | |
104 | if (fFirstWord) { | |
105 | if (ReadNextShort() && ReadNextShort()) { | |
106 | return kTRUE; | |
107 | } | |
108 | } | |
109 | else { | |
110 | if (ReadNextShort()) { | |
111 | return kTRUE; | |
112 | } | |
113 | } | |
114 | return kFALSE; | |
115 | } | |
116 | ||
117 | void AliITSRawStreamSPD::NewEvent() | |
118 | { | |
119 | // call this to reset flags for a new event | |
120 | for (UInt_t eqId=0; eqId<20; eqId++) { | |
121 | fCalHeadRead[eqId]=kFALSE; | |
122 | } | |
123 | fEventNumber=-1; | |
124 | } | |
125 | ||
126 | Bool_t AliITSRawStreamSPD::ReadCalibHeader() | |
127 | { | |
128 | // read the extra calibration header | |
129 | // returns kTRUE if the header is present and has length > 0 | |
72600597 | 130 | |
c42b9ed0 | 131 | Int_t ddlID = fRawReader->GetDDLID(); |
132 | if (ddlID==-1) { // we may need to read one word to get the blockAttr | |
133 | if (!ReadNextShort()) return kFALSE; | |
134 | ddlID = fRawReader->GetDDLID(); | |
135 | } | |
72600597 | 136 | UChar_t attr = fRawReader->GetBlockAttributes(); |
c42b9ed0 | 137 | if (ddlID>=0 && ddlID<20) fCalHeadRead[ddlID]=kTRUE; |
72600597 | 138 | if ((attr & 0x40) == 0x40) { // is the header present? |
c42b9ed0 | 139 | if (ReadNextInt()) { |
72600597 | 140 | // length of cal header: |
141 | UInt_t calLen = fDataChar1+(fDataChar2<<8)+(fDataChar3<<16)+(fDataChar4<<24); | |
c42b9ed0 | 142 | if (calLen>kCalHeadLenMax) { |
d9edae7b | 143 | fRawReader->AddMajorErrorLog(kCalHeaderLengthErr,Form("Header length %d > max = %d",calLen,kCalHeadLenMax)); |
144 | AliWarning(Form("Header length problem. %d > %d (max)",calLen,kCalHeadLenMax)); | |
c42b9ed0 | 145 | return kFALSE; |
146 | } | |
147 | else if (calLen>0) { | |
148 | for (UInt_t iword=0; iword<calLen; iword++) { | |
149 | if (ReadNextInt()) { | |
150 | fCalHeadWord[iword] = fDataChar1+(fDataChar2<<8)+(fDataChar3<<16)+(fDataChar4<<24); | |
151 | } | |
152 | else { | |
d9edae7b | 153 | fRawReader->AddMajorErrorLog(kCalHeaderLengthErr,"header length problem"); |
154 | AliWarning("header length problem"); | |
c42b9ed0 | 155 | return kFALSE; |
156 | } | |
157 | } | |
158 | return kTRUE; | |
72600597 | 159 | } |
160 | } | |
161 | } | |
c42b9ed0 | 162 | |
163 | return kFALSE; | |
72600597 | 164 | } |
2906f4c2 | 165 | |
166 | Bool_t AliITSRawStreamSPD::Next() | |
167 | { | |
168 | // read the next raw digit | |
169 | // returns kFALSE if there is no digit left | |
170 | ||
c42b9ed0 | 171 | Int_t ddlID=-1; |
2906f4c2 | 172 | fPrevModuleID = fModuleID; |
c42b9ed0 | 173 | |
72600597 | 174 | while (ReadNextShort()) { |
c42b9ed0 | 175 | |
176 | ddlID = fRawReader->GetDDLID(); | |
177 | if (ddlID>=0 && ddlID<20) { | |
178 | if (!fCalHeadRead[ddlID]) { | |
179 | ReadCalibHeader(); | |
180 | } | |
181 | } | |
182 | else { | |
d9edae7b | 183 | fRawReader->AddMajorErrorLog(kDDLNumberErr,Form("Wrong DDL number %d",ddlID)); |
184 | AliWarning(Form("DDL number error (= %d) , setting it to 19", ddlID)); | |
c42b9ed0 | 185 | ddlID=19; |
186 | } | |
187 | ||
72600597 | 188 | if ((fData & 0xC000) == 0x4000) { // header |
2906f4c2 | 189 | fHitCount = 0; |
190 | UShort_t eventNumber = (fData >> 4) & 0x007F; | |
191 | if (fEventNumber < 0) { | |
192 | fEventNumber = eventNumber; | |
72600597 | 193 | } |
194 | else if (eventNumber != fEventNumber) { | |
d9edae7b | 195 | fRawReader->AddMajorErrorLog(kEventNumberErr,Form("Reading event number %d instead of %d",eventNumber,fEventNumber)); |
196 | AliWarning(Form("mismatching event numbers: %d != %d",eventNumber, fEventNumber)); | |
2906f4c2 | 197 | } |
c42b9ed0 | 198 | fChipAddr = fData & 0x000F; |
199 | if (fChipAddr>9) { | |
d9edae7b | 200 | fRawReader->AddMajorErrorLog(kChipAddrErr,Form("Overflow chip address %d - set to 9",fChipAddr)); |
201 | AliWarning(Form("overflow chip addr (= %d) , setting it to 9", fChipAddr)); | |
c42b9ed0 | 202 | fChipAddr=9; |
2906f4c2 | 203 | } |
c42b9ed0 | 204 | fHalfStaveNr = (fData & 0x3800)>>11; |
205 | if (fHalfStaveNr>5 || fRawReader->TestBlockAttribute(fHalfStaveNr)) { | |
d9edae7b | 206 | fRawReader->AddMajorErrorLog(kStaveNumberErr,Form("Half stave number error %d - set to 5",fHalfStaveNr)); |
207 | AliWarning(Form("half stave number error(=%d) , setting it to 5", fHalfStaveNr)); | |
c42b9ed0 | 208 | fHalfStaveNr=5; |
2906f4c2 | 209 | } |
c42b9ed0 | 210 | // translate ("online") ddl, hs, chip nr to ("offline") module id : |
211 | fModuleID = fgkDDLModuleMap[ddlID][fHalfStaveNr*2+fChipAddr/5]; | |
212 | fOffset = 32 * (fChipAddr % 5); | |
72600597 | 213 | } |
214 | else if ((fData & 0xC000) == 0x0000) { // trailer | |
2906f4c2 | 215 | UShort_t hitCount = fData & 0x1FFF; |
d9edae7b | 216 | if (hitCount != fHitCount){ |
217 | fRawReader->AddMajorErrorLog(kNumbHitsErr,Form("Number of hits %d instead of %d",hitCount,fHitCount)); | |
218 | AliWarning(Form("wrong number of hits: %d != %d", fHitCount, hitCount)); | |
219 | } | |
220 | } | |
72600597 | 221 | else if ((fData & 0xC000) == 0x8000) { // pixel hit |
2906f4c2 | 222 | fHitCount++; |
c42b9ed0 | 223 | fCol = (fData & 0x001F); |
224 | fRow = (fData >> 5) & 0x00FF; | |
225 | ||
226 | // translate ("online") chipcol, chiprow to ("offline") col (coord1), row (coord2): | |
227 | // This will change, waiting for new geometry!!! | |
228 | fCoord1 = fCol; | |
229 | // if (fModuleID < 80 && ddlID < 10) fCoord1=31-fCoord1; | |
230 | // else if (fModuleID >=80 && ddlID >=10) fCoord1=31-fCoord1; | |
231 | fCoord1 += fOffset; | |
232 | // if (ddlID>=10) fCoord1=159-fCoord1; | |
233 | fCoord2 = fRow; | |
234 | // if (fModuleID<80) fCoord2=255-fCoord2; | |
235 | ||
2906f4c2 | 236 | return kTRUE; |
72600597 | 237 | } |
238 | else { // fill word | |
d9edae7b | 239 | if ((fData & 0xC000) != 0xC000) { |
240 | fRawReader->AddMajorErrorLog(kWrongWordErr,"Wrong fill word"); | |
241 | AliWarning("wrong fill word!"); | |
242 | } | |
2906f4c2 | 243 | } |
244 | ||
245 | } | |
246 | ||
247 | return kFALSE; | |
248 | } | |
c42b9ed0 | 249 | Bool_t AliITSRawStreamSPD::GetHalfStavePresent(UInt_t hs) { |
250 | // Reads the half stave present status from the block attributes | |
251 | Int_t ddlID = fRawReader->GetDDLID(); | |
252 | if (ddlID==-1) { | |
d9edae7b | 253 | fRawReader->AddMinorErrorLog(kHalfStaveStatusErr,"DDL ID = -1. Cannot read block attributes."); |
254 | AliWarning("DDL ID = -1. Cannot read block attributes. Return kFALSE."); | |
c42b9ed0 | 255 | return kFALSE; |
256 | } | |
257 | else { | |
258 | if (hs>=6) { | |
d9edae7b | 259 | fRawReader->AddMinorErrorLog(kHalfStaveStatusErr,Form( "HS >= 6 requested (%d). Return kFALSE.",hs)); |
260 | AliWarning(Form("HS >= 6 requested (%d). Return kFALSE.",hs)); | |
c42b9ed0 | 261 | return kFALSE; |
262 | } | |
263 | UChar_t attr = fRawReader->GetBlockAttributes(); | |
264 | if (((attr>>hs) & 0x01) == 0x01) { // bit set means not present | |
265 | return kFALSE; | |
266 | } | |
267 | else { | |
268 | return kTRUE; | |
269 | } | |
270 | } | |
271 | } | |
272 | ||
273 | Bool_t AliITSRawStreamSPD::GetHhalfStaveScanned(UInt_t hs) const { | |
274 | if (hs<6) return (Bool_t)((fCalHeadWord[0]>>(6+hs)) & (0x00000001)); | |
275 | else return kFALSE; | |
276 | } | |
277 | Bool_t AliITSRawStreamSPD::GetHchipPresent(UInt_t hs, UInt_t chip) const { | |
278 | if (hs<6 && chip<10) return ((( fCalHeadWord[hs/3+3]>>((hs%3)*10+chip)) & 0x00000001) == 1); | |
279 | else return kFALSE; | |
280 | } | |
281 | UInt_t AliITSRawStreamSPD::GetHdacHigh(UInt_t hs) const { | |
282 | if (hs<6) return (fCalHeadWord[hs/2+7]>>(24-16*(hs%2)) & 0x000000ff); | |
283 | else return 0; | |
284 | } | |
285 | UInt_t AliITSRawStreamSPD::GetHdacLow(UInt_t hs) const { | |
286 | if (hs<6) return (fCalHeadWord[hs/2+7]>>(16-16*(hs%2)) & 0x000000ff); | |
287 | else return 0; | |
288 | } | |
289 | UInt_t AliITSRawStreamSPD::GetHTPAmp(UInt_t hs) const { | |
290 | if (hs<6) return fCalHeadWord[hs+10]; | |
291 | else return 0; | |
292 | } | |
1fd93b67 | 293 | Bool_t AliITSRawStreamSPD::GetHminTHchipPresent(UInt_t chip) const { |
294 | if (chip<10) return ((( fCalHeadWord[7]>>(16+chip)) & 0x00000001) == 1); | |
295 | else return kFALSE; | |
296 | } |