1 #include "AliT0RawReader.h"
2 #include "AliT0Parameters.h"
3 #include "AliBitPacking.h"
12 ClassImp(AliT0RawReader)
14 AliT0RawReader::AliT0RawReader (AliRawReader *rawReader)
15 : TTask("T0RawReader","read raw T0 data"),
16 fRawReader(rawReader),
21 // create an object to read T0raw digits
25 fRawReader->Select("T0");
28 AliT0RawReader::~AliT0RawReader ()
33 AliT0RawReader::AliT0RawReader(const AliT0RawReader& o): TTask(o),
34 fRawReader(rawReader),
43 Bool_t AliT0RawReader::Next()
45 // read the next raw digit
46 // returns kFALSE if there is no digit left
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
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
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)
73 Int_t time=0, itdc=0, ichannel=0, uu;
74 Int_t numberOfWordsInTRM=0, iTRM=0;
75 Int_t tdcTime, koef,hit=0;
78 Int_t fDRM_GLOBAL_HEADER = 0x40000001;
79 Int_t fDRM_GLOBAL_TRAILER = 0x50000001;
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;
88 AliT0Parameters* param = AliT0Parameters::Instance();
90 Int_t fNTRM = param->GetNumberOfTRMs();
92 for ( Int_t k=0; k<110; k++) {
94 for ( Int_t jj=0; jj<5; jj++) {
99 if (!fRawReader->ReadNextData(fData)) return kFALSE;
100 } while (fRawReader->GetDataSize() == 0);
102 // fPosition = GetPosition();
104 // cout.setf( ios_base::hex, ios_base::basefield );
107 for (Int_t i=0; i<6; i++) {
108 word = GetNextWord();
109 uu = word&fDRM_GLOBAL_HEADER;
110 if(uu != fDRM_GLOBAL_HEADER )
112 AliError(Form(" !!!! wrong DRM header %x!!!!", word));
117 for (Int_t ntrm=0; ntrm< fNTRM; ntrm++)
120 word = GetNextWord();
121 uu = word&TRM_GLOBAL_HEADER;
122 if(uu != TRM_GLOBAL_HEADER )
124 AliError(Form(" !!!! wrong TRM header %x!!!!", word));
127 numberOfWordsInTRM=AliBitPacking::UnpackWord(word,4,16);
128 iTRM=AliBitPacking::UnpackWord(word,0,3);
131 word = GetNextWord();
132 uu = word & TRM_CHAIN_0_HEADER;
133 if(uu != TRM_CHAIN_0_HEADER)
135 AliError(Form(" !!!! wrong CHAIN 0 header %x!!!!", word));
138 Int_t ichain=AliBitPacking::UnpackWord(word,0,3);
140 for (Int_t i=0; i<numberOfWordsInTRM-6; i++) {
141 word = GetNextWord();
142 tdcTime = AliBitPacking::UnpackWord(word,31,31);
146 itdc=AliBitPacking::UnpackWord(word,24,27);
147 ichannel=AliBitPacking::UnpackWord(word,21,23);
148 time=AliBitPacking::UnpackWord(word,0,20);
149 koef = param->GetChannel(iTRM,itdc,ichain,ichannel);
151 AliError(Form("Incorrect lookup table ! "));
155 if(fAllData[koef][hit] == 0) fAllData[koef][hit]=time;
157 // cout<<koef<<" "<<iTRM<<" "<<itdc<<" "<<ichannel<<" "<<time<<endl;
161 word = GetNextWord(); //chain 0 trailer
162 uu = word&TRM_CHAIN_0_TRAILER;
163 if(uu != TRM_CHAIN_0_TRAILER )
165 AliError(Form(" !!!! wrong CHAIN 0 trailer %x !!!!", word));
170 word = GetNextWord(); //chain 1 header
171 uu = word & TRM_CHAIN_1_HEADER;
172 if(uu != TRM_CHAIN_1_HEADER)
174 AliError(Form(" !!!! wrong CHAIN 1 header %x !!!!", word));
177 word = GetNextWord(); //chain trailer
178 uu = word&TRM_CHAIN_1_TRAILER;
179 if(uu != TRM_CHAIN_1_TRAILER )
181 AliError(Form(" !!!! wrong CHAIN 1 trailer %x!!!!", word));
185 word = GetNextWord(); //TRM trailer
186 uu = word& TRM_GLOBAL_TRAILER;
187 if(uu != TRM_GLOBAL_TRAILER )
189 AliError(Form(" !!!! wrong TRM GLOBAL trailer %x!!!!", word));
193 word = GetNextWord(); //
194 uu = word& fDRM_GLOBAL_TRAILER;
195 if(uu != fDRM_GLOBAL_TRAILER )
197 AliError(Form(" !!!! wrong DRM GLOBAL trailer %x!!!!", word));
203 //_____________________________________________________________________________
204 Int_t AliT0RawReader::GetPosition()
206 // Sets the position in the
208 if (((fRawReader->GetDataSize() * 8) % 32) != 0)
209 AliFatal(Form("Incorrect raw data size ! %d words are found !",fRawReader->GetDataSize()));
210 return (fRawReader->GetDataSize() * 8) / 32;
212 //_____________________________________________________________________________
213 UInt_t AliT0RawReader::GetNextWord()
215 // Read the next 32 bit word in backward direction
216 // The input stream access is given by fData and fPosition
220 Int_t iBit = fPosition * 32;
221 Int_t iByte = iBit / 8;
224 word = fData[iByte+3]<<24;
225 word |= fData[iByte+2]<<16;
226 word |= fData[iByte+1]<<8;
227 word |= fData[iByte];