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