CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
ZdcNumberingScheme.cc
Go to the documentation of this file.
1 // File: ZdcNumberingScheme.cc
3 // Date: 02.04
4 // Description: Numbering scheme for Zdc
5 // Modifications:
10 #include "CLHEP/Units/GlobalSystemOfUnits.h"
11 #include <iostream>
12 
13 //#define EDM_ML_DEBUG
14 
16  verbosity = iv;
17  if (verbosity > 0)
18  edm::LogVerbatim("ForwardSim") << "Creating ZDCNumberingScheme";
19 }
20 
22  if (verbosity > 0)
23  edm::LogVerbatim("ForwardSim") << " Deleting ZdcNumberingScheme";
24 }
25 
27 
28 unsigned int ZdcNumberingScheme::getUnitID(const G4Step* aStep) const {
29  uint32_t index = 0;
30  int level = detectorLevel(aStep);
31 
32  if (level > 0) {
33  int* copyno = new int[level];
34  G4String* name = new G4String[level];
35 
36  detectorLevel(aStep, level, copyno, name);
37 
38  int zside = 0;
39  int channel = 0;
40  int fiber = 0;
41  int layer = 0;
43 
44  for (int ich = 0; ich < level; ich++) {
45  if (name[ich] == "ZDC") {
46  if (copyno[ich] == 1)
47  zside = 1;
48  if (copyno[ich] == 2)
49  zside = -1;
50  } else if (name[ich] == "ZDC_EMLayer") {
51  section = HcalZDCDetId::EM;
52 #ifdef EDM_ML_DEBUG
53  layer = copyno[ich];
54 #endif
55  } else if (name[ich] == "ZDC_EMFiber") {
56  fiber = copyno[ich];
57  if (fiber < 20)
58  channel = 1;
59  else if (fiber < 39)
60  channel = 2;
61  else if (fiber < 58)
62  channel = 3;
63  else if (fiber < 77)
64  channel = 4;
65  else
66  channel = 5;
67  } else if (name[ich] == "ZDC_LumLayer") {
68  section = HcalZDCDetId::LUM;
69  layer = copyno[ich];
70  channel = layer;
71  } else if (name[ich] == "ZDC_HadLayer") {
72  section = HcalZDCDetId::HAD;
73  layer = copyno[ich];
74  if (layer < 6)
75  channel = 1;
76  else if (layer < 12)
77  channel = 2;
78  else if (layer < 18)
79  channel = 3;
80  else
81  channel = 4;
82  }
83 #ifdef EDM_ML_DEBUG
84  else if (name[ich] == "ZDC_LumGas") {
85  fiber = 1;
86  } else if (name[ich] == "ZDC_HadFiber") {
87  fiber = copyno[ich];
88  }
89 #endif
90  }
91 
92 #ifdef EDM_ML_DEBUG
93  unsigned intindex = 0;
94  intindex = packZdcIndex(section, layer, fiber, channel, zside);
95 #endif
96 
97  bool true_for_positive_eta = true;
98  if (zside == -1)
99  true_for_positive_eta = false;
100 
101  HcalZDCDetId zdcId(section, true_for_positive_eta, channel);
102  index = zdcId.rawId();
103 
104 #ifdef EDM_ML_DEBUG
105  edm::LogVerbatim("ForwardSim") << "DetectorId: " << zdcId;
106 
107  edm::LogVerbatim("ForwardSim") << "ZdcNumberingScheme:"
108  << " getUnitID - # of levels = " << level;
109  for (int ich = 0; ich < level; ich++)
110  edm::LogVerbatim("ForwardSim") << " " << ich << ": copyno " << copyno[ich] << " name=" << name[ich]
111  << " section " << section << " zside " << zside << " layer " << layer << " fiber "
112  << fiber << " channel " << channel << "packedIndex =" << intindex
113  << " detId raw: " << std::hex << index << std::dec;
114 
115 #endif
116 
117  delete[] copyno;
118  delete[] name;
119  }
120 
121  return index;
122 }
123 
124 unsigned ZdcNumberingScheme::packZdcIndex(int section, int layer, int fiber, int channel, int z) {
125  unsigned int idx = ((z - 1) & 1) << 20; //bit 20
126  idx += (channel & 7) << 17; //bits 17-19
127  idx += (fiber & 255) << 9; //bits 9-16
128  idx += (layer & 127) << 2; //bits 2-8
129  idx += (section & 3); //bits 0-1
130 
131 #ifdef EDM_ML_DEBUG
132  edm::LogVerbatim("ForwardSim") << "ZDC packing: section " << section << " layer " << layer << " fiber " << fiber
133  << " channel " << channel << " zside " << z << "idx: " << std::hex << idx << std::dec;
134  int newsubdet, newlayer, newfiber, newchannel, newz;
135  unpackZdcIndex(idx, newsubdet, newlayer, newfiber, newchannel, newz);
136 #endif
137 
138  return idx;
139 }
140 
142  const unsigned int& idx, int& section, int& layer, int& fiber, int& channel, int& z) {
143  z = 1 + ((idx >> 20) & 1);
144  channel = (idx >> 17) & 7;
145  fiber = (idx >> 9) & 255;
146  layer = (idx >> 2) & 127;
147  section = idx & 3;
148 
149 #ifdef EDM_ML_DEBUG
150  edm::LogVerbatim("ForwardSim") << "ZDC unpacking: idx:" << idx << " -> section " << section << " layer " << layer
151  << " fiber " << fiber << " channel " << channel << " zside " << z;
152 #endif
153 }
154 
155 int ZdcNumberingScheme::detectorLevel(const G4Step* aStep) const {
156  //Find number of levels
157  const G4VTouchable* touch = aStep->GetPreStepPoint()->GetTouchable();
158  int level = 0;
159  if (touch)
160  level = ((touch->GetHistoryDepth()) + 1);
161  return level;
162 }
163 
164 void ZdcNumberingScheme::detectorLevel(const G4Step* aStep, int& level, int* copyno, G4String* name) const {
165  //Get name and copy numbers
166  if (level > 0) {
167  const G4VTouchable* touch = aStep->GetPreStepPoint()->GetTouchable();
168  for (int ii = 0; ii < level; ii++) {
169  int i = level - ii - 1;
170  name[ii] = touch->GetVolume(i)->GetName();
171  copyno[ii] = touch->GetReplicaNumber(i);
172  }
173  }
174 }
static unsigned int packZdcIndex(int subDet, int layer, int fiber, int channel, int z)
Log< level::Info, true > LogVerbatim
int32_t *__restrict__ iv
virtual unsigned int getUnitID(const G4Step *aStep) const
constexpr uint32_t rawId() const
get the raw id
Definition: DetId.h:57
int zside(DetId const &)
int ii
Definition: cuy.py:589
float float float z
constexpr std::array< uint8_t, layerIndexSize > layer
void setVerbosity(const int)
static void unpackZdcIndex(const unsigned int &idx, int &subDet, int &layer, int &fiber, int &channel, int &z)
string section
Definition: vertexPlots.py:496
tuple level
Definition: testEve_cfg.py:47
int detectorLevel(const G4Step *) const