//////////////////////////////////////////////////////////////////////////
//                                                                      //
// ATLFDisplay                                                          //
//                                                                      //
// Utility class to display ATLAS outline, tracks, clusters, jets,..    //
//                                                                      //
//////////////////////////////////////////////////////////////////////////

#include <TROOT.h>
#include <TButton.h>
#include <TCanvas.h>
#include <TView.h>
#include <TArc.h>
#include <TText.h>
#include <TPaveLabel.h>
#include <TPaveText.h>
#include <TList.h>
#include <TDiamond.h>
#include <TNode.h>
#include <TTUBE.h>
#include <TMath.h>
#include <X3DBuffer.h>

#include "ATLFDisplay.h"
#include "ATLFFruit.h"
#include "ATLFParticle.h"
#include "ATLFast.h"
#include "ATLFMCMaker.h"
#include "ATLFClusterMaker.h"
#include "ATLFTriggerMaker.h"
#include "ATLFTrigger.h"

ClassImp(ATLFDisplay)


//_____________________________________________________________________________
 ATLFDisplay::ATLFDisplay() : ATLFVirtualDisplay()
{
   m_Particle  = 0;
   m_Fruits    = 0;
}

//_____________________________________________________________________________
 ATLFDisplay::ATLFDisplay(const char *title) : ATLFVirtualDisplay()
{

   gATLFast->SetDisplay(this);


   // Set front view by default
   m_Theta = 0;
   m_Phi   = -90;
   m_DrawAllViews  = kFALSE;
   m_DrawClusters  = kTRUE;
   m_DrawParticles = kTRUE;

   // Initialize display default parameters
   SetPTcut();
   SetPTcutEGMUNU();
   SetGeometry();

   // Create display canvas
   m_Canvas = new TCanvas("Canvas", (char*)title,14,47,740,650);
   m_Canvas->SetEditable(kIsNotEditable);

   // Create main display pad
   m_Pad = new TPad("viewpad", "ATLFast display",0.15,0,1,1);
   m_Pad->Draw();
   m_Pad->Modified();
   m_Pad->SetFillColor(1);
   m_Pad->SetBorderSize(2);

   // Create user interface control pad
   DisplayButtons();
   m_Canvas->cd();

   // Create trigger view pad
   Float_t dxtr = 0.15;
   Float_t dytr = 0.45;
   Float_t xt   = 0.3*dxtr;
   Float_t yt   = 0.8*dytr;
   Float_t dyt  = 0.07*dytr;
   Float_t xarc = 0.7*dxtr;
   Float_t rarc = 0.3*dyt;
   m_TrigPad = new TPad("TrigPad", "trigger pad",0,0,dxtr,dytr);
   m_TrigPad->Range(0,0,dxtr,dytr);
   m_TrigPad->Draw();
   m_TrigPad->cd();
   m_TrigPad->SetFillColor(22);
   m_TrigPad->SetBorderSize(2);

   TText *t = new TText();
   t->SetTextFont(61);
   t->SetTextSize(0.2);
   t->SetTextAlign(22);
   t->DrawText(0.5*dxtr, 0.93*dytr,"Trigger");
   t->SetTextSize(0.14);
   t->SetTextAlign(22);
   t->DrawText(xt,yt,      "EM1");
   t->DrawText(xt,yt-dyt,  "PH1");
   t->DrawText(xt,yt-2*dyt,"EM2");
   t->DrawText(xt,yt-3*dyt,"MU1");
   t->DrawText(xt,yt-4*dyt,"MU2");
   t->DrawText(xt,yt-5*dyt,"EMU");
   t->DrawText(xt,yt-6*dyt,"JT1");
   t->DrawText(xt,yt-7*dyt,"JT2");
   t->DrawText(xt,yt-8*dyt,"JT3");
   t->DrawText(xt,yt-9*dyt,"ALL");
   m_EM1 = new TArc(xarc,yt,      rarc); m_EM1->Draw();
   m_PH1 = new TArc(xarc,yt-dyt,  rarc); m_PH1->Draw();
   m_EM2 = new TArc(xarc,yt-2*dyt,rarc); m_EM2->Draw();
   m_MU1 = new TArc(xarc,yt-3*dyt,rarc); m_MU1->Draw();
   m_MU2 = new TArc(xarc,yt-4*dyt,rarc); m_MU2->Draw();
   m_EMU = new TArc(xarc,yt-5*dyt,rarc); m_EMU->Draw();
   m_JT1 = new TArc(xarc,yt-6*dyt,rarc); m_JT1->Draw();
   m_JT3 = new TArc(xarc,yt-7*dyt,rarc); m_JT3->Draw();
   m_JT4 = new TArc(xarc,yt-8*dyt,rarc); m_JT4->Draw();
   m_ALL = new TArc(xarc,yt-9*dyt,rarc); m_ALL->Draw();
   AppendPad(); // append display object as last object to force selection

   m_Tubin = new TTUBE("tubin","inner tube"," ", m_Rin, m_Rin+5, m_Zin);
   m_Nodin = new TNode("nodin","ATLAS outline","tubin",0,0,0," ");
   m_Nodin->SetLineColor(7);
         

   // Create list to support list of fruits
   m_Fruits = new TList();

   // Create particle manager
   m_Particle = new ATLFParticle("particle_manager");

   m_Canvas->cd();
   m_Canvas->Update();

}


