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