Line Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111

// ROOT includes
#include "TLatex.h"
#include "TEveCalo.h"
#include "TEveStraightLineSet.h"
#include "TEvePointSet.h"
#include "TEveScene.h"
#include "TEveViewer.h"
#include "TGLViewer.h"
#include "TGLOverlay.h"
#include "TCanvas.h"
#include "TLegend.h"
#include "TEveCaloLegoOverlay.h"
#include "TRootEmbeddedCanvas.h"

// Fireworks includes
#include "Fireworks/Calo/interface/FWECALDetailViewBase.h"
#include "Fireworks/Calo/interface/FWECALDetailViewBuilder.h"
#include "Fireworks/Core/interface/FWColorManager.h"
#include "Fireworks/Core/interface/FWModelId.h"
#include "Fireworks/Core/interface/FWEventItem.h"
#include "Fireworks/Core/interface/FWGLEventHandler.h"

// CMSSW includes
#include "DataFormats/Candidate/interface/Candidate.h"
#include "DataFormats/EcalDetId/interface/EcalSubdetector.h"

template <typename T>
FWECALDetailViewBase<T>::FWECALDetailViewBase() : m_data(nullptr), m_builder(nullptr), m_legend(nullptr) {}
template <typename T>
FWECALDetailViewBase<T>::~FWECALDetailViewBase() {
  FWDetailViewGL<T>::m_eveViewer->GetGLViewer()->DeleteOverlayElements(TGLOverlayElement::kUser);

  delete m_builder;
  if (m_data)
    m_data->DecDenyDestroy();
}

template <typename T>
void FWECALDetailViewBase<T>::build(const FWModelId& id, const T* element) {
  double eta = element->eta();
  double phi = element->phi();

  // build ECAL objects
  m_builder = new FWECALDetailViewBuilder(id.item()->getEvent(), id.item()->getGeom(), eta, phi, 25);

  TEveCaloLego* lego = m_builder->build();
  m_data = lego->GetData();
  m_data->IncDenyDestroy();  // needed ???
  FWDetailViewGL<T>::m_eveScene->AddElement(lego);

  m_legend = new TLegend(0.01, 0.01, 0.99, 0.99, nullptr, "NDC");
  m_legend->SetTextSize(0.075);
  m_legend->SetBorderSize(0);
  m_legend->SetMargin(0.15);
  m_legend->SetEntrySeparation(0.05);

  // draw axis at the window corners
  if (true) {
    TEveCaloLegoOverlay* overlay = new TEveCaloLegoOverlay();
    overlay->SetShowPlane(kFALSE);
    overlay->SetShowPerspective(kFALSE);
    overlay->SetCaloLego(lego);
    overlay->SetShowScales(true);  // temporary

    FWDetailViewGL<T>::viewerGL()->AddOverlayElement(overlay);
  }
  // set event handler and flip camera to top view at beginning
  FWDetailViewGL<T>::viewerGL()->SetCurrentCamera(TGLViewer::kCameraOrthoXOY);
  FWGLEventHandler* eh = new FWGLEventHandler(
      (TGWindow*)FWDetailViewGL<T>::viewerGL()->GetGLWidget(), (TObject*)FWDetailViewGL<T>::viewerGL(), lego);
  FWDetailViewGL<T>::viewerGL()->SetEventHandler(eh);
  FWDetailViewGL<T>::viewerGL()->ResetCamerasAfterNextUpdate();
  FWDetailViewGL<T>::viewerGL()->UpdateScene(kFALSE);
  gEve->Redraw3D();

  setTextInfo(id, element);
}

template <typename T>
void FWECALDetailViewBase<T>::setTextInfo(const FWModelId& id, const T* element) {
  FWDetailViewGL<T>::m_infoCanvas->cd();

  float_t x = 0.02;
  float y = 0.95;

  TLatex* latex = new TLatex(x, y, "");
  const double textsize(0.1);
  latex->SetTextSize(textsize);

  latex->DrawLatex(x, y, id.item()->modelName(id.index()).c_str());
  y -= latex->GetTextSize() * 0.8;

  latex->SetTextSize(textsize * 0.8);
  float lineH = latex->GetTextSize() * 0.6;

  latex->DrawLatex(x, y, Form("#eta = %0.2f", element->eta()));
  y -= lineH;
  latex->DrawLatex(x, y, Form("#phi = %0.2f", element->phi()));
  y -= lineH;
  // summary
  if (element->charge() > 0)
    latex->DrawLatex(x, y, "charge = +1");
  else
    latex->DrawLatex(x, y, "charge = -1");
  y -= lineH;

  m_legend->SetY2(y);
  m_legend->Draw();
  m_legend = nullptr;  // Deleted together with TPad.
}