]>
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"); | |
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; | |
29d3e0eb | 90 | /* |
f8bea420 | 91 | AliT0Parameters* fParam = AliT0Parameters::Instance(); |
92 | if (fIsOnline) | |
93 | fParam->InitIfOnline(); | |
94 | else | |
95 | fParam->Init(); | |
29d3e0eb | 96 | */ |
f8bea420 | 97 | Int_t fNTRM = fParam->GetNumberOfTRMs(); |
f8bea420 | 98 | for ( Int_t k=0; k<110; k++) { |
807a797f | 99 | koefhits[k]=0; |
100 | for ( Int_t jj=0; jj<5; jj++) { | |
101 | fAllData[k][jj]=0; | |
f8bea420 | 102 | } |
103 | } | |
e0bba6cc | 104 | do { |
807a797f | 105 | if (!fRawReader->ReadNextData(fData)) return kFALSE; |
106 | } while (fRawReader->GetDataSize() == 0); | |
107 | ||
807a797f | 108 | fPosition = 0; |
29d3e0eb | 109 | // cout.setf( ios_base::hex, ios_base::basefield ); |
807a797f | 110 | |
111 | //DRM header | |
5325480c | 112 | for (Int_t i=0; i<6; i++) { |
113 | word = GetNextWord(); | |
807a797f | 114 | header = AliBitPacking::UnpackWord(word,28,31); |
115 | if( header !=4 ) | |
5325480c | 116 | { |
29d3e0eb | 117 | AliWarning(Form(" !!!! wrong DRM header %x!!!!", word)); |
118 | fRawReader->AddFatalErrorLog(kWrongDRMHeader,Form("w=%x",word)); | |
5325480c | 119 | break; |
807a797f | 120 | } |
5325480c | 121 | } |
122 | ||
807a797f | 123 | for (Int_t ntrm=0; ntrm< fNTRM; ntrm++) |
124 | { | |
125 | //TRMheader | |
126 | word = GetNextWord(); | |
29d3e0eb | 127 | header = AliBitPacking::UnpackWord(word,28,31); |
128 | if ( header != 4 ) | |
129 | { | |
130 | AliWarning(Form(" !!!! wrong TRM header %x!!!!", word)); | |
131 | fRawReader->AddMajorErrorLog(kWrongTRMHeader,Form("w=%x",word)); | |
132 | break; | |
133 | } | |
807a797f | 134 | numberOfWordsInTRM=AliBitPacking::UnpackWord(word,4,16); |
135 | iTRM=AliBitPacking::UnpackWord(word,0,3); | |
807a797f | 136 | for( Int_t ichain=0; ichain<2; ichain++) |
c41ceaac | 137 | { |
807a797f | 138 | //chain header |
139 | word = GetNextWord(); | |
140 | uu = word & TRM_CHAIN_0_HEADER; | |
141 | if(uu != TRM_CHAIN_0_HEADER) | |
142 | { | |
29d3e0eb | 143 | AliWarning(Form(" !!!! wrong CHAIN 0 header %x!!!!", word)); |
144 | fRawReader->AddMajorErrorLog(kWrongChain0Header,Form("w=%x",word)); | |
807a797f | 145 | break; |
146 | } | |
147 | word = GetNextWord(); | |
807a797f | 148 | tdcTime = AliBitPacking::UnpackWord(word,31,31); |
149 | for (; tdcTime==1; tdcTime) | |
150 | { | |
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); | |
807a797f | 156 | if (koef ==-1 ){ |
29d3e0eb | 157 | AliWarning(Form("Incorrect lookup table ! ")); |
158 | fRawReader->AddMajorErrorLog(kIncorrectLUT); | |
807a797f | 159 | correct=kFALSE; |
160 | } | |
161 | if(correct){ | |
162 | hit=koefhits[koef]; | |
807a797f | 163 | fAllData[koef][hit]=time; |
164 | koefhits[koef]++; | |
165 | } | |
166 | word = GetNextWord(); | |
807a797f | 167 | tdcTime = AliBitPacking::UnpackWord(word,31,31); |
168 | ||
5325480c | 169 | } |
c41ceaac | 170 | |
94c27e4f | 171 | |
807a797f | 172 | uu = word&TRM_CHAIN_0_TRAILER; |
173 | if(uu != TRM_CHAIN_0_TRAILER ) | |
174 | { | |
29d3e0eb | 175 | AliWarning(Form(" !!!! wrong CHAIN 0 trailer %x !!!!", word)); |
176 | fRawReader->AddMajorErrorLog(kWrongChain0Trailer,Form("w=%x",word)); | |
807a797f | 177 | break; |
178 | } | |
179 | } | |
180 | ||
181 | word = GetNextWord(); //TRM trailer | |
807a797f | 182 | header = AliBitPacking::UnpackWord(word,28,31); |
183 | if( header !=5 ) | |
184 | { | |
29d3e0eb | 185 | AliWarning(Form(" !!!! wrong TRM GLOBAL trailer %x!!!!", word)); |
186 | fRawReader->AddMajorErrorLog(kWrongTRMTrailer,Form("w=%x",word)); | |
807a797f | 187 | break; |
188 | } | |
189 | } //TRM loop | |
190 | word = GetNextWord(); // | |
29d3e0eb | 191 | header = AliBitPacking::UnpackWord(word,28,31); |
807a797f | 192 | uu = word&FILLER; |
193 | if (word == FILLER ) word = GetNextWord(); | |
807a797f | 194 | if( header !=5 ) |
195 | { | |
29d3e0eb | 196 | AliWarning(Form(" !!!! wrong DRM GLOBAL trailer %x!!!!", word)); |
197 | fRawReader->AddFatalErrorLog(kWrongDRMTrailer,Form("w=%x",word)); | |
807a797f | 198 | } |
199 | cout.setf( ios_base::dec, ios_base::basefield ); | |
200 | ||
201 | return kTRUE; | |
dc7ca31d | 202 | } |
203 | //_____________________________________________________________________________ | |
dc7ca31d | 204 | Int_t AliT0RawReader::GetPosition() |
205 | { | |
206 | // Sets the position in the | |
207 | // input stream | |
807a797f | 208 | if (((fRawReader->GetDataSize() * 8) % 32) != 0) |
209 | AliFatal(Form("Incorrect raw data size ! %d words are found !",fRawReader->GetDataSize())); | |
dc7ca31d | 210 | return (fRawReader->GetDataSize() * 8) / 32; |
211 | } | |
212 | //_____________________________________________________________________________ | |
213 | UInt_t AliT0RawReader::GetNextWord() | |
214 | { | |
215 | // Read the next 32 bit word in backward direction | |
216 | // The input stream access is given by fData and fPosition | |
217 | ||
218 | ||
219 | // fPosition--; | |
220 | Int_t iBit = fPosition * 32; | |
221 | Int_t iByte = iBit / 8; | |
222 | ||
223 | UInt_t word = 0; | |
224 | word = fData[iByte+3]<<24; | |
225 | word |= fData[iByte+2]<<16; | |
226 | word |= fData[iByte+1]<<8; | |
227 | word |= fData[iByte]; | |
228 | fPosition++; | |
229 | ||
230 | return word; | |
231 | ||
232 | } | |
233 |