]>
Commit | Line | Data |
---|---|---|
f16935f7 | 1 | /************************************************************************** |
2 | * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. * | |
3 | * * | |
4 | * Author: The ALICE Off-line Project. * | |
5 | * Contributors are mentioned in the code where appropriate. * | |
6 | * * | |
7 | * Permission to use, copy, modify and distribute this software and its * | |
8 | * documentation strictly for non-commercial purposes is hereby granted * | |
9 | * without fee, provided that the above copyright notice appears in all * | |
10 | * copies and that both the copyright notice and this permission notice * | |
11 | * appear in the supporting documentation. The authors make no claims * | |
12 | * about the suitability of this software for any purpose. It is * | |
13 | * provided "as is" without express or implied warranty. * | |
14 | **************************************************************************/ | |
15 | ||
16 | /* $Id: */ | |
17 | ||
18 | //____________________________________________________________________ | |
19 | // | |
20 | // T0 | |
21 | // Class for reading T0 RAW data in TOF data format | |
94249139 | 22 | // Alla.Maevskaya@cern.ch |
f16935f7 | 23 | // |
94249139 | 24 | //____________________________________________________________________ |
25 | ||
dc7ca31d | 26 | #include "AliT0RawReader.h" |
e0bba6cc | 27 | #include "AliT0Parameters.h" |
dc7ca31d | 28 | #include "AliBitPacking.h" |
29 | #include "TBits.h" | |
30 | ||
94249139 | 31 | //#include <Riostream.h> |
dc7ca31d | 32 | #include "AliLog.h" |
33 | ||
34 | ClassImp(AliT0RawReader) | |
35 | ||
4a6b40d0 | 36 | AliT0RawReader::AliT0RawReader (AliRawReader *rawReader, Bool_t isOnline) |
dc7ca31d | 37 | : TTask("T0RawReader","read raw T0 data"), |
dc7ca31d | 38 | fRawReader(rawReader), |
39 | fData(NULL), | |
807a797f | 40 | fPosition(0), |
f8bea420 | 41 | fParam(NULL), |
4a6b40d0 | 42 | fIsOnline(isOnline) |
dc7ca31d | 43 | { |
44 | // | |
45 | // create an object to read T0raw digits | |
46 | AliDebug(1,"Start "); | |
dc7ca31d | 47 | |
48 | fRawReader->Reset(); | |
49 | fRawReader->Select("T0"); | |
29d3e0eb | 50 | fParam = AliT0Parameters::Instance(); |
51 | if (fIsOnline) | |
f8bea420 | 52 | fParam->InitIfOnline(); |
53 | else | |
54 | fParam->Init(); | |
29d3e0eb | 55 | |
dc7ca31d | 56 | } |
57 | AliT0RawReader::~AliT0RawReader () | |
58 | { | |
59 | // | |
60 | } | |
c41ceaac | 61 | |
dc7ca31d | 62 | |
63 | Bool_t AliT0RawReader::Next() | |
64 | { | |
65 | // read the next raw digit | |
66 | // returns kFALSE if there is no digit left | |
67 | //"LookUpTable": | |
68 | // Amplitude LED TRM=0; chain=0; TDC 0 -5 channel 0,2,4,6 | |
69 | // Time CFD TRM=0; chain=0; TDC 6 - 11 channel 0,2,4,6 | |
70 | // mean time TRM=0; chain=0; TDC 12 channel 0 | |
71 | // T0A TRM=0; chain=0; TDC 12 channel 2 | |
72 | // T0C TRM=0; chain=0; TDC 12 channel 4 | |
73 | // vertex TRM=0; chain=0; TDC 12 channel 6 | |
74 | // mult QTC0 TRM=0; chain=0; TDC 13 channel 0 | |
75 | // mult QTC1 TRM=0; chain=0; TDC 13 channel 2 | |
76 | ||
77 | // Charge QTC0 TRM=1; chain=0; TDC 0 -5 channel 0,2,4,6 | |
78 | // Charge QTC1 TRM=1; chain=0; TDC 6 - 11 channel 0,2,4,6 | |
79 | // T0A trigger TRM=1; chain=0; TDC 12 channel 0 | |
80 | // T0C trigger TRM=1; chain=0; TDC 12 channel 2 | |
81 | // vertex trigger TRM=1; chain=0; TDC 12 channel 4 | |
82 | // trigger central TRM=1; chain=0; TDC 13 channel 0 | |
83 | // tigger semicenral TRM=1; chain=0; TDC 13 channel 2 | |
84 | // | |
85 | // allData array collect data from all channels in one : | |
86 | // allData[0] - allData[23] 24 CFD channels | |
87 | // allData[24] - allData[47] 24 LED channels | |
88 | // allData[48] mean (T0) signal | |
89 | // allData[49] time difference (vertex) | |
90 | ||
e0bba6cc | 91 | |
dc7ca31d | 92 | UInt_t word; |
5325480c | 93 | Int_t time=0, itdc=0, ichannel=0, uu; |
dc7ca31d | 94 | Int_t numberOfWordsInTRM=0, iTRM=0; |
5325480c | 95 | Int_t tdcTime, koef,hit=0; |
96 | Int_t koefhits[110]; | |
94249139 | 97 | Int_t trmChainHeader = 0x00000000; |
98 | Int_t trmChainTrailer = 0x10000000; | |
807a797f | 99 | |
f16935f7 | 100 | Int_t filler = 0x70000000; |
807a797f | 101 | Bool_t correct=kTRUE; |
102 | Int_t header; | |
4a6b40d0 | 103 | |
f8bea420 | 104 | Int_t fNTRM = fParam->GetNumberOfTRMs(); |
f8bea420 | 105 | for ( Int_t k=0; k<110; k++) { |
807a797f | 106 | koefhits[k]=0; |
107 | for ( Int_t jj=0; jj<5; jj++) { | |
108 | fAllData[k][jj]=0; | |
f8bea420 | 109 | } |
110 | } | |
e0bba6cc | 111 | do { |
807a797f | 112 | if (!fRawReader->ReadNextData(fData)) return kFALSE; |
113 | } while (fRawReader->GetDataSize() == 0); | |
114 | ||
807a797f | 115 | fPosition = 0; |
27e6a69e | 116 | // cout.setf( ios_base::hex, ios_base::basefield ); |
807a797f | 117 | |
118 | //DRM header | |
5325480c | 119 | for (Int_t i=0; i<6; i++) { |
120 | word = GetNextWord(); | |
27e6a69e | 121 | if(i==0 && AliBitPacking::UnpackWord(word,4,20) ==7) fNTRM=0; |
f16935f7 | 122 | // cout<<" DRM header "<<word<<endl; |
807a797f | 123 | header = AliBitPacking::UnpackWord(word,28,31); |
124 | if( header !=4 ) | |
5325480c | 125 | { |
29d3e0eb | 126 | AliWarning(Form(" !!!! wrong DRM header %x!!!!", word)); |
127 | fRawReader->AddFatalErrorLog(kWrongDRMHeader,Form("w=%x",word)); | |
5325480c | 128 | break; |
807a797f | 129 | } |
5325480c | 130 | } |
27e6a69e | 131 | // cout<<" nTRMs "<<fNTRM<<endl; |
94249139 | 132 | for (Int_t ntrm=0; ntrm< fNTRM; ntrm++) |
807a797f | 133 | { |
134 | //TRMheader | |
135 | word = GetNextWord(); | |
29d3e0eb | 136 | header = AliBitPacking::UnpackWord(word,28,31); |
27e6a69e | 137 | Int_t event = AliBitPacking::UnpackWord(word,4,15); |
138 | // cout<<" TRM header "<<word<<" event "<<event<<endl; | |
29d3e0eb | 139 | if ( header != 4 ) |
140 | { | |
141 | AliWarning(Form(" !!!! wrong TRM header %x!!!!", word)); | |
142 | fRawReader->AddMajorErrorLog(kWrongTRMHeader,Form("w=%x",word)); | |
143 | break; | |
144 | } | |
807a797f | 145 | numberOfWordsInTRM=AliBitPacking::UnpackWord(word,4,16); |
27e6a69e | 146 | //cout<<" numberOfWordsInTRM "<<numberOfWordsInTRM<<endl; |
807a797f | 147 | iTRM=AliBitPacking::UnpackWord(word,0,3); |
807a797f | 148 | for( Int_t ichain=0; ichain<2; ichain++) |
c41ceaac | 149 | { |
807a797f | 150 | //chain header |
151 | word = GetNextWord(); | |
27e6a69e | 152 | // cout<<" chain header "<<word<<endl; |
94249139 | 153 | uu = word & trmChainHeader; |
154 | if(uu != trmChainHeader) | |
807a797f | 155 | { |
29d3e0eb | 156 | AliWarning(Form(" !!!! wrong CHAIN 0 header %x!!!!", word)); |
157 | fRawReader->AddMajorErrorLog(kWrongChain0Header,Form("w=%x",word)); | |
807a797f | 158 | break; |
159 | } | |
160 | word = GetNextWord(); | |
27e6a69e | 161 | // cout<<" next "<<word<<endl; |
807a797f | 162 | tdcTime = AliBitPacking::UnpackWord(word,31,31); |
f16935f7 | 163 | while(tdcTime==1) |
807a797f | 164 | { |
f16935f7 | 165 | // cout<<" packed "<<word<<endl; |
807a797f | 166 | itdc=AliBitPacking::UnpackWord(word,24,27); |
167 | ichannel=AliBitPacking::UnpackWord(word,21,23); | |
168 | time=AliBitPacking::UnpackWord(word,0,20); | |
169 | ||
170 | koef = fParam->GetChannel(iTRM,itdc,ichain,ichannel); | |
f16935f7 | 171 | if (koef != 0 ) |
172 | // cout<<"RawReader>> "<<"koef "<<koef<<" trm "<<iTRM<< | |
173 | // " tdc "<<itdc<<" chain "<<ichain<< | |
174 | // " channel "<<ichannel<<" time "<<time<<endl; | |
807a797f | 175 | if (koef ==-1 ){ |
29d3e0eb | 176 | AliWarning(Form("Incorrect lookup table ! ")); |
177 | fRawReader->AddMajorErrorLog(kIncorrectLUT); | |
807a797f | 178 | correct=kFALSE; |
179 | } | |
180 | if(correct){ | |
181 | hit=koefhits[koef]; | |
c1469fdf | 182 | if(hit>5) { |
183 | AliWarning(Form("Too many hits for %i channel ! ",koef)); | |
184 | break; | |
185 | } | |
807a797f | 186 | fAllData[koef][hit]=time; |
187 | koefhits[koef]++; | |
188 | } | |
f16935f7 | 189 | word = GetNextWord(); |
190 | // cout<<" next word in cycle "<<word<<endl; | |
191 | tdcTime = AliBitPacking::UnpackWord(word,31,31); | |
807a797f | 192 | |
f16935f7 | 193 | } |
c41ceaac | 194 | |
27e6a69e | 195 | // cout<<" chain trailer "<<word<<endl; |
94249139 | 196 | uu = word&trmChainTrailer; |
197 | if(uu != trmChainTrailer ) | |
807a797f | 198 | { |
29d3e0eb | 199 | AliWarning(Form(" !!!! wrong CHAIN 0 trailer %x !!!!", word)); |
f16935f7 | 200 | fRawReader->AddMajorErrorLog(kWrongChain0Trailer,Form("w=%x",word)); |
807a797f | 201 | break; |
202 | } | |
203 | } | |
204 | ||
205 | word = GetNextWord(); //TRM trailer | |
f16935f7 | 206 | // cout<<" TRM trailer "<<word<<endl; |
807a797f | 207 | header = AliBitPacking::UnpackWord(word,28,31); |
208 | if( header !=5 ) | |
209 | { | |
29d3e0eb | 210 | AliWarning(Form(" !!!! wrong TRM GLOBAL trailer %x!!!!", word)); |
211 | fRawReader->AddMajorErrorLog(kWrongTRMTrailer,Form("w=%x",word)); | |
807a797f | 212 | break; |
213 | } | |
214 | } //TRM loop | |
215 | word = GetNextWord(); // | |
27e6a69e | 216 | // cout<<" after TRM trailer "<<word<<endl; |
f16935f7 | 217 | if (word == filler ) word = GetNextWord(); |
21ab892d | 218 | header = AliBitPacking::UnpackWord(word,28,31); |
219 | if( header !=5 ) | |
220 | { | |
221 | AliWarning(Form(" !!!! wrong DRM GLOBAL trailer %x!!!!", word)); | |
222 | fRawReader->AddFatalErrorLog(kWrongDRMTrailer,Form("w=%x",word)); | |
807a797f | 223 | } |
94249139 | 224 | // cout.setf( ios_base::dec, ios_base::basefield ); |
225 | ||
21ab892d | 226 | return kTRUE; |
dc7ca31d | 227 | } |
228 | //_____________________________________________________________________________ | |
dc7ca31d | 229 | Int_t AliT0RawReader::GetPosition() |
230 | { | |
231 | // Sets the position in the | |
232 | // input stream | |
807a797f | 233 | if (((fRawReader->GetDataSize() * 8) % 32) != 0) |
234 | AliFatal(Form("Incorrect raw data size ! %d words are found !",fRawReader->GetDataSize())); | |
dc7ca31d | 235 | return (fRawReader->GetDataSize() * 8) / 32; |
236 | } | |
237 | //_____________________________________________________________________________ | |
238 | UInt_t AliT0RawReader::GetNextWord() | |
239 | { | |
240 | // Read the next 32 bit word in backward direction | |
241 | // The input stream access is given by fData and fPosition | |
242 | ||
243 | ||
244 | // fPosition--; | |
245 | Int_t iBit = fPosition * 32; | |
246 | Int_t iByte = iBit / 8; | |
247 | ||
248 | UInt_t word = 0; | |
249 | word = fData[iByte+3]<<24; | |
250 | word |= fData[iByte+2]<<16; | |
251 | word |= fData[iByte+1]<<8; | |
252 | word |= fData[iByte]; | |
253 | fPosition++; | |
254 | ||
255 | return word; | |
256 | ||
257 | } | |
258 |