CMS 3D CMS Logo

FWRPZView.cc
Go to the documentation of this file.
1 // -*- C++ -*-
2 //
3 // Package: Core
4 // Class : FWRPZView
5 //
6 // Implementation:
7 // <Notes on implementation>
8 //
9 // Original Author: Chris Jones
10 // Created: Tue Feb 19 10:33:25 EST 2008
11 //
12 
13 // system include files
14 #include <stdexcept>
15 #include <boost/bind.hpp>
16 #include <memory>
17 
18 #include "TGLViewer.h"
19 #include "TGLScenePad.h"
20 #include "TEveManager.h"
21 #include "TEveElement.h"
22 #include "TEveScene.h"
23 #include "TEveProjections.h"
24 #include "TEveProjectionAxes.h"
25 #include "TGLabel.h"
26 #include "TEveProjectionManager.h"
27 #include "TEveCalo.h"
28 
29 // user include files
40 
41 const float FWRPZView::s_distortF = 0.001;
42 const float FWRPZView::s_distortFInv = 1000;
43 //
44 // constructors and destructor
45 //
46 FWRPZView::FWRPZView(TEveWindowSlot* iParent, FWViewType::EType id) :
47  FWEveView(iParent, id, 7),
48  m_geometryList(nullptr),
49  m_projMgr(nullptr),
50  m_axes(nullptr),
51 
52  m_calo(nullptr),
53 
54  m_showPixelBarrel(this, "Show Pixel Barrel", false ),
55  m_showPixelEndcap(this, "Show Pixel Endcap", false),
56  m_showTrackerBarrel(this, "Show Tracker Barrel", false ),
57  m_showTrackerEndcap(this, "Show Tracker Endcap", false),
58  m_showRpcEndcap(this, "Show RPC Endcap", false ),
59  m_showGEM(this, "Show GEM", false ),
60  m_showME0(this, "Show ME0", false ),
61 
62  m_shiftOrigin(this,"Shift origin to beam-spot", false),
63  m_fishEyeDistortion(this,"Distortion",0., 0., 100.),
64  m_fishEyeR(this,"FixedRadius",(double)fireworks::Context::caloR1(), 0.0, 150.0),
65 
66  m_caloDistortion(this,"Calo compression",1.0,0.01,10.),
67  m_muonDistortion(this,"Muon compression",0.2,0.01,10.),
68  m_showProjectionAxes(this,"Show projection axis", false),
69  m_projectionAxesLabelSize(this,"Projection axis label size", 0.015, 0.001, 0.2),
70  m_compressMuon(this,"Compress detectors",false),
71  m_showHF(nullptr),
72  m_showEndcaps(nullptr)
73 {
74  TEveProjection::EPType_e projType = (id == FWViewType::kRhoZ) ? TEveProjection::kPT_RhoZ : TEveProjection::kPT_RPhi;
75 
76  m_projMgr = new TEveProjectionManager(projType);
77  m_projMgr->IncDenyDestroy();
78  m_projMgr->SetImportEmpty(kTRUE);
79 
80  m_projMgr->GetProjection()->SetDistortion(m_fishEyeDistortion.value()*s_distortF);
81  m_projMgr->GetProjection()->SetFixR(m_fishEyeR.value());
82 
83 #ifdef TEVEPROJECTIONS_DISPLACE_ORIGIN_MODE
84  m_projMgr->GetProjection()->SetDisplaceOrigin( m_shiftOrigin.value());
85 #endif
86 
87  if ( id == FWViewType::kRhoPhi || id == FWViewType::kRhoPhiPF) {
88  m_projMgr->GetProjection()->AddPreScaleEntry(0, fireworks::Context::caloR1(), 1.0);
89  m_projMgr->GetProjection()->AddPreScaleEntry(0, 300, 0.2);
90  } else {
91  m_projMgr->GetProjection()->AddPreScaleEntry(0, fireworks::Context::caloR1(), 1.0);
92  m_projMgr->GetProjection()->AddPreScaleEntry(1, 310, 1.0);
93  m_projMgr->GetProjection()->AddPreScaleEntry(0, 370, 0.2);
94  m_projMgr->GetProjection()->AddPreScaleEntry(1, 580, 0.2);
95  }
96 
97 
98  // camera
99  viewerGL()->SetCurrentCamera(TGLViewer::kCameraOrthoXOY);
100  if ( TGLOrthoCamera* camera = dynamic_cast<TGLOrthoCamera*>( &(viewerGL()->CurrentCamera()) ) ) {
101  camera->SetZoomMax(1e6);
102  }
103  geoScene()->GetGLScene()->SetSelectable(kFALSE);
104 
105  m_axes = new TEveProjectionAxes(m_projMgr);
106  m_axes->SetRnrState(m_showProjectionAxes.value());
107  m_axes->SetLabelSize(m_projectionAxesLabelSize.value());
108  m_showProjectionAxes.changed_.connect(boost::bind(&FWRPZView::showProjectionAxes,this));
110  eventScene()->AddElement(m_axes);
111 
112  if ( id != FWViewType::kRhoZ ) {
113  m_showEndcaps = new FWBoolParameter(this,"Include EndCaps", true);
114  m_showEndcaps->changed_.connect( boost::bind(&FWRPZView::setEtaRng, this) );
115  m_showHF = new FWBoolParameter(this,"Include HF", true);
116  m_showHF->changed_.connect( boost::bind(&FWRPZView::setEtaRng, this) );
117  }
118 
119  m_shiftOrigin.changed_.connect(boost::bind(&FWRPZView::doShiftOriginToBeamSpot,this));
120 
121  m_fishEyeDistortion.changed_.connect(boost::bind(&FWRPZView::doFishEyeDistortion,this));
122 
123  m_fishEyeR.changed_.connect(boost::bind(&FWRPZView::doFishEyeDistortion,this));
124 
125  m_caloDistortion.changed_.connect(boost::bind(&FWRPZView::doPreScaleDistortion,this));
126  m_muonDistortion.changed_.connect(boost::bind(&FWRPZView::doPreScaleDistortion,this));
127  m_compressMuon.changed_.connect(boost::bind(&FWRPZView::doCompression,this,_1));
128 }
129 
131 {
132  m_calo->Destroy();
133  m_projMgr->DecDenyDestroy();
134 }
135 
136 //
137 // member functions
138 //
139 
140 TEveCaloViz*
142 {
143  return static_cast<TEveCaloViz*>(m_calo);
144 }
145 
146 void
148 {
150 
152  m_geometryList->IncDenyDestroy();
154  TEveElement* p = m_projMgr->ImportElements(m_geometryList);
155  geoScene()->AddElement(p);
156 
157  TEveCaloData* data = context().getCaloData();
158 
159  TEveCalo3D* calo3d = new TEveCalo3D(data);
160 
161  m_calo = static_cast<TEveCalo2D*> (m_projMgr->ImportElements(calo3d, eventScene()));
162 
163  if (typeId() == FWViewType::kRhoPhiPF)
164  m_calo->SetBarrelRadius(177);
165  else
166  m_calo->SetBarrelRadius(context().caloR1(false));
167 
168  m_calo->SetEndCapPos(context().caloZ1(false));
169  m_calo->SetAutoRange(false);
170  m_calo->SetScaleAbs(true);
171 
179 
180 }
181 
182 void
184 {
185  if (context().getBeamSpot())
186  {
187  float c[3] = {0,0,0};
189 
190  // projection center
191  TEveVector center(c[0], c[1], c[2] );
192  m_projMgr->GetProjection()->SetCenter(center);
193 
194  // camera move
195  TGLCamera& cam = viewerGL()->CurrentCamera();
196  cam.SetExternalCenter(true);
197  if (typeId() != FWViewType::kRhoZ)
198  {
199  double r = center.Mag();
200  cam.SetCenterVec(center.fZ, TMath::Sign(r, center.fY), 0);
201  }
202  else
203  {
204  cam.SetCenterVec(c[0], c[1], c[2] );
205  }
206  }
207 }
208 
209 void
211 {
212  float c[3]; context().commonPrefs()->getEventCenter(c);
213  m_projMgr->SetCenter(c[0], c[1], c[2]);
215 }
216 
217 
218 void
220 {
221  float c[3]; context().commonPrefs()->getEventCenter(c);
222  m_projMgr->SetCenter(c[0], c[1], c[2]);
224 }
225 
226 
227 void
229 {
230 #ifdef TEVEPROJECTIONS_DISPLACE_ORIGIN_MODE
231 
232  TEveProjection* p = m_projMgr->GetProjection();
233  if (p->GetDisplaceOrigin() != m_shiftOrigin.value())
234  {
235  p->SetDisplaceOrigin( m_shiftOrigin.value());
236  m_projMgr->ProjectChildren();
237  gEve->Redraw3D();
238  }
239 #endif
240 }
241 
242 void
243 FWRPZView::shiftOrigin(TEveVector& center)
244 {
245 #ifdef TEVEPROJECTIONS_DISPLACE_ORIGIN_MODE
246  // re-project with new center
247  m_projMgr->GetProjection()->SetCenter(center);
248  m_projMgr->ProjectChildren();
249 
250  // draw projected center
251  float* pc = m_projMgr->GetProjection()->GetProjectedCenter();
252  viewerGL()->CurrentCamera().SetExternalCenter(true);
253  viewerGL()->CurrentCamera().SetCenterVec(pc[0], pc[1], pc[2]);
254  viewerGL()->SetDrawCameraCenter(true);
255 
256  gEve->Redraw3D();
257 #endif
258 }
259 
260 void
262 {
263  // set center back to beam spot
264 
265 #ifdef TEVEPROJECTIONS_DISPLACE_ORIGIN_MODE
266  FWBeamSpot& b = *(context().getBeamSpot());
267  TEveVector center(b.x0(), b.y0(), b.z0());
268  m_projMgr->GetProjection()->SetCenter(center);
269 
270  m_projMgr->ProjectChildren();
271  gEve->Redraw3D();
272 #endif
273 }
274 
275 
276 void
278 {
279  TEveProjection* p = m_projMgr->GetProjection();
280  if (p->GetDistortion() != m_fishEyeDistortion.value()*s_distortFInv)
281  p->SetDistortion(m_fishEyeDistortion.value()*s_distortF);
282  if (p->GetFixR() != m_fishEyeR.value())
283  p->SetFixR(m_fishEyeR.value());
284 
285  m_projMgr->ProjectChildren();
286  gEve->Redraw3D();
287 }
288 
289 void
291 {
293  m_projMgr->GetProjection()->ChangePreScaleEntry(0,1,m_caloDistortion.value());
294  m_projMgr->GetProjection()->ChangePreScaleEntry(0,2,m_muonDistortion.value());
295  } else {
296  m_projMgr->GetProjection()->ChangePreScaleEntry(0,1,m_caloDistortion.value());
297  m_projMgr->GetProjection()->ChangePreScaleEntry(0,2,m_muonDistortion.value());
298  m_projMgr->GetProjection()->ChangePreScaleEntry(1,1,m_caloDistortion.value());
299  m_projMgr->GetProjection()->ChangePreScaleEntry(1,2,m_muonDistortion.value());
300  }
301  m_projMgr->UpdateName();
302  m_projMgr->ProjectChildren();
303  gEve->Redraw3D();
304 }
305 
306 void
308 {
309  m_projMgr->GetProjection()->SetUsePreScale(flag);
310  m_projMgr->UpdateName();
311  m_projMgr->ProjectChildren();
312  gEve->Redraw3D();
313 }
314 
315 void
316 FWRPZView::importElements(TEveElement* iChildren, float iLayer, TEveElement* iProjectedParent)
317 {
318  float oldLayer = m_projMgr->GetCurrentDepth();
319  m_projMgr->SetCurrentDepth(iLayer);
320  //make sure current depth is reset even if an exception is thrown
321  std::shared_ptr<TEveProjectionManager> sentry(m_projMgr,
322  boost::bind(&TEveProjectionManager::SetCurrentDepth,
323  _1,oldLayer));
324  m_projMgr->ImportElements(iChildren,iProjectedParent);
325 }
326 
327 
328 void
330 {
331  FWEveView::addTo(iTo);
332  TGLOrthoCamera* camera = dynamic_cast<TGLOrthoCamera*>( &(viewerGL()->CurrentCamera()) );
333  if (camera) addToOrthoCamera(camera, iTo);
334 }
335 
336 void
338 {
339  FWEveView::setFrom(iFrom);
340 
341  TGLOrthoCamera* camera = dynamic_cast<TGLOrthoCamera*>( &(viewerGL()->CurrentCamera()) );
342  if (camera) setFromOrthoCamera(camera, iFrom);
343 
344  if (iFrom.version() < 7)
345  {
346  const FWConfiguration* value = iFrom.valueForKey("Show projection axes");
347  if (value)
348  m_showProjectionAxes.set(value->value() == "1");
349  }
350 }
351 
352 void
354 {
355  if (typeId() != FWViewType::kRhoZ)
356  {
357  // rng controllers only in RhoPhi
358  double eta_range = context().caloMaxEta();
359  if (!m_showHF->value() ) eta_range = 3.0;
360  if (!m_showEndcaps->value() ) eta_range = context().caloTransEta();
361  m_calo->SetEta(-eta_range,eta_range);
362  }
363 
365 }
366 
367 void
369 {
370  if (! m_calo->GetData()->Empty())
371  {
372  m_calo->AssertCellIdCache();
373  Float_t sumEt, sumE;
374  TEveCaloData::CellData_t cellData;
375  typedef std::vector<TEveCaloData::vCellId_t*> vBinCells_t;
376  typedef std::vector<TEveCaloData::vCellId_t*>::iterator vBinCells_i;
377 
378  vBinCells_t cellLists = m_calo->GetBinLists();
379  for (vBinCells_i it = cellLists.begin(); it != cellLists.end(); it++)
380  {
381  TEveCaloData::vCellId_t* binCells = *it;
382  if (binCells) {
383  sumEt = 0; sumE = 0;
384  TEveCaloData::vCellId_i a = binCells->end();
385 
386  for (TEveCaloData::vCellId_i k = binCells->begin(); k != a; ++k)
387  {
388  m_calo->GetData()->GetCellData((*k), cellData);
389  sumEt += cellData.Value(true);
390  sumE += cellData.Value(false);
391  }
392  // printf("vote sum %f %f \n", sumEt , sumE);
393  context().voteMaxEtAndEnergy(sumEt, sumE);
394  }
395  }
396  }
397 }
398 
400 {
401  m_axes->SetRnrState(m_showProjectionAxes.value());
402  gEve->Redraw3D();
403  viewerGL()->RequestDraw();
404 }
405 
407 {
408  m_axes->SetLabelSize(m_projectionAxesLabelSize.value());
409  viewerGL()->RequestDraw();
410 }
411 
412 void
414 {
416 
417  ViewerParameterGUI& det = gui.requestTab("Detector");;
419 
420  if (typeId() == FWViewType::kRhoZ)
421  {
425  bool showGEM = m_context->getGeom()->versionInfo().haveExtraDet("GEM");
426  if (showGEM) det.addParam(&m_showGEM);
427  bool showME0 = m_context->getGeom()->versionInfo().haveExtraDet("ME0");
428  if (showME0) det.addParam(&m_showME0);
429  }
430 
431 #ifdef TEVEPROJECTIONS_DISPLACE_ORIGIN_MODE
432  gui.requestTab("Projection").addParam(&m_shiftOrigin);
433 #endif
434 
435  gui.requestTab("Projection").
436  addParam(&m_showProjectionAxes).
437  addParam(&m_projectionAxesLabelSize).
438  separator();
439 
440  TGCompositeFrame* f = gui.getTabContainer();
441 
442  f->AddFrame(new TGLabel(f, "FishEye:"));
444  addParam(&m_fishEyeR).
445  separator();
446 
447  f->AddFrame(new TGLabel(f, "PreScales:"));
448 
449  gui.requestTab("Projection").
450  addParam(&m_compressMuon).
451  addParam(&m_muonDistortion).
452  addParam(&m_caloDistortion);
453 
454 
456  {
457  gui.requestTab("Calo").
458  addParam(m_showHF).
459  addParam(m_showEndcaps);
460  }
461 }
462 
static float caloTransEta()
Definition: Context.cc:228
void doShiftOriginToBeamSpot()
Definition: FWRPZView.cc:228
void addToOrthoCamera(TGLOrthoCamera *, FWConfiguration &) const
Definition: FWEveView.cc:424
void doFishEyeDistortion()
Definition: FWRPZView.cc:277
string separator
Definition: mps_merge.py:79
FWBoolParameter m_shiftOrigin
Definition: FWRPZView.h:101
TEveScene * eventScene()
Definition: FWEveView.h:82
void setupEventCenter() override
Definition: FWRPZView.cc:219
FWBoolParameter m_showProjectionAxes
Definition: FWRPZView.h:107
double x0() const
Definition: FWBeamSpot.cc:30
FWRPZView(TEveWindowSlot *iParent, FWViewType::EType)
Definition: FWRPZView.cc:46
T Sign(T A, T B)
Definition: MathUtil.h:54
TEveCalo2D * m_calo
Definition: FWRPZView.h:88
double z0() const
Definition: FWBeamSpot.cc:40
double y0() const
Definition: FWBeamSpot.cc:35
FWBoolParameter m_showME0
Definition: FWRPZView.h:99
FWDoubleParameter m_projectionAxesLabelSize
Definition: FWRPZView.h:108
const FWGeometry * getGeom() const
Definition: Context.h:83
void voteMaxEtAndEnergy(float Et, float energy) const
Definition: Context.cc:183
ViewerParameterGUI & requestTab(const char *)
#define nullptr
void getEventCenter(float *inC) const
void voteCaloMaxVal() override
Definition: FWRPZView.cc:368
void eventEnd() override
Definition: FWRPZView.cc:210
unsigned int version() const
void setFrom(const FWConfiguration &) override
Definition: FWRPZView.cc:337
virtual void setupEventCenter()
Definition: FWEveView.cc:341
void setContext(const fireworks::Context &) override
Definition: FWRPZView.cc:147
virtual void setupEnergyScale()
Definition: FWEveView.cc:303
TEveProjectionAxes * m_axes
Definition: FWRPZView.h:87
TGLViewer * viewerGL() const
Definition: FWEveView.cc:190
sigc::signal< void, T > changed_
FWParameters::Bool FWBoolParameter
Definition: FWParameters.h:38
const fireworks::Context * m_context
Definition: FWEveView.h:112
const VersionInfo & versionInfo() const
Definition: FWGeometry.h:127
FWBoolParameter * m_showHF
Definition: FWRPZView.h:111
virtual void eventEnd()
Definition: FWEveView.cc:251
TEveProjectionManager * m_projMgr
Definition: FWRPZView.h:86
FWDoubleParameter m_fishEyeR
Definition: FWRPZView.h:103
void resetOrigin()
Definition: FWRPZView.cc:261
FWBoolParameter m_showRpcEndcap
Definition: FWRPZView.h:97
float caloR1()
Definition: FWPFGeom.h:21
void initStdGeoElements(const FWViewType::EType id)
bool haveExtraDet(const char *) const
Definition: FWGeometry.cc:529
void doCompression(bool)
Definition: FWRPZView.cc:307
FWBeamSpot * getBeamSpot() const
Definition: Context.h:78
void setEtaRng()
Definition: FWRPZView.cc:353
FWBoolParameter m_showTrackerBarrel
Definition: FWRPZView.h:95
void showProjectionAxes()
Definition: FWRPZView.cc:399
static float caloR1(bool offset=true)
Definition: Context.cc:208
double f[11][100]
TEveCaloDataHist * getCaloData() const
Definition: Context.h:80
~FWRPZView() override
Definition: FWRPZView.cc:130
Definition: value.py:1
void eventBegin() override
Definition: FWRPZView.cc:183
FWBoolParameter m_compressMuon
Definition: FWRPZView.h:109
FWRPZViewGeometry * m_geometryList
Definition: FWRPZView.h:85
int k[5][pyjets_maxn]
void shiftOrigin(TEveVector &center)
Definition: FWRPZView.cc:243
const std::string & value(unsigned int iIndex=0) const
const fireworks::Context & context()
Definition: FWEveView.h:67
void setFrom(const FWConfiguration &) override
Definition: FWEveView.cc:369
TEveCaloViz * getEveCalo() const override
Definition: FWRPZView.cc:141
void doPreScaleDistortion()
Definition: FWRPZView.cc:290
FWBoolParameter * m_showEndcaps
Definition: FWRPZView.h:112
FWBoolParameter m_showGEM
Definition: FWRPZView.h:98
float caloZ1()
Definition: FWPFGeom.h:22
static const float s_distortFInv
Definition: FWRPZView.h:83
double b
Definition: hdecay.h:120
void showTrackerBarrel(bool)
FWDoubleParameter m_fishEyeDistortion
Definition: FWRPZView.h:102
TEveScene * geoScene()
Definition: FWEveView.h:83
void importElements(TEveElement *iProjectableChild, float layer, TEveElement *iProjectedParent=nullptr)
Definition: FWRPZView.cc:316
ViewerParameterGUI & addParam(const FWParameterBase *)
CmsShowCommon * commonPrefs() const
Definition: Context.cc:177
FWBoolParameter m_showTrackerEndcap
Definition: FWRPZView.h:96
TGCompositeFrame * getTabContainer()
void addTo(FWConfiguration &) const override
Definition: FWEveView.cc:351
char data[epos_bytes_allocation]
Definition: EPOS_Wrapper.h:82
static double caloMaxEta()
Definition: Context.cc:238
double a
Definition: hdecay.h:121
FWDoubleParameter m_muonDistortion
Definition: FWRPZView.h:106
void addTo(FWConfiguration &) const override
Definition: FWRPZView.cc:329
FWBoolParameter m_showPixelEndcap
Definition: FWRPZView.h:94
FWDoubleParameter m_caloDistortion
Definition: FWRPZView.h:105
void showTrackerEndcap(bool)
const FWConfiguration * valueForKey(const std::string &iKey) const
FWBoolParameter m_showPixelBarrel
Definition: FWRPZView.h:93
void setFromOrthoCamera(TGLOrthoCamera *, const FWConfiguration &)
Definition: FWEveView.cc:442
void populateController(ViewerParameterGUI &) const override
Definition: FWRPZView.cc:413
static const float s_distortF
Definition: FWRPZView.h:82
void projectionAxesLabelSize()
Definition: FWRPZView.cc:406
virtual void setContext(const fireworks::Context &x)
Definition: FWEveView.cc:271
void populateController(ViewerParameterGUI &) const override
Definition: FWEveView.cc:556
FWViewType::EType typeId() const
Definition: FWViewBase.h:43