3 /** \class AliHLTTPCDisplayPadRow
5 //_____________________________________________________________
6 // AliHLTTPCDisplayPadRow
8 // Display class for the HLT TPC-PadRow events.
11 // Author: Jochen Thaeder <mailto:thaeder@kip.uni-heidelberg.de>
12 //*-- Copyright © ALICE HLT Group
20 #include <TPolyMarker3D.h>
23 #include <TClonesArray.h>
25 #include <AliSimDigits.h>
26 #include <AliTPCParam.h>
29 #include "AliHLTStdIncludes.h"
30 #include "AliHLTTPCDefinitions.h"
31 #include "AliHLTDataTypes.h"
32 #include "AliHLTTPCSpacePointData.h"
33 #include "AliHLTTPCClusterDataFormat.h"
34 #include "AliHLTTPCLogging.h"
35 #include "AliHLTTPCTransform.h"
36 #include "AliHLTTPCDigitReaderPacked.h"
37 #include "AliHLTTPCDigitReaderRaw.h"
40 #include "AliHLTTPCDisplayMain.h"
41 #include "AliHLTTPCDisplayPadRow.h"
42 #include "AliHLTTPCDisplayPad.h"
48 ClassImp(AliHLTTPCDisplayPadRow)
50 //____________________________________________________________________________________________________
51 AliHLTTPCDisplayPadRow::AliHLTTPCDisplayPadRow(AliHLTTPCDisplayMain* display) {
55 fNTimes = AliHLTTPCTransform::GetNTimeBins();
58 fBinX[1] = fDisplay->GetNPads();
60 fBinY[1] = fNTimes -1;
63 for (Int_t ii = 0;ii < 20; ii++)
67 Int_t padbinning = maxpads*10;
69 fHistraw = new TH2F("fHistraw","Selected PadRow with found Clusters;Pad #;Timebin #",maxpads,0,maxpads-1,fNTimes,0,fNTimes-1);
70 fHistrawcl = new TH1F("fHistrawcl","cvcv;ddd;kkk",padbinning,0,maxpads-1);
72 fHistraw->SetOption("COLZ");
73 fHistraw->SetTitleSize(0.03);
74 fHistraw->GetXaxis()->SetLabelSize(0.03);
75 fHistraw->GetXaxis()->SetTitleSize(0.03);
76 fHistraw->GetYaxis()->SetLabelSize(0.03);
77 fHistraw->GetYaxis()->SetTitleSize(0.03);
79 gStyle->SetPalette(1);
82 //____________________________________________________________________________________________________
83 AliHLTTPCDisplayPadRow::~AliHLTTPCDisplayPadRow() {
93 for (Int_t ii=19; ii <= 0; ii--){ // try fwd
101 //____________________________________________________________________________________________________
102 void AliHLTTPCDisplayPadRow::Reset(){
107 //____________________________________________________________________________________________________
108 void AliHLTTPCDisplayPadRow::Save(){
109 fDisplay->GetCanvasCharge()->SaveAs("HLT-PadRowView.eps");
112 //____________________________________________________________________________________________________
113 void AliHLTTPCDisplayPadRow::Fill(Int_t patch, ULong_t dataBlock, ULong_t dataLen){
114 // Fill PadRow Histogram
116 #if defined(HAVE_TPC_MAPPING)
117 AliHLTTPCDigitReaderRaw digitReader(0);
119 bool readValue = true;
122 Int_t padRow = fDisplay->GetPadRow();
123 Int_t slice = fDisplay->GetSlicePadRow();
125 // Initialize RAW DATA
126 Int_t firstRow = AliHLTTPCTransform::GetFirstRow(patch);
127 Int_t lastRow = AliHLTTPCTransform::GetLastRow(patch);
129 // Outer sector, patches 2, 3, 4, 5 - start counting in patch 2 with row 0
130 if ( patch >= 2 ) rowOffset = AliHLTTPCTransform::GetFirstRow( 2 );
132 // Initialize block for reading packed data
133 void* tmpdataBlock = (void*) dataBlock;
134 digitReader.InitBlock(tmpdataBlock,dataLen,firstRow,lastRow,patch,slice);
136 readValue = digitReader.Next();
139 LOG(AliHLTTPCLog::kError,"AliHLTTPCDisplayPadRow::Fill","Read first value") << "No value in data block" << ENDLOG;
143 if ( fDisplay->GetZeroSuppression() ){
144 for (Int_t pad=0; pad < AliHLTTPCTransform::GetNPads(padRow); pad++){
145 // for (Int_t timeBin=fDisplay->GetTimeBinMin(); timeBin <= fDisplay->GetTimeBinMax(); timeBin++){
146 for (Int_t timeBin=0; timeBin <= fDisplay->GetNTimeBins(); timeBin++){
148 fHistraw->Fill(pad,timeBin,fDisplay->fRawDataZeroSuppressed[padRow][pad][timeBin]);
152 } // end - if ( fDisplay->GetZeroSuppression() ){
155 for (Int_t pad=0; pad < AliHLTTPCTransform::GetNPads(padRow); pad++){
156 // for (Int_t timeBin=fDisplay->GetTimeBinMin(); timeBin <= fDisplay->GetTimeBinMax(); timeBin++){
157 for (Int_t timeBin=0; timeBin <= fDisplay->GetNTimeBins(); timeBin++){
158 fHistraw->Fill(pad,timeBin,fDisplay->fRawData[padRow][pad][timeBin]);
161 } // end - else of if ( fDisplay->GetZeroSuppression() ){
164 // FILL PADROW 3D --- Initialize the colorbins
165 if ( fDisplay->Get3DSwitchPadRow() ){
166 for (UInt_t ii=0;ii < 20;ii++){
171 // read number of entries in colorbin
174 Int_t row = digitReader.GetRow() + rowOffset;
177 UInt_t charge = digitReader.GetSignal();
179 for (UInt_t ii=0;ii < 19;ii++){
180 if ( charge > (ii*15) && charge <= ((ii*15) + 15) ) fcolorbin[ii]++;
182 // larger than 19 * 15
183 if (charge > 285 ) fcolorbin[19]++;
187 readValue = digitReader.Next();
189 if(!readValue) break; //No more value
192 // Initialize fpmarr[color][3*colorbin[ii]]
193 for (Int_t ii = 0; ii < 20; ii++) {
194 if ( fpmarr[ii] ) delete[] fpmarr[ii];
195 fpmarr[ii] = new Float_t[fcolorbin[ii]*3];
198 // Rewind the raw reader and fill the polymarker3D
199 digitReader.InitBlock(tmpdataBlock,dataLen,firstRow,lastRow,patch,slice);
201 readValue = digitReader.Next();
202 } // END if (fDisplay->Get3DSwitchPadRow())
207 Int_t row = digitReader.GetRow() + rowOffset;
209 // select padrow to fill in histogramm
211 UChar_t pad = digitReader.GetPad();
212 UShort_t time = digitReader.GetTime();
213 UInt_t charge = digitReader.GetSignal();
215 //fHistraw->Fill(pad,time,charge);
217 if ( fDisplay->Get3DSwitchPadRow() ) {
218 // Transform raw coordinates to local coordinates
219 AliHLTTPCTransform::RawHLT2Global(xyz, slice, padRow, pad, time);
221 for (UInt_t ii=0;ii < 19;ii++){
222 if ( charge > (ii*15) && charge <= ((ii*15) + 15) ){
223 fpmarr[ii][fbinct[ii]] = xyz[0];
224 fpmarr[ii][fbinct[ii]+1] = xyz[1];
225 fpmarr[ii][fbinct[ii]+2] = xyz[2];
229 // larger than 19 * 15
231 fpmarr[19][fbinct[19]] = xyz[0];
232 fpmarr[19][fbinct[19]+1] = xyz[1];
233 fpmarr[19][fbinct[19]+2] = xyz[2];
236 } // END if (fSwitch3DPadRow)
238 } // END if (row == padRow){
241 readValue = digitReader.Next();
243 //Check where to stop:
244 if(!readValue) break; //No more value
247 if (fDisplay->ExistsClusterData()){
248 AliHLTTPCSpacePointData *points = fDisplay->GetSpacePointDataPointer(slice,patch);
252 for(Int_t i=0; i< fDisplay->GetNumberSpacePoints(slice,patch); i++){
253 xyz[0] = points[i].fX;
254 xyz[1] = points[i].fY;
255 xyz[2] = points[i].fZ;
257 // select padrow to fill in histogramm
258 if (padRow == AliHLTTPCTransform::GetPadRow(xyz[0])){
259 AliHLTTPCTransform::LocHLT2Raw(xyz, slice, padRow);
260 fHistrawcl->Fill(xyz[1],xyz[2]);
263 } // END if (fDisplay->ExistsClusterData()){
264 #else //! defined(HAVE_TPC_MAPPING)
265 HLTFatal("DigitReaderRaw not available - check your build");
266 #endif //defined(HAVE_TPC_MAPPING)
270 //____________________________________________________________________________________________________
271 void AliHLTTPCDisplayPadRow::Draw(){
273 fDisplay->GetCanvasPadRow()->cd();
274 fDisplay->GetCanvasPadRow()->Clear();
276 if (fDisplay->GetSplitPadRow()){
277 fDisplay->GetCanvasPadRow()->Divide(1,2);
278 fDisplay->GetCanvasPadRow()->cd(1);
282 sprintf(title,"Selected PadRow %d with found Clusters",fDisplay->GetPadRow());
285 if (!fDisplay->GetKeepView() || (fBinX[1]>fDisplay->GetNPads()) || (fBinY[1]>fNTimes)){
287 fBinX[1] = fDisplay->GetNPads();
289 fBinY[1] = fNTimes - 1;
292 fHistraw->SetAxisRange(fBinX[0],fBinX[1]);
293 fHistraw->SetAxisRange(fBinY[0],fBinY[1],"Y");
294 fHistraw->SetTitle(title);
295 fHistraw->SetStats(kFALSE);
296 fHistraw->Draw("COLZ");
298 if ( fDisplay->ExistsClusterData() ){
299 //cout << "XX" << endl;
300 fHistrawcl->SetAxisRange(fBinX[0],fBinX[1]);
301 fHistrawcl->SetAxisRange(fBinY[0],fBinY[1],"Y");
302 fHistrawcl->SetStats(kFALSE);
303 fHistrawcl->SetMarkerStyle(28);
304 fHistrawcl->SetMarkerSize(2);
305 fHistrawcl->SetMarkerColor(1);
306 fHistrawcl->Draw("psame");
309 if (fDisplay->GetSplitPadRow()){
310 fDisplay->GetCanvasPadRow()->cd(2);
311 fDisplay->GetPadPointer()->fHistpad2->Draw();
314 fDisplay->GetCanvasPadRow()->Modified();
315 fDisplay->GetCanvasPadRow()->Update();
318 fDisplay->GetCanvasPadRow()->Connect("ProcessedEvent(Int_t,Int_t,Int_t,TObject*)","AliHLTTPCDisplayMain",(void*) fDisplay,"ExecPadEvent(Int_t,Int_t,Int_t,TObject*)");
320 fDisplay->GetCanvasPadRow()->Connect("ProcessedEvent(Int_t,Int_t,Int_t,TObject*)","AliHLTTPCDisplayPadRow",(void*) this,"ExecEvent(Int_t,Int_t,Int_t,TObject*)");
323 //____________________________________________________________________________________________________
324 void AliHLTTPCDisplayPadRow::Draw3D(){
325 Int_t markercolor = 51;
327 for (UInt_t ii=0;ii < 20;ii++){
328 if (fcolorbin[ii]> 0){
330 TPolyMarker3D* pm = new TPolyMarker3D(fcolorbin[ii], fpmarr[ii], 7 );
331 pm->SetBit(kCanDelete);
333 pm->SetMarkerColor(markercolor);
337 // in order to have the SetPalette(1), so called "pretty"
338 if (ii % 2 == 0 ) markercolor += 2;
339 else markercolor += 3;
343 //____________________________________________________________________________________________________
344 void AliHLTTPCDisplayPadRow::ExecEvent(Int_t event, Int_t px, Int_t py, TObject *selected){
345 // Saves the Zoom Position of the Histogram
347 // - Mouse down on Axis : StartPoint of Range
348 if (event == 1 && selected->InheritsFrom("TAxis"))
351 // - Mouse pressed on Axis : Real Zoom process not only click
352 else if (event == 21 && selected->InheritsFrom("TAxis") && fTmpEvent == 1)
355 // - Mouse pressed on Axis : Still pressed
356 else if (event == 21 && selected->InheritsFrom("TAxis") && fTmpEvent == 21)
359 // - Mouse up on Axis : End Point of Rangex
360 else if (event == 11 && selected->InheritsFrom("TAxis") && fTmpEvent == 21){
361 TAxis * axis = (TAxis*) selected;
363 if (selected == fHistraw->GetXaxis() || selected == fHistrawcl->GetXaxis()){
364 fBinX[0] = axis->GetFirst() -1;
365 fBinX[1] = axis->GetLast() -1;
368 fBinY[0] = axis->GetFirst() -1;
369 fBinY[1] = axis->GetLast() -1;