65fe7bbbd99fcc0f6f393e3339c87aa5b029d68e
[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        fParam(NULL),
20        fIsOnline(kFALSE)
21 {
22   //
23 // create an object to read T0raw digits
24   AliDebug(1,"Start ");
25  
26   fRawReader->Reset();
27   fRawReader->Select("T0");
28   fParam = AliT0Parameters::Instance();  
29   if (fIsOnline)
30     fParam->InitIfOnline();
31   else 
32     fParam->Init();
33  
34 }
35  AliT0RawReader::~AliT0RawReader ()
36 {
37   // 
38 }
39 /*
40 AliT0RawReader::AliT0RawReader(const AliT0RawReader& o): TTask(o),
41      fRawReader(rawReader),
42        fData(NULL),
43        fPosition(0)
44 {
45   //
46 }
47 */
48
49
50 Bool_t  AliT0RawReader::Next()
51 {
52 // read the next raw digit
53 // returns kFALSE if there is no digit left
54 //"LookUpTable":
55 // Amplitude LED TRM=0; chain=0; TDC 0 -5        channel 0,2,4,6
56 // Time CFD      TRM=0; chain=0; TDC 6 - 11      channel 0,2,4,6
57 // mean time     TRM=0; chain=0; TDC 12          channel 0
58 // T0A           TRM=0; chain=0; TDC 12          channel 2
59 // T0C           TRM=0; chain=0; TDC 12          channel 4
60 // vertex        TRM=0; chain=0; TDC 12          channel 6
61 // mult QTC0        TRM=0; chain=0; TDC 13          channel 0
62 // mult QTC1        TRM=0; chain=0; TDC 13          channel 2
63
64 // Charge QTC0   TRM=1; chain=0; TDC 0 -5        channel 0,2,4,6
65 // Charge QTC1   TRM=1; chain=0; TDC 6 - 11      channel 0,2,4,6
66 // T0A trigger          TRM=1; chain=0; TDC 12          channel 0
67 // T0C trigger          TRM=1; chain=0; TDC 12          channel 2
68 // vertex trigger       TRM=1; chain=0; TDC 12          channel 4
69 // trigger central      TRM=1; chain=0; TDC 13          channel 0
70 // tigger semicenral    TRM=1; chain=0; TDC 13          channel 2
71 //
72 // allData array collect data from all channels in one :
73 // allData[0] - allData[23] 24 CFD channels
74 // allData[24] -   allData[47] 24 LED channels
75 //  allData[48]  mean (T0) signal  
76 // allData[49]   time difference (vertex)
77
78  
79   UInt_t word;
80   Int_t time=0,  itdc=0, ichannel=0, uu; 
81   Int_t numberOfWordsInTRM=0, iTRM=0;
82   Int_t tdcTime, koef,hit=0;
83   Int_t koefhits[110];
84     Int_t  TRM_CHAIN_0_HEADER =  0x00000000;
85   Int_t  TRM_CHAIN_0_TRAILER =  0x10000000;
86   
87   Int_t  FILLER =  0x70000000;
88   Bool_t correct=kTRUE;
89   Int_t header;
90   /*  
91     AliT0Parameters* fParam = AliT0Parameters::Instance();   
92    if (fIsOnline)
93    fParam->InitIfOnline();
94         else
95    fParam->Init();
96   */
97    Int_t fNTRM = fParam->GetNumberOfTRMs();
98    for ( Int_t k=0; k<110; k++) {
99     koefhits[k]=0;
100     for ( Int_t jj=0; jj<5; jj++) {
101       fAllData[k][jj]=0;
102      }
103    }
104     do {
105       if (!fRawReader->ReadNextData(fData)) return kFALSE;
106     } while (fRawReader->GetDataSize() == 0);
107     
108     fPosition = 0;
109     //  cout.setf( ios_base::hex, ios_base::basefield );
110     
111     //DRM header
112     for (Int_t i=0; i<6; i++) {
113       word = GetNextWord();
114       header = AliBitPacking::UnpackWord(word,28,31);
115       if( header !=4 )
116         {
117           AliWarning(Form(" !!!! wrong  DRM header  %x!!!!", word));
118           fRawReader->AddFatalErrorLog(kWrongDRMHeader,Form("w=%x",word));
119           break;
120         }
121     }
122     
123     for (Int_t ntrm=0; ntrm< fNTRM; ntrm++)
124       {
125         //TRMheader  
126         word = GetNextWord();
127         header = AliBitPacking::UnpackWord(word,28,31);
128         if ( header != 4 )
129           {
130             AliWarning(Form(" !!!! wrong TRM header  %x!!!!", word));
131             fRawReader->AddMajorErrorLog(kWrongTRMHeader,Form("w=%x",word));
132             break;
133           }
134         numberOfWordsInTRM=AliBitPacking::UnpackWord(word,4,16);
135         iTRM=AliBitPacking::UnpackWord(word,0,3);
136         for( Int_t ichain=0; ichain<2; ichain++)
137           {
138             //chain header
139             word = GetNextWord();
140             uu = word & TRM_CHAIN_0_HEADER;
141             if(uu != TRM_CHAIN_0_HEADER) 
142               {
143                 AliWarning(Form(" !!!! wrong CHAIN  0  header %x!!!!", word));
144                 fRawReader->AddMajorErrorLog(kWrongChain0Header,Form("w=%x",word));
145                 break;
146               }
147             word = GetNextWord();
148             tdcTime =  AliBitPacking::UnpackWord(word,31,31);   
149             for (; tdcTime==1; tdcTime) 
150               {
151                 itdc=AliBitPacking::UnpackWord(word,24,27);
152                 ichannel=AliBitPacking::UnpackWord(word,21,23);
153                 time=AliBitPacking::UnpackWord(word,0,20);
154                 
155                 koef = fParam->GetChannel(iTRM,itdc,ichain,ichannel);
156                 if (koef ==-1 ){
157                   AliWarning(Form("Incorrect lookup table ! "));
158                   fRawReader->AddMajorErrorLog(kIncorrectLUT);
159                   correct=kFALSE;
160                 }
161                 if(correct){
162                   hit=koefhits[koef];
163                   fAllData[koef][hit]=time; 
164                   koefhits[koef]++;
165                 }
166                   word = GetNextWord();
167                   tdcTime =  AliBitPacking::UnpackWord(word,31,31);   
168                 
169             }
170             
171
172             uu = word&TRM_CHAIN_0_TRAILER;
173             if(uu != TRM_CHAIN_0_TRAILER )
174               {
175                 AliWarning(Form(" !!!! wrong CHAIN 0 trailer %x !!!!", word));
176                   fRawReader->AddMajorErrorLog(kWrongChain0Trailer,Form("w=%x",word));
177                 break;
178               }
179           }
180             
181         word = GetNextWord(); //TRM trailer
182         header = AliBitPacking::UnpackWord(word,28,31);
183         if( header !=5 )
184           {
185             AliWarning(Form(" !!!! wrong TRM GLOBAL trailer  %x!!!!", word));
186             fRawReader->AddMajorErrorLog(kWrongTRMTrailer,Form("w=%x",word));
187             break;
188           }
189       } //TRM loop
190     word = GetNextWord(); //
191     header = AliBitPacking::UnpackWord(word,28,31);
192     uu = word&FILLER;
193     if (word == FILLER )  word = GetNextWord(); 
194     if( header !=5 )
195       {
196         AliWarning(Form(" !!!! wrong DRM GLOBAL trailer  %x!!!!", word));
197         fRawReader->AddFatalErrorLog(kWrongDRMTrailer,Form("w=%x",word));
198       }
199     cout.setf( ios_base::dec, ios_base::basefield );
200     
201     return kTRUE;
202 }
203 //_____________________________________________________________________________
204 Int_t AliT0RawReader::GetPosition()
205 {
206   // Sets the position in the
207   // input stream
208   if (((fRawReader->GetDataSize() * 8) % 32) != 0)
209     AliFatal(Form("Incorrect raw data size ! %d words are found !",fRawReader->GetDataSize()));
210   return (fRawReader->GetDataSize() * 8) / 32;
211 }
212 //_____________________________________________________________________________
213 UInt_t AliT0RawReader::GetNextWord()
214 {
215   // Read the next 32 bit word in backward direction
216   // The input stream access is given by fData and fPosition
217
218
219   //   fPosition--;
220   Int_t iBit = fPosition * 32;
221   Int_t iByte = iBit / 8;
222
223   UInt_t word = 0;
224   word  = fData[iByte+3]<<24;
225   word |= fData[iByte+2]<<16;
226   word |= fData[iByte+1]<<8;
227   word |= fData[iByte];
228    fPosition++;
229
230   return word;
231
232 }
233