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
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
|
///////////////////////////////////////////////////////////////////////////////
// File: DDTOBRadCableAlgo.cc
// Description: Equipping the side disks of TOB with cables etc
///////////////////////////////////////////////////////////////////////////////
#include "FWCore/MessageLogger/interface/MessageLogger.h"
#include "DetectorDescription/Core/interface/DDLogicalPart.h"
#include "DetectorDescription/Core/interface/DDSolid.h"
#include "DetectorDescription/Core/interface/DDMaterial.h"
#include "DetectorDescription/Core/interface/DDCurrentNamespace.h"
#include "DetectorDescription/Core/interface/DDSplit.h"
#include "DetectorDescription/Core/interface/DDTypes.h"
#include "DetectorDescription/Core/interface/DDAlgorithm.h"
#include "DetectorDescription/Core/interface/DDAlgorithmFactory.h"
#include <CLHEP/Units/GlobalPhysicalConstants.h>
#include <CLHEP/Units/SystemOfUnits.h>
#include <string>
#include <vector>
using namespace std;
class DDTOBRadCableAlgo : public DDAlgorithm {
public:
//Constructor and Destructor
DDTOBRadCableAlgo();
~DDTOBRadCableAlgo() 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:
string idNameSpace; // Namespace of this and ALL sub-parts
double diskDz; // Disk thickness
double rMax; // Maximum radius
double cableT; // Cable thickness
vector<double> rodRin; // Radii for inner rods
vector<double> rodRout; // Radii for outer rods
vector<string> cableM; // Materials for cables
double connW; // Connector width
double connT; // Connector thickness
vector<string> connM; // Materials for connectors
vector<double> coolR1; // Radii for cooling manifold
vector<double> coolR2; // Radii for return cooling manifold
double coolRin; // Inner radius of cooling manifold
double coolRout1; // Outer radius of cooling manifold
double coolRout2; // Outer radius of cooling fluid in cooling manifold
double coolStartPhi1; // Starting Phi of cooling manifold
double coolDeltaPhi1; // Phi Range of cooling manifold
double coolStartPhi2; // Starting Phi of cooling fluid in of cooling manifold
double coolDeltaPhi2; // Phi Range of of cooling fluid in cooling manifold
string coolM1; // Material for cooling manifold
string coolM2; // Material for cooling fluid
vector<string> names; // Names of layers
};
DDTOBRadCableAlgo::DDTOBRadCableAlgo()
: rodRin(0),
rodRout(0),
cableM(0),
connM(0),
coolR1(0),
coolR2(0),
coolRin(0),
coolRout1(0),
coolRout2(0),
coolStartPhi1(0),
coolDeltaPhi1(0),
coolStartPhi2(0),
coolDeltaPhi2(0),
names(0) {
LogDebug("TOBGeom") << "DDTOBRadCableAlgo info: Creating an instance";
}
DDTOBRadCableAlgo::~DDTOBRadCableAlgo() {}
void DDTOBRadCableAlgo::initialize(const DDNumericArguments& nArgs,
const DDVectorArguments& vArgs,
const DDMapArguments&,
const DDStringArguments& sArgs,
const DDStringVectorArguments& vsArgs) {
idNameSpace = DDCurrentNamespace::ns();
DDName parentName = parent().name();
LogDebug("TOBGeom") << "DDTOBRadCableAlgo debug: Parent " << parentName << " NameSpace " << idNameSpace;
diskDz = nArgs["DiskDz"];
rMax = nArgs["RMax"];
cableT = nArgs["CableT"];
rodRin = vArgs["RodRin"];
rodRout = vArgs["RodRout"];
cableM = vsArgs["CableMaterial"];
LogDebug("TOBGeom") << "DDTOBRadCableAlgo debug: Disk Half width " << diskDz << "\tRMax " << rMax
<< "\tCable Thickness " << cableT << "\tRadii of disk position and cable materials:";
for (int i = 0; i < (int)(rodRin.size()); i++)
LogDebug("TOBGeom") << "\t[" << i << "]\tRin = " << rodRin[i] << "\tRout = " << rodRout[i] << " " << cableM[i];
connW = nArgs["ConnW"];
connT = nArgs["ConnT"];
connM = vsArgs["ConnMaterial"];
LogDebug("TOBGeom") << "DDTOBRadCableAlgo debug: Connector Width = " << connW << "\tThickness = " << connT
<< "\tMaterials: ";
for (int i = 0; i < (int)(connM.size()); i++)
LogDebug("TOBGeom") << "\tconnM[" << i << "] = " << connM[i];
coolR1 = vArgs["CoolR1"];
coolR2 = vArgs["CoolR2"];
coolRin = nArgs["CoolRin"];
coolRout1 = nArgs["CoolRout1"];
coolRout2 = nArgs["CoolRout2"];
coolStartPhi1 = nArgs["CoolStartPhi1"];
coolDeltaPhi1 = nArgs["CoolDeltaPhi1"];
coolStartPhi2 = nArgs["CoolStartPhi2"];
coolDeltaPhi2 = nArgs["CoolDeltaPhi2"];
coolM1 = sArgs["CoolMaterial1"];
coolM2 = sArgs["CoolMaterial2"];
LogDebug("TOBGeom") << "DDTOBRadCableAlgo debug: Cool Manifold Torus Rin = " << coolRin << " Rout = " << coolRout1
<< "\t Phi start = " << coolStartPhi1 << " Phi Range = " << coolDeltaPhi1
<< "\t Material = " << coolM1 << "\t Radial positions:";
for (int i = 0; i < (int)(coolR1.size()); i++)
LogDebug("TOBGeom") << "\t[" << i << "]\tR = " << coolR1[i];
for (int i = 0; i < (int)(coolR2.size()); i++)
LogDebug("TOBGeom") << "\t[" << i << "]\tR = " << coolR2[i];
LogDebug("TOBGeom") << "DDTOBRadCableAlgo debug: Cooling Fluid Torus Rin = " << coolRin << " Rout = " << coolRout2
<< "\t Phi start = " << coolStartPhi2 << " Phi Range = " << coolDeltaPhi2
<< "\t Material = " << coolM2 << "\t Radial positions:";
for (int i = 0; i < (int)(coolR1.size()); i++)
LogDebug("TOBGeom") << "\t[" << i << "]\tR = " << coolR1[i];
for (int i = 0; i < (int)(coolR2.size()); i++)
LogDebug("TOBGeom") << "\t[" << i << "]\tR = " << coolR2[i];
names = vsArgs["RingName"];
for (int i = 0; i < (int)(names.size()); i++)
LogDebug("TOBGeom") << "DDTOBRadCableAlgo debug: names[" << i << "] = " << names[i];
}
void DDTOBRadCableAlgo::execute(DDCompactView& cpv) {
LogDebug("TOBGeom") << "==>> Constructing DDTOBRadCableAlgo...";
DDName diskName = parent().name();
// Loop over sub disks
for (int i = 0; i < (int)(names.size()); i++) {
DDSolid solid;
string name;
double dz, rin, rout;
// Cooling Manifolds
name = "TOBCoolingManifold" + names[i] + "a";
dz = coolRout1;
DDName manifoldName_a(name, idNameSpace);
solid = DDSolidFactory::torus(manifoldName_a, coolRin, coolRout1, coolR1[i], coolStartPhi1, coolDeltaPhi1);
LogDebug("TOBGeom") << "DDTOBRadCableAlgo test: " << DDName(name, idNameSpace) << " Torus made of " << coolM1
<< " from " << coolStartPhi1 / CLHEP::deg << " to "
<< (coolStartPhi1 + coolDeltaPhi1) / CLHEP::deg << " with Rin " << coolRin << " Rout "
<< coolRout1 << " R torus " << coolR1[i];
DDName coolManifoldName_a(DDSplit(coolM1).first, DDSplit(coolM1).second);
DDMaterial coolManifoldMatter_a(coolManifoldName_a);
DDLogicalPart coolManifoldLogic_a(DDName(name, idNameSpace), coolManifoldMatter_a, solid);
DDTranslation r1(0, 0, (dz - diskDz));
cpv.position(DDName(name, idNameSpace), diskName, i + 1, r1, DDRotation());
LogDebug("TOBGeom") << "DDTOBRadCableAlgo test: " << DDName(name, idNameSpace) << " number " << i + 1
<< " positioned in " << diskName << " at " << r1 << " with no rotation";
// Cooling Fluid (in Cooling Manifold)
name = "TOBCoolingManifoldFluid" + names[i] + "a";
solid =
DDSolidFactory::torus(DDName(name, idNameSpace), coolRin, coolRout2, coolR1[i], coolStartPhi2, coolDeltaPhi2);
LogDebug("TOBGeom") << "DDTOBRadCableAlgo test: " << DDName(name, idNameSpace) << " Torus made of " << coolM2
<< " from " << coolStartPhi2 / CLHEP::deg << " to "
<< (coolStartPhi2 + coolDeltaPhi2) / CLHEP::deg << " with Rin " << coolRin << " Rout "
<< coolRout2 << " R torus " << coolR1[i];
DDName coolManifoldFluidName_a(DDSplit(coolM2).first, DDSplit(coolM2).second);
DDMaterial coolManifoldFluidMatter_a(coolManifoldFluidName_a);
DDLogicalPart coolManifoldFluidLogic_a(DDName(name, idNameSpace), coolManifoldFluidMatter_a, solid);
cpv.position(DDName(name, idNameSpace), manifoldName_a, i + 1, DDTranslation(), DDRotation());
LogDebug("TOBGeom") << "DDTOBRadCableAlgo test: " << DDName(name, idNameSpace) << " number " << i + 1
<< " positioned in " << coolManifoldName_a << " with no translation and no rotation";
//
name = "TOBCoolingManifold" + names[i] + "r";
dz = coolRout1;
DDName manifoldName_r(name, idNameSpace);
solid = DDSolidFactory::torus(manifoldName_r, coolRin, coolRout1, coolR2[i], coolStartPhi1, coolDeltaPhi1);
LogDebug("TOBGeom") << "DDTOBRadCableAlgo test: " << DDName(name, idNameSpace) << " Torus made of " << coolM1
<< " from " << coolStartPhi1 / CLHEP::deg << " to "
<< (coolStartPhi1 + coolDeltaPhi1) / CLHEP::deg << " with Rin " << coolRin << " Rout "
<< coolRout1 << " R torus " << coolR2[i];
DDName coolManifoldName_r(DDSplit(coolM1).first, DDSplit(coolM1).second);
DDMaterial coolManifoldMatter_r(coolManifoldName_r);
DDLogicalPart coolManifoldLogic_r(DDName(name, idNameSpace), coolManifoldMatter_r, solid);
r1 = DDTranslation(0, 0, (dz - diskDz));
cpv.position(DDName(name, idNameSpace), diskName, i + 1, r1, DDRotation());
LogDebug("TOBGeom") << "DDTOBRadCableAlgo test: " << DDName(name, idNameSpace) << " number " << i + 1
<< " positioned in " << diskName << " at " << r1 << " with no rotation";
// Cooling Fluid (in Cooling Manifold)
name = "TOBCoolingManifoldFluid" + names[i] + "r";
solid =
DDSolidFactory::torus(DDName(name, idNameSpace), coolRin, coolRout2, coolR2[i], coolStartPhi2, coolDeltaPhi2);
LogDebug("TOBGeom") << "DDTOBRadCableAlgo test: " << DDName(name, idNameSpace) << " Torus made of " << coolM2
<< " from " << coolStartPhi2 / CLHEP::deg << " to "
<< (coolStartPhi2 + coolDeltaPhi2) / CLHEP::deg << " with Rin " << coolRin << " Rout "
<< coolRout2 << " R torus " << coolR2[i];
DDName coolManifoldFluidName_r(DDSplit(coolM2).first, DDSplit(coolM2).second);
DDMaterial coolManifoldFluidMatter_r(coolManifoldFluidName_r);
DDLogicalPart coolManifoldFluidLogic_r(DDName(name, idNameSpace), coolManifoldFluidMatter_r, solid);
cpv.position(DDName(name, idNameSpace), manifoldName_r, i + 1, DDTranslation(), DDRotation());
LogDebug("TOBGeom") << "DDTOBRadCableAlgo test: " << DDName(name, idNameSpace) << " number " << i + 1
<< " positioned in " << coolManifoldName_r << " with no translation and no rotation";
// Connectors
name = "TOBConn" + names[i];
dz = 0.5 * connT;
rin = 0.5 * (rodRin[i] + rodRout[i]) - 0.5 * connW;
rout = 0.5 * (rodRin[i] + rodRout[i]) + 0.5 * connW;
solid = DDSolidFactory::tubs(DDName(name, idNameSpace), dz, rin, rout, 0, CLHEP::twopi);
LogDebug("TOBGeom") << "DDTOBRadCableAlgo test: " << DDName(name, idNameSpace) << " Tubs made of " << connM[i]
<< " from 0 to " << CLHEP::twopi / CLHEP::deg << " with Rin " << rin << " Rout " << rout
<< " ZHalf " << dz;
DDName connName(DDSplit(connM[i]).first, DDSplit(connM[i]).second);
DDMaterial connMatter(connName);
DDLogicalPart connLogic(DDName(name, idNameSpace), connMatter, solid);
DDTranslation r2(0, 0, (dz - diskDz));
cpv.position(DDName(name, idNameSpace), diskName, i + 1, r2, DDRotation());
LogDebug("TOBGeom") << "DDTOBRadCableAlgo test: " << DDName(name, idNameSpace) << " number " << i + 1
<< " positioned in " << diskName << " at " << r2 << " with no rotation";
// Now the radial cable
name = "TOBRadServices" + names[i];
rin = 0.5 * (rodRin[i] + rodRout[i]);
rout = (i + 1 == (int)(names.size()) ? rMax : 0.5 * (rodRin[i + 1] + rodRout[i + 1]));
vector<double> pgonZ;
pgonZ.emplace_back(-0.5 * cableT);
pgonZ.emplace_back(cableT * (rin / rMax - 0.5));
pgonZ.emplace_back(0.5 * cableT);
vector<double> pgonRmin;
pgonRmin.emplace_back(rin);
pgonRmin.emplace_back(rin);
pgonRmin.emplace_back(rin);
vector<double> pgonRmax;
pgonRmax.emplace_back(rout);
pgonRmax.emplace_back(rout);
pgonRmax.emplace_back(rout);
solid = DDSolidFactory::polycone(DDName(name, idNameSpace), 0, CLHEP::twopi, pgonZ, pgonRmin, pgonRmax);
LogDebug("TOBGeom") << "DDTOBRadCableAlgo test: " << DDName(name, idNameSpace) << " Polycone made of " << cableM[i]
<< " from 0 to " << CLHEP::twopi / CLHEP::deg << " and with " << pgonZ.size() << " sections";
for (int ii = 0; ii < (int)(pgonZ.size()); ii++)
LogDebug("TOBGeom") << "\t[" << ii << "]\tZ = " << pgonZ[ii] << "\tRmin = " << pgonRmin[ii]
<< "\tRmax = " << pgonRmax[ii];
DDName cableName(DDSplit(cableM[i]).first, DDSplit(cableM[i]).second);
DDMaterial cableMatter(cableName);
DDLogicalPart cableLogic(DDName(name, idNameSpace), cableMatter, solid);
DDTranslation r3(0, 0, (diskDz - (i + 0.5) * cableT));
cpv.position(DDName(name, idNameSpace), diskName, i + 1, r3, DDRotation());
LogDebug("TOBGeom") << "DDTOBRadCableAlgo test: " << DDName(name, idNameSpace) << " number " << i + 1
<< " positioned in " << diskName << " at " << r3 << " with no rotation";
}
LogDebug("TOBGeom") << "<<== End of DDTOBRadCableAlgo construction ...";
}
DEFINE_EDM_PLUGIN(DDAlgorithmFactory, DDTOBRadCableAlgo, "track:DDTOBRadCableAlgo");
|