1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
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 **************************************************************************/
18 //____________________________________________________________________
21 // Class for reading T0 RAW data in TOF data format
23 #include "AliT0RawReader.h"
24 #include "AliT0Parameters.h"
25 #include "AliBitPacking.h"
28 #include <Riostream.h>
37 ClassImp(AliT0RawReader)
39 AliT0RawReader::AliT0RawReader (AliRawReader *rawReader, Bool_t isOnline)
40 : TTask("T0RawReader","read raw T0 data"),
41 fRawReader(rawReader),
51 // create an object to read T0raw digits
55 fRawReader->Select("T0");
56 fParam = AliT0Parameters::Instance();
58 fParam->InitIfOnline();
63 AliT0RawReader::~AliT0RawReader ()
68 AliT0RawReader::AliT0RawReader(const AliT0RawReader& o): TTask(o),
69 fRawReader(rawReader),
78 Bool_t AliT0RawReader::Next()
80 // read the next raw digit
81 // returns kFALSE if there is no digit left
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
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
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)
107 Int_t time=0, itdc=0, ichannel=0, uu;
108 Int_t numberOfWordsInTRM=0, iTRM=0;
109 Int_t tdcTime, koef,hit=0;
111 Int_t trm_chain_header = 0x00000000;
112 Int_t trm_chain_trailer = 0x10000000;
114 UInt_t filler = 0x70000000;
115 Bool_t correct=kTRUE;
118 Int_t fNTRM = fParam->GetNumberOfTRMs();
119 for ( Int_t k=0; k<110; k++) {
121 for ( Int_t jj=0; jj<5; jj++) {
126 if (!fRawReader->ReadNextData(fData)) return kFALSE;
127 } while (fRawReader->GetDataSize() == 0);
130 // cout.setf( ios_base::hex, ios_base::basefield );
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;
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);
146 AliWarning(Form(" !!!! wrong DRM header %x!!!!", word));
147 fRawReader->AddFatalErrorLog(kWrongDRMHeader,Form("w=%x",word));
151 for (Int_t ntrm=0; ntrm< fNTRM; ntrm++)
154 word = GetNextWord();
155 // cout<<" TRM "<<word<<endl;
156 header = AliBitPacking::UnpackWord(word,28,31);
159 AliWarning(Form(" !!!! wrong TRM header %x!!!!", word));
160 fRawReader->AddMajorErrorLog(kWrongTRMHeader,Form("w=%x",word));
163 numberOfWordsInTRM=AliBitPacking::UnpackWord(word,4,16);
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;
169 iTRM=AliBitPacking::UnpackWord(word,0,3);
170 for( Int_t ichain=0; ichain<2; ichain++)
173 word = GetNextWord();
174 // cout<<" chain header "<<word<<endl;
175 uu = word & trm_chain_header;
176 if(uu != trm_chain_header)
178 AliWarning(Form(" !!!! wrong CHAIN 0 header %x!!!!", word));
179 fRawReader->AddMajorErrorLog(kWrongChain0Header,Form("w=%x",word));
182 fBunchID=AliBitPacking::UnpackWord(word,4,15);
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)
192 itdc=AliBitPacking::UnpackWord(word,24,27);
193 ichannel=AliBitPacking::UnpackWord(word,21,23);
194 time=AliBitPacking::UnpackWord(word,0,20);
196 koef = fParam->GetChannel(iTRM,itdc,ichain,ichannel);
198 // cout<<"RawReader>> "<<"koef "<<koef<<" trm "<<iTRM<<
199 // " tdc "<<itdc<<" chain "<<ichain<<
200 // " channel "<<ichannel<<" time "<<time<<endl;
202 AliWarning(Form("Incorrect lookup table ! "));
203 fRawReader->AddMajorErrorLog(kIncorrectLUT);
209 AliDebug(10,Form("Too many hits for %i channel - %i ! ",koef,koefhits[koef] ));
212 fAllData[koef][hit]=time;
215 word = GetNextWord();
217 tdcTime = AliBitPacking::UnpackWord(word,31,31);
221 // cout<<" trailer :: "<<word<<endl;
222 uu = word&trm_chain_trailer;
223 if(uu != trm_chain_trailer )
225 AliWarning(Form(" !!!! wrong CHAIN 0 trailer %x !!!!", word));
226 fRawReader->AddMajorErrorLog(kWrongChain0Trailer,Form("w=%x",word));
230 cout<<" trailer:: event counter "<< AliBitPacking::UnpackWord(word,16,27)<<endl;
233 word = GetNextWord(); //TRM trailer
234 // cout<<" TRM trailer "<<word<<endl;
235 header = AliBitPacking::UnpackWord(word,28,31);
238 AliWarning(Form(" !!!! wrong TRM GLOBAL trailer %x!!!!", word));
239 fRawReader->AddMajorErrorLog(kWrongTRMTrailer,Form("w=%x",word));
243 cout<<" TRM trailer :: event counter "<< AliBitPacking::UnpackWord(word,16,27)<<endl;
245 word = GetNextWord(); //
246 // cout<<" after TRM trailer "<<word<<endl;
247 if (word == filler ) word = GetNextWord();
248 header = AliBitPacking::UnpackWord(word,28,31);
251 AliWarning(Form(" !!!! wrong DRM GLOBAL trailer %x!!!!", word));
252 fRawReader->AddFatalErrorLog(kWrongDRMTrailer,Form("w=%x",word));
255 cout<<" DRM trailer ::event counter "<< AliBitPacking::UnpackWord(word,4,15)<<endl;
256 cout.setf( ios_base::dec, ios_base::basefield );
260 //_____________________________________________________________________________
261 Int_t AliT0RawReader::GetPosition()
263 // Sets the position in the
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;
269 //_____________________________________________________________________________
270 UInt_t AliT0RawReader::GetNextWord()
272 // Read the next 32 bit word in backward direction
273 // The input stream access is given by fData and fPosition
277 Int_t iBit = fPosition * 32;
278 Int_t iByte = iBit / 8;
281 word = fData[iByte+3]<<24;
282 word |= fData[iByte+2]<<16;
283 word |= fData[iByte+1]<<8;
284 word |= fData[iByte];