]>
Commit | Line | Data |
---|---|---|
86fe676f | 1 | // $Id: AliHLTPHOSOnlineDisplayEventTab.cxx 31683 2009-03-24 21:17:03Z odjuvsla $ |
1b41ab20 | 2 | |
27029341 | 3 | /************************************************************************** |
4 | * Copyright(c) 2006, ALICE Experiment at CERN, All rights reserved. * | |
5 | * * | |
6 | * Authors: Per Thomas Hille for the ALICE * | |
7 | * offline/HLT Project. Contributors are mentioned in the code where * | |
8 | * appropriate. * | |
9 | * * | |
10 | * Permission to use, copy, modify and distribute this software and its * | |
11 | * documentation strictly for non-commercial purposes is hereby granted * | |
12 | * without fee, provided that the above copyright notice appears in all * | |
13 | * copies and that both the copyright notice and this permission notice * | |
14 | * appear in the supporting documentation. The authors make no claims * | |
15 | * about the suitability of this software for any purpose. It is * | |
16 | * provided "as is" without express or implied warranty. * | |
17 | **************************************************************************/ | |
18 | ||
59b4cd9a | 19 | #include "AliHLTPHOSOnlineDisplayEventTab.h" |
20 | #include <iostream> | |
21 | #include "TGFrame.h" | |
22 | #include "AliHLTPHOSGetEventButton.h" | |
23 | #include "AliHLTPHOSCommonDefs.h" | |
24 | #include "AliHLTDataTypes.h" | |
6af3dade | 25 | #include "AliHLTHOMERData.h" |
26 | #include "AliHLTHOMERReader.h" | |
27 | #include "AliHLTHOMERWriter.h" | |
59b4cd9a | 28 | #include "AliHLTPHOSRcuCellEnergyDataStruct.h" |
86fe676f | 29 | #include "TRootEmbeddedCanvas.h" |
b3abda11 | 30 | //#include "AliHLTPHOSRcuCellEnergyDataStruct.h" |
14ff16ed | 31 | #include "AliHLTPHOSRcuCellEnergyDataStruct.h" |
b3abda11 | 32 | #include "AliHLTPHOSOnlineDisplay.h" |
14ff16ed | 33 | #include "AliHLTPHOSSharedMemoryInterface.h" |
59b4cd9a | 34 | |
f704525c | 35 | //#include "TStyle.h" |
36 | ||
59b4cd9a | 37 | using namespace std; |
38 | ||
997330b5 | 39 | // MT Crap |
40 | #include <TMath.h> | |
36f19b25 | 41 | #include "AliHLTPHOSOnlineDisplayTH2D.h" |
42 | ||
18af2efc | 43 | //#include <TEveManager.h> |
44 | //#include <TEveBoxSet.h> | |
997330b5 | 45 | |
18af2efc | 46 | //TEveBoxSet* gAliEveBoxSet = 0; |
59b4cd9a | 47 | |
48 | AliHLTPHOSOnlineDisplayEventTab::AliHLTPHOSOnlineDisplayEventTab() | |
49 | { | |
50 | cout << "ERROR: You cannot create a onlinedisplay Tab without arguments" << endl; | |
51 | } | |
52 | ||
53 | ||
36f19b25 | 54 | AliHLTPHOSOnlineDisplayEventTab::AliHLTPHOSOnlineDisplayEventTab(AliHLTPHOSOnlineDisplay * onlineDisplayPtr, TGTab *tabPtr, |
55 | AliHLTHOMERReader * homerSyncPtr, AliHLTHOMERReader * homerPtrs[MAXHOSTS], | |
56 | int nHosts, int runnumber) : AliHLTPHOSOnlineDisplayTab() | |
59b4cd9a | 57 | { |
27029341 | 58 | //comment |
d456fffb | 59 | /* |
60 | if(fIsSetRunNumber == true) | |
61 | { | |
27029341 | 62 | for(int i=0; i < NGAINS; i++) |
d456fffb | 63 | { |
64 | fgLegoPlotPtr[gain] | |
65 | } | |
66 | } | |
67 | */ | |
68 | ||
69 | ||
14ff16ed | 70 | fShmPtr = new AliHLTPHOSSharedMemoryInterface(); |
b3abda11 | 71 | fOnlineDisplayPtr = onlineDisplayPtr; |
72 | ||
54276f07 | 73 | |
27029341 | 74 | for(int gain = 0; gain < NGAINS; gain ++ ) |
3f98e623 | 75 | { |
54276f07 | 76 | fgCanvasPtr[gain] = 0; |
77 | fgLegoPlotPtr[gain] = 0; | |
78 | ||
27029341 | 79 | for(int mod =0; mod <NMODULES; mod ++) |
3f98e623 | 80 | { |
27029341 | 81 | for(int rcuxcoord = 0; rcuxcoord < NZRCUCOORD; rcuxcoord ++) |
3f98e623 | 82 | { |
27029341 | 83 | for(int rcuzcoord = 0; rcuzcoord < NXRCUCOORD; rcuzcoord ++) |
3f98e623 | 84 | { |
27029341 | 85 | for(int z = 0; z < NZROWSRCU; z ++) |
3f98e623 | 86 | { |
27029341 | 87 | for(int x = 0; x < NXCOLUMNSRCU; x ++) |
3f98e623 | 88 | { |
27029341 | 89 | fChannelData[mod][rcuzcoord][rcuxcoord][x][z][gain] = new int[ALTROMAXSAMPLES]; |
90 | fNChannelSamples[mod][rcuzcoord][rcuxcoord][x][z][gain] = 0; | |
91 | fChannelEnergy[mod][rcuzcoord][rcuxcoord][x][z][gain] = 0; | |
3f98e623 | 92 | } |
54276f07 | 93 | } |
94 | } | |
3f98e623 | 95 | } |
96 | } | |
97 | } | |
98 | ||
27029341 | 99 | for(int i=0; i<MAXHOSTS; i++) |
59b4cd9a | 100 | { |
101 | fgHomerReadersPtr[i] = 0; | |
102 | } | |
103 | ||
36f19b25 | 104 | fgHomerReaderPtr = const_cast<AliHLTHOMERReader*>(homerSyncPtr); |
59b4cd9a | 105 | |
106 | for(int i=0; i<nHosts; i++) | |
107 | { | |
108 | fgHomerReadersPtr[i] = homerPtrs[i] ; | |
14ff16ed | 109 | |
59b4cd9a | 110 | } |
111 | ||
59b4cd9a | 112 | fgNHosts = nHosts; |
d456fffb | 113 | InitDisplay(tabPtr, runnumber); |
59b4cd9a | 114 | } |
115 | ||
116 | ||
117 | AliHLTPHOSOnlineDisplayEventTab::~AliHLTPHOSOnlineDisplayEventTab() | |
118 | { | |
27029341 | 119 | //comment |
59b4cd9a | 120 | } |
121 | ||
122 | ||
c890e0a1 | 123 | Int_t |
b3abda11 | 124 | AliHLTPHOSOnlineDisplayEventTab::GetRawData(TH1D *histPtr, int x, int z, int gain) |
125 | { | |
126 | int tmpModID = x/64; | |
127 | int tmpRcuZ = z/32; | |
128 | int tmpRcuX = (x%64)/32; | |
129 | int tmpZ = z%28; | |
130 | int tmpX = x%32; | |
131 | ||
c890e0a1 | 132 | for(int i=0; i < fNChannelSamples[tmpModID][tmpRcuX][tmpRcuZ][tmpX][tmpZ][gain] ; i++) |
b3abda11 | 133 | { |
c890e0a1 | 134 | histPtr->SetBinContent(i, fChannelData[tmpModID][tmpRcuX][tmpRcuZ][tmpX][tmpZ][gain][i]); |
b3abda11 | 135 | } |
c890e0a1 | 136 | return fNChannelSamples[tmpModID][tmpRcuX][tmpRcuZ][tmpX][tmpZ][gain]; |
b3abda11 | 137 | } |
138 | ||
139 | ||
59b4cd9a | 140 | int |
141 | AliHLTPHOSOnlineDisplayEventTab::GetNextEvent() | |
142 | { | |
27029341 | 143 | //comment |
59b4cd9a | 144 | ResetDisplay(); |
997330b5 | 145 | // MT crap |
146 | Bool_t is_first = false; | |
18af2efc | 147 | // if (gAliEveBoxSet == 0) |
148 | // { | |
149 | // is_first = true; | |
150 | // gAliEveBoxSet = new TEveBoxSet("PHOS module"); | |
151 | // // gAliEveBoxSet->SetSecSelectCommand("Draw()"); | |
152 | // // gAliEveBoxSet->SetSecSelectCommand("phos_histo_draw"); | |
153 | // gEve->AddElement(gAliEveBoxSet); | |
154 | // } | |
155 | // gAliEveBoxSet->Reset(TEveBoxSet::kBT_AABox, kFALSE, 128); | |
997330b5 | 156 | |
59b4cd9a | 157 | DoGetNextEvent(); |
158 | UpdateDisplay(); | |
997330b5 | 159 | |
18af2efc | 160 | // gAliEveBoxSet->ElementChanged(); |
161 | // gEve->Redraw3D(is_first); | |
997330b5 | 162 | |
59b4cd9a | 163 | fgEvntCnt ++; |
164 | } | |
165 | ||
166 | ||
9d05c97d | 167 | void |
27029341 | 168 | AliHLTPHOSOnlineDisplayEventTab::FindFourierBlocks(AliHLTHOMERReader * const homerReaderPtr) const |
9d05c97d | 169 | { |
27029341 | 170 | //comment |
9d05c97d | 171 | cout << "AliHLTPHOSOnlineDisplayEventTab::FindFourierBlocks" << endl; |
172 | // unsigned long blk = homeReaderPtr->FindBlockNdx("RENELLEC","SOHP", 0xFFFFFFFF ); | |
173 | unsigned long blk = homerReaderPtr->FindBlockNdx(" TREIRUOF","SOHP", 0xFFFFFFFF ); | |
174 | ||
175 | while ( blk != ~(unsigned long)0 ) | |
176 | { | |
177 | cout << "AliHLTPHOSOnlineDisplayEventTab::FindFourierBlocks(homerReaderPtr) FOUND FOURIER DATA !!!!!!!!!!!!!!" << endl; | |
178 | ||
179 | ||
180 | blk = homerReaderPtr->FindBlockNdx("TREIRUOF","SOHP", 0xFFFFFFFF ); | |
181 | } | |
182 | ||
183 | } | |
184 | ||
59b4cd9a | 185 | |
186 | void | |
6af3dade | 187 | AliHLTPHOSOnlineDisplayEventTab::ReadBlockData(AliHLTHOMERReader *homeReaderPtr) |
14ff16ed | 188 | { |
27029341 | 189 | //comment |
14ff16ed | 190 | AliHLTPHOSValidCellDataStruct *currentChannel =0; |
9d05c97d | 191 | cout << "AliHLTPHOSOnlineDisplayEventTab::ReadBlockDat, Reading block data, therere are " << homeReaderPtr->GetBlockCnt() << " blocks " <<endl; |
192 | ||
193 | FindFourierBlocks(homeReaderPtr); | |
59b4cd9a | 194 | |
195 | unsigned long blk = homeReaderPtr->FindBlockNdx("RENELLEC","SOHP", 0xFFFFFFFF ); | |
997330b5 | 196 | |
d456fffb | 197 | int cnt = 0; |
198 | ||
9d05c97d | 199 | //CRAP PT |
200 | // FindFourierBlocks(homeReaderPtr); | |
201 | ||
59b4cd9a | 202 | while ( blk != ~(unsigned long)0 ) |
203 | { | |
204 | Int_t moduleID; | |
c890e0a1 | 205 | Int_t rcuX = 0; |
206 | Int_t rcuZ = 0; | |
14ff16ed | 207 | AliHLTPHOSRcuCellEnergyDataStruct* cellEnergiesPtr = (AliHLTPHOSRcuCellEnergyDataStruct*)homeReaderPtr->GetBlockData( blk ); |
47f7b25e | 208 | |
47f7b25e | 209 | unsigned int *t = (unsigned int*)cellEnergiesPtr; |
210 | ||
59b4cd9a | 211 | moduleID = cellEnergiesPtr->fModuleID ; |
c890e0a1 | 212 | rcuX = cellEnergiesPtr->fRcuX; |
213 | rcuZ = cellEnergiesPtr->fRcuZ; | |
214 | ||
14ff16ed | 215 | cout << "AliHLTPHOSOnlineDisplayEventTab::ReadBlockData, fModuleID =" <<moduleID << endl; |
04751caa | 216 | |
59b4cd9a | 217 | Int_t tmpZ; |
218 | Int_t tmpX; | |
219 | Int_t tmpGain; | |
14ff16ed | 220 | int cnt = 0; |
c890e0a1 | 221 | Int_t* tmpPtr = 0; |
14ff16ed | 222 | |
14ff16ed | 223 | fShmPtr->SetMemory(cellEnergiesPtr); |
224 | currentChannel = fShmPtr->NextChannel(); | |
225 | ||
226 | while(currentChannel != 0) | |
227 | { | |
228 | cnt ++; | |
229 | tmpZ = currentChannel->fZ; | |
230 | tmpX = currentChannel->fX; | |
231 | tmpGain = currentChannel->fGain; | |
86fe676f | 232 | |
233 | // cout << "Channel: x: " << moduleID*NXCOLUMNSMOD + tmpX + NXCOLUMNSRCU*cellEnergiesPtr->fRcuX | |
234 | // << " z: " << tmpZ + NZROWSRCU*cellEnergiesPtr->fRcuZ | |
235 | // << " E: " << currentChannel->fEnergy << endl; | |
236 | ||
27029341 | 237 | fgLegoPlotPtr[tmpGain]->Fill(moduleID*NXCOLUMNSMOD + tmpX + NXCOLUMNSRCU*cellEnergiesPtr->fRcuX, |
238 | tmpZ + NZROWSRCU*cellEnergiesPtr->fRcuZ, currentChannel->fEnergy); | |
86fe676f | 239 | |
2589c3a3 | 240 | |
54276f07 | 241 | // CRAP PTH |
27029341 | 242 | if(tmpGain == HIGHGAIN) |
54276f07 | 243 | { |
18af2efc | 244 | // gAliEveBoxSet->AddBox(2.2*(tmpX + N_XCOLUMNS_RCU*cellEnergiesPtr->fRcuX) - 1.1, |
245 | // 0, | |
27029341 | 246 | // 2.2*(tmpZ + N_ZROWSRCU*cellEnergiesPtr->fRcuZ) - 1.1, |
18af2efc | 247 | // 2.2, |
248 | // 0.4*140*currentChannel->fEnergy/1024, | |
249 | // 2.2); | |
250 | // gAliEveBoxSet->DigitValue(TMath::Nint(currentChannel->fEnergy)); | |
14ff16ed | 251 | } |
54276f07 | 252 | |
253 | if(cellEnergiesPtr->fHasRawData == true) | |
d456fffb | 254 | //if(0) |
14ff16ed | 255 | { |
54276f07 | 256 | Int_t nSamples = 0; |
257 | Int_t* rawPtr = 0; | |
258 | rawPtr = fShmPtr->GetRawData(nSamples); | |
259 | fNChannelSamples[moduleID][rcuX][rcuZ][tmpX][tmpZ][tmpGain] = nSamples; | |
2589c3a3 | 260 | |
d456fffb | 261 | // cout << __FILE__ << ":" << __LINE__ <<" gain = " << tmpGain << " z = "<< tmpZ << " x = " << tmpX; |
262 | // cout << " nsamples = " << nSamples; | |
263 | // cout << __FILE__ << ":" << __LINE__ << " the address of raw ptr = " << rawPtr << endl; | |
264 | ||
265 | ||
27029341 | 266 | if(nSamples > ALTROMAXSAMPLES || nSamples < 0 ) |
14ff16ed | 267 | { |
27029341 | 268 | cout << __FILE__<< ":" <<__LINE__ <<"ERROR, nsamples = "<< nSamples <<" exeeds allowd range, max number of samples is "<< ALTROMAXSAMPLES << endl; |
d456fffb | 269 | } |
270 | else | |
271 | { | |
272 | for(int j= 0; j< nSamples; j++) | |
273 | { | |
274 | // cout << __FILE__ << ":" << __LINE__ << " nsamples = " << nSamples << " j =" << j << endl; | |
275 | fChannelData[moduleID][cellEnergiesPtr->fRcuX][cellEnergiesPtr->fRcuZ][tmpX][tmpZ][tmpGain][j] = rawPtr[j]; | |
276 | } | |
277 | ||
14ff16ed | 278 | } |
279 | } | |
54276f07 | 280 | |
14ff16ed | 281 | currentChannel = fShmPtr->NextChannel(); |
282 | } | |
54276f07 | 283 | |
59b4cd9a | 284 | blk = homeReaderPtr->FindBlockNdx("RENELLEC","SOHP", 0xFFFFFFFF, blk+1); |
9d05c97d | 285 | |
59b4cd9a | 286 | } |
287 | } | |
288 | ||
289 | ||
9d05c97d | 290 | |
291 | ||
59b4cd9a | 292 | void |
293 | AliHLTPHOSOnlineDisplayEventTab::ResetDisplay() | |
294 | { | |
27029341 | 295 | //comment |
59b4cd9a | 296 | if(fgAccumulate == kFALSE) |
297 | { | |
27029341 | 298 | for(int gain=0; gain < NGAINS; gain++) |
59b4cd9a | 299 | { |
54276f07 | 300 | if(fgLegoPlotPtr[gain] !=0) |
301 | { | |
302 | fgLegoPlotPtr[gain]->Reset(); | |
303 | } | |
59b4cd9a | 304 | } |
54276f07 | 305 | } |
306 | } | |
59b4cd9a | 307 | |
308 | ||
309 | void | |
36f19b25 | 310 | AliHLTPHOSOnlineDisplayEventTab::InitDisplay(TGTab * tabPtr, int runnumber) |
59b4cd9a | 311 | { |
f704525c | 312 | // gStyle->SetOptLogy(); |
313 | /// gStyle->SetOptStat(true); | |
314 | ||
27029341 | 315 | for(int gain=0; gain < NGAINS; gain++) |
54276f07 | 316 | { |
317 | char gainLabel[100]; | |
318 | char label[256]; | |
319 | ||
320 | // Gain2Text | |
321 | fOnlineDisplayPtr->Gain2Text(gain,gainLabel); | |
322 | sprintf(label, "PHOS HLT Online Display %s", gainLabel); | |
323 | fgLegoPlotPtr[gain] = new AliHLTPHOSOnlineDisplayTH2D(fOnlineDisplayPtr, label, label, | |
27029341 | 324 | NXCOLUMNSMOD*NMODULES , 0, NXCOLUMNSMOD*NMODULES, |
325 | NZROWSMOD, 0, NZROWSMOD); | |
d456fffb | 326 | |
327 | // cout << __FILE__ << ":" << __LINE__ << " Runnumber = " << runnumber <<endl; | |
328 | ||
329 | fgLegoPlotPtr[gain]->SetRunNumber(runnumber); | |
54276f07 | 330 | fgLegoPlotPtr[gain]->SetMaximum(1023); |
331 | fgLegoPlotPtr[gain]->Reset(); | |
27029341 | 332 | fgLegoPlotPtr[gain]->GetXaxis()->SetRange(XRANGESTART, XRANGEEND); |
54276f07 | 333 | } |
334 | ||
59b4cd9a | 335 | |
336 | TGLayoutHints *fL1 = new TGLayoutHints(kLHintsBottom | kLHintsExpandX | | |
337 | kLHintsExpandY, 2, 2, 15, 1); | |
338 | ||
36f19b25 | 339 | TGCompositeFrame * tf = tabPtr->AddTab("Event display"); |
59b4cd9a | 340 | fSubTab1 = new TGTab(tf, 100, 100); |
341 | TGCompositeFrame *tf2 = fSubTab1->AddTab("LEGO"); | |
342 | fSubF1 = new TGCompositeFrame(tf2, 60, 20, kVerticalFrame); | |
343 | fEc1 = new TRootEmbeddedCanvas("ec1", fSubF1, 100, 100); | |
344 | fSubF1->AddFrame(fEc1, fL1); | |
345 | fEc2 = new TRootEmbeddedCanvas("ec2", fSubF1, 100, 100); | |
346 | fSubF1->AddFrame(fEc2, fL1); | |
347 | tf2->AddFrame(fSubF1, fL1); | |
348 | ||
349 | tf2 = fSubTab1->AddTab("SCAT"); | |
350 | fSubF2 = new TGCompositeFrame(tf2, 60, 20, kVerticalFrame); | |
351 | tf2->AddFrame(fSubF2, fL1); | |
352 | fEc3 = new TRootEmbeddedCanvas("ec3", fSubF2, 100, 100); | |
353 | fSubF2->AddFrame(fEc3, fL1); | |
354 | fEc4 = new TRootEmbeddedCanvas("ec4", fSubF2, 100, 100); | |
355 | fSubF2->AddFrame(fEc4, fL1); | |
356 | ||
357 | tf2 = fSubTab1->AddTab("SURF"); | |
358 | fSubF3 = new TGCompositeFrame(tf2, 60, 20, kVerticalFrame); | |
359 | tf2->AddFrame(fSubF3, fL1); | |
360 | fEc5 = new TRootEmbeddedCanvas("ec5", fSubF3, 100, 100); | |
361 | fSubF3->AddFrame(fEc5, fL1); | |
362 | fEc6 = new TRootEmbeddedCanvas("ec6", fSubF3, 100, 100); | |
363 | fSubF3->AddFrame(fEc6, fL1); | |
364 | fSubTab1->Resize(); | |
365 | tf->AddFrame(fSubTab1, fL1); | |
366 | ||
367 | fgEventButtPtr = new AliHLTPHOSGetEventButton(fSubF1, "get event", 'e'); | |
368 | } | |
369 | ||
370 | ||
04751caa | 371 | |
59b4cd9a | 372 | void |
373 | AliHLTPHOSOnlineDisplayEventTab::UpdateDisplay() | |
374 | { | |
f704525c | 375 | // gStyle->SetOptLogy(); |
376 | // gStyle->SetOptStat(true); | |
377 | ||
27029341 | 378 | fgCanvasPtr[HIGHGAIN] = fEc1->GetCanvas(); |
379 | fgCanvasPtr[HIGHGAIN]->cd(); | |
380 | fgLegoPlotPtr[HIGHGAIN]->Draw("LEGO2Z"); | |
381 | fgCanvasPtr[HIGHGAIN]->Update(); | |
382 | fgCanvasPtr[LOWGAIN] = fEc2->GetCanvas(); | |
383 | fgCanvasPtr[LOWGAIN]->cd(); | |
384 | fgLegoPlotPtr[LOWGAIN]->Draw("LEGO2Z"); | |
385 | fgCanvasPtr[LOWGAIN]->Update(); | |
386 | ||
387 | fgCanvasPtr[HIGHGAIN] = fEc3->GetCanvas(); | |
388 | fgCanvasPtr[HIGHGAIN]->cd(); | |
389 | fgLegoPlotPtr[HIGHGAIN]->Draw("SCAT"); | |
390 | fgCanvasPtr[HIGHGAIN]->Update(); | |
391 | fgCanvasPtr[LOWGAIN] = fEc4->GetCanvas(); | |
392 | fgCanvasPtr[LOWGAIN]->cd(); | |
393 | fgLegoPlotPtr[LOWGAIN]->Draw("SCAT"); | |
394 | fgCanvasPtr[LOWGAIN]->Update(); | |
54276f07 | 395 | |
d456fffb | 396 | /* |
27029341 | 397 | fgCanvasPtr[HIGHGAIN] = fEc5->GetCanvas(); |
398 | fgCanvasPtr[HIGHGAIN]->cd(); | |
399 | fgLegoPlotPtr[HIGHGAIN]->Draw("CONTZ"); | |
400 | fgCanvasPtr[HIGHGAIN]->Update(); | |
401 | fgCanvasPtr[LOWGAIN] = fEc6->GetCanvas(); | |
402 | fgCanvasPtr[LOWGAIN]->cd(); | |
403 | fgLegoPlotPtr[LOWGAIN]->Draw("CONTZ"); | |
404 | fgCanvasPtr[LOWGAIN]->Update(); | |
d456fffb | 405 | */ |
406 | ||
27029341 | 407 | fgCanvasPtr[HIGHGAIN] = fEc5->GetCanvas(); |
408 | fgCanvasPtr[HIGHGAIN]->cd(); | |
409 | fgLegoPlotPtr[HIGHGAIN]->Draw("COLZ"); | |
410 | fgCanvasPtr[HIGHGAIN]->Update(); | |
411 | fgCanvasPtr[LOWGAIN] = fEc6->GetCanvas(); | |
412 | fgCanvasPtr[LOWGAIN]->cd(); | |
413 | fgLegoPlotPtr[LOWGAIN]->Draw("COLZ"); | |
414 | fgCanvasPtr[LOWGAIN]->Update(); | |
d456fffb | 415 | |
416 | ||
59b4cd9a | 417 | } |