CMS 3D CMS Logo

FWElectronDetailView.cc
Go to the documentation of this file.
1 // -*- C++ -*-
2 //
3 // Package: Electrons
4 // Class : FWElectronDetailView
5 //
6 
7 // ROOT includes
8 #include "TLatex.h"
9 #include "TEveCalo.h"
10 #include "TEveStraightLineSet.h"
11 #include "TEvePointSet.h"
12 #include "TEveScene.h"
13 #include "TEveViewer.h"
14 #include "TGLViewer.h"
15 #include "TGLOverlay.h"
16 #include "TCanvas.h"
17 #include "TLegend.h"
18 #include "TEveCaloLegoOverlay.h"
19 #include "TRootEmbeddedCanvas.h"
20 
21 // Fireworks includes
28 
29 // CMSSW includes
30 
33 
34 
35 //
36 // constructors and destructor
37 //
39  m_data(nullptr),
40  m_builder(nullptr),
41  m_legend(nullptr)
42 {
43 }
44 
46 {
47  m_eveViewer->GetGLViewer()->DeleteOverlayElements(TGLOverlayElement::kUser);
48 
49  delete m_builder;
50  if (m_data) m_data->DecDenyDestroy();
51 }
52 
53 //
54 // member functions
55 //
56 void
58 {
59  if( !iElectron ) return;
60  // If SuperCluster reference is not stored,
61  // take eta and phi of a Candidate
62  double eta = 0;
63  double phi = 0;
64  if( iElectron->superCluster().isAvailable() ) {
65  eta = iElectron->caloPosition().eta();
66  phi = iElectron->caloPosition().phi();
67  }
68  else
69  {
70  eta = iElectron->eta();
71  phi = iElectron->phi();
72  }
73 
74  // build ECAL objects
75  m_builder = new FWECALDetailViewBuilder( id.item()->getEvent(), id.item()->getGeom(),
76  eta, phi, 25);
77 
79  if( iElectron->superCluster().isAvailable() )
80  m_builder->showSuperCluster( *(iElectron->superCluster() ), kYellow + 1);
81 
82  TEveCaloLego* lego = m_builder->build();
83  m_data = lego->GetData();
84  m_eveScene->AddElement( lego );
85 
86  m_legend = new TLegend(0.01, 0.01, 0.99, 0.99, nullptr, "NDC");
87  m_legend->SetTextSize(0.075);
88  m_legend->SetBorderSize(0);
89  m_legend->SetMargin(0.15);
90  m_legend->SetEntrySeparation(0.05);
91 
92  // add Electron specific details
93  if( false && iElectron->superCluster().isAvailable() ) {
94  addTrackPointsInCaloData( iElectron, lego );
95  drawCrossHair( iElectron, lego, m_eveScene );
96  addSceneInfo( iElectron, m_eveScene );
97  }
98 
99  // draw axis at the window corners
100  if (true)
101  {
102  TEveCaloLegoOverlay* overlay = new TEveCaloLegoOverlay();
103  overlay->SetShowPlane( kFALSE );
104  overlay->SetShowPerspective( kFALSE );
105  overlay->SetCaloLego( lego );
106  overlay->SetShowScales( true ); // temporary
107  viewerGL()->AddOverlayElement( overlay );
108  }
109  // set event handler and flip camera to top view at beginning
110  viewerGL()->SetCurrentCamera( TGLViewer::kCameraOrthoXOY );
111  FWGLEventHandler* eh =
112  new FWGLEventHandler( (TGWindow*)viewerGL()->GetGLWidget(), (TObject*)viewerGL(), lego );
113  viewerGL()->SetEventHandler( eh );
114  viewerGL()->ResetCamerasAfterNextUpdate();
115  viewerGL()->UpdateScene(kFALSE);
116  gEve->Redraw3D();
117 
118  setTextInfo( id, iElectron );
119 }
120 
121 double
123 {
124  return electron.deltaEtaSuperClusterTrackAtVtx();
125 }
126 
127 double
129 {
130  return electron.deltaPhiSuperClusterTrackAtVtx();
131 }
132 
133 void
135 {
136  m_infoCanvas->cd();
137 
138  float_t x = 0.02;
139  float_t x2 = 0.52;
140  float y = 0.95;
141 
142  TLatex* latex = new TLatex( x, y, "" );
143  const double textsize( 0.05 );
144  latex->SetTextSize( 2*textsize );
145 
146  latex->DrawLatex( x, y, id.item()->modelName( id.index() ).c_str() );
147  y -= latex->GetTextSize()*0.6;
148 
149  latex->SetTextSize( textsize );
150  float lineH = latex->GetTextSize()*0.6;
151 
152  latex->DrawLatex( x, y, Form( " E_{T} = %.1f GeV, #eta = %0.2f, #varphi = %0.2f",
153  electron->et(), electron->eta(), electron->phi()) );
154  y -= lineH;
155  // summary
156  if( electron->charge() > 0 )
157  latex->DrawLatex( x, y, " charge = +1" );
158  else
159  latex->DrawLatex( x, y, " charge = -1" );
160  y -= lineH;
161 
162  if( electron->superCluster().isAvailable() ) {
163  // delta phi/eta in
164  latex->DrawLatex( x, y, "SuperCluster vs inner state extrapolation" );
165  y -= lineH;
166  latex->DrawLatex( x, y, TString::Format(" #Delta#eta_{in} = %.3f", electron->deltaEtaSuperClusterTrackAtVtx()) );
167  latex->DrawLatex( x2, y, TString::Format("#Delta#varphi_{in} = %.3f", electron->deltaPhiSuperClusterTrackAtVtx()) );
168  y -= lineH;
169 
170  // delta phi/eta out
171  latex->DrawLatex( x, y, "SeedCluster vs outer state extrapolation" );
172  y -= lineH;
173 
174  latex->DrawLatex( x, y, TString::Format(" #Delta#eta_{out} = %.3f", electron->deltaEtaSeedClusterTrackAtCalo()) );
175  latex->DrawLatex( x2, y, TString::Format(" #Delta#varphi_{out} = %.3f", electron->deltaPhiSeedClusterTrackAtCalo()) );
176  y -= 2*lineH;
177  } else {
178  latex->DrawLatex( x, y, "Ref to SuperCluster is not available" );
179  }
180 
181  latex->DrawLatex(x, y, TString::Format(" Tracker driven seed: %s", electron->trackerDrivenSeed() ? "YES" : "NO"));
182  y -= lineH;
183  latex->DrawLatex(x, y, TString::Format(" ECAL driven seed: %s", electron->ecalDrivenSeed() ? "YES" : "NO"));
184  y -= lineH;
185 
186  y = m_builder->makeLegend( 0.02, y );
187  y -= lineH;
188 
189  m_legend->SetY2(y);
190  m_legend->Draw();
191  m_legend = nullptr; // Deleted together with TPad.
192 }
193 
194 void
195 FWElectronDetailView::drawCrossHair (const reco::GsfElectron* i, TEveCaloLego *lego, TEveElementList* tList)
196 {
197  double ymax = lego->GetPhiMax();
198  double ymin = lego->GetPhiMin();
199  double xmax = lego->GetEtaMax();
200  double xmin = lego->GetEtaMin();
201 
202  // draw crosshairs for track intersections
203 
204  {
205  const double eta = i->superCluster()->seed()->position().eta() -
207  const double phi = i->superCluster()->seed()->position().phi() -
209 
210  TEveStraightLineSet *trackpositionAtCalo = new TEveStraightLineSet("sc trackpositionAtCalo");
211  trackpositionAtCalo->SetPickable(kTRUE);
212  trackpositionAtCalo->SetTitle("Track position at Calo propagating from the outermost state");
213 
214  trackpositionAtCalo->AddLine(eta, ymin, 0, eta, ymax, 0);
215  trackpositionAtCalo->AddLine(xmin, phi, 0, xmax, phi, 0);
216 
217  trackpositionAtCalo->SetDepthTest(kFALSE);
218  trackpositionAtCalo->SetLineColor(kBlue);
219  tList->AddElement(trackpositionAtCalo);
220 
221  m_legend->AddEntry(trackpositionAtCalo, "From outermost state", "l");
222  }
223  //
224  // pin position
225  //
226  {
227  TEveStraightLineSet *pinposition = new TEveStraightLineSet("pin position");
228  pinposition->SetPickable(kTRUE);
229  pinposition->SetTitle("Track position at Calo propagating from the innermost state");
230  Double_t eta = i->caloPosition().eta() - deltaEtaSuperClusterTrackAtVtx(*i);
231  Double_t phi = i->caloPosition().phi() - deltaPhiSuperClusterTrackAtVtx(*i);
232 
233 
234  pinposition->AddLine(eta, ymax, 0, eta, ymin, 0);
235  pinposition->AddLine(xmin, phi, 0, xmax, phi, 0);
236 
237  pinposition->SetDepthTest(kFALSE);
238  pinposition->SetLineColor(kRed);
239  tList->AddElement(pinposition);
240 
241  m_legend->AddEntry(pinposition, "From innermost state", "l");
242  }
243 }
244 
245 Bool_t
246 FWElectronDetailView::checkRange( Double_t &em, Double_t& eM, Double_t &pm, Double_t& pM,
247  Double_t eta, Double_t phi )
248 {
249  Bool_t changed = kFALSE;
250 
251  //check eta
252  if (eta < em)
253  {
254  em = eta;
255  changed = kTRUE;
256  }
257  else if (eta > eM)
258  {
259  eM = eta;
260  changed = kTRUE;
261  }
262 
263  // check phi
264  if (phi < pm)
265  {
266  pm = phi;
267  changed = kTRUE;
268  }
269  else if (phi > pM)
270  {
271  pM = phi;
272  changed = kTRUE;
273  }
274  return changed;
275 }
276 
277 void
279 {
280  return;
281  TEveCaloDataVec* data = (TEveCaloDataVec*)lego->GetData();
282  Double_t em, eM, pm, pM;
283  data->GetEtaLimits(em, eM);
284  data->GetPhiLimits(pm, pM);
285  data->IncDenyDestroy();
286  Bool_t changed = kFALSE;
287  // add cells in third layer if necessary
288 
289  // trackpositionAtCalo
290  {
291  double eta = i->superCluster()->seed()->position().eta() -
293  double phi = i->superCluster()->seed()->position().phi() -
295 
296 
297  if (checkRange(em, eM, pm, pM, eta, phi))
298  changed = kTRUE;
299  }
300  // pinposition
301  {
302  double eta = i->caloPosition().eta() - deltaEtaSuperClusterTrackAtVtx(*i);
303  double phi = i->caloPosition().phi() - deltaPhiSuperClusterTrackAtVtx(*i);
304 
305  if (checkRange(em, eM, pm, pM, eta, phi))
306  changed = kTRUE;
307  }
308  if (changed)
309  {
310  data->AddTower(em, eM, pm, pM);
311  data->FillSlice(2, 0); data->DataChanged();
312 
313  lego->ComputeBBox();
314  Double_t legoScale = ((eM - em) < (pM - pm)) ? (eM - em) : (pM - pm);
315  lego->InitMainTrans();
316  lego->RefMainTrans().SetScale(legoScale, legoScale, legoScale*0.5);
317  lego->RefMainTrans().SetPos((eM+em)*0.5, (pM+pm)*0.5, 0);
318  lego->ElementChanged(true);
319  }
320 }
321 
322 void
324 {
325  // centroids
326  Double_t x(0), y(0), z(0);
327  Double_t delta(0.02);
328 
329  TEveStraightLineSet *scposition = new TEveStraightLineSet("sc position");
330  scposition->SetPickable(kTRUE);
331  scposition->SetTitle("Super cluster centroid");
332 
333  x = i->caloPosition().eta();
334  y = i->caloPosition().phi();
335 
336  scposition->AddLine(x-delta,y,z,x+delta,y,z);
337  scposition->AddLine(x,y-delta,z,x,y+delta,z);
338  scposition->AddLine(x,y,z-delta,x,y,z+delta);
339  scposition->SetLineColor(kBlue);
340  scposition->SetLineWidth(2);
341  scposition->SetDepthTest(kFALSE);
342  tList->AddElement(scposition);
343 
344  scposition->SetMarkerColor(kBlue);
345  scposition->SetMarkerStyle(2);
346  m_legend->AddEntry(scposition, "Super cluster centroid", "p");
347 
348  // seed position
349  TEveStraightLineSet *seedposition = new TEveStraightLineSet("seed position");
350  seedposition->SetTitle("Seed cluster centroid");
351  seedposition->SetPickable(kTRUE);
352 
353  x = i->superCluster()->seed()->position().eta();
354  y = i->superCluster()->seed()->position().phi();
355 
356  seedposition->AddLine(x-delta,y-delta,z,x+delta,y+delta,z);
357  seedposition->AddLine(x-delta,y+delta,z,x+delta,y-delta,z);
358  seedposition->SetLineColor(kRed);
359  seedposition->SetLineWidth(2);
360  seedposition->SetDepthTest(kFALSE);
361  tList->AddElement(seedposition);
362 
363  seedposition->SetMarkerColor(kRed);
364  seedposition->SetMarkerStyle(5);
365  m_legend->AddEntry(seedposition, "Seed cluster centroid", "p");
366 
367  // electron direction (show it if it's within
368  // the area of interest)
369  if ( fabs(i->phi()-i->caloPosition().phi())< 25*0.0172 &&
370  fabs(i->eta()-i->caloPosition().eta())< 25*0.0172 )
371  {
372  TEveStraightLineSet *eldirection = new TEveStraightLineSet("seed position");
373  eldirection->SetTitle("Electron direction at vertex");
374  eldirection->SetPickable(kTRUE);
375 
376  x = i->eta();
377  y = i->phi();
378  eldirection->AddLine(x-delta,y-delta,z,x+delta,y+delta,z);
379  eldirection->AddLine(x-delta,y+delta,z,x+delta,y-delta,z);
380  eldirection->SetLineColor(kGreen + 1);
381  eldirection->SetDepthTest(kFALSE);
382  tList->AddElement(eldirection);
383 
384  eldirection->SetMarkerColor(kGreen);
385  eldirection->SetMarkerStyle(5);
386  m_legend->AddEntry(eldirection, "Direction at vertex", "p");
387  }
388 }
389 
dbl * delta
Definition: mlp_gen.cc:36
bool isAvailable() const
Definition: Ref.h:577
void showSuperCluster(const reco::SuperCluster &cluster, Color_t color=kYellow)
void setTextInfo(const FWModelId &id, const reco::GsfElectron *) override
double eta() const final
momentum pseudorapidity
double makeLegend(double x0=0.02, double y0=0.95, Color_t clustered1=kGreen+1, Color_t clustered2=kTeal, Color_t supercluster=kYellow)
const FWEventItem * item()
Bool_t checkRange(Double_t &, Double_t &, Double_t &, Double_t &, Double_t, Double_t)
void build(const FWModelId &id, const reco::GsfElectron *) override
int charge() const final
electric charge
Definition: LeafCandidate.h:91
#define nullptr
FWECALDetailViewBuilder * m_builder
def overlay(hists, ytitle, header, addon)
Definition: compare.py:121
float deltaEtaSuperClusterTrackAtVtx() const
Definition: GsfElectron.h:249
double et() const final
transverse energy
float deltaPhiSeedClusterTrackAtCalo() const
Definition: GsfElectron.h:253
float deltaPhiSuperClusterTrackAtVtx() const
Definition: GsfElectron.h:252
void showSuperClusters(Color_t color1=kGreen+2, Color_t color2=kTeal)
math::XYZPoint caloPosition() const
Definition: GsfElectron.h:325
void drawCrossHair(const reco::GsfElectron *, TEveCaloLego *, TEveElementList *)
#define REGISTER_FWDETAILVIEW(_classname_, _name_,...)
double deltaEtaSuperClusterTrackAtVtx(const reco::GsfElectron &)
float deltaEtaSeedClusterTrackAtCalo() const
Definition: GsfElectron.h:250
void addSceneInfo(const reco::GsfElectron *i, TEveElementList *tList)
char data[epos_bytes_allocation]
Definition: EPOS_Wrapper.h:82
double deltaPhiSuperClusterTrackAtVtx(const reco::GsfElectron &)
SuperClusterRef superCluster() const override
reference to a SuperCluster
Definition: GsfElectron.h:184
bool trackerDrivenSeed() const
Definition: GsfElectron.h:189
void addTrackPointsInCaloData(const reco::GsfElectron *, TEveCaloLego *)
double phi() const final
momentum azimuthal angle
bool ecalDrivenSeed() const
Definition: GsfElectron.h:188