DensityGrid get_rasterized_fast(const Gaussian3Ds &gmm, const Floats &weights, double cell_width, const BoundingBox3D &bb, double factor) { DensityGrid ret(cell_width, bb, 0); for (unsigned int ng = 0; ng < gmm.size(); ng++) { Eigen::Matrix3d covar = get_covariance(gmm[ng]); Eigen::Matrix3d inverse = Eigen::Matrix3d::Zero(3, 3); double determinant; bool invertible; covar.computeInverseAndDetWithCheck(inverse, determinant, invertible); IMP_INTERNAL_CHECK((invertible && determinant > 0), "Tried to invert Gaussian, but it's not proper matrix"); double pre(get_gaussian_eval_prefactor(determinant)); Eigen::Vector3d evals = covar.eigenvalues().real(); double maxeval = sqrt(evals.maxCoeff()); double cutoff = factor * maxeval; double cutoff2 = cutoff * cutoff; Vector3D c = gmm[ng].get_center(); Vector3D lower = c - Vector3D(cutoff, cutoff, cutoff); Vector3D upper = c + Vector3D(cutoff, cutoff, cutoff); GridIndex3D lowerindex = ret.get_nearest_index(lower); GridIndex3D upperindex = ret.get_nearest_index(upper); Eigen::Vector3d center(c.get_data()); IMP_INTERNAL_CHECK(invertible, "matrix wasn't invertible! uh oh!"); IMP_GRID3D_FOREACH_SMALLER_EXTENDED_INDEX_RANGE(ret, upperindex, lowerindex, upperindex, { GridIndex3D i(voxel_index[0], voxel_index[1], voxel_index[2]); Eigen::Vector3d r(get_vec_from_center(i, ret, center)); if (r.squaredNorm() < cutoff2) { update_value(&ret, i, r, inverse, pre, weights[ng]); } }) } return ret; }