]> git.uio.no Git - u/mrichter/AliRoot.git/blame_incremental - T0/AliT0RawReader.cxx
Bug fix, the equalized sums were completely wrong.
[u/mrichter/AliRoot.git] / T0 / AliT0RawReader.cxx
... / ...
CommitLineData
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
22//
23#include "AliT0RawReader.h"
24#include "AliT0Parameters.h"
25#include "AliBitPacking.h"
26#include "TBits.h"
27
28#include <Riostream.h>
29#include "TMath.h"
30#include "TH1F.h"
31#include "TArrayI.h"
32#include "AliLog.h"
33
34using std::cout;
35using std::endl;
36using std::ios_base;
37ClassImp(AliT0RawReader)
38
39 AliT0RawReader::AliT0RawReader (AliRawReader *rawReader, Bool_t isOnline)
40 : TTask("T0RawReader","read raw T0 data"),
41 fRawReader(rawReader),
42 fData(NULL),
43 fPosition(0),
44 fParam(NULL),
45 fIsOnline(isOnline),
46 fBunchID(0),
47 fPrintout(kFALSE)
48
49{
50 //
51// create an object to read T0raw digits
52 AliDebug(1,"Start ");
53
54 fRawReader->Reset();
55 fRawReader->Select("T0");
56 fParam = AliT0Parameters::Instance();
57 if (fIsOnline)
58 fParam->InitIfOnline();
59 else
60 fParam->Init();
61
62}
63 AliT0RawReader::~AliT0RawReader ()
64{
65 //
66}
67/*
68AliT0RawReader::AliT0RawReader(const AliT0RawReader& o): TTask(o),
69 fRawReader(rawReader),
70 fData(NULL),
71 fPosition(0)
72{
73 //
74}
75*/
76
77
78Bool_t AliT0RawReader::Next()
79{
80// read the next raw digit
81// returns kFALSE if there is no digit left
82//"LookUpTable":
83// Amplitude LED TRM=0; chain=0; TDC 0 -5 channel 0,2,4,6
84// Time CFD TRM=0; chain=0; TDC 6 - 11 channel 0,2,4,6
85// mean time TRM=0; chain=0; TDC 12 channel 0
86// T0A TRM=0; chain=0; TDC 12 channel 2
87// T0C TRM=0; chain=0; TDC 12 channel 4
88// vertex TRM=0; chain=0; TDC 12 channel 6
89// mult QTC0 TRM=0; chain=0; TDC 13 channel 0
90// mult QTC1 TRM=0; chain=0; TDC 13 channel 2
91
92// Charge QTC0 TRM=1; chain=0; TDC 0 -5 channel 0,2,4,6
93// Charge QTC1 TRM=1; chain=0; TDC 6 - 11 channel 0,2,4,6
94// T0A trigger TRM=1; chain=0; TDC 12 channel 0
95// T0C trigger TRM=1; chain=0; TDC 12 channel 2
96// vertex trigger TRM=1; chain=0; TDC 12 channel 4
97// trigger central TRM=1; chain=0; TDC 13 channel 0
98// tigger semicenral TRM=1; chain=0; TDC 13 channel 2
99//
100// allData array collect data from all channels in one :
101// allData[0] - allData[23] 24 CFD channels
102// allData[24] - allData[47] 24 LED channels
103// allData[48] mean (T0) signal
104// allData[49] time difference (vertex)
105
106 UInt_t word;
107 Int_t time=0, itdc=0, ichannel=0, uu;
108 Int_t numberOfWordsInTRM=0, iTRM=0;
109 Int_t tdcTime, koef,hit=0;
110 Int_t koefhits[110];
111 Int_t trm_chain_header = 0x00000000;
112 Int_t trm_chain_trailer = 0x10000000;
113
114 UInt_t filler = 0x70000000;
115 Bool_t correct=kTRUE;
116 Int_t header;
117
118 Int_t fNTRM = fParam->GetNumberOfTRMs();
119 for ( Int_t k=0; k<110; k++) {
120 koefhits[k]=0;
121 for ( Int_t jj=0; jj<5; jj++) {
122 fAllData[k][jj]=0;
123 }
124 }
125 do {
126 if (!fRawReader->ReadNextData(fData)) return kFALSE;
127 } while (fRawReader->GetDataSize() == 0);
128
129 fPosition = 0;
130 // cout.setf( ios_base::hex, ios_base::basefield );
131 if(fPrintout)
132 cout<<" CDH :: BC ID "<< (fRawReader->GetBCID())<<
133 " Event size"<<fRawReader->GetDataSize()<<
134 " orbit ID "<<fRawReader->GetOrbitID()<<
135 " event index "<<fRawReader->GetEventIndex()<<
136 " event type " <<fRawReader->GetType()<<endl;
137 //DRM header
138 for (Int_t i=0; i<6; i++) {
139 word = GetNextWord();
140 if(fPrintout && i==0) cout<<" DRM header:: event words "<<AliBitPacking::UnpackWord(word,4, 20);
141 // cout<<i<<" DRM header "<<word<<endl;
142 if (fPrintout && i==4 ) cout<<" L0BC ID "<< AliBitPacking::UnpackWord(word,4, 15)<<endl;
143 header = AliBitPacking::UnpackWord(word,28,31);
144 if( header !=4 )
145 {
146 AliWarning(Form(" !!!! wrong DRM header %x!!!!", word));
147 fRawReader->AddFatalErrorLog(kWrongDRMHeader,Form("w=%x",word));
148 break;
149 }
150 }
151 for (Int_t ntrm=0; ntrm< fNTRM; ntrm++)
152 {
153 //TRMheader
154 word = GetNextWord();
155 // cout<<" TRM "<<word<<endl;
156 header = AliBitPacking::UnpackWord(word,28,31);
157 if ( header != 4 )
158 {
159 AliWarning(Form(" !!!! wrong TRM header %x!!!!", word));
160 fRawReader->AddMajorErrorLog(kWrongTRMHeader,Form("w=%x",word));
161 break;
162 }
163 numberOfWordsInTRM=AliBitPacking::UnpackWord(word,4,16);
164 if(fPrintout) {
165 cout<<" TRM header :: event words "<<numberOfWordsInTRM;
166 cout<<" ACQ bits "<<AliBitPacking::UnpackWord(word,17,18);
167 cout<<" L bit "<<AliBitPacking::UnpackWord(word,19,19)<<endl;
168 }
169 iTRM=AliBitPacking::UnpackWord(word,0,3);
170 for( Int_t ichain=0; ichain<2; ichain++)
171 {
172 //chain header
173 word = GetNextWord();
174 // cout<<" chain header "<<word<<endl;
175 uu = word & trm_chain_header;
176 if(uu != trm_chain_header)
177 {
178 AliWarning(Form(" !!!! wrong CHAIN 0 header %x!!!!", word));
179 fRawReader->AddMajorErrorLog(kWrongChain0Header,Form("w=%x",word));
180 break;
181 }
182 fBunchID=AliBitPacking::UnpackWord(word,4,15);
183 if(fPrintout)
184 cout<<" chain "<< ichain<<" header:: BunchID "<<fBunchID;
185 word = GetNextWord();
186 // cout<<" next word "<<word<<endl;
187 tdcTime = AliBitPacking::UnpackWord(word,31,31);
188 // for (; tdcTime==1; tdcTime)
189 while(tdcTime==1)
190 {
191 correct = kTRUE;
192 itdc=AliBitPacking::UnpackWord(word,24,27);
193 ichannel=AliBitPacking::UnpackWord(word,21,23);
194 time=AliBitPacking::UnpackWord(word,0,20);
195
196 koef = fParam->GetChannel(iTRM,itdc,ichain,ichannel);
197 if (koef != 0 )
198 // cout<<"RawReader>> "<<"koef "<<koef<<" trm "<<iTRM<<
199 // " tdc "<<itdc<<" chain "<<ichain<<
200 // " channel "<<ichannel<<" time "<<time<<endl;
201 if (koef ==-1 ){
202 AliWarning(Form("Incorrect lookup table ! "));
203 fRawReader->AddMajorErrorLog(kIncorrectLUT);
204 correct=kFALSE;
205 }
206 if(correct){
207 hit=koefhits[koef];
208 if(hit>4) {
209 AliDebug(10,Form("Too many hits for %i channel - %i ! ",koef,koefhits[koef] ));
210 hit=4;
211 }
212 fAllData[koef][hit]=time;
213 koefhits[koef]++;
214 }
215 word = GetNextWord();
216
217 tdcTime = AliBitPacking::UnpackWord(word,31,31);
218
219 }
220
221 // cout<<" trailer :: "<<word<<endl;
222 uu = word&trm_chain_trailer;
223 if(uu != trm_chain_trailer )
224 {
225 AliWarning(Form(" !!!! wrong CHAIN 0 trailer %x !!!!", word));
226 fRawReader->AddMajorErrorLog(kWrongChain0Trailer,Form("w=%x",word));
227 break;
228 }
229 if(fPrintout)
230 cout<<" trailer:: event counter "<< AliBitPacking::UnpackWord(word,16,27)<<endl;
231 }
232
233 word = GetNextWord(); //TRM trailer
234 // cout<<" TRM trailer "<<word<<endl;
235 header = AliBitPacking::UnpackWord(word,28,31);
236 if( header !=5 )
237 {
238 AliWarning(Form(" !!!! wrong TRM GLOBAL trailer %x!!!!", word));
239 fRawReader->AddMajorErrorLog(kWrongTRMTrailer,Form("w=%x",word));
240 break;
241 }
242 if(fPrintout)
243 cout<<" TRM trailer :: event counter "<< AliBitPacking::UnpackWord(word,16,27)<<endl;
244 } //TRM loop
245 word = GetNextWord(); //
246 // cout<<" after TRM trailer "<<word<<endl;
247 if (word == filler ) word = GetNextWord();
248 header = AliBitPacking::UnpackWord(word,28,31);
249 if( header !=5 )
250 {
251 AliWarning(Form(" !!!! wrong DRM GLOBAL trailer %x!!!!", word));
252 fRawReader->AddFatalErrorLog(kWrongDRMTrailer,Form("w=%x",word));
253 }
254 if(fPrintout)
255 cout<<" DRM trailer ::event counter "<< AliBitPacking::UnpackWord(word,4,15)<<endl;
256 cout.setf( ios_base::dec, ios_base::basefield );
257
258 return kTRUE;
259}
260//_____________________________________________________________________________
261Int_t AliT0RawReader::GetPosition()
262{
263 // Sets the position in the
264 // input stream
265 if (((fRawReader->GetDataSize() * 8) % 32) != 0)
266 AliFatal(Form("Incorrect raw data size ! %d words are found !",fRawReader->GetDataSize()));
267 return (fRawReader->GetDataSize() * 8) / 32;
268}
269//_____________________________________________________________________________
270UInt_t AliT0RawReader::GetNextWord()
271{
272 // Read the next 32 bit word in backward direction
273 // The input stream access is given by fData and fPosition
274
275
276 // fPosition--;
277 Int_t iBit = fPosition * 32;
278 Int_t iByte = iBit / 8;
279
280 UInt_t word = 0;
281 word = fData[iByte+3]<<24;
282 word |= fData[iByte+2]<<16;
283 word |= fData[iByte+1]<<8;
284 word |= fData[iByte];
285 fPosition++;
286
287 return word;
288
289}
290