]>
Commit | Line | Data |
---|---|---|
dc7ca31d | 1 | #include "AliT0RawReader.h" |
e0bba6cc | 2 | #include "AliT0Parameters.h" |
dc7ca31d | 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 | ||
e0bba6cc | 14 | AliT0RawReader::AliT0RawReader (AliRawReader *rawReader) |
dc7ca31d | 15 | : TTask("T0RawReader","read raw T0 data"), |
dc7ca31d | 16 | fRawReader(rawReader), |
17 | fData(NULL), | |
18 | fPosition(0) | |
19 | { | |
20 | // | |
21 | // create an object to read T0raw digits | |
22 | AliDebug(1,"Start "); | |
dc7ca31d | 23 | |
24 | fRawReader->Reset(); | |
25 | fRawReader->Select("T0"); | |
26 | ||
27 | ||
28 | } | |
29 | AliT0RawReader::~AliT0RawReader () | |
30 | { | |
31 | // | |
32 | } | |
33 | ||
34 | Bool_t AliT0RawReader::Next() | |
35 | { | |
36 | // read the next raw digit | |
37 | // returns kFALSE if there is no digit left | |
38 | //"LookUpTable": | |
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 | |
47 | ||
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 | |
55 | // | |
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) | |
61 | ||
e0bba6cc | 62 | |
63 | // if (fDigits == 0x0) fDigits = new AliT0digit(); | |
64 | // fTree->Branch("T0","AliT0digit",&fDigits,405,1); | |
65 | ||
dc7ca31d | 66 | UInt_t word; |
67 | Int_t time=0, itdc=0, ichannel=0; | |
68 | Int_t numberOfWordsInTRM=0, iTRM=0; | |
e0bba6cc | 69 | Int_t tdcTime, koef,hit, meanTime, timeDiff ; |
dc7ca31d | 70 | |
e0bba6cc | 71 | |
72 | ||
73 | AliT0Parameters* param = AliT0Parameters::Instance(); //-->Zhenya | |
74 | param->Init(); | |
75 | ||
76 | for ( Int_t k=0; k<110; k++) { | |
77 | for ( Int_t jj=0; jj<5; jj++) { | |
78 | fAllData[k][jj]=0; | |
79 | } | |
80 | } | |
81 | do { | |
dc7ca31d | 82 | if (!fRawReader->ReadNextData(fData)) return kFALSE; |
83 | } while (fRawReader->GetDataSize() == 0); | |
84 | ||
85 | // fPosition = GetPosition(); | |
86 | fPosition = 0; | |
87 | ||
88 | //DRM header | |
89 | for (Int_t i=0; i<4; i++) { | |
90 | word = GetNextWord(); | |
91 | } | |
92 | //TRMheader | |
93 | word = GetNextWord(); | |
94 | numberOfWordsInTRM=AliBitPacking::UnpackWord(word,4,16); | |
95 | iTRM=AliBitPacking::UnpackWord(word,0,3); | |
96 | ||
97 | //chain header | |
e0bba6cc | 98 | Int_t ichain=0; |
dc7ca31d | 99 | word = GetNextWord(); |
100 | ||
101 | for (Int_t i=0; i<numberOfWordsInTRM; i++) { | |
102 | word = GetNextWord(); | |
103 | tdcTime = AliBitPacking::UnpackWord(word,31,31); | |
104 | ||
105 | if ( tdcTime == 1) | |
106 | { | |
107 | itdc=AliBitPacking::UnpackWord(word,24,27); | |
108 | ichannel=AliBitPacking::UnpackWord(word,21,23); | |
109 | time=AliBitPacking::UnpackWord(word,0,20); | |
e0bba6cc | 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 | |
114 | ||
dc7ca31d | 115 | } |
116 | } | |
117 | word = GetNextWord(); //chain trailer | |
118 | word = GetNextWord(); //TRM trailer | |
119 | ||
120 | //TRMheader | |
121 | word = GetNextWord(); | |
122 | numberOfWordsInTRM=AliBitPacking::UnpackWord(word,4,16); | |
123 | iTRM=AliBitPacking::UnpackWord(word,0,3); | |
e0bba6cc | 124 | |
dc7ca31d | 125 | //chain header |
126 | word = GetNextWord(); | |
127 | ||
128 | for (Int_t iword=0; iword<numberOfWordsInTRM; iword++) { | |
129 | word = GetNextWord(); | |
130 | tdcTime = AliBitPacking::UnpackWord(word,31,31); | |
131 | ||
132 | if ( tdcTime == 1) | |
133 | { | |
134 | itdc=AliBitPacking::UnpackWord(word,24,27); | |
135 | ichannel=AliBitPacking::UnpackWord(word,21,23); | |
136 | time=AliBitPacking::UnpackWord(word,0,20); | |
e0bba6cc | 137 | // koef = itdc*4 + ichannel/2; |
138 | koef = param->GetChannel(iTRM,itdc,ichain,ichannel); | |
139 | ||
140 | if(fAllData[koef][0] == 0) fAllData[koef][0]=time; | |
141 | // if(allData[koef+55] == 0) allData[koef+55]=time; // yield only 1st particle | |
dc7ca31d | 142 | } |
143 | } | |
e0bba6cc | 144 | meanTime = fAllData[49][0]; // T0 !!!!!! |
145 | timeDiff = fAllData[50][0]; | |
dc7ca31d | 146 | |
147 | word = GetNextWord(); | |
148 | word = GetNextWord(); | |
dc7ca31d | 149 | return kTRUE; |
150 | } | |
151 | //_____________________________________________________________________________ | |
dc7ca31d | 152 | Int_t AliT0RawReader::GetPosition() |
153 | { | |
154 | // Sets the position in the | |
155 | // input stream | |
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; | |
159 | } | |
160 | //_____________________________________________________________________________ | |
161 | UInt_t AliT0RawReader::GetNextWord() | |
162 | { | |
163 | // Read the next 32 bit word in backward direction | |
164 | // The input stream access is given by fData and fPosition | |
165 | ||
166 | ||
167 | // fPosition--; | |
168 | Int_t iBit = fPosition * 32; | |
169 | Int_t iByte = iBit / 8; | |
170 | ||
171 | UInt_t word = 0; | |
172 | word = fData[iByte+3]<<24; | |
173 | word |= fData[iByte+2]<<16; | |
174 | word |= fData[iByte+1]<<8; | |
175 | word |= fData[iByte]; | |
176 | fPosition++; | |
177 | ||
178 | return word; | |
179 | ||
180 | } | |
181 |