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 
14 #include "CLHEP/Units/GlobalPhysicalConstants.h"
15 #include "CLHEP/Units/GlobalSystemOfUnits.h"
16 
17 //#define EDM_ML_DEBUG
18 
20 #ifdef EDM_ML_DEBUG
21  edm::LogVerbatim("HGCalGeom") << "DDHGCalEEAlgo: Creating an instance";
22 #endif
23 }
24 
26 
28  const DDVectorArguments & vArgs,
29  const DDMapArguments & ,
30  const DDStringArguments & sArgs,
31  const DDStringVectorArguments &vsArgs) {
32 
33  wafers_ = vsArgs["WaferNames"];
34 #ifdef EDM_ML_DEBUG
35  edm::LogVerbatim("HGCalGeom") << "DDHGCalEEAlgo: " << wafers_.size()
36  << " wafers";
37  for (unsigned int i=0; i<wafers_.size(); ++i)
38  edm::LogVerbatim("HGCalGeom") << "Wafer[" << i << "] " << wafers_[i];
39 #endif
40  materials_ = vsArgs["MaterialNames"];
41  names_ = vsArgs["VolumeNames"];
42  thick_ = vArgs["Thickness"];
43  for (unsigned int i=0; i<materials_.size(); ++i) {
44  copyNumber_.emplace_back(1);
45  }
46 #ifdef EDM_ML_DEBUG
47  edm::LogVerbatim("HGCalGeom") << "DDHGCalEEAlgo: " << materials_.size()
48  << " types of volumes";
49  for (unsigned int i=0; i<names_.size(); ++i)
50  edm::LogVerbatim("HGCalGeom") << "Volume [" << i << "] " << names_[i]
51  << " of thickness " << thick_[i]
52  << " filled with " << materials_[i]
53  << " first copy number " << copyNumber_[i];
54 #endif
55  layers_ = dbl_to_int(vArgs["Layers"]);
56  layerThick_ = vArgs["LayerThick"];
57 #ifdef EDM_ML_DEBUG
58  edm::LogVerbatim("HGCalGeom") << "There are " << layers_.size() << " blocks";
59  for (unsigned int i=0; i<layers_.size(); ++i)
60  edm::LogVerbatim("HGCalGeom") << "Block [" << i << "] of thickness "
61  << layerThick_[i]
62  << " with " << layers_[i] << " layers";
63 #endif
64  layerType_ = dbl_to_int(vArgs["LayerType"]);
65  layerSense_ = dbl_to_int(vArgs["LayerSense"]);
66  firstLayer_ = (int)(nArgs["FirstLayer"]);
67  if (firstLayer_ > 0) {
68  for (unsigned int i=0; i<layerType_.size(); ++i) {
69  if (layerSense_[i] != 0) {
70  int ii = layerType_[i];
71  copyNumber_[ii] = firstLayer_;
72 #ifdef EDM_ML_DEBUG
73  edm::LogVerbatim("HGCalGeom") << "First copy number for layer type "
74  << i << ":" << ii << " with "
75  << materials_[ii] << " changed to "
76  << copyNumber_[ii];
77 #endif
78  break;
79  }
80  }
81  }
82 #ifdef EDM_ML_DEBUG
83  edm::LogVerbatim("HGCalGeom") << "There are " << layerType_.size()
84  << " layers" ;
85  for (unsigned int i=0; i<layerType_.size(); ++i)
86  edm::LogVerbatim("HGCalGeom") << "Layer [" << i << "] with material type "
87  << layerType_[i] << " sensitive class "
88  << layerSense_[i];
89 #endif
90  zMinBlock_ = nArgs["zMinBlock"];
91  rad100to200_ = vArgs["rad100to200"];
92  rad200to300_ = vArgs["rad200to300"];
93  zMinRadPar_ = nArgs["zMinForRadPar"];
94  choiceType_ = (int)(nArgs["choiceType"]);
95  nCutRadPar_ = (int)(nArgs["nCornerCut"]);
96  fracAreaMin_ = nArgs["fracAreaMin"];
97  waferSize_ = nArgs["waferSize"];
98  waferSepar_ = nArgs["SensorSeparation"];
99  sectors_ = (int)(nArgs["Sectors"]);
100 #ifdef EDM_ML_DEBUG
101  edm::LogVerbatim("HGCalGeom") << "zStart " << zMinBlock_
102  << " radius for wafer type separation uses "
103  << rad100to200_.size() << " parameters; zmin "
104  << zMinRadPar_ << " cutoff " << choiceType_
105  << ":" << nCutRadPar_ << ":" << fracAreaMin_
106  << " wafer width " << waferSize_
107  << " separations " << waferSepar_
108  << " sectors " << sectors_;
109  for (unsigned int k=0; k<rad100to200_.size(); ++k)
110  edm::LogVerbatim("HGCalGeom") << "[" << k << "] 100-200 " <<rad100to200_[k]
111  << " 200-300 " << rad200to300_[k];
112 #endif
113  slopeB_ = vArgs["SlopeBottom"];
114  zFrontB_ = vArgs["ZFrontBottom"];
115  rMinFront_ = vArgs["RMinFront"];
116  slopeT_ = vArgs["SlopeTop"];
117  zFrontT_ = vArgs["ZFrontTop"];
118  rMaxFront_ = vArgs["RMaxFront"];
119 #ifdef EDM_ML_DEBUG
120  for (unsigned int i=0; i<slopeB_.size(); ++i)
121  edm::LogVerbatim("HGCalGeom") << "Block [" << i << "] Zmin " << zFrontB_[i]
122  << " Rmin " << rMinFront_[i] << " Slope "
123  << slopeB_[i];
124  for (unsigned int i=0; i<slopeT_.size(); ++i)
125  edm::LogVerbatim("HGCalGeom") << "Block [" << i << "] Zmin " << zFrontT_[i]
126  << " Rmax " << rMaxFront_[i] << " Slope "
127  << slopeT_[i];
128 #endif
130 #ifdef EDM_ML_DEBUG
131  edm::LogVerbatim("HGCalGeom") << "DDHGCalEEAlgo: NameSpace " << nameSpace_;
132 #endif
133 
134  waferType_ = std::make_unique<HGCalWaferType>(rad100to200_, rad200to300_,
138 }
139 
141 // DDHGCalEEAlgo methods...
143 
145 
146 #ifdef EDM_ML_DEBUG
147  edm::LogVerbatim("HGCalGeom") << "==>> Constructing DDHGCalEEAlgo...";
148  copies_.clear();
149 #endif
150  constructLayers (parent(), cpv);
151 #ifdef EDM_ML_DEBUG
152  edm::LogVerbatim("HGCalGeom") << "DDHGCalEEAlgo: " << copies_.size()
153  << " different wafer copy numbers";
154  int k(0);
155  for (std::unordered_set<int>::const_iterator itr=copies_.begin();
156  itr != copies_.end(); ++itr,++k) {
157  edm::LogVerbatim("HGCalGeom") << "Copy [" << k << "] : " << (*itr);
158  }
159  copies_.clear();
160  edm::LogVerbatim("HGCalGeom") << "<<== End of DDHGCalEEAlgo construction...";
161 #endif
162 }
163 
165  DDCompactView& cpv) {
166 
167 #ifdef EDM_ML_DEBUG
168  edm::LogVerbatim("HGCalGeom") << "DDHGCalEEAlgo: \t\tInside Layers";
169 #endif
170  double zi(zMinBlock_);
171  int laymin(0);
172  const double tol(0.01);
173  for (unsigned int i=0; i<layers_.size(); i++) {
174  double zo = zi + layerThick_[i];
176  int laymax = laymin+layers_[i];
177  double zz = zi;
178  double thickTot(0);
179  std::vector<double> pgonZ(2), pgonRin(2), pgonRout(2);
180  for (int ly=laymin; ly<laymax; ++ly) {
181  int ii = layerType_[ly];
182  int copy = copyNumber_[ii];
183  double hthick = 0.5*thick_[ii];
185  zz += hthick;
186  thickTot += thick_[ii];
187 
188  std::string name = names_[ii]+std::to_string(copy);
189 #ifdef EDM_ML_DEBUG
190  edm::LogVerbatim("HGCalGeom") << "DDHGCalEEAlgo: Layer " << ly << ":"
191  << ii << " Front " << zi << ", " << routF
192  << " Back " << zo << ", " << rinB
193  << " superlayer thickness "
194  << layerThick_[i];
195 #endif
196  DDName matName(DDSplit(materials_[ii]).first,
197  DDSplit(materials_[ii]).second);
198  DDMaterial matter(matName);
199  DDLogicalPart glog;
200  if (layerSense_[ly] == 0) {
201  double alpha = CLHEP::pi/sectors_;
202  double rmax = routF*cos(alpha) - tol;
203  pgonZ[0] =-hthick; pgonZ[1] = hthick;
204  pgonRin[0] = rinB; pgonRin[1] = rinB;
205  pgonRout[0] = rmax; pgonRout[1] = rmax;
207  sectors_,-alpha,CLHEP::twopi,
208  pgonZ, pgonRin, pgonRout);
209  glog = DDLogicalPart(solid.ddname(), matter, solid);
210 #ifdef EDM_ML_DEBUG
211  edm::LogVerbatim("HGCalGeom") << "DDHGCalEEAlgo: " << solid.name()
212  << " polyhedra of " << sectors_
213  << " sectors covering "
214  << -alpha/CLHEP::deg << ":"
215  << (-alpha+CLHEP::twopi)/CLHEP::deg
216  << " with " << pgonZ.size()
217  << " sections and filled with "
218  << matName << ":" << &matter;
219  for (unsigned int k=0; k<pgonZ.size(); ++k)
220  edm::LogVerbatim("HGCalGeom") << "[" << k << "] z " << pgonZ[k]
221  << " R " << pgonRin[k] << ":"
222  << pgonRout[k];
223 #endif
224  } else {
226  hthick, rinB, routF, 0.0,
227  CLHEP::twopi);
228  glog = DDLogicalPart(solid.ddname(), matter, solid);
229 #ifdef EDM_ML_DEBUG
230  edm::LogVerbatim("HGCalGeom") << "DDHGCalEEAlgo: " << solid.name()
231  << " Tubs made of " << matName << ":"
232  << &matter << " of dimensions " << rinB
233  << ", " << routF << ", " << hthick
234  << ", 0.0, " << CLHEP::twopi/CLHEP::deg
235  << " and position " << glog.name()
236  << " number " << copy;
237 #endif
238  positionSensitive(glog,rinB,routF,zz,layerSense_[ly],cpv);
239  }
240  DDTranslation r1(0,0,zz);
241  DDRotation rot;
242  cpv.position(glog, module, copy, r1, rot);
243  ++copyNumber_[ii];
244 #ifdef EDM_ML_DEBUG
245  edm::LogVerbatim("HGCalGeom") << "DDHGCalEEAlgo: " << glog.name()
246  << " number " << copy << " positioned in "
247  << module.name() << " at " << r1
248  << " with " << rot;
249 #endif
250  zz += hthick;
251  } // End of loop over layers in a block
252  zi = zo;
253  laymin = laymax;
254  if (std::abs(thickTot-layerThick_[i]) < 0.00001) {
255  } else if (thickTot > layerThick_[i]) {
256  edm::LogError("HGCalGeom") << "Thickness of the partition "
257  << layerThick_[i] << " is smaller than "
258  << thickTot << ": thickness of all its "
259  << "components **** ERROR ****";
260  } else if (thickTot < layerThick_[i]) {
261  edm::LogWarning("HGCalGeom") << "Thickness of the partition "
262  << layerThick_[i] << " does not match with "
263  << thickTot << " of the components";
264  }
265  } // End of loop over blocks
266 }
267 
268 void DDHGCalEEAlgo::positionSensitive(const DDLogicalPart& glog, double rin,
269  double rout, double zpos, int layertype,
270  DDCompactView& cpv) {
271  static const double sqrt3 = std::sqrt(3.0);
272  double r = 0.5*(waferSize_ + waferSepar_);
273  double R = 2.0*r/sqrt3;
274  double dy = 0.75*R;
275  int N = (int)(0.5*rout/r) + 2;
276  double xc[6], yc[6];
277 #ifdef EDM_ML_DEBUG
278  int ium(0), ivm(0), iumAll(0), ivmAll(0), kount(0), ntot(0), nin(0);
279  std::vector<int> ntype(6,0);
280  edm::LogVerbatim("HGCalGeom") << "DDHGCalEEAlgo: " << glog.ddname()
281  << " rout " << rout << " N "
282  << N << " for maximum u, v";
283 #endif
284  for (int u = -N; u <= N; ++u) {
285  int iu = std::abs(u);
286  for (int v = -N; v <= N; ++v) {
287  int iv = std::abs(v);
288  int nr = 2*v;
289  int nc =-2*u+v;
290  double xpos = nc*r;
291  double ypos = nr*dy;
292  xc[0] = xpos+r; yc[0] = ypos+0.5*R;
293  xc[1] = xpos; yc[1] = ypos+R;
294  xc[2] = xpos-r; yc[2] = ypos+0.5*R;
295  xc[3] = xpos-r; yc[3] = ypos-0.5*R;
296  xc[4] = xpos; yc[4] = ypos-R;
297  xc[5] = xpos+r; yc[5] = ypos-0.5*R;
298  bool cornerOne(false), cornerAll(true);
299  for (int k=0; k<6; ++k) {
300  double rpos = std::sqrt(xc[k]*xc[k]+yc[k]*yc[k]);
301  if (rpos >= rin && rpos <= rout) cornerOne = true;
302  else cornerAll = false;
303  }
304 #ifdef EDM_ML_DEBUG
305  ++ntot;
306 #endif
307  if (cornerOne) {
308  int type = waferType_->getType(xpos,ypos,zpos);
309  int copy = type*1000000 + 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  DDTranslation tran(xpos, ypos, 0.0);
326  if (layertype > 1) type += 3;
328  DDSplit(wafers_[type]).second);
329  cpv.position(name, glog.ddname(), copy, tran, rotation);
330 #ifdef EDM_ML_DEBUG
331  ++ntype[type];
332  edm::LogVerbatim("HGCalGeom") << " DDHGCalEEAlgo: " << name
333  << " number " << copy
334  << " positioned in " << glog.ddname()
335  << " at " << tran
336  << " with " << rotation;
337 #endif
338  }
339  }
340  }
341  }
342 #ifdef EDM_ML_DEBUG
343  edm::LogVerbatim("HGCalGeom") << "DDHGCalEEAlgo: Maximum # of u " << ium
344  << ":" << iumAll << " # of v " << ivm << ":"
345  << ivmAll << " and " << nin << ":" << kount
346  << ":" << ntot << " wafers (" << ntype[0]
347  << ":" << ntype[1] << ":" << ntype[2] << ":"
348  << ntype[3] << ":" << ntype[4] << ":"
349  << ntype[5] << ") for " << glog.ddname()
350  << " R " << rin << ":" << rout;
351 #endif
352 }
type
Definition: HCALResponse.h:21
std::vector< double > slopeB_
Definition: DDHGCalEEAlgo.h:60
void execute(DDCompactView &cpv) override
~DDHGCalEEAlgo() override
float alpha
Definition: AMPTWrapper.h:95
std::unordered_set< int > copies_
Definition: DDHGCalEEAlgo.h:67
const N & name() const
Definition: DDBase.h:74
std::vector< double > zFrontT_
Definition: DDHGCalEEAlgo.h:64
std::vector< double > thick_
Definition: DDHGCalEEAlgo.h:43
std::vector< double > layerThick_
Definition: DDHGCalEEAlgo.h:46
def copy(args, dbName)
double fracAreaMin_
Definition: DDHGCalEEAlgo.h:56
static double radius(double z, std::vector< double > const &zFront, std::vector< double > const &rFront, std::vector< double > const &slope)
DDMaterial is used to define and access material information.
Definition: DDMaterial.h:43
std::vector< int > copyNumber_
Definition: DDHGCalEEAlgo.h:44
std::vector< double > zFrontB_
Definition: DDHGCalEEAlgo.h:61
std::vector< std::string > wafers_
Definition: DDHGCalEEAlgo.h:40
std::string nameSpace_
Definition: DDHGCalEEAlgo.h:66
DDName is used to identify DDD entities uniquely.
Definition: DDName.h:15
double waferSepar_
Definition: DDHGCalEEAlgo.h:58
static std::string & ns()
Compact representation of the geometrical detector hierarchy.
Definition: DDCompactView.h:80
std::vector< double > slopeT_
Definition: DDHGCalEEAlgo.h:63
std::vector< int > layerSense_
Definition: DDHGCalEEAlgo.h:48
A DDSolid represents the shape of a part.
Definition: DDSolid.h:39
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:68
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
double zMinRadPar_
Definition: DDHGCalEEAlgo.h:53
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:93
std::vector< int > layerType_
Definition: DDHGCalEEAlgo.h:47
static DDSolid tubs(const DDName &name, double zhalf, double rIn, double rOut, double startPhi, double deltaPhi)
Definition: DDSolid.cc:865
std::vector< double > rad100to200_
Definition: DDHGCalEEAlgo.h:51
ii
Definition: cuy.py:590
int k[5][pyjets_maxn]
double zMinBlock_
Definition: DDHGCalEEAlgo.h:50
std::unique_ptr< HGCalWaferType > waferType_
Definition: DDHGCalEEAlgo.h:38
std::vector< int > layers_
Definition: DDHGCalEEAlgo.h:45
std::vector< std::string > names_
Definition: DDHGCalEEAlgo.h:42
#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)
std::vector< double > rMinFront_
Definition: DDHGCalEEAlgo.h:62
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:41
std::vector< double > rMaxFront_
Definition: DDHGCalEEAlgo.h:65
std::vector< double > rad200to300_
Definition: DDHGCalEEAlgo.h:52
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:730
double waferSize_
Definition: DDHGCalEEAlgo.h:57
const N & ddname() const
Definition: DDBase.h:76
void constructLayers(const DDLogicalPart &, DDCompactView &cpv)