all time measurements perfomed as difference with case vertex=0
[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           AliError(Form(" !!!! wrong  DRM header  %x!!!!", word));
115           break;
116       }
117     }
118     
119      for (Int_t ntrm=0; ntrm< fNTRM; ntrm++)
120      {
121       //TRMheader  
122       word = GetNextWord();
123       uu = word&TRM_GLOBAL_HEADER;
124       if(uu != TRM_GLOBAL_HEADER )
125         {
126           AliError(Form(" !!!! wrong TRM header  %x!!!!", word));
127           break;
128         }
129       numberOfWordsInTRM=AliBitPacking::UnpackWord(word,4,16);
130       iTRM=AliBitPacking::UnpackWord(word,0,3);
131       
132       //chain header
133       word = GetNextWord();
134       uu = word & TRM_CHAIN_0_HEADER;
135       if(uu != TRM_CHAIN_0_HEADER) 
136         {
137           AliError(Form(" !!!! wrong CHAIN  0  header %x!!!!", word));
138           break;
139         }
140       Int_t ichain=AliBitPacking::UnpackWord(word,0,3);
141       
142       for (Int_t i=0; i<numberOfWordsInTRM-6; i++) {
143         word = GetNextWord();
144         tdcTime =  AliBitPacking::UnpackWord(word,31,31);   
145
146         if ( tdcTime == 1)
147           {
148             itdc=AliBitPacking::UnpackWord(word,24,27);
149             ichannel=AliBitPacking::UnpackWord(word,21,23);
150             time=AliBitPacking::UnpackWord(word,0,20);
151             koef = param->GetChannel(iTRM,itdc,ichain,ichannel);
152             if (koef ==-1 ){
153               AliError(Form("Incorrect lookup table ! "));
154               break;
155             }
156             hit=koefhits[koef];
157             if(fAllData[koef][hit] == 0)  fAllData[koef][hit]=time; 
158             koefhits[koef]++;
159             //      cout<<koef<<" "<<iTRM<<" "<<itdc<<" "<<ichannel<<" "<<time<<endl;
160             
161           }
162       }
163       word = GetNextWord(); //chain 0  trailer
164       uu = word&TRM_CHAIN_0_TRAILER;
165       if(uu != TRM_CHAIN_0_TRAILER )
166         {
167         AliError(Form(" !!!! wrong CHAIN 0 trailer %x !!!!", word));
168         break;
169         }
170       
171      
172       word = GetNextWord(); //chain 1 header
173       uu = word & TRM_CHAIN_1_HEADER;
174       if(uu != TRM_CHAIN_1_HEADER) 
175         {
176           AliError(Form(" !!!! wrong CHAIN 1  header %x !!!!", word));
177           break;
178         }
179       word = GetNextWord(); //chain trailer
180       uu = word&TRM_CHAIN_1_TRAILER;
181       if(uu != TRM_CHAIN_1_TRAILER )
182         {
183           AliError(Form(" !!!! wrong CHAIN 1 trailer  %x!!!!", word));
184         break;
185         }
186       
187       word = GetNextWord(); //TRM trailer
188       uu = word& TRM_GLOBAL_TRAILER;
189       if(uu != TRM_GLOBAL_TRAILER )
190         {
191           AliError(Form(" !!!! wrong TRM GLOBAL trailer  %x!!!!", word));
192           break;
193         }
194      } //TRM loop end
195
196       word = GetNextWord(); //
197       if (word == FILLER )  {cout<< "FIILER "<<endl; word = GetNextWord(); }
198       uu = word& fDRM_GLOBAL_TRAILER;
199       if(uu != fDRM_GLOBAL_TRAILER )
200         {
201           AliError(Form(" !!!! wrong DRM GLOBAL trailer  %x!!!!", word));
202           //      break;
203         }
204   
205    return kTRUE;
206 }
207 //_____________________________________________________________________________
208 Int_t AliT0RawReader::GetPosition()
209 {
210   // Sets the position in the
211   // input stream
212   if (((fRawReader->GetDataSize() * 8) % 32) != 0)
213     AliFatal(Form("Incorrect raw data size ! %d words are found !",fRawReader->GetDataSize()));
214   return (fRawReader->GetDataSize() * 8) / 32;
215 }
216 //_____________________________________________________________________________
217 UInt_t AliT0RawReader::GetNextWord()
218 {
219   // Read the next 32 bit word in backward direction
220   // The input stream access is given by fData and fPosition
221
222
223   //   fPosition--;
224   Int_t iBit = fPosition * 32;
225   Int_t iByte = iBit / 8;
226
227   UInt_t word = 0;
228   word  = fData[iByte+3]<<24;
229   word |= fData[iByte+2]<<16;
230   word |= fData[iByte+1]<<8;
231   word |= fData[iByte];
232    fPosition++;
233
234   return word;
235
236 }
237