19#include "BDSAcceleratorComponent.hh"
20#include "BDSBeamPipe.hh"
21#include "BDSBeamPipeFactory.hh"
22#include "BDSBeamPipeInfo.hh"
23#include "BDSCavity.hh"
24#include "BDSCavityFactory.hh"
25#include "BDSCavityInfo.hh"
26#include "BDSCavityType.hh"
27#include "BDSColours.hh"
28#include "BDSColourFromMaterial.hh"
30#include "BDSException.hh"
31#include "BDSExtent.hh"
32#include "BDSFieldBuilder.hh"
33#include "BDSGlobalConstants.hh"
34#include "BDSMaterials.hh"
35#include "BDSMuonCooler.hh"
38#include "G4ExtrudedSolid.hh"
39#include "G4LogicalVolume.hh"
40#include "G4PVPlacement.hh"
41#include "G4RotationMatrix.hh"
43#include "G4ThreeVector.hh"
46#include "G4VisAttributes.hh"
47#include "G4TwoVector.hh"
49#include "CLHEP/Units/SystemOfUnits.h"
59BDSMuonCooler::BDSMuonCooler(
const G4String& nameIn,
61 G4double containerRadiusIn,
62 G4Material* surroundingMaterialIn,
63 const std::vector<BDS::MuonCoolerCoilInfo>& coilInfosIn,
64 const std::vector<BDS::MuonCoolerDipoleInfo>& dipoleInfosIn,
65 const std::vector<BDS::MuonCoolerCavityInfo>& cavityInfosIn,
66 const std::vector<BDS::MuonCoolerAbsorberInfo>& absorberInfosIn,
70 containerRadius(containerRadiusIn),
71 surroundingMaterial(surroundingMaterialIn),
72 coilInfos(coilInfosIn),
73 dipoleInfos(dipoleInfosIn),
74 cavityInfos(cavityInfosIn),
75 absorberInfos(absorberInfosIn),
76 beamPipeTemplate(beamPipeTemplateIn),
77 outerFieldRecipe(outerFieldRecipeIn)
80BDSMuonCooler::~BDSMuonCooler()
95 containerSolid =
new G4Tubs(
name +
"_container_solid",
102 containerLogicalVolume =
new G4LogicalVolume(containerSolid,
104 name +
"_container_lv");
110 containerLogicalVolume->SetUserLimits(
userLimits);
113 containerVis->SetVisibility(
true);
115 containerLogicalVolume->SetVisAttributes(containerVis);
119void BDSMuonCooler::BuildCoils()
122 std::set<G4Material*> coilMaterials;
123 for (
const auto& info : coilInfos)
124 {coilMaterials.insert(info.material);}
125 std::map<G4Material*, G4VisAttributes*> coilVises;
126 for (
const auto& material : coilMaterials)
129 coilVis->SetVisibility(
true);
132 coilVises[material] = coilVis;
137 for (
const auto& info : coilInfos)
139 G4String iStr = std::to_string(i);
140 G4String baseName =
name +
"_coil_" + iStr;
141 auto coilSolid =
new G4Tubs(baseName +
"_solid",
143 info.innerRadius + info.radialThickness,
144 0.5*info.fullLengthZ,
148 auto coilLV =
new G4LogicalVolume(coilSolid, info.material, baseName +
"_lv");
150 coilLV->SetVisAttributes(coilVises[info.material]);
152 auto coilPV =
new G4PVPlacement(
nullptr,
153 G4ThreeVector(0,0,info.offsetZ),
156 containerLogicalVolume,
165void BDSMuonCooler::BuildDipoles()
171 for (
const auto& info : dipoleInfos)
173 G4String iStr = std::to_string(i);
174 G4String baseName =
name +
"_dipole_" + iStr;
175 auto dipoleSolid =
new G4Tubs(baseName +
"_solid",
177 info.apertureRadius*1.000001,
178 0.5*info.fullLengthZ,
182 auto dipoleLV =
new G4LogicalVolume(dipoleSolid,
BDSMaterials::Instance()->GetMaterial(
"vacuum"), baseName +
"_lv");
188void BDSMuonCooler::BuildAbsorbers()
191 std::set<G4Material*> absorberMaterials;
192 for (
const auto& info : absorberInfos)
193 {absorberMaterials.insert(info.material);}
194 std::map<G4Material*, G4VisAttributes*> absorberVises;
195 for (
const auto& material : absorberMaterials)
198 absVis->SetVisibility(
true);
201 absorberVises[material] = absVis;
206 for (
const auto& info : absorberInfos)
208 G4String iStr = std::to_string(i);
209 G4String baseName =
name +
"_absorber_" + iStr;
211 G4RotationMatrix* rm =
nullptr;
212 if (info.absorberType ==
"wedge")
214 G4double halfHeight = 0.5*info.wedgeApexToBase;
215 G4double dy = std::tan(info.wedgeOpeningAngle * 0.5) * info.wedgeApexToBase;
216 std::vector<G4TwoVector> polygons = { {-halfHeight,0}, {halfHeight,dy}, {halfHeight,-dy} };
217 absSolid =
new G4ExtrudedSolid(baseName +
"_solid",
219 info.wedgeHeight*0.5,
222 rm =
new G4RotationMatrix();
223 rm->rotate(CLHEP::halfpi, G4ThreeVector(1,0,0));
224 rm->rotate(info.wedgeRotationAngle, G4ThreeVector(0,1,0));
227 else if (info.absorberType ==
"cylinder")
229 absSolid =
new G4Tubs(baseName +
"_solid",
232 0.5 * info.cylinderLength,
237 {
throw BDSException(__METHOD_NAME__,
"unknown absorber type \"" + info.absorberType +
"\"");}
239 auto absLV =
new G4LogicalVolume(absSolid, info.material, baseName +
"_lv");
241 absLV->SetVisAttributes(absorberVises[info.material]);
243 auto coilPV =
new G4PVPlacement(rm,
247 containerLogicalVolume,
256void BDSMuonCooler::BuildCavities()
261 G4ThreeVector position;
263 std::vector<DriftSpec> beampipeInfos;
264 for (G4int i = 0; i < (G4int)cavityInfos.size() - 1; i++)
266 G4double zA = cavityInfos[i].offsetZ + 0.5*cavityInfos[i].lengthZ;
267 G4double zB = cavityInfos[i+1].offsetZ - 0.5*cavityInfos[i+1].lengthZ;
268 G4double dZ = zB - zA;
269 if (dZ >= 1*CLHEP::mm)
271 G4ThreeVector position = {0,0,zB-0.5*dZ};
272 beampipeInfos.emplace_back(DriftSpec{beamPipeTemplate,position});
276 std::vector<BDSCavityInfo> recipes;
277 for (
const auto& info : cavityInfos)
282 info.cavityThickness,
285 r.inputWindowMaterial = info.windowMaterial;
286 r.inputWindowThickness = info.windowThickness;
287 r.outputWindowMaterial = info.windowMaterial;
288 r.outputWindowThickness = info.windowThickness;
289 recipes.push_back(r);
292 std::vector<BDSCavity*> cavities;
293 for (G4int i = 0; i < (G4int)recipes.size(); i++)
295 G4String cavityName =
name +
"_cavity_" + std::to_string(i);
297 cavityInfos[i].lengthZ,
299 cavityInfos[i].vacuumMaterial);
301 auto cavityPV =
new G4PVPlacement(
nullptr,
302 G4ThreeVector(0,0,cavityInfos[i].offsetZ),
303 cavity->GetContainerLogicalVolume(),
305 containerLogicalVolume,
314void BDSMuonCooler::BuildField()
317 containerLogicalVolume,
Abstract class that represents a component of an accelerator.
G4UserLimits * userLimits
Cache of user limits.
const G4String name
Const protected member variable that may not be changed by derived classes.
static G4bool checkOverlaps
Useful variable often used in construction.
virtual void BuildUserLimits()
G4double chordLength
Protected member variable that can be modified by derived classes.
Holder class for all information required to describe a beam pipe model.
static BDSCavityFactory * Instance()
Singleton accessor.
BDSCavity * CreateCavity(const G4String &name, G4double totalChordLength, const BDSCavityInfo *info, G4Material *vacuumMaterial)
Main function to create a piece of cavity geometry.
Holder for all Geometrical information required to create an RF cavity.
static BDSColourFromMaterial * Instance()
Singleton pattern.
static BDSColours * Instance()
singleton pattern
General exception with possible name of object and message.
Holder for +- extents in 3 dimensions.
void RegisterFieldForConstruction(const BDSFieldInfo *info, G4LogicalVolume *logicalVolume, const G4bool propagateToDaughters=false, const BDSMagnetStrength *magnetStrengthForScaling=nullptr, const G4String &scalingKey="none")
static BDSFieldBuilder * Instance()
Singleton pattern accessor.
All info required to build complete field of any type.
void RegisterRotationMatrix(G4RotationMatrix *rotationMatrix)
void RegisterDaughter(BDSGeometryComponent *anotherComponent)
void RegisterLogicalVolume(G4LogicalVolume *logicalVolume)
void RegisterPhysicalVolume(G4VPhysicalVolume *physicalVolume)
void SetExtent(const BDSExtent &extIn)
Set extent.
void RegisterVisAttributes(G4VisAttributes *visAttribute)
void RegisterSolid(G4VSolid *solid)
static BDSGlobalConstants * Instance()
Access method.
static BDSMaterials * Instance()
Singleton pattern access.
virtual void BuildContainerLogicalVolume()
Void function to fulfill BDSAcceleratorComponent requirements.
virtual void Build()
Construct geometry.