Online/offline mode selected in the constructor
[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, Bool_t isOnline)
15     :  TTask("T0RawReader","read raw T0 data"),
16        fRawReader(rawReader),
17        fData(NULL),
18        fPosition(0),
19        fParam(NULL),
20        fIsOnline(isOnline)
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    Int_t fNTRM = fParam->GetNumberOfTRMs();
92    for ( Int_t k=0; k<110; k++) {
93     koefhits[k]=0;
94     for ( Int_t jj=0; jj<5; jj++) {
95       fAllData[k][jj]=0;
96      }
97    }
98     do {
99       if (!fRawReader->ReadNextData(fData)) return kFALSE;
100     } while (fRawReader->GetDataSize() == 0);
101     
102     fPosition = 0;
103     //  cout.setf( ios_base::hex, ios_base::basefield );
104     
105     //DRM header
106     for (Int_t i=0; i<6; i++) {
107       word = GetNextWord();
108       header = AliBitPacking::UnpackWord(word,28,31);
109       if( header !=4 )
110         {
111           AliWarning(Form(" !!!! wrong  DRM header  %x!!!!", word));
112           fRawReader->AddFatalErrorLog(kWrongDRMHeader,Form("w=%x",word));
113           break;
114         }
115     }
116     
117     for (Int_t ntrm=0; ntrm< fNTRM; ntrm++)
118       {
119         //TRMheader  
120         word = GetNextWord();
121         header = AliBitPacking::UnpackWord(word,28,31);
122         if ( header != 4 )
123           {
124             AliWarning(Form(" !!!! wrong TRM header  %x!!!!", word));
125             fRawReader->AddMajorErrorLog(kWrongTRMHeader,Form("w=%x",word));
126             break;
127           }
128         numberOfWordsInTRM=AliBitPacking::UnpackWord(word,4,16);
129         iTRM=AliBitPacking::UnpackWord(word,0,3);
130         for( Int_t ichain=0; ichain<2; ichain++)
131           {
132             //chain header
133             word = GetNextWord();
134             uu = word & TRM_CHAIN_0_HEADER;
135             if(uu != TRM_CHAIN_0_HEADER) 
136               {
137                 AliWarning(Form(" !!!! wrong CHAIN  0  header %x!!!!", word));
138                 fRawReader->AddMajorErrorLog(kWrongChain0Header,Form("w=%x",word));
139                 break;
140               }
141             word = GetNextWord();
142             tdcTime =  AliBitPacking::UnpackWord(word,31,31);   
143             for (; tdcTime==1; tdcTime) 
144               {
145                 itdc=AliBitPacking::UnpackWord(word,24,27);
146                 ichannel=AliBitPacking::UnpackWord(word,21,23);
147                 time=AliBitPacking::UnpackWord(word,0,20);
148                 
149                 koef = fParam->GetChannel(iTRM,itdc,ichain,ichannel);
150                 if (koef ==-1 ){
151                   AliWarning(Form("Incorrect lookup table ! "));
152                   fRawReader->AddMajorErrorLog(kIncorrectLUT);
153                   correct=kFALSE;
154                 }
155                 if(correct){
156                   hit=koefhits[koef];
157                   fAllData[koef][hit]=time; 
158                   koefhits[koef]++;
159                 }
160                   word = GetNextWord();
161                   tdcTime =  AliBitPacking::UnpackWord(word,31,31);   
162                 
163             }
164             
165
166             uu = word&TRM_CHAIN_0_TRAILER;
167             if(uu != TRM_CHAIN_0_TRAILER )
168               {
169                 AliWarning(Form(" !!!! wrong CHAIN 0 trailer %x !!!!", word));
170                   fRawReader->AddMajorErrorLog(kWrongChain0Trailer,Form("w=%x",word));
171                 break;
172               }
173           }
174             
175         word = GetNextWord(); //TRM trailer
176         header = AliBitPacking::UnpackWord(word,28,31);
177         if( header !=5 )
178           {
179             AliWarning(Form(" !!!! wrong TRM GLOBAL trailer  %x!!!!", word));
180             fRawReader->AddMajorErrorLog(kWrongTRMTrailer,Form("w=%x",word));
181             break;
182           }
183       } //TRM loop
184     word = GetNextWord(); //
185     header = AliBitPacking::UnpackWord(word,28,31);
186     uu = word&FILLER;
187     if (word == FILLER )  word = GetNextWord(); 
188     if( header !=5 )
189       {
190         AliWarning(Form(" !!!! wrong DRM GLOBAL trailer  %x!!!!", word));
191         fRawReader->AddFatalErrorLog(kWrongDRMTrailer,Form("w=%x",word));
192       }
193     cout.setf( ios_base::dec, ios_base::basefield );
194     
195     return kTRUE;
196 }
197 //_____________________________________________________________________________
198 Int_t AliT0RawReader::GetPosition()
199 {
200   // Sets the position in the
201   // input stream
202   if (((fRawReader->GetDataSize() * 8) % 32) != 0)
203     AliFatal(Form("Incorrect raw data size ! %d words are found !",fRawReader->GetDataSize()));
204   return (fRawReader->GetDataSize() * 8) / 32;
205 }
206 //_____________________________________________________________________________
207 UInt_t AliT0RawReader::GetNextWord()
208 {
209   // Read the next 32 bit word in backward direction
210   // The input stream access is given by fData and fPosition
211
212
213   //   fPosition--;
214   Int_t iBit = fPosition * 32;
215   Int_t iByte = iBit / 8;
216
217   UInt_t word = 0;
218   word  = fData[iByte+3]<<24;
219   word |= fData[iByte+2]<<16;
220   word |= fData[iByte+1]<<8;
221   word |= fData[iByte];
222    fPosition++;
223
224   return word;
225
226 }
227