//_____________________________________________________________________________
 ATLFDisplay::~ATLFDisplay()
{
   delete m_Particle;
   if (m_Fruits) m_Fruits->Delete();
   delete m_Fruits;
}

//_____________________________________________________________________________
 void ATLFDisplay::Clear(Option_t *)
{
//    Delete graphics temporary objects

   m_Fruits->Delete();

}

//_____________________________________________________________________________
 void ATLFDisplay::DisplayButtons()
{
//    Create the user interface buttons

   m_Buttons = new TPad("buttons", "newpad",0,0.45,0.15,1);
   m_Buttons->Draw();
   m_Buttons->SetFillColor(38);
   m_Buttons->SetBorderSize(2);
   m_Buttons->cd();

   Int_t butcolor = 33;
   Float_t dbutton = 0.08;
   Float_t y  = 0.96;
   Float_t dy = 0.014;
   Float_t x0 = 0.05;
   Float_t x1 = 0.95;

   TButton *button;
   char *but1 = "gATLFast->Display()->ShowNextEvent(1)";
   button = new TButton("Next",but1,x0,y-dbutton,x1,y);
   button->SetFillColor(38);
   button->Draw();

   y -= dbutton +dy;
   char *but2 = "gATLFast->Display()->ShowNextEvent(-1)";
   button = new TButton("Previous",but2,x0,y-dbutton,x1,y);
   button->SetFillColor(38);
   button->Draw();

   y -= dbutton +dy;
   char *but3 = "gATLFast->Display()->SetView(90,-90)";
   button = new TButton("Top View",but3,x0,y-dbutton,x1,y);
   button->SetFillColor(butcolor);
   button->Draw();

   y -= dbutton +dy;
   char *but4 = "gATLFast->Display()->SetView(90,0)";
   button = new TButton("Side View",but4,x0,y-dbutton,x1,y);
   button->SetFillColor(butcolor);
   button->Draw();

   y -= dbutton +dy;
   char *but5 = "gATLFast->Display()->SetView(0,-90)";
   button = new TButton("Front View",but5,x0,y-dbutton,x1,y);
   button->SetFillColor(butcolor);
   button->Draw();

   y -= dbutton +dy;
   char *but6 = "gATLFast->Display()->DrawAllViews()";
   button = new TButton("All Views",but6,x0,y-dbutton,x1,y);
   button->SetFillColor(butcolor);
   button->Draw();

   y -= dbutton +dy;
   char *but7 = "gATLFast->Display()->DrawViewGL()";
   button = new TButton("OpenGL",but7,x0,y-dbutton,x1,y);
   button->SetFillColor(38);
   button->Draw();

   y -= dbutton +dy;
   char *but8 = "gATLFast->Display()->DrawViewX3D()";
   button = new TButton("X3D",but8,x0,y-dbutton,x1,y);
   button->SetFillColor(38);
   button->Draw();

   // display logo
   TDiamond *diamond = new TDiamond(0.05,0.015,0.95,0.22);
   diamond->SetFillColor(50);
   diamond->SetTextAlign(22);
   diamond->SetTextColor(5);
   diamond->SetTextSize(0.11);
   diamond->Draw();
   diamond->AddText(".. ");
   diamond->AddText("ROOT");
   diamond->AddText("ATLFAST");
   diamond->AddText("... ");
   diamond->AddText(" ");
}

//_____________________________________________________________________________
 void ATLFDisplay::DisplayTrigger(ATLFTrigger *trig)
{
//    Display trigger parameters for current event

   if (trig->EM1()) m_EM1->SetFillColor(kGreen); else m_EM1->SetFillColor(kRed);
   if (trig->PH1()) m_PH1->SetFillColor(kGreen); else m_PH1->SetFillColor(kRed);
   if (trig->EM2()) m_EM2->SetFillColor(kGreen); else m_EM2->SetFillColor(kRed);
   if (trig->MU1()) m_MU1->SetFillColor(kGreen); else m_MU1->SetFillColor(kRed);
   if (trig->MU2()) m_MU2->SetFillColor(kGreen); else m_MU2->SetFillColor(kRed);
   if (trig->EMU()) m_EMU->SetFillColor(kGreen); else m_EMU->SetFillColor(kRed);
   if (trig->JT1()) m_JT1->SetFillColor(kGreen); else m_JT1->SetFillColor(kRed);
   if (trig->JT3()) m_JT3->SetFillColor(kGreen); else m_JT3->SetFillColor(kRed);
   if (trig->JT4()) m_JT4->SetFillColor(kGreen); else m_JT4->SetFillColor(kRed);
   if (trig->ALL()) m_ALL->SetFillColor(kGreen); else m_ALL->SetFillColor(kRed);
   m_TrigPad->Modified();
}

