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