1 #include "AliT0RawReader.h"
2 #include "AliT0RawData.h"
3 #include "AliT0digit.h"
4 #include "AliBitPacking.h"
13 ClassImp(AliT0RawReader)
15 AliT0RawReader::AliT0RawReader (AliRawReader *rawReader, TTree* tree)
16 : TTask("T0RawReader","read raw T0 data"),
19 fRawReader(rawReader),
24 // create an object to read T0raw digits
26 if (fDigits == 0x0) fDigits = new AliT0digit();
27 fTree->Branch("T0","AliT0digit",&fDigits,405,1);
30 fRawReader->Select("T0");
34 AliT0RawReader::~AliT0RawReader ()
39 Bool_t AliT0RawReader::Next()
41 // read the next raw digit
42 // returns kFALSE if there is no digit left
44 // Amplitude LED TRM=0; chain=0; TDC 0 -5 channel 0,2,4,6
45 // Time CFD TRM=0; chain=0; TDC 6 - 11 channel 0,2,4,6
46 // mean time TRM=0; chain=0; TDC 12 channel 0
47 // T0A TRM=0; chain=0; TDC 12 channel 2
48 // T0C TRM=0; chain=0; TDC 12 channel 4
49 // vertex TRM=0; chain=0; TDC 12 channel 6
50 // mult QTC0 TRM=0; chain=0; TDC 13 channel 0
51 // mult QTC1 TRM=0; chain=0; TDC 13 channel 2
53 // Charge QTC0 TRM=1; chain=0; TDC 0 -5 channel 0,2,4,6
54 // Charge QTC1 TRM=1; chain=0; TDC 6 - 11 channel 0,2,4,6
55 // T0A trigger TRM=1; chain=0; TDC 12 channel 0
56 // T0C trigger TRM=1; chain=0; TDC 12 channel 2
57 // vertex trigger TRM=1; chain=0; TDC 12 channel 4
58 // trigger central TRM=1; chain=0; TDC 13 channel 0
59 // tigger semicenral TRM=1; chain=0; TDC 13 channel 2
61 // allData array collect data from all channels in one :
62 // allData[0] - allData[23] 24 CFD channels
63 // allData[24] - allData[47] 24 LED channels
64 // allData[48] mean (T0) signal
65 // allData[49] time difference (vertex)
68 Int_t time=0, itdc=0, ichannel=0;
69 Int_t numberOfWordsInTRM=0, iTRM=0;
70 Int_t tdcTime, koef, meanTime, timeDiff ;
73 TArrayI *timeTDC1 = new TArrayI(24);
74 TArrayI * chargeTDC1 = new TArrayI(24);
75 TArrayI *timeTDC2 = new TArrayI(24);
76 TArrayI *chargeTDC2 = new TArrayI(24);
78 for ( Int_t k=0; k<107; k++) allData[k]=0;
80 if (!fRawReader->ReadNextData(fData)) return kFALSE;
81 } while (fRawReader->GetDataSize() == 0);
83 // fPosition = GetPosition();
87 for (Int_t i=0; i<4; i++) {
92 numberOfWordsInTRM=AliBitPacking::UnpackWord(word,4,16);
93 iTRM=AliBitPacking::UnpackWord(word,0,3);
98 for (Int_t i=0; i<numberOfWordsInTRM; i++) {
100 tdcTime = AliBitPacking::UnpackWord(word,31,31);
104 itdc=AliBitPacking::UnpackWord(word,24,27);
105 ichannel=AliBitPacking::UnpackWord(word,21,23);
106 time=AliBitPacking::UnpackWord(word,0,20);
107 koef = itdc*4 + ichannel/2;
111 word = GetNextWord(); //chain trailer
112 word = GetNextWord(); //TRM trailer
115 word = GetNextWord();
116 numberOfWordsInTRM=AliBitPacking::UnpackWord(word,4,16);
117 iTRM=AliBitPacking::UnpackWord(word,0,3);
119 word = GetNextWord();
121 for (Int_t iword=0; iword<numberOfWordsInTRM; iword++) {
122 word = GetNextWord();
123 tdcTime = AliBitPacking::UnpackWord(word,31,31);
127 itdc=AliBitPacking::UnpackWord(word,24,27);
128 ichannel=AliBitPacking::UnpackWord(word,21,23);
129 time=AliBitPacking::UnpackWord(word,0,20);
130 koef = itdc*4 + ichannel/2;
131 allData[koef+54]=time;
135 for (Int_t in=0; in<24; in++)
137 timeTDC1->AddAt(allData[in],in);
138 timeTDC2->AddAt(allData[in+24],in);
139 chargeTDC1->AddAt(allData[in+54],in);
140 chargeTDC2->AddAt(allData[in+78],in);
143 meanTime = allData[48]; // T0 !!!!!!
144 timeDiff = allData[49];
146 word = GetNextWord();
147 word = GetNextWord();
149 fDigits->SetTime(*timeTDC2);
150 fDigits->SetADC(*chargeTDC1);
152 fDigits->SetTimeAmp(*timeTDC1);
153 fDigits->SetADCAmp(*chargeTDC2);
155 fDigits->SetMeanTime(meanTime);
156 fDigits->SetDiffTime(timeDiff);
166 //_____________________________________________________________________________
168 void AliT0RawReader::UnpackTime(Int_t outTime, Int_t outCh)
173 word = GetNextWord();
174 unpackword=AliBitPacking::UnpackWord(word,0,12);
176 unpackword= AliBitPacking::UnpackWord(word,21,27);
180 //_____________________________________________________________________________
181 Int_t AliT0RawReader::GetPosition()
183 // Sets the position in the
185 if (((fRawReader->GetDataSize() * 8) % 32) != 0)
186 AliFatal(Form("Incorrect raw data size ! %d words are found !",fRawReader->GetDataSize()));
187 return (fRawReader->GetDataSize() * 8) / 32;
189 //_____________________________________________________________________________
190 UInt_t AliT0RawReader::GetNextWord()
192 // Read the next 32 bit word in backward direction
193 // The input stream access is given by fData and fPosition
197 Int_t iBit = fPosition * 32;
198 Int_t iByte = iBit / 8;
201 word = fData[iByte+3]<<24;
202 word |= fData[iByte+2]<<16;
203 word |= fData[iByte+1]<<8;
204 word |= fData[iByte];