75 {
76
77
78
79 ISvcLocator *svcLocator = Gaudi::svcLocator();
80
82
83 log << MSG::DEBUG <<
"+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++" <<
endmsg;
85 log << MSG::DEBUG <<
"+ Start of HECWheel GeoModel definition +" <<
endmsg;
87 log << MSG::DEBUG <<
"+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++" <<
endmsg;
88
89
90 SmartIF<StoreGateSvc>
detStore{svcLocator->service(
"DetectorStore")};
92 throw std::runtime_error("Error in HECWheelConstruction, cannot access DetectorStore");
93 }
94
95
96 StoredMaterialManager* materialManager = nullptr;
97 if (StatusCode::SUCCESS !=
detStore->retrieve(materialManager, std::string(
"MATERIALS"))) {
98 throw std::runtime_error("Error in HECWheelConstruction, cannot access Material Manager");
99 }
100
101 const GeoMaterial *LAr = materialManager->
getMaterial(
"std::LiquidArgon");
102 if (!LAr) throw std::runtime_error("Error in HECWheelConstruction, std::LiquidArgon is not found.");
103
104 const GeoMaterial *Iron = materialManager->
getMaterial(
"std::Iron");
105 if (!Iron) throw std::runtime_error("Error in HECWheelConstruction, std::Iron is not found.");
106
107
108
110 SmartIF<IRDBAccessSvc> pAccessSvc{svcLocator->service("RDBAccessSvc")};
111 if(!pAccessSvc.isValid()) {
112 throw std::runtime_error ("Cannot locate RDBAccessSvc!!");
113 }
114
115 SmartIF<IGeoModelSvc> geoModel{svcLocator->service ("GeoModelSvc")};
116 if(!geoModel.isValid()) {
117 throw std::runtime_error ("Cannot locate GeoModelSvc!!");
118 }
119
121 std::string LArVersion = geoModel->LAr_VersionOverride();
122
123 std::string detectorKey = LArVersion.empty() ?
AtlasVersion : LArVersion;
124 std::string detectorNode = LArVersion.empty() ? "ATLAS" : "LAr";
125
126 IRDBRecordset_ptr hadronicEndcap = pAccessSvc->getRecordsetPtr(
"HadronicEndcap",detectorKey, detectorNode);
127 if(hadronicEndcap->
size()>0)
128 log << MSG::DEBUG <<
"Using numbers from HadronicEndcap tag: " << hadronicEndcap->
tagName() <<
endmsg;
129 else
130 throw std::runtime_error("Error in HECConstruction: hadronicEendcap not found");
131
132 IRDBRecordset_ptr hecLongitudinalBlock = pAccessSvc->getRecordsetPtr(
"HecLongitudinalBlock",detectorKey, detectorNode);
133 if(hecLongitudinalBlock->
size()>0)
134 log << MSG::DEBUG <<
"Using numbers from HecLongitudinalBlock tag: " << hecLongitudinalBlock->
tagName() <<
endmsg;
135 else
136 throw std::runtime_error("Error in HECConstruction: hecLongitudinalBlock not found");
137
138 IRDBRecordset_ptr coldContraction = pAccessSvc->getRecordsetPtr(
"ColdContraction",detectorKey, detectorNode);
139 if(coldContraction->
size()>0)
140 log << MSG::DEBUG <<
"Numbers from ColdContraction db (not used yet) tag: " << coldContraction->
tagName() <<
endmsg;
141 else
142 throw std::runtime_error("Error in HECConstruction: ColdContraction not found");
143
144
145
146
147
148
149
150
151
152 double shrinkCold = 1.0;
153
154 int moduleNumber = (*hadronicEndcap)[0]->getInt("NSCT");
155 double drModOverlap = shrinkCold * (*hadronicEndcap)[0]->getDouble(
"DRMODOVERLAP")*
cm;
156 double rOuter = shrinkCold * (*hecLongitudinalBlock)[0]->getDouble(
"BLRMX")*
cm;
157 if (rOuter<2100.*mm) rOuter = shrinkCold * 2130*
mm;
158
159 double rInner1 = shrinkCold * (*hecLongitudinalBlock)[0]->getDouble(
"BLRMN")*
cm;
160 double rInner2 = shrinkCold * (*hecLongitudinalBlock)[1]->getDouble(
"BLRMN")*
cm;
161 double firstFrontAbsThickness= shrinkCold * (*hecLongitudinalBlock)[0]->getDouble(
"PLATE0")*
cm;
162 double firstRearAbsThickness = shrinkCold * (*hecLongitudinalBlock)[3]->getDouble(
"PLATE0")*
cm;
163 double frontAbsThickness = shrinkCold * (*hadronicEndcap)[0]->getDouble(
"PLATE_0")*
cm;
164 double rearAbsThickness = shrinkCold * (*hadronicEndcap)[0]->getDouble(
"PLATE_1")*
cm;
165 double gapSize = shrinkCold * (*hadronicEndcap)[0]->getDouble(
"LARG")*
cm;
166 int gapNumber[7];
167 for (
int id=0;
id<7;
id++) gapNumber[
id] = (
int) (*hecLongitudinalBlock)[
id]->getDouble(
"BLMOD");
168
169
170
171 double depthSize[7];
172 depthSize[0] = firstFrontAbsThickness + gapNumber[0]*(frontAbsThickness+gapSize);
173 depthSize[1] = gapNumber[1]*(frontAbsThickness+gapSize);
174 depthSize[2] = gapNumber[2]*(frontAbsThickness+gapSize);
175 depthSize[3] = firstRearAbsThickness + gapNumber[3]*(rearAbsThickness+gapSize);
176 depthSize[4] = gapNumber[4]*(rearAbsThickness+gapSize);
177 depthSize[5] = gapNumber[5]*(rearAbsThickness+gapSize);
178 depthSize[6] = gapNumber[6]*(rearAbsThickness+gapSize);
179
180
181
182 double g4allow = shrinkCold * 0.2*
mm;
183 double zCoordinate[4];
185 zCoordinate[0] = shrinkCold * 0.0*
cm;
186 zCoordinate[1] = depthSize[0];
187 zCoordinate[2] = depthSize[0] + g4allow;
188 zCoordinate[3] = depthSize[0] + depthSize[1] + depthSize[2] + g4allow;
189 }
190 else{
191 zCoordinate[0] = shrinkCold * 0.0*
cm;
192 zCoordinate[1] = depthSize[3] + depthSize[4] + depthSize[5] + depthSize[6] + g4allow;
193 }
194
195
196
197
198
199
200 double modulePhistart = 264.375*
deg;
201 double moduleDeltaPhi = 2*
M_PI/moduleNumber;
202
203 int nZplane = 4;
205
206
207
208
209
210
211 GeoPcon* solidHECWheel =
new GeoPcon(0., 2.*
M_PI);
212 for (
int i=0;
i< nZplane;
i++)
213 {
214 double innerRadius = rInner2;
216 solidHECWheel->addPlane(zCoordinate[i],innerRadius-drModOverlap,rOuter);
217 }
218 std::string hecFrontName = "LAr::HEC::LiquidArgon";
219 const GeoLogVol* logicHECWheel = new GeoLogVol(hecFrontName, solidHECWheel , LAr);
220 GeoIntrusivePtr<GeoFullPhysVol> physiHECWheel{new GeoFullPhysVol(logicHECWheel)};
221
222
224
225
226
227
228
229
231 PVLink moduleEnvelope = HECModule.GetEnvelope();
232
233
234
235
236
237
238
239 GeoSerialIdentifier *sIF = new GeoSerialIdentifier(0);
240 GeoGenfun::Variable
Index;
241
243 GeoGenfun::GENFUNCTION ModuleRotationAngle = -modulePhistart + moduleDeltaPhi*
Index;
244 GeoXF::TRANSFUNCTION
t = GeoXF::Pow(RotateZ3D(1.0),ModuleRotationAngle);
245 GeoSerialTransformer *sTF = new GeoSerialTransformer (moduleEnvelope,&t,moduleNumber);
246 physiHECWheel->add(sIF);
247 physiHECWheel->add(sTF);
248 } else {
249
250 GeoGenfun::GENFUNCTION ModuleRotationAngle1 = -modulePhistart+180*
deg-moduleDeltaPhi - moduleDeltaPhi*
Index;
251 GeoXF::TRANSFUNCTION
t1 = GeoXF::Pow(RotateZ3D(1.0),ModuleRotationAngle1);
252 GeoSerialTransformer *sTF1 = new GeoSerialTransformer (moduleEnvelope,&t1,moduleNumber);
253 physiHECWheel->add(sIF);
254 physiHECWheel->add(sTF1);
255 }
256
257
258
259
260
262 HECClamp.AddClamps(physiHECWheel);
263 }
264
265 return physiHECWheel;
266}
std::shared_ptr< IRDBRecordset > IRDBRecordset_ptr
IndexedConstituentUserInfo::Index Index
virtual std::string tagName() const =0
virtual unsigned int size() const =0
virtual const GeoMaterial * getMaterial(const std::string &name)=0
std::vector< ALFA_RawDataCollection_p1 > t1
IMessageSvc * getMessageSvc(bool quiet=false)
::StatusCode StatusCode
StatusCode definition for legacy code.