CMS 3D CMS Logo

FP420NumberingScheme.cc
Go to the documentation of this file.
1 // File: FP420NumberingScheme.cc
3 // Date: 02.2006
4 // Description: Numbering scheme for FP420
5 // Modifications: 08.2008 mside and fside added
8 //
9 #include "CLHEP/Units/GlobalSystemOfUnits.h"
10 #include "globals.hh"
11 #include "G4Step.hh"
12 #include <iostream>
13 
14 //UserVerbosity FP420NumberingScheme::cout("FP420NumberingScheme","silent","FP420NumberingScheme");
15 
17 // sn0=3, pn0=6, rn0=7;
18 }
19 
21  // std::cout << " Deleting FP420NumberingScheme" << std::endl;
22 }
23 
24 
25 int FP420NumberingScheme::detectorLevel(const G4Step* aStep) const {
26 
27  //Find number of levels
28  const G4VTouchable* touch = aStep->GetPreStepPoint()->GetTouchable();
29  int level = 0;
30  if (touch) level = ((touch->GetHistoryDepth())+1);
31  return level;
32 }
33 
34 void FP420NumberingScheme::detectorLevel(const G4Step* aStep, int& level,
35  int* copyno, G4String* name) const {
36 
37  //Get name and copy numbers
38  if (level > 0) {
39  const G4VTouchable* touch = aStep->GetPreStepPoint()->GetTouchable();
40  for (int ii = 0; ii < level; ii++) {
41  int i = level - ii - 1;
42  name[ii] = touch->GetVolume(i)->GetName();
43  copyno[ii] = touch->GetReplicaNumber(i);
44  }
45  }
46 }
47 
48 
49 
50 
51 unsigned int FP420NumberingScheme::getUnitID(const G4Step* aStep) const {
52 
53  unsigned intindex=0;
54  int level = detectorLevel(aStep);
55 
56  // std::cout << "FP420NumberingScheme number of levels= " << level << std::endl;
57 
58  // unsigned int intIndex = 0;
59  if (level > 0) {
60  int* copyno = new int[level];
61  G4String* name = new G4String[level];
62  detectorLevel(aStep, level, copyno, name);
63 
64  // int det = static_cast<int>(FP420);;
65 
66  int det = 1;
67  int stationgen = 0;
68  int zside = 0;
69  int station = 0;
70  int plane = 0;
71  for (int ich=0; ich < level; ich++) {
72  /*
73  // old set up configuration with equidistant stations
74  if(name[ich] == "FP420Ex") {
75  stationgen = copyno[ich];
76  } else if(name[ich] == "SISTATION") {
77  station = stationgen;
78  } else if(name[ich] == "SIPLANE") {
79  plane = copyno[ich];
80  } else if(name[ich] == "SIDETL") {
81  zside = 1;
82  } else if(name[ich] == "SIDETR") {
83  zside = 2;
84  }
85  */
86  // new and old set up configurations are possible:
87  if(name[ich] == "FP420E") {
88  det = copyno[ich];
89  } else if(name[ich] == "HPS240E") {
90  det = copyno[ich] + 2 ;
91  } else if(name[ich] == "FP420Ex1" || name[ich] == "HPS240Ex1") {
92  stationgen = 1;
93  // } else if(name[ich] == "FP420Ex2") {
94  // stationgen = 2;
95  } else if(name[ich] == "FP420Ex3" || name[ich] == "HPS240Ex3") {
96  stationgen = 2;// was =3
97  } else if(name[ich] == "SISTATION" || name[ich] == "HPS240SISTATION") {
98  station = stationgen;
99  } else if(name[ich] == "SIPLANE" || name[ich] == "HPS240SIPLANE") {
100  plane = copyno[ich];
101  // SIDETL (or R) can be ether X or Y type in next schemes of readout
102  // !!! (=...) zside
103  //
104  // 1 2 <---copyno
105  // Front(=2) Empty(=4) Back(=6) <--SIDETR OR SENSOR2
106  // 1 2 <---copyno
107  // Front(=1) Back(=3) Empty(=5) <--SIDETL OR SENSOR1
108  //
109  } else if(name[ich] == "SENSOR2" || name[ich] == "HPS240SENSOR2") {
110  // } else if(name[ich] == "SIDETR") {
111  // zside = 4 * copyno[ich] - 2 ;//= 2 6 (copyno=1,2)
112  zside = 3 * copyno[ich];//= 3 6 (copyno=1,2)
113  } else if(name[ich] == "SENSOR1" || name[ich] == "HPS240SENSOR1") {
114  // } else if(name[ich] == "SIDETL") {
115  // zside = 2 * copyno[ich] - 1 ;//= 1 3 (copyno=1,2)
116  zside = copyno[ich];//= 1 2 (copyno=1,2)
117  }
118  //
119  // std::cout << "FP420NumberingScheme " << "ich=" << ich << "copyno" << copyno[ich] << "name=" << name[ich] << std::endl;
120  //
121  }
122  // det = 1 for +FP420 , = 2 for -FP420 / (det-1) = 0,1
123  // det = 3 for +HPS240 , = 4 for -HPS240 / (det-1) = 2,3
124  // 0 is as default for every below:
125  // Z index
126  // station number 1 - 8 (in reality just 2 ones)
127  // superplane(superlayer) number 1 - 16 (in reality just 5 ones)
128 
129  // intindex = myPacker.packEcalIndex (det, zside, station, plane);// see examples
130  // intindex = myPacker.packCastorIndex (det, zside, station, plane);// see examples
131  intindex = packFP420Index (det, zside, station, plane);
132  /*
133  //
134  std::cout << "FP420NumberingScheme det=" << det << " zside=" << zside << " station=" <<station << " plane=" << plane << std::endl;
135 
136  for (int ich = 0; ich < level; ich++) {
137  std::cout <<" name = " << name[ich] <<" copy = " << copyno[ich] << std::endl;
138  std::cout << " packed index = intindex" << intindex << std::endl;
139  }
140  //
141  */
142 
143 
144  delete[] copyno;
145  delete[] name;
146  }
147 
148  return intindex;
149 
150 }
151 
152 unsigned FP420NumberingScheme::packFP420Index(int det, int zside, int station,int plane){
153  //
154  unsigned int idx = ((det-1)&3)<<19; //bit 19-20 (det-1):0- 3 = 4-->2**2 = 4 -> 4-1 ->((det-1)&3) 2 bit: 0-1
155  // unsigned int idx = ((det-1)&1)<<20;//bit 20-20 (det-1):0- 1 = 2-->2**1 = 2 -> 2-1 ->((det-1)&1) 1 bit: 0
156  idx += (zside&7)<<7; //bits 7- 9 zside:0- 7 = 8-->2**3 = 8 -> 8-1 -> (zside&7) 3 bits:0-2
157  // idx += (zside&3)<<7; //bits 7- 8 zside:0- 3 = 4-->2**2 = 4 -> 4-1 -> (zside&3) 2 bits:0-1
158  idx += (station&7)<<4; //bits 4- 6 station:0- 7 = 8-->2**3 = 8 -> 8-1 ->(station&7) 3 bits:0-2
159  idx += (plane&15); //bits 0- 3 plane:0-15 =16-->2**4 =16 ->16-1 -> (plane&15) 4 bits:0-3
160 
161  //
162 
163  // std::cout << "FP420 packing: det " << det << " zside " << zside << " station " << station << " plane " << plane << " idx " << idx << std::endl;
164  // int newdet, newzside, newstation,newplane;
165  // unpackFP420Index(idx, newdet, newzside, newstation,newplane);
166 
167  //
168 
169  return idx;
170 }
171 
172 
173 
174 void FP420NumberingScheme::unpackFP420Index(const unsigned int& idx, int& det,
175  int& zside, int& station,
176  int& plane) {
177  det = (idx>>19)&3;
178  //det = (idx>>20)&1;
179  det += 1;
180  zside = (idx>>7)&7;
181  // zside = (idx>>7)&3;
182  station = (idx>>4)&7;
183  plane = idx&15;
184  //
185 
186  // std::cout << " FP420unpacking: idx=" << idx << " zside " << zside << " station " << station << " plane " << plane << std::endl;
187 
188  //
189 }
190 
191 
virtual int detectorLevel(const G4Step *) const
static void unpackFP420Index(const unsigned int &idx, int &det, int &zside, int &station, int &superplane)
int zside(DetId const &)
virtual unsigned int getUnitID(const G4Step *aStep) const
static unsigned int packFP420Index(int det, int zside, int station, int superplane)
ii
Definition: cuy.py:589