Hi,
I am to simulate a lightguide which will have coating. One of the designs I am to implement is that of a trapezoid using G4Trd. First I create the correct sized solid for the wrapping and the lightguide. Then the bigger side of the lightguide is joined to a G4Box with similar sized sided. The joined solid is subtracted from the wrapping. This is done in order to not leave any small residues at the border if only the lightguide solid itself were to be subtracted from the wrapping. After this first subtraction of the wrapping, another subtraction is made to the smaller end, again to remove any possible leftovers of the boundary. The code is provided below:
G4Trd* solidLightguideWrappingPre = new G4Trd(
"solidLightguideWrappingPre",
width_lightguide+thick_wrapping,
endWidth_lightguide+thick_wrapping,
height_lightguide+thick_wrapping,
endHeight_lightguide+thick_wrapping,
length_lightguide);
G4Trd* solidLightguide = new G4Trd(
"solidLightguide",
width_lightguide,
endWidth_lightguide,
height_lightguide,
endHeight_lightguide,
length_lightguide);
G4Box* solidLightguideCutBox = new G4Box(
"solidLightguideCutBox",
width_lightguide,
height_lightguide,
1*Units::cm);
G4Box* solidLightguideCutBox2 = new G4Box(
"solidLightguideCutBox2",
endWidth_lightguide,
endHeight_lightguide,
1*Units::cm);
G4UnionSolid* solidLightguideCutPre2 = new G4UnionSolid(
"solidLightguideCutPre2",
solidLightguide,
solidLightguideCutBox,
0,
G4ThreeVector(0,0,-(length_lightguide+1*Units::cm)));
G4SubtractionSolid* solidLightguideWrappingPre2 = new G4SubtractionSolid(
"solidLightguideWrappingPre2",
solidLightguideWrappingPre,
solidLightguideCutPre2,
0,
G4ThreeVector(0,0,0));
G4SubtractionSolid* solidLightguideWrapping = new G4SubtractionSolid(
"solidLightguideWrapping",
solidLightguideWrappingPre2,
solidLightguideCutBox2,
0,
G4ThreeVector(0,0,length_lightguide+0.9*Units::cm));
G4LogicalVolume* logicLightguideWrapping = new G4LogicalVolume(
solidLightguideWrapping,
mat_wrapping_opt,
"logicLightguideWrapping");
auto lightguideWrappingVol=new G4PVPlacement(
0,
G4ThreeVector(0,0,length_lightguide+displacement),
logicLightguideWrapping,
"lightguideWrapping",
lvWorld,false,0,true);
G4LogicalVolume* logicLightguide = new G4LogicalVolume(
solidLightguide,
mat_lightguide_opt,
"logicLightguide");
auto lightguideVol=new G4PVPlacement(
0,
G4ThreeVector(0,0,length_lightguide+displacement),
logicLightguide,
"lightguide",lvWorld,false,0,true);
The following variables are used (mm):
width_lightguide=100,
height_lightguide=150,
length_lightguide=200
thick_wrapping=0.01
When endWidth_lightguide<=1.31 or endHeight_lightguide<=1.47 the startup of the simulation is stopped with:
“RuntimeError: G4OSG::g4solid2Geometry error : GetPolyhedron on solid returns null ptr (polyhedronisation not available?)”
One of the additional printouts highlights the problematic solid:
"Viewer ERROR: Could not get polyhedron from the following solid:
*** Dump for Boolean solid - solidLightguideWrapping ***"
How can this problem be solved?