ATLAS Offline Software
Public Member Functions | Private Attributes | List of all members
LArGeo::H6CryostatConstruction Class Reference

#include <H6CryostatConstruction.h>

Collaboration diagram for LArGeo::H6CryostatConstruction:

Public Member Functions

 H6CryostatConstruction ()
 
virtual ~H6CryostatConstruction ()
 
virtual GeoIntrusivePtr< GeoVFullPhysVol > GetEnvelope ()
 
GeoIntrusivePtr< GeoPhysVol > GetLArPhysical ()
 

Private Attributes

GeoFullPhysVol * m_cryoMotherPhysical
 
GeoPhysVol * m_cryoLArPhys
 

Detailed Description

Definition at line 22 of file H6CryostatConstruction.h.

Constructor & Destructor Documentation

◆ H6CryostatConstruction()

LArGeo::H6CryostatConstruction::H6CryostatConstruction ( )

Definition at line 46 of file H6CryostatConstruction.cxx.

46  :
47  m_cryoMotherPhysical(nullptr),
48  m_cryoLArPhys(nullptr)
49 {}

◆ ~H6CryostatConstruction()

LArGeo::H6CryostatConstruction::~H6CryostatConstruction ( )
virtualdefault

Member Function Documentation

◆ GetEnvelope()

GeoIntrusivePtr< GeoVFullPhysVol > LArGeo::H6CryostatConstruction::GetEnvelope ( )
virtual

Definition at line 53 of file H6CryostatConstruction.cxx.

54 {
55 
57 
58  // Detector Store
59  ISvcLocator *svcLocator = Gaudi::svcLocator();
61  if (svcLocator->service("DetectorStore", detStore, false )==StatusCode::FAILURE) {
62  throw std::runtime_error("Error in H6CryostatConstruction, cannot access DetectorStore");
63  }
64 
65  // Material Manager
66  StoredMaterialManager* materialManager = nullptr;
67  if (StatusCode::SUCCESS != detStore->retrieve(materialManager, std::string("MATERIALS"))) return nullptr;
68 
69  const GeoMaterial *Air = materialManager->getMaterial("std::Air");
70  if (!Air) {
71  throw std::runtime_error("Error in H6CryostatConstruction, std::Air is not found.");
72  }
73  const GeoMaterial *Iron = materialManager->getMaterial("std::Iron");
74  if (!Iron) {
75  throw std::runtime_error("Error in H6CryostatConstruction, std::Iron is not found.");
76  }
77  const GeoMaterial *LAr = materialManager->getMaterial("std::LiquidArgon");
78  if (!LAr) {
79  throw std::runtime_error("Error in H6CryostatConstruction, std::LiquidArgon is not found.");
80  }
81 
82  // GeoModelSvc
83  ServiceHandle<IGeoModelSvc> geoModelSvc ("GeoModelSvc", "H6CryostatConstruction");
84  if (geoModelSvc.retrieve().isFailure()) {
85  throw std::runtime_error ("Cannot locate GeoModelSvc!!");
86  }
87 
88  std::string AtlasVersion = geoModelSvc->atlasVersion();
89  std::string LArVersion = geoModelSvc->LAr_VersionOverride();
90 
91  std::string detectorKey = LArVersion.empty() ? AtlasVersion : LArVersion;
92  std::string detectorNode = LArVersion.empty() ? "ATLAS" : "LAr";
93 
94  //--------
95  // Cryostat
96 
97  // Here we should construct some sort of a cryostat:
98  // First attempt at creating the H6 cryostat:
99  // (values taken from HECCommonDetectorParamDef)
100  //
101  // A cylinder of half-height: zcryo = 2000.0 *Gaudi::Units::mm
102  // outer radius of warm-wall: rwarm = 1295.5 *Gaudi::Units::mm
103  // outer radius of vacuum: rvac = 1293.0 *Gaudi::Units::mm
104  // outer radius of cold wall: rcold = 1258.0 *Gaudi::Units::mm
105  // outer radius of LAr: rlar = 1255.0 *Gaudi::Units::mm
106 
107  // needs to go into database: --- 4databa
108  double zcryo = 2000.0 *Gaudi::Units::mm;
109  double rwarm = 1295.5 *Gaudi::Units::mm;
110  double rvac = 1293.0 *Gaudi::Units::mm;
111  double rcold = 1258.0 *Gaudi::Units::mm;
112  double rlar = 1255.0 *Gaudi::Units::mm;
113 
114  std::string cryoMotherName = "LAr::H6::Cryostat::MotherVolume";
115 
116  // mother volume; cylinder of radius rwarm = outside of the cryostat warm wall
117  GeoTube* cryoMotherShape = new GeoTube(0.0 , rwarm+10.0, zcryo+10.0*Gaudi::Units::mm); // mother is a little bigger than warm wall
118 
119  const GeoLogVol* cryoMotherLogical = new GeoLogVol(cryoMotherName, cryoMotherShape, Air);
120  m_cryoMotherPhysical = new GeoFullPhysVol(cryoMotherLogical);
121 
122  // Now we have a physical air-filled cylindrical mother, into which we can place all we want and need.
123 
124  // First insert the Cryostat walls and the LAr - all simple cylinders
125  //
126  // 4databa ???
127  std::string baseName = "LArTB::H6::Cryostat::" ;
128  std::string cryoWallName = "LArTB::H6::Cryostat" ;
129  std::string cryoWarmWallName = baseName + "WarmWall" ;
130  std::string cryoVacuumGapName = baseName + "Vacuum" ;
131  std::string cryoColdWallName = baseName + "ColdWall" ;
132  std::string cryoLArName = baseName + "LAr" ; // <--- used to be called "Inside"
133 
134 
135  // Warm Wall
136  GeoTube* cryoWarmWallShape = new GeoTube(0. , rwarm, zcryo);
137  const GeoLogVol* cryoWarmWallLog = new GeoLogVol(cryoWarmWallName, cryoWarmWallShape, Iron);
138  //m_cryoMotherPhysical->add(new GeoNameTag(std::string("Cryostat")));
139  GeoIntrusivePtr<GeoPhysVol> cryoWarmWallPhys = new GeoPhysVol(cryoWarmWallLog);
140  m_cryoMotherPhysical->add(cryoWarmWallPhys);
141 
142  // "Vacuum" gap (filled with air...)
143  GeoTube* cryoVacuumGapShape = new GeoTube(0. , rvac, zcryo-2.0*Gaudi::Units::mm); // an arbitrary 2mm shorter to avoid confilct
144  const GeoLogVol* cryoVacuumGapLog = new GeoLogVol(cryoVacuumGapName, cryoVacuumGapShape, Air);
145  GeoIntrusivePtr<GeoPhysVol> cryoVacuumGapPhys = new GeoPhysVol(cryoVacuumGapLog);
146  cryoWarmWallPhys->add(cryoVacuumGapPhys);
147 
148  // Cold Wall
149  GeoTube* cryoColdWallShape = new GeoTube(0. , rcold, zcryo-4.0*Gaudi::Units::mm); // an arbitrary 4mm shorter to avoid confilct
150  const GeoLogVol* cryoColdWallLog = new GeoLogVol(cryoColdWallName, cryoColdWallShape, Iron);
151  GeoIntrusivePtr<GeoPhysVol> cryoColdWallPhys = new GeoPhysVol(cryoColdWallLog);
152  cryoVacuumGapPhys->add(cryoColdWallPhys);
153 
154 
155 
156  // At the moment the CryostatMother is LAr, so the FCal should be in there,
157  // what would be better would be a mother of Air and LAr separately inside
158  // And the FCal the embedded in the LAr instead of the cryoMother!
159 
160  // Liquid Argon
161  GeoTube* cryoLArShape = new GeoTube(0. , rlar, zcryo-6.0*Gaudi::Units::mm); // an arbitrary 2mm shorter to avoid confilct
162  const GeoLogVol* cryoLArLog = new GeoLogVol(cryoLArName, cryoLArShape, LAr);
163  m_cryoMotherPhysical->add(new GeoNameTag(std::string("Cryostat LAr Physical")));
164  // m_cryoLArPhys is a class member so that we can place Detectors inside.
165  m_cryoLArPhys = new GeoPhysVol(cryoLArLog);
166  cryoColdWallPhys->add(m_cryoLArPhys);
167 
168 
169  // What remains needs to be inserted:
170  // - Rohacell (Needs an entry in LArCalorimeter/LArGeoModel/LArGeoAlgs/src/LArMaterialManager.cxx)
171 
172  return m_cryoMotherPhysical;
173 
174 }

