CMS 3D CMS Logo

FWJetProxyBuilder.cc
Go to the documentation of this file.
1 // -*- C++ -*-
2 //
3 // Package: Calo
4 // Class : FWJetProxyBuilder
5 //
6 // Implementation:
7 // <Notes on implementation>
8 //
9 // Original Author: Chris Jones
10 // Created: Tue Dec 2 14:17:03 EST 2008
11 //
12 
13 #include "TEveJetCone.h"
14 #include "TEveScalableStraightLineSet.h"
15 
21 // user include files
29 
31 
32 
33 namespace fireworks {
34 
35 struct jetScaleMarker : public scaleMarker {
36  jetScaleMarker(TEveScalableStraightLineSet* ls, float et, float e, const FWViewContext* vc):
37  scaleMarker(ls, et, e, vc) , m_text(nullptr) {}
38 
40 };
41 }
42 
43 static const std::string kJetLabelsRhoPhiOn("Draw Labels in RhoPhi View");
44 static const std::string kJetLabelsRhoZOn("Draw Labels in RhoZ View");
45 static const std::string kJetOffset("Label Offset");
46 static const std::string kJetApexBeamSpot("Place Apex In BeamSpot");
47 
48 
50 {
51 public:
53  ~FWJetProxyBuilder() override;
54 
55  bool havePerViewProduct(FWViewType::EType) const override { return true; }
56  bool haveSingleProduct() const override { return false; } // different view types
57  void cleanLocal() override;
58 
59  void setItem(const FWEventItem* iItem) override
60  {
62  if (iItem) {
63  iItem->getConfig()->assertParam(kJetLabelsRhoPhiOn, false);
64  iItem->getConfig()->assertParam(kJetLabelsRhoZOn, false);
65  iItem->getConfig()->assertParam(kJetOffset, 2.1, 1.0, 5.0);
66  }
67  }
68 
70 
71 protected:
73  void buildViewType(const reco::Jet& iData, unsigned int iIndex, TEveElement& oItemHolder, FWViewType::EType type , const FWViewContext*) override;
74 
75 
76  void localModelChanges(const FWModelId& iId, TEveElement* iCompound,
77  FWViewType::EType viewType, const FWViewContext* vc) override;
78 
79  void scaleProduct(TEveElementList* parent, FWViewType::EType, const FWViewContext* vc) override;
80 
81 private:
82  typedef std::vector<fireworks::jetScaleMarker> Lines_t;
83 
84  FWJetProxyBuilder( const FWJetProxyBuilder& ) = delete; // stop default
85  const FWJetProxyBuilder& operator=( const FWJetProxyBuilder& ) = delete; // stop default
86 
87  TEveElementList* requestCommon();
88  void setTextPos(fireworks::jetScaleMarker& s, const FWViewContext* vc, FWViewType::EType);
89 
90  TEveElementList* m_common;
91 
92  std::vector<fireworks::jetScaleMarker> m_lines;
93 };
94 
95 
96 //______________________________________________________________________________
98  m_common(nullptr)
99 {
100  m_common = new TEveElementList( "common electron scene" );
101  m_common->IncDenyDestroy();
102 }
103 
105 {
106  m_common->DecDenyDestroy();
107 }
108 
109 TEveElementList*
111 {
112  if( m_common->HasChildren() == false )
113  {
114  for (int i = 0; i < static_cast<int>(item()->size()); ++i)
115  {
116  TEveJetCone* cone = fireworks::makeEveJetCone(modelData(i), context());
117 
118  cone->SetFillColor(item()->defaultDisplayProperties().color());
119  cone->SetLineColor(item()->defaultDisplayProperties().color());
120 
121  m_common->AddElement(cone);
122  }
123  }
124  return m_common;
125 }
126 
127 void
128 FWJetProxyBuilder::buildViewType(const reco::Jet& iData, unsigned int iIndex, TEveElement& oItemHolder, FWViewType::EType type , const FWViewContext* vc)
129 {
130  // add cone from shared pool
131  TEveElementList* cones = requestCommon();
132  TEveElement::List_i coneIt = cones->BeginChildren();
133  std::advance(coneIt, iIndex);
134 
136  setupAddElement( *coneIt, &oItemHolder );
137  (*coneIt)->SetMainTransparency(TMath::Min(100, 80 + dp.transparency() / 5));
138 
139  TEveVector p1;
140  TEveVector p2;
141 
142  // scale markers in projected views
143  if (FWViewType::isProjected(type))
144  {
145  m_lines.push_back(fireworks::jetScaleMarker(new TEveScalableStraightLineSet("jetline"), iData.et(), iData.energy(), vc));
146  fireworks::jetScaleMarker& markers = m_lines.back();
147 
148  float size = 1.f; // values are saved in scale
149  double theta = iData.theta();
150  double phi = iData.phi();
151 
152  if ( type == FWViewType::kRhoZ )
153  {
154  static const float_t offr = 4;
155  float r_ecal = context().caloR1() + offr;
156  float z_ecal = context().caloZ1() + offr/tan(context().caloTransAngle());
157  double r(0);
158  if ( theta < context().caloTransAngle() || M_PI-theta < context().caloTransAngle())
159  {
160  z_ecal = context().caloZ2() + offr/tan(context().caloTransAngle());
161  r = z_ecal/fabs(cos(theta));
162  }
163  else
164  {
165  r = r_ecal/sin(theta);
166  }
167 
168  p1.Set( 0., (phi>0 ? r*fabs(sin(theta)) : -r*fabs(sin(theta))), r*cos(theta));
169  p2.Set( 0., (phi>0 ? (r+size)*fabs(sin(theta)) : -(r+size)*fabs(sin(theta))), (r+size)*cos(theta) );
170  }
171  else
172  {
173  float ecalR = context().caloR1() + 4;
174  p1.Set(ecalR*cos(phi), ecalR*sin(phi), 0);
175  p2.Set((ecalR+size)*cos(phi), (ecalR+size)*sin(phi), 0);
176  }
177 
178 
179  markers.m_ls->SetScaleCenter(p1.fX, p1.fY, p1.fZ);
180  markers.m_ls->AddLine(p1, p2);
181 
182  markers.m_ls->SetLineWidth(4);
183  markers.m_ls->SetLineColor(dp.color());
184  FWViewEnergyScale* caloScale = vc->getEnergyScale();
185  markers.m_ls->SetScale(caloScale->getScaleFactor3D()*(caloScale->getPlotEt() ? iData.et() : iData.energy()));
186 
187  if ((type == FWViewType::kRhoZ && item()->getConfig()->value<bool>(kJetLabelsRhoZOn))||
188  (type == FWViewType::kRhoPhi && item()->getConfig()->value<bool>(kJetLabelsRhoPhiOn) ) )
189  {
190  markers.m_text = new FWEveText(Form("%.1f", vc->getEnergyScale()->getPlotEt() ? iData.et() : iData.energy()));
191  markers.m_text->SetMainColor( item()->defaultDisplayProperties().color());
192  setTextPos(markers, vc, type);
193  }
194 
195  markers.m_ls->SetMarkerColor(markers.m_ls->GetMainColor());
196  setupAddElement( markers.m_ls, &oItemHolder );
197  if (markers.m_text) setupAddElement( markers.m_text, &oItemHolder , false);
198 
199  }
200  context().voteMaxEtAndEnergy(iData.et(), iData.energy());
201 
202 }
203 
204 void
205 FWJetProxyBuilder::localModelChanges(const FWModelId& iId, TEveElement* iCompound,
206  FWViewType::EType viewType, const FWViewContext* vc)
207 {
208  increaseComponentTransparency(iId.index(), iCompound, "TEveJetCone", 80);
209 
210  for (Lines_t::iterator i = m_lines.begin(); i!= m_lines.end(); ++ i)
211  {
212  TEveStraightLineSetProjected* projLineSet = (TEveStraightLineSetProjected*)(*(*i).m_ls->BeginProjecteds());
213  if (projLineSet) projLineSet->UpdateProjection();
214  }
215 }
216 
217 
218 void
220 {
221  m_lines.clear();
222  m_common->DestroyElements();
223 }
224 
225 void
227 {
228  for (Lines_t::iterator i = m_lines.begin(); i!= m_lines.end(); ++ i)
229  {
230  if (vc == (*i).m_vc)
231  {
232  float value = vc->getEnergyScale()->getPlotEt() ? (*i).m_et : (*i).m_energy;
233 
234  (*i).m_ls->SetScale(vc->getEnergyScale()->getScaleFactor3D() * value );
235  if ((*i).m_text)
236  {
237  (*i).m_text->SetText(Form("%.1f", value));
238  setTextPos(*i, vc, type);
239  }
240  TEveStraightLineSetProjected* projLineSet = (TEveStraightLineSetProjected*)(*(*i).m_ls->BeginProjecteds());
241  projLineSet->UpdateProjection();
242  }
243  }
244 
245  // move jets to eventCenter
247  TEveVector cv;
248  contextGl->commonPrefs()->getEventCenter(cv.Arr());
249  for (TEveElement::List_i i = m_common->BeginChildren(); i!= m_common->EndChildren(); ++ i)
250  {
251  TEveJetCone* cone = dynamic_cast<TEveJetCone*>(*i);
252  if (cone) {
253  cone->SetApex(cv);
254  }
255  }
256 }
257 
258 
260 {
261  TEveChunkManager::iterator li( s.m_ls->GetLinePlex() );
262  li.next();
263  TEveStraightLineSet::Line_t &l = * ( TEveStraightLineSet::Line_t* ) li();
264  TEveVector v(l.fV2[0] - l.fV1[0], l.fV2[1] - l.fV1[1], l.fV2[2] - l.fV1[2] );
265  v.Normalize();
266 
267 
268  double off = item()->getConfig()->value<double>(kJetOffset) -1;
269  float value = vc->getEnergyScale()->getPlotEt() ? s.m_et : s.m_energy;
270  double trs = off * 130 * value/context().getMaxEnergyInEvent(vc->getEnergyScale()->getPlotEt());
271  v *= trs;
272 
273  float x = l.fV1[0] + v[0];
274  float y = l.fV1[1] + v[1];
275  float z = l.fV1[2] + v[2];
276 
278  s.m_text->RefMainTrans().SetPos(x, y, z);
279  if ((s.m_text)->BeginProjecteds() != (s.m_text)->EndProjecteds()) {
280  FWEveTextProjected* textProjected = (FWEveTextProjected*)(*(s.m_text)->BeginProjecteds());
281  textProjected->UpdateProjection();
282  }
283 
284 }
285 
size
Write out results.
type
Definition: HCALResponse.h:21
bool haveSingleProduct() const override
const fireworks::Context & context() const
void scaleProduct(TEveElementList *parent, FWViewType::EType, const FWViewContext *vc) override
FWProxyBuilderConfiguration * getConfig() const
Definition: FWEventItem.h:169
float getScaleFactor3D() const
static const std::string kJetApexBeamSpot("Place Apex In BeamSpot")
const FWDisplayProperties & defaultDisplayProperties() const
Definition: FWEventItem.cc:453
#define REGISTER_PROXYBUILDER_METHODS()
#define REGISTER_FWPROXYBUILDER(_name_, _type_, _purpose_, _view_)
virtual void UpdateProjection()
float m_offsetZ
static const std::string kJetLabelsRhoPhiOn("Draw Labels in RhoPhi View")
static const int kAllRPZBits
Definition: FWViewType.h:58
Base class for all types of Jets.
Definition: Jet.h:20
void voteMaxEtAndEnergy(float Et, float energy) const
Definition: Context.cc:183
void setupAddElement(TEveElement *el, TEveElement *parent, bool set_color=true) const
jetScaleMarker(TEveScalableStraightLineSet *ls, float et, float e, const FWViewContext *vc)
Sin< T >::type sin(const T &t)
Definition: Sin.h:22
FWViewEnergyScale * getEnergyScale() const
Geom::Theta< T > theta() const
void getEventCenter(float *inC) const
static float caloZ2(bool offset=true)
Definition: Context.cc:223
cv
Definition: cuy.py:362
std::vector< fireworks::jetScaleMarker > Lines_t
static const std::string kJetOffset("Label Offset")
T Min(T a, T b)
Definition: MathUtil.h:39
#define nullptr
const FWEventItem * item() const
static const int kAll3DBits
Definition: FWViewType.h:59
Color_t color() const
virtual double phi() const final
momentum azimuthal angle
static bool isProjected(int)
Definition: FWViewType.cc:128
virtual double et() const final
transverse energy
virtual double theta() const final
momentum polar angle
Char_t transparency() const
int index() const
Definition: FWModelId.h:49
virtual void setItem(const FWEventItem *iItem)
Cos< T >::type cos(const T &t)
Definition: Cos.h:22
void setItem(const FWEventItem *iItem) override
virtual double energy() const final
energy
static float caloR1(bool offset=true)
Definition: Context.cc:208
Tan< T >::type tan(const T &t)
Definition: Tan.h:22
static const std::string kJetLabelsRhoZOn("Draw Labels in RhoZ View")
float getMaxEnergyInEvent(bool isEt) const
Definition: Context.cc:199
Definition: value.py:1
double p2[4]
Definition: TauolaWrapper.h:90
static Context * getInstance()
Definition: Context.cc:243
#define M_PI
TEveElementList * m_common
FWGenericParameter< T > * assertParam(const std::string &name, T def)
def ls(path, rec=False)
Definition: eostools.py:348
size_t size() const
Definition: FWEventItem.cc:550
auto dp
Definition: deltaR.h:22
CmsShowCommon * commonPrefs() const
Definition: Context.cc:177
et
define resolution functions of each parameter
TEveScalableStraightLineSet * m_ls
Definition: scaleMarker.h:37
void buildViewType(const reco::Jet &iData, unsigned int iIndex, TEveElement &oItemHolder, FWViewType::EType type, const FWViewContext *) override
double p1[4]
Definition: TauolaWrapper.h:89
bool havePerViewProduct(FWViewType::EType) const override
static float caloZ1(bool offset=true)
Definition: Context.cc:218
void cleanLocal() override
std::vector< fireworks::jetScaleMarker > m_lines
TEveElementList * requestCommon()
~FWJetProxyBuilder() override
void localModelChanges(const FWModelId &iId, TEveElement *iCompound, FWViewType::EType viewType, const FWViewContext *vc) override
void setTextPos(fireworks::jetScaleMarker &s, const FWViewContext *vc, FWViewType::EType)
void increaseComponentTransparency(unsigned int index, TEveElement *holder, const std::string &name, Char_t transpOffset)
TEveJetCone * makeEveJetCone(const reco::Jet &iData, const fireworks::Context &context)
bool getPlotEt() const