diff --git a/modules/geom/src/vec3.cc b/modules/geom/src/vec3.cc index a21d150d620c3632355b906adfbdbc44d22131e3..84467ced5a4ddf66dd5ae23e1de054c7cb8e175d 100644 --- a/modules/geom/src/vec3.cc +++ b/modules/geom/src/vec3.cc @@ -48,11 +48,11 @@ Mat3 Vec3List::GetInertia() const Mat3 Vec3List::GetPrincipalAxes() const { Mat3 inertia=this->GetInertia(); - EMat3 inertia_mat(*reinterpret_cast<EMat3*>(&inertia)); + EMat3 inertia_mat(inertia.Data()); Eigen::SVD<EMat3> svd(inertia_mat); EMat3 rot=svd.matrixU(); - Mat3 axes(*reinterpret_cast<Mat3*>(&rot)); + Mat3 axes(rot.data()); return axes; } diff --git a/modules/mol/alg/src/superpose_frames.cc b/modules/mol/alg/src/superpose_frames.cc index defe8a324a896c8b18b03aec68f1aec7a50ff001..aafec9d78f986b69b08f0c2e12c160e48a680bec 100644 --- a/modules/mol/alg/src/superpose_frames.cc +++ b/modules/mol/alg/src/superpose_frames.cc @@ -35,26 +35,26 @@ typedef Eigen::Matrix<Real, Eigen::Dynamic, 3> EMatX3; inline geom::Vec3 rvec_to_gvec(const ERVec3 &vec) { - return *reinterpret_cast<const geom::Vec3*>(&vec); + return geom::Vec3(vec.data()); } inline geom::Vec3 cvec_to_gvec(const ECVec3 &vec) { - return *reinterpret_cast<const geom::Vec3*>(&vec); + return geom::Vec3(vec.data()); } inline geom::Mat3 emat_to_gmat(const EMat3 &mat) { - return *reinterpret_cast<const geom::Mat3*>(&mat); + return geom::Mat3(mat.data()); } inline ERVec3 gvec_to_rvec(const geom::Vec3 &vec) { - return *reinterpret_cast<const ERVec3*>(&vec); + return ERVec3(&vec[0]); } inline ECVec3 gvec_to_cvec(const geom::Vec3 &vec) { - return *reinterpret_cast<const ECVec3*>(&vec); + return ECVec3(&vec[0]); } inline EMat3X row_sub(const EMat3X& m, const ERVec3& s) diff --git a/modules/mol/alg/src/svd_superpose.cc b/modules/mol/alg/src/svd_superpose.cc index ef3d4de2538e7a86db94ba4602c2be0e08b0ccc5..22fa34c1d8c48a9aa370d006a3ab68a5276af091 100644 --- a/modules/mol/alg/src/svd_superpose.cc +++ b/modules/mol/alg/src/svd_superpose.cc @@ -152,58 +152,24 @@ SuperposerSVD::SuperposerSVD(int natoms, bool alloc_atoms): } -geom::Vec3 SuperposerSVDImpl::EigenVec3ToVec3(const EVec3 &vec){ -#if defined _MSC_VER - geom::Vec3 myvec3; - for (int i=0; i<3; ++i) { - myvec3[i]=vec[i]; - } - return myvec3; -#else - return *reinterpret_cast<const geom::Vec3*>(&vec); -#endif +geom::Vec3 SuperposerSVDImpl::EigenVec3ToVec3(const EVec3 &vec) +{ + return geom::Vec3(vec.data()); } geom::Mat3 SuperposerSVDImpl::EigenMat3ToMat3(const EMat3 &mat) { -#if defined _MSC_VER - geom::Mat3 mymat3; - for (int i=0; i<3; ++i) { - for (int j=0; j<3; ++j) { - mymat3(j,i)=mat(i,j); - } - } - return mymat3; -#else - return *reinterpret_cast<const geom::Mat3*>(&mat); -#endif - + return geom::Mat3(mat.data()); } EVec3 SuperposerSVDImpl::Vec3ToEigenRVec(const geom::Vec3 &vec) { -#if defined _MSC_VER - EVec3 myvec3=EVec3::Zero(); - for (int counter=0; counter<3; ++counter) { - myvec3[counter]=vec[counter]; - } - return myvec3; -#else - return *reinterpret_cast<const ERVec3*>(&vec); -#endif + return EVec3(&vec[0]); } EVec3 SuperposerSVDImpl::Vec3ToEigenVec(const geom::Vec3 &vec) { -#if defined _MSC_VER - EVec3 myvec3=EVec3::Zero(); - for (int counter=0; counter<3; ++counter) { - myvec3[counter]=vec[counter]; - } - return myvec3; -#else - return *reinterpret_cast<const EVec3*>(&vec); -#endif + return EVec3(&vec[0]); } EMatX SuperposerSVDImpl::SubtractVecFromMatrixRows(EMatX Mat, diff --git a/modules/seq/alg/src/merge_pairwise_alignments.cc b/modules/seq/alg/src/merge_pairwise_alignments.cc index 6bba7edd06e48c707e815b0eded56b1226a32fe5..5636f32c97af7b96297663f75d6456abf954a4d4 100644 --- a/modules/seq/alg/src/merge_pairwise_alignments.cc +++ b/modules/seq/alg/src/merge_pairwise_alignments.cc @@ -38,7 +38,7 @@ void update_shifts(const AlignmentHandle& aln, ShiftMap& shifts) { ConstSequenceHandle s1=aln.GetSequence(0); - if (s1.GetGaplessString()!=ref_seq.GetString()) { + if (!Match(s1.GetGaplessString(), ref_seq.GetString())) { throw IntegrityError("The gapless version of '"+s1.GetString()+ "' is not identical to the reference sequence."); } diff --git a/modules/seq/base/doc/seq.rst b/modules/seq/base/doc/seq.rst index f42a2f574c7afff92265932553bbe3c6d85f96b9..64ac6d3a7d974446f95657f30748d3ddc508f325 100644 --- a/modules/seq/base/doc/seq.rst +++ b/modules/seq/base/doc/seq.rst @@ -184,7 +184,7 @@ The SequenceHandle .. attribute:: offset - Shorthand for :meth:`GetSequenceOffset`/:meth:`SetSequenceOffset` + Shorthand for :meth:`GetOffset`/:meth:`SetOffset` .. method:: __len__() @@ -194,6 +194,16 @@ The SequenceHandle Returns the sequence as a string. +.. function:: Match(s1, s2) + + :param s1: The first sequence + :param s2: The second sequence + :type s1: :class:`SequenceHandle`, or :class:`str` + :type s2: :class:`SequenceHandle`, or :class:`str` + + Check whether the two sequences s1 and s2 match. This function performs are + case-insensitive comparison of the two sequences. The character 'X' is + interpreted as a wildcard character that always matches the other sequence. The SequenceList -------------------------------------------------------------------------------- diff --git a/modules/seq/base/pymod/export_sequence.cc b/modules/seq/base/pymod/export_sequence.cc index c72fe3ae8e65f0f65d78e6751d57655b61711eb4..6db4d304e88f968afd3d51ef1f63f79c940dd1a6 100644 --- a/modules/seq/base/pymod/export_sequence.cc +++ b/modules/seq/base/pymod/export_sequence.cc @@ -50,6 +50,8 @@ void (AlignmentHandle::*attach_view_b)(int, const mol::EntityView&, SequenceHandle (*seq_from_chain_a)(const String&,const mol::ChainView&)=&SequenceFromChain; SequenceHandle (*seq_from_chain_b)(const String&,const mol::ChainHandle&)=&SequenceFromChain; +bool (*m1)(const String&, const String&)=&Match; +bool (*m2)(const ConstSequenceHandle&, const ConstSequenceHandle&)=&Match; template <typename T> T do_slice(const T& t, slice& sl) { int start=0, end=t.GetCount(); @@ -270,6 +272,8 @@ void export_sequence() .add_property("offset", &SequenceHandle::GetOffset, &SequenceHandle::SetOffset) ; + def("Match", m1); + def("Match", m2); implicitly_convertible<SequenceHandle, ConstSequenceHandle>(); diff --git a/modules/seq/base/src/sequence_handle.cc b/modules/seq/base/src/sequence_handle.cc index caeccfaececda45b3f61efc37f44201385607523..62539237a9a7dfe0de1105bb647f1dd5b08f2a40 100644 --- a/modules/seq/base/src/sequence_handle.cc +++ b/modules/seq/base/src/sequence_handle.cc @@ -407,4 +407,25 @@ char SequenceHandle::operator[](size_t index) const return this->GetString()[index]; } + +bool Match(const ConstSequenceHandle& s1, const ConstSequenceHandle& s2) +{ + return Match(s1.GetString(), s2.GetString()); +} + +bool Match(const String& s1, const String& s2) +{ + if (s1.size()!=s2.size()) { + return false; + } + for (size_t i=0; i<s1.size(); ++i) { + char c1=s1[i]; + char c2=s2[i]; + if (toupper(c1)!=toupper(c2) && toupper(c1)!='X' && toupper(c2)!='X') { + return false; + } + } + return true; +} + }} diff --git a/modules/seq/base/src/sequence_handle.hh b/modules/seq/base/src/sequence_handle.hh index a84e1b18db19cef0b35a4e2cdf1d8f954d458fec..3b3f1b1abf471f151cf79179248150960514fcc3 100644 --- a/modules/seq/base/src/sequence_handle.hh +++ b/modules/seq/base/src/sequence_handle.hh @@ -304,6 +304,12 @@ SequenceHandle DLLEXPORT_OST_SEQ SequenceFromInfo(info::InfoGroup& group); DLLEXPORT_OST_SEQ std::ostream& operator<<(std::ostream& os, const ConstSequenceHandle& sequence); + +bool DLLEXPORT_OST_SEQ Match(const ConstSequenceHandle& s1, + const ConstSequenceHandle& s2); + +bool DLLEXPORT_OST_SEQ Match(const String& s1, + const String& s2); }} #endif diff --git a/modules/seq/base/tests/test_sequence.cc b/modules/seq/base/tests/test_sequence.cc index 87669a644335e9e101c4c638d32b51e51344708d..3c418443503c2d94552e2571f85c9037d2821df7 100644 --- a/modules/seq/base/tests/test_sequence.cc +++ b/modules/seq/base/tests/test_sequence.cc @@ -65,6 +65,15 @@ BOOST_AUTO_TEST_CASE(seq_triv) BOOST_CHECK_THROW(s.SetString("1"), InvalidSequence); } +BOOST_AUTO_TEST_CASE(match) +{ + BOOST_CHECK(Match("abcdefghijkl", "ABcDeFgHiJkL")); + BOOST_CHECK(Match("abcxXxxxxjXl", "ABcDeFgHiJkL")); + BOOST_CHECK(Match("ABcDeFgHiJkL", "ABcDeFXxiJxL")); + BOOST_CHECK(!Match("abc", "abcd")); + BOOST_CHECK(!Match("abc", "aby")); +} + BOOST_AUTO_TEST_CASE(seq_throw_invalid) { SequenceHandle s;