18#include "BDSAcceleratorComponent.hh"
19#include "BDSBeamPipe.hh"
20#include "BDSBeamPipeFactory.hh"
21#include "BDSBeamPipeInfo.hh"
22#include "BDSCavity.hh"
23#include "BDSCavityFactory.hh"
24#include "BDSCavityInfo.hh"
25#include "BDSCavityType.hh"
26#include "BDSColours.hh"
27#include "BDSColourFromMaterial.hh"
29#include "BDSException.hh"
30#include "BDSExtent.hh"
31#include "BDSFieldBuilder.hh"
32#include "BDSGlobalConstants.hh"
33#include "BDSMaterials.hh"
34#include "BDSMuonCooler.hh"
37#include "G4ExtrudedSolid.hh"
38#include "G4LogicalVolume.hh"
39#include "G4PVPlacement.hh"
40#include "G4RotationMatrix.hh"
42#include "G4ThreeVector.hh"
45#include "G4VisAttributes.hh"
46#include "G4TwoVector.hh"
48#include "CLHEP/Units/SystemOfUnits.h"
58BDSMuonCooler::BDSMuonCooler(
const G4String& nameIn,
60 G4double containerRadiusIn,
61 G4Material* surroundingMaterialIn,
62 const std::vector<BDS::MuonCoolerCoilInfo>& coilInfosIn,
63 const std::vector<BDS::MuonCoolerDipoleInfo>& dipoleInfosIn,
64 const std::vector<BDS::MuonCoolerCavityInfo>& cavityInfosIn,
65 const std::vector<BDS::MuonCoolerAbsorberInfo>& absorberInfosIn,
69 containerRadius(containerRadiusIn),
70 surroundingMaterial(surroundingMaterialIn),
71 coilInfos(coilInfosIn),
72 dipoleInfos(dipoleInfosIn),
73 cavityInfos(cavityInfosIn),
74 absorberInfos(absorberInfosIn),
75 beamPipeTemplate(beamPipeTemplateIn),
76 outerFieldRecipe(outerFieldRecipeIn)
79BDSMuonCooler::~BDSMuonCooler()
94 containerSolid =
new G4Tubs(
name +
"_container_solid",
101 containerLogicalVolume =
new G4LogicalVolume(containerSolid,
103 name +
"_container_lv");
109 containerLogicalVolume->SetUserLimits(
userLimits);
112 containerVis->SetVisibility(
true);
114 containerLogicalVolume->SetVisAttributes(containerVis);
118void BDSMuonCooler::BuildCoils()
121 std::set<G4Material*> coilMaterials;
122 for (
const auto& info : coilInfos)
123 {coilMaterials.insert(info.material);}
124 std::map<G4Material*, G4VisAttributes*> coilVises;
125 for (
const auto& material : coilMaterials)
128 coilVis->SetVisibility(
true);
131 coilVises[material] = coilVis;
136 for (
const auto& info : coilInfos)
138 G4String iStr = std::to_string(i);
139 G4String baseName =
name +
"_coil_" + iStr;
140 auto coilSolid =
new G4Tubs(baseName +
"_solid",
142 info.innerRadius + info.radialThickness,
143 0.5*info.fullLengthZ,
147 auto coilLV =
new G4LogicalVolume(coilSolid, info.material, baseName +
"_lv");
149 coilLV->SetVisAttributes(coilVises[info.material]);
151 auto coilPV =
new G4PVPlacement(
nullptr,
152 G4ThreeVector(0,0,info.offsetZ),
155 containerLogicalVolume,
164void BDSMuonCooler::BuildDipoles()
170 for (
const auto& info : dipoleInfos)
172 G4String iStr = std::to_string(i);
173 G4String baseName =
name +
"_dipole_" + iStr;
174 auto dipoleSolid =
new G4Tubs(baseName +
"_solid",
176 info.apertureRadius*1.000001,
177 0.5*info.fullLengthZ,
181 auto dipoleLV =
new G4LogicalVolume(dipoleSolid,
BDSMaterials::Instance()->GetMaterial(
"vacuum"), baseName +
"_lv");
187void BDSMuonCooler::BuildAbsorbers()
190 std::set<G4Material*> absorberMaterials;
191 for (
const auto& info : absorberInfos)
192 {absorberMaterials.insert(info.material);}
193 std::map<G4Material*, G4VisAttributes*> absorberVises;
194 for (
const auto& material : absorberMaterials)
197 absVis->SetVisibility(
true);
200 absorberVises[material] = absVis;
205 for (
const auto& info : absorberInfos)
207 G4String iStr = std::to_string(i);
208 G4String baseName =
name +
"_absorber_" + iStr;
210 G4RotationMatrix* rm =
nullptr;
211 if (info.absorberType ==
"wedge")
213 G4double halfHeight = 0.5*info.wedgeApexToBase;
214 G4double dy = std::tan(info.wedgeOpeningAngle * 0.5) * info.wedgeApexToBase;
215 std::vector<G4TwoVector> polygons = { {-halfHeight,0}, {halfHeight,dy}, {halfHeight,-dy} };
216 absSolid =
new G4ExtrudedSolid(baseName +
"_solid",
218 info.wedgeHeight*0.5,
221 rm =
new G4RotationMatrix();
222 rm->rotate(CLHEP::halfpi, G4ThreeVector(1,0,0));
223 rm->rotate(info.wedgeRotationAngle, G4ThreeVector(0,1,0));
226 else if (info.absorberType ==
"cylinder")
228 absSolid =
new G4Tubs(baseName +
"_solid",
231 0.5 * info.cylinderLength,
236 {
throw BDSException(__METHOD_NAME__,
"unknown absorber type \"" + info.absorberType +
"\"");}
238 auto absLV =
new G4LogicalVolume(absSolid, info.material, baseName +
"_lv");
240 absLV->SetVisAttributes(absorberVises[info.material]);
242 auto coilPV =
new G4PVPlacement(rm,
246 containerLogicalVolume,
255void BDSMuonCooler::BuildCavities()
260 G4ThreeVector position;
262 std::vector<DriftSpec> beampipeInfos;
263 for (G4int i = 0; i < (G4int)cavityInfos.size() - 1; i++)
265 G4double zA = cavityInfos[i].offsetZ + 0.5*cavityInfos[i].lengthZ;
266 G4double zB = cavityInfos[i+1].offsetZ - 0.5*cavityInfos[i+1].lengthZ;
267 G4double dZ = zB - zA;
268 if (dZ >= 1*CLHEP::mm)
270 G4ThreeVector position = {0,0,zB-0.5*dZ};
271 beampipeInfos.emplace_back(DriftSpec{beamPipeTemplate,position});
275 std::vector<BDSCavityInfo> recipes;
276 for (
const auto& info : cavityInfos)
281 info.cavityThickness,
284 r.inputWindowMaterial = info.windowMaterial;
285 r.inputWindowThickness = info.windowThickness;
286 r.outputWindowMaterial = info.windowMaterial;
287 r.outputWindowThickness = info.windowThickness;
288 recipes.push_back(r);
291 std::vector<BDSCavity*> cavities;
292 for (G4int i = 0; i < (G4int)recipes.size(); i++)
294 G4String cavityName =
name +
"_cavity_" + std::to_string(i);
296 cavityInfos[i].lengthZ,
298 cavityInfos[i].vacuumMaterial);
300 auto cavityPV =
new G4PVPlacement(
nullptr,
301 G4ThreeVector(0,0,cavityInfos[i].offsetZ),
302 cavity->GetContainerLogicalVolume(),
304 containerLogicalVolume,
313void BDSMuonCooler::BuildField()
316 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.