e1c68c1ad13f2263c54e09494bb5a1f34ddc7f93
[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("START");
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 //"LookUpTable":
42 // Amplitude LED TRM=0; chain=0; TDC 0 -5        channel 0,2,4,6
43 // Time CFD      TRM=0; chain=0; TDC 6 - 11      channel 0,2,4,6
44 // mean time     TRM=0; chain=0; TDC 12          channel 0
45 // T0A           TRM=0; chain=0; TDC 12          channel 2
46 // T0C           TRM=0; chain=0; TDC 12          channel 4
47 // vertex        TRM=0; chain=0; TDC 12          channel 6
48 // mult QTC0        TRM=0; chain=0; TDC 13          channel 0
49 // mult QTC1        TRM=0; chain=0; TDC 13          channel 2
50
51 // Charge QTC0   TRM=1; chain=0; TDC 0 -5        channel 0,2,4,6
52 // Charge QTC1   TRM=1; chain=0; TDC 6 - 11      channel 0,2,4,6
53 // T0A trigger          TRM=1; chain=0; TDC 12          channel 0
54 // T0C trigger          TRM=1; chain=0; TDC 12          channel 2
55 // vertex trigger       TRM=1; chain=0; TDC 12          channel 4
56 // trigger central      TRM=1; chain=0; TDC 13          channel 0
57 // tigger semicenral    TRM=1; chain=0; TDC 13          channel 2
58
59
60   UInt_t word;
61   Int_t time=0,  itdc=0, ichannel=0; 
62   Int_t numberOfWordsInTRM=0, iTRM=0;
63   Int_t tdcTime, koef ;
64   Int_t allData[107];
65
66   TArrayI *timeTDC1 = new TArrayI(24);
67   TArrayI * chargeTDC1 = new TArrayI(24);
68   TArrayI *timeTDC2 = new TArrayI(24);
69   TArrayI *chargeTDC2 = new TArrayI(24);
70    
71   for ( Int_t k=0; k<107; k++)  allData[k]=0;
72   do {
73     if (!fRawReader->ReadNextData(fData)) return kFALSE;
74   } while (fRawReader->GetDataSize() == 0);
75   
76   //  fPosition = GetPosition();
77   fPosition = 0;
78
79   //DRM header
80   for (Int_t i=0; i<4; i++) {
81     word = GetNextWord();
82   }
83   //TRMheader  
84    word = GetNextWord();
85    numberOfWordsInTRM=AliBitPacking::UnpackWord(word,4,16);
86    iTRM=AliBitPacking::UnpackWord(word,0,3);
87
88    //chain header
89    word = GetNextWord();
90   
91    for (Int_t i=0; i<numberOfWordsInTRM; i++) {
92      word = GetNextWord();
93      tdcTime =  AliBitPacking::UnpackWord(word,31,31);   
94
95      if ( tdcTime == 1)
96        {
97          itdc=AliBitPacking::UnpackWord(word,24,27);
98          ichannel=AliBitPacking::UnpackWord(word,21,23);
99          time=AliBitPacking::UnpackWord(word,0,20);
100          koef = itdc*4 + ichannel/2;
101          allData[koef]=time;
102        }
103    }
104    word = GetNextWord(); //chain trailer
105    word = GetNextWord(); //TRM trailer
106      
107   //TRMheader  
108    word = GetNextWord();
109    numberOfWordsInTRM=AliBitPacking::UnpackWord(word,4,16);
110    iTRM=AliBitPacking::UnpackWord(word,0,3);
111    //chain header
112    word = GetNextWord();
113    
114    for (Int_t iword=0; iword<numberOfWordsInTRM; iword++) {
115      word = GetNextWord();
116      tdcTime =  AliBitPacking::UnpackWord(word,31,31);   
117
118      if ( tdcTime == 1)
119        {
120          itdc=AliBitPacking::UnpackWord(word,24,27);
121          ichannel=AliBitPacking::UnpackWord(word,21,23);
122          time=AliBitPacking::UnpackWord(word,0,20);
123          koef = itdc*4 + ichannel/2;
124          allData[koef+54]=time;
125        }
126    }
127       
128    for (Int_t in=0; in<24; in++)
129      {
130        timeTDC1->AddAt(allData[in],in);
131        timeTDC2->AddAt(allData[in+24],in);
132        chargeTDC1->AddAt(allData[in+54],in);
133        chargeTDC2->AddAt(allData[in+78],in);
134      }      
135    word = GetNextWord();
136    word = GetNextWord();
137    
138    fDigits->SetTime(*timeTDC2);
139    fDigits->SetADC(*chargeTDC1);
140    
141    fDigits->SetTimeAmp(*timeTDC1);
142    fDigits->SetADCAmp(*chargeTDC2);
143    fTree->Fill();
144    
145    delete timeTDC1 ;
146    delete chargeTDC1;
147    delete timeTDC2 ;
148    delete chargeTDC2;
149    
150    return kTRUE;
151 }
152 //_____________________________________________________________________________
153 /*
154 void AliSTARTRawReader::UnpackTime(Int_t outTime, Int_t outCh)
155 {
156       UInt_t word=0;
157       UInt_t unpackword=0;
158     
159       word = GetNextWord();
160       unpackword=AliBitPacking::UnpackWord(word,0,12);
161       outTime=unpackword;
162       unpackword= AliBitPacking::UnpackWord(word,21,27);
163       outCh=unpackword;  
164  }
165  */
166 //_____________________________________________________________________________
167 Int_t AliSTARTRawReader::GetPosition()
168 {
169   // Sets the position in the
170   // input stream
171   if (((fRawReader->GetDataSize() * 8) % 32) != 0)
172     AliFatal(Form("Incorrect raw data size ! %d words are found !",fRawReader->GetDataSize()));
173   return (fRawReader->GetDataSize() * 8) / 32;
174 }
175 //_____________________________________________________________________________
176 UInt_t AliSTARTRawReader::GetNextWord()
177 {
178   // Read the next 32 bit word in backward direction
179   // The input stream access is given by fData and fPosition
180
181
182   //   fPosition--;
183   Int_t iBit = fPosition * 32;
184   Int_t iByte = iBit / 8;
185
186   UInt_t word = 0;
187   word  = fData[iByte+3]<<24;
188   word |= fData[iByte+2]<<16;
189   word |= fData[iByte+1]<<8;
190   word |= fData[iByte];
191    fPosition++;
192
193   return word;
194
195 }
196