CMS 3D CMS Logo

DDHGCalModuleAlgo.cc
Go to the documentation of this file.
1 /*
2  * DDHGCalModuleAlgo.cc
3  *
4  * Created on: 27-August-2019
5  * Author: Sunanda Banerjee
6  */
7 
9 #include "DD4hep/DetFactoryHelper.h"
16 
17 //#define EDM_ML_DEBUG
18 
19 #ifdef EDM_ML_DEBUG
20 #include <unordered_set>
21 #endif
22 using namespace cms_units::operators;
23 
24 static long algorithm(dd4hep::Detector& /* description */, cms::DDParsingContext& ctxt, xml_h e) {
25  cms::DDNamespace ns(ctxt, e, true);
27  static constexpr double tol = 0.01;
28  static constexpr double tol2 = 0.00001;
29 
30  const auto& wafer = args.value<std::vector<std::string> >("WaferName"); // Wafers
31  auto materials = args.value<std::vector<std::string> >("MaterialNames"); // Materials
32  const auto& names = args.value<std::vector<std::string> >("VolumeNames"); // Names
33  const auto& thick = args.value<std::vector<double> >("Thickness"); // Thickness of the material
34  std::vector<int> copyNumber; // Initial copy numbers
35  for (unsigned int i = 0; i < materials.size(); ++i) {
36  if (materials[i] == "materials:M_NEMAFR4plate")
37  materials[i] = "materials:M_NEMA FR4 plate";
38  copyNumber.emplace_back(1);
39  }
40 #ifdef EDM_ML_DEBUG
41  edm::LogVerbatim("HGCalGeom") << "DDHGCalModule: " << wafer.size() << " wafers";
42  for (unsigned int i = 0; i < wafer.size(); ++i)
43  edm::LogVerbatim("HGCalGeom") << "Wafer[" << i << "] " << wafer[i];
44  edm::LogVerbatim("HGCalGeom") << "DDHGCalModule: " << materials.size() << " types of volumes";
45  for (unsigned int i = 0; i < names.size(); ++i)
46  edm::LogVerbatim("HGCalGeom") << "Volume [" << i << "] " << names[i] << " of thickness " << thick[i]
47  << " filled with " << materials[i] << " first copy number " << copyNumber[i];
48 #endif
49  const auto& layers = args.value<std::vector<int> >("Layers"); // Number of layers in a section
50  const auto& layerThick = args.value<std::vector<double> >("LayerThick"); // Thickness of each section
51  const auto& layerType = args.value<std::vector<int> >("LayerType"); // Type of the layer
52  const auto& layerSense = args.value<std::vector<int> >("LayerSense"); // Content of a layer (sensitive?)
53 #ifdef EDM_ML_DEBUG
54  edm::LogVerbatim("HGCalGeom") << "DDHGCalModule: " << layers.size() << " blocks";
55  for (unsigned int i = 0; i < layers.size(); ++i)
56  edm::LogVerbatim("HGCalGeom") << "Block [" << i << "] of thickness " << layerThick[i] << " with " << layers[i]
57  << " layers";
58  edm::LogVerbatim("HGCalGeom") << "DDHGCalModule: " << layerType.size() << " layers";
59  for (unsigned int i = 0; i < layerType.size(); ++i)
60  edm::LogVerbatim("HGCalGeom") << "Layer [" << i << "] with material type " << layerType[i] << " sensitive class "
61  << layerSense[i];
62 #endif
63  double zMinBlock = args.value<double>("zMinBlock"); // Starting z-value of the block
64  double rMaxFine = args.value<double>("rMaxFine"); // Maximum r-value for fine wafer
65  double waferW = args.value<double>("waferW"); // Width of the wafer
66  double waferGap = args.value<double>("waferGap"); // Gap between 2 wafers
67  int sectors = args.value<int>("Sectors"); // Sectors
68 #ifdef EDM_ML_DEBUG
69  edm::LogVerbatim("HGCalGeom") << "DDHGCalModule: zStart " << zMinBlock << " rFineCoarse " << rMaxFine
70  << " wafer width " << waferW << waferW << " gap among wafers " << waferGap
71  << " sectors " << sectors;
72 #endif
73  const auto& slopeB = args.value<std::vector<double> >("SlopeBottom"); // Slope at the lower R
74  const auto& slopeT = args.value<std::vector<double> >("SlopeTop"); // Slopes at the larger R
75  const auto& zFront = args.value<std::vector<double> >("ZFront"); // Starting Z values for the slopes
76  const auto& rMaxFront = args.value<std::vector<double> >("RMaxFront"); // Corresponding rMax's
77 #ifdef EDM_ML_DEBUG
78  edm::LogVerbatim("HGCalGeom") << "DDHGCalModule: Bottom slopes " << slopeB[0] << ":" << slopeB[1] << " and "
79  << slopeT.size() << " slopes for top";
80  for (unsigned int i = 0; i < slopeT.size(); ++i)
81  edm::LogVerbatim("HGCalGeom") << "Block [" << i << "] Zmin " << zFront[i] << " Rmax " << rMaxFront[i] << " Slope "
82  << slopeT[i];
83 #endif
84  std::string idNameSpace = static_cast<std::string>(ns.name()); // Namespace of this and ALL sub-parts
85  const auto& idName = args.parentName(); // Name of the "parent" volume.
86 #ifdef EDM_ML_DEBUG
87  std::unordered_set<int> copies; // List of copy #'s
88  edm::LogVerbatim("HGCalGeom") << "DDHGCalModule: NameSpace " << idNameSpace << " Mother " << idName;
89 #endif
90 
91  // Mother module
92  dd4hep::Volume module = ns.volume(idName);
93 
94  double zi(zMinBlock);
95  int laymin(0);
96  for (unsigned int i = 0; i < layers.size(); i++) {
97  double zo = zi + layerThick[i];
98  double routF = HGCalGeomTools::radius(zi, zFront, rMaxFront, slopeT);
99  int laymax = laymin + layers[i];
100  double zz = zi;
101  double thickTot(0);
102  for (int ly = laymin; ly < laymax; ++ly) {
103  int ii = layerType[ly];
104  int copy = copyNumber[ii];
105  double rinB = (layerSense[ly] == 0) ? (zo * slopeB[0]) : (zo * slopeB[1]);
106  zz += (0.5 * thick[ii]);
107  thickTot += thick[ii];
108 
109  std::string name = "HGCal" + names[ii] + std::to_string(copy);
110 #ifdef EDM_ML_DEBUG
111  edm::LogVerbatim("HGCalGeom") << "DDHGCalModule: Layer " << ly << ":" << ii << " Front " << zi << ", " << routF
112  << " Back " << zo << ", " << rinB << " superlayer thickness " << layerThick[i];
113 #endif
114  dd4hep::Material matter = ns.material(materials[ii]);
115  dd4hep::Volume glog;
116  if (layerSense[ly] == 0) {
118  double rmax = routF * cos(alpha) - tol;
119  std::vector<double> pgonZ, pgonRin, pgonRout;
120  pgonZ.emplace_back(-0.5 * thick[ii]);
121  pgonZ.emplace_back(0.5 * thick[ii]);
122  pgonRin.emplace_back(rinB);
123  pgonRin.emplace_back(rinB);
124  pgonRout.emplace_back(rmax);
125  pgonRout.emplace_back(rmax);
126  dd4hep::Solid solid = dd4hep::Polyhedra(sectors, -alpha, 2 * cms_units::piRadians, pgonZ, pgonRin, pgonRout);
127  ns.addSolidNS(ns.prepend(name), solid);
128  glog = dd4hep::Volume(solid.name(), solid, matter);
129 #ifdef EDM_ML_DEBUG
130  edm::LogVerbatim("HGCalGeom") << "DDHGCalModule: " << solid.name() << " polyhedra of " << sectors
131  << " sectors covering " << convertRadToDeg(-alpha) << ":"
132  << (360.0 + convertRadToDeg(-alpha)) << " with " << pgonZ.size() << " sections";
133  for (unsigned int k = 0; k < pgonZ.size(); ++k)
134  edm::LogVerbatim("HGCalGeom") << "[" << k << "] z " << pgonZ[k] << " R " << pgonRin[k] << ":" << pgonRout[k];
135 #endif
136  } else {
137  dd4hep::Solid solid = dd4hep::Tube(0.5 * thick[ii], rinB, routF, 0.0, 2 * cms_units::piRadians);
138  ns.addSolidNS(ns.prepend(name), solid);
139  glog = dd4hep::Volume(solid.name(), solid, matter);
140 #ifdef EDM_ML_DEBUG
141  edm::LogVerbatim("HGCalGeom") << "DDHGCalModule: " << solid.name() << " Tubs made of " << materials[ii]
142  << " of dimensions " << rinB << ", " << routF << ", " << 0.5 * thick[ii]
143  << ", 0.0, 360.0";
144  edm::LogVerbatim("HGCalGeom") << "DDHGCalModule test position in: " << glog.name() << " number " << copy;
145 #endif
146  double ww = (waferW + waferGap);
147  double dx = 0.5 * ww;
148  double dy = 3.0 * dx * tan(30._deg);
149  double rr = 2.0 * dx * tan(30._deg);
150  int ncol = static_cast<int>(2.0 * routF / ww) + 1;
151  int nrow = static_cast<int>(routF / (ww * tan(30._deg))) + 1;
152 #ifdef EDM_ML_DEBUG
153  int incm(0), inrm(0), kount(0), ntot(0), nin(0), nfine(0), ncoarse(0);
154  edm::LogVerbatim("HGCalGeom") << glog.name() << " rout " << routF << " Row " << nrow << " Column " << ncol;
155 #endif
156  for (int nr = -nrow; nr <= nrow; ++nr) {
157  int inr = (nr >= 0) ? nr : -nr;
158  for (int nc = -ncol; nc <= ncol; ++nc) {
159  int inc = (nc >= 0) ? nc : -nc;
160  if (inr % 2 == inc % 2) {
161  double xpos = nc * dx;
162  double ypos = nr * dy;
163  std::pair<int, int> corner = HGCalGeomTools::waferCorner(xpos, ypos, dx, rr, rinB, routF, true);
164 #ifdef EDM_ML_DEBUG
165  ++ntot;
166 #endif
167  if (corner.first > 0) {
168  int copyL = HGCalTypes::packTypeUV(0, nc, nr);
169 #ifdef EDM_ML_DEBUG
170  if (inc > incm)
171  incm = inc;
172  if (inr > inrm)
173  inrm = inr;
174  kount++;
175  copies.insert(copy);
176 #endif
177  if (corner.first == (int)(HGCalParameters::k_CornerSize)) {
178  double rpos = std::sqrt(xpos * xpos + ypos * ypos);
179  dd4hep::Position tran(xpos, ypos, 0.0);
180  dd4hep::Rotation3D rotation;
181  dd4hep::Volume glog1 = (rpos < rMaxFine) ? ns.volume(wafer[0]) : ns.volume(wafer[1]);
182  glog.placeVolume(glog1, copyL, dd4hep::Transform3D(rotation, tran));
183 #ifdef EDM_ML_DEBUG
184  ++nin;
185  if (rpos < rMaxFine)
186  ++nfine;
187  else
188  ++ncoarse;
189  edm::LogVerbatim("HGCalGeom")
190  << "DDHGCalModule: " << glog1.name() << " number " << copyL << " positioned in " << glog.name()
191  << " at " << tran << " with " << rotation;
192 #endif
193  }
194  }
195  }
196  }
197  }
198 #ifdef EDM_ML_DEBUG
199  edm::LogVerbatim("HGCalGeom") << "DDHGCalModule: # of columns " << incm << " # of rows " << inrm << " and "
200  << nin << ":" << kount << ":" << ntot << " wafers (" << nfine << ":" << ncoarse
201  << ") for " << glog.name() << " R " << rinB << ":" << routF;
202 #endif
203  }
204  dd4hep::Position r1(0, 0, zz);
205  dd4hep::Rotation3D rot;
206  module.placeVolume(glog, copy, dd4hep::Transform3D(rot, r1));
207  ++copyNumber[ii];
208 #ifdef EDM_ML_DEBUG
209  edm::LogVerbatim("HGCalGeom") << "DDHGCalModule: " << glog.name() << " number " << copy << " positioned in "
210  << module.name() << " at " << r1 << " with " << rot;
211 #endif
212  zz += (0.5 * thick[ii]);
213  } // End of loop over layers in a block
214  zi = zo;
215  laymin = laymax;
216  if (fabs(thickTot - layerThick[i]) > tol2) {
217  if (thickTot > layerThick[i]) {
218  edm::LogError("HGCalGeom") << "Thickness of the partition " << layerThick[i] << " is smaller than thickness "
219  << thickTot << " of all its components **** ERROR ****\n";
220  } else {
221  edm::LogWarning("HGCalGeom") << "Thickness of the partition " << layerThick[i] << " does not match with "
222  << thickTot << " of the components\n";
223  }
224  }
225  } // End of loop over blocks
226 
227 #ifdef EDM_ML_DEBUG
228  edm::LogVerbatim("HGCalGeom") << copies.size() << " different wafer copy numbers";
229  int k(0);
230  for (std::unordered_set<int>::const_iterator itr = copies.begin(); itr != copies.end(); ++itr, ++k)
231  edm::LogVerbatim("HGCalGeom") << "Copy[" << k << "] : " << (*itr);
232  edm::LogVerbatim("HGCalGeom") << "<<== End of DDHGCalModule construction ...";
233 #endif
234 
235  return cms::s_executed;
236 }
237 
238 // first argument is the type from the xml file
239 DECLARE_DDCMS_DETELEMENT(DDCMS_hgcal_DDHGCalModuleAlgo, algorithm)
writedatasetfile.args
args
Definition: writedatasetfile.py:18
HGCalGeomTools::waferCorner
static std::pair< int32_t, int32_t > waferCorner(double xpos, double ypos, double r, double R, double rMin, double rMax, bool oldBug=false)
Definition: HGCalGeomTools.cc:223
mps_fire.i
i
Definition: mps_fire.py:428
cms_units::operators
Definition: CMSUnits.h:13
geometryCSVtoXML.zz
zz
Definition: geometryCSVtoXML.py:19
g4SimHits_cfi.Material
Material
Definition: g4SimHits_cfi.py:560
MessageLogger.h
DECLARE_DDCMS_DETELEMENT
#define DECLARE_DDCMS_DETELEMENT(name, func)
Definition: DDPlugins.h:25
cms::DDNamespace::material
dd4hep::Material material(const std::string &name) const
Definition: DDNamespace.cc:116
filterCSVwithJSON.copy
copy
Definition: filterCSVwithJSON.py:36
cms::DDParsingContext
Definition: DDParsingContext.h:13
zMuMuMuonUserData.alpha
alpha
zGenParticlesMatch = cms.InputTag(""),
Definition: zMuMuMuonUserData.py:9
findQualityFiles.rr
string rr
Definition: findQualityFiles.py:185
angle_units::operators::convertRadToDeg
constexpr NumType convertRadToDeg(NumType radians)
Definition: angle_units.h:21
cms::DDNamespace
Definition: DDNamespace.h:16
HGCalParameters::k_CornerSize
static constexpr uint32_t k_CornerSize
Definition: HGCalParameters.h:38
distTCMET_cfi.corner
corner
Definition: distTCMET_cfi.py:38
nin
int nin
Definition: CascadeWrapper.h:114
versionedElectronIDProducer_cfi.idName
idName
Definition: versionedElectronIDProducer_cfi.py:11
edm::LogWarning
Log< level::Warning, false > LogWarning
Definition: MessageLogger.h:122
funct::cos
Cos< T >::type cos(const T &t)
Definition: Cos.h:22
names
const std::string names[nVars_]
Definition: PhotonIDValueMapProducer.cc:124
mathSSE::sqrt
T sqrt(T t)
Definition: SSEVec.h:19
cms::DDNamespace::prepend
std::string prepend(const std::string &) const
Definition: DDNamespace.cc:60
PixelTestBeamValidation_cfi.Position
Position
Definition: PixelTestBeamValidation_cfi.py:75
dqmdumpme.k
k
Definition: dqmdumpme.py:60
HGCalTypes::packTypeUV
static int32_t packTypeUV(int type, int u, int v)
Definition: HGCalTypes.cc:3
AlCaHLTBitMon_QueryRunRegistry.string
string
Definition: AlCaHLTBitMon_QueryRunRegistry.py:256
angle_units::piRadians
constexpr long double piRadians(M_PIl)
cms::Volume
dd4hep::Volume Volume
Definition: DDFilteredView.h:47
idealTransformation.rotation
dictionary rotation
Definition: idealTransformation.py:1
EgHLTOffHistBins_cfi.nr
nr
Definition: EgHLTOffHistBins_cfi.py:4
algorithm
static long algorithm(dd4hep::Detector &, cms::DDParsingContext &ctxt, xml_h e)
Definition: DDHGCalModuleAlgo.cc:24
DDPlugins.h
funct::tan
Tan< T >::type tan(const T &t)
Definition: Tan.h:22
cms::DDNamespace::addSolidNS
dd4hep::Solid addSolidNS(const std::string &name, dd4hep::Solid solid) const
Definition: DDNamespace.cc:221
cms::DDAlgoArguments
Definition: DDAlgoArguments.h:28
PVValHelper::dy
Definition: PVValidationHelpers.h:49
edm::LogError
Log< level::Error, false > LogError
Definition: MessageLogger.h:123
itr
std::vector< std::pair< float, float > >::iterator itr
Definition: HGCDigitizer.cc:29
cms::s_executed
static constexpr long s_executed
Definition: DDAlgoArguments.h:16
align::Detector
Definition: StructureType.h:86
HGCalGeomTools.h
HGCalGeomTools::radius
static void radius(double zf, double zb, std::vector< double > const &zFront1, std::vector< double > const &rFront1, std::vector< double > const &slope1, std::vector< double > const &zFront2, std::vector< double > const &rFront2, std::vector< double > const &slope2, int flag, std::vector< double > &zz, std::vector< double > &rin, std::vector< double > &rout)
Definition: HGCalGeomTools.cc:11
diffTwoXMLs.r1
r1
Definition: diffTwoXMLs.py:53
edm::LogVerbatim
Log< level::Info, true > LogVerbatim
Definition: MessageLogger.h:128
HGCalGeometryMode::Polyhedra
Definition: HGCalGeometryMode.h:35
makeMuonMisalignmentScenario.rot
rot
Definition: makeMuonMisalignmentScenario.py:322
Skims_PA_cff.name
name
Definition: Skims_PA_cff.py:17
CMSUnits.h
Exception.h
HGCalTypes.h
volumeBasedMagneticField_160812_cfi.sectors
sectors
Definition: volumeBasedMagneticField_160812_cfi.py:59
edm::Log
Definition: MessageLogger.h:70
cms::DDNamespace::name
std::string_view name() const
Definition: DDNamespace.h:72
HGCalParameters.h
cuy.ii
ii
Definition: cuy.py:590
cms::DDNamespace::volume
dd4hep::Volume volume(const std::string &name, bool exc=true) const
Definition: DDNamespace.cc:205
PVValHelper::dx
Definition: PVValidationHelpers.h:48
hgcalTopologyTester_cfi.layers
layers
Definition: hgcalTopologyTester_cfi.py:8
MillePedeFileConverter_cfg.e
e
Definition: MillePedeFileConverter_cfg.py:37