23 int ringSize = (*basal1).size();
28 Eigen::MatrixXd basal1Set(ringSize,
30 Eigen::MatrixXd basal2Set(ringSize,
34 double cutoffAngle = 15;
42 double scale1, scale2;
44 bool doAngleCriterion =
false;
55 yCloud, nList, refPoints, &matchedBasal1, &matchedBasal2, &startingIndex);
112 int ringSize = (*basal1).size();
117 Eigen::MatrixXd basal1Set(ringSize,
119 Eigen::MatrixXd basal2Set(ringSize,
129 double scale1, scale2;
131 bool doAngleCriterion =
false;
142 yCloud, nList, refPoints, &matchedBasal1, &matchedBasal2, &startingIndex);
187 int ringSize = basalRing.
size();
193 for (
int i = 0; i < ringSize; i++) {
194 index = i + startingIndex;
196 if (index >= ringSize) {
201 atomIndex = basalRing[index];
203 iRMSD = rmsdFromMatch[i];
204 if ((*rmsdPerAtom)[atomIndex] == -1) {
205 (*rmsdPerAtom)[atomIndex] = iRMSD;
220 int ringSize = basalRing.
size();
225 for (
int i = 0; i < ringSize; i++) {
226 index = i + startingIndex;
228 if (index >= ringSize) {
233 atomIndex = basalRing[index];
235 if ((*rmsdPerAtom)[atomIndex] == -1) {
236 (*rmsdPerAtom)[atomIndex] = rmsdVal;
252 int ringSize = (*basal1).size();
255 int nop = 2 * ringSize;
256 Eigen::MatrixXd refPrismBlock(
258 Eigen::MatrixXd targetPrismBlock(
274 if (ringSize % 2 == 0 || ringSize == 3) {
292 for (
int i = 0; i < ringSize; i++) {
300 ¤tRmsd, ¤tRmsdList, ¤tScale);
306 rmsdList = currentRmsdList;
307 scale = currentScale;
313 if (currentRmsd < rmsd) {
316 rmsdList = currentRmsdList;
317 scale = currentScale;
325 *beginIndex = startingIndex;
int hornAbsOrientation(const Eigen::MatrixXd &refPoints, const Eigen::MatrixXd &targetPoints, std::vector< double > *quat, double *rmsd, std::vector< double > *rmsdList, double *scale)
Get the absolute orientation using Horn's algorithm (with quaternions)
bool matchPrismBlock(molSys::PointCloud< molSys::Point< double >, double > *yCloud, std::vector< std::vector< int >> nList, const Eigen::MatrixXd &refPoints, std::vector< int > *basal1, std::vector< int > *basal2, int *beginIndex)
int updatePerAtomRMSDRing(std::vector< int > basalRing, int startingIndex, std::vector< double > rmsdFromMatch, std::vector< double > *rmsdPerAtom)
Update the per-particle RMSD for a prism block basal ring.
bool matchUntetheredPrism(molSys::PointCloud< molSys::Point< double >, double > *yCloud, std::vector< std::vector< int >> nList, const Eigen::MatrixXd &refPoints, std::vector< int > *basal1, std::vector< int > *basal2, std::vector< double > *rmsdPerAtom)
int updateRMSDRing(std::vector< int > basalRing, int startingIndex, double rmsdVal, std::vector< double > *rmsdPerAtom)
bool matchPrism(molSys::PointCloud< molSys::Point< double >, double > *yCloud, std::vector< std::vector< int >> nList, const Eigen::MatrixXd &refPoints, std::vector< int > *basal1, std::vector< int > *basal2, std::vector< double > *rmsdPerAtom, bool isPerfect=true)
Eigen::MatrixXd fillPointSetPrismRing(molSys::PointCloud< molSys::Point< double >, double > *yCloud, std::vector< int > basalRing, int startingIndex)
Eigen::MatrixXd createPrismBlock(molSys::PointCloud< molSys::Point< double >, double > *yCloud, const Eigen::MatrixXd &refPoints, int ringSize, std::vector< int > basal1, std::vector< int > basal2)
int relOrderPrismBlock(molSys::PointCloud< molSys::Point< double >, double > *yCloud, std::vector< int > basal1, std::vector< int > basal2, std::vector< std::vector< int >> nList, std::vector< int > *outBasal1, std::vector< int > *outBasal2)
Eigen::MatrixXd fillPointSetPrismBlock(molSys::PointCloud< molSys::Point< double >, double > *yCloud, std::vector< int > basal1, std::vector< int > basal2, int startingIndex)
This contains a collection of points; contains information for a particular frame.
This contains per-particle information.