//______________________________________________________________________________
 Int_t ATLFDisplay::DistancetoPrimitive(Int_t px, Int_t py)
{
// Compute distance from point px,py to objects in event

   if (gPad == m_TrigPad) {gPad->SetCursor(kCross); return 0;}

   const Int_t big = 9999;
   Int_t dist = big;
   Float_t xmin = gPad->GetX1();
   Float_t xmax = gPad->GetX2();
   Float_t dx   = 0.05*(xmax - xmin);
   Float_t x    = gPad->AbsPixeltoX(px);
   if (x < xmin+dx || x > xmax-dx) return dist;

    // scan list of particles
   dist = m_Particle->DistancetoPrimitive(px, py);
   if (dist <= 0) return 0;

    // scan list of fruits
   TIter nextf(m_Fruits);
   ATLFFruit *fruit;
   while((fruit=(ATLFFruit*)nextf())) {
      dist = fruit->DistancetoPrimitive(px, py);
      if (dist < 5) {
         gPad->SetSelected(fruit->Fruit());
         gPad->SetCursor(kCross);
         return 0;
      }
   }

    // scan list of detectors (currently only one tube)
   dist = m_Nodin->DistancetoPrimitive(px, py);
   if (gPad->GetCanvas()->GetSelected() == gPad->GetView()) {
      gPad->SetSelected(this);
   }
   return 0;
}

//_____________________________________________________________________________
 void ATLFDisplay::Draw(Option_t *)
{
//    Insert current event in graphics pad list

   if (m_DrawAllViews) {
      DrawAllViews();
      return;
   }

   m_Pad->cd();

   DrawView(m_Theta, m_Phi);

   // Display the event number and title
   m_Pad->cd();
   DrawTitle();
}

//_____________________________________________________________________________
 void ATLFDisplay::DrawAllViews()
{
//    Draw front,top,side and 30 deg views

   m_DrawAllViews = kTRUE;
   m_Pad->cd();
   m_Pad->SetFillColor(15);
   m_Pad->Clear();
   m_Pad->Divide(2,2);

   // draw 30 deg view
   m_Pad->cd(1);
   DrawView(30, 30);
   DrawTitle();

   // draw front view
   m_Pad->cd(2);
   DrawView(0, -90);
   DrawTitle("Front");

   // draw top view
   m_Pad->cd(3);
   DrawView(90, -90);
   DrawTitle("Top");

   // draw side view
   m_Pad->cd(4);
   DrawView(90, 0);
   DrawTitle("Side");

   m_Pad->cd(2);
}

//_____________________________________________________________________________
 void ATLFDisplay::DrawTitle(Option_t *option)
{
//    Draw the event title

   Float_t xmin = gPad->GetX1();
   Float_t xmax = gPad->GetX2();
   Float_t ymin = gPad->GetY1();
   Float_t ymax = gPad->GetY2();
   Float_t dx   = xmax-xmin;
   Float_t dy   = ymax-ymin;
   if (strlen(option) == 0) {
      TPaveText *title = new TPaveText(xmin +0.01*dx, ymax-0.09*dy, xmin +0.5*dx, ymax-0.01*dy);
      title->SetBit(kCanDelete);
      title->SetFillColor(42);
      title->Draw();
      char ptitle[100];
      sprintf(ptitle,"Pythia event: %d, Run:%d",gATLFast->Event(), gATLFast->Run());
      title->AddText(ptitle);
      sprintf(ptitle,"Pythia Mode: %s",gATLFast->MCMaker()->GetTitle());
      title->AddText(ptitle);
   } else {
      TPaveLabel *label = new TPaveLabel(xmin +0.01*dx, ymax-0.07*dy, xmin +0.2*dx, ymax-0.01*dy,option);
      label->SetBit(kCanDelete);
      label->SetFillColor(42);
      label->Draw();
   }
}

//_____________________________________________________________________________
 void ATLFDisplay::DrawView(Float_t theta, Float_t phi)
{
//    Draw a view of ATLAS

   gPad->SetFillColor(1);
   // Display ATLAS outline
   gPad->Clear();

   Int_t iret;
   TView *view = new TView(1);
   view->SetRange(-m_Rin, -m_Rin, -m_Zin, m_Rin, m_Rin, m_Zin);

   m_Nodin->Draw("same");

    // add itself to the list
   AppendPad();
   
   //Loop on all makers to add their products to the pad
   TIter next(gATLFast->Makers());
   ATLFMaker *maker;
   while ((maker = (ATLFMaker*)next())) {
      maker->Draw();
   }
   view->SetView(phi, theta, 0, iret);
}

