19#include "BDSCavity.hh"
20#include "BDSCavityFactoryElliptical.hh"
21#include "BDSCavityInfo.hh"
24#include "G4LogicalVolume.hh"
25#include "G4Polycone.hh"
26#include "G4SubtractionSolid.hh"
28#include "G4VisAttributes.hh"
31#include "CLHEP/Units/SystemOfUnits.h"
36BDSCavityFactoryElliptical::BDSCavityFactoryElliptical()
39BDSCavityFactoryElliptical::~BDSCavityFactoryElliptical()
43 G4double totalChordLength,
46 G4double chordLength = totalChordLength;
70 G4double zi = chordLength * 0.5;
71 G4double ri = irisRadius + irisRSemiAxis;
73 G4double re = equatorRadius - equatorRSemiAxis;
76 G4double m = std::tan(tangentAngle + CLHEP::halfpi);
81 G4double equatorParameterTangentPoint = std::atan(-equatorRSemiAxis/(m*equatorZSemiAxis));
83 G4double irisParameterTangentPoint = std::atan(-irisRSemiAxis/(m*irisZSemiAxis)) + CLHEP::pi;
87 noPoints = noPoints - (noPoints % 4);
101 std::vector<G4double> equatorParameter;
102 std::vector<G4double> irisParameter;
103 std::vector<G4double> rInnerCoord;
104 std::vector<G4double> rOuterCoord;
105 std::vector<G4double> zInnerCoord;
106 std::vector<G4double> zOuterCoord;
112 for (
unsigned int i = 0; i < noPoints/4; i++)
113 {irisParameter.push_back(1.5*CLHEP::pi + (1.5*CLHEP::pi - irisParameterTangentPoint )*i/((noPoints/4)-1));}
116 for (
unsigned int i = 0; i < noPoints/2; i++)
118 G4double term1 = CLHEP::pi - equatorParameterTangentPoint;
119 G4double term2 = CLHEP::pi - 2*equatorParameterTangentPoint;
120 G4double term3 = (noPoints*0.5) - 1;
121 G4double value = term1 - term2 * i / term3;
122 equatorParameter.push_back(value);
131 for (
unsigned int i = 0; i < noPoints/4; i++)
138 zInnerCoord.push_back(- zi + irisZSemiAxis * std::cos(irisParameter[i]) - 10*CLHEP::mm);
139 rInnerCoord.push_back(ri + irisRSemiAxis * std::sin(irisParameter[i]));
141 zInnerCoord.push_back(- zi + irisZSemiAxis * std::cos(irisParameter[i]));
142 rInnerCoord.push_back(ri + irisRSemiAxis * std::sin(irisParameter[i]));
146 for (
unsigned int i = 0; i < noPoints/2; i++)
148 zInnerCoord.push_back(ze + equatorZSemiAxis * std::cos(equatorParameter[i]));
149 rInnerCoord.push_back(re + equatorRSemiAxis * std::sin(equatorParameter[i]));
153 for (
unsigned int i = 0; i < noPoints/4; i++)
155 zInnerCoord.push_back(zi + irisZSemiAxis * std::cos(CLHEP::pi - irisParameter[noPoints/4 - 1 - i]));
156 rInnerCoord.push_back(ri + irisRSemiAxis * std::sin(CLHEP::pi - irisParameter[noPoints/4 - 1 - i]));
158 if (i == (noPoints/4 - 1))
161 zInnerCoord.push_back(zi + irisZSemiAxis * std::cos(CLHEP::pi - irisParameter[noPoints/4 - 1 - i]) + 10*CLHEP::mm);
162 rInnerCoord.push_back(ri + irisRSemiAxis * std::sin(CLHEP::pi - irisParameter[noPoints/4 - 1 - i]));
171 for (
unsigned int i = 1; i < zInnerCoord.size() - 1; i++)
174 G4double gradientAt_i = (rInnerCoord[i-1]-rInnerCoord[i+1])/(zInnerCoord[i-1]-zInnerCoord[i+1]);
179 if (i == 1 || i == (zInnerCoord.size() - 2))
181 zOuterCoord.push_back(zInnerCoord[i]);
182 rOuterCoord.push_back(rInnerCoord[i] + thickness);
186 zOuterCoord.push_back(- gradientAt_i*thickness * std::pow( (gradientAt_i * gradientAt_i + 1), -0.5) + zInnerCoord[i]);
187 rOuterCoord.push_back(+ thickness * std::pow( (gradientAt_i*gradientAt_i + 1), -0.5) + rInnerCoord[i]);
192 G4cout <<
"Now printing the values of (zInnerCoord,rInnerCoord):" << G4endl;
193 G4cout <<
"Length of zInnerCoord = " << zInnerCoord.size() << G4endl;
194 G4cout <<
"Length of rInnerCoord = " << rInnerCoord.size() << G4endl;
195 for (G4int i = 0; i < (G4int)zInnerCoord.size(); i++)
196 {G4cout <<
"(" << zInnerCoord[i] <<
"," << rInnerCoord[i] <<
")" << G4endl;};
198 G4cout <<
"Now printing the values of (zOuterCoord,rOuterCoord):" << G4endl;
199 G4cout <<
"Length of zOuterCoord = " << zOuterCoord.size() << G4endl;
200 G4cout <<
"Length of rOuterCoord = " << rOuterCoord.size() << G4endl;
201 for (G4int i = 0; i < (G4int)zOuterCoord.size(); i++)
202 {G4cout <<
"(" << zOuterCoord[i] <<
"," << rOuterCoord[i] <<
")" << G4endl;};
206 std::vector<G4double> solidArrayOuter(noPoints, 0.0);
209 std::vector<G4double> solidArrayInner(noPoints+2, 0.0);
213 G4VSolid* innerSolid =
new G4Polycone(name +
"_inner_solid",
218 solidArrayInner.data(),
222 G4VSolid* outerSolid =
new G4Polycone(name +
"_outer_solid",
227 solidArrayOuter.data(),
229 allSolids.insert(innerSolid);
230 allSolids.insert(outerSolid);
233 cavitySolid =
new G4SubtractionSolid(name +
"_cavity_solid",
240 rInnerCoord.erase (rInnerCoord.begin());
241 rInnerCoord.pop_back();
242 zInnerCoord.erase (zInnerCoord.begin());
243 zInnerCoord.pop_back();
246 for (
unsigned int i = 0; i < noPoints; i++)
250 G4int lastInd = (G4int)zInnerCoord.size() - 1;
251 zInnerCoord[lastInd] = zInnerCoord[lastInd] - 2*
lengthSafety;
253 vacuumSolid =
new G4Polycone(name +
"_inner_solid",
258 solidArrayInner.data(),
269 return containerRadius;
virtual void SetVisAttributes(G4String colourName="rfcavity")
Set vis attributes for cavityLV, vacuumLV and containerLV.
G4VSolid * vacuumSolid
Cache of particular solid or lv for common functionality in this class.
G4VSolid * containerSolid
Cache of particular solid or lv for common functionality in this class.
G4VSolid * cavitySolid
Cache of particular solid or lv for common functionality in this class.
virtual G4double CreateSolids(G4String name, G4double totalChordLength, const BDSCavityInfo *info)
Create vacuumSolid and cavitySolid. Must return the container radius.
virtual void SetVisAttributes(G4String colourName)
Overload base class method, but use base class method with different colour.
Holder for all Geometrical information required to create an RF cavity.
G4double equatorRadius
Equator radius - half width of widest part.
G4double equatorVerticalAxis
Equator ellipse vertical semi-axis.
G4double tangentLineAngle
Tangent angle.
G4double irisRadius
Iris radius - half width of narrowest part.
G4double irisVerticalAxis
Iris ellipse vertical semi-axis.
G4double irisHorizontalAxis
Iris ellipse horizontal semi-axis.
G4double equatorHorizontalAxis
Equator ellipse horizontal semi-axis.
G4double thickness
Thickness of wall material.
G4double lengthSafety
Cache of global constants variable.
G4double lengthSafetyLarge
Cache of global constants variable.