1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
|
#include <algorithm>
#include <cmath>
#include <map>
#include <string>
#include <vector>
#include "DataFormats/Math/interface/angle_units.h"
#include "DetectorDescription/Core/interface/DDAlgorithm.h"
#include "DetectorDescription/Core/interface/DDAlgorithmFactory.h"
#include "DetectorDescription/Core/interface/DDCurrentNamespace.h"
#include "DetectorDescription/Core/interface/DDLogicalPart.h"
#include "DetectorDescription/Core/interface/DDSplit.h"
#include "DetectorDescription/Core/interface/DDTypes.h"
#include "DetectorDescription/Core/interface/DDutils.h"
#include "FWCore/MessageLogger/interface/MessageLogger.h"
#include "FWCore/PluginManager/interface/PluginFactory.h"
#include "Geometry/HGCalCommonData/interface/HGCalTypes.h"
//#define EDM_ML_DEBUG
using namespace angle_units::operators;
class DDHGCalWafer : public DDAlgorithm {
public:
// Constructor and Destructor
DDHGCalWafer();
~DDHGCalWafer() override;
void initialize(const DDNumericArguments& nArgs,
const DDVectorArguments& vArgs,
const DDMapArguments& mArgs,
const DDStringArguments& sArgs,
const DDStringVectorArguments& vsArgs) override;
void execute(DDCompactView& cpv) override;
private:
double waferSize_; // Wafer Size
int cellType_; // Type (1 fine; 2 coarse)
int nColumns_; // Maximum number of columns
int nBottomY_; // Index of cell position of bottom row
std::vector<std::string> childNames_; // Names of children
std::vector<int> nCellsRow_; // Number of cells in a row
std::vector<int> angleEdges_; // Rotation angles to be used for edges
std::vector<int> detectorType_; // Detector type of edge cells
std::string idNameSpace_; // Namespace of this and ALL sub-parts
DDName parentName_; // Parent name
};
DDHGCalWafer::DDHGCalWafer() {
#ifdef EDM_ML_DEBUG
edm::LogVerbatim("HGCalGeom") << "DDHGCalWafer: Creating an instance";
#endif
}
DDHGCalWafer::~DDHGCalWafer() {}
void DDHGCalWafer::initialize(const DDNumericArguments& nArgs,
const DDVectorArguments& vArgs,
const DDMapArguments&,
const DDStringArguments& sArgs,
const DDStringVectorArguments& vsArgs) {
waferSize_ = nArgs["WaferSize"];
cellType_ = (int)(nArgs["CellType"]);
nColumns_ = (int)(nArgs["NColumns"]);
nBottomY_ = (int)(nArgs["NBottomY"]);
childNames_ = vsArgs["ChildNames"];
nCellsRow_ = dbl_to_int(vArgs["NCellsRow"]);
angleEdges_ = dbl_to_int(vArgs["AngleEdges"]);
detectorType_ = dbl_to_int(vArgs["DetectorType"]);
idNameSpace_ = DDCurrentNamespace::ns();
parentName_ = parent().name();
#ifdef EDM_ML_DEBUG
edm::LogVerbatim("HGCalGeom") << childNames_.size() << " children: " << childNames_[0] << "; " << childNames_[1]
<< " in namespace " << idNameSpace_ << " positioned in " << nCellsRow_.size()
<< " rows and " << nColumns_ << " columns with lowest column at " << nBottomY_
<< " in mother " << parentName_ << " of size " << waferSize_;
for (unsigned int k = 0; k < nCellsRow_.size(); ++k)
edm::LogVerbatim("HGCalGeom") << "[" << k << "] Ncells " << nCellsRow_[k] << " Edge rotations "
<< angleEdges_[2 * k] << ":" << angleEdges_[2 * k + 1] << " Type of edge cells "
<< detectorType_[2 * k] << ":" << detectorType_[2 * k + 1];
#endif
}
void DDHGCalWafer::execute(DDCompactView& cpv) {
#ifdef EDM_ML_DEBUG
edm::LogVerbatim("HGCalGeom") << "==>> Constructing DDHGCalWafer...";
#endif
double dx = 0.5 * waferSize_ / nColumns_;
double dy = 0.5 * dx * tan(30._deg);
int ny = nBottomY_;
int kount(0);
for (unsigned int ir = 0; ir < nCellsRow_.size(); ++ir) {
int nx = 1 - nCellsRow_[ir];
double ypos = dy * ny;
for (int ic = 0; ic < nCellsRow_[ir]; ++ic) {
std::string name(childNames_[0]), rotstr("NULL");
int irot(0);
if (ic == 0) {
name = childNames_[detectorType_[2 * ir]];
irot = angleEdges_[2 * ir];
} else if (ic + 1 == nCellsRow_[ir]) {
name = childNames_[detectorType_[2 * ir + 1]];
irot = angleEdges_[2 * ir + 1];
}
DDRotation rot;
if (irot != 0) {
double phi = convertDegToRad(irot);
rotstr = "R" + formatAsDegrees(phi);
rot = DDRotation(DDName(rotstr, idNameSpace_));
if (!rot) {
#ifdef EDM_ML_DEBUG
edm::LogVerbatim("HGCalGeom") << "DDHGCalWaferAlgo: Creating new rotation " << DDName(rotstr, idNameSpace_)
<< "\t90, " << irot << ", 90, " << (irot + 90) << ", 0, 0";
#endif
rot = DDrot(DDName(rotstr, idNameSpace_), 90._deg, phi, 90._deg, (90._deg + phi), 0, 0);
}
}
double xpos = dx * nx;
nx += 2;
DDTranslation tran(xpos, ypos, 0);
int copy = HGCalTypes::packCellType6(cellType_, kount);
cpv.position(DDName(name, idNameSpace_), parentName_, copy, tran, rot);
++kount;
#ifdef EDM_ML_DEBUG
edm::LogVerbatim("HGCalGeom") << "DDHGCalWafer: " << DDName(name, idNameSpace_) << " number " << copy
<< " positioned in " << parentName_ << " at " << tran << " with " << rot;
#endif
}
ny += 6;
}
}
DEFINE_EDM_PLUGIN(DDAlgorithmFactory, DDHGCalWafer, "hgcal:DDHGCalWafer");
|