//_____________________________________________________________________________
 void ATLFDisplay::DrawViewGL()
{
//    Draw current view using OPENGL

   TPad *pad = (TPad*)gPad->GetPadSave();
   pad->cd();
   TView *view = pad->GetView();
   if (!view) return;
   pad->x3d("OPENGL");
}

//_____________________________________________________________________________
 void ATLFDisplay::DrawViewX3D()
{
//    Draw current view using X3D

   TPad *pad = (TPad*)gPad->GetPadSave();
   pad->cd();
   TView *view = pad->GetView();
   if (!view) return;
   pad->x3d();
}

//______________________________________________________________________________
 void ATLFDisplay::ExecuteEvent(Int_t event, Int_t px, Int_t py)
{
//*-*-*-*-*-*-*-*-*-*-*Execute action corresponding to one event*-*-*-*
//*-*                  =========================================

   if (gPad->GetView()) {
      gPad->GetView()->ExecuteRotateView(event, px, py);
   }
}

//_____________________________________________________________________________
 void ATLFDisplay::GetEvent(Int_t event)
{
//    Read event in memory

   gATLFast->GetEvent(event);

   Draw();
}

//_____________________________________________________________________________
 void ATLFDisplay::Paint(Option_t *)
{
//    Paint miscellaneous items

}

//_____________________________________________________________________________
 void ATLFDisplay::PaintFruit(TObject *obj, Float_t eta, Float_t phi, Float_t
pt, Int_t type, Option_t *option)
{
//    Display fruit from obj

   ATLFFruit *fruit = new ATLFFruit(obj, eta, phi, pt, type);
   m_Fruits->Add(fruit);
   fruit->Paint(option);
}

//_____________________________________________________________________________
 void ATLFDisplay::PaintParticles(Option_t *option)
{
   if (m_DrawParticles) m_Particle->Paint(option);
}

//_____________________________________________________________________________
 void ATLFDisplay::SetGeometry(Float_t rin)
{
//  Set ATLAS in/out outline parameters

   m_Rin  = rin;
   m_Rout = 1.2*rin;
   m_Zin  = 600;
   m_Zout = 680;
}

//_____________________________________________________________________________
 void ATLFDisplay::SetPTcut(Float_t ptcut)
{
   m_PTcut = ptcut;

   if (m_DrawAllViews) {
      m_Pad->cd(1); gPad->Modified();
      m_Pad->cd(2); gPad->Modified();
      m_Pad->cd(3); gPad->Modified();
      m_Pad->cd(4); gPad->Modified();
      m_Pad->cd();
   }
}

//_____________________________________________________________________________
 void ATLFDisplay::SetPTcutEGMUNU(Float_t ptcut)
{
   m_PTcutEGMUNU = ptcut;

   if (m_DrawAllViews) {
      m_Pad->cd(1); gPad->Modified();
      m_Pad->cd(2); gPad->Modified();
      m_Pad->cd(3); gPad->Modified();
      m_Pad->cd(4); gPad->Modified();
      m_Pad->cd();
   }
}

//_____________________________________________________________________________
 void ATLFDisplay::SetView(Float_t theta, Float_t phi)
{
//  change viewing angles for current event

   m_Pad->cd();
   m_DrawAllViews = kFALSE;
   m_Phi   = phi;
   m_Theta = theta;
   Int_t iret;

   TView *view = gPad->GetView();
   if (view) view->SetView(m_Phi, m_Theta, 0, iret);
   else      Draw();

   gPad->Modified();
}

//_____________________________________________________________________________
 void ATLFDisplay::ShowNextEvent(Int_t delta)
{
//  Display (current event_number+delta)
//    delta =  1  shown next event
//    delta = -1 show previous event

  if (delta) {
     gATLFast->Clear();
     Int_t current_event = gATLFast->Event();
     Int_t new_event     = current_event + delta;
     gATLFast->GetEvent(new_event); 
   }
  m_Pad->cd(); 
  Draw();
}

//______________________________________________________________________________
 void ATLFDisplay::SizeFruit() const
{
   const Int_t npoints = 2;
   gSize3D.numPoints += npoints;
   gSize3D.numSegs   += (npoints-1);
   gSize3D.numPolys  += 0;
}

//______________________________________________________________________________
 void ATLFDisplay::SizeParticles() const
{
   if (m_DrawParticles)  m_Particle->SizeParticles();
}


ROOT page - Class index - Top of the page

This page has been automatically generated. If you have any comments or suggestions about the page layout send a mail to ROOT support, or contact the developers with any questions or problems regarding ROOT.