Bugfix
[u/mrichter/AliRoot.git] / START / AliSTARTRawReader.cxx
1 #include "AliSTARTRawReader.h"
2 #include "AliSTARTRawData.h"
3 #include "AliSTARTdigit.h"
4 #include "AliBitPacking.h"
5 #include "TBits.h"
6
7 #include <Riostream.h>
8 #include "TMath.h"
9 #include "TH1F.h"
10 #include "TArrayI.h"
11 #include "AliLog.h"
12  
13 ClassImp(AliSTARTRawReader)
14   
15   AliSTARTRawReader::AliSTARTRawReader (AliRawReader *rawReader, TTree* tree)
16     :  TTask("STARTRawReader","read raw START data"),
17        fDigits(NULL),
18        fTree(tree),
19        fRawReader(rawReader)
20 {
21   //
22 // create an object to read STARTraw digits
23   AliDebug(1,"Start ");
24   if (fDigits == 0x0) fDigits = new AliSTARTdigit(); 
25   fTree->Branch("START","AliSTARTdigit",&fDigits,405,1);
26  
27   fRawReader->Reset();
28   fRawReader->Select(13,0,1);
29  
30  
31 }
32  AliSTARTRawReader::~AliSTARTRawReader ()
33 {
34   // 
35 }
36
37 Bool_t  AliSTARTRawReader::Next()
38 {
39 // read the next raw digit
40 // returns kFALSE if there is no digit left
41   AliBitPacking *pack ;
42
43   UInt_t word, unpackword;
44   Int_t time, adc,  pmt;
45   TArrayI *timeTDC1 = new TArrayI(24);
46   TArrayI * chargeTDC1 = new TArrayI(24);
47   TArrayI *timeTDC2 = new TArrayI(24);
48   TArrayI *chargeTDC2 = new TArrayI(24);
49
50   do {
51     if (!fRawReader->ReadNextData(fData)) return kFALSE;
52   } while (fRawReader->GetDataSize() == 0);
53   
54   fPosition = GetPosition();
55
56   for( Int_t i=0; i<11; i++) word = GetNextWord();
57  //  multiplicity 
58    word=0;
59    unpackword=0;
60       word = GetNextWord();
61    unpackword=pack->UnpackWord(word,0,8);
62    pmt=unpackword;
63    word=0;
64    unpackword=0;
65       word = GetNextWord();
66    unpackword=pack->UnpackWord(word,8,31);
67    time=unpackword;
68    fDigits->SetSumMult(time);   
69
70   
71    // best time differece  
72     word=0;
73    unpackword=0;
74    
75       word = GetNextWord();
76    unpackword=pack->UnpackWord(word,0,8);
77    pmt=unpackword;
78
79    word=0;
80    unpackword=0;
81    
82       word = GetNextWord();
83    unpackword=pack->UnpackWord(word,8,31);
84    time=unpackword;
85    fDigits->SetDiffTime(time);   
86   // best time left 
87    word=0;
88    unpackword=0;
89      
90       word = GetNextWord();
91    unpackword=pack->UnpackWord(word,0,8);
92    pmt=unpackword;
93  
94    word=0;
95    unpackword=0;
96    
97       word = GetNextWord();
98    unpackword=pack->UnpackWord(word,8,31);
99    time=unpackword;
100    fDigits->SetTimeBestLeft(time);   
101    
102   // Best time right &left  
103    word=0;
104    unpackword=0;
105    
106    word = GetNextWord();
107    unpackword=pack->UnpackWord(word,0,8);
108    pmt=unpackword;
109  
110    word=0;
111    unpackword=0;
112
113       word = GetNextWord();
114    unpackword=pack->UnpackWord(word,8,31);
115    time=unpackword;
116    fDigits->SetTimeBestRight(time);   
117  
118      word=0;
119    unpackword=0;
120     
121       word = GetNextWord();
122    unpackword=pack->UnpackWord(word,0,8);
123    pmt=unpackword;
124  
125    word=0;
126    unpackword=0;
127    
128       word = GetNextWord();
129    unpackword=pack->UnpackWord(word,8,31);
130    time=unpackword;
131    fDigits->SetMeanTime(time);   
132     
133    for (Int_t i=0; i<24; i++)   //QTC amplified
134      {
135       word=0;
136       unpackword=0;
137     
138       word = GetNextWord();
139       unpackword=pack->UnpackWord(word,0,8);
140       pmt=unpackword;
141       word=0;
142       unpackword=0;
143       word = GetNextWord();
144       unpackword= pack->UnpackWord(word,8,31);
145       adc=unpackword;  
146       chargeTDC2->AddAt(adc,pmt-72);
147      }
148
149   for (Int_t i=0; i<24; i++)
150     {
151       //  QTC
152       word=0;
153       unpackword=0;
154       word = GetNextWord();
155       unpackword=pack->UnpackWord(word,0,8);
156       pmt=unpackword;
157       word=0;
158       unpackword=0;
159       word = GetNextWord();
160       unpackword= pack->UnpackWord(word,8,31);
161       adc=unpackword; //
162       chargeTDC1->AddAt(adc,pmt-48);
163
164       word=0;
165       unpackword=0;
166     }
167   
168   for (Int_t i=0; i<24; i++) //time CFD
169     {
170       word=0;
171       unpackword=0;
172       word = GetNextWord();
173       unpackword=pack->UnpackWord(word,0,8);
174       pmt=unpackword;
175       word=0;
176       unpackword=0;
177       word = GetNextWord();
178        unpackword=pack->UnpackWord(word,8,31);
179       time=unpackword;
180       timeTDC2->AddAt(time,pmt-24);
181       word=0;
182       unpackword=0;
183     } 
184
185   
186   for (Int_t i=0; i<24; i++) //time LED
187     {
188       word=0;
189       unpackword=0;
190       word = GetNextWord();
191       unpackword=pack->UnpackWord(word,0,31);
192       pmt=unpackword; 
193       
194       word=0;
195       unpackword=0;
196       word = GetNextWord();
197       unpackword=pack->UnpackWord(word,8,31);
198       time=unpackword;
199       timeTDC1->AddAt(time,i);
200       word=0;
201       unpackword=0;
202     }
203  
204   
205   fDigits->SetTime(*timeTDC2);
206   fDigits->SetADC(*chargeTDC1);
207   
208   fDigits->SetTimeAmp(*timeTDC1);
209   fDigits->SetADCAmp(*chargeTDC2);
210     fTree->Fill();
211
212     delete timeTDC1 ;
213     delete chargeTDC1;
214     delete timeTDC2 ;
215     delete chargeTDC2;
216   
217     return kTRUE;
218 }
219  
220 //_____________________________________________________________________________
221 Int_t AliSTARTRawReader::GetPosition()
222 {
223   // Sets the position in the
224   // input stream
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;
228 }
229 //_____________________________________________________________________________
230 UInt_t AliSTARTRawReader::GetNextWord()
231 {
232   // Read the next 32 bit word in backward direction
233   // The input stream access is given by fData and fPosition
234
235    fPosition--;
236
237
238   Int_t iBit = fPosition * 32;
239   Int_t iByte = iBit / 8;
240
241   UInt_t word = 0;
242   word  = fData[iByte+3]<<24;
243   word |= fData[iByte+2]<<16;
244   word |= fData[iByte+1]<<8;
245   word |= fData[iByte];
246   return word;
247
248 }
249