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 void AliHLTTPCDisplayPadRow::Fill(){
115 // Fill PadRow Histogram
117 #if defined(HAVE_TPC_MAPPING)
118 AliHLTTPCDigitReaderRaw digitReader(0);
120 bool readValue = true;
123 Int_t padRow = fDisplay->GetPadRow();
124 Int_t slice = fDisplay->GetSlicePadRow();
127 // Initialize RAW DATA
128 Int_t firstRow = AliHLTTPCTransform::GetFirstRow(patch);
129 Int_t lastRow = AliHLTTPCTransform::GetLastRow(patch);
132 // Outer sector, patches 2, 3, 4, 5 - start counting in patch 2 with row 0
133 if ( patch >= 2 ) rowOffset = AliHLTTPCTransform::GetFirstRow( 2 );
135 // Initialize block for reading packed data
136 void* tmpdataBlock = (void*) dataBlock;
137 digitReader.InitBlock(tmpdataBlock,dataLen,firstRow,lastRow,patch,slice);
139 readValue = digitReader.Next();
142 LOG(AliHLTTPCLog::kError,"AliHLTTPCDisplayPadRow::Fill","Read first value") << "No value in data block" << ENDLOG;
146 if ( fDisplay->GetZeroSuppression() ){
147 for (Int_t pad=0; pad < AliHLTTPCTransform::GetNPads(padRow); pad++){
148 // for (Int_t timeBin=fDisplay->GetTimeBinMin(); timeBin <= fDisplay->GetTimeBinMax(); timeBin++){
149 for (Int_t timeBin=0; timeBin <= fDisplay->GetNTimeBins(); timeBin++){
151 fHistraw->Fill(pad,timeBin,fDisplay->fRawDataZeroSuppressed[padRow][pad][timeBin]);
155 } // end - if ( fDisplay->GetZeroSuppression() ){
158 for (Int_t pad=0; pad < AliHLTTPCTransform::GetNPads(padRow); pad++){
159 // for (Int_t timeBin=fDisplay->GetTimeBinMin(); timeBin <= fDisplay->GetTimeBinMax(); timeBin++){
160 for (Int_t timeBin=0; timeBin <= fDisplay->GetNTimeBins(); timeBin++){
161 fHistraw->Fill(pad,timeBin,fDisplay->fRawData[padRow][pad][timeBin]);
164 } // end - else of if ( fDisplay->GetZeroSuppression() ){
167 // FILL PADROW 3D --- Initialize the colorbins
168 if ( fDisplay->Get3DSwitchPadRow() ){
169 for (UInt_t ii=0;ii < 20;ii++){
174 // read number of entries in colorbin
177 Int_t row = digitReader.GetRow() + rowOffset;
180 UInt_t charge = digitReader.GetSignal();
182 for (UInt_t ii=0;ii < 19;ii++){
183 if ( charge > (ii*15) && charge <= ((ii*15) + 15) ) fcolorbin[ii]++;
185 // larger than 19 * 15
186 if (charge > 285 ) fcolorbin[19]++;
190 readValue = digitReader.Next();
192 if(!readValue) break; //No more value
195 // Initialize fpmarr[color][3*colorbin[ii]]
196 for (Int_t ii = 0; ii < 20; ii++) {
197 if ( fpmarr[ii] ) delete[] fpmarr[ii];
198 fpmarr[ii] = new Float_t[fcolorbin[ii]*3];
201 // Rewind the raw reader and fill the polymarker3D
202 digitReader.InitBlock(tmpdataBlock,dataLen,firstRow,lastRow,patch,slice);
204 readValue = digitReader.Next();
205 } // END if (fDisplay->Get3DSwitchPadRow())
210 Int_t row = digitReader.GetRow() + rowOffset;
212 // select padrow to fill in histogramm
214 UChar_t pad = digitReader.GetPad();
215 UShort_t time = digitReader.GetTime();
216 UInt_t charge = digitReader.GetSignal();
218 //fHistraw->Fill(pad,time,charge);
220 if ( fDisplay->Get3DSwitchPadRow() ) {
221 // Transform raw coordinates to local coordinates
222 AliHLTTPCTransform::RawHLT2Global(xyz, slice, padRow, pad, time);
224 for (UInt_t ii=0;ii < 19;ii++){
225 if ( charge > (ii*15) && charge <= ((ii*15) + 15) ){
226 fpmarr[ii][fbinct[ii]] = xyz[0];
227 fpmarr[ii][fbinct[ii]+1] = xyz[1];
228 fpmarr[ii][fbinct[ii]+2] = xyz[2];
232 // larger than 19 * 15
234 fpmarr[19][fbinct[19]] = xyz[0];
235 fpmarr[19][fbinct[19]+1] = xyz[1];
236 fpmarr[19][fbinct[19]+2] = xyz[2];
239 } // END if (fSwitch3DPadRow)
241 } // END if (row == padRow){
244 readValue = digitReader.Next();
246 //Check where to stop:
247 if(!readValue) break; //No more value
252 if (fDisplay->ExistsClusterData()){
253 AliHLTTPCSpacePointData *points = fDisplay->GetSpacePointDataPointer(slice,patch);
257 for(Int_t i=0; i< fDisplay->GetNumberSpacePoints(slice,patch); i++){
258 xyz[0] = points[i].fX;
259 xyz[1] = points[i].fY;
260 xyz[2] = points[i].fZ;
262 // select padrow to fill in histogramm
263 if (padRow == AliHLTTPCTransform::GetPadRow(xyz[0])){
264 AliHLTTPCTransform::LocHLT2Raw(xyz, slice, padRow);
265 fHistrawcl->Fill(xyz[1],xyz[2]);
268 } // END if (fDisplay->ExistsClusterData()){
270 #else //! defined(HAVE_TPC_MAPPING)
271 HLTFatal("DigitReaderRaw not available - check your build");
272 #endif //defined(HAVE_TPC_MAPPING)
276 //____________________________________________________________________________________________________
277 void AliHLTTPCDisplayPadRow::Draw(){
279 fDisplay->GetCanvasPadRow()->cd();
280 fDisplay->GetCanvasPadRow()->Clear();
282 if (fDisplay->GetSplitPadRow()){
283 fDisplay->GetCanvasPadRow()->Divide(1,2);
284 fDisplay->GetCanvasPadRow()->cd(1);
288 sprintf(title,"Selected PadRow %d with found Clusters",fDisplay->GetPadRow());
291 if (!fDisplay->GetKeepView() || (fBinX[1]>fDisplay->GetNPads()) || (fBinY[1]>fNTimes)){
293 fBinX[1] = fDisplay->GetNPads();
295 fBinY[1] = fNTimes - 1;
298 fHistraw->SetAxisRange(fBinX[0],fBinX[1]);
299 fHistraw->SetAxisRange(fBinY[0],fBinY[1],"Y");
300 fHistraw->SetTitle(title);
301 fHistraw->SetStats(kFALSE);
302 fHistraw->Draw("COLZ");
304 if ( fDisplay->ExistsClusterData() ){
305 //cout << "XX" << endl;
306 fHistrawcl->SetAxisRange(fBinX[0],fBinX[1]);
307 fHistrawcl->SetAxisRange(fBinY[0],fBinY[1],"Y");
308 fHistrawcl->SetStats(kFALSE);
309 fHistrawcl->SetMarkerStyle(28);
310 fHistrawcl->SetMarkerSize(2);
311 fHistrawcl->SetMarkerColor(1);
312 fHistrawcl->Draw("psame");
315 if (fDisplay->GetSplitPadRow()){
316 fDisplay->GetCanvasPadRow()->cd(2);
317 fDisplay->GetPadPointer()->fHistpad2->Draw();
320 fDisplay->GetCanvasPadRow()->Modified();
321 fDisplay->GetCanvasPadRow()->Update();
324 fDisplay->GetCanvasPadRow()->Connect("ProcessedEvent(Int_t,Int_t,Int_t,TObject*)","AliHLTTPCDisplayMain",(void*) fDisplay,"ExecPadEvent(Int_t,Int_t,Int_t,TObject*)");
326 fDisplay->GetCanvasPadRow()->Connect("ProcessedEvent(Int_t,Int_t,Int_t,TObject*)","AliHLTTPCDisplayPadRow",(void*) this,"ExecEvent(Int_t,Int_t,Int_t,TObject*)");
329 //____________________________________________________________________________________________________
330 void AliHLTTPCDisplayPadRow::Draw3D(){
331 Int_t markercolor = 51;
333 for (UInt_t ii=0;ii < 20;ii++){
334 if (fcolorbin[ii]> 0){
336 TPolyMarker3D* pm = new TPolyMarker3D(fcolorbin[ii], fpmarr[ii], 7 );
337 pm->SetBit(kCanDelete);
339 pm->SetMarkerColor(markercolor);
343 // in order to have the SetPalette(1), so called "pretty"
344 if (ii % 2 == 0 ) markercolor += 2;
345 else markercolor += 3;
349 //____________________________________________________________________________________________________
350 void AliHLTTPCDisplayPadRow::ExecEvent(Int_t event, Int_t px, Int_t py, TObject *selected){
351 // Saves the Zoom Position of the Histogram
353 // - Mouse down on Axis : StartPoint of Range
354 if (event == 1 && selected->InheritsFrom("TAxis"))
357 // - Mouse pressed on Axis : Real Zoom process not only click
358 else if (event == 21 && selected->InheritsFrom("TAxis") && fTmpEvent == 1)
361 // - Mouse pressed on Axis : Still pressed
362 else if (event == 21 && selected->InheritsFrom("TAxis") && fTmpEvent == 21)
365 // - Mouse up on Axis : End Point of Rangex
366 else if (event == 11 && selected->InheritsFrom("TAxis") && fTmpEvent == 21){
367 TAxis * axis = (TAxis*) selected;
369 if (selected == fHistraw->GetXaxis() || selected == fHistrawcl->GetXaxis()){
370 fBinX[0] = axis->GetFirst() -1;
371 fBinX[1] = axis->GetLast() -1;
374 fBinY[0] = axis->GetFirst() -1;
375 fBinY[1] = axis->GetLast() -1;