Dear ROOTers,
I’ve converted René’s DynamicSlice script into a TH2F member function for a quick check on 2d histograms. Feel free to implement this.
Cheers,
Oliver
TH2F.h:
Bool_t fShowProjectionX; //! Show projection onto X axis
Bool_t fShowProjectionY; //! Show projection onto Y axis
virtual void ExecuteEvent(Int_t event, Int_t px, Int_t py);
void SetShowProjectionX(Bool_t ShowProjectionX); // *TOGGLE*
void SetShowProjectionY(Bool_t ShowProjectionY); // *TOGGLE*
inline Bool_t GetShowProjectionX() { return fShowProjectionX; }
inline Bool_t GetShowProjectionY() { return fShowProjectionY; }
TH2F.cxx:
// in ctors
fShowProjectionX = kFALSE;
fShowProjectionY = kFALSE;
void TH2F::ExecuteEvent(Int_t event, Int_t px, Int_t py) {
//
// Interprete mouse events
//
if ( event == kMouseMotion ) {
if ( fShowProjectionX ) {
//
// Show projection onto X
//
gPad->GetCanvas()->FeedbackMode(kTRUE);
// Erase old position and draw a line at current position
static int pyold = 0;
float uxmin = gPad->GetUxmin();
float uxmax = gPad->GetUxmax();
int pxmin = gPad->XtoAbsPixel(uxmin);
int pxmax = gPad->XtoAbsPixel(uxmax);
if( pyold ) gVirtualX->DrawLine(pxmin,pyold,pxmax,pyold);
gVirtualX->DrawLine(pxmin,py,pxmax,py);
pyold = py;
Float_t upy = gPad->AbsPixeltoY(py);
Float_t y = gPad->PadtoY(upy);
// Create or set the new canvas proj x
TVirtualPad *padsav = gPad;
TCanvas *c = (TCanvas*)gROOT->GetListOfCanvases()
->FindObject("c_projection_x");
if( c != 0 ) {
c->Clear();
} else {
c = new TCanvas("c_projection_x", "ProjectionX Canvas",
700, 500);
}
c->SetGrid();
c->cd();
// Draw slice corresponding to mouse position
Int_t biny = GetYaxis()->FindBin(y);
TH1D *hp = ProjectionX("", biny, biny);
hp->SetFillColor(38);
hp->SetName("ProjectionX");
hp->SetTitle(Form("ProjectionX of biny=%d", biny));
hp->SetXTitle(GetXaxis()->GetTitle());
hp->SetYTitle("Number of Entries");
hp->Draw();
c->Update();
padsav->cd();
}
if ( fShowProjectionY ) {
//
// Show projection onto Y
//
gPad->GetCanvas()->FeedbackMode(kTRUE);
// Erase old position and draw a line at current position
static int pxold = 0;
float uymin = gPad->GetUymin();
float uymax = gPad->GetUymax();
int pymin = gPad->YtoAbsPixel(uymin);
int pymax = gPad->YtoAbsPixel(uymax);
if( pxold ) gVirtualX->DrawLine(pxold,pymin,pxold,pymax);
gVirtualX->DrawLine(px,pymin,px,pymax);
pxold = px;
Float_t upx = gPad->AbsPixeltoX(px);
Float_t x = gPad->PadtoX(upx);
// Create or set the new canvas proj y
TVirtualPad *padsav = gPad;
TCanvas *c = (TCanvas*)gROOT->GetListOfCanvases()
->FindObject("c_projection_y");
if( c != 0 ) {
c->Clear();
} else {
c = new TCanvas("c_projection_y", "ProjectionY Canvas",
700, 500);
}
c->SetGrid();
c->cd();
// Draw slice corresponding to mouse position
Int_t binx = GetXaxis()->FindBin(x);
TH1D *hp = ProjectionY("", binx, binx);
hp->SetFillColor(38);
hp->SetName("ProjectionY");
hp->SetTitle(Form("ProjectionY of binx=%d", binx));
hp->SetXTitle(GetYaxis()->GetTitle());
hp->SetYTitle("Number of Entries");
hp->Draw();
c->Update();
padsav->cd();
}
} else {
TH1::ExecuteEvent(event, px, py);
}
}
//____________________________________________________________________
void TH2F::SetShowProjectionX(Bool_t ShowProjectionX) {
//
// Set projection onto X
//
fShowProjectionX = ShowProjectionX;
if ( ShowProjectionX == kFALSE ) {
TCanvas *c = (TCanvas*)gROOT->GetListOfCanvases()
->FindObject("c_projection_x");
if( c != 0 ) { delete c; c = 0; }
}
}
//____________________________________________________________________
void TH2F::SetShowProjectionY(Bool_t ShowProjectionY) {
//
// Set projection onto Y
//
fShowProjectionY = ShowProjectionY;
if ( ShowProjectionY == kFALSE ) {
TCanvas *c = (TCanvas*)gROOT->GetListOfCanvases()
->FindObject("c_projection_y");
if( c != 0 ) { delete c; c = 0; }
}
}