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");
29 AliT0RawReader::~AliT0RawReader ()
34 Bool_t AliT0RawReader::Next()
36 // read the next raw digit
37 // returns kFALSE if there is no digit left
39 // Amplitude LED TRM=0; chain=0; TDC 0 -5 channel 0,2,4,6
40 // Time CFD TRM=0; chain=0; TDC 6 - 11 channel 0,2,4,6
41 // mean time TRM=0; chain=0; TDC 12 channel 0
42 // T0A TRM=0; chain=0; TDC 12 channel 2
43 // T0C TRM=0; chain=0; TDC 12 channel 4
44 // vertex TRM=0; chain=0; TDC 12 channel 6
45 // mult QTC0 TRM=0; chain=0; TDC 13 channel 0
46 // mult QTC1 TRM=0; chain=0; TDC 13 channel 2
48 // Charge QTC0 TRM=1; chain=0; TDC 0 -5 channel 0,2,4,6
49 // Charge QTC1 TRM=1; chain=0; TDC 6 - 11 channel 0,2,4,6
50 // T0A trigger TRM=1; chain=0; TDC 12 channel 0
51 // T0C trigger TRM=1; chain=0; TDC 12 channel 2
52 // vertex trigger TRM=1; chain=0; TDC 12 channel 4
53 // trigger central TRM=1; chain=0; TDC 13 channel 0
54 // tigger semicenral TRM=1; chain=0; TDC 13 channel 2
56 // allData array collect data from all channels in one :
57 // allData[0] - allData[23] 24 CFD channels
58 // allData[24] - allData[47] 24 LED channels
59 // allData[48] mean (T0) signal
60 // allData[49] time difference (vertex)
63 // if (fDigits == 0x0) fDigits = new AliT0digit();
64 // fTree->Branch("T0","AliT0digit",&fDigits,405,1);
67 Int_t time=0, itdc=0, ichannel=0;
68 Int_t numberOfWordsInTRM=0, iTRM=0;
69 Int_t tdcTime, koef,hit, meanTime, timeDiff ;
73 AliT0Parameters* param = AliT0Parameters::Instance(); //-->Zhenya
76 for ( Int_t k=0; k<110; k++) {
77 for ( Int_t jj=0; jj<5; jj++) {
82 if (!fRawReader->ReadNextData(fData)) return kFALSE;
83 } while (fRawReader->GetDataSize() == 0);
85 // fPosition = GetPosition();
89 for (Int_t i=0; i<4; i++) {
94 numberOfWordsInTRM=AliBitPacking::UnpackWord(word,4,16);
95 iTRM=AliBitPacking::UnpackWord(word,0,3);
101 for (Int_t i=0; i<numberOfWordsInTRM; i++) {
102 word = GetNextWord();
103 tdcTime = AliBitPacking::UnpackWord(word,31,31);
107 itdc=AliBitPacking::UnpackWord(word,24,27);
108 ichannel=AliBitPacking::UnpackWord(word,21,23);
109 time=AliBitPacking::UnpackWord(word,0,20);
110 // koef = itdc*4 + ichannel/2;
111 koef = param->GetChannel(iTRM,itdc,ichain,ichannel);
112 // cout<<" RawReader::Next ::"<<iTRM<<" "<<itdc<<" "<<ichain<<" "<<ichannel<<" "<< koef<<" "<<time<<endl;
113 if(fAllData[koef][0] == 0) fAllData[koef][0]=time; // yield only 1st particle
117 word = GetNextWord(); //chain trailer
118 word = GetNextWord(); //TRM trailer
121 word = GetNextWord();
122 numberOfWordsInTRM=AliBitPacking::UnpackWord(word,4,16);
123 iTRM=AliBitPacking::UnpackWord(word,0,3);
126 word = GetNextWord();
128 for (Int_t iword=0; iword<numberOfWordsInTRM; iword++) {
129 word = GetNextWord();
130 tdcTime = AliBitPacking::UnpackWord(word,31,31);
134 itdc=AliBitPacking::UnpackWord(word,24,27);
135 ichannel=AliBitPacking::UnpackWord(word,21,23);
136 time=AliBitPacking::UnpackWord(word,0,20);
137 // koef = itdc*4 + ichannel/2;
138 koef = param->GetChannel(iTRM,itdc,ichain,ichannel);
140 if(fAllData[koef][0] == 0) fAllData[koef][0]=time;
141 // if(allData[koef+55] == 0) allData[koef+55]=time; // yield only 1st particle
144 meanTime = fAllData[49][0]; // T0 !!!!!!
145 timeDiff = fAllData[50][0];
147 word = GetNextWord();
148 word = GetNextWord();
151 //_____________________________________________________________________________
152 Int_t AliT0RawReader::GetPosition()
154 // Sets the position in the
156 if (((fRawReader->GetDataSize() * 8) % 32) != 0)
157 AliFatal(Form("Incorrect raw data size ! %d words are found !",fRawReader->GetDataSize()));
158 return (fRawReader->GetDataSize() * 8) / 32;
160 //_____________________________________________________________________________
161 UInt_t AliT0RawReader::GetNextWord()
163 // Read the next 32 bit word in backward direction
164 // The input stream access is given by fData and fPosition
168 Int_t iBit = fPosition * 32;
169 Int_t iByte = iBit / 8;
172 word = fData[iByte+3]<<24;
173 word |= fData[iByte+2]<<16;
174 word |= fData[iByte+1]<<8;
175 word |= fData[iByte];