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  rad100to200_ = vArgs["rad100to200"];
91  rad200to300_ = vArgs["rad200to300"];
92  zMinRadPar_ = nArgs["zMinForRadPar"];
93  choiceType_ = (int)(nArgs["choiceType"]);
94  nCutRadPar_ = (int)(nArgs["nCornerCut"]);
95  fracAreaMin_ = nArgs["fracAreaMin"];
96  waferSize_ = nArgs["waferSize"];
97  waferSepar_ = nArgs["SensorSeparation"];
98  sectors_ = (int)(nArgs["Sectors"]);
99 #ifdef EDM_ML_DEBUG
100  edm::LogVerbatim("HGCalGeom") << "zStart " << zMinBlock_
101  << " radius for wafer type separation uses "
102  << rad100to200_.size() << " parameters; zmin "
103  << zMinRadPar_ << " cutoff " << choiceType_
104  << ":" << nCutRadPar_ << ":" << fracAreaMin_
105  << " wafer width " << waferSize_
106  << " separations " << waferSepar_
107  << " sectors " << sectors_;
108  for (unsigned int k=0; k<rad100to200_.size(); ++k)
109  edm::LogVerbatim("HGCalGeom") << "[" << k << "] 100-200 " <<rad100to200_[k]
110  << " 200-300 " << rad200to300_[k];
111 #endif
112  slopeB_ = vArgs["SlopeBottom"];
113  slopeT_ = vArgs["SlopeTop"];
114  zFront_ = vArgs["ZFront"];
115  rMaxFront_ = vArgs["RMaxFront"];
116 #ifdef EDM_ML_DEBUG
117  edm::LogVerbatim("HGCalGeom") << "Bottom slopes " << slopeB_[0] << ":"
118  << slopeB_[1] << " and " << slopeT_.size()
119  << " slopes for top" ;
120  for (unsigned int i=0; i<slopeT_.size(); ++i)
121  edm::LogVerbatim("HGCalGeom") << "Block [" << i << "] Zmin " << zFront_[i]
122  << " Rmax " << rMaxFront_[i] << " Slope "
123  << slopeT_[i];
124 #endif
126 #ifdef EDM_ML_DEBUG
127  edm::LogVerbatim("HGCalGeom") << "DDHGCalEEAlgo: NameSpace " << nameSpace_;
128 #endif
129 
130  waferType_ = std::make_unique<HGCalWaferType>(rad100to200_, rad200to300_,
134 }
135 
137 // DDHGCalEEAlgo methods...
139 
141 
142 #ifdef EDM_ML_DEBUG
143  edm::LogVerbatim("HGCalGeom") << "==>> Constructing DDHGCalEEAlgo...";
144  copies_.clear();
145 #endif
146  constructLayers (parent(), cpv);
147 #ifdef EDM_ML_DEBUG
148  edm::LogVerbatim("HGCalGeom") << "DDHGCalEEAlgo: " << copies_.size()
149  << " different wafer copy numbers";
150  int k(0);
151  for (std::unordered_set<int>::const_iterator itr=copies_.begin();
152  itr != copies_.end(); ++itr,++k) {
153  edm::LogVerbatim("HGCalGeom") << "Copy [" << k << "] : " << (*itr);
154  }
155  copies_.clear();
156  edm::LogVerbatim("HGCalGeom") << "<<== End of DDHGCalEEAlgo construction...";
157 #endif
158 }
159 
161  DDCompactView& cpv) {
162 
163 #ifdef EDM_ML_DEBUG
164  edm::LogVerbatim("HGCalGeom") << "DDHGCalEEAlgo: \t\tInside Layers";
165 #endif
166  double zi(zMinBlock_);
167  int laymin(0);
168  const double tol(0.01);
169  for (unsigned int i=0; i<layers_.size(); i++) {
170  double zo = zi + layerThick_[i];
171  double routF = rMax(zi);
172  int laymax = laymin+layers_[i];
173  double zz = zi;
174  double thickTot(0);
175  std::vector<double> pgonZ(2), pgonRin(2), pgonRout(2);
176  for (int ly=laymin; ly<laymax; ++ly) {
177  int ii = layerType_[ly];
178  int copy = copyNumber_[ii];
179  double hthick = 0.5*thick_[ii];
180  double rinB = (layerSense_[ly] == 0) ? (zo*slopeB_[0]) :
181  (zo*slopeB_[1]);
182  zz += hthick;
183  thickTot += thick_[ii];
184 
185  std::string name = "HGCal"+names_[ii]+std::to_string(copy);
186 #ifdef EDM_ML_DEBUG
187  edm::LogVerbatim("HGCalGeom") << "DDHGCalEEAlgo: Layer " << ly << ":"
188  << ii << " Front " << zi << ", " << routF
189  << " Back " << zo << ", " << rinB
190  << " superlayer thickness "
191  << layerThick_[i];
192 #endif
193  DDName matName(DDSplit(materials_[ii]).first,
194  DDSplit(materials_[ii]).second);
195  DDMaterial matter(matName);
196  DDLogicalPart glog;
197  if (layerSense_[ly] == 0) {
198  double alpha = CLHEP::pi/sectors_;
199  double rmax = routF*cos(alpha) - tol;
200  pgonZ[0] =-hthick; pgonZ[1] = hthick;
201  pgonRin[0] = rinB; pgonRin[1] = rinB;
202  pgonRout[0] = rmax; pgonRout[1] = rmax;
204  sectors_,-alpha,CLHEP::twopi,
205  pgonZ, pgonRin, pgonRout);
206  glog = DDLogicalPart(solid.ddname(), matter, solid);
207 #ifdef EDM_ML_DEBUG
208  edm::LogVerbatim("HGCalGeom") << "DDHGCalEEAlgo: " << solid.name()
209  << " polyhedra of " << sectors_
210  << " sectors covering "
211  << -alpha/CLHEP::deg << ":"
212  << (-alpha+CLHEP::twopi)/CLHEP::deg
213  << " with " << pgonZ.size()
214  << " sections and filled with "
215  << matName << ":" << &matter;
216  for (unsigned int k=0; k<pgonZ.size(); ++k)
217  edm::LogVerbatim("HGCalGeom") << "[" << k << "] z " << pgonZ[k]
218  << " R " << pgonRin[k] << ":"
219  << pgonRout[k];
220 #endif
221  } else {
223  hthick, rinB, routF, 0.0,
224  CLHEP::twopi);
225  glog = DDLogicalPart(solid.ddname(), matter, solid);
226 #ifdef EDM_ML_DEBUG
227  edm::LogVerbatim("HGCalGeom") << "DDHGCalEEAlgo: " << solid.name()
228  << " Tubs made of " << matName << ":"
229  << &matter << " of dimensions " << rinB
230  << ", " << routF << ", " << hthick
231  << ", 0.0, " << CLHEP::twopi/CLHEP::deg
232  << " and position " << glog.name()
233  << " number " << copy;
234 #endif
235  positionSensitive(glog,rinB,routF,zz,layerSense_[ly],cpv);
236  }
237  DDTranslation r1(0,0,zz);
238  DDRotation rot;
239  cpv.position(glog, module, copy, r1, rot);
240  ++copyNumber_[ii];
241 #ifdef EDM_ML_DEBUG
242  edm::LogVerbatim("HGCalGeom") << "DDHGCalEEAlgo: " << glog.name()
243  << " number " << copy << " positioned in "
244  << module.name() << " at " << r1
245  << " with " << rot;
246 #endif
247  zz += hthick;
248  } // End of loop over layers in a block
249  zi = zo;
250  laymin = laymax;
251  if (std::abs(thickTot-layerThick_[i]) < 0.00001) {
252  } else if (thickTot > layerThick_[i]) {
253  edm::LogError("HGCalGeom") << "Thickness of the partition "
254  << layerThick_[i] << " is smaller than "
255  << thickTot << ": thickness of all its "
256  << "components **** ERROR ****";
257  } else if (thickTot < layerThick_[i]) {
258  edm::LogWarning("HGCalGeom") << "Thickness of the partition "
259  << layerThick_[i] << " does not match with "
260  << thickTot << " of the components";
261  }
262  } // End of loop over blocks
263 }
264 
265 double DDHGCalEEAlgo::rMax(double z) {
266  double r(0);
267 #ifdef EDM_ML_DEBUG
268  unsigned int ik(0);
269 #endif
270  for (unsigned int k=0; k<slopeT_.size(); ++k) {
271  if (z < zFront_[k]) break;
272  r = rMaxFront_[k] + (z - zFront_[k]) * slopeT_[k];
273 #ifdef EDM_ML_DEBUG
274  ik = k;
275 #endif
276  }
277 #ifdef EDM_ML_DEBUG
278  edm::LogVerbatim("HGCalGeom") << "DDHGCalEEAlgo:rMax : " << z << ":" << ik
279  << ":" << r;
280 #endif
281  return r;
282 }
283 
284 void DDHGCalEEAlgo::positionSensitive(const DDLogicalPart& glog, double rin,
285  double rout, double zpos, int layertype,
286  DDCompactView& cpv) {
287  static const double sqrt3 = std::sqrt(3.0);
288  double r = 0.5*(waferSize_ + waferSepar_);
289  double R = 2.0*r/sqrt3;
290  double dy = 0.75*R;
291  int N = (int)(0.5*rout/r) + 2;
292  double xc[6], yc[6];
293 #ifdef EDM_ML_DEBUG
294  int ium(0), ivm(0), iumAll(0), ivmAll(0), kount(0), ntot(0), nin(0);
295  std::vector<int> ntype(6,0);
296  edm::LogVerbatim("HGCalGeom") << "DDHGCalEEAlgo: " << glog.ddname()
297  << " rout " << rout << " N "
298  << N << " for maximum u, v";
299 #endif
300  for (int u = -N; u <= N; ++u) {
301  int iu = std::abs(u);
302  for (int v = -N; v <= N; ++v) {
303  int iv = std::abs(v);
304  int nr = 2*v;
305  int nc =-2*u+v;
306  double xpos = nc*r;
307  double ypos = nr*dy;
308  xc[0] = xpos+r; yc[0] = ypos+0.5*R;
309  xc[1] = xpos; yc[1] = ypos+R;
310  xc[2] = xpos-r; yc[2] = ypos+0.5*R;
311  xc[3] = xpos-r; yc[3] = ypos-0.5*R;
312  xc[4] = xpos; yc[4] = ypos-R;
313  xc[5] = xpos+r; yc[5] = ypos-0.5*R;
314  bool cornerOne(false), cornerAll(true);
315  for (int k=0; k<6; ++k) {
316  double rpos = std::sqrt(xc[k]*xc[k]+yc[k]*yc[k]);
317  if (rpos >= rin && rpos <= rout) cornerOne = true;
318  else cornerAll = false;
319  }
320 #ifdef EDM_ML_DEBUG
321  ++ntot;
322 #endif
323  if (cornerOne) {
324  int type = waferType_->getType(xpos,ypos,zpos);
325  int copy = type*1000000 + iv*100 + iu;
326  if (u < 0) copy += 10000;
327  if (v < 0) copy += 100000;
328 #ifdef EDM_ML_DEBUG
329  if (iu > ium) ium = iu;
330  if (iv > ivm) ivm = iv;
331  kount++;
332  if (copies_.count(copy) == 0) copies_.insert(copy);
333 #endif
334  if (cornerAll) {
335 #ifdef EDM_ML_DEBUG
336  if (iu > iumAll) iumAll = iu;
337  if (iv > ivmAll) ivmAll = iv;
338  ++nin;
339 #endif
340  DDTranslation tran(xpos, ypos, 0.0);
342  if (layertype > 1) type += 3;
344  DDSplit(wafers_[type]).second);
345  cpv.position(name, glog.ddname(), copy, tran, rotation);
346 #ifdef EDM_ML_DEBUG
347  ++ntype[type];
348  edm::LogVerbatim("HGCalGeom") << " DDHGCalEEAlgo: " << name
349  << " number " << copy
350  << " positioned in " << glog.ddname()
351  << " at " << tran
352  << " with " << rotation;
353 #endif
354  }
355  }
356  }
357  }
358 #ifdef EDM_ML_DEBUG
359  edm::LogVerbatim("HGCalGeom") << "DDHGCalEEAlgo: Maximum # of u " << ium
360  << ":" << iumAll << " # of v " << ivm << ":"
361  << ivmAll << " and " << nin << ":" << kount
362  << ":" << ntot << " wafers (" << ntype[0]
363  << ":" << ntype[1] << ":" << ntype[2] << ":"
364  << ntype[3] << ":" << ntype[4] << ":"
365  << ntype[5] << ") for " << glog.ddname()
366  << " R " << rin << ":" << rout;
367 #endif
368 }
type
Definition: HCALResponse.h:21
std::vector< double > slopeB_
Definition: DDHGCalEEAlgo.h:61
void execute(DDCompactView &cpv) override
~DDHGCalEEAlgo() override
float alpha
Definition: AMPTWrapper.h:95
std::unordered_set< int > copies_
Definition: DDHGCalEEAlgo.h:66
const N & name() const
Definition: DDBase.h:78
std::vector< double > thick_
Definition: DDHGCalEEAlgo.h:44
std::vector< double > layerThick_
Definition: DDHGCalEEAlgo.h:47
def copy(args, dbName)
double fracAreaMin_
Definition: DDHGCalEEAlgo.h:57
DDMaterial is used to define and access material information.
Definition: DDMaterial.h:41
std::vector< int > copyNumber_
Definition: DDHGCalEEAlgo.h:45
std::vector< std::string > wafers_
Definition: DDHGCalEEAlgo.h:41
std::string nameSpace_
Definition: DDHGCalEEAlgo.h:65
DDName is used to identify DDD entities uniquely.
Definition: DDName.h:15
double waferSepar_
Definition: DDHGCalEEAlgo.h:59
static std::string & ns()
Compact representation of the geometrical detector hierarchy.
Definition: DDCompactView.h:83
std::vector< double > slopeT_
Definition: DDHGCalEEAlgo.h:62
std::vector< int > layerSense_
Definition: DDHGCalEEAlgo.h:49
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:63
double zMinRadPar_
Definition: DDHGCalEEAlgo.h:54
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
std::vector< int > layerType_
Definition: DDHGCalEEAlgo.h:48
static DDSolid tubs(const DDName &name, double zhalf, double rIn, double rOut, double startPhi, double deltaPhi)
Definition: DDSolid.cc:863
std::vector< double > rad100to200_
Definition: DDHGCalEEAlgo.h:52
ii
Definition: cuy.py:589
int k[5][pyjets_maxn]
double zMinBlock_
Definition: DDHGCalEEAlgo.h:51
std::unique_ptr< HGCalWaferType > waferType_
Definition: DDHGCalEEAlgo.h:39
std::vector< int > layers_
Definition: DDHGCalEEAlgo.h:46
std::vector< std::string > names_
Definition: DDHGCalEEAlgo.h:43
#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 positionSensitive(const DDLogicalPart &glog, double rin, double rout, double zpos, int layertype, DDCompactView &cpv)
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:42
std::vector< double > rMaxFront_
Definition: DDHGCalEEAlgo.h:64
std::vector< double > rad200to300_
Definition: DDHGCalEEAlgo.h:53
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:732
double waferSize_
Definition: DDHGCalEEAlgo.h:58
const N & ddname() const
Definition: DDBase.h:80
void constructLayers(const DDLogicalPart &, DDCompactView &cpv)