CMS 3D CMS Logo

List of all members | Public Member Functions | Protected Member Functions | Private Attributes | Static Private Attributes
DDHGCalModuleAlgo Class Reference
Inheritance diagram for DDHGCalModuleAlgo:

Public Member Functions

 DDHGCalModuleAlgo ()
 
void execute (DDCompactView &cpv) override
 
void initialize (const DDNumericArguments &nArgs, const DDVectorArguments &vArgs, const DDMapArguments &mArgs, const DDStringArguments &sArgs, const DDStringVectorArguments &vsArgs) override
 

Protected Member Functions

void constructLayers (const DDLogicalPart &, DDCompactView &cpv)
 
void positionSensitive (DDLogicalPart &glog, double rin, double rout, DDCompactView &cpv)
 
double rMax (double z)
 

Private Attributes

std::unordered_set< int > copies_
 
std::vector< int > copyNumber_
 
std::string idNameSpace_
 
std::vector< int > layers_
 
std::vector< int > layerSense_
 
std::vector< double > layerThick_
 
std::vector< int > layerType_
 
std::vector< std::string > materials_
 
std::vector< std::string > names_
 
double rMaxFine_
 
std::vector< double > rMaxFront_
 
int sectors_
 
std::vector< double > slopeB_
 
std::vector< double > slopeT_
 
std::vector< double > thick_
 
std::vector< std::string > wafer_
 
double waferGap_
 
double waferW_
 
std::vector< double > zFront_
 
double zMinBlock_
 

Static Private Attributes

static constexpr double tol_ = 0.00001
 

Detailed Description

Definition at line 32 of file DDHGCalModuleAlgo.cc.

Constructor & Destructor Documentation

◆ DDHGCalModuleAlgo()

DDHGCalModuleAlgo::DDHGCalModuleAlgo ( )

Definition at line 74 of file DDHGCalModuleAlgo.cc.

74  {
75 #ifdef EDM_ML_DEBUG
76  edm::LogVerbatim("HGCalGeom") << "DDHGCalModuleAlgo: Creating an instance";
77 #endif
78 }
Log< level::Info, true > LogVerbatim

Member Function Documentation

◆ constructLayers()

void DDHGCalModuleAlgo::constructLayers ( const DDLogicalPart module,
DDCompactView cpv 
)
protected

Definition at line 163 of file DDHGCalModuleAlgo.cc.

References alpha, angle_units::operators::convertRadToDeg(), filterCSVwithJSON::copy, funct::cos(), DDBase< N, C >::ddname(), DDSplit(), dqmdumpme::first, mps_fire::i, cuy::ii, dqmdumpme::k, callgraph::module, Skims_PA_cff::name, DDBase< N, C >::name(), DDSolidFactory::polyhedra(), DDCompactView::position(), photonAnalyzer_cfi::rMax, makeMuonMisalignmentScenario::rot, edm::second(), AlCaHLTBitMon_QueryRunRegistry::string, cond::impl::to_string(), DDSolidFactory::tubs(), and geometryCSVtoXML::zz.

