CMS 3D CMS Logo

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:
9 #include "CLHEP/Units/GlobalSystemOfUnits.h"
10 #include <iostream>
11 #undef debug
12 
14  verbosity = iv;
15  if (verbosity>0)
16  std::cout << "Creating ZDCNumberingScheme" << std::endl;
17 }
18 
20  if (verbosity>0)
21  std::cout<< " Deleting ZdcNumberingScheme" << std::endl;
22 }
23 
24 
25 void ZdcNumberingScheme::setVerbosity(const int iv){ verbosity = iv; }
26 
27 unsigned int ZdcNumberingScheme::getUnitID(const G4Step* aStep) const {
28 
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)zside = 1;
47  if(copyno[ich] == 2)zside = -1;
48  }
49  else if (name[ich] == "ZDC_EMLayer") {
50  section = HcalZDCDetId::EM;
51 #ifdef debug
52  layer = copyno[ich];
53 #endif
54  }
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  }
68  else if (name[ich] == "ZDC_LumLayer") {
69  section = HcalZDCDetId::LUM;
70  layer = copyno[ich];
71  channel = layer;
72  }
73  else if (name[ich] == "ZDC_HadLayer") {
74  section = HcalZDCDetId::HAD;
75  layer = copyno[ich];
76  if (layer < 6)
77  channel = 1;
78  else if (layer < 12)
79  channel = 2;
80  else if (layer < 18)
81  channel = 3;
82  else
83  channel = 4;
84  }
85 #ifdef debug
86  else if (name[ich] == "ZDC_LumGas") {
87  fiber = 1;
88  }
89  else if (name[ich] == "ZDC_HadFiber") {
90  fiber = copyno[ich];
91  }
92 #endif
93  }
94 
95 #ifdef debug
96  unsigned intindex=0;
97  intindex = packZdcIndex (section, layer, fiber, channel, zside);
98 #endif
99 
100  bool true_for_positive_eta = true;
101  if(zside == -1)true_for_positive_eta = false;
102 
103  HcalZDCDetId zdcId(section, true_for_positive_eta, channel);
104  index = zdcId.rawId();
105 
106 #ifdef debug
107  std::cout<<"DetectorId: ";
108  std::cout<<zdcId<<std::endl;
109 
110 
111  std::cout<< "ZdcNumberingScheme:"
112  << " getUnitID - # of levels = "
113  << level << std::endl;
114  for (int ich = 0; ich < level; ich++)
115  std::cout<< " " << ich << ": copyno " << copyno[ich]
116  << " name=" << name[ich]
117  << " section " << section << " zside " << zside
118  << " layer " << layer << " fiber " << fiber
119  << " channel " << channel << "packedIndex ="
120  << intindex << " detId raw: "<<index<<std::endl;
121 
122 #endif
123 
124  delete[] copyno;
125  delete[] name;
126  }
127 
128  return index;
129 
130 }
131 
132 unsigned ZdcNumberingScheme::packZdcIndex(int section, int layer, int fiber,
133  int channel, int z){
134  unsigned int idx = ((z-1)&1)<<20; //bit 20
135  idx += (channel&7)<<17; //bits 17-19
136  idx += (fiber&255)<<9; //bits 9-16
137  idx += (layer&127)<<2; //bits 2-8
138  idx += (section&3); //bits 0-1
139 
140  #ifdef debug
141  std::cout<< "ZDC packing: section " << section << " layer " << layer << " fiber "
142  << fiber << " channel " << channel << " zside " << z << "idx: " <<idx << std::endl;
143  int newsubdet, newlayer, newfiber, newchannel, newz;
144  unpackZdcIndex(idx, newsubdet, newlayer, newfiber, newchannel, newz);
145  #endif
146 
147  return idx;
148 }
149 
150 
151 void ZdcNumberingScheme::unpackZdcIndex(const unsigned int& idx, int& section,
152  int& layer, int& fiber,
153  int& channel, int& z) {
154  z = 1 + ((idx>>20)&1);
155  channel = (idx>>17)&7;
156  fiber = (idx>>9)&255;
157  layer = (idx>>2)&127;
158  section = idx&3;
159 
160  #ifdef debug
161  std::cout<< "ZDC unpacking: idx:"<< idx << " -> section " << section
162  << " layer " << layer << " fiber " << fiber << " channel "
163  << channel << " zside " << z << std::endl;
164  #endif
165 }
166 
167 int ZdcNumberingScheme::detectorLevel(const G4Step* aStep) const {
168 
169  //Find number of levels
170  const G4VTouchable* touch = aStep->GetPreStepPoint()->GetTouchable();
171  int level = 0;
172  if (touch) level = ((touch->GetHistoryDepth())+1);
173  return level;
174 }
175 
176 void ZdcNumberingScheme::detectorLevel(const G4Step* aStep, int& level,
177  int* copyno, G4String* name) const {
178 
179  //Get name and copy numbers
180  if (level > 0) {
181  const G4VTouchable* touch = aStep->GetPreStepPoint()->GetTouchable();
182  for (int ii = 0; ii < level; ii++) {
183  int i = level - ii - 1;
184  name[ii] = touch->GetVolume(i)->GetName();
185  copyno[ii] = touch->GetReplicaNumber(i);
186  }
187  }
188 }
static unsigned int packZdcIndex(int subDet, int layer, int fiber, int channel, int z)
virtual unsigned int getUnitID(const G4Step *aStep) const
int zside(DetId const &)
uint32_t rawId() const
get the raw id
Definition: DetId.h:43
void setVerbosity(const int)
ii
Definition: cuy.py:588
static void unpackZdcIndex(const unsigned int &idx, int &subDet, int &layer, int &fiber, int &channel, int &z)
int detectorLevel(const G4Step *) const