/// Constructor from a rotation matrix /// @param rot :: DblMatrix matrix that is going to be the internal rotation /// matrix of the goniometer. Cannot push additional axes Goniometer::Goniometer(DblMatrix rot) { DblMatrix ide(3, 3), rtr(3, 3); rtr = rot.Tprime() * rot; ide.identityMatrix(); if (rtr == ide) { R = rot; initFromR = true; } else throw std::invalid_argument("rot is not a rotation matrix"); }
/** Sets the UB matrix and recalculates lattice parameters @param newUB :: the new UB matrix*/ void OrientedLattice::setUB(const DblMatrix &newUB) { if (UB.determinant() > 0) { UB = newUB; DblMatrix newGstar, B; newGstar = newUB.Tprime() * newUB; this->recalculateFromGstar(newGstar); B = this->getB(); B.Invert(); U = newUB * B; } else throw std::invalid_argument("determinant of UB is not greater than 0"); }
/** Sets the UB matrix and recalculates lattice parameters @param newUB :: the new UB matrix*/ void OrientedLattice::setUB(const DblMatrix &newUB) { // check if determinant is close to 0. The 1e-10 value is arbitrary if (std::fabs(newUB.determinant()) > 1e-10) { UB = newUB; DblMatrix newGstar, B; newGstar = newUB.Tprime() * newUB; this->recalculateFromGstar(newGstar); B = this->getB(); B.Invert(); U = newUB * B; } else throw std::invalid_argument("determinant of UB is too close to 0"); }