ATLAS Offline Software
Loading...
Searching...
No Matches
EndcapPresamplerConstruction.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#include "GeoModelKernel/GeoElement.h"
7#include "GeoModelKernel/GeoMaterial.h"
8#include "GeoModelKernel/GeoFullPhysVol.h"
9#include "GeoModelKernel/GeoPhysVol.h"
10#include "GeoModelKernel/GeoVPhysVol.h"
11#include "GeoModelKernel/GeoLogVol.h"
12#include "GeoModelKernel/GeoTubs.h"
13#include "GeoModelKernel/GeoNameTag.h"
14#include "GeoModelKernel/GeoIdentifierTag.h"
15#include "GeoModelKernel/GeoDefinitions.h"
17#include "GeoModelKernel/GeoShapeUnion.h"
18#include "GeoModelKernel/GeoShapeShift.h"
19
21#include "GaudiKernel/MsgStream.h"
22#include "GaudiKernel/Bootstrap.h"
23#include "GaudiKernel/SystemOfUnits.h"
24
25// For the database:
26
30
32
33#include <string>
34#include <cmath>
35
36
37// EndcapPresamplerConstruction
38// Insert the LAr Endcap Presampler into a pre-defined mother volume
39// i.e. into the front cold wall of endcap cryostat (cyl.#14)
40// 14-Jan-2002 Mikhail Leltchouk
41
42
43
49
51
52
53GeoIntrusivePtr<GeoFullPhysVol> EndcapPresamplerConstruction::Envelope()
54{
55 if (m_psPhysical) return m_psPhysical->clone();
56
57
58 ISvcLocator *svcLocator = Gaudi::svcLocator();
59 SmartIF<StoreGateSvc> detStore{svcLocator->service("DetectorStore")};
60 if (!detStore.isValid()) {
61 throw std::runtime_error("Error in EndcapCryostatConstruction, cannot access DetectorStore");
62 }
63
64 StoredMaterialManager* materialManager = nullptr;
65 if (StatusCode::SUCCESS != detStore->retrieve(materialManager, std::string("MATERIALS"))) return nullptr;
66
67 const GeoMaterial *LAr = materialManager->getMaterial("std::LiquidArgon");
68 if (!LAr) {
69 throw std::runtime_error("Error in EndcapCryostatConstruction, std::LiquidArgon is not found.");
70 }
71
72
73 //===>
74 SmartIF<IRDBAccessSvc> pAccessSvc{svcLocator->service("RDBAccessSvc")};
75 if (!pAccessSvc.isValid()) {
76 throw std::runtime_error ("Cannot locate RDBAccessSvc!!");
77 }
78
79 SmartIF<IGeoModelSvc> geoModel{svcLocator->service("GeoModelSvc")};
80 if (!geoModel.isValid()) {
81 throw std::runtime_error ("Cannot locate GeoModelSvc!!");
82 }
83
84 std::string AtlasVersion = geoModel->atlasVersion();
85 std::string LArVersion = geoModel->LAr_VersionOverride();
86
87 std::string detectorKey = LArVersion.empty() ? AtlasVersion : LArVersion;
88 std::string detectorNode = LArVersion.empty() ? "ATLAS" : "LAr";
89
90
91
92 IRDBRecordset_ptr presamplerPosition = pAccessSvc->getRecordsetPtr("PresamplerPosition",AtlasVersion, "ATLAS");
93
94 //===>
95
96
98 // LAr Endcap Presampler GEOMETRY
100 double Rmin = 1231.74*Gaudi::Units::mm;
101 double Rmax = 1701.98*Gaudi::Units::mm;
102 double HalfZ = ((*presamplerPosition)[0]->getDouble("TCK")/2.)*Gaudi::Units::cm;
103
104
105 std::string name = "LAr::Endcap::Presampler::LiquidArgon";
106
107 double phi_size = 360.*Gaudi::Units::deg;
108 double start_phi = 0.;
109
110 if( m_isModule ){
111 phi_size = M_PI / 4;
112 start_phi = M_PI / 2 - M_PI / 8;
113 }
114
115 GeoTubs* endcapPresamplerSolid = new GeoTubs(Rmin, Rmax, HalfZ, start_phi, phi_size);
116
117 const GeoLogVol* endcapPresamplerLog = new GeoLogVol(name,endcapPresamplerSolid, LAr);
118 m_psPhysical = new GeoFullPhysVol(endcapPresamplerLog);
119
120 return m_psPhysical;
121}
122
123/* G3 code for comparison: cryogeo.age
124
125 Fill CREE ! e. cold wall front flange
126 Section = 14 ! endcap element number
127 Material = 2 ! material type
128 Rmin = 22.1 ! minimal radius 23.2 > 22.1
129 Dr = 194.4 ! radial thickness 193.8 > 195.4 > 194.4cold
130 Zmin = 356.1 ! location in z (minimum) 357.0 > 356.1
131 Dz = 6.5 ! lenght in z 5.0 > 6.5
132
133 FILL PSAM ! CEPS parameters - ABSOLUTE nominal positions
134 zpos = 362.4 ! nominal positions
135 Tck = 0.4 ! thinkness
136 rmin = 123.174 ! minimal radius
137 rmax = 170.198 ! maximum radius
138* ---------------------------------------------------------------------
139Block CEPS is the EC presampler
140 Material Liquid_Argon
141 Medium sensitive isvol=1
142 Attribute CEPS seen=1 colo=3
143 Shape TUBE Rmin=psam_rmin Rmax=psam_rmax dz=psam_Tck/2
144
145* eta limits are calculated based on geometry, taken into account Zshift:
146
147 eta1=asinh((psam_zpos+CRYM_Zshift)/psam_rmax)
148 eta2=asinh((psam_zpos+CRYM_Zshift)/psam_rmin)
149 nbin=nint((eta2-eta1)/chit_Detaps)
150 deta=(eta2-eta1)/nbin
151 HITS CEPS comp=1:1: eta:deta:(eta1,eta2),
152 phi:chit_Dphi:(0,2*M_PI),
153 Eloss:0:(0,chit_Emax)
154endblock
155* ---------------------------------------------------------------------
156*/
#define M_PI
Declaration of EndcapPresamplerConstruction class.
Definition of the abstract IRDBAccessSvc interface.
std::shared_ptr< IRDBRecordset > IRDBRecordset_ptr
Definition of the abstract IRDBRecord interface.
Definition of the abstract IRDBRecordset interface.
GeoIntrusivePtr< GeoFullPhysVol > m_psPhysical
GeoIntrusivePtr< GeoFullPhysVol > Envelope()
This class holds one or more material managers and makes them storeable, under StoreGate.
virtual const GeoMaterial * getMaterial(const std::string &name)=0