ATLAS Offline Software
Loading...
Searching...
No Matches
TRT_ServMatFactory.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
3*/
4
6
7// GeoModel includes
9#include "GeoModelKernel/GeoDefinitions.h"
10#include "GeoModelKernel/GeoPhysVol.h"
11#include "GeoModelKernel/GeoLogVol.h"
12#include "GeoModelKernel/GeoTube.h"
13#include "GeoModelKernel/GeoTubs.h"
14#include "GeoModelKernel/GeoPcon.h"
15#include "GeoModelKernel/GeoCons.h"
16#include "GeoModelKernel/GeoMaterial.h"
17#include "GeoModelKernel/GeoTransform.h"
18#include "GeoModelKernel/GeoShapeSubtraction.h"
19
23
29#include "GaudiKernel/SystemOfUnits.h"
30
32
33#include <sstream>
34#include <iostream>
35
40
41
45
46
47
48//## Other Operations (implementation)
49void TRT_ServMatFactory::create(GeoPhysVol *mother)
50{
51
52 msg(MSG::DEBUG) << "Building TRT Service Material" << endmsg;
53
54 //double epsilon = 0.002;
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 // Geometry with ID rail
64
65 IRDBRecordset_ptr atls = rdbAccessSvc()->getRecordsetPtr("AtlasMother", atlasVersionKey.tag(), atlasVersionKey.node());
66 IRDBRecordset_ptr cage = rdbAccessSvc()->getRecordsetPtr("SquirrelCage", indetVersionKey.tag(), indetVersionKey.node());
67 IRDBRecordset_ptr trtGenServices = rdbAccessSvc()->getRecordsetPtr("TRTGenServices", indetVersionKey.tag(), indetVersionKey.node());
68
69 // Doesn't exist at time of writing but we include it to keep things general
70 IRDBRecordset_ptr weightTable = rdbAccessSvc()->getRecordsetPtr("TrtWeights", trtVersionKey.tag(), trtVersionKey.node());
71
72 IRDBRecordset_ptr scalingTable = rdbAccessSvc()->getRecordsetPtr("InDetServMatScaling", indetVersionKey.tag(), indetVersionKey.node());
73
74 // Get the InDet material manager. This is a wrapper around the geomodel one with some extra functionality to deal
75 // with weights table if it exists
76 m_materialManagerUnique = std::make_unique<InDetMaterialManager>("TRT_MaterialManager", getAthenaComps());
78 m_materialManager->addWeightTable(weightTable, "trt");
79 m_materialManager->addScalingTable(scalingTable);
80
81 //VK 10/09/2005 Construct a gap for rails
82 double outROfIDet = (*atls)[0]->getDouble("IDETOR")*Gaudi::Units::cm;
83 double endZOfIDet = (*atls)[0]->getDouble("IDETZMX")*Gaudi::Units::cm;
84
85//VK 26.03.2007 Construct a gap for SquirrelCage ribbon
86 double rminInt = (*cage)[0]->getDouble("RINGRMIN")*Gaudi::Units::mm;
87
88//created by Adam Agocs
89 IRDBRecordset_ptr commonParameters = rdbAccessSvc()->getRecordsetPtr("IDDetRailCommon",indetVersionKey.tag(), indetVersionKey.node());
90 if(commonParameters->size()==0)
91 commonParameters = rdbAccessSvc()->getRecordsetPtr("IDDetRailCommon","IDDetRailCommon-00");
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 // Subtract RailGap out of services
125 serviceTube = (GeoShape*) & (*serviceTubeTmp).subtract(*railGap2).subtract(*railGap1);
126 }
127
128 std::string materialName = tubeHelper.materialName();
129 //const GeoMaterial* material = m_materialManager->getMaterialForVolume(materialName, serviceTube->volume());
130 const GeoMaterial* material = m_materialManager->getMaterial(materialName);
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 // Geometry without ID rail
150 IRDBRecordset_ptr atls = rdbAccessSvc()->getRecordsetPtr("AtlasMother", atlasVersionKey.tag(), atlasVersionKey.node());
151 IRDBRecordset_ptr cage = rdbAccessSvc()->getRecordsetPtr("SquirrelCage", indetVersionKey.tag(), indetVersionKey.node());
152 IRDBRecordset_ptr trtGenServices = rdbAccessSvc()->getRecordsetPtr("TRTGenServices", indetVersionKey.tag(), indetVersionKey.node());
153
154 // Doesn't exist at time of writing but we include it to keep things general
155 IRDBRecordset_ptr weightTable = rdbAccessSvc()->getRecordsetPtr("TrtWeights", trtVersionKey.tag(), trtVersionKey.node());
156
157 IRDBRecordset_ptr scalingTable = rdbAccessSvc()->getRecordsetPtr("InDetServMatScaling", indetVersionKey.tag(), indetVersionKey.node());
158
159 // Get the InDet material manager. This is a wrapper around the geomodel one with some extra functionality to deal
160 // with weights table if it exists
161 m_materialManager = new InDetMaterialManager("TRT_MaterialManager", getAthenaComps());
162 m_materialManager->addWeightTable(weightTable, "trt");
163 m_materialManager->addScalingTable(scalingTable);
164
165 //VK 10/09/2005 Construct a gap for rails
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//VK 26.03.2007 Construct a gap for SquirrelCage ribbon
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 // Build general services:
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 // Subtract RailGap out of services
215 serviceTube = (GeoShape*) & (*serviceTubeTmp).subtract(*railGap2).subtract(*railGap1);
216 }
217
218 std::string materialName = tubeHelper.materialName();
219 //const GeoMaterial* material = materialManager()->getMaterialForVolume(materialName, serviceTube->volume());
220 const GeoMaterial* material = materialManager()->getMaterial(materialName);
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}
230
#define M_PI
#define endmsg
Definition of the abstract IRDBAccessSvc interface.
std::shared_ptr< IRDBRecordset > IRDBRecordset_ptr
Definition of the abstract IRDBRecord interface.
Definition of the abstract IRDBRecordset interface.
Define macros for attributes used to control the static checker.
This is a helper class to query the version tags from GeoModelSvc and determine the appropriate tag a...
const std::string & tag() const
Return version tag.
const std::string & node() const
Return the version node.
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
Class to hold various Athena components.
const GeoShape * buildShape()
std::string materialName() const
void placeVolume(GeoPhysVol *parent, GeoVPhysVol *child, double zParent=0)
const TubeVolData & volData() const
const IGeoDbTagSvc * geoDbTagSvc() const
std::unique_ptr< InDetMaterialManager > m_materialManagerUnique
SubDetectorFactoryBase(InDetDD::AthenaComps *athenaComps)
double maxRadius() const
double zMid() const
Definition TubeVolData.h:27
double length() const
Definition TubeVolData.h:26
double rmax() const
Definition TubeVolData.h:23
double rmin() const
Definition TubeVolData.h:22
double phiDelta() const
Definition TubeVolData.h:29
InDetMaterialManager.
const GeoMaterial * getMaterial(const std::string &materialName)
Get material. First looks for locally defined material and if not found looks in GeoModel material ma...
void create(GeoPhysVol *mother)
TRT_ServMatFactory(InDetDD::AthenaComps *athenaComps)
Message Stream Member.
MsgStream & msg
Definition testRead.cxx:32