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(13,0,1);
32 AliSTARTRawReader::~AliSTARTRawReader ()
37 Bool_t AliSTARTRawReader::Next()
39 // read the next raw digit
40 // returns kFALSE if there is no digit left
43 UInt_t word, unpackword;
45 TArrayI *timeTDC1 = new TArrayI(24);
46 TArrayI * chargeTDC1 = new TArrayI(24);
47 TArrayI *timeTDC2 = new TArrayI(24);
48 TArrayI *chargeTDC2 = new TArrayI(24);
51 if (!fRawReader->ReadNextData(fData)) return kFALSE;
52 } while (fRawReader->GetDataSize() == 0);
54 fPosition = GetPosition();
56 for( Int_t i=0; i<11; i++) word = GetNextWord();
61 unpackword=pack->UnpackWord(word,0,8);
66 unpackword=pack->UnpackWord(word,8,31);
68 fDigits->SetSumMult(time);
71 // best time differece
76 unpackword=pack->UnpackWord(word,0,8);
83 unpackword=pack->UnpackWord(word,8,31);
85 fDigits->SetDiffTime(time);
91 unpackword=pack->UnpackWord(word,0,8);
98 unpackword=pack->UnpackWord(word,8,31);
100 fDigits->SetTimeBestLeft(time);
102 // Best time right &left
106 word = GetNextWord();
107 unpackword=pack->UnpackWord(word,0,8);
113 word = GetNextWord();
114 unpackword=pack->UnpackWord(word,8,31);
116 fDigits->SetTimeBestRight(time);
121 word = GetNextWord();
122 unpackword=pack->UnpackWord(word,0,8);
128 word = GetNextWord();
129 unpackword=pack->UnpackWord(word,8,31);
131 fDigits->SetMeanTime(time);
133 for (Int_t i=0; i<24; i++) //QTC amplified
138 word = GetNextWord();
139 unpackword=pack->UnpackWord(word,0,8);
143 word = GetNextWord();
144 unpackword= pack->UnpackWord(word,8,31);
146 chargeTDC2->AddAt(adc,pmt-72);
149 for (Int_t i=0; i<24; i++)
154 word = GetNextWord();
155 unpackword=pack->UnpackWord(word,0,8);
159 word = GetNextWord();
160 unpackword= pack->UnpackWord(word,8,31);
162 chargeTDC1->AddAt(adc,pmt-48);
168 for (Int_t i=0; i<24; i++) //time CFD
172 word = GetNextWord();
173 unpackword=pack->UnpackWord(word,0,8);
177 word = GetNextWord();
178 unpackword=pack->UnpackWord(word,8,31);
180 timeTDC2->AddAt(time,pmt-24);
186 for (Int_t i=0; i<24; i++) //time LED
190 word = GetNextWord();
191 unpackword=pack->UnpackWord(word,0,31);
196 word = GetNextWord();
197 unpackword=pack->UnpackWord(word,8,31);
199 timeTDC1->AddAt(time,i);
205 fDigits->SetTime(*timeTDC2);
206 fDigits->SetADC(*chargeTDC1);
208 fDigits->SetTimeAmp(*timeTDC1);
209 fDigits->SetADCAmp(*chargeTDC2);
220 //_____________________________________________________________________________
221 Int_t AliSTARTRawReader::GetPosition()
223 // Sets the position in the
225 if (((fRawReader->GetDataSize() * 8) % 32) != 0)
226 AliFatal(Form("Incorrect raw data size ! %d words are found !",fRawReader->GetDataSize()));
227 return (fRawReader->GetDataSize() * 8) / 32;
229 //_____________________________________________________________________________
230 UInt_t AliSTARTRawReader::GetNextWord()
232 // Read the next 32 bit word in backward direction
233 // The input stream access is given by fData and fPosition
238 Int_t iBit = fPosition * 32;
239 Int_t iByte = iBit / 8;
242 word = fData[iByte+3]<<24;
243 word |= fData[iByte+2]<<16;
244 word |= fData[iByte+1]<<8;
245 word |= fData[iByte];