CMS 3D CMS Logo

DDHGCalEEAlgo.cc
Go to the documentation of this file.
1 // File: DDHGCalEEAlgo.cc
3 // Description: Geometry factory class for HGCal (EE and HESil)
5 
13 #include "CLHEP/Units/GlobalPhysicalConstants.h"
14 #include "CLHEP/Units/GlobalSystemOfUnits.h"
15 
16 //#define EDM_ML_DEBUG
17 
19 #ifdef EDM_ML_DEBUG
20  edm::LogVerbatim("HGCalGeom") << "DDHGCalEEAlgo: Creating an instance";
21 #endif
22 }
23 
25 
27  const DDVectorArguments & vArgs,
28  const DDMapArguments & ,
29  const DDStringArguments & sArgs,
30  const DDStringVectorArguments &vsArgs) {
31 
32  wafers_ = vsArgs["WaferNames"];
33 #ifdef EDM_ML_DEBUG
34  edm::LogVerbatim("HGCalGeom") << "DDHGCalEEAlgo: " << wafers_.size()
35  << " wafers";
36  for (unsigned int i=0; i<wafers_.size(); ++i)
37  edm::LogVerbatim("HGCalGeom") << "Wafer[" << i << "] " << wafers_[i];
38 #endif
39  materials_ = vsArgs["MaterialNames"];
40  names_ = vsArgs["VolumeNames"];
41  thick_ = vArgs["Thickness"];
42  for (unsigned int i=0; i<materials_.size(); ++i) {
43  copyNumber_.emplace_back(1);
44  }
45 #ifdef EDM_ML_DEBUG
46  edm::LogVerbatim("HGCalGeom") << "DDHGCalEEAlgo: " << materials_.size()
47  << " types of volumes";
48  for (unsigned int i=0; i<names_.size(); ++i)
49  edm::LogVerbatim("HGCalGeom") << "Volume [" << i << "] " << names_[i]
50  << " of thickness " << thick_[i]
51  << " filled with " << materials_[i]
52  << " first copy number " << copyNumber_[i];
53 #endif
54  layers_ = dbl_to_int(vArgs["Layers"]);
55  layerThick_ = vArgs["LayerThick"];
56 #ifdef EDM_ML_DEBUG
57  edm::LogVerbatim("HGCalGeom") << "There are " << layers_.size() << " blocks";
58  for (unsigned int i=0; i<layers_.size(); ++i)
59  edm::LogVerbatim("HGCalGeom") << "Block [" << i << "] of thickness "
60  << layerThick_[i]
61  << " with " << layers_[i] << " layers";
62 #endif
63  layerType_ = dbl_to_int(vArgs["LayerType"]);
64  layerSense_ = dbl_to_int(vArgs["LayerSense"]);
65  firstLayer_ = (int)(nArgs["FirstLayer"]);
66  if (firstLayer_ > 0) {
67  for (unsigned int i=0; i<layerType_.size(); ++i) {
68  if (layerSense_[i] != 0) {
69  int ii = layerType_[i];
70  copyNumber_[ii] = firstLayer_;
71 #ifdef EDM_ML_DEBUG
72  edm::LogVerbatim("HGCalGeom") << "First copy number for layer type "
73  << i << ":" << ii << " with "
74  << materials_[ii] << " changed to "
75  << copyNumber_[ii];
76 #endif
77  break;
78  }
79  }
80  }
81 #ifdef EDM_ML_DEBUG
82  edm::LogVerbatim("HGCalGeom") << "There are " << layerType_.size()
83  << " layers" ;
84  for (unsigned int i=0; i<layerType_.size(); ++i)
85  edm::LogVerbatim("HGCalGeom") << "Layer [" << i << "] with material type "
86  << layerType_[i] << " sensitive class "
87  << layerSense_[i];
88 #endif
89  zMinBlock_ = nArgs["zMinBlock"];
90  rMaxFine_ = nArgs["rMaxFine"];
91  rMinThick_ = nArgs["rMinThick"];
92  waferSize_ = nArgs["waferSize"];
93  waferSepar_ = nArgs["SensorSeparation"];
94  sectors_ = (int)(nArgs["Sectors"]);
95 #ifdef EDM_ML_DEBUG
96  edm::LogVerbatim("HGCalGeom") << "zStart " << zMinBlock_ << " rFineCoarse "
97  << rMaxFine_ << " rMaxThick " << rMinThick_
98  << " wafer width " << waferSize_
99  << " separations " << waferSepar_
100  << " sectors " << sectors_;
101 #endif
102  slopeB_ = vArgs["SlopeBottom"];
103  slopeT_ = vArgs["SlopeTop"];
104  zFront_ = vArgs["ZFront"];
105  rMaxFront_ = vArgs["RMaxFront"];
106 #ifdef EDM_ML_DEBUG
107  edm::LogVerbatim("HGCalGeom") << "Bottom slopes " << slopeB_[0] << ":"
108  << slopeB_[1] << " and " << slopeT_.size()
109  << " slopes for top" ;
110  for (unsigned int i=0; i<slopeT_.size(); ++i)
111  edm::LogVerbatim("HGCalGeom") << "Block [" << i << "] Zmin " << zFront_[i]
112  << " Rmax " << rMaxFront_[i] << " Slope "
113  << slopeT_[i];
114 #endif
116 #ifdef EDM_ML_DEBUG
117  edm::LogVerbatim("HGCalGeom") << "DDHGCalEEAlgo: NameSpace " << nameSpace_;
118 #endif
119 }
120 
122 // DDHGCalEEAlgo methods...
124 
126 
127 #ifdef EDM_ML_DEBUG
128  edm::LogVerbatim("HGCalGeom") << "==>> Constructing DDHGCalEEAlgo...";
129  copies_.clear();
130 #endif
131  constructLayers (parent(), cpv);
132 #ifdef EDM_ML_DEBUG
133  edm::LogVerbatim("HGCalGeom") << "DDHGCalEEAlgo: " << copies_.size()
134  << " different wafer copy numbers";
135  int k(0);
136  for (std::unordered_set<int>::const_iterator itr=copies_.begin();
137  itr != copies_.end(); ++itr,++k) {
138  edm::LogVerbatim("HGCalGeom") << "Copy [" << k << "] : " << (*itr);
139  }
140  copies_.clear();
141  edm::LogVerbatim("HGCalGeom") << "<<== End of DDHGCalEEAlgo construction...";
142 #endif
143 }
144 
146  DDCompactView& cpv) {
147 
148 #ifdef EDM_ML_DEBUG
149  edm::LogVerbatim("HGCalGeom") << "DDHGCalEEAlgo: \t\tInside Layers";
150 #endif
151  double zi(zMinBlock_);
152  int laymin(0);
153  const double tol(0.01);
154  for (unsigned int i=0; i<layers_.size(); i++) {
155  double zo = zi + layerThick_[i];
156  double routF = rMax(zi);
157  int laymax = laymin+layers_[i];
158  double zz = zi;
159  double thickTot(0);
160  std::vector<double> pgonZ(2), pgonRin(2), pgonRout(2);
161  for (int ly=laymin; ly<laymax; ++ly) {
162  int ii = layerType_[ly];
163  int copy = copyNumber_[ii];
164  double hthick = 0.5*thick_[ii];
165  double rinB = (layerSense_[ly] == 0) ? (zo*slopeB_[0]) :
166  (zo*slopeB_[1]);
167  zz += hthick;
168  thickTot += thick_[ii];
169 
170  std::string name = "HGCal"+names_[ii]+std::to_string(copy);
171 #ifdef EDM_ML_DEBUG
172  edm::LogVerbatim("HGCalGeom") << "DDHGCalEEAlgo: Layer " << ly << ":"
173  << ii << " Front " << zi << ", " << routF
174  << " Back " << zo << ", " << rinB
175  << " superlayer thickness "
176  << layerThick_[i];
177 #endif
178  DDName matName(DDSplit(materials_[ii]).first,
179  DDSplit(materials_[ii]).second);
180  DDMaterial matter(matName);
181  DDLogicalPart glog;
182  if (layerSense_[ly] == 0) {
183  double alpha = CLHEP::pi/sectors_;
184  double rmax = routF*cos(alpha) - tol;
185  pgonZ[0] =-hthick; pgonZ[1] = hthick;
186  pgonRin[0] = rinB; pgonRin[1] = rinB;
187  pgonRout[0] = rmax; pgonRout[1] = rmax;
189  sectors_,-alpha,CLHEP::twopi,
190  pgonZ, pgonRin, pgonRout);
191  glog = DDLogicalPart(solid.ddname(), matter, solid);
192 #ifdef EDM_ML_DEBUG
193  edm::LogVerbatim("HGCalGeom") << "DDHGCalEEAlgo: " << solid.name()
194  << " polyhedra of " << sectors_
195  << " sectors covering "
196  << -alpha/CLHEP::deg << ":"
197  << (-alpha+CLHEP::twopi)/CLHEP::deg
198  << " with " << pgonZ.size()
199  << " sections and filled with "
200  << matName << ":" << &matter;
201  for (unsigned int k=0; k<pgonZ.size(); ++k)
202  edm::LogVerbatim("HGCalGeom") << "[" << k << "] z " << pgonZ[k]
203  << " R " << pgonRin[k] << ":"
204  << pgonRout[k];
205 #endif
206  } else {
208  hthick, rinB, routF, 0.0,
209  CLHEP::twopi);
210  glog = DDLogicalPart(solid.ddname(), matter, solid);
211 #ifdef EDM_ML_DEBUG
212  edm::LogVerbatim("HGCalGeom") << "DDHGCalEEAlgo: " << solid.name()
213  << " Tubs made of " << matName << ":"
214  << &matter << " of dimensions " << rinB
215  << ", " << routF << ", " << hthick
216  << ", 0.0, " << CLHEP::twopi/CLHEP::deg
217  << " and position " << glog.name()
218  << " number " << copy;
219 #endif
220  positionSensitive(glog,rinB,routF,layerSense_[ly],cpv);
221  }
222  DDTranslation r1(0,0,zz);
223  DDRotation rot;
224  cpv.position(glog, module, copy, r1, rot);
225  ++copyNumber_[ii];
226 #ifdef EDM_ML_DEBUG
227  edm::LogVerbatim("HGCalGeom") << "DDHGCalEEAlgo: " << glog.name()
228  << " number " << copy << " positioned in "
229  << module.name() << " at " << r1
230  << " with " << rot;
231 #endif
232  zz += hthick;
233  } // End of loop over layers in a block
234  zi = zo;
235  laymin = laymax;
236  if (fabs(thickTot-layerThick_[i]) < 0.00001) {
237  } else if (thickTot > layerThick_[i]) {
238  edm::LogError("HGCalGeom") << "Thickness of the partition "
239  << layerThick_[i] << " is smaller than "
240  << thickTot << ": thickness of all its "
241  << "components **** ERROR ****";
242  } else if (thickTot < layerThick_[i]) {
243  edm::LogWarning("HGCalGeom") << "Thickness of the partition "
244  << layerThick_[i] << " does not match with "
245  << thickTot << " of the components";
246  }
247  } // End of loop over blocks
248 }
249 
250 double DDHGCalEEAlgo::rMax(double z) {
251  double r(0);
252 #ifdef EDM_ML_DEBUG
253  unsigned int ik(0);
254 #endif
255  for (unsigned int k=0; k<slopeT_.size(); ++k) {
256  if (z < zFront_[k]) break;
257  r = rMaxFront_[k] + (z - zFront_[k]) * slopeT_[k];
258 #ifdef EDM_ML_DEBUG
259  ik = k;
260 #endif
261  }
262 #ifdef EDM_ML_DEBUG
263  edm::LogVerbatim("HGCalGeom") << "DDHGCalEEAlgo:rMax : " << z << ":" << ik
264  << ":" << r;
265 #endif
266  return r;
267 }
268 
269 void DDHGCalEEAlgo::positionSensitive(const DDLogicalPart& glog, double rin,
270  double rout, int layertype,
271  DDCompactView& cpv) {
272  static const double sqrt3 = std::sqrt(3.0);
273  double r = 0.5*(waferSize_ + waferSepar_);
274  double R = 2.0*r/sqrt3;
275  double dy = 0.75*R;
276  int N = (int)(0.5*rout/r) + 2;
277  double xc[6], yc[6];
278 #ifdef EDM_ML_DEBUG
279  int ium(0), ivm(0), iumAll(0), ivmAll(0), kount(0), ntot(0), nin(0);
280  std::vector<int> ntype(6,0);
281  edm::LogVerbatim("HGCalGeom") << "DDHGCalEEAlgo: " << glog.ddname()
282  << " rout " << rout << " N "
283  << N << " for maximum u, v";
284 #endif
285  for (int u = -N; u <= N; ++u) {
286  int iu = std::abs(u);
287  for (int v = -N; v <= N; ++v) {
288  int iv = std::abs(v);
289  int nr = 2*v;
290  int nc =-2*u+v;
291  double xpos = nc*r;
292  double ypos = nr*dy;
293  xc[0] = xpos+r; yc[0] = ypos+0.5*R;
294  xc[1] = xpos; yc[1] = ypos+R;
295  xc[2] = xpos-r; yc[2] = ypos+0.5*R;
296  xc[3] = xpos-r; yc[3] = ypos-0.5*R;
297  xc[4] = xpos; yc[4] = ypos-R;
298  xc[5] = xpos+r; yc[5] = ypos-0.5*R;
299  bool cornerOne(false), cornerAll(true);
300  for (int k=0; k<6; ++k) {
301  double rpos = std::sqrt(xc[k]*xc[k]+yc[k]*yc[k]);
302  if (rpos >= rin && rpos <= rout) cornerOne = true;
303  else cornerAll = false;
304  }
305 #ifdef EDM_ML_DEBUG
306  ++ntot;
307 #endif
308  if (cornerOne) {
309  int copy = iv*100 + iu;
310  if (u < 0) copy += 10000;
311  if (v < 0) copy += 100000;
312 #ifdef EDM_ML_DEBUG
313  if (iu > ium) ium = iu;
314  if (iv > ivm) ivm = iv;
315  kount++;
316  if (copies_.count(copy) == 0) copies_.insert(copy);
317 #endif
318  if (cornerAll) {
319 #ifdef EDM_ML_DEBUG
320  if (iu > iumAll) iumAll = iu;
321  if (iv > ivmAll) ivmAll = iv;
322  ++nin;
323 #endif
324  double rpos = std::sqrt(xpos*xpos+ypos*ypos);
325  DDTranslation tran(xpos, ypos, 0.0);
327  int type = (rpos < rMaxFine_) ? 0 : ((rpos < rMinThick_) ? 1 : 2);
328  if (layertype > 1) type += 3;
330  DDSplit(wafers_[type]).second);
331  cpv.position(name, glog.ddname(), copy, tran, rotation);
332 #ifdef EDM_ML_DEBUG
333  ++ntype[type];
334  edm::LogVerbatim("HGCalGeom") << " DDHGCalEEAlgo: " << name
335  << " number " << copy
336  << " positioned in " << glog.ddname()
337  << " at " << tran
338  << " with " << rotation;
339 #endif
340  }
341  }
342  }
343  }
344 #ifdef EDM_ML_DEBUG
345  edm::LogVerbatim("HGCalGeom") << "DDHGCalEEAlgo: Maximum # of u " << ium
346  << ":" << iumAll << " # of v " << ivm << ":"
347  << ivmAll << " and " << nin << ":" << kount
348  << ":" << ntot << " wafers (" << ntype[0]
349  << ":" << ntype[1] << ":" << ntype[2] << ":"
350  << ntype[3] << ":" << ntype[4] << ":"
351  << ntype[5] << ") for " << glog.ddname()
352  << " R " << rin << ":" << rout;
353 #endif
354 }
type
Definition: HCALResponse.h:21
std::vector< double > slopeB_
Definition: DDHGCalEEAlgo.h:51
void execute(DDCompactView &cpv) override
~DDHGCalEEAlgo() override
float alpha
Definition: AMPTWrapper.h:95
std::unordered_set< int > copies_
Definition: DDHGCalEEAlgo.h:56
const N & name() const
Definition: DDBase.h:78
double rMaxFine_
Definition: DDHGCalEEAlgo.h:46
std::vector< double > thick_
Definition: DDHGCalEEAlgo.h:38
std::vector< double > layerThick_
Definition: DDHGCalEEAlgo.h:41
def copy(args, dbName)
DDMaterial is used to define and access material information.
Definition: DDMaterial.h:41
std::vector< int > copyNumber_
Definition: DDHGCalEEAlgo.h:39
std::vector< std::string > wafers_
Definition: DDHGCalEEAlgo.h:35
std::string nameSpace_
Definition: DDHGCalEEAlgo.h:55
DDName is used to identify DDD entities uniquely.
Definition: DDName.h:15
double waferSepar_
Definition: DDHGCalEEAlgo.h:49
static std::string & ns()
type of data representation of DDCompactView
Definition: DDCompactView.h:90
std::vector< double > slopeT_
Definition: DDHGCalEEAlgo.h:52
std::vector< int > layerSense_
Definition: DDHGCalEEAlgo.h:43
double rMax(double z)
A DDSolid represents the shape of a part.
Definition: DDSolid.h:38
ROOT::Math::DisplacementVector3D< ROOT::Math::Cartesian3D< double > > DDTranslation
Definition: DDTranslation.h:7
int nin
const Double_t pi
Represents a uniquely identifyable rotation matrix.
Definition: DDTransform.h:67
U second(std::pair< T, U > const &p)
std::vector< int > dbl_to_int(const std::vector< double > &vecdbl)
Converts a std::vector of doubles to a std::vector of int.
Definition: DDutils.h:7
std::vector< double > zFront_
Definition: DDHGCalEEAlgo.h:53
double rMinThick_
Definition: DDHGCalEEAlgo.h:47
T sqrt(T t)
Definition: SSEVec.h:18
Cos< T >::type cos(const T &t)
Definition: Cos.h:22
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
A DDLogicalPart aggregates information concerning material, solid and sensitveness ...
Definition: DDLogicalPart.h:92
void positionSensitive(const DDLogicalPart &glog, double rin, double rout, int layertype, DDCompactView &cpv)
std::vector< int > layerType_
Definition: DDHGCalEEAlgo.h:42
static DDSolid tubs(const DDName &name, double zhalf, double rIn, double rOut, double startPhi, double deltaPhi)
Definition: DDSolid.cc:986
ii
Definition: cuy.py:588
int k[5][pyjets_maxn]
double zMinBlock_
Definition: DDHGCalEEAlgo.h:45
std::vector< int > layers_
Definition: DDHGCalEEAlgo.h:40
std::vector< std::string > names_
Definition: DDHGCalEEAlgo.h:37
#define N
Definition: blowfish.cc:9
void position(const DDLogicalPart &self, const DDLogicalPart &parent, const std::string &copyno, const DDTranslation &trans, const DDRotation &rot, const DDDivision *div=0)
void initialize(const DDNumericArguments &nArgs, const DDVectorArguments &vArgs, const DDMapArguments &mArgs, const DDStringArguments &sArgs, const DDStringVectorArguments &vsArgs) override
std::pair< std::string, std::string > DDSplit(const std::string &n)
split into (name,namespace), separator = &#39;:&#39;
Definition: DDSplit.cc:3
std::vector< std::string > materials_
Definition: DDHGCalEEAlgo.h:36
std::vector< double > rMaxFront_
Definition: DDHGCalEEAlgo.h:54
Definition: vlib.h:208
static DDSolid polyhedra(const DDName &name, int sides, double startPhi, double deltaPhi, const std::vector< double > &z, const std::vector< double > &rmin, const std::vector< double > &rmax)
Creates a polyhedra (refere to Geant3 or Geant4 documentation)
Definition: DDSolid.cc:846
double waferSize_
Definition: DDHGCalEEAlgo.h:48
const N & ddname() const
Definition: DDBase.h:80
void constructLayers(const DDLogicalPart &, DDCompactView &cpv)