]> git.uio.no Git - u/mrichter/AliRoot.git/blob - T0/AliT0RawReader.cxx
Changing name QualAss to QA
[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                 //      cout<<" packed "<<word<<endl;
146                 itdc=AliBitPacking::UnpackWord(word,24,27);
147                 ichannel=AliBitPacking::UnpackWord(word,21,23);
148                 time=AliBitPacking::UnpackWord(word,0,20);
149                 
150                 koef = fParam->GetChannel(iTRM,itdc,ichain,ichannel);
151                 /*      if (koef != 0 ) 
152                   cout<<"RawReader>> "<<"koef "<<koef<<" trm "<<iTRM<<
153                     " tdc "<<itdc<<" chain "<<ichain<<
154                     " channel "<<ichannel<<" time "<<time<<endl;*/
155                 if (koef ==-1 ){
156                   AliWarning(Form("Incorrect lookup table ! "));
157                   fRawReader->AddMajorErrorLog(kIncorrectLUT);
158                   correct=kFALSE;
159                 }
160                 if(correct){
161                   hit=koefhits[koef];
162                   if(hit>5) {  
163                     AliWarning(Form("Too many hits for %i channel  ! ",koef)); 
164                     break; 
165                   }
166                   fAllData[koef][hit]=time; 
167                   koefhits[koef]++;
168                 }
169                   word = GetNextWord();
170                   tdcTime =  AliBitPacking::UnpackWord(word,31,31);   
171                 
172             }
173             
174
175             uu = word&TRM_CHAIN_0_TRAILER;
176             if(uu != TRM_CHAIN_0_TRAILER )
177               {
178                 AliWarning(Form(" !!!! wrong CHAIN 0 trailer %x !!!!", word));
179                   fRawReader->AddMajorErrorLog(kWrongChain0Trailer,Form("w=%x",word));
180                 break;
181               }
182           }
183             
184         word = GetNextWord(); //TRM trailer
185         header = AliBitPacking::UnpackWord(word,28,31);
186         if( header !=5 )
187           {
188             AliWarning(Form(" !!!! wrong TRM GLOBAL trailer  %x!!!!", word));
189             fRawReader->AddMajorErrorLog(kWrongTRMTrailer,Form("w=%x",word));
190             break;
191           }
192       } //TRM loop
193     word = GetNextWord(); //
194     if (word == FILLER )  word = GetNextWord(); 
195      header = AliBitPacking::UnpackWord(word,28,31);
196      if( header !=5 )
197        {
198          AliWarning(Form(" !!!! wrong DRM GLOBAL trailer  %x!!!!", word));
199          fRawReader->AddFatalErrorLog(kWrongDRMTrailer,Form("w=%x",word));
200       }
201      cout.setf( ios_base::dec, ios_base::basefield );
202     
203      return kTRUE;
204 }
205 //_____________________________________________________________________________
206 Int_t AliT0RawReader::GetPosition()
207 {
208   // Sets the position in the
209   // input stream
210   if (((fRawReader->GetDataSize() * 8) % 32) != 0)
211     AliFatal(Form("Incorrect raw data size ! %d words are found !",fRawReader->GetDataSize()));
212   return (fRawReader->GetDataSize() * 8) / 32;
213 }
214 //_____________________________________________________________________________
215 UInt_t AliT0RawReader::GetNextWord()
216 {
217   // Read the next 32 bit word in backward direction
218   // The input stream access is given by fData and fPosition
219
220
221   //   fPosition--;
222   Int_t iBit = fPosition * 32;
223   Int_t iByte = iBit / 8;
224
225   UInt_t word = 0;
226   word  = fData[iByte+3]<<24;
227   word |= fData[iByte+2]<<16;
228   word |= fData[iByte+1]<<8;
229   word |= fData[iByte];
230    fPosition++;
231
232   return word;
233
234 }
235