42 G4double totalChordLength,
45 G4double chordLength = totalChordLength;
69 G4double zi = chordLength * 0.5;
70 G4double ri = irisRadius + irisRSemiAxis;
72 G4double re = equatorRadius - equatorRSemiAxis;
75 G4double m = std::tan(tangentAngle + CLHEP::halfpi);
80 G4double equatorParameterTangentPoint = std::atan(-equatorRSemiAxis/(m*equatorZSemiAxis));
82 G4double irisParameterTangentPoint = std::atan(-irisRSemiAxis/(m*irisZSemiAxis)) + CLHEP::pi;
86 noPoints = noPoints - (noPoints % 4);
100 std::vector<G4double> equatorParameter;
101 std::vector<G4double> irisParameter;
102 std::vector<G4double> rInnerCoord;
103 std::vector<G4double> rOuterCoord;
104 std::vector<G4double> zInnerCoord;
105 std::vector<G4double> zOuterCoord;
111 for (
unsigned int i = 0; i < noPoints/4; i++)
112 {irisParameter.push_back(1.5*CLHEP::pi + (1.5*CLHEP::pi - irisParameterTangentPoint )*i/((noPoints/4)-1));}
115 for (
unsigned int i = 0; i < noPoints/2; i++)
117 G4double term1 = CLHEP::pi - equatorParameterTangentPoint;
118 G4double term2 = CLHEP::pi - 2*equatorParameterTangentPoint;
119 G4double term3 = (noPoints*0.5) - 1;
120 G4double value = term1 - term2 * i / term3;
121 equatorParameter.push_back(value);
130 for (
unsigned int i = 0; i < noPoints/4; i++)
137 zInnerCoord.push_back(- zi + irisZSemiAxis * std::cos(irisParameter[i]) - 10*CLHEP::mm);
138 rInnerCoord.push_back(ri + irisRSemiAxis * std::sin(irisParameter[i]));
140 zInnerCoord.push_back(- zi + irisZSemiAxis * std::cos(irisParameter[i]));
141 rInnerCoord.push_back(ri + irisRSemiAxis * std::sin(irisParameter[i]));
145 for (
unsigned int i = 0; i < noPoints/2; i++)
147 zInnerCoord.push_back(ze + equatorZSemiAxis * std::cos(equatorParameter[i]));
148 rInnerCoord.push_back(re + equatorRSemiAxis * std::sin(equatorParameter[i]));
152 for (
unsigned int i = 0; i < noPoints/4; i++)
154 zInnerCoord.push_back(zi + irisZSemiAxis * std::cos(CLHEP::pi - irisParameter[noPoints/4 - 1 - i]));
155 rInnerCoord.push_back(ri + irisRSemiAxis * std::sin(CLHEP::pi - irisParameter[noPoints/4 - 1 - i]));
157 if (i == (noPoints/4 - 1))
160 zInnerCoord.push_back(zi + irisZSemiAxis * std::cos(CLHEP::pi - irisParameter[noPoints/4 - 1 - i]) + 10*CLHEP::mm);
161 rInnerCoord.push_back(ri + irisRSemiAxis * std::sin(CLHEP::pi - irisParameter[noPoints/4 - 1 - i]));
170 for (
unsigned int i = 1; i < zInnerCoord.size() - 1; i++)
173 G4double gradientAt_i = (rInnerCoord[i-1]-rInnerCoord[i+1])/(zInnerCoord[i-1]-zInnerCoord[i+1]);
178 if (i == 1 || i == (zInnerCoord.size() - 2))
180 zOuterCoord.push_back(zInnerCoord[i]);
181 rOuterCoord.push_back(rInnerCoord[i] + thickness);
185 zOuterCoord.push_back(- gradientAt_i*thickness * std::pow( (gradientAt_i * gradientAt_i + 1), -0.5) + zInnerCoord[i]);
186 rOuterCoord.push_back(+ thickness * std::pow( (gradientAt_i*gradientAt_i + 1), -0.5) + rInnerCoord[i]);
191 G4cout <<
"Now printing the values of (zInnerCoord,rInnerCoord):" << G4endl;
192 G4cout <<
"Length of zInnerCoord = " << zInnerCoord.size() << G4endl;
193 G4cout <<
"Length of rInnerCoord = " << rInnerCoord.size() << G4endl;
194 for (G4int i = 0; i < (G4int)zInnerCoord.size(); i++)
195 {G4cout <<
"(" << zInnerCoord[i] <<
"," << rInnerCoord[i] <<
")" << G4endl;};
197 G4cout <<
"Now printing the values of (zOuterCoord,rOuterCoord):" << G4endl;
198 G4cout <<
"Length of zOuterCoord = " << zOuterCoord.size() << G4endl;
199 G4cout <<
"Length of rOuterCoord = " << rOuterCoord.size() << G4endl;
200 for (G4int i = 0; i < (G4int)zOuterCoord.size(); i++)
201 {G4cout <<
"(" << zOuterCoord[i] <<
"," << rOuterCoord[i] <<
")" << G4endl;};
205 std::vector<G4double> solidArrayOuter(noPoints, 0.0);
208 std::vector<G4double> solidArrayInner(noPoints+2, 0.0);
212 G4VSolid* innerSolid =
new G4Polycone(name +
"_inner_solid",
217 solidArrayInner.data(),
221 G4VSolid* outerSolid =
new G4Polycone(name +
"_outer_solid",
226 solidArrayOuter.data(),
228 allSolids.insert(innerSolid);
229 allSolids.insert(outerSolid);
232 cavitySolid =
new G4SubtractionSolid(name +
"_cavity_solid",
239 rInnerCoord.erase (rInnerCoord.begin());
240 rInnerCoord.pop_back();
241 zInnerCoord.erase (zInnerCoord.begin());
242 zInnerCoord.pop_back();
245 for (
unsigned int i = 0; i < noPoints; i++)
249 G4int lastInd = (G4int)zInnerCoord.size() - 1;
250 zInnerCoord[lastInd] = zInnerCoord[lastInd] - 2*
lengthSafety;
252 vacuumSolid =
new G4Polycone(name +
"_inner_solid",
257 solidArrayInner.data(),
268 return containerRadius;