3 /**************************************************************************
4 * Copyright(c) 2006, ALICE Experiment at CERN, All rights reserved. *
6 * Authors: Per Thomas Hille for the ALICE *
7 * offline/HLT Project. Contributors are mentioned in the code where *
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 **************************************************************************/
19 #include "AliHLTPHOSOnlineDisplayFourierTab.h"
22 #include "AliHLTPHOSGetEventButton.h"
23 #include "AliHLTPHOSCommonDefs.h"
24 #include "AliHLTDataTypes.h"
25 #include "AliHLTHOMERData.h"
26 #include "AliHLTHOMERReader.h"
27 #include "AliHLTHOMERWriter.h"
28 //#include "AliHLTPHOSRcuCellEnergyDataStruct.h"
29 //#include "AliHLTPHOSRcuCellEnergyDataStruct.h"
30 //#include "AliHLTPHOSRcuCellEnergyDataStruct.h"
31 #include "AliHLTPHOSOnlineDisplay.h"
32 #include "AliHLTPHOSSharedMemoryInterfacev2.h"
33 #include "AliHLTPHOSFourier.h"
34 #include "AliHLTPHOSOnlineDisplayTH2D.h"
37 #include "AliHLTPHOSRcuFFTDataStruct.h"
40 #define SAMPLINGFREQUENCY 10
46 //#include <TEveManager.h>
47 //#include <TEveBoxSet.h>
49 //TEveBoxSet* gAliEveBoxSet = 0;
51 AliHLTPHOSOnlineDisplayFourierTab::AliHLTPHOSOnlineDisplayFourierTab()
53 // See header file for documentation
54 cout << "ERROR: You cannot create a onlinedisplay Tab without arguments" << endl;
58 AliHLTPHOSOnlineDisplayFourierTab::AliHLTPHOSOnlineDisplayFourierTab(AliHLTPHOSOnlineDisplay * const onlineDisplayPtr, TGTab *tabPtr,
59 const AliHLTHOMERReader * homerSyncPtr, const AliHLTHOMERReader * const homerPtrs[MAXHOSTS], int nHosts) : AliHLTPHOSOnlineDisplayTab(), fEvtCnt(0)
61 // See header file for documentation
62 // gStyle->SetOptLogy();
63 // gStyle->SetOptStat(false);
66 fShmPtr = new AliHLTPHOSSharedMemoryInterfacev2();
67 fOnlineDisplayPtr = onlineDisplayPtr;
68 fFourierPtr = new AliHLTPHOSFourier();
70 for(int gain = 0; gain < NGAINS; gain ++ )
72 fFourierHistoNew[gain] = 0;
73 fFourierHistoOld[gain] = 0;
74 fFourierHistoAccumulated[gain] = 0;
77 for(int i=0; i<MAXHOSTS; i++)
79 fgHomerReadersPtr[i] = 0;
82 fgHomerReaderPtr = const_cast<AliHLTHOMERReader*>(homerSyncPtr);
84 for(int i=0; i<nHosts; i++)
86 fgHomerReadersPtr[i] = const_cast<AliHLTHOMERReader*>(homerPtrs[i]);
95 AliHLTPHOSOnlineDisplayFourierTab::~AliHLTPHOSOnlineDisplayFourierTab()
98 // See header file for documentation
104 AliHLTPHOSOnlineDisplayFourierTab::GetNextEvent()
106 // See header file for documentation
120 AliHLTPHOSOnlineDisplayFourierTab::ReadBlockData(AliHLTHOMERReader * const homeReaderPtr)
122 // See header file for documentation
123 // AliHLTPHOSValidCellDataStruct *currentChannel =0;
124 cout << "AliHLTPHOSOnlineDisplayFourierTab::ReadBlockDat, Reading block data, therere are " << homeReaderPtr->GetBlockCnt() << " blocks " <<endl;
125 // unsigned long blk = homeReaderPtr->FindBlockNdx("RENELLEC","SOHP", 0xFFFFFFFF );
127 // while ( blk != ~(unsigned long)0 )
132 // AliHLTPHOSRcuCellEnergyDataStruct* cellEnergiesPtr = (AliHLTPHOSRcuCellEnergyDataStruct*)homeReaderPtr->GetBlockData( blk );
134 // unsigned int *t = (unsigned int*)cellEnergiesPtr;
136 // moduleID = cellEnergiesPtr->fModuleID ;
137 // rcuX = cellEnergiesPtr->fRcuX;
138 // rcuZ = cellEnergiesPtr->fRcuZ;
140 // cout << "AliHLTPHOSOnlineDisplayFourierTab::ReadBlockData, fModuleID =" <<moduleID << endl;
146 // Int_t* tmpPtr = 0;
148 // fShmPtr->SetMemory(cellEnergiesPtr);
149 // currentChannel = fShmPtr->NextChannel();
151 // while(currentChannel != 0)
154 // tmpZ = currentChannel->fZ;
155 // tmpX = currentChannel->fX;
156 // tmpGain = currentChannel->fGain;
158 // if(cellEnergiesPtr->fHasRawData == true)
160 // Int_t nSamples = 0;
161 // Int_t* rawPtr = 0;
162 // rawPtr = fShmPtr->GetRawData(nSamples);
163 // fFourierPtr->ProcessFourier(rawPtr, nSamples, tmpZ, tmpX, tmpGain, fEvtCnt);
166 // currentChannel = fShmPtr->NextChannel();
168 // blk = homeReaderPtr->FindBlockNdx("RENELLEC","SOHP", 0xFFFFFFFF, blk+1);
171 // FillHistograms(fFourierPtr->GetPSD(), fFourierPtr->GetDataSize());
173 unsigned long blk = homeReaderPtr->FindBlockNdx("TREIRUOF","SOHP", 0x0);
174 while ( blk != ~(unsigned long)0 )
176 AliHLTPHOSRcuFFTDataStruct* fftDataPtr = (AliHLTPHOSRcuFFTDataStruct*)homeReaderPtr->GetBlockData( blk );
177 FillHistograms(*fftDataPtr, fftDataPtr->fDataLength);
179 blk = homeReaderPtr->FindBlockNdx("TREIRUOF","SOHP", blk+1);
186 AliHLTPHOSOnlineDisplayFourierTab::FillHistograms(const AliHLTPHOSRcuFFTDataStruct psd, const int size)
188 // See header file for documentation
189 // gStyle->SetOptLogy();
190 // gStyle->SetOptStat(false);
196 // double linewidth = 1.2;
198 for(int gain = 0; gain < NGAINS; gain ++ )
200 if( fFourierHistoNew[gain] == 0)
202 sprintf(tmptitle, "PSD averaged over all %s channels: Most recent event", Gain2Text(gain, ' '));
203 sprintf(tmpname, "PSD_averaged_over_all_%s_channels__most_recent_event", Gain2Text(gain, '_'));
204 fFourierHistoNew[gain] = new TH1D(tmpname, tmptitle, (size/2) +1, 0, SAMPLINGFREQUENCY/2);
205 fFourierHistoNew[gain]->GetXaxis()->SetTitle("f/MHz");
206 fFourierHistoNew[gain]->GetYaxis()->SetTitle("Power (arbitrary units)");
207 fFourierHistoNew[gain]->SetLineWidth(linewidth);
210 if (fFourierHistoOld[gain] == 0)
212 sprintf(tmptitle, "PSD averaged over all %s channels: Previous event", Gain2Text(gain, ' '));
213 sprintf(tmpname, "PSD_averaged_over_all_%s_channels__previous_event", Gain2Text(gain, '_'));
214 fFourierHistoOld[gain] = new TH1D(tmpname, tmptitle, (size/2) +1, 0, SAMPLINGFREQUENCY/2);
215 fFourierHistoOld[gain]->GetXaxis()->SetTitle("f/MHz");
216 fFourierHistoOld[gain]->GetYaxis()->SetTitle("Power (arbitrary units)");
217 fFourierHistoOld[gain]->SetLineWidth(linewidth);
220 if( fFourierHistoAccumulated[gain] == 0 )
222 sprintf(tmptitle, "PSD averaged over all %s channels: All events", Gain2Text(gain, ' '));
223 sprintf(tmpname, "PSD_averaged_over_all_%s_channels__All_events", Gain2Text(gain, '_'));
224 fFourierHistoAccumulated[gain] = new TH1D(tmpname, tmptitle, (size/2) +1, 0, SAMPLINGFREQUENCY/2);
225 fFourierHistoAccumulated[gain]->GetXaxis()->SetTitle("f/MHz");
226 fFourierHistoAccumulated[gain]->GetYaxis()->SetTitle("Power (arbitrary units)");
227 fFourierHistoAccumulated[gain]->SetLineWidth(linewidth);
231 // fFourierHistoNew[gain]->Reset();
232 // fFourierHistoOld[gain]->Reset();
233 // fFourierHistoAccumulated[gain]->Reset();
235 for(int i = 0; i <size/2; i++)
237 fFourierHistoOld[gain]->SetBinContent(i+1, fFourierHistoNew[gain]->GetBinContent(i+1));
238 fFourierHistoNew[gain]->SetBinContent(i+1, psd.fGlobalLastPSD[gain][i] );
239 fFourierHistoAccumulated[gain]->SetBinContent(i+1, psd.fGlobalAccumulatedPSD[gain][i] );
249 AliHLTPHOSOnlineDisplayFourierTab::InitDisplay(TGTab *tabPtr)
251 // See header file for documentatino
252 for(int gain=0; gain < NGAINS; gain++)
258 fOnlineDisplayPtr->Gain2Text(gain,gainLabel);
259 sprintf(label, "PHOS Fourier transform %s", gainLabel);
260 fgLegoPlotPtr[gain] = new AliHLTPHOSOnlineDisplayTH2D(fOnlineDisplayPtr, label, label,
261 NXCOLUMNSMOD*NMODULES , 0, NXCOLUMNSMOD*NMODULES,
262 NZROWSMOD, 0, NZROWSMOD);
263 // fgLegoPlotPtr[gain]->SetGain(HIGHGAIN);
264 fgLegoPlotPtr[gain]->SetMaximum(1023);
265 fgLegoPlotPtr[gain]->Reset();
266 fgLegoPlotPtr[gain]->GetXaxis()->SetRange(XRANGESTART, XRANGEEND);
272 TGLayoutHints *fL1 = new TGLayoutHints(kLHintsBottom | kLHintsExpandX |
273 kLHintsExpandY, 2, 2, 15, 1);
275 TGCompositeFrame *tf = tabPtr->AddTab("Power spectrum");
276 fSubTab1 = new TGTab(tf, 100, 100);
277 TGCompositeFrame *tf2 = fSubTab1->AddTab("Most recent event");
278 fSubF1 = new TGCompositeFrame(tf2, 60, 20, kVerticalFrame);
279 fEc1 = new TRootEmbeddedCanvas("ecf1", fSubF1, 100, 100);
280 fSubF1->AddFrame(fEc1, fL1);
281 fEc2 = new TRootEmbeddedCanvas("ecf2", fSubF1, 100, 100);
282 fSubF1->AddFrame(fEc2, fL1);
283 tf2->AddFrame(fSubF1, fL1);
285 tf2 = fSubTab1->AddTab("Previous event");
286 fSubF2 = new TGCompositeFrame(tf2, 60, 20, kVerticalFrame);
287 tf2->AddFrame(fSubF2, fL1);
288 fEc3 = new TRootEmbeddedCanvas("ecf3", fSubF2, 100, 100);
289 fSubF2->AddFrame(fEc3, fL1);
290 fEc4 = new TRootEmbeddedCanvas("ecf4", fSubF2, 100, 100);
291 fSubF2->AddFrame(fEc4, fL1);
294 tf2 = fSubTab1->AddTab("Accumulated");
295 fSubF3 = new TGCompositeFrame(tf2, 60, 20, kVerticalFrame);
296 tf2->AddFrame(fSubF3, fL1);
297 fEc5 = new TRootEmbeddedCanvas("ecf5", fSubF3, 100, 100);
298 fSubF3->AddFrame(fEc5, fL1);
299 fEc6 = new TRootEmbeddedCanvas("ecf6", fSubF3, 100, 100);
300 fSubF3->AddFrame(fEc6, fL1);
302 tf->AddFrame(fSubTab1, fL1);
305 fgEventButtPtr = new AliHLTPHOSGetEventButton(fSubF1, "get fourier", 'e');
311 AliHLTPHOSOnlineDisplayFourierTab::UpdateDisplay()
313 // See header file for documentation
314 if( fFourierHistoNew[HIGHGAIN])
316 fgCanvasPtr[HIGHGAIN] = fEc1->GetCanvas();
317 fgCanvasPtr[HIGHGAIN]->cd();
319 // fgLegoPlotPtr[HIGHGAIN]->Draw("LGZ");
320 fFourierHistoNew[HIGHGAIN]->Draw();
321 fgCanvasPtr[HIGHGAIN]->Update();
324 if( fFourierHistoNew[LOWGAIN])
326 fgCanvasPtr[LOWGAIN] = fEc2->GetCanvas();
327 fgCanvasPtr[LOWGAIN]->cd();
329 // fgLegoPlotPtr[LOWGAIN]->Draw("HGZ");
330 fFourierHistoNew[LOWGAIN]->Draw();
331 fgCanvasPtr[LOWGAIN]->Update();
333 if( fFourierHistoOld[HIGHGAIN])
335 fgCanvasPtr[HIGHGAIN] = fEc3->GetCanvas();
336 fgCanvasPtr[HIGHGAIN]->cd();
338 // fgLegoPlotPtr[HIGHGAIN]->Draw("Low gain");
339 fFourierHistoOld[HIGHGAIN]->Draw();
340 fgCanvasPtr[HIGHGAIN]->Update();
343 if( fFourierHistoOld[LOWGAIN])
345 fgCanvasPtr[LOWGAIN] = fEc4->GetCanvas();
346 fgCanvasPtr[LOWGAIN]->cd();
347 //fgLegoPlotPtr[LOWGAIN]->Draw("High gain");
349 fFourierHistoOld[LOWGAIN]->Draw();
350 fgCanvasPtr[LOWGAIN]->Update();
353 if( fFourierHistoAccumulated[HIGHGAIN])
355 fgCanvasPtr[HIGHGAIN] = fEc5->GetCanvas();
356 fgCanvasPtr[HIGHGAIN]->cd();
358 fFourierHistoAccumulated[HIGHGAIN]->Draw();
359 // fgLegoPlotPtr[HIGHGAIN]->Draw("CONTZ");
360 fgCanvasPtr[HIGHGAIN]->Update();
363 if( fFourierHistoAccumulated[LOWGAIN])
365 fgCanvasPtr[LOWGAIN] = fEc6->GetCanvas();
366 fgCanvasPtr[LOWGAIN]->cd();
368 // fgLegoPlotPtr[LOWGAIN]->Draw("CONTZ");
369 fFourierHistoAccumulated[LOWGAIN]->Draw();
370 fgCanvasPtr[LOWGAIN]->Update();
377 AliHLTPHOSOnlineDisplayFourierTab::Gain2Text(const int gain, const char delimeter)
379 // See header file for documentation
382 sprintf(fGainText, "low%cgain", delimeter);
385 else if(gain == HIGHGAIN)
387 sprintf(fGainText, "high%cgain", delimeter);
391 sprintf(fGainText, "Error, invalid gain");