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;