1 #include "AliT0RawReader.h"
2 #include "AliT0Parameters.h"
3 #include "AliBitPacking.h"
12 ClassImp(AliT0RawReader)
14 AliT0RawReader::AliT0RawReader (AliRawReader *rawReader)
15 : TTask("T0RawReader","read raw T0 data"),
16 fRawReader(rawReader),
23 // create an object to read T0raw digits
27 fRawReader->Select("T0");
28 // AliT0Parameters* fParam = AliT0Parameters::Instance();
30 // fIsOnline = isOnline;
33 fParam->InitIfOnline();
38 AliT0RawReader::~AliT0RawReader ()
43 AliT0RawReader::AliT0RawReader(const AliT0RawReader& o): TTask(o),
44 fRawReader(rawReader),
53 Bool_t AliT0RawReader::Next()
55 // read the next raw digit
56 // returns kFALSE if there is no digit left
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
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
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)
83 Int_t time=0, itdc=0, ichannel=0, uu;
84 Int_t numberOfWordsInTRM=0, iTRM=0;
85 Int_t tdcTime, koef,hit=0;
87 // Int_t fDRM_GLOBAL_HEADER = 0x40000001;
88 // Int_t fDRM_GLOBAL_TRAILER = 0x50000001;
90 // Int_t TRM_GLOBAL_HEADER = 0x40000000;
91 Int_t TRM_CHAIN_0_HEADER = 0x00000000;
92 // Int_t TRM_CHAIN_1_HEADER = 0x20000000;
93 Int_t TRM_CHAIN_0_TRAILER = 0x10000000;
94 // Int_t TRM_CHAIN_1_TRAILER = 0x30000000;
95 // Int_t TRM_GLOBAL_TRAILER = 0x5000000f;
97 Int_t FILLER = 0x70000000;
101 AliT0Parameters* fParam = AliT0Parameters::Instance();
103 fParam->InitIfOnline();
107 Int_t fNTRM = fParam->GetNumberOfTRMs();
109 for ( Int_t k=0; k<110; k++) {
111 for ( Int_t jj=0; jj<5; jj++) {
116 if (!fRawReader->ReadNextData(fData)) return kFALSE;
117 } while (fRawReader->GetDataSize() == 0);
119 // fPosition = GetPosition();
121 cout.setf( ios_base::hex, ios_base::basefield );
124 for (Int_t i=0; i<6; i++) {
125 word = GetNextWord();
126 // cout<<" DRM header "<<i<<" "<<word<<endl;
127 header = AliBitPacking::UnpackWord(word,28,31);
129 // uu = word&fDRM_GLOBAL_HEADER;
130 // if(uu != fDRM_GLOBAL_HEADER )
132 AliError(Form(" !!!! wrong DRM header %x!!!!", word));
137 for (Int_t ntrm=0; ntrm< fNTRM; ntrm++)
140 word = GetNextWord();
141 // cout<<" TRM header "<<word<<" "<<AliBitPacking::UnpackWord(word,28,31)<<endl;
142 header = AliBitPacking::UnpackWord(word,28,31);
144 // uu = word&TRM_GLOBAL_HEADER;
145 // if(uu != TRM_GLOBAL_HEADER &&
148 AliError(Form(" !!!! wrong TRM header %x!!!!", word));
151 numberOfWordsInTRM=AliBitPacking::UnpackWord(word,4,16);
152 iTRM=AliBitPacking::UnpackWord(word,0,3);
153 // cout<<" iTRM "<<iTRM<<" Nworrds in TRM "<< numberOfWordsInTRM <<endl;
155 for( Int_t ichain=0; ichain<2; ichain++)
158 word = GetNextWord();
159 uu = word & TRM_CHAIN_0_HEADER;
160 if(uu != TRM_CHAIN_0_HEADER)
162 AliError(Form(" !!!! wrong CHAIN 0 header %x!!!!", word));
165 word = GetNextWord();
166 // cout<<" ???data?? "<<word<<endl;
167 tdcTime = AliBitPacking::UnpackWord(word,31,31);
168 for (; tdcTime==1; tdcTime)
170 itdc=AliBitPacking::UnpackWord(word,24,27);
171 ichannel=AliBitPacking::UnpackWord(word,21,23);
172 time=AliBitPacking::UnpackWord(word,0,20);
174 koef = fParam->GetChannel(iTRM,itdc,ichain,ichannel);
175 // cout<<"koef "<<koef<<" iTRM "<<iTRM<<" itdc "<<itdc<<" iChain "<<ichain<<" ichannel "<<ichannel<<" "<<time<<endl;
177 AliError(Form("Incorrect lookup table ! "));
182 //if(fAllData[koef][hit] == 0)
183 fAllData[koef][hit]=time;
186 word = GetNextWord();
187 // cout<<" next word "<<word<<endl;
188 tdcTime = AliBitPacking::UnpackWord(word,31,31);
193 uu = word&TRM_CHAIN_0_TRAILER;
194 if(uu != TRM_CHAIN_0_TRAILER )
196 AliError(Form(" !!!! wrong CHAIN 0 trailer %x !!!!", word));
201 word = GetNextWord(); //TRM trailer
202 // cout<<" TRM traier "<<word<<endl;
203 header = AliBitPacking::UnpackWord(word,28,31);
206 AliError(Form(" !!!! wrong TRM GLOBAL trailer %x!!!!", word));
210 word = GetNextWord(); //
211 header = AliBitPacking::UnpackWord(word,28,31);
213 if (word == FILLER ) word = GetNextWord();
214 // cout<<" word after FILLER "<<word<<endl;
217 AliError(Form(" !!!! wrong DRM GLOBAL trailer %x!!!!", word));
220 cout.setf( ios_base::dec, ios_base::basefield );
224 //_____________________________________________________________________________
225 Int_t AliT0RawReader::GetPosition()
227 // Sets the position in the
229 if (((fRawReader->GetDataSize() * 8) % 32) != 0)
230 AliFatal(Form("Incorrect raw data size ! %d words are found !",fRawReader->GetDataSize()));
231 return (fRawReader->GetDataSize() * 8) / 32;
233 //_____________________________________________________________________________
234 UInt_t AliT0RawReader::GetNextWord()
236 // Read the next 32 bit word in backward direction
237 // The input stream access is given by fData and fPosition
241 Int_t iBit = fPosition * 32;
242 Int_t iByte = iBit / 8;
245 word = fData[iByte+3]<<24;
246 word |= fData[iByte+2]<<16;
247 word |= fData[iByte+1]<<8;
248 word |= fData[iByte];