]> git.uio.no Git - u/mrichter/AliRoot.git/blob - T0/AliT0RawReader.cxx
Handle deletion of AliFMDAltroMapping object. If we make the object
[u/mrichter/AliRoot.git] / T0 / AliT0RawReader.cxx
1 /**************************************************************************
2  * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
3  *                                                                        *
4  * Author: The ALICE Off-line Project.                                    *
5  * Contributors are mentioned in the code where appropriate.              *
6  *                                                                        *
7  * Permission to use, copy, modify and distribute this software and its   *
8  * documentation strictly for non-commercial purposes is hereby granted   *
9  * without fee, provided that the above copyright notice appears in all   *
10  * copies and that both the copyright notice and this permission notice   *
11  * appear in the supporting documentation. The authors make no claims     *
12  * about the suitability of this software for any purpose. It is          *
13  * provided "as is" without express or implied warranty.                  *
14  **************************************************************************/
15
16 /* $Id:  */
17
18 //____________________________________________________________________
19 //                                                                          
20 // T0 
21 // Class for reading T0 RAW data in TOF data format
22 //
23 #include "AliT0RawReader.h"
24 #include "AliT0Parameters.h"
25 #include "AliBitPacking.h"
26 #include "TBits.h"
27
28 #include <Riostream.h>
29 #include "TMath.h"
30 #include "TH1F.h"
31 #include "TArrayI.h"
32 #include "AliLog.h"
33  
34 using std::cout;
35 using std::endl;
36 using std::ios_base;
37 ClassImp(AliT0RawReader)
38   
39   AliT0RawReader::AliT0RawReader (AliRawReader *rawReader, Bool_t isOnline)
40     :  TTask("T0RawReader","read raw T0 data"),
41        fRawReader(rawReader),
42        fData(NULL),
43        fPosition(0),
44        fParam(NULL),
45        fIsOnline(isOnline),
46        fBunchID(0),
47        fPrintout(kFALSE)
48
49 {
50   //
51 // create an object to read T0raw digits
52   AliDebug(1,"Start ");
53  
54   fRawReader->Reset();
55   fRawReader->Select("T0");
56   fParam = AliT0Parameters::Instance();  
57   if (fIsOnline)
58     fParam->InitIfOnline();
59   else 
60     fParam->Init();
61  
62 }
63  AliT0RawReader::~AliT0RawReader ()
64 {
65   // 
66 }
67 /*
68 AliT0RawReader::AliT0RawReader(const AliT0RawReader& o): TTask(o),
69      fRawReader(rawReader),
70        fData(NULL),
71        fPosition(0)
72 {
73   //
74 }
75 */
76
77
78 Bool_t  AliT0RawReader::Next()
79 {
80 // read the next raw digit
81 // returns kFALSE if there is no digit left
82 //"LookUpTable":
83 // Amplitude LED TRM=0; chain=0; TDC 0 -5        channel 0,2,4,6
84 // Time CFD      TRM=0; chain=0; TDC 6 - 11      channel 0,2,4,6
85 // mean time     TRM=0; chain=0; TDC 12          channel 0
86 // T0A           TRM=0; chain=0; TDC 12          channel 2
87 // T0C           TRM=0; chain=0; TDC 12          channel 4
88 // vertex        TRM=0; chain=0; TDC 12          channel 6
89 // mult QTC0        TRM=0; chain=0; TDC 13          channel 0
90 // mult QTC1        TRM=0; chain=0; TDC 13          channel 2
91
92 // Charge QTC0   TRM=1; chain=0; TDC 0 -5        channel 0,2,4,6
93 // Charge QTC1   TRM=1; chain=0; TDC 6 - 11      channel 0,2,4,6
94 // T0A trigger          TRM=1; chain=0; TDC 12          channel 0
95 // T0C trigger          TRM=1; chain=0; TDC 12          channel 2
96 // vertex trigger       TRM=1; chain=0; TDC 12          channel 4
97 // trigger central      TRM=1; chain=0; TDC 13          channel 0
98 // tigger semicenral    TRM=1; chain=0; TDC 13          channel 2
99 //
100 // allData array collect data from all channels in one :
101 // allData[0] - allData[23] 24 CFD channels
102 // allData[24] -   allData[47] 24 LED channels
103 //  allData[48]  mean (T0) signal  
104 // allData[49]   time difference (vertex)
105
106   UInt_t word;
107   Int_t time=0,  itdc=0, ichannel=0, uu; 
108   Int_t numberOfWordsInTRM=0, iTRM=0;
109   Int_t tdcTime, koef,hit=0;
110   Int_t koefhits[220];
111   Int_t trm_chain_header =  0x00000000;
112   Int_t  trm_chain_trailer =  0x10000000;
113   
114   UInt_t  filler =  0x70000000;
115   Bool_t correct=kTRUE;
116   Int_t header;
117
118   Int_t fNTRM = fParam->GetNumberOfTRMs();
119   for ( Int_t k=0; k<220; k++) {
120     koefhits[k]=0;
121     for ( Int_t jj=0; jj<5; jj++) {
122       fAllData[k][jj]=0;
123     }
124   }
125   do {
126     if (!fRawReader->ReadNextData(fData)) return kFALSE;
127   } while (fRawReader->GetDataSize() == 0);
128   
129   fPosition = 0;
130   //  cout.setf( ios_base::hex, ios_base::basefield );
131   if(fPrintout)
132     cout<<" CDH :: BC ID "<< (fRawReader->GetBCID())<<
133       " Event size"<<fRawReader->GetDataSize()<<
134       " orbit ID "<<fRawReader->GetOrbitID()<< 
135       " event index "<<fRawReader->GetEventIndex()<<
136       " event type " <<fRawReader->GetType()<<endl;
137   //DRM header
138     for (Int_t i=0; i<6; i++) {
139       word = GetNextWord();
140       if(fPrintout && i==0) cout<<" DRM header:: event words "<<AliBitPacking::UnpackWord(word,4, 20);
141       //  cout<<i<<" DRM header "<<word<<endl;
142       if (fPrintout && i==4 ) cout<<" L0BC ID "<< AliBitPacking::UnpackWord(word,4, 15)<<endl;
143       header = AliBitPacking::UnpackWord(word,28,31);
144       if( header !=4 ) 
145         {
146           AliWarning(Form(" !!!! wrong  DRM header  %x!!!!", word));
147           fRawReader->AddFatalErrorLog(kWrongDRMHeader,Form("w=%x",word));
148           break;
149         }
150     }
151     for (Int_t ntrm=0; ntrm< fNTRM; ntrm++)
152       {
153         //TRMheader  
154         word = GetNextWord();
155         //      cout<<" TRM "<<word<<endl;
156         header = AliBitPacking::UnpackWord(word,28,31);
157         if ( header != 4 )
158           {
159             AliWarning(Form(" !!!! wrong TRM header  %x!!!!", word));
160             fRawReader->AddMajorErrorLog(kWrongTRMHeader,Form("w=%x",word));
161             break;
162           }
163         numberOfWordsInTRM=AliBitPacking::UnpackWord(word,4,16);
164         if(fPrintout) {
165           cout<<" TRM header :: event words "<<numberOfWordsInTRM;
166           cout<<" ACQ bits "<<AliBitPacking::UnpackWord(word,17,18);
167           cout<<" L bit "<<AliBitPacking::UnpackWord(word,19,19)<<endl;
168         }
169         iTRM=AliBitPacking::UnpackWord(word,0,3);
170         for( Int_t ichain=0; ichain<2; ichain++)
171           {
172             //chain header
173             word = GetNextWord();
174             uu = word & trm_chain_header;
175             if(uu != trm_chain_header) 
176               {
177                 AliWarning(Form(" !!!! wrong CHAIN  0  header %x!!!!", word));
178                 fRawReader->AddMajorErrorLog(kWrongChain0Header,Form("w=%x",word));
179                 break;
180               }
181             fBunchID=AliBitPacking::UnpackWord(word,4,15);
182             if(fPrintout)
183               cout<<" chain "<< ichain<<" header:: BunchID  "<<fBunchID;
184             word = GetNextWord();
185             //   cout<<" next word "<<word<<endl;
186             tdcTime =  AliBitPacking::UnpackWord(word,31,31);   
187             //      for (; tdcTime==1; tdcTime) 
188             while(tdcTime==1)
189               {
190                 correct = kTRUE;
191                 itdc=AliBitPacking::UnpackWord(word,24,27);
192                 ichannel=AliBitPacking::UnpackWord(word,21,23);
193                 time=AliBitPacking::UnpackWord(word,0,20);
194                 
195                 koef = fParam->GetChannel(iTRM,itdc,ichain,ichannel);
196                 if (koef != 0 ) 
197                  if(fPrintout)
198                    cout<<"RawReader>> "<<"koef "<<koef<<" trm "<<iTRM<<
199                     " tdc "<<itdc<<" chain "<<ichain<<
200                     " channel "<<ichannel<<" time "<<time<<endl;
201                 if (koef ==-1 ){
202                   AliWarning(Form("Incorrect lookup table ! "));
203                   fRawReader->AddMajorErrorLog(kIncorrectLUT);
204                   correct=kFALSE;
205                 }
206                 if(correct){
207                   hit=koefhits[koef];
208                   if(hit>4) {  
209                     AliDebug(10,Form("Too many hits for %i channel - %i ! ",koef,koefhits[koef] )); 
210                     hit=4;
211                   }
212                   fAllData[koef][hit]=time; 
213                   koefhits[koef]++;
214                 }
215                 word = GetNextWord();
216
217                 tdcTime =  AliBitPacking::UnpackWord(word,31,31);   
218                 
219               }
220             
221             uu = word&trm_chain_trailer;
222             if(uu != trm_chain_trailer )
223               {
224                 AliWarning(Form(" !!!! wrong CHAIN 0 trailer %x !!!!", word));
225                 fRawReader->AddMajorErrorLog(kWrongChain0Trailer,Form("w=%x",word));
226                 break;
227               }
228             if(fPrintout)
229               cout<<"chain trailer:: event counter "<< AliBitPacking::UnpackWord(word,16,27)<<endl;
230           }
231             
232         word = GetNextWord(); //TRM trailer
233         if(fPrintout)   cout<<" TRM trailer "<<word<<endl;
234         header = AliBitPacking::UnpackWord(word,28,31);
235         if( header !=5 )
236           {
237             AliWarning(Form(" !!!! wrong TRM GLOBAL trailer  %x!!!!", word));
238             fRawReader->AddMajorErrorLog(kWrongTRMTrailer,Form("w=%x",word));
239             break;
240           }
241         if(fPrintout)
242           cout<<"  TRM trailer :: event counter "<< AliBitPacking::UnpackWord(word,16,27)<<endl;
243       } //TRM loop
244     word = GetNextWord(); //
245     if (word == filler )  word = GetNextWord(); 
246      header = AliBitPacking::UnpackWord(word,28,31);
247      if( header !=5 )
248        {
249          AliWarning(Form(" !!!! wrong DRM GLOBAL trailer  %x!!!!", word));
250          fRawReader->AddFatalErrorLog(kWrongDRMTrailer,Form("w=%x",word));
251       }
252      if(fPrintout)
253        cout<<" DRM trailer ::event counter "<< AliBitPacking::UnpackWord(word,4,15)<<endl;
254      cout.setf( ios_base::dec, ios_base::basefield );
255     
256      return kTRUE;
257 }
258 //_____________________________________________________________________________
259 Int_t AliT0RawReader::GetPosition()
260 {
261   // Sets the position in the
262   // input stream
263   if (((fRawReader->GetDataSize() * 8) % 32) != 0)
264     AliFatal(Form("Incorrect raw data size ! %d words are found !",fRawReader->GetDataSize()));
265   return (fRawReader->GetDataSize() * 8) / 32;
266 }
267 //_____________________________________________________________________________
268 UInt_t AliT0RawReader::GetNextWord()
269 {
270   // Read the next 32 bit word in backward direction
271   // The input stream access is given by fData and fPosition
272
273
274   //   fPosition--;
275   Int_t iBit = fPosition * 32;
276   Int_t iByte = iBit / 8;
277
278   UInt_t word = 0;
279   word  = fData[iByte+3]<<24;
280   word |= fData[iByte+2]<<16;
281   word |= fData[iByte+1]<<8;
282   word |= fData[iByte];
283    fPosition++;
284
285   return word;
286
287 }
288