]>
Commit | Line | Data |
---|---|---|
ee74718b | 1 | #include "AliSTARTRawReader.h" |
2 | #include "AliSTARTRawData.h" | |
db173afc | 3 | #include "AliSTARTdigit.h" |
460b4363 | 4 | #include "AliBitPacking.h" |
31199586 | 5 | #include "TBits.h" |
ee74718b | 6 | |
7 | #include <Riostream.h> | |
8 | #include "TMath.h" | |
9 | #include "TH1F.h" | |
10 | #include "TArrayI.h" | |
11 | #include "AliLog.h" | |
12 | ||
13 | ClassImp(AliSTARTRawReader) | |
db173afc | 14 | |
15 | AliSTARTRawReader::AliSTARTRawReader (AliRawReader *rawReader, TTree* tree) | |
16 | : TTask("STARTRawReader","read raw START data"), | |
074027eb | 17 | fDigits(NULL), |
db173afc | 18 | fTree(tree), |
19 | fRawReader(rawReader) | |
ee74718b | 20 | { |
21 | // | |
22 | // create an object to read STARTraw digits | |
23 | AliDebug(1,"Start "); | |
31199586 | 24 | if (fDigits == 0x0) fDigits = new AliSTARTdigit(); |
25 | fTree->Branch("START","AliSTARTdigit",&fDigits,405,1); | |
26 | ||
27 | fRawReader->Reset(); | |
362c9d61 | 28 | fRawReader->Select("START"); |
31199586 | 29 | |
ee74718b | 30 | |
31 | } | |
32 | AliSTARTRawReader::~AliSTARTRawReader () | |
33 | { | |
db173afc | 34 | // |
ee74718b | 35 | } |
ee74718b | 36 | |
4c7da157 | 37 | Bool_t AliSTARTRawReader::Next() |
ee74718b | 38 | { |
39 | // read the next raw digit | |
40 | // returns kFALSE if there is no digit left | |
61be8c4a | 41 | //"LookUpTable": |
42 | // Amplitude LED TRM=0; chain=0; TDC 0 -5 channel 0,2,4,6 | |
43 | // Time CFD TRM=0; chain=0; TDC 6 - 11 channel 0,2,4,6 | |
44 | // mean time TRM=0; chain=0; TDC 12 channel 0 | |
45 | // T0A TRM=0; chain=0; TDC 12 channel 2 | |
46 | // T0C TRM=0; chain=0; TDC 12 channel 4 | |
47 | // vertex TRM=0; chain=0; TDC 12 channel 6 | |
48 | // mult QTC0 TRM=0; chain=0; TDC 13 channel 0 | |
49 | // mult QTC1 TRM=0; chain=0; TDC 13 channel 2 | |
50 | ||
51 | // Charge QTC0 TRM=1; chain=0; TDC 0 -5 channel 0,2,4,6 | |
52 | // Charge QTC1 TRM=1; chain=0; TDC 6 - 11 channel 0,2,4,6 | |
53 | // T0A trigger TRM=1; chain=0; TDC 12 channel 0 | |
54 | // T0C trigger TRM=1; chain=0; TDC 12 channel 2 | |
55 | // vertex trigger TRM=1; chain=0; TDC 12 channel 4 | |
56 | // trigger central TRM=1; chain=0; TDC 13 channel 0 | |
57 | // tigger semicenral TRM=1; chain=0; TDC 13 channel 2 | |
58 | ||
59 | ||
60 | UInt_t word; | |
61 | Int_t time=0, itdc=0, ichannel=0; | |
62 | Int_t numberOfWordsInTRM=0, iTRM=0; | |
63 | Int_t tdcTime, koef ; | |
64 | Int_t allData[107]; | |
460b4363 | 65 | |
db173afc | 66 | TArrayI *timeTDC1 = new TArrayI(24); |
67 | TArrayI * chargeTDC1 = new TArrayI(24); | |
68 | TArrayI *timeTDC2 = new TArrayI(24); | |
69 | TArrayI *chargeTDC2 = new TArrayI(24); | |
61be8c4a | 70 | |
71 | for ( Int_t k=0; k<107; k++) allData[k]=0; | |
31199586 | 72 | do { |
73 | if (!fRawReader->ReadNextData(fData)) return kFALSE; | |
74 | } while (fRawReader->GetDataSize() == 0); | |
db173afc | 75 | |
61be8c4a | 76 | // fPosition = GetPosition(); |
77 | fPosition = 0; | |
3e32c02e | 78 | |
61be8c4a | 79 | //DRM header |
80 | for (Int_t i=0; i<4; i++) { | |
81 | word = GetNextWord(); | |
82 | } | |
83 | //TRMheader | |
31199586 | 84 | word = GetNextWord(); |
61be8c4a | 85 | numberOfWordsInTRM=AliBitPacking::UnpackWord(word,4,16); |
86 | iTRM=AliBitPacking::UnpackWord(word,0,3); | |
3e32c02e | 87 | |
61be8c4a | 88 | //chain header |
3e32c02e | 89 | word = GetNextWord(); |
61be8c4a | 90 | |
91 | for (Int_t i=0; i<numberOfWordsInTRM; i++) { | |
92 | word = GetNextWord(); | |
93 | tdcTime = AliBitPacking::UnpackWord(word,31,31); | |
94 | ||
95 | if ( tdcTime == 1) | |
96 | { | |
97 | itdc=AliBitPacking::UnpackWord(word,24,27); | |
98 | ichannel=AliBitPacking::UnpackWord(word,21,23); | |
99 | time=AliBitPacking::UnpackWord(word,0,20); | |
100 | koef = itdc*4 + ichannel/2; | |
101 | allData[koef]=time; | |
102 | } | |
103 | } | |
104 | word = GetNextWord(); //chain trailer | |
105 | word = GetNextWord(); //TRM trailer | |
106 | ||
107 | //TRMheader | |
108 | word = GetNextWord(); | |
109 | numberOfWordsInTRM=AliBitPacking::UnpackWord(word,4,16); | |
110 | iTRM=AliBitPacking::UnpackWord(word,0,3); | |
111 | //chain header | |
3e32c02e | 112 | word = GetNextWord(); |
61be8c4a | 113 | |
114 | for (Int_t iword=0; iword<numberOfWordsInTRM; iword++) { | |
115 | word = GetNextWord(); | |
116 | tdcTime = AliBitPacking::UnpackWord(word,31,31); | |
117 | ||
118 | if ( tdcTime == 1) | |
119 | { | |
120 | itdc=AliBitPacking::UnpackWord(word,24,27); | |
121 | ichannel=AliBitPacking::UnpackWord(word,21,23); | |
122 | time=AliBitPacking::UnpackWord(word,0,20); | |
123 | koef = itdc*4 + ichannel/2; | |
124 | allData[koef+54]=time; | |
125 | } | |
126 | } | |
127 | ||
128 | for (Int_t in=0; in<24; in++) | |
129 | { | |
130 | timeTDC1->AddAt(allData[in],in); | |
131 | timeTDC2->AddAt(allData[in+24],in); | |
132 | chargeTDC1->AddAt(allData[in+54],in); | |
133 | chargeTDC2->AddAt(allData[in+78],in); | |
134 | } | |
3e32c02e | 135 | word = GetNextWord(); |
3e32c02e | 136 | word = GetNextWord(); |
d1e4fb84 | 137 | |
61be8c4a | 138 | fDigits->SetTime(*timeTDC2); |
139 | fDigits->SetADC(*chargeTDC1); | |
3e32c02e | 140 | |
61be8c4a | 141 | fDigits->SetTimeAmp(*timeTDC1); |
142 | fDigits->SetADCAmp(*chargeTDC2); | |
143 | fTree->Fill(); | |
3e32c02e | 144 | |
61be8c4a | 145 | delete timeTDC1 ; |
146 | delete chargeTDC1; | |
147 | delete timeTDC2 ; | |
148 | delete chargeTDC2; | |
149 | ||
150 | return kTRUE; | |
151 | } | |
152 | //_____________________________________________________________________________ | |
153 | /* | |
154 | void AliSTARTRawReader::UnpackTime(Int_t outTime, Int_t outCh) | |
155 | { | |
156 | UInt_t word=0; | |
157 | UInt_t unpackword=0; | |
31199586 | 158 | |
159 | word = GetNextWord(); | |
61be8c4a | 160 | unpackword=AliBitPacking::UnpackWord(word,0,12); |
161 | outTime=unpackword; | |
162 | unpackword= AliBitPacking::UnpackWord(word,21,27); | |
163 | outCh=unpackword; | |
164 | } | |
165 | */ | |
31199586 | 166 | //_____________________________________________________________________________ |
167 | Int_t AliSTARTRawReader::GetPosition() | |
168 | { | |
169 | // Sets the position in the | |
170 | // input stream | |
171 | if (((fRawReader->GetDataSize() * 8) % 32) != 0) | |
172 | AliFatal(Form("Incorrect raw data size ! %d words are found !",fRawReader->GetDataSize())); | |
173 | return (fRawReader->GetDataSize() * 8) / 32; | |
174 | } | |
175 | //_____________________________________________________________________________ | |
176 | UInt_t AliSTARTRawReader::GetNextWord() | |
177 | { | |
178 | // Read the next 32 bit word in backward direction | |
179 | // The input stream access is given by fData and fPosition | |
180 | ||
61be8c4a | 181 | |
182 | // fPosition--; | |
31199586 | 183 | Int_t iBit = fPosition * 32; |
184 | Int_t iByte = iBit / 8; | |
1d88be16 | 185 | |
31199586 | 186 | UInt_t word = 0; |
1d88be16 | 187 | word = fData[iByte+3]<<24; |
188 | word |= fData[iByte+2]<<16; | |
189 | word |= fData[iByte+1]<<8; | |
190 | word |= fData[iByte]; | |
61be8c4a | 191 | fPosition++; |
192 | ||
31199586 | 193 | return word; |
194 | ||
195 | } | |
196 |