]>
Commit | Line | Data |
---|---|---|
dc7ca31d | 1 | #include "AliT0RawReader.h" |
e0bba6cc | 2 | #include "AliT0Parameters.h" |
dc7ca31d | 3 | #include "AliBitPacking.h" |
4 | #include "TBits.h" | |
5 | ||
6 | #include <Riostream.h> | |
7 | #include "TMath.h" | |
8 | #include "TH1F.h" | |
9 | #include "TArrayI.h" | |
10 | #include "AliLog.h" | |
11 | ||
12 | ClassImp(AliT0RawReader) | |
13 | ||
e0bba6cc | 14 | AliT0RawReader::AliT0RawReader (AliRawReader *rawReader) |
dc7ca31d | 15 | : TTask("T0RawReader","read raw T0 data"), |
dc7ca31d | 16 | fRawReader(rawReader), |
17 | fData(NULL), | |
18 | fPosition(0) | |
19 | { | |
20 | // | |
21 | // create an object to read T0raw digits | |
22 | AliDebug(1,"Start "); | |
dc7ca31d | 23 | |
24 | fRawReader->Reset(); | |
25 | fRawReader->Select("T0"); | |
26 | ||
dc7ca31d | 27 | } |
28 | AliT0RawReader::~AliT0RawReader () | |
29 | { | |
30 | // | |
31 | } | |
c41ceaac | 32 | /* |
33 | AliT0RawReader::AliT0RawReader(const AliT0RawReader& o): TTask(o), | |
34 | fRawReader(rawReader), | |
35 | fData(NULL), | |
36 | fPosition(0) | |
37 | { | |
38 | // | |
39 | } | |
40 | */ | |
41 | ||
dc7ca31d | 42 | |
43 | Bool_t AliT0RawReader::Next() | |
44 | { | |
45 | // read the next raw digit | |
46 | // returns kFALSE if there is no digit left | |
47 | //"LookUpTable": | |
48 | // Amplitude LED TRM=0; chain=0; TDC 0 -5 channel 0,2,4,6 | |
49 | // Time CFD TRM=0; chain=0; TDC 6 - 11 channel 0,2,4,6 | |
50 | // mean time TRM=0; chain=0; TDC 12 channel 0 | |
51 | // T0A TRM=0; chain=0; TDC 12 channel 2 | |
52 | // T0C TRM=0; chain=0; TDC 12 channel 4 | |
53 | // vertex TRM=0; chain=0; TDC 12 channel 6 | |
54 | // mult QTC0 TRM=0; chain=0; TDC 13 channel 0 | |
55 | // mult QTC1 TRM=0; chain=0; TDC 13 channel 2 | |
56 | ||
57 | // Charge QTC0 TRM=1; chain=0; TDC 0 -5 channel 0,2,4,6 | |
58 | // Charge QTC1 TRM=1; chain=0; TDC 6 - 11 channel 0,2,4,6 | |
59 | // T0A trigger TRM=1; chain=0; TDC 12 channel 0 | |
60 | // T0C trigger TRM=1; chain=0; TDC 12 channel 2 | |
61 | // vertex trigger TRM=1; chain=0; TDC 12 channel 4 | |
62 | // trigger central TRM=1; chain=0; TDC 13 channel 0 | |
63 | // tigger semicenral TRM=1; chain=0; TDC 13 channel 2 | |
64 | // | |
65 | // allData array collect data from all channels in one : | |
66 | // allData[0] - allData[23] 24 CFD channels | |
67 | // allData[24] - allData[47] 24 LED channels | |
68 | // allData[48] mean (T0) signal | |
69 | // allData[49] time difference (vertex) | |
70 | ||
e0bba6cc | 71 | |
dc7ca31d | 72 | UInt_t word; |
5325480c | 73 | Int_t time=0, itdc=0, ichannel=0, uu; |
dc7ca31d | 74 | Int_t numberOfWordsInTRM=0, iTRM=0; |
5325480c | 75 | Int_t tdcTime, koef,hit=0; |
76 | Int_t koefhits[110]; | |
e0bba6cc | 77 | |
5325480c | 78 | Int_t fDRM_GLOBAL_HEADER = 0x40000001; |
79 | Int_t fDRM_GLOBAL_TRAILER = 0x50000001; | |
80 | ||
81 | Int_t TRM_GLOBAL_HEADER = 0x40000000; | |
82 | Int_t TRM_CHAIN_0_HEADER = 0x00000000; | |
83 | Int_t TRM_CHAIN_1_HEADER = 0x20000000; | |
84 | Int_t TRM_CHAIN_0_TRAILER = 0x10000000; | |
85 | Int_t TRM_CHAIN_1_TRAILER = 0x30000000; | |
86 | Int_t TRM_GLOBAL_TRAILER = 0x5000000f; | |
94c27e4f | 87 | |
88 | Int_t FILLER = 0x70000000; | |
5325480c | 89 | |
90 | AliT0Parameters* param = AliT0Parameters::Instance(); | |
76f3b07a | 91 | |
5325480c | 92 | Int_t fNTRM = param->GetNumberOfTRMs(); |
e0bba6cc | 93 | |
94 | for ( Int_t k=0; k<110; k++) { | |
5325480c | 95 | koefhits[k]=0; |
96 | for ( Int_t jj=0; jj<5; jj++) { | |
97 | fAllData[k][jj]=0; | |
98 | } | |
e0bba6cc | 99 | } |
100 | do { | |
dc7ca31d | 101 | if (!fRawReader->ReadNextData(fData)) return kFALSE; |
102 | } while (fRawReader->GetDataSize() == 0); | |
103 | ||
104 | // fPosition = GetPosition(); | |
105 | fPosition = 0; | |
5325480c | 106 | // cout.setf( ios_base::hex, ios_base::basefield ); |
dc7ca31d | 107 | |
108 | //DRM header | |
5325480c | 109 | for (Int_t i=0; i<6; i++) { |
110 | word = GetNextWord(); | |
111 | uu = word&fDRM_GLOBAL_HEADER; | |
112 | if(uu != fDRM_GLOBAL_HEADER ) | |
113 | { | |
aee6a11a | 114 | AliWarning(Form(" !!!! wrong DRM header %x!!!!", word)); |
115 | fRawReader->AddFatalErrorLog(kWrongDRMHeader,Form("w=%x",word)); | |
5325480c | 116 | break; |
117 | } | |
118 | } | |
119 | ||
120 | for (Int_t ntrm=0; ntrm< fNTRM; ntrm++) | |
121 | { | |
c41ceaac | 122 | //TRMheader |
123 | word = GetNextWord(); | |
5325480c | 124 | uu = word&TRM_GLOBAL_HEADER; |
125 | if(uu != TRM_GLOBAL_HEADER ) | |
126 | { | |
aee6a11a | 127 | AliWarning(Form(" !!!! wrong TRM header %x!!!!", word)); |
128 | fRawReader->AddMajorErrorLog(kWrongTRMHeader,Form("w=%x",word)); | |
5325480c | 129 | break; |
130 | } | |
c41ceaac | 131 | numberOfWordsInTRM=AliBitPacking::UnpackWord(word,4,16); |
132 | iTRM=AliBitPacking::UnpackWord(word,0,3); | |
133 | ||
134 | //chain header | |
c41ceaac | 135 | word = GetNextWord(); |
5325480c | 136 | uu = word & TRM_CHAIN_0_HEADER; |
137 | if(uu != TRM_CHAIN_0_HEADER) | |
138 | { | |
aee6a11a | 139 | AliWarning(Form(" !!!! wrong CHAIN 0 header %x!!!!", word)); |
140 | fRawReader->AddMajorErrorLog(kWrongChain0Header,Form("w=%x",word)); | |
5325480c | 141 | break; |
142 | } | |
143 | Int_t ichain=AliBitPacking::UnpackWord(word,0,3); | |
c41ceaac | 144 | |
5325480c | 145 | for (Int_t i=0; i<numberOfWordsInTRM-6; i++) { |
c41ceaac | 146 | word = GetNextWord(); |
147 | tdcTime = AliBitPacking::UnpackWord(word,31,31); | |
148 | ||
149 | if ( tdcTime == 1) | |
150 | { | |
151 | itdc=AliBitPacking::UnpackWord(word,24,27); | |
152 | ichannel=AliBitPacking::UnpackWord(word,21,23); | |
153 | time=AliBitPacking::UnpackWord(word,0,20); | |
c41ceaac | 154 | koef = param->GetChannel(iTRM,itdc,ichain,ichannel); |
5325480c | 155 | if (koef ==-1 ){ |
aee6a11a | 156 | AliWarning(Form("Incorrect lookup table ! ")); |
157 | fRawReader->AddMajorErrorLog(kIncorrectLUT); | |
5325480c | 158 | break; |
159 | } | |
160 | hit=koefhits[koef]; | |
161 | if(fAllData[koef][hit] == 0) fAllData[koef][hit]=time; | |
162 | koefhits[koef]++; | |
163 | // cout<<koef<<" "<<iTRM<<" "<<itdc<<" "<<ichannel<<" "<<time<<endl; | |
c41ceaac | 164 | |
165 | } | |
166 | } | |
5325480c | 167 | word = GetNextWord(); //chain 0 trailer |
168 | uu = word&TRM_CHAIN_0_TRAILER; | |
169 | if(uu != TRM_CHAIN_0_TRAILER ) | |
170 | { | |
aee6a11a | 171 | AliWarning(Form(" !!!! wrong CHAIN 0 trailer %x !!!!", word)); |
172 | fRawReader->AddMajorErrorLog(kWrongChain0Trailer,Form("w=%x",word)); | |
5325480c | 173 | break; |
174 | } | |
175 | ||
176 | ||
177 | word = GetNextWord(); //chain 1 header | |
178 | uu = word & TRM_CHAIN_1_HEADER; | |
179 | if(uu != TRM_CHAIN_1_HEADER) | |
180 | { | |
aee6a11a | 181 | AliWarning(Form(" !!!! wrong CHAIN 1 header %x !!!!", word)); |
182 | fRawReader->AddMajorErrorLog(kWrongChain1Header,Form("w=%x",word)); | |
5325480c | 183 | break; |
184 | } | |
c41ceaac | 185 | word = GetNextWord(); //chain trailer |
5325480c | 186 | uu = word&TRM_CHAIN_1_TRAILER; |
187 | if(uu != TRM_CHAIN_1_TRAILER ) | |
188 | { | |
aee6a11a | 189 | AliWarning(Form(" !!!! wrong CHAIN 1 trailer %x!!!!", word)); |
190 | fRawReader->AddMajorErrorLog(kWrongChain1Trailer,Form("w=%x",word)); | |
191 | break; | |
5325480c | 192 | } |
193 | ||
c41ceaac | 194 | word = GetNextWord(); //TRM trailer |
5325480c | 195 | uu = word& TRM_GLOBAL_TRAILER; |
196 | if(uu != TRM_GLOBAL_TRAILER ) | |
197 | { | |
aee6a11a | 198 | AliWarning(Form(" !!!! wrong TRM GLOBAL trailer %x!!!!", word)); |
199 | fRawReader->AddMajorErrorLog(kWrongTRMTrailer,Form("w=%x",word)); | |
5325480c | 200 | break; |
201 | } | |
94c27e4f | 202 | } //TRM loop end |
203 | ||
5325480c | 204 | word = GetNextWord(); // |
aee6a11a | 205 | if (word == FILLER ) { word = GetNextWord(); } |
5325480c | 206 | uu = word& fDRM_GLOBAL_TRAILER; |
207 | if(uu != fDRM_GLOBAL_TRAILER ) | |
208 | { | |
aee6a11a | 209 | AliWarning(Form(" !!!! wrong DRM GLOBAL trailer %x!!!!", word)); |
210 | fRawReader->AddFatalErrorLog(kWrongDRMTrailer,Form("w=%x",word)); | |
5325480c | 211 | // break; |
212 | } | |
213 | ||
dc7ca31d | 214 | return kTRUE; |
215 | } | |
216 | //_____________________________________________________________________________ | |
dc7ca31d | 217 | Int_t AliT0RawReader::GetPosition() |
218 | { | |
219 | // Sets the position in the | |
220 | // input stream | |
aee6a11a | 221 | if (((fRawReader->GetDataSize() * 8) % 32) != 0) { |
222 | AliWarning(Form("Incorrect raw data size ! %d words are found !",fRawReader->GetDataSize())); | |
223 | fRawReader->AddFatalErrorLog(kIncorrectDataSize,Form("s=%d",fRawReader->GetDataSize())); | |
224 | } | |
dc7ca31d | 225 | return (fRawReader->GetDataSize() * 8) / 32; |
226 | } | |
227 | //_____________________________________________________________________________ | |
228 | UInt_t AliT0RawReader::GetNextWord() | |
229 | { | |
230 | // Read the next 32 bit word in backward direction | |
231 | // The input stream access is given by fData and fPosition | |
232 | ||
233 | ||
234 | // fPosition--; | |
235 | Int_t iBit = fPosition * 32; | |
236 | Int_t iByte = iBit / 8; | |
237 | ||
238 | UInt_t word = 0; | |
239 | word = fData[iByte+3]<<24; | |
240 | word |= fData[iByte+2]<<16; | |
241 | word |= fData[iByte+1]<<8; | |
242 | word |= fData[iByte]; | |
243 | fPosition++; | |
244 | ||
245 | return word; | |
246 | ||
247 | } | |
248 |