reconstruction with lookup table
[u/mrichter/AliRoot.git] / T0 / AliT0RawReader.cxx
1 #include "AliT0RawReader.h"
2 #include "AliT0Parameters.h"
3 #include "AliBitPacking.h"
4 #include "TBits.h"
5
6 #include <Riostream.h>
7 #include "TMath.h"
8 #include "TH1F.h"
9 #include "TArrayI.h"
10 #include "AliLog.h"
11  
12 ClassImp(AliT0RawReader)
13   
14   AliT0RawReader::AliT0RawReader (AliRawReader *rawReader)
15     :  TTask("T0RawReader","read raw T0 data"),
16        fRawReader(rawReader),
17        fData(NULL),
18        fPosition(0)
19 {
20   //
21 // create an object to read T0raw digits
22   AliDebug(1,"Start ");
23  
24   fRawReader->Reset();
25   fRawReader->Select("T0");
26  
27  
28 }
29  AliT0RawReader::~AliT0RawReader ()
30 {
31   // 
32 }
33
34 Bool_t  AliT0RawReader::Next()
35 {
36 // read the next raw digit
37 // returns kFALSE if there is no digit left
38 //"LookUpTable":
39 // Amplitude LED TRM=0; chain=0; TDC 0 -5        channel 0,2,4,6
40 // Time CFD      TRM=0; chain=0; TDC 6 - 11      channel 0,2,4,6
41 // mean time     TRM=0; chain=0; TDC 12          channel 0
42 // T0A           TRM=0; chain=0; TDC 12          channel 2
43 // T0C           TRM=0; chain=0; TDC 12          channel 4
44 // vertex        TRM=0; chain=0; TDC 12          channel 6
45 // mult QTC0        TRM=0; chain=0; TDC 13          channel 0
46 // mult QTC1        TRM=0; chain=0; TDC 13          channel 2
47
48 // Charge QTC0   TRM=1; chain=0; TDC 0 -5        channel 0,2,4,6
49 // Charge QTC1   TRM=1; chain=0; TDC 6 - 11      channel 0,2,4,6
50 // T0A trigger          TRM=1; chain=0; TDC 12          channel 0
51 // T0C trigger          TRM=1; chain=0; TDC 12          channel 2
52 // vertex trigger       TRM=1; chain=0; TDC 12          channel 4
53 // trigger central      TRM=1; chain=0; TDC 13          channel 0
54 // tigger semicenral    TRM=1; chain=0; TDC 13          channel 2
55 //
56 // allData array collect data from all channels in one :
57 // allData[0] - allData[23] 24 CFD channels
58 // allData[24] -   allData[47] 24 LED channels
59 //  allData[48]  mean (T0) signal  
60 // allData[49]   time difference (vertex)
61
62
63  //  if (fDigits == 0x0) fDigits = new AliT0digit(); 
64   // fTree->Branch("T0","AliT0digit",&fDigits,405,1);
65  
66   UInt_t word;
67   Int_t time=0,  itdc=0, ichannel=0; 
68   Int_t numberOfWordsInTRM=0, iTRM=0;
69   Int_t tdcTime, koef,hit, meanTime, timeDiff ;
70
71
72
73   AliT0Parameters* param = AliT0Parameters::Instance();   //-->Zhenya
74   param->Init();
75  
76  for ( Int_t k=0; k<110; k++) {
77     for ( Int_t jj=0; jj<5; jj++) {
78       fAllData[k][jj]=0;
79     }
80   }
81     do {
82     if (!fRawReader->ReadNextData(fData)) return kFALSE;
83   } while (fRawReader->GetDataSize() == 0);
84   
85   //  fPosition = GetPosition();
86   fPosition = 0;
87
88   //DRM header
89   for (Int_t i=0; i<4; i++) {
90     word = GetNextWord();
91   }
92   //TRMheader  
93    word = GetNextWord();
94    numberOfWordsInTRM=AliBitPacking::UnpackWord(word,4,16);
95    iTRM=AliBitPacking::UnpackWord(word,0,3);
96
97    //chain header
98    Int_t ichain=0;
99    word = GetNextWord();
100   
101    for (Int_t i=0; i<numberOfWordsInTRM; i++) {
102      word = GetNextWord();
103      tdcTime =  AliBitPacking::UnpackWord(word,31,31);   
104
105      if ( tdcTime == 1)
106        {
107          itdc=AliBitPacking::UnpackWord(word,24,27);
108          ichannel=AliBitPacking::UnpackWord(word,21,23);
109          time=AliBitPacking::UnpackWord(word,0,20);
110          //  koef = itdc*4 + ichannel/2;
111          koef = param->GetChannel(iTRM,itdc,ichain,ichannel);
112          //      cout<<" RawReader::Next ::"<<iTRM<<"  "<<itdc<<" "<<ichain<<" "<<ichannel<<" "<<  koef<<" "<<time<<endl;
113          if(fAllData[koef][0] == 0)  fAllData[koef][0]=time;  // yield only 1st particle
114           
115        }
116    }
117    word = GetNextWord(); //chain trailer
118    word = GetNextWord(); //TRM trailer
119      
120   //TRMheader  
121    word = GetNextWord();
122    numberOfWordsInTRM=AliBitPacking::UnpackWord(word,4,16);
123    iTRM=AliBitPacking::UnpackWord(word,0,3);
124    
125    //chain header
126    word = GetNextWord();
127    
128    for (Int_t iword=0; iword<numberOfWordsInTRM; iword++) {
129      word = GetNextWord();
130      tdcTime =  AliBitPacking::UnpackWord(word,31,31);   
131
132      if ( tdcTime == 1)
133        {
134          itdc=AliBitPacking::UnpackWord(word,24,27);
135          ichannel=AliBitPacking::UnpackWord(word,21,23);
136          time=AliBitPacking::UnpackWord(word,0,20);
137          //      koef = itdc*4 + ichannel/2;
138          koef = param->GetChannel(iTRM,itdc,ichain,ichannel);
139  
140            if(fAllData[koef][0] == 0)    fAllData[koef][0]=time;
141                  //      if(allData[koef+55] == 0) allData[koef+55]=time; // yield only 1st particle
142        }
143    }
144    meanTime = fAllData[49][0];  // T0 !!!!!!
145    timeDiff = fAllData[50][0];
146
147    word = GetNextWord();
148    word = GetNextWord();
149    return kTRUE;
150 }
151 //_____________________________________________________________________________
152 Int_t AliT0RawReader::GetPosition()
153 {
154   // Sets the position in the
155   // input stream
156   if (((fRawReader->GetDataSize() * 8) % 32) != 0)
157     AliFatal(Form("Incorrect raw data size ! %d words are found !",fRawReader->GetDataSize()));
158   return (fRawReader->GetDataSize() * 8) / 32;
159 }
160 //_____________________________________________________________________________
161 UInt_t AliT0RawReader::GetNextWord()
162 {
163   // Read the next 32 bit word in backward direction
164   // The input stream access is given by fData and fPosition
165
166
167   //   fPosition--;
168   Int_t iBit = fPosition * 32;
169   Int_t iByte = iBit / 8;
170
171   UInt_t word = 0;
172   word  = fData[iByte+3]<<24;
173   word |= fData[iByte+2]<<16;
174   word |= fData[iByte+1]<<8;
175   word |= fData[iByte];
176    fPosition++;
177
178   return word;
179
180 }
181