Before trusting any physics that came out of a conversion, it is worth spending a few minutes on four checks. They are ordered cheapest first, and in practice the first two catch most problems.
The converter already told you what it decided for every part, and wrote the same information to
csg_report.json. A part that declined CSG says which test it failed and by how much, which is often
enough to see that a model is nearly-but-not-quite a primitive. A large tessellated count on a model
you expected to be analytic is the signal to look at --recognize-surfaces and the surface report
below.
Run build_and_export("geom.root", true, true) to get CheckOverlaps; zero illegal overlaps is what
you want to see. A non-zero count is worth taking seriously, but do not assume it is the conversion's
fault: engineering assemblies are drawn for manufacture, not for particle transport, and slightly
interpenetrating parts are common in perfectly good CAD models.
Successfully extracting a solid's surfaces does not guarantee the result is a usable, watertight body.
This macro loads every surfaces_*.bin in a directory the same way the transport does, and reports
closure, orientation consistency and enclosed volume:
# $O2_SRC is your AliceO2 source directory
root -l -b -q "$O2_SRC/Detectors/CADSupport/test/checkSurfaceSidecars.macro(\"cad_out/excavator\")"OK surfaces_Bucket_0_1_1_6.bin surfaces= 97 closed=1 orient=1 capacity=58.3121
OK surfaces_Base_0_1_1_3.bin surfaces= 44 closed=1 orient=1 capacity=241.281
...
SUMMARY cad_out/excavator
sidecars found : 13
loaded : 13
rejected by the reader : 0
loaded but not IsClosed() : 0
orientation inconsistent : 0
closed=1 means the solid is a watertight manifold, which is precisely what navigation requires. Any
non-zero number on the last three summary lines identifies a part that will not transport correctly.
A subtlety worth knowing: the surface type stored in a STEP file describes the exporter, not the geometry. CAD kernels routinely write an exact cylinder as a rational B-spline, which is an exact representation rather than an approximation — but dispatching on the stored type would throw that exactness away. The converter therefore classifies faces by their actual shape, and its surface report shows the effect:
# a per-face classification, written alongside a normal conversion
--surface-report cad_out/mydet/surface_report.jsonDetectors/CADSupport/validation/ holds the tools the development of this system is validated with:
an acceptance gate that scores converted parts against the OpenCascade oracle, an overlap census, a
round-trip report, and the closure test that the ITS example follows. They are
not installed — run them from the source tree. README.md lists them all.