CMS 3D CMS Logo

FWHGCalTriggerCellProxyBuilder.cc
Go to the documentation of this file.
2 
6 
11 // #include "L1Trigger/L1THGCal/plugins/geometries/HGCalTriggerGeometryV9Imp2.cc"
12 
13 #include "TEveBoxSet.h"
14 
15 class FWHGCalTriggerCellProxyBuilder : public FWL1THGCalProxyTemplate<l1t::HGCalTriggerCell> {
16 public:
19 
21 
22  FWHGCalTriggerCellProxyBuilder(const FWHGCalTriggerCellProxyBuilder &) = delete; // stop default
23  const FWHGCalTriggerCellProxyBuilder &operator=(const FWHGCalTriggerCellProxyBuilder &) = delete; // stop default
24 
25 private:
26  void build(const l1t::HGCalTriggerCell &iData,
27  unsigned int iIndex,
28  TEveElement &oItemHolder,
29  const FWViewContext *) override;
30 };
31 
33  unsigned int iIndex,
34  TEveElement &oItemHolder,
35  const FWViewContext *) {
36  const long layer = item()->getConfig()->value<long>("Layer");
37  const double saturation_energy = item()->getConfig()->value<double>("EnergyCutOff");
38  const bool heatmap = item()->getConfig()->value<bool>("Heatmap");
39 
40  const bool z_plus = item()->getConfig()->value<bool>("Z+");
41  const bool z_minus = item()->getConfig()->value<bool>("Z-");
42 
43  bool h_hex(false);
44  TEveBoxSet *hex_boxset = new TEveBoxSet();
45  if (!heatmap)
46  hex_boxset->UseSingleColor();
47  hex_boxset->SetPickable(true);
48  hex_boxset->Reset(TEveBoxSet::kBT_Hex, true, 64);
49  hex_boxset->SetAntiFlick(true);
50 
51  bool h_box(false);
52  TEveBoxSet *boxset = new TEveBoxSet();
53  if (!heatmap)
54  boxset->UseSingleColor();
55  boxset->SetPickable(true);
56  boxset->Reset(TEveBoxSet::kBT_FreeBox, true, 64);
57  boxset->SetAntiFlick(true);
58 
59  const float energy = fmin(10 * iData.energy() / saturation_energy, 1.0);
60 
61  std::unordered_set<unsigned> cells = getCellsFromTriggerCell(iData.detId());
62 
63  for (std::unordered_set<unsigned>::const_iterator it = cells.begin(), itEnd = cells.end(); it != itEnd; ++it) {
64  const bool z = (*it >> 25) & 0x1;
65 
66  // discard everything thats not at the side that we are intersted in
67  if (((z_plus & z_minus) != 1) && (((z_plus | z_minus) == 0) || !(z == z_minus || z == !z_plus)))
68  continue;
69 
70  const float *corners = item()->getGeom()->getCorners(*it);
71  const float *parameters = item()->getGeom()->getParameters(*it);
72  const float *shapes = item()->getGeom()->getShapePars(*it);
73 
74  if (corners == nullptr || parameters == nullptr || shapes == nullptr) {
75  continue;
76  }
77 
78  const int total_points = parameters[0];
79  const bool isScintillator = (total_points == 4);
80  const uint8_t type = ((*it >> 28) & 0xF);
81 
82  uint8_t ll = layer;
83  if (layer > 0) {
84  if (layer > 28) {
85  if (type == 8) {
86  continue;
87  }
88  ll -= 28;
89  } else {
90  if (type != 8) {
91  continue;
92  }
93  }
94 
95  if (ll != ((*it >> (isScintillator ? 17 : 20)) & 0x1F))
96  continue;
97  }
98 
99  // Scintillator
100  if (isScintillator) {
101  const int total_vertices = 3 * total_points;
102 
103  std::vector<float> pnts(24);
104  for (int i = 0; i < total_points; ++i) {
105  pnts[i * 3 + 0] = corners[i * 3];
106  pnts[i * 3 + 1] = corners[i * 3 + 1];
107  pnts[i * 3 + 2] = corners[i * 3 + 2];
108 
109  pnts[(i * 3 + 0) + total_vertices] = corners[i * 3];
110  pnts[(i * 3 + 1) + total_vertices] = corners[i * 3 + 1];
111  pnts[(i * 3 + 2) + total_vertices] = corners[i * 3 + 2] + shapes[3];
112  }
113  boxset->AddBox(&pnts[0]);
114  boxset->DigitColor(energy * 255, 0, 255 - energy * 255);
115 
116  h_box = true;
117  }
118  // Silicon
119  else {
120  const int offset = 9;
121 
122  float centerX = (corners[6] + corners[6 + offset]) / 2;
123  float centerY = (corners[7] + corners[7 + offset]) / 2;
124  float radius = fabs(corners[6] - corners[6 + offset]) / 2;
125  hex_boxset->AddHex(TEveVector(centerX, centerY, corners[2]), radius, shapes[2], shapes[3]);
126  hex_boxset->DigitColor(energy * 255, 0, 255 - energy * 255);
127 
128  h_hex = true;
129  }
130  }
131 
132  if (h_hex) {
133  hex_boxset->RefitPlex();
134 
135  hex_boxset->CSCTakeAnyParentAsMaster();
136  if (!heatmap) {
137  hex_boxset->CSCApplyMainColorToMatchingChildren();
138  hex_boxset->CSCApplyMainTransparencyToMatchingChildren();
139  hex_boxset->SetMainColor(item()->modelInfo(iIndex).displayProperties().color());
140  hex_boxset->SetMainTransparency(item()->defaultDisplayProperties().transparency());
141  }
142  oItemHolder.AddElement(hex_boxset);
143  }
144 
145  if (h_box) {
146  boxset->RefitPlex();
147 
148  boxset->CSCTakeAnyParentAsMaster();
149  if (!heatmap) {
150  boxset->CSCApplyMainColorToMatchingChildren();
151  boxset->CSCApplyMainTransparencyToMatchingChildren();
152  boxset->SetMainColor(item()->modelInfo(iIndex).displayProperties().color());
153  boxset->SetMainTransparency(item()->defaultDisplayProperties().transparency());
154  }
155  oItemHolder.AddElement(boxset);
156  }
157 }
158 
161  "HGCal Trigger Cell",
#define REGISTER_PROXYBUILDER_METHODS()
#define REGISTER_FWPROXYBUILDER(_name_, _type_, _purpose_, _view_)
FWProxyBuilderConfiguration * getConfig() const
Definition: FWEventItem.h:150
std::unordered_set< unsigned > getCellsFromTriggerCell(const unsigned trigger_cell_id) const
static const int kAll3DBits
Definition: FWViewType.h:68
const float * getCorners(unsigned int id) const
Definition: FWGeometry.cc:439
uint32_t detId() const
const FWHGCalTriggerCellProxyBuilder & operator=(const FWHGCalTriggerCellProxyBuilder &)=delete
const FWGeometry * getGeom() const
Definition: FWEventItem.cc:548
const float * getShapePars(unsigned int id) const
Definition: FWGeometry.cc:461
const float * getParameters(unsigned int id) const
Definition: FWGeometry.cc:450
const FWEventItem * item() const
double energy() const final
energy