CMS 3D CMS Logo

FWCaloClusterProxyBuilder.cc
Go to the documentation of this file.
1 #include "TEveBoxSet.h"
7 
8 class FWCaloClusterProxyBuilder : public FWSimpleProxyBuilderTemplate<reco::CaloCluster>
9 {
10 public:
12  ~FWCaloClusterProxyBuilder( void ) override {}
13 
15 
16 private:
17  FWCaloClusterProxyBuilder( const FWCaloClusterProxyBuilder& ) = delete; // stop default
18  const FWCaloClusterProxyBuilder& operator=( const FWCaloClusterProxyBuilder& ) = delete; // stop default
19 
21  void build( const reco::CaloCluster& iData, unsigned int iIndex, TEveElement& oItemHolder, const FWViewContext* ) override;
22 };
23 
24 void
25 FWCaloClusterProxyBuilder::build( const reco::CaloCluster& iData, unsigned int iIndex, TEveElement& oItemHolder, const FWViewContext* )
26 {
27  std::vector<std::pair<DetId, float> > clusterDetIds = iData.hitsAndFractions();
28 
29  TEveBoxSet* boxset = new TEveBoxSet();
30  boxset->Reset(TEveBoxSet::kBT_FreeBox, true, 64);
31  boxset->UseSingleColor();
32  boxset->SetPickable(true);
33 
34  for( std::vector<std::pair<DetId, float> >::iterator it = clusterDetIds.begin(), itEnd = clusterDetIds.end();
35  it != itEnd; ++it )
36  {
37  const float* corners = item()->getGeom()->getCorners( it->first );
38 
39  if( corners == nullptr ) {
40  continue;
41  }
42 
43  std::vector<float> pnts(24);
44 
45  const uint type = ((it->first >> 28) & 0xF);
46  // HGCal
47  if(type >= 8 && type <= 10){
48 
49  const float* parameters = item()->getGeom()->getParameters( it->first );
50  const float* shapes = item()->getGeom()->getShapePars(it->first);
51 
52  if(parameters == nullptr || shapes == nullptr ){
53  continue;
54  }
55 
56  #if 0
57  const int total_points = parameters[0];
58  const int total_vertices = 3*total_points;
59  #else // using broken boxes(half hexagon) until there's support for hexagons in TEveBoxSet
60  const int total_points = 4;
61  const int total_vertices = 3*total_points;
62 
63  const float thickness = shapes[3];
64 
65  for(int i = 0; i < total_points; ++i){
66  pnts[i*3+0] = corners[i*3];
67  pnts[i*3+1] = corners[i*3+1];
68  pnts[i*3+2] = corners[i*3+2];
69 
70  pnts[(i*3+0)+total_vertices] = corners[i*3];
71  pnts[(i*3+1)+total_vertices] = corners[i*3+1];
72  pnts[(i*3+2)+total_vertices] = corners[i*3+2]+thickness;
73  }
74  #endif
75  }
76  // Not HGCal
77  else {
78  fireworks::energyTower3DCorners(corners, (*it).second, pnts);
79  }
80 
81  boxset->AddBox( &pnts[0]);
82  }
83 
84  boxset->RefitPlex();
85  setupAddElement(boxset, &oItemHolder);
86 }
87 
type
Definition: HCALResponse.h:21
#define REGISTER_PROXYBUILDER_METHODS()
#define REGISTER_FWPROXYBUILDER(_name_, _type_, _purpose_, _view_)
const float * getParameters(unsigned int id) const
Definition: FWGeometry.cc:446
void setupAddElement(TEveElement *el, TEveElement *parent, bool set_color=true) const
const std::vector< std::pair< DetId, float > > & hitsAndFractions() const
Definition: CaloCluster.h:197
const FWEventItem * item() const
const float * getShapePars(unsigned int id) const
Definition: FWGeometry.cc:462
void energyTower3DCorners(const float *corners, float scale, std::vector< float > &, bool reflect=false)
const float * getCorners(unsigned int id) const
Definition: FWGeometry.cc:430
const FWCaloClusterProxyBuilder & operator=(const FWCaloClusterProxyBuilder &)=delete
def uint(string)
const FWGeometry * getGeom() const
Definition: FWEventItem.cc:683