50{
51
52 msg(MSG::DEBUG) <<
"Building TRT Service Material" <<
endmsg;
53
54
55
56 DecodeVersionKey atlasVersionKey(
geoDbTagSvc(),
"ATLAS");
57 DecodeVersionKey indetVersionKey(
geoDbTagSvc(),
"InnerDetector");
58 DecodeVersionKey trtVersionKey(
geoDbTagSvc(),
"TRT");
59
60 std::string railversion =
rdbAccessSvc()->
getChildTag(
"IDDetailedRail",indetVersionKey.tag(),indetVersionKey.node());
61 if(!railversion.empty()) {
62
63
64
68
69
71
73
74
75
80
81
82 double outROfIDet = (*atls)[0]->getDouble("IDETOR")*Gaudi::Units::cm;
83 double endZOfIDet = (*atls)[0]->getDouble("IDETZMX")*Gaudi::Units::cm;
84
85
86 double rminInt = (*cage)[0]->getDouble("RINGRMIN")*Gaudi::Units::mm;
87
88
90 if(commonParameters->
size()==0)
92
93 double yWidthUSP1 = (*commonParameters)[0]->getDouble("YWIDTHUSP1");
94 double yRailSup = (*commonParameters)[0]->getDouble("YRAILSUP");
95 double yRailSupPart3 = (*commonParameters)[0]->getDouble("YRAILSUPPART3");
96 double gapOfRSF = (*commonParameters)[0]->getDouble("GAPOFRSF");
97 double yWidthTRSB = (*commonParameters)[0]->getDouble("YWIDTHTRSB");
98
99 double coordY = yWidthUSP1/2. - yRailSup + (yRailSupPart3 - gapOfRSF/2.);
100
101 double phiTop = asin((yWidthTRSB + coordY) / (rminInt));
102 double phiBot = asin((yWidthTRSB/2. - coordY) / (rminInt));
103
104 GeoIntrusivePtr<const GeoShape> railGap1{new GeoTubs( rminInt, outROfIDet, endZOfIDet, -phiBot, phiBot + phiTop)};
105 GeoIntrusivePtr<const GeoShape> railGap2{
new GeoTubs( rminInt, outROfIDet, endZOfIDet,
M_PI - phiTop, phiBot + phiTop)};
106
107
108 for (
unsigned int ii =0; ii < trtGenServices->
size(); ii++) {
109
110 InDetDD::GenericTubeMaker tubeHelper((*trtGenServices)[ii]);
111 const GeoShape * serviceTubeTmp = tubeHelper.buildShape();
112
113 std::string logName = tubeHelper.name();
114 if (logName.empty()) {
115 std::ostringstream o; o << ii;
116 logName = "ServMat"+o.str();
117 }
118 logName = "Trt" + logName;
119
120 const GeoShape* serviceTube = serviceTubeTmp;
121
122 if( tubeHelper.volData().maxRadius() > rminInt && tubeHelper.volData().phiDelta() > 359.9*Gaudi::Units::degree)
123 {
124
125 serviceTube = (GeoShape*) & (*serviceTubeTmp).subtract(*railGap2).subtract(*railGap1);
126 }
127
128 std::string materialName = tubeHelper.materialName();
129
131
132 const GeoLogVol* servLog = new GeoLogVol(logName,serviceTube,material);
133 GeoVPhysVol* servPhys = new GeoPhysVol(servLog);
134
135 if (tubeHelper.name() == "FwdServ")
136 {
137 GeoTransform *xform1 = new GeoTransform(GeoTrf::Translate3D(0, 0, tubeHelper.volData().zMid() ));
138 GeoTransform *xform2 = new GeoTransform(GeoTrf::Translate3D(0, 0, -tubeHelper.volData().zMid() ));
139 mother->add(xform1); mother->add(servPhys); mother->add(xform2); mother->add(servPhys);
140 }
141 else {
142 tubeHelper.placeVolume(mother, servPhys);
143 }
144 }
145
146 }
147 else {
148
149
153
154
156
158
159
160
164
165
166 double outROfIDet = (*atls)[0]->getDouble("IDETOR")*Gaudi::Units::cm;
167 double endZOfIDet = (*atls)[0]->getDouble("IDETZMX")*Gaudi::Units::cm;
168 double minRofGap = 1050.0;
169 double phiWid=70./outROfIDet; double safetyGap=1.;
170 GeoIntrusivePtr<const GeoShape> railGap1{new GeoTubs( minRofGap, outROfIDet+safetyGap ,endZOfIDet+safetyGap ,
171 -phiWid/2.,phiWid)};
172 GeoIntrusivePtr<const GeoShape> railGap2{new GeoTubs( minRofGap, outROfIDet+safetyGap ,endZOfIDet+safetyGap ,
173 -phiWid/2.+
M_PI,phiWid)};
174
175
176
177
178 double rminInt = (*cage)[0]->getDouble("RINGRMIN")*Gaudi::Units::mm;
179 double ringThick = (*cage)[0]->getDouble("RINGTHICK")*Gaudi::Units::mm;
180 double ringGap = (*cage)[0]->getDouble("RINGGAP")*Gaudi::Units::mm;
181 double ribWid = (*cage)[0]->getDouble("RIBWIDTH")*Gaudi::Units::mm;
182 double phiWidSQ=ribWid/(rminInt+ringThick+ringGap/2.);
183
184
185
186
187
188
189
190 for (
unsigned int ii =0; ii < trtGenServices->
size(); ii++) {
191
192 InDetDD::GenericTubeMaker tubeHelper((*trtGenServices)[ii]);
193 const GeoShape * serviceTubeTmp = tubeHelper.buildShape();
194
195 std::string logName = tubeHelper.name();
196 if (logName.empty()) {
197 std::ostringstream o; o << ii;
198 logName = "ServMat"+o.str();
199 }
200 logName = "Trt" + logName;
201
202
203
204 const GeoShape* serviceTube = serviceTubeTmp;
205
206
207 if (tubeHelper.name() == "FwdServ") {
208 const GeoShape* ribSup1 = new GeoTubs( tubeHelper.volData().rmin(), tubeHelper.volData().rmax(), 0.5*tubeHelper.volData().length(),
209 -phiWidSQ/2., phiWidSQ);
210 const GeoShape* ribSup2 = new GeoTubs( tubeHelper.volData().rmin(), tubeHelper.volData().rmax(), 0.5*tubeHelper.volData().length(),
211 -phiWidSQ/2.+
M_PI, phiWidSQ);
212 serviceTube = (GeoShape*) & (*serviceTubeTmp).subtract(*ribSup1).subtract(*ribSup2);
213 } else if( tubeHelper.volData().maxRadius() > minRofGap && tubeHelper.volData().phiDelta() > 359.9*Gaudi::Units::degree) {
214
215 serviceTube = (GeoShape*) & (*serviceTubeTmp).subtract(*railGap2).subtract(*railGap1);
216 }
217
218 std::string materialName = tubeHelper.materialName();
219
221
222 const GeoLogVol* servLog = new GeoLogVol(logName,serviceTube,material);
223 GeoVPhysVol* servPhys = new GeoPhysVol(servLog);
224
225 tubeHelper.placeVolume(mother, servPhys);
226
227 }
228 }
229}
std::shared_ptr< IRDBRecordset > IRDBRecordset_ptr
virtual std::string getChildTag(const std::string &childNode, const std::string &parentTag, const std::string &parentNode, const std::string &connName="ATLASDD")=0
Gets the tag name for the node by giving its parent node tag.
virtual IRDBRecordset_ptr getRecordsetPtr(const std::string &node, const std::string &tag, const std::string &tag2node="", const std::string &connName="ATLASDD")=0
Provides access to the Recordset object containing HVS-tagged data.
virtual unsigned int size() const =0
InDetMaterialManager * materialManager()
const IGeoDbTagSvc * geoDbTagSvc() const
InDetMaterialManager * m_materialManager
IRDBAccessSvc * rdbAccessSvc()
InDetDD::AthenaComps * getAthenaComps()
std::unique_ptr< InDetMaterialManager > m_materialManagerUnique
const GeoMaterial * getMaterial(const std::string &materialName)
Get material. First looks for locally defined material and if not found looks in GeoModel material ma...