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