163  {
164 #ifdef EDM_ML_DEBUG
165  edm::LogVerbatim("HGCalGeom") << "DDHGCalModuleAlgo: \t\tInside Layers";
166 #endif
167  double zi(zMinBlock_);
168  int laymin(0);
169  const double tol(0.01);
170  for (unsigned int i = 0; i < layers_.size(); i++) {
171  double zo = zi + layerThick_[i];
172  double routF = rMax(zi);
173  int laymax = laymin + layers_[i];
174  double zz = zi;
175  double thickTot(0);
176  for (int ly = laymin; ly < laymax; ++ly) {
177  int ii = layerType_[ly];
178  int copy = copyNumber_[ii];
179  double rinB = (layerSense_[ly] == 0) ? (zo * slopeB_[0]) : (zo * slopeB_[1]);
180  zz += (0.5 * thick_[ii]);
181  thickTot += thick_[ii];
182 
183  std::string name = "HGCal" + names_[ii] + std::to_string(copy);
184 #ifdef EDM_ML_DEBUG
185  edm::LogVerbatim("HGCalGeom") << "DDHGCalModuleAlgo: Layer " << ly << ":" << ii << " Front " << zi << ", "
186  << routF << " Back " << zo << ", " << rinB << " superlayer thickness "
187  << layerThick_[i];
188 #endif
190  DDMaterial matter(matName);
191  DDLogicalPart glog;
192  if (layerSense_[ly] == 0) {
193  double alpha = 1._pi / sectors_;
194  double rmax = routF * cos(alpha) - tol;
195  std::vector<double> pgonZ, pgonRin, pgonRout;
196  pgonZ.emplace_back(-0.5 * thick_[ii]);
197  pgonZ.emplace_back(0.5 * thick_[ii]);
198  pgonRin.emplace_back(rinB);
199  pgonRin.emplace_back(rinB);
200  pgonRout.emplace_back(rmax);
201  pgonRout.emplace_back(rmax);
202  DDSolid solid =
203  DDSolidFactory::polyhedra(DDName(name, idNameSpace_), sectors_, -alpha, 2._pi, pgonZ, pgonRin, pgonRout);
204  glog = DDLogicalPart(solid.ddname(), matter, solid);
205 #ifdef EDM_ML_DEBUG
206  edm::LogVerbatim("HGCalGeom") << "DDHGCalModuleAlgo: " << solid.name() << " polyhedra of " << sectors_
207  << " sectors covering " << convertRadToDeg(-alpha) << ":"
208  << (360.0 + convertRadToDeg(-alpha)) << " with " << pgonZ.size() << " sections";
209  for (unsigned int k = 0; k < pgonZ.size(); ++k)
210  edm::LogVerbatim("HGCalGeom") << "[" << k << "] z " << pgonZ[k] << " R " << pgonRin[k] << ":" << pgonRout[k];
211 #endif
212  } else {
213  DDSolid solid = DDSolidFactory::tubs(DDName(name, idNameSpace_), 0.5 * thick_[ii], rinB, routF, 0.0, 2._pi);
214  glog = DDLogicalPart(solid.ddname(), matter, solid);
215 #ifdef EDM_ML_DEBUG
216  edm::LogVerbatim("HGCalGeom") << "DDHGCalModuleAlgo: " << solid.name() << " Tubs made of " << matName
217  << " of dimensions " << rinB << ", " << routF << ", " << 0.5 * thick_[ii]
218  << ", 0.0, 360.0";
219 #endif
220  positionSensitive(glog, rinB, routF, 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") << "DDHGCalModuleAlgo: " << glog.name() << " number " << copy << " positioned in "
228  << module.name() << " at " << r1 << " with " << rot;
229 #endif
230  zz += (0.5 * thick_[ii]);
231  } // End of loop over layers in a block
232  zi = zo;
233  laymin = laymax;
234  if (fabs(thickTot - layerThick_[i]) > tol_) {
235  if (thickTot > layerThick_[i]) {
236  edm::LogError("HGCalGeom") << "Thickness of the partition " << layerThick_[i] << " is smaller than thickness "
237  << thickTot << " of all its components **** ERROR ****\n";
238  } else {
239  edm::LogWarning("HGCalGeom") << "Thickness of the partition " << layerThick_[i] << " does not match with "
240  << thickTot << " of the components\n";
241  }
242  }
243  } // End of loop over blocks
244 }
Log< level::Info, true > LogVerbatim
std::vector< double > slopeB_
float alpha
Definition: AMPTWrapper.h:105
void positionSensitive(DDLogicalPart &glog, double rin, double rout, DDCompactView &cpv)
void position(const DDLogicalPart &self, const DDLogicalPart &parent, const std::string &copyno, const DDTranslation &trans, const DDRotation &rot, const DDDivision *div=nullptr)
DDMaterial is used to define and access material information.
Definition: DDMaterial.h:45
constexpr NumType convertRadToDeg(NumType radians)
Definition: angle_units.h:21
std::vector< std::string > names_
std::vector< double > thick_
DDName is used to identify DDD entities uniquely.
Definition: DDName.h:17
std::string to_string(const V &value)
Definition: OMSAccess.h:71
Log< level::Error, false > LogError
A DDSolid represents the shape of a part.
Definition: DDSolid.h:39
std::vector< std::string > materials_
Represents a uniquely identifyable rotation matrix.
Definition: DDTransform.h:57
U second(std::pair< T, U > const &p)
Cos< T >::type cos(const T &t)
Definition: Cos.h:22
A DDLogicalPart aggregates information concerning material, solid and sensitveness ...
Definition: DDLogicalPart.h:93
static DDSolid tubs(const DDName &name, double zhalf, double rIn, double rOut, double startPhi, double deltaPhi)
Definition: DDSolid.cc:667
std::string idNameSpace_
static constexpr double tol_
ii
Definition: cuy.py:589
const N & name() const
Definition: DDBase.h:59
std::vector< double > layerThick_
const N & ddname() const
Definition: DDBase.h:61
std::vector< int > layers_
std::vector< int > layerSense_
Log< level::Warning, false > LogWarning
std::pair< std::string, std::string > DDSplit(const std::string &n)
split into (name,namespace), separator = &#39;:&#39;
Definition: DDSplit.cc:3
ROOT::Math::DisplacementVector3D< ROOT::Math::Cartesian3D< double > > DDTranslation
Definition: DDTranslation.h:7
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:565
std::vector< int > layerType_
double rMax(double z)
std::vector< int > copyNumber_

◆ execute()

void DDHGCalModuleAlgo::execute ( DDCompactView cpv)
override

Definition at line 148 of file DDHGCalModuleAlgo.cc.

References DDHGCalGeom::constructLayers(), and class-composition::parent.

148  {
149 #ifdef EDM_ML_DEBUG
150  edm::LogVerbatim("HGCalGeom") << "==>> Constructing DDHGCalModuleAlgo...";
151 #endif
152  copies_.clear();
153  constructLayers(parent(), cpv);
154 #ifdef EDM_ML_DEBUG
155  edm::LogVerbatim("HGCalGeom") << copies_.size() << " different wafer copy numbers";
156 #endif
157  copies_.clear();
158 #ifdef EDM_ML_DEBUG
159  edm::LogVerbatim("HGCalGeom") << "<<== End of DDHGCalModuleAlgo construction";
160 #endif
161 }
Log< level::Info, true > LogVerbatim
std::unordered_set< int > copies_
void constructLayers(const DDLogicalPart &, DDCompactView &cpv)

◆ initialize()

void DDHGCalModuleAlgo::initialize ( const DDNumericArguments nArgs,
const DDVectorArguments vArgs,
const DDMapArguments mArgs,
const DDStringArguments sArgs,
const DDStringVectorArguments vsArgs 
)
override

Definition at line 80 of file DDHGCalModuleAlgo.cc.

References dbl_to_int(), mps_fire::i, createfilelist::int, and DDCurrentNamespace::ns().

84  {
85  wafer_ = vsArgs["WaferName"];
86 #ifdef EDM_ML_DEBUG
87  edm::LogVerbatim("HGCalGeom") << "DDHGCalModuleAlgo: " << wafer_.size() << " wafers";
88  for (unsigned int i = 0; i < wafer_.size(); ++i)
89  edm::LogVerbatim("HGCalGeom") << "Wafer[" << i << "] " << wafer_[i];
90 #endif
91  materials_ = vsArgs["MaterialNames"];
92  names_ = vsArgs["VolumeNames"];
93  thick_ = vArgs["Thickness"];
94  copyNumber_.resize(materials_.size(), 1);
95 #ifdef EDM_ML_DEBUG
96  edm::LogVerbatim("HGCalGeom") << "DDHGCalModuleAlgo: " << materials_.size() << " types of volumes";
97  for (unsigned int i = 0; i < names_.size(); ++i)
98  edm::LogVerbatim("HGCalGeom") << "Volume [" << i << "] " << names_[i] << " of thickness " << thick_[i]
99  << " filled with " << materials_[i] << " first copy number " << copyNumber_[i];
100 #endif
101  layers_ = dbl_to_int(vArgs["Layers"]);
102  layerThick_ = vArgs["LayerThick"];
103 #ifdef EDM_ML_DEBUG
104  edm::LogVerbatim("HGCalGeom") << "DDHGCalModuleAlgo: " << layers_.size() << " blocks";
105  for (unsigned int i = 0; i < layers_.size(); ++i)
106  edm::LogVerbatim("HGCalGeom") << "Block [" << i << "] of thickness " << layerThick_[i] << " with " << layers_[i]
107  << " layers";
108 #endif
109  layerType_ = dbl_to_int(vArgs["LayerType"]);
110  layerSense_ = dbl_to_int(vArgs["LayerSense"]);
111 #ifdef EDM_ML_DEBUG
112  edm::LogVerbatim("HGCalGeom") << "DDHGCalModuleAlgo: " << layerType_.size() << " layers";
113  for (unsigned int i = 0; i < layerType_.size(); ++i)
114  edm::LogVerbatim("HGCalGeom") << "Layer [" << i << "] with material type " << layerType_[i] << " sensitive class "
115  << layerSense_[i];
116 #endif
117  zMinBlock_ = nArgs["zMinBlock"];
118  rMaxFine_ = nArgs["rMaxFine"];
119  waferW_ = nArgs["waferW"];
120  waferGap_ = nArgs["waferGap"];
121  sectors_ = (int)(nArgs["Sectors"]);
122 #ifdef EDM_ML_DEBUG
123  edm::LogVerbatim("HGCalGeom") << "DDHGCalModuleAlgo: zStart " << zMinBlock_ << " rFineCoarse " << rMaxFine_
124  << " wafer width " << waferW_ << " gap among wafers " << waferGap_ << " sectors "
125  << sectors_;
126 #endif
127  slopeB_ = vArgs["SlopeBottom"];
128  slopeT_ = vArgs["SlopeTop"];
129  zFront_ = vArgs["ZFront"];
130  rMaxFront_ = vArgs["RMaxFront"];
131 #ifdef EDM_ML_DEBUG
132  edm::LogVerbatim("HGCalGeom") << "DDHGCalModuleAlgo: Bottom slopes " << slopeB_[0] << ":" << slopeB_[1] << " and "
133  << slopeT_.size() << " slopes for top";
134  for (unsigned int i = 0; i < slopeT_.size(); ++i)
135  edm::LogVerbatim("HGCalGeom") << "Block [" << i << "] Zmin " << zFront_[i] << " Rmax " << rMaxFront_[i] << " Slope "
136  << slopeT_[i];
137 #endif
139 #ifdef EDM_ML_DEBUG
140  edm::LogVerbatim("HGCalGeom") << "DDHGCalModuleAlgo: NameSpace " << idNameSpace_;
141 #endif
142 }
Log< level::Info, true > LogVerbatim
std::vector< double > slopeB_
std::vector< double > rMaxFront_
std::vector< std::string > names_
std::vector< double > thick_
static std::string & ns()
std::vector< std::string > materials_
std::vector< double > zFront_
std::string idNameSpace_
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 > layerThick_
std::vector< double > slopeT_
std::vector< int > layers_
std::vector< int > layerSense_
std::vector< std::string > wafer_
std::vector< int > layerType_
std::vector< int > copyNumber_

◆ positionSensitive()

void DDHGCalModuleAlgo::positionSensitive ( DDLogicalPart glog,
double  rin,
double  rout,
DDCompactView cpv 
)
protected

Definition at line 265 of file DDHGCalModuleAlgo.cc.

References filterCSVwithJSON::copy, TCMET_cfi::corner, DDBase< N, C >::ddname(), DDSplit(), PVValHelper::dx, PVValHelper::dy, createfilelist::int, HGCalParameters::k_CornerSize, Skims_PA_cff::name, EgHLTOffHistBins_cfi::nr, HGCalTypes::packTypeUV(), DDCompactView::position(), idealTransformation::rotation, findQualityFiles::rr, mathSSE::sqrt(), funct::tan(), and HGCalGeomTools::waferCorner().

265  {
266  double ww = (waferW_ + waferGap_);
267  double dx = 0.5 * ww;
268  double dy = 3.0 * dx * tan(30._deg);
269  double rr = 2.0 * dx * tan(30._deg);
270  int ncol = (int)(2.0 * rout / ww) + 1;
271  int nrow = (int)(rout / (ww * tan(30._deg))) + 1;
272  int incm(0), inrm(0), kount(0);
273 #ifdef EDM_ML_DEBUG
274  edm::LogVerbatim("HGCalGeom") << glog.ddname() << " rout " << rout << " Row " << nrow << " Column " << ncol;
275 #endif
276  for (int nr = -nrow; nr <= nrow; ++nr) {
277  int inr = (nr >= 0) ? nr : -nr;
278  for (int nc = -ncol; nc <= ncol; ++nc) {
279  int inc = (nc >= 0) ? nc : -nc;
280  if (inr % 2 == inc % 2) {
281  double xpos = nc * dx;
282  double ypos = nr * dy;
283  auto const& corner = HGCalGeomTools::waferCorner(xpos, ypos, dx, rr, rin, rout, true);
284  if (corner.first == (int)(HGCalParameters::k_CornerSize)) {
285  double rpos = std::sqrt(xpos * xpos + ypos * ypos);
286  DDTranslation tran(xpos, ypos, 0.0);
288  int copy = HGCalTypes::packTypeUV(0, nc, nr);
289  DDName name = (rpos < rMaxFine_) ? DDName(DDSplit(wafer_[0]).first, DDSplit(wafer_[0]).second)
290  : DDName(DDSplit(wafer_[1]).first, DDSplit(wafer_[1]).second);
291  cpv.position(name, glog.ddname(), copy, tran, rotation);
292  if (inc > incm)
293  incm = inc;
294  if (inr > inrm)
295  inrm = inr;
296  kount++;
297  if (copies_.count(copy) == 0)
298  copies_.insert(copy);
299 #ifdef EDM_ML_DEBUG
300  edm::LogVerbatim("HGCalGeom") << "DDHGCalModuleAlgo: " << name << " number " << copy << " positioned in "
301  << glog.ddname() << " at " << tran << " with " << rotation;
302 #endif
303  }
304  }
305  }
306  }
307 #ifdef EDM_ML_DEBUG
308  edm::LogVerbatim("HGCalGeom") << "DDHGCalModuleAlgo: # of columns " << incm << " # of rows " << inrm << " and "
309  << kount << " wafers for " << glog.ddname();
310 #endif
311 }
Log< level::Info, true > LogVerbatim
void position(const DDLogicalPart &self, const DDLogicalPart &parent, const std::string &copyno, const DDTranslation &trans, const DDRotation &rot, const DDDivision *div=nullptr)
DDName is used to identify DDD entities uniquely.
Definition: DDName.h:17
static constexpr uint32_t k_CornerSize
Represents a uniquely identifyable rotation matrix.
Definition: DDTransform.h:57
static std::pair< int32_t, int32_t > waferCorner(double xpos, double ypos, double r, double R, double rMin, double rMax, bool oldBug=false)
T sqrt(T t)
Definition: SSEVec.h:19
Tan< T >::type tan(const T &t)
Definition: Tan.h:22
const N & ddname() const
Definition: DDBase.h:61
static int32_t packTypeUV(int type, int u, int v)
Definition: HGCalTypes.cc:3
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 > wafer_
ROOT::Math::DisplacementVector3D< ROOT::Math::Cartesian3D< double > > DDTranslation
Definition: DDTranslation.h:7
std::unordered_set< int > copies_

◆ rMax()

double DDHGCalModuleAlgo::rMax ( double  z)
protected

Definition at line 246 of file DDHGCalModuleAlgo.cc.

References dqmdumpme::k.

246  {
247  double r(0);
248 #ifdef EDM_ML_DEBUG
249  unsigned int ik(0);
250 #endif
251  for (unsigned int k = 0; k < slopeT_.size(); ++k) {
252  if (z < zFront_[k])
253  break;
254  r = rMaxFront_[k] + (z - zFront_[k]) * slopeT_[k];
255 #ifdef EDM_ML_DEBUG
256  ik = k;
257 #endif
258  }
259 #ifdef EDM_ML_DEBUG
260  edm::LogVerbatim("HGCalGeom") << "rMax : " << z << ":" << ik << ":" << r;
261 #endif
262  return r;
263 }
Log< level::Info, true > LogVerbatim
std::vector< double > rMaxFront_
std::vector< double > zFront_
std::vector< double > slopeT_

Member Data Documentation

◆ copies_

std::unordered_set<int> DDHGCalModuleAlgo::copies_
private

Definition at line 71 of file DDHGCalModuleAlgo.cc.

◆ copyNumber_

std::vector<int> DDHGCalModuleAlgo::copyNumber_
private

Definition at line 56 of file DDHGCalModuleAlgo.cc.

◆ idNameSpace_

std::string DDHGCalModuleAlgo::idNameSpace_
private

Definition at line 70 of file DDHGCalModuleAlgo.cc.

◆ layers_

std::vector<int> DDHGCalModuleAlgo::layers_
private

Definition at line 57 of file DDHGCalModuleAlgo.cc.

◆ layerSense_

std::vector<int> DDHGCalModuleAlgo::layerSense_
private

Definition at line 60 of file DDHGCalModuleAlgo.cc.

◆ layerThick_

std::vector<double> DDHGCalModuleAlgo::layerThick_
private

Definition at line 58 of file DDHGCalModuleAlgo.cc.

◆ layerType_

std::vector<int> DDHGCalModuleAlgo::layerType_
private

Definition at line 59 of file DDHGCalModuleAlgo.cc.

◆ materials_

std::vector<std::string> DDHGCalModuleAlgo::materials_
private

Definition at line 53 of file DDHGCalModuleAlgo.cc.

◆ names_

std::vector<std::string> DDHGCalModuleAlgo::names_
private

Definition at line 54 of file DDHGCalModuleAlgo.cc.

◆ rMaxFine_

double DDHGCalModuleAlgo::rMaxFine_
private

Definition at line 62 of file DDHGCalModuleAlgo.cc.

◆ rMaxFront_

std::vector<double> DDHGCalModuleAlgo::rMaxFront_
private

Definition at line 69 of file DDHGCalModuleAlgo.cc.

◆ sectors_

int DDHGCalModuleAlgo::sectors_
private

Definition at line 65 of file DDHGCalModuleAlgo.cc.

◆ slopeB_

std::vector<double> DDHGCalModuleAlgo::slopeB_
private

Definition at line 66 of file DDHGCalModuleAlgo.cc.

◆ slopeT_

std::vector<double> DDHGCalModuleAlgo::slopeT_
private

Definition at line 67 of file DDHGCalModuleAlgo.cc.

◆ thick_

std::vector<double> DDHGCalModuleAlgo::thick_
private

Definition at line 55 of file DDHGCalModuleAlgo.cc.

◆ tol_

constexpr double DDHGCalModuleAlgo::tol_ = 0.00001
staticprivate

Definition at line 50 of file DDHGCalModuleAlgo.cc.

◆ wafer_

std::vector<std::string> DDHGCalModuleAlgo::wafer_
private

Definition at line 52 of file DDHGCalModuleAlgo.cc.

◆ waferGap_

double DDHGCalModuleAlgo::waferGap_
private

Definition at line 64 of file DDHGCalModuleAlgo.cc.

◆ waferW_

double DDHGCalModuleAlgo::waferW_
private

Definition at line 63 of file DDHGCalModuleAlgo.cc.

◆ zFront_

std::vector<double> DDHGCalModuleAlgo::zFront_
private

Definition at line 68 of file DDHGCalModuleAlgo.cc.

◆ zMinBlock_

double DDHGCalModuleAlgo::zMinBlock_
private

Definition at line 61 of file DDHGCalModuleAlgo.cc.