CMS 3D CMS Logo

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