1 #include "AliSTARTRawReader.h"
2 #include "AliSTARTRawData.h"
3 #include "AliSTARTdigit.h"
4 #include "AliBitPacking.h"
13 ClassImp(AliSTARTRawReader)
15 AliSTARTRawReader::AliSTARTRawReader (AliRawReader *rawReader, TTree* tree)
16 : TTask("STARTRawReader","read raw START data"),
22 // create an object to read STARTraw digits
24 if (fDigits == 0x0) fDigits = new AliSTARTdigit();
25 fTree->Branch("START","AliSTARTdigit",&fDigits,405,1);
28 fRawReader->Select("START");
32 AliSTARTRawReader::~AliSTARTRawReader ()
37 Bool_t AliSTARTRawReader::Next()
39 // read the next raw digit
40 // returns kFALSE if there is no digit left
42 UInt_t word, unpackword;
44 TArrayI *timeTDC1 = new TArrayI(24);
45 TArrayI * chargeTDC1 = new TArrayI(24);
46 TArrayI *timeTDC2 = new TArrayI(24);
47 TArrayI *chargeTDC2 = new TArrayI(24);
50 if (!fRawReader->ReadNextData(fData)) return kFALSE;
51 } while (fRawReader->GetDataSize() == 0);
53 fPosition = GetPosition();
58 unpackword=AliBitPacking::UnpackWord(word,8,31);
63 unpackword=AliBitPacking::UnpackWord(word,0,8);
69 unpackword=AliBitPacking::UnpackWord(word,8,31);
74 unpackword=AliBitPacking::UnpackWord(word,0,8);
80 unpackword=AliBitPacking::UnpackWord(word,8,31);
85 unpackword=AliBitPacking::UnpackWord(word,0,8);
91 unpackword=AliBitPacking::UnpackWord(word,8,31);
96 unpackword=AliBitPacking::UnpackWord(word,0,8);
101 word = GetNextWord();
102 unpackword=AliBitPacking::UnpackWord(word,8,31);
106 word = GetNextWord();
107 unpackword=AliBitPacking::UnpackWord(word,0,8);
114 word = GetNextWord();
115 unpackword=AliBitPacking::UnpackWord(word,8,31);
119 word = GetNextWord();
120 unpackword=AliBitPacking::UnpackWord(word,0,8);
122 fDigits->SetSumMult(time);
124 // best time differece
127 word = GetNextWord();
128 unpackword=AliBitPacking::UnpackWord(word,8,31);
133 word = GetNextWord();
134 unpackword=AliBitPacking::UnpackWord(word,0,8);
136 fDigits->SetDiffTime(time);
140 word = GetNextWord();
141 unpackword=AliBitPacking::UnpackWord(word,8,31);
145 word = GetNextWord();
146 unpackword=AliBitPacking::UnpackWord(word,0,8);
148 fDigits->SetTimeBestLeft(time);
150 // Best time right &left
153 word = GetNextWord();
154 unpackword=AliBitPacking::UnpackWord(word,8,31);
160 word = GetNextWord();
161 unpackword=AliBitPacking::UnpackWord(word,0,8);
163 fDigits->SetTimeBestRight(time);
167 word = GetNextWord();
168 unpackword=AliBitPacking::UnpackWord(word,8,31);
174 word = GetNextWord();
175 unpackword=AliBitPacking::UnpackWord(word,0,8);
177 fDigits->SetMeanTime(time);
179 for (Int_t i=0; i<24; i++) //QTC amplified
184 word = GetNextWord();
185 unpackword=AliBitPacking::UnpackWord(word,8,31);
189 word = GetNextWord();
190 unpackword= AliBitPacking::UnpackWord(word,0,8);
192 chargeTDC2->AddAt(time,pmt-72);
195 for (Int_t i=0; i<24; i++)
200 word = GetNextWord();
201 unpackword=AliBitPacking::UnpackWord(word,8,31);
205 word = GetNextWord();
206 unpackword= AliBitPacking::UnpackWord(word,0,8);
208 chargeTDC1->AddAt(time,pmt-48);
211 for (Int_t i=0; i<24; i++) //time CFD
215 word = GetNextWord();
216 unpackword=AliBitPacking::UnpackWord(word,8,31);
220 word = GetNextWord();
221 unpackword=AliBitPacking::UnpackWord(word,0,8);
223 timeTDC2->AddAt(time,pmt-24);
227 for (Int_t i=0; i<24; i++) //time LED
231 word = GetNextWord();
232 unpackword=AliBitPacking::UnpackWord(word,8,31);
237 word = GetNextWord();
238 unpackword=AliBitPacking::UnpackWord(word,0,8);
240 timeTDC1->AddAt(time,pmt);
244 fDigits->SetTime(*timeTDC2);
245 fDigits->SetADC(*chargeTDC1);
247 fDigits->SetTimeAmp(*timeTDC1);
248 fDigits->SetADCAmp(*chargeTDC2);
259 //_____________________________________________________________________________
260 Int_t AliSTARTRawReader::GetPosition()
262 // Sets the position in the
264 if (((fRawReader->GetDataSize() * 8) % 32) != 0)
265 AliFatal(Form("Incorrect raw data size ! %d words are found !",fRawReader->GetDataSize()));
266 return (fRawReader->GetDataSize() * 8) / 32;
268 //_____________________________________________________________________________
269 UInt_t AliSTARTRawReader::GetNextWord()
271 // Read the next 32 bit word in backward direction
272 // The input stream access is given by fData and fPosition
275 Int_t iBit = fPosition * 32;
276 Int_t iByte = iBit / 8;
279 word = fData[iByte+3]<<24;
280 word |= fData[iByte+2]<<16;
281 word |= fData[iByte+1]<<8;
282 word |= fData[iByte];