◆ GetLArPhysical()

GeoIntrusivePtr< GeoPhysVol > LArGeo::H6CryostatConstruction::GetLArPhysical ( )

Definition at line 177 of file H6CryostatConstruction.cxx.

178 {
179  return m_cryoLArPhys;
180 }

Member Data Documentation

◆ m_cryoLArPhys

GeoPhysVol* LArGeo::H6CryostatConstruction::m_cryoLArPhys
private

Definition at line 39 of file H6CryostatConstruction.h.

◆ m_cryoMotherPhysical

GeoFullPhysVol* LArGeo::H6CryostatConstruction::m_cryoMotherPhysical
private

Definition at line 38 of file H6CryostatConstruction.h.


The documentation for this class was generated from the following files:
LAr
Definition: LArVolumeBuilder.h:36
StoreGateSvc
The Athena Transient Store API.
Definition: StoreGateSvc.h:128
EventInfoWrite.AtlasVersion
AtlasVersion
Definition: EventInfoWrite.py:17
LArGeo::H6CryostatConstruction::m_cryoMotherPhysical
GeoFullPhysVol * m_cryoMotherPhysical
Definition: H6CryostatConstruction.h:38
LArGeo::H6CryostatConstruction::m_cryoLArPhys
GeoPhysVol * m_cryoLArPhys
Definition: H6CryostatConstruction.h:39
python.PyKernel.detStore
detStore
Definition: PyKernel.py:41
python.SystemOfUnits.mm
int mm
Definition: SystemOfUnits.py:83
StoredMaterialManager::getMaterial
virtual const GeoMaterial * getMaterial(const std::string &name)=0
StoredMaterialManager
This class holds one or more material managers and makes them storeable, under StoreGate.
Definition: StoredMaterialManager.h:28
ServiceHandle< IGeoModelSvc >