CMS 3D CMS Logo

FWHGTowerProxyBuilder.cc
Go to the documentation of this file.
1 // -*- C++ -*-
2 //
3 // Package: Calo
4 // Class : FWHGTowerProxyBuilder
5 //
6 // Implementation:
7 // [Notes on implementation]
8 //
9 // Original Author:
10 // Created: Mon May 31 16:41:27 CEST 2010
11 //
12 
13 // system include files
14 
15 // user include files
16 #include "TEveCaloData.h"
17 #include "TEveCalo.h"
18 #include "TH2F.h"
19 
27 
29  m_hits(0),
30  // m_depth(depth),
31  m_vecData(0)
32 {}
33 
35 {}
36 
37 //
38 // member functions
39 void
41 {
42  m_vecData = ctx.getCaloDataHF();// cached to avoid casting
44 }
45 
46 bool
48 {
49  if (m_sliceIndex == -1)
50  {
51  m_sliceIndex = m_vecData->AddSlice();
52  // printf("add slice %d \n",m_sliceIndex );
53  m_caloData->RefSliceInfo(m_sliceIndex).Setup(item()->name().c_str() , 0.,
54  item()->defaultDisplayProperties().color(),
55  item()->defaultDisplayProperties().transparency());
56 
57  // add new selector
59  if (m_caloData->GetUserData())
60  {
61  FWFromEveSelectorBase* base = reinterpret_cast<FWFromEveSelectorBase*>(m_caloData->GetUserData());
62  assert(0!=base);
63  sel = dynamic_cast<FWFromTEveCaloDataSelector*> (base);
64  assert(0!=sel);
65  }
66  else
67  {
69  //make sure it is accessible via the base class
70  m_caloData->SetUserData(static_cast<FWFromEveSelectorBase*>(sel));
71  }
72 
74 
75  return true;
76  }
77  return false;
78 }
79 
80 void
82  TEveElementList* el, const FWViewContext* ctx)
83 {
84  m_hits=0;
85  if (iItem)
86  {
87  iItem->get(m_hits);
88  FWCaloDataProxyBuilderBase::build(iItem, el, ctx);
89  }
90 }
91 
92 void
94 {
95 
96  if(0!=m_hits) {
97 
98  //reset values for this slice
99  std::vector<float>& sliceVals = m_vecData->GetSliceVals(m_sliceIndex);
100  for (std::vector<float>::iterator i = sliceVals.begin(); i!= sliceVals.end(); ++i)
101  {
102  *i = 0;
103  }
104 
105 
106  }
108 }
109 
110 void
112 {
113  //reset values for this slice
114  std::vector<float>& sliceVals = m_vecData->GetSliceVals(m_sliceIndex);
115  for (std::vector<float>::iterator i = sliceVals.begin(); i!= sliceVals.end(); ++i)
116  {
117  *i = 0;
118  }
119 
120  if (m_hits)
121  {
122  TEveCaloData::vCellId_t& selected = m_vecData->GetCellsSelected();
123 
124  if(item()->defaultDisplayProperties().isVisible()) {
125  assert(item()->size() >= m_hits->size());
126 
127  unsigned int index=0;
128  TEveCaloData::vCellId_t cellId;
129  for(HGCRecHitCollection::const_iterator it = m_hits->begin(); it != m_hits->end(); ++it,++index)
130  {
131  const FWEventItem::ModelInfo& info = item()->modelInfo(index);
132  if(info.displayProperties().isVisible())
133  {
134  unsigned int rawid = (*it).detid().rawId();
135  int tower = fillTowerForDetId(rawid, (*it).energy());
136 
137  if(info.isSelected())
138  {
139  selected.push_back(TEveCaloData::CellId_t(tower, m_sliceIndex));
140  }
141  }
142  }
143  }
144  }
145 }
146 
147 int
149 {
150  using namespace TMath;
151  const static float upPhiLimit = Pi() -10*DegToRad() -1e-5;
152 
153  TEveCaloData::vCellId_t cellIds;
154  const FWGeometry *geom = item()->getGeom();
155  if( ! geom->contains( rawid ))
156  {
157  fwLog( fwlog::kInfo ) << "FWHGTowerProxyBuilderBase cannot get geometry for DetId: "<< rawid << ". Ignored.\n";
158  return -1;
159  }
160 
161  const float* corners = geom->getCorners( rawid );
162  if( ! corners )
163  {
164  fwLog( fwlog::kInfo ) << "FWHGTowerProxyBuilderBase cannot get corners for DetId: "<< rawid << ". Ignored.\n";
165  return -1;
166  }
167 
168  std::vector<TEveVector> front( 4 );
169  float eta[4], phi[4];
170  bool plusSignPhi = false;
171  bool minusSignPhi = false;
172  int j = 0;
173  for( int i = 0; i < 4; ++i )
174  {
175  front[i] = TEveVector( corners[j], corners[j + 1], corners[j + 2] );
176  j += 3;
177 
178  eta[i] = front[i].Eta();
179  phi[i] = front[i].Phi();
180 
181  // make sure sign around Pi is same as sign of fY
182  phi[i] = Sign( phi[i], front[i].fY );
183 
184  ( phi[i] >= 0 ) ? plusSignPhi = true : minusSignPhi = true;
185  }
186 
187  // check for cell around phi and move up edge to negative side
188  if( plusSignPhi && minusSignPhi )
189  {
190  for( int i = 0; i < 4; ++i )
191  {
192  if( phi[i] >= upPhiLimit )
193  {
194  // printf("over phi max limit %f \n", phi[i]);
195  phi[i] -= TwoPi();
196  }
197  }
198  }
199 
200  float etaM = -10;
201  float etam = 10;
202  float phiM = -4;
203  float phim = 4;
204  for( int i = 0; i < 4; ++i )
205  {
206  etam = Min( etam, eta[i] );
207  etaM = Max( etaM, eta[i] );
208  phim = Min( phim, phi[i] );
209  phiM = Max( phiM, phi[i] );
210  }
211 
212  /*
213  if (phiM - phim > 1)
214  printf("!!! [%.2f %.2f] input(%.3f, %.3f, %.3f, %.3f) \n", phim, phiM, phiRef[0] , phiRef[1] , phiRef[2], phiRef[3]);
215  */
216 
217  // check if tower is there
218  Float_t ceta = (etam+etaM)*0.5;
219  Float_t cphi = (phim+phiM)*0.5;
220  int tower = -1;
221  int idx = 0;
222  for ( TEveCaloData::vCellGeom_i i = m_vecData->GetCellGeom().begin(); i!= m_vecData->GetCellGeom().end(); ++i, ++idx)
223  {
224  const TEveCaloData::CellGeom_t &cg = *i;
225  if ((ceta > cg.fEtaMin && ceta < cg.fEtaMax) && (cphi > cg.fPhiMin && cphi < cg.fPhiMax))
226  {
227  tower = idx;
228  break;
229  }
230  }
231 
232  // add it if not there
233  if (tower == -1 )
234  {
235  tower = m_vecData->AddTower(etam, etaM, phim, phiM);
236  }
237 
238 
239  m_vecData->FillSlice(m_sliceIndex, tower, val);
240  return tower;
241 }
242 
244 
245 
size
Write out results.
const double TwoPi
const double Pi
TEveCaloDataVec * getCaloDataHF() const
Definition: Context.h:81
static const TGPicture * info(bool iBackgroundIsBlack)
const FWDisplayProperties & displayProperties() const
Definition: FWEventItem.h:68
#define REGISTER_FWPROXYBUILDER(_name_, _type_, _purpose_, _view_)
static const int kAllRPZBits
Definition: FWViewType.h:58
T Sign(T A, T B)
Definition: MathUtil.h:54
bool isSelected() const
Definition: FWEventItem.h:71
void get(const T *&oData) const
Definition: FWEventItem.h:85
std::vector< HGCRecHit >::const_iterator const_iterator
T Min(T a, T b)
Definition: MathUtil.h:39
void addSliceSelector(int iSlice, FWFromSliceSelector *)
const FWEventItem * item() const
int fillTowerForDetId(unsigned int rawid, float)
virtual void itemBeingDestroyed(const FWEventItem *)
bool contains(unsigned int id) const
Definition: FWGeometry.h:110
base
Make Sure CMSSW is Setup ##.
const_iterator end() const
T Max(T a, T b)
Definition: MathUtil.h:44
virtual void setCaloData(const fireworks::Context &)
const float * getCorners(unsigned int id) const
Definition: FWGeometry.cc:286
#define fwLog(_level_)
Definition: fwLog.h:50
size_type size() const
const HGCRecHitCollection * m_hits
ModelInfo modelInfo(int iIndex) const
Definition: FWEventItem.cc:537
virtual void itemBeingDestroyed(const FWEventItem *)
const FWGeometry * getGeom() const
Definition: FWEventItem.cc:683
const_iterator begin() const