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