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