Throwing exceptions in calculation methods
It is better to throw exceptions in setter methods, not inside the calculations, in order to keep the calculation functions pure (without any side-effects) and slightly improve the performance (esp. if the calculation functions are called repeatedly).
See eg., FlatDetector::pixelPosition
here:
if (_nCols == 0 || _nRows == 0)
throw std::runtime_error("Detector: number of rows or cols must >0");
The conditions does not match the message; eg., here the conditions should be
_nCols <= 0 || _nRows <= 0