// $Id$
/** \class AliHLTTPCDisplayFront
//_____________________________________________________________
// AliHLTTPCDisplayFront
//
// Display class for the HLT TPC-Pad events.
*/
// Author: Jochen Thaeder
//*-- Copyright © ALICE HLT Group
#include
#include
#include
#include
#include
#include
#ifdef use_aliroot
#include
#include
#include
#include
#endif
#include "AliHLTStdIncludes.h"
#include "AliHLTTPCDefinitions.h"
#include "AliHLTDataTypes.h"
#include "AliHLTTPCSpacePointData.h"
#include "AliHLTTPCClusterDataFormat.h"
#include "AliHLTTPCLogging.h"
#include "AliHLTTPCTransform.h"
#include "AliHLTTPCDisplayMain.h"
#include "AliHLTTPCDisplayFront.h"
#include "AliHLTTPCDisplayPad.h"
#if __GNUC__ >= 3
using namespace std;
#endif
#define TESTCODE 0
ClassImp(AliHLTTPCDisplayFront)
//____________________________________________________________________________________________________
AliHLTTPCDisplayFront::AliHLTTPCDisplayFront(AliHLTTPCDisplayMain* display) {
// constructor
fDisplay = display;
fNTimes = display->GetNTimeBins();
fBinY[0] = 0;
fBinY[1] = AliHLTTPCTransform::GetNRows() - 1;
#if TESTCODE
fBinX[0] = (-4) * AliHLTTPCTransform::GetNPads(fBinY[1]);
fBinX[1] = (4) * AliHLTTPCTransform::GetNPads(fBinY[1]);
Int_t Bins = (8 * AliHLTTPCTransform::GetNPads(fBinY[1]) ) + 1;
#else
fBinX[0] = 0;
fBinX[1] = AliHLTTPCTransform::GetNPads(fBinY[1]);
#endif
fTmpEvent = 0;
Int_t fBinningFaktor = 4 ;
#if TESTCODE
fHistfront = new TH2F("fHistfront","FrontView of selected slice;Pad #;Padrow #",Bins,fBinX[0],fBinX[1],fBinY[1]+1,fBinY[0],fBinY[1]);
#else
fHistfront = new TH2F("fHistfront","FrontView of selected slice;Pad #;Padrow #",fBinX[1]+1,fBinX[0],fBinX[1],fBinY[1]+1,fBinY[0],fBinY[1]);
fHistfrontcl = new TH1F("fHistfrontcl","cvcv;ddd;kkk",fBinX[1]+1,fBinX[0],fBinX[1]);
gStyle->SetPalette(1);
#endif
fHistfront->SetOption("COLZ");
fHistfront->SetTitleSize(0.03);
fHistfront->GetXaxis()->SetLabelSize(0.03);
fHistfront->GetXaxis()->SetTitleSize(0.03);
fHistfront->GetYaxis()->SetLabelSize(0.03);
fHistfront->GetYaxis()->SetTitleSize(0.03);
}
//____________________________________________________________________________________________________
AliHLTTPCDisplayFront::~AliHLTTPCDisplayFront() {
// destructor
if ( fHistfront ){
delete fHistfront;
fHistfront = NULL;
}
}
//____________________________________________________________________________________________________
void AliHLTTPCDisplayFront::Reset(){
fHistfront->Reset();
}
//____________________________________________________________________________________________________
void AliHLTTPCDisplayFront::Save(){
fCanvas->SaveAs("HLT-FrontView.eps");
}
//____________________________________________________________________________________________________
void AliHLTTPCDisplayFront::Fill() {
// Fill Pad Histogram
Int_t timeSwitch = fDisplay->GetFrontDataSwitch();
// --- TEST CODE beginn
Int_t fBinning = 8; // == 1/0.125
Int_t fBinningFaktor = 4; // binning / 2 because of width half
#if TESTCODE
// use sum
if (timeSwitch == 0) {
for (Int_t row=0; row < AliHLTTPCTransform::GetNRows(); row++){
Int_t width_half = AliHLTTPCTransform::GetNPads(row) * AliHLTTPCTransform::GetPadLength(row) * fBinningFaktor;
Int_t pad_corrected_loop = (Int_t) ( AliHLTTPCTransform::GetPadLength(row) *fBinning );
for (Int_t pad=0; pad < AliHLTTPCTransform::GetNPads(row); pad++){
Int_t pad_corrected = ( pad * AliHLTTPCTransform::GetPadLength(row) * fBinning ) - width_half;
UInt_t timeSum = 0;
for (Int_t timeBin=fDisplay->GetTimeBinMin(); timeBin <= fDisplay->GetTimeBinMax(); timeBin++){
timeSum += fDisplay->fRawData[row][pad][timeBin];
} // end time
for (Int_t ii=0;ii < pad_corrected_loop; ii++){
pad_corrected++;
fHistfront->Fill(pad_corrected,row,(Int_t) timeSum);
}
} // end pad
} // end row
} // end use sum
return;
// --- TEST CODE end
#endif
// !!
// !! DO unrolling because of cache effects (avoid cache trashing) !!
// !!
if ( fDisplay->GetZeroSuppression() ){
// use sum
if (timeSwitch == 0) {
for (Int_t row=0; row < AliHLTTPCTransform::GetNRows(); row++){
for (Int_t pad=0; pad < AliHLTTPCTransform::GetNPads(row); pad++){
UInt_t timeSum = 0;
for (Int_t timeBin=fDisplay->GetTimeBinMin(); timeBin <= fDisplay->GetTimeBinMax(); timeBin++){
timeSum += fDisplay->fRawDataZeroSuppressed[row][pad][timeBin];
} // end time
fHistfront->Fill(pad,row,(Int_t) timeSum);
} // end pad
} // end row
} // end use sum
// use average
else if (timeSwitch == 1){
for (Int_t row=0; row < AliHLTTPCTransform::GetNRows(); row++){
for (Int_t pad=0; pad < AliHLTTPCTransform::GetNPads(row); pad++){
UInt_t timeSum = 0;
Int_t NTimeBins = 0;
Float_t timeAverage = 0.;
for (Int_t timeBin=fDisplay->GetTimeBinMin(); timeBin <= fDisplay->GetTimeBinMax(); timeBin++){
timeSum += fDisplay->fRawDataZeroSuppressed[row][pad][timeBin];
NTimeBins++;
} // end time
if (NTimeBins <= 0)
HLTFatal("Division by Zero - NTimeBins == 0");
else
timeAverage = ((Float_t) timeSum) / ((Float_t) NTimeBins);
fHistfront->Fill(pad,row, timeAverage);
} // end pad
} // end row
}// end use average
// use maximum
else if (timeSwitch == 2){
for (Int_t row=0; row < AliHLTTPCTransform::GetNRows(); row++){
for (Int_t pad=0; pad < AliHLTTPCTransform::GetNPads(row); pad++){
UInt_t timeMax = 0;
for (Int_t timeBin=fDisplay->GetTimeBinMin(); timeBin <= fDisplay->GetTimeBinMax(); timeBin++){
UInt_t tmp = fDisplay->fRawDataZeroSuppressed[row][pad][timeBin];
if (tmp > timeMax) timeMax = tmp;
} // end time
fHistfront->Fill(pad,row,(Int_t) timeMax);
} // end pad
} // end row
}// end use maximum
} // end - if ( fDisplay->GetZeroSuppression() ){
else {
// use sum
if (timeSwitch == 0) {
for (Int_t row=0; row < AliHLTTPCTransform::GetNRows(); row++){
for (Int_t pad=0; pad < AliHLTTPCTransform::GetNPads(row); pad++){
UInt_t timeSum = 0;
for (Int_t timeBin=fDisplay->GetTimeBinMin(); timeBin <= fDisplay->GetTimeBinMax(); timeBin++){
timeSum += fDisplay->fRawData[row][pad][timeBin];
} // end time
fHistfront->Fill(pad,row,(Int_t) timeSum);
} // end pad
} // end row
} // end use sum
// use average
else if (timeSwitch == 1){
for (Int_t row=0; row < AliHLTTPCTransform::GetNRows(); row++){
for (Int_t pad=0; pad < AliHLTTPCTransform::GetNPads(row); pad++){
UInt_t timeSum = 0;
Int_t NTimeBins = 0;
Float_t timeAverage = 0.;
for (Int_t timeBin=fDisplay->GetTimeBinMin(); timeBin <= fDisplay->GetTimeBinMax(); timeBin++){
timeSum += fDisplay->fRawData[row][pad][timeBin];
NTimeBins++;
} // end time
if (NTimeBins <= 0)
HLTFatal("Division by Zero - NTimeBins == 0");
else
timeAverage = ((Float_t) timeSum) / ((Float_t) NTimeBins);
fHistfront->Fill(pad,row, timeAverage);
} // end pad
} // end row
}// end use average
// use maximum
else if (timeSwitch == 2){
for (Int_t row=0; row < AliHLTTPCTransform::GetNRows(); row++){
for (Int_t pad=0; pad < AliHLTTPCTransform::GetNPads(row); pad++){
UInt_t timeMax = 0;
for (Int_t timeBin=fDisplay->GetTimeBinMin(); timeBin <= fDisplay->GetTimeBinMax(); timeBin++){
UInt_t tmp = fDisplay->fRawData[row][pad][timeBin];
if (tmp > timeMax) timeMax = tmp;
} // end time
fHistfront->Fill(pad,row,(Int_t) timeMax);
} // end pad
} // end row
}// end use maximum
} // end - else of if ( fDisplay->GetZeroSuppression() ){
#if 0
if (fDisplay->ExistsClusterData()){
for (Int_t patch=0; patch < 6; patch++){
AliHLTTPCSpacePointData *points = fDisplay->GetSpacePointDataPointer(fDisplay->GetSlicePadRow(),patch);
if(!points) return;
cout << "fill" << patch << endl;
Float_t xyz[3];
for(Int_t i=0; i< fDisplay->GetNumberSpacePoints(fDisplay->GetSlicePadRow(),patch); i++){
xyz[0] = points[i].fX;
xyz[1] = points[i].fY;
xyz[2] = points[i].fZ;
Int_t padRow = AliHLTTPCTransform::GetPadRow(xyz[0]);
// select padrow to fill in histogramm
// if (padRow == AliHLTTPCTransform::GetPadRow(xyz[0])){
AliHLTTPCTransform::LocHLT2Raw(xyz, 0, padRow);
fHistfrontcl->Fill(xyz[1],padRow);
// }
}
}
} // END if (fDisplay->ExistsClusterData()){
#endif
}
//____________________________________________________________________________________________________
void AliHLTTPCDisplayFront::Draw(){
fDisplay->GetCanvasFront()->cd();
fDisplay->GetCanvasFront()->Clear();
if (fDisplay->GetSplitFront()){
fDisplay->GetCanvasFront()->Divide(1,2);
fDisplay->GetCanvasFront()->cd(1);
}
Char_t title[256];
sprintf(title,"FrontView of selected slice%d",fDisplay->GetSlicePadRow());
// Keep Zoom
if (!fDisplay->GetKeepView() ){
fBinY[0] = 0;
fBinY[1] = AliHLTTPCTransform::GetNRows() - 1;
fBinX[0] = 0;
fBinX[1] = AliHLTTPCTransform::GetNPads(fBinY[1]);
}
fHistfront->SetAxisRange(fBinX[0],fBinX[1]);
fHistfront->SetAxisRange(fBinY[0],fBinY[1],"Y");
fHistfront->SetTitle(title);
fHistfront->SetStats(kFALSE);
fHistfront->Draw("COLZ");
if ( fDisplay->ExistsClusterData() ){
fHistfrontcl->SetAxisRange(fBinX[0],fBinX[1]);
fHistfrontcl->SetAxisRange(fBinY[0],fBinY[1],"Y");
fHistfrontcl->SetStats(kFALSE);
fHistfrontcl->SetMarkerStyle(28);
fHistfrontcl->SetMarkerSize(2);
fHistfrontcl->SetMarkerColor(1);
fHistfrontcl->Draw("psame");
}
if (fDisplay->GetSplitFront()){
fDisplay->GetCanvasFront()->cd(2);
fDisplay->GetPadPointer()->fHistpad2->Draw();
}
fDisplay->GetCanvasFront()->Modified();
fDisplay->GetCanvasFront()->Update();
// Select Pad
fDisplay->GetCanvasFront()->Connect("ProcessedEvent(Int_t,Int_t,Int_t,TObject*)","AliHLTTPCDisplayMain",(void*) fDisplay,"ExecPadEvent(Int_t,Int_t,Int_t,TObject*)");
// Keep Zoom
fDisplay->GetCanvasFront()->Connect("ProcessedEvent(Int_t,Int_t,Int_t,TObject*)","AliHLTTPCDisplayFront",(void*) this,"ExecEvent(Int_t,Int_t,Int_t,TObject*)");
}
//____________________________________________________________________________________________________
void AliHLTTPCDisplayFront::ExecEvent(Int_t event, Int_t px, Int_t py, TObject *selected){
// Saves the Zoom Position of the Histogram
// - Mouse down on Axis : StartPoint of Range
if (event == 1 && selected->InheritsFrom("TAxis"))
fTmpEvent = 1;
// - Mouse pressed on Axis : Real Zoom process not only click
else if (event == 21 && selected->InheritsFrom("TAxis") && fTmpEvent == 1)
fTmpEvent = 21;
// - Mouse pressed on Axis : Still pressed
else if (event == 21 && selected->InheritsFrom("TAxis") && fTmpEvent == 21)
return;
// - Mouse up on Axis : End Point of Rangex
else if (event == 11 && selected->InheritsFrom("TAxis") && fTmpEvent == 21){
TAxis * axis = (TAxis*) selected;
if (selected == fHistfront->GetXaxis() || selected == fHistfront->GetXaxis()){
fBinX[0] = axis->GetFirst() -1;
fBinX[1] = axis->GetLast() -1;
}
else {
fBinY[0] = axis->GetFirst() -1;
fBinY[1] = axis->GetLast() -1;
}
fTmpEvent = 0;
}
else fTmpEvent = 0;
}