diff --git a/CMakeLists.txt b/CMakeLists.txt index e438e4cb4542b2d8c0006c7c733341ba15143e73..4a46dc9b45b8d0cb4b1e0f5c87eb8dfa7811ce82 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -12,6 +12,15 @@ set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${PROJECT_SOURCE_DIR}/cmake_support) include(OST) +if (CMAKE_COMPILER_IS_GNUCXX) + exec_program(gcc ARGS --version OUTPUT_VARIABLE CMAKE_C_COMPILER_VERSION) + if(CMAKE_C_COMPILER_VERSION MATCHES ".*4\\.[5-9].*") + set(OST_GCC_45 true) + else() + set(OST_GCC_45 false) + endif() +endif() + option(USE_SHADER "whether to compile with shader support" OFF) option(USE_RPATH "embed rpath upon make install" @@ -26,6 +35,8 @@ option(ENABLE_GFX "whether graphics support should be enabled" ON) option(ENABLE_IMG "whether the image processing module should be compiled" ON) +option(ENABLE_INFO "whether openstructure should be compiled with support for the info library" + ON) option(USE_NUMPY "whether numpy support is added" OFF) option(USE_DOUBLE_PRECISION "whether to compile in double precision" @@ -51,6 +62,7 @@ if (FORTRAN_COMPILER) endif() + if (PREFIX) set(CMAKE_INSTALL_PREFIX ${PREFIX}) endif() @@ -74,10 +86,20 @@ else() set(_DOUBLE_PREC OFF) endif() +if (NOT ENABLE_INFO) + set(ENABLE_GFX OFF) +endif() + if (NOT ENABLE_GFX) set(ENABLE_GUI OFF) endif() +if (ENABLE_INFO) + set(_INFO ON) +else() + set(_INFO OFF) +endif() + if (ENABLE_GUI) set(_UI ON) else() @@ -154,11 +176,26 @@ setup_compiler_flags() set(CMAKE_LIBRARY_OUTPUT_DIRECTORY) +if (ENABLE_STATIC AND UNIX AND NOT APPLE) + set (CMAKE_FIND_LIBRARY_SUFFIXES .a) +endif() + setup_boost() - -find_package(Qt4 4.5.0 REQUIRED) -find_package(OpenGL REQUIRED) -find_package(PNG REQUIRED) + +if (ENABLE_INFO) + find_package(Qt4 4.5.0 REQUIRED) +endif() + +if (ENABLE_GFX) + find_package(OpenGL REQUIRED) +endif() + +if (ENABLE_IMG OR ENABLE_GFX) + find_package(PNG REQUIRED) +else() + set (PNG_LIBRARY "") +endif() + find_package(Eigen 2.0.0 REQUIRED) find_package(Python 2.4 REQUIRED) @@ -178,8 +215,14 @@ if (ENABLE_STATIC) find_package(Boost ${_BOOST_MIN_VERSION} COMPONENTS filesystem system iostreams regex REQUIRED) find_package(ZLIB REQUIRED) - set(STATIC_LIBRARIES ${Boost_LIBRARIES} ${FFTW_LIBRARIES} ${TIFF_LIBRARIES} - ${PNG_LIBRARIES} ${ZLIB_LIBRARIES}) + + if (UNIX AND NOT APPLE) + set(STATIC_LIBRARIES ${Boost_LIBRARIES} ${FFTW_LIBRARIES} ${TIFF_LIBRARIES} + ${PNG_LIBRARY} ${ZLIB_LIBRARY}) + else () + set(STATIC_LIBRARIES ${Boost_LIBRARIES} ${FFTW_LIBRARIES} ${TIFF_LIBRARIES} + ${PNG_LIBRARY} ${ZLIB_LIBRARY}) + endif() endif() if (ENABLE_GUI) @@ -217,6 +260,10 @@ if (UNIX) endif() endif() +if (ENABLE_STATIC) + SET(CMAKE_SKIP_BUILD_RPATH TRUE) + SET(LINK_SEARCH_END_STATIC TRUE) +endif() add_subdirectory(modules) add_subdirectory(scripts) @@ -231,6 +278,7 @@ message(STATUS "OpenStructure will be built with the following options:\n" " Install Prefix (-DPREFIX) : ${CMAKE_INSTALL_PREFIX}\n" " RPath in install (-DUSE_RPATH) : ${_USE_RPATH}\n" + " Info support (-DENABLE_INFO) : ${_INFO}\n" " Graphical interface (-DENABLE_GUI) : ${_UI}\n" " OpenGL support (-DENABLE_GFX) : ${_OPENGL}\n" " Image Processing support (-DENABLE_IMG) : ${_IMG}\n" @@ -242,4 +290,5 @@ message(STATUS " Compound Lib (-DCOMPOUND_LIB) : ${_COMP_LIB}\n" " TMAlign and TMScore (-DCOMPILE_TMTOOLS) : ${_TM_TOOLS}\n" " Static Libraries (-DENABLE_STATIC) : ${ENABLE_STATIC}\n" - " Debian-style 'libexec' (-DDEBIAN_STYLE_LIBEXEC) : ${_DEBIAN_STYLE_LIBEXEC}") + " Debian-style 'libexec' (-DDEBIAN_STYLE_LIBEXEC) : ${_DEBIAN_STYLE_LIBEXEC}" ) + diff --git a/build_configs/buildconfig_arch b/build_configs/buildconfig_arch new file mode 100644 index 0000000000000000000000000000000000000000..b0a6494db8715e33c8f0ae7a2f9cfb63c2f97392 --- /dev/null +++ b/build_configs/buildconfig_arch @@ -0,0 +1 @@ +set(PYTHON_BINARY "/usr/bin/python2" CACHE PATH "") diff --git a/build_configs/buildconfig_arch_static b/build_configs/buildconfig_arch_static new file mode 100644 index 0000000000000000000000000000000000000000..15c3ef31600755c4b217e623492e06b58bb44b5e --- /dev/null +++ b/build_configs/buildconfig_arch_static @@ -0,0 +1,4 @@ +set(PYTHON_BINARY "/usr/bin/python2" CACHE PATH "") +set(ZLIB_LIBRARY "/usr/lib/libz.a" CACHE PATH "") +set(PNG_LIBRARY "/usr/lib/libpng12.a" CACHE PATH "") +set(FFTW_LIBRARIES "/usr/lib/libfftw3f.a" CACHE PATH "") diff --git a/build_configs/buildconfig_bc2_locallibs b/build_configs/buildconfig_bc2_locallibs new file mode 100644 index 0000000000000000000000000000000000000000..fbc7a614754b8fba6a35957ba4d71bbb4061380d --- /dev/null +++ b/build_configs/buildconfig_bc2_locallibs @@ -0,0 +1,11 @@ +set(FFTW_INCLUDE_PATH "/import/bc2/soft/app/FFTW/current/Linux/include/" CACHE PATH "") +set(FFTW_LIBRARIES "/import/bc2/soft/app/FFTW/current/Linux/lib/libfftw3f.so" CACHE PATH "") +set(Boost_COMPILER "-gcc41" CACHE PATH "") +set(PYTHON_ROOT "/import/bc2/soft/app/Python/current/Linux/" CACHE PATH "") +set(EIGEN2_INCLUDE_DIR "/import/bc2/soft/app/eigen/current/Linux/include/eigen2" CACHE PATH "") +set(BOOST_ROOT "/import/bc2/soft/app/boost/current/Linux" CACHE PATH "") +set(QT_QMAKE_EXECUTABLE "/import/bc2/soft/app/Qt/current/Linux/bin/qmake" CACHE PATH "") +set(COMPOUND_LIB "/import/bc2/home/schwede/GROUP/OpenStructure/ChemLib/compounds.chemlib" CACHE PATH "") +set(TIFF_LIBRARY "${OST_LOCAL_LIBS}/lib/libtiff.so" CACHE PATH "") +set(TIFF_INCLUDE_DIR "${OST_LOCAL_LIBS}/include/" CACHE PATH "") +set (CMAKE_BUILD_TYPE "Release" CACHE PATH "") diff --git a/build_configs/buildconfig_bc2_static b/build_configs/buildconfig_bc2_static new file mode 100644 index 0000000000000000000000000000000000000000..c26933d8ce996f93da782e919544f06312d57ff3 --- /dev/null +++ b/build_configs/buildconfig_bc2_static @@ -0,0 +1,11 @@ +set(FFTW_INCLUDE_PATH "/import/bc2/soft/app/FFTW/current/Linux/include/" CACHE PATH "") +set(FFTW_LIBRARIES "/import/bc2/soft/app/FFTW/current/Linux/lib/libfftw3f.a" CACHE PATH "") +set(DL_LIBRARIES "/usr/lib64/libdl.a" CACHE PATH "") +set(PTHREAD_LIBRARIES "/usr/lib64/libpthread.a" CACHE PATH "") +set(ZLIB_LIBRARY "/usr/lib64/libz.a" CACHE PATH "") +set(Boost_COMPILER "-gcc41" CACHE PATH "") +set(PYTHON_ROOT "/import/bc2/soft/app/Python/current/Linux/" CACHE PATH "") +set(EIGEN2_INCLUDE_DIR "/import/bc2/soft/app/eigen/current/Linux/include/eigen2" CACHE PATH "") +set(QT_QMAKE_EXECUTABLE "/import/bc2/soft/app/Qt/current/Linux/bin/qmake" CACHE PATH "") +set(COMPOUND_LIB "/import/bc2/home/schwede/GROUP/OpenStructure/ChemLib/compounds.chemlib" CACHE PATH "") +set (CMAKE_BUILD_TYPE "Release" CACHE PATH "") diff --git a/build_configs/buildconfig_bc2_static_locallibs b/build_configs/buildconfig_bc2_static_locallibs new file mode 100644 index 0000000000000000000000000000000000000000..c4ac3df6f76cfc58b2bfc41e5afcdb6a41edfddf --- /dev/null +++ b/build_configs/buildconfig_bc2_static_locallibs @@ -0,0 +1,13 @@ +set(FFTW_INCLUDE_PATH "/import/bc2/soft/app/FFTW/current/Linux/include/" CACHE PATH "") +set(FFTW_LIBRARIES "/import/bc2/soft/app/FFTW/current/Linux/lib/libfftw3f.a" CACHE PATH "") +set(DL_LIBRARIES "/usr/lib64/libdl.a" CACHE PATH "") +set(PTHREAD_LIBRARIES "/usr/lib64/libpthread.a" CACHE PATH "") +set(ZLIB_LIBRARY "/usr/lib64/libz.a" CACHE PATH "") +set(Boost_COMPILER "-gcc41" CACHE PATH "") +set(PYTHON_ROOT "/import/bc2/soft/app/Python/current/Linux/" CACHE PATH "") +set(EIGEN2_INCLUDE_DIR "/import/bc2/soft/app/eigen/current/Linux/include/eigen2" CACHE PATH "") +set(QT_QMAKE_EXECUTABLE "/import/bc2/soft/app/Qt/current/Linux/bin/qmake" CACHE PATH "") +set(COMPOUND_LIB "/import/bc2/home/schwede/GROUP/OpenStructure/ChemLib/compounds.chemlib" CACHE PATH "") +set(TIFF_LIBRARY "${OST_LOCAL_LIBS}/lib/libtiff.a" CACHE PATH "") +set(TIFF_INCLUDE_DIR "${OST_LOCAL_LIBS}/include/" CACHE PATH "") +set (CMAKE_BUILD_TYPE "Release" CACHE PATH "") diff --git a/cmake_support/OST.cmake b/cmake_support/OST.cmake index 6d3fff7edfd000415a2166ecb8768563779cc891..06e352919217f98e380ab796e085c3e1f77d36b7 100644 --- a/cmake_support/OST.cmake +++ b/cmake_support/OST.cmake @@ -142,7 +142,9 @@ macro(module) "invalid use of module(): a module name must be provided") endif() - + if (ENABLE_STATIC AND _ARG_NO_STATIC) + return() + endif() if (_ARG_HEADER_OUTPUT_DIR) set(_HEADER_OUTPUT_DIR ${_ARG_HEADER_OUTPUT_DIR}) else() @@ -177,8 +179,11 @@ macro(module) list(APPEND _ABS_SOURCE_NAMES "${CMAKE_CURRENT_SOURCE_DIR}/${_SOURCE}") endif() endforeach() - add_library(${_LIB_NAME} SHARED ${_ABS_SOURCE_NAMES}) - + if (ENABLE_STATIC AND NOT _ARG_NO_STATIC) + add_library(${_LIB_NAME} STATIC ${_ABS_SOURCE_NAMES}) + else() + add_library(${_LIB_NAME} SHARED ${_ABS_SOURCE_NAMES}) + endif() set_target_properties(${_LIB_NAME} PROPERTIES OUTPUT_NAME ${_LIB_NAME} PROJECT_LABEL ${_ARG_NAME} @@ -194,25 +199,6 @@ macro(module) LIBRARY_OUTPUT_DIRECTORY ${LIB_STAGE_PATH} ARCHIVE_OUTPUT_DIRECTORY ${LIB_STAGE_PATH} RUNTIME_OUTPUT_DIRECTORY ${LIB_STAGE_PATH}) - if (ENABLE_STATIC AND NOT _ARG_NO_STATIC) - add_library(${_LIB_NAME}_static STATIC ${_ABS_SOURCE_NAMES}) - set_target_properties(${_LIB_NAME}_static - PROPERTIES OUTPUT_NAME ${_LIB_NAME} - PROJECT_LABEL ${_ARG_NAME} - EchoString ${_ARG_NAME} - MODULE_DEPS "${_ARG_DEPENDS_ON}") - get_target_property(_DEFS ${_LIB_NAME}_static COMPILE_DEFINITIONS) - set_target_properties(${_LIB_NAME}_static PROPERTIES - COMPILE_DEFINITIONS OST_MODULE_${_UPPER_LIB_NAME}) - set_target_properties(${_LIB_NAME}_static PROPERTIES - LIBRARY_OUTPUT_DIRECTORY ${LIB_STAGE_PATH} - ARCHIVE_OUTPUT_DIRECTORY ${LIB_STAGE_PATH} - RUNTIME_OUTPUT_DIRECTORY ${LIB_STAGE_PATH}) - foreach(_DEPENDENCY ${_ARG_DEPENDS_ON}) - target_link_libraries(${_LIB_NAME}_static ${_DEPENDENCY}_static) - endforeach() - target_link_libraries(${_LIB_NAME}_static ${ZLIB_LIBRARIES} ${_ARG_LINK}) - endif() if (APPLE) set_target_properties(${_LIB_NAME} PROPERTIES LINK_FLAGS "-Wl,-rpath,@@loader_path" @@ -222,7 +208,11 @@ macro(module) #set_target_properties(${_LIB_NAME} PROPERTIES PREFIX "../") install(TARGETS ${_LIB_NAME} ARCHIVE DESTINATION "${LIB_DIR}") else() - install(TARGETS ${_LIB_NAME} LIBRARY DESTINATION "${LIB_DIR}") + if (ENABLE_STATIC) + install(TARGETS ${_LIB_NAME} ARCHIVE DESTINATION "${LIB_DIR}") + else() + install(TARGETS ${_LIB_NAME} LIBRARY DESTINATION "${LIB_DIR}") + endif() endif() if (_ARG_LINK) target_link_libraries(${_LIB_NAME} ${_ARG_LINK}) @@ -230,6 +220,10 @@ macro(module) foreach(_DEPENDENCY ${_ARG_DEPENDS_ON}) target_link_libraries(${_LIB_NAME} ${_DEPENDENCY}) endforeach() + if (ENABLE_STATIC) + target_link_libraries(${_LIB_NAME} ${STATIC_LIBRARIES}) + endif() + else() add_custom_target("${_LIB_NAME}" ALL) set_target_properties("${_LIB_NAME}" PROPERTIES HEADER_ONLY 1 @@ -302,13 +296,23 @@ macro(executable) if (_ARG_LINK) target_link_libraries(${_ARG_NAME} ${_ARG_LINK}) endif() + foreach(_DEP ${_ARG_DEPENDS_ON}) + target_link_libraries(${_ARG_NAME} ${_DEP}) + endforeach() if (ENABLE_STATIC AND _ARG_STATIC) - set(TARGET_SUFFIX _static) target_link_libraries(${_ARG_NAME} ${STATIC_LIBRARIES}) + if (UNIX AND NOT APPLE) + if (OST_GCC_45) + set_target_properties(${_ARG_NAME} + PROPERTIES LINK_SEARCH_END_STATIC TRUE + LINK_FLAGS "-static-libgcc -static-libstdc++ -static -pthread") + else() + set_target_properties(${_ARG_NAME} + PROPERTIES LINK_SEARCH_END_STATIC TRUE + LINK_FLAGS "-static-libgcc -static -pthread") + endif() + endif() endif() - foreach(_DEP ${_ARG_DEPENDS_ON}) - target_link_libraries(${_ARG_NAME} ${_DEP}${TARGET_SUFFIX}) - endforeach() install(TARGETS ${_ARG_NAME} DESTINATION bin) endmacro() @@ -338,11 +342,13 @@ macro(executable_libexec) target_link_libraries(${_ARG_NAME} ${_ARG_LINK}) endif() if (ENABLE_STATIC AND _ARG_STATIC) - set(TARGET_SUFFIX _static) target_link_libraries(${_ARG_NAME} ${STATIC_LIBRARIES}) + set_target_properties(${_ARG_NAME} + PROPERTIES LINK_SEARCH_END_STATIC TRUE) + endif() foreach(_DEP ${_ARG_DEPENDS_ON}) - target_link_libraries(${_ARG_NAME} ${_DEP}${TARGET_SUFFIX}) + target_link_libraries(${_ARG_NAME} ${_DEP}) endforeach() install(TARGETS ${_ARG_NAME} DESTINATION ${LIBEXEC_PATH}) endmacro() @@ -472,6 +478,9 @@ macro(pymod) if (NOT _ARG_NAME) message(FATAL_ERROR "invalid use of pymod(): a name must be provided") endif() + if (ENABLE_STATIC) + return() + endif() if (_ARG_OUTPUT_DIR) set(PYMOD_DIR "openstructure/${_ARG_OUTPUT_DIR}") else() @@ -499,14 +508,18 @@ macro(pymod) endif() target_link_libraries("_${_LIB_NAME}" ${_PARENT_LIB_NAME} ${PYTHON_LIBRARIES} ${BOOST_PYTHON_LIBRARIES}) - if (_USE_RPATH) - set_target_properties("_${_LIB_NAME}" - PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${PYMOD_STAGE_DIR} - INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/${LIB_DIR}") - else() - set_target_properties("_${_LIB_NAME}" - PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${PYMOD_STAGE_DIR} - INSTALL_RPATH "") + + set_target_properties("_${_LIB_NAME}" + PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${PYMOD_STAGE_DIR}) + + if (NOT ENABLE_STATIC) + if (_USE_RPATH) + set_target_properties("_${_LIB_NAME}" + PROPERTIES INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/${LIB_DIR}") + else() + set_target_properties("_${_LIB_NAME}" + PROPERTIES INSTALL_RPATH "") + endif() endif() if (APPLE) file(RELATIVE_PATH _REL_PATH "${PYMOD_STAGE_DIR}" "${LIB_STAGE_PATH}") @@ -582,7 +595,6 @@ macro(pymod) add_dependencies("_${_LIB_NAME}" "_${dep}") endforeach() endif() - endmacro() add_custom_target(check) @@ -845,7 +857,7 @@ macro(setup_compiler_flags) endif() endif() endmacro() -set(_BOOST_MIN_VERSION 1.37) +set(_BOOST_MIN_VERSION 1.31) macro(setup_boost) find_package(Boost ${_BOOST_MIN_VERSION} COMPONENTS python REQUIRED) diff --git a/modules/base/pymod/CMakeLists.txt b/modules/base/pymod/CMakeLists.txt index 0e9213ba1cb9795b86e212c36d4e0fa8cc20fe92..6a011018fb032d44e07680e214e9bfcb5c14e454 100644 --- a/modules/base/pymod/CMakeLists.txt +++ b/modules/base/pymod/CMakeLists.txt @@ -4,7 +4,8 @@ set(OST_BASE_PYMOD_SOURCES export_range.cc export_units.cc ) - -pymod(NAME base OUTPUT_DIR ost - CPP ${OST_BASE_PYMOD_SOURCES} - PY __init__.py settings.py stutil.py table.py xmlrunner.py testutils.py) +if (NOT ENABLE_STATIC) + pymod(NAME base OUTPUT_DIR ost + CPP ${OST_BASE_PYMOD_SOURCES} + PY __init__.py settings.py stutil.py table.py xmlrunner.py testutils.py) +endif() diff --git a/modules/config/CMakeLists.txt b/modules/config/CMakeLists.txt index 617aa51c5b87a2dc03b95d7a92730b097b31d371..1e637d14470c6aa77af76cdd6c58e5ad5561c180 100644 --- a/modules/config/CMakeLists.txt +++ b/modules/config/CMakeLists.txt @@ -21,7 +21,6 @@ if (USE_NUMPY) else() set(numpy_support 0) endif() - if (PROFILE) set(profiling_enabled 1) else() @@ -62,6 +61,11 @@ if (_DEBIAN_STYLE_LIBEXEC) else() set(debian_style_libexec 0) endif() +if (ENABLE_INFO) + set(info_enabled 1) +else() + set(info_enabled 0) +endif() set(config_hh_generator "CMake") set(CONFIG_HH_FILE "${CMAKE_CURRENT_SOURCE_DIR}/config.hh") diff --git a/modules/config/config.hh.in b/modules/config/config.hh.in index a9e33adca707baed39710d3c75f63ca2b210bf0b..c2242500ee2e528294c5beb77a5c650f9adfe288 100644 --- a/modules/config/config.hh.in +++ b/modules/config/config.hh.in @@ -33,5 +33,6 @@ #define OST_FFT_USE_THREADS @fftw_use_threads@ #define OST_NUMPY_SUPPORT_ENABLED @numpy_support@ #define OST_DEBIAN_STYLE_LIBEXEC @debian_style_libexec@ +#define OST_INFO_ENABLED @info_enabled@ #endif diff --git a/modules/conop/pymod/CMakeLists.txt b/modules/conop/pymod/CMakeLists.txt index 650939bfd9aea21dac1925adadf6866f4db37e65..c1bf89d0e29cda36f4b4bcb9b0b357449aaa8ad7 100644 --- a/modules/conop/pymod/CMakeLists.txt +++ b/modules/conop/pymod/CMakeLists.txt @@ -8,4 +8,6 @@ set(OST_CONOP_PYMOD_SOURCES export_ring_finder.cc ) -pymod(NAME conop CPP ${OST_CONOP_PYMOD_SOURCES} PY __init__.py cleanup.py) +if (NOT ENABLE_STATIC) + pymod(NAME conop CPP ${OST_CONOP_PYMOD_SOURCES} PY __init__.py cleanup.py) +endif() diff --git a/modules/conop/pymod/export_builder.cc b/modules/conop/pymod/export_builder.cc index 4bd468f36b23180c726f661f34a89227ee7168c0..1897983f90b7c4065316633db738732c0ba4b93f 100644 --- a/modules/conop/pymod/export_builder.cc +++ b/modules/conop/pymod/export_builder.cc @@ -36,6 +36,8 @@ void export_Builder() { .add_property("dialect", &Builder::GetDialect, &Builder::SetDialect) .add_property("strict_hydrogens", &Builder::GetStrictHydrogenMode, &Builder::SetStrictHydrogenMode) + .add_property("bond_feasibility_check", &Builder::GetBondFeasibilityCheck, + &Builder::SetBondFeasibilityCheck) .def("GetDialect", &Builder::GetDialect) .def("SetDialect", &Builder::SetDialect) .def("CompleteAtoms", &Builder::CompleteAtoms) @@ -48,6 +50,8 @@ void export_Builder() { .def("AssignTorsionsToResidue", &Builder::AssignTorsionsToResidue) .def("FillAtomProps", &Builder::FillAtomProps) .def("IsResidueComplete", &Builder::IsResidueComplete) + .def("SetBondFeasibilityFlag", &Builder::SetBondFeasibilityCheck) + .def("GetBondFeasibilityFlag", &Builder::GetBondFeasibilityCheck) ; class_<HeuristicBuilder, bases<Builder> >("HeuristicBuilder", init<>()) @@ -56,5 +60,6 @@ void export_Builder() { init<const CompoundLibPtr&>()) .add_property("compound_lib", &RuleBasedBuilder::GetCompoundLib) .def("GetUnknownAtoms", &RuleBasedBuilder::GetUnknownAtoms) + ; } diff --git a/modules/conop/src/builder.hh b/modules/conop/src/builder.hh index f912aba702cd075768da77c1c837f558877f3fda..4b915681a51d2d47c6d36fe449424f5b189de772 100644 --- a/modules/conop/src/builder.hh +++ b/modules/conop/src/builder.hh @@ -54,7 +54,7 @@ typedef enum { class DLLEXPORT_OST_CONOP Builder { public: - Builder(): dialect_(PDB_DIALECT), strict_(false) { } + Builder(): dialect_(PDB_DIALECT), strict_(false), bond_feasibility_check_(true) { } virtual ~Builder(); /// \brief add any missing atoms to the residue based on its key, @@ -143,9 +143,17 @@ public: /// |brief Connect \p atom with all atoms for whith IsBondFeasible() and /// AreResiduesConsecutive() returns true void DistanceBasedConnect(mol::AtomHandle atom); + + /// \brief Set bond feasibility check flag + void SetBondFeasibilityCheck(bool b_feas_flag) { bond_feasibility_check_ = b_feas_flag; } + + /// \brief Get bond feasibility check flag + bool GetBondFeasibilityCheck() const { return bond_feasibility_check_; } + private: Dialect dialect_; bool strict_; + bool bond_feasibility_check_; }; diff --git a/modules/conop/src/heuristic_builder.cc b/modules/conop/src/heuristic_builder.cc index 89b8ad8e1720754b0941e8b1a7d8977e252c14fc..458370078ea9171766bee2013506a170d0ac869d 100644 --- a/modules/conop/src/heuristic_builder.cc +++ b/modules/conop/src/heuristic_builder.cc @@ -209,19 +209,36 @@ void HeuristicBuilder::ConnectivityFromAtomNames(const mol::ResidueHandle& res, << it2->GetName() << ") in connectivity table of " << res.GetKey() << "... "); int conn=centry.Check(it1->GetName(),it2->GetName()); - if (conn==1 && this->IsBondFeasible(*it1, *it2)) { - LOG_TRACE( "found"); - editor.Connect(*it1,*it2); - } else if(conn==2 && this->IsBondFeasible(*it2, *it1)) { - LOG_TRACE( "found (reversed)"); - editor.Connect(*it2,*it1); + if (conn==1) { + if (this->GetBondFeasibilityCheck()==false) { + LOG_TRACE( "found"); + editor.Connect(*it1,*it2); + } else { + if (this->IsBondFeasible(*it1, *it2)) { + LOG_TRACE( "found"); + editor.Connect(*it1,*it2); + } else { + LOG_TRACE( "not found"); + } + } + } else if (conn==2) { + if (this->GetBondFeasibilityCheck()==false) { + LOG_TRACE( "found (reversed)"); + editor.Connect(*it2,*it1); + } else { + if(this->IsBondFeasible(*it2, *it1)) { + LOG_TRACE( "found (reversed)"); + editor.Connect(*it2,*it1); + } + } } else { - LOG_TRACE( "not found"); + LOG_TRACE( "not found"); } } } else { unknown_atoms.push_back(*it1); - } + LOG_TRACE( "atom not found, pushing it to unknown atoms"); + } } } diff --git a/modules/conop/src/rule_based_builder.cc b/modules/conop/src/rule_based_builder.cc index 35709c287d61181fa0beb5c5920a48ce7e8326b3..33d33c667faebb47593eebe53f28285c448b1956 100644 --- a/modules/conop/src/rule_based_builder.cc +++ b/modules/conop/src/rule_based_builder.cc @@ -237,12 +237,20 @@ void RuleBasedBuilder::ConnectAtomsOfResidue(mol::ResidueHandle rh) const BondSpec& bond=*j; mol::AtomHandle a1=this->LocateAtom(atoms, bond.atom_one); mol::AtomHandle a2=this->LocateAtom(atoms, bond.atom_two); - if (a1.IsValid() && a2.IsValid() && this->IsBondFeasible(a1, a2)) { - if (this->GetStrictHydrogenMode() && - (a1.GetElement()=="H" || a2.GetElement()=="D")) { - continue; + if (a1.IsValid() && a2.IsValid()) { + if (this->GetBondFeasibilityCheck()==false) { + if (this->GetStrictHydrogenMode() && (a1.GetElement()=="H" || a2.GetElement()=="D")) { + continue; + } + e.Connect(a1, a2, bond.order); + } else { + if (IsBondFeasible(a1, a2)) { + if (this->GetStrictHydrogenMode() && (a1.GetElement()=="H" || a2.GetElement()=="D")) { + continue; + } + e.Connect(a1, a2, bond.order); + } } - e.Connect(a1, a2, bond.order); } } for (mol::AtomHandleList::iterator i=atoms.begin(), e=atoms.end(); i!=e; ++i) { diff --git a/modules/conop/src/rule_based_builder.hh b/modules/conop/src/rule_based_builder.hh index 9ecc45c101cbbb2c6777ff7fb985bb2e9e921db1..71a6fd03453ba9c418a6e39d8c0e011161f13be6 100644 --- a/modules/conop/src/rule_based_builder.hh +++ b/modules/conop/src/rule_based_builder.hh @@ -109,7 +109,7 @@ public: /// by ignoring it or by inserting a dummy atom. virtual void OnMissingAtom(const mol::ResidueHandle& residue, const String& atom_name) { } - + /// \brief Fill in missing information based on atom name. virtual void FillAtomProps(mol::AtomHandle atom, const AtomSpec& spec); @@ -123,6 +123,7 @@ public: virtual bool IsResidueComplete(const mol::ResidueHandle& residue); CompoundLibPtr GetCompoundLib() const { return compound_lib_; } + private: CompoundLibPtr compound_lib_; CompoundPtr last_compound_; @@ -139,7 +140,6 @@ private: void AssignBackBoneTorsionsToResidue(mol::ResidueHandle residue); - }; typedef boost::shared_ptr<RuleBasedBuilder> RuleBasedBuilderPtr; diff --git a/modules/conop/tests/test_heuristic_builder.cc b/modules/conop/tests/test_heuristic_builder.cc index 4220f3110ca1af0ecec5acc183dba6d1ad5b5f11..0e3a811ae922d0d8375fe98ab96163765f5766f4 100644 --- a/modules/conop/tests/test_heuristic_builder.cc +++ b/modules/conop/tests/test_heuristic_builder.cc @@ -65,6 +65,21 @@ ResidueHandle make_leu(ChainHandle chain) return res; } +ResidueHandle make_defective_leu(ChainHandle chain) +{ + XCSEditor e=chain.GetEntity().EditXCS(); + ResidueHandle res=e.AppendResidue(chain, "LEU"); + + e.InsertAtom(res, "N", geom::Vec3(19.003,32.473,60.366)); + e.InsertAtom(res, "CA", geom::Vec3(18.330,32.402,61.664)); + e.InsertAtom(res, "C", geom::Vec3(17.884,33.787,62.117)); + e.InsertAtom(res, "O", geom::Vec3(17.853,34.091,63.308)); + e.InsertAtom(res, "CB", geom::Vec3(19.269,31.793,102.710)); + e.InsertAtom(res, "CG", geom::Vec3(19.695,30.340,62.501)); + e.InsertAtom(res, "CD1", geom::Vec3(20.585,29.897,63.648)); + e.InsertAtom(res, "CD2", geom::Vec3(18.461,29.459,62.420)); + return res; +} void verify_connectivity_x(const ResidueHandle& res) { @@ -154,12 +169,25 @@ BOOST_AUTO_TEST_CASE(name_based_connect) heuristic_builder.FillAtomProps(*i); } + EntityHandle de=CreateEntity(); + ChainHandle dc=de.EditXCS().InsertChain("A"); + ResidueHandle dile=make_defective_leu(dc); + HeuristicBuilder dheuristic_builder; + dheuristic_builder.SetBondFeasibilityCheck(false); + for (AtomHandleIter i=de.AtomsBegin(),x=de.AtomsEnd(); i!=x; ++i) { + dheuristic_builder.FillAtomProps(*i); + } + BOOST_MESSAGE("running distance based checks on arginine"); heuristic_builder.ConnectAtomsOfResidue(arg); verify_connectivity(arg); BOOST_MESSAGE("running distance based checks on leu"); heuristic_builder.ConnectAtomsOfResidue(ile); verify_connectivity(ile); + + BOOST_MESSAGE("running distance based checks on defective leu"); + dheuristic_builder.ConnectAtomsOfResidue(dile); + verify_connectivity(dile); } BOOST_AUTO_TEST_CASE(test_assign_torsions){ diff --git a/modules/conop/tests/test_rule_based_builder.cc b/modules/conop/tests/test_rule_based_builder.cc index 0bc08d4047027a9d7895a6ae6e824b4358155ff0..50e34860a606912aa978fc3429dc1b1f87c2656a 100644 --- a/modules/conop/tests/test_rule_based_builder.cc +++ b/modules/conop/tests/test_rule_based_builder.cc @@ -119,6 +119,35 @@ ResidueHandle make_uracil2(ChainHandle chain) return res; } +ResidueHandle make_defective_uracil2(ChainHandle chain) +{ + XCSEditor e=chain.GetEntity().EditXCS(); + ResidueHandle res = e.AppendResidue(chain, "U"); + + e.InsertAtom(res, "P", geom::Vec3(16.249, 28.254, 44.759)); + e.InsertAtom(res, "OP1", geom::Vec3(16.654, 28.055, 46.181)); + e.InsertAtom(res, "OP2", geom::Vec3(17.115, 27.731, 43.656)); + e.InsertAtom(res, "O5'", geom::Vec3(14.826, 27.572, 44.574)); + e.InsertAtom(res, "C5'", geom::Vec3(14.711, 26.206, 44.216)); + e.InsertAtom(res, "C4'", geom::Vec3(13.279, 25.889, 43.887)); + e.InsertAtom(res, "O4'", geom::Vec3(12.832, 26.793, 42.838)); + e.InsertAtom(res, "C3'", geom::Vec3(13.155, 24.434, 43.329)); + e.InsertAtom(res, "O3'", geom::Vec3(12.269, 23.625, 44.098)); + e.InsertAtom(res, "C2'", geom::Vec3(12.871, 24.595, 41.875)); + e.InsertAtom(res, "O2'", geom::Vec3(11.811, 23.752, 41.462)); + e.InsertAtom(res, "C1'", geom::Vec3(12.424, 26.056, 41.694)); + e.InsertAtom(res, "N1", geom::Vec3(13.030, 26.692, 40.497)); + e.InsertAtom(res, "C2", geom::Vec3(12.517, 26.365, 39.228)); + e.InsertAtom(res, "O2", geom::Vec3(11.579, 25.594, 39.068)); + e.InsertAtom(res, "N3", geom::Vec3(13.141, 26.987, 38.161)); + e.InsertAtom(res, "C4", geom::Vec3(14.197, 27.888, 38.210)); + e.InsertAtom(res, "O4", geom::Vec3(14.627, 28.368, 37.156)); + e.InsertAtom(res, "C5", geom::Vec3(14.671, 28.189, 39.542)); + e.InsertAtom(res, "C6", geom::Vec3(14.087, 27.597, 80.612)); + + return res; +} + void verify_nucleotide_connectivity(const ResidueHandle& res) { BOOST_CHECK(BondExists(res.FindAtom("P"), @@ -217,16 +246,28 @@ BOOST_AUTO_TEST_CASE(nucleotide_based_connect) } RuleBasedBuilder rb_builder = RuleBasedBuilder(compound_lib); + RuleBasedBuilder drb_builder = RuleBasedBuilder(compound_lib); + drb_builder.SetBondFeasibilityCheck(false); + EntityHandle e=CreateEntity(); ChainHandle c=e.EditXCS().InsertChain("A"); ResidueHandle c0=make_cytosine(c); ResidueHandle u1=make_uracil1(c); ResidueHandle u2=make_uracil2(c); + + EntityHandle de=CreateEntity(); + ChainHandle dc=de.EditXCS().InsertChain("A"); + ResidueHandle du2=make_defective_uracil2(dc); + for (AtomHandleIter i=e.AtomsBegin(),x=e.AtomsEnd(); i!=x; ++i) { rb_builder.FillAtomProps(*i); } + for (AtomHandleIter i=de.AtomsBegin(),x=de.AtomsEnd(); i!=x; ++i) { + drb_builder.FillAtomProps(*i); + } + // running positive test BOOST_MESSAGE("running distance based checks on cytosine"); rb_builder.ConnectAtomsOfResidue(c0); @@ -247,6 +288,12 @@ BOOST_AUTO_TEST_CASE(nucleotide_based_connect) BOOST_MESSAGE("connecting cytosine to second uracil"); rb_builder.ConnectResidueToNext(c0, u2); verify_nucleotide_nolink(c0, u2); + + // running positive test + BOOST_MESSAGE("running distance based checks on defective uracil"); + drb_builder.ConnectAtomsOfResidue(du2); + verify_nucleotide_connectivity(du2); + } BOOST_AUTO_TEST_SUITE_END( ) diff --git a/modules/db/src/CMakeLists.txt b/modules/db/src/CMakeLists.txt index 7ccafdebd3bd5c0dbea2e72ebef42f05c066af08..8da34460be841e381308fcff5e6ca7e47cd59115 100644 --- a/modules/db/src/CMakeLists.txt +++ b/modules/db/src/CMakeLists.txt @@ -12,7 +12,8 @@ sqlite3.c module(NAME db SOURCES ${OST_DB_SOURCES} HEADERS ${OST_DB_HEADERS} DEPENDS_ON ost_base) +add_definitions(-DSQLITE_OMIT_LOAD_EXTENSION) if(WIN32) set_target_properties(ost_db PROPERTIES LINK_FLAGS "/DEF:sqlite3.def") add_definitions(/DSQLITE_ENABLE_COLUMN_METADATA) -endif(WIN32) \ No newline at end of file +endif(WIN32) diff --git a/modules/geom/pymod/CMakeLists.txt b/modules/geom/pymod/CMakeLists.txt index 240dd87a2465360ea53b669be92eb28ea8b2898a..f79aeac4c2f9c8c127e28b0071c0ef502ba0ac38 100644 --- a/modules/geom/pymod/CMakeLists.txt +++ b/modules/geom/pymod/CMakeLists.txt @@ -16,4 +16,6 @@ set(OST_GEOM_PYMOD_SOURCES export_quat.cc ) -pymod(NAME geom CPP ${OST_GEOM_PYMOD_SOURCES} PY __init__.py) \ No newline at end of file +if (NOT ENABLE_STATIC) + pymod(NAME geom CPP ${OST_GEOM_PYMOD_SOURCES} PY __init__.py) +endif() diff --git a/modules/img/alg/pymod/CMakeLists.txt b/modules/img/alg/pymod/CMakeLists.txt index c257040e5f976609bd7c0c13469690c2260b758e..be68daec5e5a2446bd3a6548ae34b59cc4884332 100644 --- a/modules/img/alg/pymod/CMakeLists.txt +++ b/modules/img/alg/pymod/CMakeLists.txt @@ -6,5 +6,7 @@ export_transcendentals.cc export_polar.cc ) -pymod(NAME img_alg OUTPUT_DIR ost/img/alg CPP ${OST_IMG_ALG_PYMOD_SOURCES} - PY __init__.py) +if (NOT ENABLE_STATIC) + pymod(NAME img_alg OUTPUT_DIR ost/img/alg CPP ${OST_IMG_ALG_PYMOD_SOURCES} + PY __init__.py) +endif() diff --git a/modules/img/alg/src/CMakeLists.txt b/modules/img/alg/src/CMakeLists.txt index 5dc212da9f112a9eed2dafc53eb187254a550a95..a49b80125f11de0531412e7fd2929577669aa647 100644 --- a/modules/img/alg/src/CMakeLists.txt +++ b/modules/img/alg/src/CMakeLists.txt @@ -94,7 +94,9 @@ line_average.hh rscrosscorr.hh ) +if(ENABLE_INFO) include(${QT_USE_FILE}) +endif() module(NAME img_alg SOURCES "${OST_IMG_ALG_SOURCES}" HEADERS "${OST_IMG_ALG_HEADERS}" HEADER_OUTPUT_DIR ost/img/alg diff --git a/modules/img/alg/src/fft.cc b/modules/img/alg/src/fft.cc index 84ac57b19bed1eda916653ca4a44b355c908892f..49fc3f6260ffdb986a3cb6f91a7da890516b2405 100644 --- a/modules/img/alg/src/fft.cc +++ b/modules/img/alg/src/fft.cc @@ -25,8 +25,12 @@ #include <boost/shared_ptr.hpp> #include <fftw3.h> +#if OST_INFO_ENABLED #include <QThread> - +#define IDEAL_NUMBER_OF_THREADS() QThread::idealThreadCount() +#else +#define IDEAL_NUMBER_OF_THREADS() 1 +#endif #include <ost/message.hh> #include <ost/img/value_util.hh> #include <ost/img/image_state/image_state_def.hh> @@ -130,7 +134,7 @@ reinterpret_cast<OST_FFTW_fftw_complex*>(out_state->Data().GetData()); for(size_t i=0;i<block_count;i++) { std::copy(&in_ptr[i*src_size],&in_ptr[(i+1)*src_size],&fftw_in[i*2*dst_size]); } - OST_FFTW_fftw_plan_with_nthreads(std::max<int>(1,QThread::idealThreadCount())); + OST_FFTW_fftw_plan_with_nthreads(std::max<int>(1,IDEAL_NUMBER_OF_THREADS())); OST_FFTW_fftw_plan plan = OST_FFTW_fftw_plan_dft_r2c(rank,n, fftw_in,fftw_out, FFTW_ESTIMATE); @@ -213,7 +217,7 @@ ImageStateBasePtr FFTFnc::VisitState<Complex,HalfFrequencyDomain>(const ComplexH Real* fftw_out = reinterpret_cast<Real*>(out_ptr); assert(sizeof(OST_FFTW_fftw_complex)==sizeof(Complex)); - OST_FFTW_fftw_plan_with_nthreads(std::max<int>(1,QThread::idealThreadCount())); + OST_FFTW_fftw_plan_with_nthreads(std::max<int>(1,IDEAL_NUMBER_OF_THREADS())); OST_FFTW_fftw_complex* fftw_in = reinterpret_cast<OST_FFTW_fftw_complex*>(out_ptr); @@ -259,7 +263,7 @@ ImageStateBasePtr FFTFnc::VisitState<Complex,SpatialDomain>(const ComplexSpatial reinterpret_cast<OST_FFTW_fftw_complex*>(out_state->Data().GetData()); // in place transform - OST_FFTW_fftw_plan_with_nthreads(std::max<int>(1,QThread::idealThreadCount())); + OST_FFTW_fftw_plan_with_nthreads(std::max<int>(1,IDEAL_NUMBER_OF_THREADS())); OST_FFTW_fftw_plan plan = OST_FFTW_fftw_plan_dft(rank,n, fftw_out, fftw_out, dir, @@ -297,7 +301,7 @@ ImageStateBasePtr FFTFnc::VisitState<Complex,FrequencyDomain>(const ComplexFrequ reinterpret_cast<OST_FFTW_fftw_complex*>(out_state->Data().GetData()); // in place transform - OST_FFTW_fftw_plan_with_nthreads(std::max<int>(1,QThread::idealThreadCount())); + OST_FFTW_fftw_plan_with_nthreads(std::max<int>(1,IDEAL_NUMBER_OF_THREADS())); OST_FFTW_fftw_plan plan = OST_FFTW_fftw_plan_dft(rank,n, fftw_out, fftw_out, dir, diff --git a/modules/img/base/pymod/CMakeLists.txt b/modules/img/base/pymod/CMakeLists.txt index aecb5eeb9386d66c5495af54ec897e3189dd4763..de787d14064aa27fb4f0117e9f9bf3bdac06c596 100644 --- a/modules/img/base/pymod/CMakeLists.txt +++ b/modules/img/base/pymod/CMakeLists.txt @@ -16,5 +16,7 @@ export_map.cc wrap_img.cc ) -pymod(NAME img OUTPUT_DIR ost/img - CPP ${OST_IMG_PYMOD_SOURCES} PY __init__.py) +if (NOT ENABLE_STATIC) + pymod(NAME img OUTPUT_DIR ost/img + CPP ${OST_IMG_PYMOD_SOURCES} PY __init__.py) +endif() diff --git a/modules/img/base/pymod/export_mask.cc b/modules/img/base/pymod/export_mask.cc index 3a5faacf883ec2845ba48f06f4021d8bb23d14ba..40f42e9b0f00e1ca5ac20021e8e544e72bc9fd7f 100644 --- a/modules/img/base/pymod/export_mask.cc +++ b/modules/img/base/pymod/export_mask.cc @@ -26,7 +26,10 @@ using namespace boost::python; #include <ost/img/mask.hh> +#include <ost/config.hh> +#if(OST_INFO_ENABLED) #include <ost/img/mask_info_convert.hh> +#endif namespace ost { namespace img { @@ -101,7 +104,10 @@ void export_Mask() def("Mask",mask2); def("Mask",mask3); def("Mask",mask4); + +#if(OST_INFO_ENABLED) def("InfoToMask",InfoToMask); def("MaskToInfo",MaskToInfo); - +#endif + } diff --git a/modules/img/base/src/CMakeLists.txt b/modules/img/base/src/CMakeLists.txt index d218ac2ad4f265d7dfd8098313b93b46d71f8a60..ff5191865fc22a3364106ba0980174417946742b 100644 --- a/modules/img/base/src/CMakeLists.txt +++ b/modules/img/base/src/CMakeLists.txt @@ -29,7 +29,6 @@ extent_mask.cc spherical_mask.cc mask_op.cc circle_mask.cc -mask_info_convert.cc image_list.cc physical_units.cc progress.cc @@ -86,13 +85,17 @@ spherical_mask.hh mask_op.hh mask.hh circle_mask.hh -mask_info_convert.hh image_list.hh physical_units.hh progress.hh map.hh ) +if (ENABLE_INFO) + list(APPEND OST_IMG_SOURCES mask_info_convert.cc) + list(APPEND OST_IMG_HEADERS mask_info_convert.hh) + set(INFO_DEPS ost_info) +endif() foreach(fname ${OST_IMG_IMAGE_STATE_SOURCES}) set(OST_IMG_SOURCES ${OST_IMG_SOURCES} image_state/${fname}) @@ -106,4 +109,4 @@ module(NAME img SOURCES "${OST_IMG_SOURCES}" HEADERS ${OST_IMG_RASTER_IMAGE_HEADERS} IN_DIR raster_image ${OST_IMG_IMAGE_STATE_HEADERS} IN_DIR image_state ${OST_IMG_HEADERS} - DEPENDS_ON ost_geom ost_base ost_info) + DEPENDS_ON ost_geom ost_base ${INFO_DEPS}) diff --git a/modules/info/CMakeLists.txt b/modules/info/CMakeLists.txt index 9214aaa382e2e266e1d41dc1aeab37a69d4001ca..23eb6ec6733d11d5a081328ae04865a0240f66b2 100644 --- a/modules/info/CMakeLists.txt +++ b/modules/info/CMakeLists.txt @@ -1,2 +1,4 @@ -add_subdirectory(src) -add_subdirectory(pymod) +if (ENABLE_INFO) + add_subdirectory(src) + add_subdirectory(pymod) +endif() \ No newline at end of file diff --git a/modules/io/pymod/CMakeLists.txt b/modules/io/pymod/CMakeLists.txt index 38f43cdfae0dae30f926ce679fbb0fcbeefe240b..007569fff38887504ed15d21231b2b5d4464b346 100644 --- a/modules/io/pymod/CMakeLists.txt +++ b/modules/io/pymod/CMakeLists.txt @@ -14,10 +14,11 @@ set(OST_IO_PYMOD_MODULES repository.py ) - -pymod(NAME io CPP ${OST_IO_PYMOD_SOURCES} PY ${OST_IO_PYMOD_MODULES}) -if (STATIC_LIBRARIES) - message("adding zlib libraries") - target_link_libraries(_ost_io ${ZLIB_LIBRARIES}) +if (NOT ENABLE_STATIC) + pymod(NAME io CPP ${OST_IO_PYMOD_SOURCES} PY ${OST_IO_PYMOD_MODULES}) + if (STATIC_LIBRARIES) + message("adding zlib libraries") + target_link_libraries(_ost_io ${ZLIB_LIBRARIES}) + endif() endif() diff --git a/modules/io/pymod/__init__.py b/modules/io/pymod/__init__.py index 5654e22a5508f22ad2072732a2d57b8d73b2e1ce..95ea418b344a21910a925f463151d34af4a8eb22 100644 --- a/modules/io/pymod/__init__.py +++ b/modules/io/pymod/__init__.py @@ -86,7 +86,7 @@ def LoadPDB(filename, restrict_chains="", no_hetatms=None, fault_tolerant=None, load_multi=False, quack_mode=None, join_spread_atom_records=None, calpha_only=None, profile='DEFAULT', remote=False, dialect=None, - strict_hydrogens=None, seqres=False): + strict_hydrogens=None, seqres=False, bond_feasibility_check=None): """ Load PDB file from disk and return one or more entities. Several options allow to customize the exact behaviour of the PDB import. For more information @@ -147,6 +147,7 @@ def LoadPDB(filename, restrict_chains="", no_hetatms=None, prof.quack_mode=_override(prof.quack_mode, quack_mode) prof.strict_hydrogens=_override(prof.strict_hydrogens, strict_hydrogens) prof.fault_tolerant=_override(prof.fault_tolerant, fault_tolerant) + prof.bond_feasibility_check=_override(prof.bond_feasibility_check, bond_feasibility_check) prof.join_spread_atom_records=_override(prof.join_spread_atom_records, join_spread_atom_records) @@ -164,6 +165,7 @@ def LoadPDB(filename, restrict_chains="", no_hetatms=None, elif prof.dialect=='CHARMM': builder.dialect=conop.CHARMM_DIALECT builder.strict_hydrogens=prof.strict_hydrogens + builder.bond_feasibility_check=prof.bond_feasibility_check reader=PDBReader(filename, prof) reader.read_seqres=seqres try: diff --git a/modules/io/pymod/export_pdb_io.cc b/modules/io/pymod/export_pdb_io.cc index e431239e2e7d591d508f05d01464be380f468b49..c5abad5d434ddbdf1285c854cf4a427a8d0f34b9 100644 --- a/modules/io/pymod/export_pdb_io.cc +++ b/modules/io/pymod/export_pdb_io.cc @@ -36,13 +36,14 @@ void (PDBWriter::*write_b)(const mol::EntityView&)=&PDBWriter::Write; void export_pdb_io() { class_<IOProfile>("IOProfile", - init<String,bool,bool,bool,bool,bool,bool>((arg("dialect")="PDB", - arg("strict_hydrogens")=false, - arg("quack_mode")=false, - arg("fault_tolerant")=false, - arg("join_spread_atom_records")=false, - arg("no_hetatms")=false, - arg("calpha_only")=false))) + init<String,bool,bool,bool,bool,bool,bool,bool>((arg("dialect")="PDB", + arg("strict_hydrogens")=false, + arg("quack_mode")=false, + arg("fault_tolerant")=false, + arg("join_spread_atom_records")=false, + arg("no_hetatms")=false, + arg("calpha_only")=false, + arg("bond_feasibility_check")=true))) .def_readwrite("dialect", &IOProfile::dialect) .def_readwrite("fault_tolerant", &IOProfile::fault_tolerant) .def_readwrite("quack_mode", &IOProfile::quack_mode) @@ -50,6 +51,7 @@ void export_pdb_io() .def_readwrite("no_hetatms", &IOProfile::no_hetatms) .def_readwrite("calpha_only", &IOProfile::calpha_only) .def_readwrite("join_spread_atom_records", &IOProfile::join_spread_atom_records) + .def_readwrite("bond_feasibility_check", &IOProfile::bond_feasibility_check) .def("Copy", &IOProfile::Copy) .def(self_ns::str(self)) ; diff --git a/modules/io/src/mol/io_profile.hh b/modules/io/src/mol/io_profile.hh index 91fe27b7793350e10d29d922cf0ca501a1697da5..b4802583a838156ef5aac62048c158b50bff65d3 100644 --- a/modules/io/src/mol/io_profile.hh +++ b/modules/io/src/mol/io_profile.hh @@ -27,13 +27,13 @@ namespace ost { namespace io { struct DLLEXPORT IOProfile { public: - IOProfile(String d, bool sh, bool qm, bool ft, bool js, bool nh, bool co): + IOProfile(String d, bool sh, bool qm, bool ft, bool js, bool nh, bool co, bool bf): dialect(d), strict_hydrogens(sh), quack_mode(qm), fault_tolerant(ft), - join_spread_atom_records(js), no_hetatms(nh), calpha_only(co) + join_spread_atom_records(js), no_hetatms(nh), calpha_only(co), bond_feasibility_check(bf) { } IOProfile(): dialect("PDB"), strict_hydrogens(true), quack_mode(false), fault_tolerant(false), join_spread_atom_records(false), no_hetatms(false), - calpha_only(false) + calpha_only(false), bond_feasibility_check(true) { } virtual ~IOProfile() { } @@ -44,11 +44,12 @@ public: bool join_spread_atom_records; bool no_hetatms; bool calpha_only; + bool bond_feasibility_check; IOProfile Copy() { return IOProfile(dialect, strict_hydrogens, quack_mode, fault_tolerant, - join_spread_atom_records, no_hetatms, calpha_only); + join_spread_atom_records, no_hetatms, calpha_only, bond_feasibility_check); } virtual void PostImport(mol::EntityHandle ent) { } }; @@ -61,7 +62,8 @@ inline std::ostream& operator<<(std::ostream& stream, const IOProfile& p) << (p.join_spread_atom_records ? "True" : "False") << ", no_hetatms=" << (p.no_hetatms ? "True" : "False") << ", calpha_only=" << (p.calpha_only ? "True" : "False") << ", fault_tolerant=" - << (p.fault_tolerant ? "True" : "False") << ")"; + << (p.fault_tolerant ? "True" : "False") << ", bond_feasibility_check=" + << (p.bond_feasibility_check ? "True" : "False") << ")"; return stream; } diff --git a/modules/io/tests/CMakeLists.txt b/modules/io/tests/CMakeLists.txt index c4b3486d52aeb26db1865488f61e42c750f9c67c..98f075bd9785c1c051f642e3be91dd2e125cc62f 100644 --- a/modules/io/tests/CMakeLists.txt +++ b/modules/io/tests/CMakeLists.txt @@ -19,6 +19,9 @@ ost_unittest(MODULE io SOURCES "${OST_IO_UNIT_TESTS}" LINK ost_mol ost_seq) -add_executable(test_mae_standalone test_mae_standalone.cc) -target_link_libraries(test_mae_standalone ost_mol) -target_link_libraries(test_mae_standalone ost_io) +if(NOT ENABLE_STATIC) + add_executable(test_mae_standalone test_mae_standalone.cc) + target_link_libraries(test_mae_standalone ost_mol) + target_link_libraries(test_mae_standalone ost_io) + target_link_libraries(test_mae_standalone ${Boost_REGEX_LIBRARY}) +endif() diff --git a/modules/io/tests/test_io_pdb.cc b/modules/io/tests/test_io_pdb.cc index cb40a2c04a0a737da86f6c83ab2e8a014e1d378c..da9efce0dcd4974f738f28d48247d6e91b2ccc32 100644 --- a/modules/io/tests/test_io_pdb.cc +++ b/modules/io/tests/test_io_pdb.cc @@ -913,7 +913,7 @@ BOOST_AUTO_TEST_CASE(charmm_rname) { PDBWriter writer(String("testfiles/pdb/charmm_rname-out.pdb"), IOProfile("CHARMM", true, false, false, - false, false, false)); + false, false, false, true)); mol::EntityHandle ent=mol::CreateEntity(); mol::XCSEditor edi=ent.EditXCS(); @@ -933,7 +933,7 @@ BOOST_AUTO_TEST_CASE(charmm_longcname) { PDBWriter writer(String("testfiles/pdb/charmm_longcname-out.pdb"), IOProfile("CHARMM", true, false, false, - false, false, false)); + false, false, false, true)); mol::EntityHandle ent=mol::CreateEntity(); mol::XCSEditor edi=ent.EditXCS(); @@ -953,7 +953,7 @@ BOOST_AUTO_TEST_CASE(write_charmm_ter) { PDBWriter writer(String("testfiles/pdb/charmm_ter-out.pdb"), IOProfile("CHARMM", true, false, false, - false, false, false)); + false, false, false, true)); mol::EntityHandle ent=mol::CreateEntity(); mol::XCSEditor edi=ent.EditXCS(); diff --git a/modules/io/tests/test_io_pdb.py b/modules/io/tests/test_io_pdb.py index 873a91e155c3ea64b37623881f1ef8e4aeec177c..348fde1d929669405e612cb92d3a274ceb5636f1 100644 --- a/modules/io/tests/test_io_pdb.py +++ b/modules/io/tests/test_io_pdb.py @@ -11,8 +11,23 @@ class TestPDB(unittest.TestCase): ch = e.FindChain("A"); self.assertEquals(ch.GetIntProp("mol_id"), 1) +class TestPDB(unittest.TestCase): + def setUp(self): + pass + + def test_compnd_parser(self): + profiles=io.IOProfiles() + profiles['NO_FEAS_CHECK']=io.IOProfile(bond_feasibility_check=False) + + e=io.LoadPDB('testfiles/pdb/simple_defective.pdb', restrict_chains="A",profile='NO_FEAS_CHECK') + + res=e.FindResidue('A',3) + + self.assertTrue(mol.BondExists(res.FindAtom("CA"),res.FindAtom("CB"))) + if __name__== '__main__': from ost import testutils testutils.RunTests() + diff --git a/modules/io/tests/testfiles/pdb/simple_defective.pdb b/modules/io/tests/testfiles/pdb/simple_defective.pdb new file mode 100644 index 0000000000000000000000000000000000000000..725b68dbad3e82a101122f3f301f8a254e9a4aab --- /dev/null +++ b/modules/io/tests/testfiles/pdb/simple_defective.pdb @@ -0,0 +1,67 @@ +HELIX 1 1 ARG A 15 GLU A 28 1 14 +HELIX 2 2 ASN A 38 GLY A 50 1 13 +SHEET 1 A 7 ALA A 53 ALA A 57 0 +SHEET 2 A 7 ALA A 30 ASP A 36 1 N ILE A 34 O CYS A 54 +CRYST1 67.465 67.465 191.044 90.00 90.00 120.00 P 31 2 1 12 +ATOM 1 N MET A 1 21.609 35.384 56.705 1.00 41.48 N +ATOM 2 CA MET A 1 20.601 35.494 57.793 1.00 41.58 C +ATOM 3 C MET A 1 19.654 34.300 57.789 1.00 39.51 C +ATOM 4 O MET A 1 18.447 34.456 57.595 1.00 38.98 O +ATOM 5 CB MET A 1 19.789 36.783 57.639 1.00 45.90 C +ATOM 6 CG MET A 1 20.629 38.055 57.606 1.00 51.18 C +ATOM 7 SD MET A 1 21.638 38.325 59.084 1.00 55.83 S +ATOM 8 CE MET A 1 23.233 37.697 58.529 1.00 54.59 C +ATOM 9 N ARG A 2 20.202 33.112 58.011 1.00 36.39 N +ATOM 10 CA ARG A 2 19.396 31.903 58.033 1.00 34.35 C +ATOM 11 C ARG A 2 18.608 31.739 59.328 1.00 34.20 C +ATOM 12 O ARG A 2 17.651 30.965 59.381 1.00 32.64 O +ATOM 13 CB ARG A 2 20.284 30.681 57.801 1.00 33.48 C +ATOM 14 CG ARG A 2 20.665 30.488 56.342 1.00 31.69 C +ATOM 15 CD ARG A 2 21.557 29.281 56.154 1.00 29.91 C +ATOM 16 NE ARG A 2 22.931 29.557 56.551 1.00 28.95 N +ATOM 17 CZ ARG A 2 23.901 28.653 56.528 1.00 30.21 C +ATOM 18 NH1 ARG A 2 23.640 27.417 56.130 1.00 32.54 N +ATOM 19 NH2 ARG A 2 25.132 28.980 56.893 1.00 29.14 N +ATOM 20 N LEU A 3 19.003 32.473 60.366 1.00 35.07 N +ATOM 21 CA LEU A 3 18.330 32.402 61.664 1.00 34.70 C +ATOM 22 C LEU A 3 17.884 33.787 62.117 1.00 35.41 C +ATOM 23 O LEU A 3 17.853 34.091 63.308 1.00 35.91 O +ATOM 24 CB LEU A 3 19.269 31.793 102.710 1.00 31.47 C +ATOM 25 CG LEU A 3 19.695 30.340 62.501 1.00 29.10 C +ATOM 26 CD1 LEU A 3 20.585 29.897 63.648 1.00 26.97 C +ATOM 27 CD2 LEU A 3 18.461 29.459 62.420 1.00 27.95 C +ATOM 1881 N MET A 255 29.709 5.069 60.642 1.00 26.34 N +ATOM 1882 CA MET A 255 28.701 5.164 59.592 1.00 27.93 C +ATOM 1883 C MET A 255 27.302 4.748 60.005 1.00 27.64 C +ATOM 1884 O MET A 255 27.057 3.586 60.326 1.00 29.54 O +ATOM 1885 CB MET A 255 29.146 4.331 58.399 1.00 28.54 C +ATOM 1886 CG MET A 255 30.558 4.642 57.948 1.00 30.99 C +ATOM 1887 SD MET A 255 31.116 3.394 56.790 1.00 34.74 S +ATOM 1888 CE MET A 255 31.526 2.062 57.912 1.00 35.45 C +ATOM 1889 N SER A 256 26.376 5.699 59.965 1.00 26.90 N +ATOM 1890 CA SER A 256 24.998 5.430 60.347 1.00 28.27 C +ATOM 1891 C SER A 256 24.040 5.839 59.231 1.00 28.44 C +ATOM 1892 O SER A 256 24.543 6.294 58.186 1.00 28.92 O +ATOM 1893 CB SER A 256 24.664 6.188 61.642 1.00 28.64 C +ATOM 1894 OG SER A 256 25.569 5.836 62.681 1.00 28.28 O +ATOM 1895 OXT SER A 256 22.811 5.701 59.408 1.00 27.92 O +TER 1896 SER A 256 +ATOM 1897 N MET B 1 22.333 -31.975 81.215 1.00 44.89 N +ATOM 1898 CA MET B 1 23.104 -30.998 82.028 1.00 43.40 C +ATOM 1899 C MET B 1 24.121 -30.191 81.211 1.00 40.48 C +ATOM 1900 O MET B 1 25.266 -30.614 81.040 1.00 38.97 O +ATOM 1901 CB MET B 1 23.828 -31.727 83.164 1.00 48.82 C +ATOM 1902 CG MET B 1 23.086 -31.723 84.500 1.00 55.57 C +ATOM 1903 SD MET B 1 21.607 -32.746 84.539 1.00 63.93 S +ATOM 1904 CE MET B 1 21.996 -33.836 85.950 1.00 64.69 C +ATOM 3785 N SER B 256 17.566 -6.734 64.432 1.00 23.90 N +ATOM 3786 CA SER B 256 18.942 -6.278 64.584 1.00 23.46 C +ATOM 3787 C SER B 256 19.884 -7.335 64.032 1.00 23.50 C +ATOM 3788 O SER B 256 19.390 -8.439 63.723 1.00 25.09 O +ATOM 3789 CB SER B 256 19.253 -6.025 66.064 1.00 22.10 C +ATOM 3790 OG SER B 256 18.279 -5.173 66.635 1.00 18.70 O +ATOM 3791 OXT SER B 256 21.095 -7.051 63.923 1.00 22.97 O +TER 3792 SER B 256 +HETATM 3793 O HOH 1 14.659 7.548 75.525 1.00 6.25 O +HETATM 3794 O HOH 2 29.166 1.788 77.529 1.00 15.43 O +END diff --git a/modules/mol/alg/pymod/CMakeLists.txt b/modules/mol/alg/pymod/CMakeLists.txt index 5ac7e71dba294b13d510a84e1c01d5d9b08654f3..004c475efdf99c095aa693c133f7a2af51e84248 100644 --- a/modules/mol/alg/pymod/CMakeLists.txt +++ b/modules/mol/alg/pymod/CMakeLists.txt @@ -20,7 +20,7 @@ if (ENABLE_IMG) ) endif() - -pymod(NAME mol_alg OUTPUT_DIR ost/mol/alg CPP ${OST_MOL_ALG_PYMOD_SOURCES} - PY ${OST_MOL_ALG_PYMOD_MODULES}) - +if (NOT ENABLE_STATIC) + pymod(NAME mol_alg OUTPUT_DIR ost/mol/alg CPP ${OST_MOL_ALG_PYMOD_SOURCES} + PY ${OST_MOL_ALG_PYMOD_MODULES}) +endif() diff --git a/modules/mol/alg/pymod/wrap_mol_alg.cc b/modules/mol/alg/pymod/wrap_mol_alg.cc index 4e4ccc2f56d67b196549fb5648efd39b6b2430a8..20a78f90e3ede2920d09b7d1cadc70cfc1fe65df 100644 --- a/modules/mol/alg/pymod/wrap_mol_alg.cc +++ b/modules/mol/alg/pymod/wrap_mol_alg.cc @@ -18,6 +18,7 @@ //------------------------------------------------------------------------------ #include <boost/python.hpp> +#include <boost/python/suite/indexing/vector_indexing_suite.hpp> #include <ost/config.hh> #include <ost/mol/alg/local_dist_test.hh> #include <ost/mol/alg/superpose_frames.hh> @@ -35,12 +36,39 @@ void export_entity_to_density(); namespace { -Real (*ldt_a)(const mol::EntityView&, const mol::EntityView& ref, Real, Real, const String&)=&mol::alg::LocalDistTest; +Real (*ldt_a)(const mol::EntityView&, const mol::alg::GlobalDistanceList& glob_dist_list, Real, const String&)=&mol::alg::LocalDistTest; Real (*ldt_b)(const seq::AlignmentHandle&,Real, Real, int, int)=&mol::alg::LocalDistTest; -mol::EntityView (*fc_a)(const mol::EntityView&, Real,bool)=&mol::alg::FilterClashes; -mol::EntityView (*fc_b)(const mol::EntityHandle&, Real, bool)=&mol::alg::FilterClashes; +mol::EntityView (*fc_a)(const mol::EntityView&, const mol::alg::ClashingDistances&,bool)=&mol::alg::FilterClashes; +mol::EntityView (*fc_b)(const mol::EntityHandle&, const mol::alg::ClashingDistances&, bool)=&mol::alg::FilterClashes; +mol::EntityView (*csc_a)(const mol::EntityView&, const mol::alg::StereoChemicalParams&, const mol::alg::StereoChemicalParams&, Real, Real, bool)=&mol::alg::CheckStereoChemistry; +mol::EntityView (*csc_b)(const mol::EntityHandle&, const mol::alg::StereoChemicalParams&, const mol::alg::StereoChemicalParams&, Real, Real, bool)=&mol::alg::CheckStereoChemistry; mol::CoordGroupHandle (*superpose_frames1)(mol::CoordGroupHandle&, mol::EntityView&, int, int, int)=&mol::alg::SuperposeFrames; mol::CoordGroupHandle (*superpose_frames2)(mol::CoordGroupHandle&, mol::EntityView&, mol::EntityView&, int, int)=&mol::alg::SuperposeFrames; + +ost::mol::alg::StereoChemicalParams fill_stereochemical_params_wrapper (const String& header, const list& stereo_chemical_props_file) +{ + int stereo_chemical_props_file_length = boost::python::extract<int>(stereo_chemical_props_file.attr("__len__")()); + std::vector<String> stereo_chemical_props_file_vector; + + for (int i=0; i<stereo_chemical_props_file_length; i++) { + String extracted_string = boost::python::extract<String>(stereo_chemical_props_file[i]); + stereo_chemical_props_file_vector.push_back(extracted_string); + } + return ost::mol::alg::FillStereoChemicalParams(header,stereo_chemical_props_file_vector); +} + +ost::mol::alg::ClashingDistances fill_clashing_distances_wrapper (const list& stereo_chemical_props_file, Real min_default_distance, Real min_distance_tolerance) +{ + int stereo_chemical_props_file_length = boost::python::extract<int>(stereo_chemical_props_file.attr("__len__")()); + std::vector<String> stereo_chemical_props_file_vector(stereo_chemical_props_file_length); + + for (int i=0; i<stereo_chemical_props_file_length; i++) { + stereo_chemical_props_file_vector[i] = boost::python::extract<char const*>(stereo_chemical_props_file[i]); + } + + return ost::mol::alg::FillClashingDistances(stereo_chemical_props_file_vector,min_default_distance,min_distance_tolerance); +} + } @@ -56,12 +84,65 @@ BOOST_PYTHON_MODULE(_ost_mol_alg) def("LocalDistTest", ldt_a, (arg("local_ldt_property_string")="")); def("LocalDistTest", ldt_b, (arg("ref_index")=0, arg("mdl_index")=1)); - def("FilterClashes", fc_a, (arg("ent"), arg("tolerance")=0.1, arg("always_remove_bb")=false)); - def("FilterClashes", fc_b, (arg("ent"), arg("tolerance")=0.1, arg("always_remove_bb")=false)); + def("FilterClashes", fc_a, (arg("ent"), arg("clashing_distances"), arg("always_remove_bb")=false)); + def("FilterClashes", fc_b, (arg("ent"), arg("clashing_distances"), arg("always_remove_bb")=false)); + def("CheckStereoChemistry", csc_a, (arg("ent"), arg("bonds"), arg("angles"), arg("bond_tolerance"), arg("angle_tolerance"), arg("always_remove_bb")=false)); + def("CheckStereoChemistry", csc_b, (arg("ent"), arg("bonds"), arg("angles"), arg("bond_tolerance"), arg("angle_tolerance"), arg("always_remove_bb")=false)); + def("LDTHA",&mol::alg::LDTHA); + def("CreateDistanceList",&mol::alg::CreateDistanceList); + def("SuperposeFrames", superpose_frames1, (arg("source"), arg("sel")=ost::mol::EntityView(), arg("begin")=0, arg("end")=-1, arg("ref")=-1)); def("SuperposeFrames", superpose_frames2, (arg("source"), arg("sel")=ost::mol::EntityView(), arg("ref_view")=ost::mol::EntityView(),arg("begin")=0, arg("end")=-1)); + + + class_<mol::alg::ClashingDistances> ("ClashingDistances" ,init<Real,Real>()) + .def("SetClashingDistance",&mol::alg::ClashingDistances::SetClashingDistance) + .def("GetClashingDistance",&mol::alg::ClashingDistances::GetClashingDistance) + .def("GetMaxAdjustedDistance",&mol::alg::ClashingDistances::GetMaxAdjustedDistance) + .def("IsEmpty",&mol::alg::ClashingDistances::IsEmpty) + + .def("PrintAllDistances",&mol::alg::ClashingDistances::PrintAllDistances) + ; + + class_<mol::alg::StereoChemicalParams> ("StereoChemicalParams" ,init<>()) + .def("SetParam",&mol::alg::StereoChemicalParams::SetParam) + .def("GetParam",&mol::alg::StereoChemicalParams::GetParam) + .def("ContainsParam",&mol::alg::StereoChemicalParams::ContainsParam) + .def("IsEmpty",&mol::alg::StereoChemicalParams::IsEmpty) + + .def("PrintAllParameters",&mol::alg::StereoChemicalParams::PrintAllParameters) + + ; + + class_<mol::alg::UniqueAtomIdentifier> ("UniqueAtomIdentifier" ,init <const String&, const mol::ResNum&, const String&, const String&>()) + .def("GetChainName",&mol::alg::UniqueAtomIdentifier::GetChainName) + .def("GetResNum",&mol::alg::UniqueAtomIdentifier::GetResNum) + .def("GetResidueName",&mol::alg::UniqueAtomIdentifier::GetResidueName) + .def("GetAtomName",&mol::alg::UniqueAtomIdentifier::GetAtomName) + ; + + + class_<mol::alg::ReferenceDistance> ("ReferenceDistance", init <const mol::alg::UniqueAtomIdentifier&,const mol::alg::UniqueAtomIdentifier&, Real, Real>()) + .def("GetFirstAtom",&mol::alg::ReferenceDistance::GetFirstAtom) + .def("GetSecondAtom",&mol::alg::ReferenceDistance::GetSecondAtom) + .def("GetMinDistance",&mol::alg::ReferenceDistance::GetMinDistance) + .def("GetMaxDistance",&mol::alg::ReferenceDistance::GetMaxDistance) + ; + + class_<std::vector<mol::alg::ReferenceDistance> >("ResidueDistanceList") + .def(vector_indexing_suite<std::vector<mol::alg::ReferenceDistance > >()) + ; + + class_<std::vector<mol::alg::ResidueDistanceList> >("GlobalDistanceList") + .def(vector_indexing_suite<std::vector<mol::alg::ResidueDistanceList > >()) + ; + + def("FillClashingDistances",&fill_clashing_distances_wrapper); + def("FillStereoChemicalParams",&fill_stereochemical_params_wrapper); + def("IsStandardResidue",&mol::alg::IsStandardResidue); + } diff --git a/modules/mol/alg/src/CMakeLists.txt b/modules/mol/alg/src/CMakeLists.txt index 259f7f7dc860c7b8f787527cd44efc9321659a02..050d4822712f8789bfac97938e18c327334f7d92 100644 --- a/modules/mol/alg/src/CMakeLists.txt +++ b/modules/mol/alg/src/CMakeLists.txt @@ -40,8 +40,7 @@ if (ENABLE_IMG) endif() executable(NAME ldt SOURCES ldt.cc - DEPENDS_ON ost_io ost_mol_alg STATIC) -target_link_libraries(ldt ${BOOST_PROGRAM_OPTIONS}) + DEPENDS_ON ost_mol ost_mol_alg ost_io STATIC) module(NAME mol_alg SOURCES ${OST_MOL_ALG_SOURCES} HEADERS ${OST_MOL_ALG_HEADERS} @@ -54,3 +53,7 @@ copy_if_different("." "${STAGE_DIR}/share/openstructure" "ost_mol_alg") install(FILES "atom_scattering_properties.txt" DESTINATION "share/openstructure/") +copy_if_different("." "${STAGE_DIR}/share/openstructure" + "stereo_chemical_props.txt" "STEREO_CHEMICAL_PROPS" + "ost_mol_alg") +install(FILES "stereo_chemical_props.txt" DESTINATION "share/openstructure/") diff --git a/modules/mol/alg/src/filter_clashes.cc b/modules/mol/alg/src/filter_clashes.cc index 0fbca1696e5bc3ef1196f6d2a4863a1b0d72dcef..4b81ed10b8a81e92b120a2fc51367803a9ed9be9 100644 --- a/modules/mol/alg/src/filter_clashes.cc +++ b/modules/mol/alg/src/filter_clashes.cc @@ -18,66 +18,445 @@ //------------------------------------------------------------------------------ #include <ost/log.hh> #include <ost/mol/mol.hh> +#include <sstream> +#include <math.h> #include "filter_clashes.hh" +#include <ost/units.hh> + -namespace ost { namespace mol { namespace alg { namespace { -Real GetThreshold(const String& ele1, const String& ele2) { - if (ele1.length()!=1 || ele2.length()!=1) { - return 1.5; +String bond_string(const ost::mol::AtomView& atom1, const ost::mol::AtomHandle& atom2) { + String atom1_str = atom1.GetName(); + String atom2_str = atom2.GetName(); + String string1,string2; + if (atom1_str < atom2_str) { + string1 = atom1_str; + string2 = atom2_str; + } else { + string1 = atom2_str; + string2 = atom1_str; } - switch (ele1[0]) { - case 'C' : - switch (ele2[0]) { - case 'C' : return 2.10; - case 'N' : return 2.10; - case 'S' : return 2.45; - case 'O' : return 2.25; - default: return 1.5; - } - case 'N': - switch (ele2[0]) { - case 'C' : return 2.10; - case 'N' : return 2.05; - case 'S' : return 2.55; - case 'O' : return 2.10; - default: return 1.5; + std::stringstream stkey; + stkey << string1 << "-" << string2; + return stkey.str(); +} + +String angle_string(const ost::mol::AtomHandle& atom1, const ost::mol::AtomView& atom, const ost::mol::AtomHandle& atom2 ) { + String atom1_str = atom1.GetName(); + String atom2_str = atom2.GetName(); + String string1,string2; + if (atom1_str < atom2_str) { + string1 = atom1_str; + string2 = atom2_str; + } else { + string1 = atom2_str; + string2 = atom1_str; + } + std::stringstream stkey; + stkey << string1 << "-" << atom.GetName() << "-" << string2; + return stkey.str(); +} + + +} + + +namespace ost { namespace mol { namespace alg { + +void ClashingDistances::SetClashingDistance(const String& ele1,const String& ele2, Real min_distance, Real tolerance) +{ + std::stringstream stkey; + stkey << ele1 << "--" << ele2; + String key=stkey.str(); + min_distance_[key]=std::make_pair<Real,Real>(min_distance,tolerance); +} + +std::pair<Real,Real> ClashingDistances::GetClashingDistance(const String& ele1,const String& ele2) const +{ + std::stringstream stkey; + if (ele1<ele2) { + stkey << ele1 << "--" << ele2; + } else { + stkey << ele2 << "--" << ele1; + } + String key=stkey.str(); + std::map <String,std::pair<float,float> >::const_iterator find_ci= min_distance_.find(key); + if (find_ci == min_distance_.end()) { + return std::make_pair<Real,Real> (default_min_distance_,default_min_distance_tolerance_); + } + return find_ci->second; +} + +void ClashingDistances::PrintAllDistances() const +{ + for (std::map <String,std::pair<float,float> >::const_iterator index = min_distance_.begin();index != min_distance_.end();++index) { + std::cout << index->first << "\t" << index->second.first << "\t" << index->second.second << std::endl; + } +} + +Real ClashingDistances::GetMaxAdjustedDistance() const +{ + Real max_adjusted_distance=0; + for (std::map <String,std::pair<float,float> >::const_iterator index = min_distance_.begin();index != min_distance_.end();++index) { + Real distance = index->second.first; + Real tolerance = index->second.second; + if ((distance-tolerance) > max_adjusted_distance) { + max_adjusted_distance=distance-tolerance; + } + } + return max_adjusted_distance; +} + +bool ClashingDistances::IsEmpty() const +{ + if (min_distance_.size()==0) { + return true; + } + return false; +} + +void StereoChemicalParams::SetParam(const String& param, const String& residue, Real value, Real st_dev) +{ + std::pair<String,String> key = std::make_pair<String,String>(param,residue); + params_[key]=std::make_pair<Real,Real>(value,st_dev); +} + +std::pair<Real,Real> StereoChemicalParams::GetParam(const String& param,const String& residue) const +{ + std::pair<String,String> key = std::make_pair<String,String>(param,residue); + std::map<std::pair<String,String>,std::pair<float,float> >::const_iterator find_ci = params_.find(key); + if (find_ci == params_.end()) { + std::stringstream serr; + serr << "Entry " << param << " for residue " << residue << " not found in the parameter table"; + throw Error(serr.str()); + } + return find_ci->second; +} + +bool StereoChemicalParams::ContainsParam(const String& param,const String& residue) const +{ + std::pair<String,String> key = std::make_pair<String,String>(param,residue); + std::map<std::pair<String,String>,std::pair<float,float> >::const_iterator find_ci = params_.find(key); + if (find_ci == params_.end()) { + return false; + } + return true; +} + +void StereoChemicalParams::PrintAllParameters() const +{ + for (std::map <std::pair<String,String>,std::pair<float,float> >::const_iterator index = params_.begin();index != params_.end();++index) { + std::cout << index->first.first << "\t" << index->first.second << "\t" << index->second.first << "\t" << index->second.second << std::endl; + } +}; + +bool StereoChemicalParams::IsEmpty() const +{ + if (params_.size()==0) { + return true; + } + return false; +} + +StereoChemicalParams FillStereoChemicalParams(const String& header, std::vector<String>& stereo_chemical_props_file) +{ + StereoChemicalParams table; + bool found=false; + std::vector<String>::const_iterator line_iter=stereo_chemical_props_file.begin(); + while (line_iter!=stereo_chemical_props_file.end()) { + if ((*line_iter).length()!=0 && (*line_iter).length()!=1) { + StringRef line_string_ref(line_iter->data(),(*line_iter).length()); + std::vector<StringRef> line_str_vec = line_string_ref.split(); + if (line_str_vec[0].str()==header) { + found=true; + line_iter++; + while ((*line_iter)[0]!='-') { + if ((*line_iter)[0]!='#') { + StringRef second_line_string_ref(line_iter->data(),(*line_iter).length()); + std::vector<StringRef> second_line_str_vec = second_line_string_ref.split(); + if (second_line_str_vec.size()!=4) { + std::cout << "The number of elements in one of the lines is wrong" << std::endl; + return StereoChemicalParams(); + } + StringRef item = second_line_str_vec[0]; + String res = second_line_str_vec[1].str(); + std::pair<bool,float> parse_value = second_line_str_vec[2].to_float(); + std::pair<bool,float> parse_stddev = second_line_str_vec[3].to_float(); + Real value,stddev; + if (parse_value.first==true) { + value=static_cast<Real>(parse_value.second); + } else { + std::cout << "One of the values in the third column is not a number" << std::endl; + return StereoChemicalParams(); + }; + if (parse_stddev.first==true) { + stddev=static_cast<Real>(parse_stddev.second); + } else { + std::cout << "One of the values in the fourth column is not a number" << std::endl; + return StereoChemicalParams(); + }; + std::vector<StringRef> split_item = item.split('-'); + String rearranged_item; + if (split_item.size() == 2) { + String atom1 = split_item[0].str(); + String atom2 = split_item[1].str(); + if (atom2 < atom1) { + std::stringstream srearr; + srearr << atom2 << "-" << atom1; + rearranged_item=srearr.str(); + } else { + rearranged_item = item.str(); + } + } else if (split_item.size() == 3) { + String atom1 = split_item[0].str(); + String atom = split_item[1].str(); + String atom2 = split_item[2].str(); + if (atom2 < atom1) { + std::stringstream srearr; + srearr << atom2 << "-" << atom << "-" << atom1; + rearranged_item=srearr.str(); + } else { + rearranged_item = item.str(); + } + } else { + std::cout << "One of the strings describing the parameter has the wrong format" << std::endl; + return StereoChemicalParams(); + } + table.SetParam(rearranged_item,res,value,stddev); + line_iter++; + } + } + } + } + line_iter++; + } + if (found==false) { + std::cout << "Could not find the relevant section in the stereo-chemical parameter file" << std::endl; + return StereoChemicalParams(); + }; + return table; +}; + +ClashingDistances FillClashingDistances(std::vector<String>& stereo_chemical_props_file, Real min_default_distance, Real min_distance_tolerance) +{ + ClashingDistances table(min_default_distance,min_distance_tolerance); + bool found=false; + std::vector<String>::const_iterator line_iter=stereo_chemical_props_file.begin(); + while (line_iter!=stereo_chemical_props_file.end()) { + if ((*line_iter).length()!=0 && (*line_iter).length()!=1) { + StringRef line_string_ref(line_iter->data(),(*line_iter).length()); + std::vector<StringRef> line_str_vec = line_string_ref.split(); + if (line_str_vec[0].str()=="Non-bonded") { + found=true; + line_iter++; + while ((*line_iter)[0]!='-') { + if ((*line_iter)[0]!='#') { + StringRef second_line_string_ref(line_iter->data(),(*line_iter).length()); + std::vector<StringRef> second_line_str_vec = second_line_string_ref.split(); + if (second_line_str_vec.size()!=3) { + std::cout << "The number of elements in one of the lines is wrong" << std::endl; + return ClashingDistances(min_default_distance,min_distance_tolerance); + } + String item = second_line_str_vec[0].str(); + + std::pair<bool,float> parse_value = second_line_str_vec[1].to_float(); + std::pair<bool,float> parse_stddev = second_line_str_vec[2].to_float(); + Real value,stddev; + if (parse_value.first==true) { + value=static_cast<Real>(parse_value.second); + } else { + std::cout << "One of the distance values is not a number" << std::endl; + return ClashingDistances(min_default_distance,min_distance_tolerance); + }; + if (parse_stddev.first==true) { + stddev=static_cast<Real>(parse_stddev.second); + } else { + std::cout << "One of the tolerance values is not a number" << std::endl; + return ClashingDistances(min_default_distance,min_distance_tolerance); + } + StringRef itemsr(item.data(),item.length()); + std::vector<StringRef> eles = itemsr.split('-'); + if (itemsr.size() != 3) { + std::cout << "One of the strings describing the interacting atoms has the wrong format" << std::endl; + return ClashingDistances(min_default_distance,min_distance_tolerance); + } + String ele1=eles[0].str(); + String ele2=eles[1].str(); + if (ele2 < ele1) { + table.SetClashingDistance(ele2,ele1,value,stddev); + } else { + table.SetClashingDistance(ele1,ele2,value,stddev); + } + line_iter++; + } + } + } + } + line_iter++; + } + if (found==false) { + std::cout << "Could not find the relevant section in the stereo-chemical parameter file" << std::endl; + return ClashingDistances(min_default_distance,min_distance_tolerance); + } + return table; +} + + +EntityView CheckStereoChemistry(const EntityView& ent, const StereoChemicalParams& bond_table, const StereoChemicalParams& angle_table, Real bond_tolerance, Real angle_tolerance, bool always_remove_bb) +{ + LOG_INFO("Checking stereo-chemistry") + EntityView filtered=ent.CreateEmptyView(); + ResidueViewList residues=ent.GetResidueList(); + for (ResidueViewList::iterator i=residues.begin(), e=residues.end(); i!=e; ++i) { + bool remove_sc=false, remove_bb=false; + ResidueView res=*i; + if (res.GetOneLetterCode()=='?') { + filtered.AddResidue(res, ViewAddFlag::INCLUDE_ATOMS); + continue; + } + String residue_str = res.GetName(); + const AtomViewList& atoms=res.GetAtomList(); + for (AtomViewList::const_iterator j=atoms.begin(), e2=atoms.end(); j!=e2; ++j) { + AtomView atom=*j; + String ele1=atom.GetElement(); + if (ele1=="H" || ele1=="D") { + continue; } - case 'O': - switch (ele2[0]) { - case 'C' : return 2.25; - case 'N' : return 2.10; - case 'S' : return 2.45; - case 'O' : return 2.05; - default: return 1.5; + BondHandleList bonds = atom.GetBondList(); + + for (BondHandeList::const_iterator bi = bonds.begin();bi!=bonds.end();++bi) { + BondHandle bond = *bi; + AtomHandle other_atom = bond.GetOther(atom.GetHandle()); + if (other_atom.GetResidue()!=res.GetHandle()) { + continue; + } + String ele2 = other_atom.GetElement(); + if (ele2=="H" || ele2=="D") { + continue; + } + if (other_atom.GetHashCode() > atom.GetHandle().GetHashCode()) { + Real blength = bond.GetLength(); + String bond_str = bond_string(atom,other_atom); + std::pair<Real,Real> length_stddev = bond_table.GetParam(bond_str,residue_str); + Real ref_length = length_stddev.first; + Real ref_stddev = length_stddev.second; + Real min_length = ref_length - bond_tolerance*ref_stddev; + Real max_length = ref_length + bond_tolerance*ref_stddev; + Real zscore = (blength - ref_length)/ref_stddev; + if (blength < min_length || blength > max_length) { + LOG_INFO("BOND:" << " " << res.GetChain() << " " << res.GetName() << " " << res.GetNumber() << " " << bond_str << " " << min_length << " " << max_length << " " << blength << " " << zscore << " " << "FAIL") + remove_sc=true; + if (always_remove_bb==true) { + remove_bb=true; + continue; + } + String name=atom.GetName(); + if (name=="CA" || name=="N" || name=="O" || name=="C") { + remove_bb=true; + } + } else { + LOG_VERBOSE("BOND:" << " " << res.GetChain() << " " << res.GetName() << " " << res.GetNumber() << " " << bond_str << " " << min_length << " " << max_length << " " << blength << " " << zscore << " " << "PASS") + } + } } - case 'S': - switch (ele2[0]) { - case 'C' : return 2.45; - case 'N' : return 2.55; - case 'S' : return 1.80; - case 'O' : return 2.45; - default: return 1.5; + + for (BondHandeList::const_iterator bond_iter1=bonds.begin(); bond_iter1!=bonds.end(); ++bond_iter1) { + BondHandle bond1=*bond_iter1; + AtomHandle atom1= bond1.GetOther(atom.GetHandle()); + String ele_atom1=atom1.GetElement(); + if (ele_atom1=="H" || ele_atom1=="D") { + continue; + } + if (atom1.GetResidue()!=res.GetHandle()) { + continue; + } + for (BondHandeList::const_iterator bond_iter2=bonds.begin(); bond_iter2!=bonds.end(); ++bond_iter2) { + BondHandle bond2=*bond_iter2; + AtomHandle atom2 = bond2.GetOther(atom.GetHandle()); + String ele_atom2=atom2.GetElement(); + if (ele_atom2=="H" || ele_atom2=="D") { + continue; + } + if (atom2.GetResidue()!=res.GetHandle()) { + continue; + } + if (atom1.GetHashCode() > atom2.GetHashCode()) { + Real awidth; + if (atom1.GetName()<atom2.GetName()) { + awidth = ent.GetAngle(atom1,atom.GetHandle(),atom2); + } else { + awidth = ent.GetAngle(atom2,atom.GetHandle(),atom1); + } + awidth/=(ost::Units::deg); + String angle_str = angle_string(atom1,atom,atom2); + std::pair<Real,Real> width_stddev = angle_table.GetParam(angle_str,residue_str); + Real ref_width = width_stddev.first; + Real ref_stddev = width_stddev.second; + Real min_width = ref_width - angle_tolerance*ref_stddev; + Real max_width = ref_width + angle_tolerance*ref_stddev; + Real zscore = (awidth - ref_width)/ref_stddev; + if (awidth < min_width || awidth > max_width) { + LOG_INFO("ANGLE:" << " " << res.GetChain() << " " << res.GetName() << " " << res.GetNumber() << " " << angle_str << " " << min_width << " " << max_width << " " << awidth << " " << zscore << " " << "FAIL") + remove_sc=true; + if (always_remove_bb==true) { + remove_bb=true; + continue; + } + String name=atom.GetName(); + if (name=="CA" || name=="N" || name=="O" || name=="C") { + remove_bb=true; + } + } else { + LOG_VERBOSE("ANGLE:" << " " << res.GetChain() << " " << res.GetName() << " " << res.GetNumber() << " " << angle_str << " " << min_width << " " << max_width << " " << awidth << " " << zscore << " " << "PASS") + } + } + } + } + } + + if (remove_bb) { + LOG_INFO("ACTION: removing whole residue " << res); + continue; + } + if (remove_sc) { + LOG_INFO("ACTION: removing sidechain of residue " << res); + for (AtomViewList::const_iterator + j=atoms.begin(), e2=atoms.end(); j!=e2; ++j) { + AtomView atom=*j; + String name=atom.GetName(); + if (name=="CA" || name=="N" || name=="O" || name=="C") { + filtered.AddAtom(atom); + } } - default: - return 1.5; + continue; + } + filtered.AddResidue(res, ViewAddFlag::INCLUDE_ATOMS); } + return filtered; } +EntityView CheckStereoChemistry(const EntityHandle& ent, const StereoChemicalParams& bond_table, const StereoChemicalParams& angle_table, Real bond_tolerance, Real angle_tolerance, bool always_remove_bb) +{ + return CheckStereoChemistry(ent.CreateFullView(), bond_table, angle_table, bond_tolerance, angle_tolerance, always_remove_bb); } -EntityView FilterClashes(const EntityView& ent, Real tolerance, - bool always_remove_bb) + +EntityView FilterClashes(const EntityView& ent, const ClashingDistances& min_distances, bool always_remove_bb) { + LOG_INFO("Filtering non-bonded clashes") EntityView filtered=ent.CreateEmptyView(); ResidueViewList residues=ent.GetResidueList(); for (ResidueViewList::iterator i=residues.begin(), e=residues.end(); i!=e; ++i) { bool remove_sc=false, remove_bb=false; ResidueView res=*i; + if (res.GetOneLetterCode()=='?') { + filtered.AddResidue(res, ViewAddFlag::INCLUDE_ATOMS); + continue; + } const AtomViewList& atoms=res.GetAtomList(); for (AtomViewList::const_iterator j=atoms.begin(), e2=atoms.end(); j!=e2; ++j) { @@ -86,7 +465,7 @@ EntityView FilterClashes(const EntityView& ent, Real tolerance, if (ele1=="H" || ele1=="D") { continue; } - AtomViewList within=ent.FindWithin(atom.GetPos(), 2.5-tolerance); + AtomViewList within=ent.FindWithin(atom.GetPos(),min_distances.GetMaxAdjustedDistance()); for (AtomViewList::iterator k=within.begin(), e3=within.end(); k!=e3; ++k) { AtomView atom2=*k; @@ -97,15 +476,22 @@ EntityView FilterClashes(const EntityView& ent, Real tolerance, if (ele2=="H" || ele2=="D") { continue; } + // In theory, this should also trigger for disulfide bonds, but // since we don't detect disulfides correctly, we can't count on that // and we instead allow S-S distances down to 1.8. if (atom.GetHandle().FindBondToAtom(atom2.GetHandle()).IsValid()) { continue; } + Real d=geom::Length2(atom.GetPos()-atom2.GetPos()); - Real threshold=GetThreshold(ele1, ele2)-tolerance; + std::pair <Real,Real> distance_tolerance=min_distances.GetClashingDistance(ele1, ele2); + Real distance=distance_tolerance.first; + Real tolerance=distance_tolerance.second; + Real threshold=distance-tolerance; if (d<threshold*threshold) { + LOG_INFO(atom.GetResidue().GetChain() << " " << atom.GetResidue().GetName() << " " << atom.GetResidue().GetNumber() << " " << atom.GetName() << " " << atom2.GetResidue().GetChain() << " " << atom2.GetResidue().GetName() << " " << atom2.GetResidue().GetNumber() << " " << atom2.GetName() << " " << threshold << " " << sqrt(d) << " " << sqrt(d)-threshold << " " << "FAIL") + remove_sc=true; if (always_remove_bb==true) { remove_bb=true; @@ -115,15 +501,18 @@ EntityView FilterClashes(const EntityView& ent, Real tolerance, if (name=="CA" || name=="N" || name=="O" || name=="C") { remove_bb=true; } - } + } else { + LOG_VERBOSE("CLASH:" << " " << atom.GetResidue().GetChain() << " " << atom.GetResidue().GetName() << " " << atom.GetResidue().GetNumber() << " " << atom.GetName() << " " << atom2.GetResidue().GetChain() << " " << atom2.GetResidue().GetNumber() << " " << atom2.GetResidue().GetName() << " " << atom2.GetName() << " " << threshold << " " << sqrt(d) << " " << sqrt(d)-threshold << " " << "PASS") + } } } + if (remove_bb) { - LOG_VERBOSE("removing whole residue " << res); + LOG_VERBOSE("ACTION: removing whole residue " << res); continue; } if (remove_sc) { - LOG_VERBOSE("removing sidechain of residue " << res); + LOG_VERBOSE("ACTION: removing sidechain of residue " << res); for (AtomViewList::const_iterator j=atoms.begin(), e2=atoms.end(); j!=e2; ++j) { AtomView atom=*j; @@ -140,12 +529,11 @@ EntityView FilterClashes(const EntityView& ent, Real tolerance, } -EntityView FilterClashes(const EntityHandle& ent, Real tolerance, - bool always_remove_bb) +EntityView FilterClashes(const EntityHandle& ent, + const ClashingDistances& min_distances, bool always_remove_bb) { - return FilterClashes(ent.CreateFullView(), tolerance, always_remove_bb); + return FilterClashes(ent.CreateFullView(), min_distances, always_remove_bb); } }}} - diff --git a/modules/mol/alg/src/filter_clashes.hh b/modules/mol/alg/src/filter_clashes.hh index 052e1ce5f65efd86396de967b9ad635afee3a715..5d64fc23060cdf879c434ccf52c950444b2087d0 100644 --- a/modules/mol/alg/src/filter_clashes.hh +++ b/modules/mol/alg/src/filter_clashes.hh @@ -24,14 +24,70 @@ namespace ost { namespace mol { namespace alg { +class ClashingDistances +{ +public: + ClashingDistances(Real default_dist, Real tolerance): default_min_distance_(default_dist), default_min_distance_tolerance_(tolerance), valid_flag_(true) {} + void SetClashingDistance(const String& ele1,const String& ele2, Real min_distance, Real tolerance); + std::pair<Real,Real> GetClashingDistance(const String& ele1,const String& ele2) const; + Real GetMaxAdjustedDistance() const; + bool IsEmpty() const; + + //DEBUG + void PrintAllDistances() const; + +private: + + std::map <String,std::pair<float,float> > min_distance_; + Real default_min_distance_; + Real default_min_distance_tolerance_; + bool valid_flag_; + +}; + +class StereoChemicalParams +{ + +public: + void SetParam(const String& param, const String& residue, Real value, Real st_dev); + std::pair<Real,Real> GetParam(const String& element,const String& residue) const; + bool ContainsParam(const String& param,const String& residue) const; + bool IsEmpty() const; + + //DEBUG + void PrintAllParameters() const; + +private: + + std::map<std::pair<String,String>,std::pair<float,float> > params_; + +}; + +ClashingDistances DLLEXPORT_OST_MOL_ALG FillClashingDistances(std::vector<String>& stereo_chemical_props_file, Real min_default_distance, Real min_distance_tolerance); +StereoChemicalParams DLLEXPORT_OST_MOL_ALG FillStereoChemicalParams(const String& header, std::vector<String>& stereo_chemical_props_file); + EntityView DLLEXPORT_OST_MOL_ALG FilterClashes(const EntityView& ent, - Real tolerance=0.1, - bool always_remove_bb=false); + const ClashingDistances& min_distances, bool always_remove_bb=false); EntityView DLLEXPORT_OST_MOL_ALG FilterClashes(const EntityHandle& ent, - Real tolerance=0.1, - bool always_remove_bb=false); + const ClashingDistances& min_distances, bool always_remove_bb=false); + +EntityView DLLEXPORT_OST_MOL_ALG CheckStereoChemistry(const EntityView& ent, + const StereoChemicalParams& bond_table, + const StereoChemicalParams& angle_table, + Real bond_tolerance, + Real angle_tolerance, + bool always_remove_bb=false); + +EntityView DLLEXPORT_OST_MOL_ALG CheckStereoChemistry(const EntityHandle& ent, + const StereoChemicalParams& bond_table, + const StereoChemicalParams& angle_table, + Real bond_tolerance, + Real angle_tolerance, + bool always_remove_bb=false); + + }}} diff --git a/modules/mol/alg/src/ldt.cc b/modules/mol/alg/src/ldt.cc index ff566e489af453c26fdc29ffacbe5c11464730eb..5dbab61cfceb3d77794dbf465447980cdfa32e54 100644 --- a/modules/mol/alg/src/ldt.cc +++ b/modules/mol/alg/src/ldt.cc @@ -13,22 +13,32 @@ // details. // // You should have received a copy of the GNU Lesser General Public License -// along with this library; if not, write to the Free Software Foundation, Inc., +// along with this library; if not, write to the Free Software Foundation, Inc., // 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA //------------------------------------------------------------------------------ #if defined (_MSC_VER) #define BOOST_ALL_DYN_LINK 1 #endif #include <boost/program_options.hpp> +#include <boost/filesystem/fstream.hpp> +#include <boost/filesystem/convenience.hpp> #include <ost/mol/alg/local_dist_test.hh> #include <ost/mol/alg/filter_clashes.hh> #include <ost/io/mol/pdb_reader.hh> #include <ost/io/io_exception.hh> #include <ost/conop/conop.hh> +#include <ost/conop/amino_acids.hh> +#include <ost/mol/iterator.hh> +#include <ost/platform.hh> +#include <ost/log.hh> + +#include <ost/conop/rule_based_builder.hh> +#include <ost/dyn_cast.hh> using namespace ost; using namespace ost::io; using namespace ost::mol; +using namespace ost::mol::alg; namespace po=boost::program_options; EntityHandle load(const String& file, const IOProfile& profile) @@ -42,7 +52,7 @@ EntityHandle load(const String& file, const IOProfile& profile) conop_inst.ConnectAll(conop_inst.GetBuilder(), ent); return ent; } - std::cerr << "ERROR: '" << file << "' does not contain any ATOM records. " + std::cerr << "ERROR: '" << file << "' does not contain any ATOM records. " << "Are you sure this is a PDB file?" << std::endl; return EntityHandle(); } catch (io::IOException& e) { @@ -54,25 +64,70 @@ EntityHandle load(const String& file, const IOProfile& profile) void usage() { std::cerr << "usage: ldt [options] <mod1> [mod1 [mod2]] <ref>" << std::endl; - std::cerr << " -s selection performed on ref" << std::endl; - std::cerr << " -c use Calphas only" << std::endl; - std::cerr << " -f filter clashes (not implemented yet)" << std::endl; - std::cerr << " -t fault tolerant parsing" << std::endl; + std::cerr << " -s selection performed on ref" << std::endl; + std::cerr << " -c use Calphas only" << std::endl; + std::cerr << " -f perform structural checks and filter input data" << std::endl; + std::cerr << " -t fault tolerant parsing" << std::endl; + std::cerr << " -p <file> use specified parmeter file. Mandatory" << std::endl; + std::cerr << " -v <level> verbosity level (0=results only,1=problems reported, 2=full report)" << std::endl; + std::cerr << " -b <value> tolerance in stddevs for bonds" << std::endl; + std::cerr << " -a <value> tolerance in stddevs for angles" << std::endl; + std::cerr << " -m <value> clashing distance for unknwon atom types" << std::endl; + std::cerr << " -r <value> distance inclusion radius" << std::endl; + std::cerr << " -e print version" << std::endl; +} + +std::pair<int,int> compute_coverage (const EntityView& v,const GlobalDistanceList& glob_dist_list) +{ + int second=0; + int first=0; + if (v.GetResidueList().size()==0) { + return std::make_pair<int,int>(0,1); + } + ChainView vchain=v.GetChainList()[0]; + for (std::vector<ResidueDistanceList>::const_iterator i=glob_dist_list.begin();i!=glob_dist_list.end();++i) + { + ResNum rnum = (*i)[0].GetFirstAtom().GetResNum(); + String rname = (*i)[0].GetFirstAtom().GetResidueName(); + if (IsStandardResidue(rname)) { + second++; + if (vchain.FindResidue(rnum)) { + first++; + } + } + } + return std::make_pair<int,int>(first,second); } int main (int argc, char **argv) { + String version = "Beta - 2012-01-17"; + Real min_default_distance = 1.5; + Real min_distance_tolerance = 0.0; + Real bond_tolerance = 8.0; + Real angle_tolerance = 8.0; + Real radius=8.0; + IOProfile profile; + profile.bond_feasibility_check=false; // parse options String sel; - bool filter_clashes=false; + bool structural_checks=false; po::options_description desc("Options"); desc.add_options() ("calpha,c", "consider only calpha atoms") - ("sel,s", po::value<String>(&sel)->default_value(""), "selection for reference") + ("sel,s", po::value<String>(&sel)->default_value(""), "selection performed on reference structure") ("tolerant,t", "fault tolerant mode") - ("filter-clashes,f", "filter clashes") - ("files", po::value< std::vector<String> >(), "input file") + ("structural-checks,f", "perform stereo-chemical and clash checks") + ("version,e", "version") + ("parameter-file,p", po::value<String>(), "stereo-chemical parameter file") + ("verbosity,v", po::value<int>(), "verbosity level") + ("bond_tolerance,b", po::value<Real>(), "tolerance in stddev for bonds") + ("angle_tolerance,a", po::value<Real>(), "tolerance in stddev for angles") + ("default_clash,m", po::value<Real>(), "clashing distance for unknown atom types") + ("inclusion_radius,r", po::value<Real>(), "distance inclusion radius") + ("files", po::value< std::vector<String> >(), "input file(s)") + ("reference",po::value<String>(),"reference(s)") ; po::positional_options_description p; p.add("files", -1); @@ -81,48 +136,183 @@ int main (int argc, char **argv) options(desc).positional(p).run(), vm); po::notify(vm); + if (vm.count("version")) { + std::cout << "Version: " << version << std::endl; + exit(0); + } + std::vector<String> files; + if (vm.count("files")) { + files=vm["files"].as<std::vector<String> >(); + } else { + usage(); + exit(-1); + } if (vm.count("calpha")) { profile.calpha_only=true; } - if (vm.count("filter-clashes")) { - filter_clashes=true; + if (vm.count("structural-checks")) { + structural_checks=true; } if (vm.count("tolerant")) { profile.fault_tolerant=true; } - std::vector<String> files; - if (vm.count("files")) { - files=vm["files"].as<std::vector<String> >(); - } else { - usage(); + String parameter_filename; + if (vm.count("parameter-file")) { + parameter_filename=vm["parameter-file"].as<String>(); + } else if (structural_checks==true) { + std::cout << "Please specify a stereo-chemical parameter file" << std::endl; exit(-1); } + int verbosity_level=0; + if (vm.count("verbosity")) { + verbosity_level=vm["verbosity"].as<int>(); + if (verbosity_level==0) { + Logger::Instance().PushVerbosityLevel(0); + } else if (verbosity_level==1) { + Logger::Instance().PushVerbosityLevel(3); + } else if (verbosity_level==2) { + Logger::Instance().PushVerbosityLevel(4); + } else { + std::cout << "Verbosity level " << verbosity_level << " is not available" << std::endl; + exit(-1); + } + } + + if (verbosity_level>0) { + LOG_INFO("LDT INFO FORMAT: Chain1 Residue1 ResNum1 Atom1 Chain2 Residue2 ResNum2 Atom2 ModelDist TargetDist Difference Tolerance Status"); + } + + if (vm.count("bond_tolerance")) { + bond_tolerance=vm["bond_tolerance"].as<Real>(); + } + if (vm.count("angle_tolerance")) { + angle_tolerance=vm["angle_tolerance"].as<Real>(); + } + if (vm.count("default_clash")) { + min_default_distance=vm["default_clash"].as<Real>(); + } + if (vm.count("inclusion_radius")) { + radius=vm["inclusion_radius"].as<Real>(); + } String ref_file=files.back(); EntityHandle ref=load(ref_file, profile); if (!ref) { - return -1; + exit(-1); } files.pop_back(); EntityView ref_view=ref.Select(sel); + GlobalDistanceList glob_dist_list = CreateDistanceList(ref_view,radius); + std::cout << "Verbosity level: " << verbosity_level << std::endl; + if (structural_checks) { + std::cout << "Stereo-chemical and steric clash checks: On " << std::endl; + } else { + std::cout << "Stereo-chemical and steric clash checks: Off " << std::endl; + } + std::cout << "Inclusion Radius: " << radius << std::endl; + if (structural_checks) { + std::cout << "Parameter filename: " << parameter_filename << std::endl; + std::cout << "Tolerance in stddevs for bonds: " << bond_tolerance << std::endl; + std::cout << "Tolerance in stddevs for angles: " << angle_tolerance << std::endl; + std::cout << "Clashing distance for unknown atom types: " << min_default_distance << std::endl; + LOG_INFO("Log entries format:"); + LOG_INFO("BOND INFO FORMAT: Chain Residue ResNum Bond Min Max Observed Z-score Status"); + LOG_INFO("ANGLE INFO FORMAT: Chain Residue ResNum Angle Min Max Observed Z-score Status"); + LOG_INFO("CLASH INFO FORMAT: Chain1 Residue1 ResNum1 Atom1 Chain2 Residue2 ResNum2 Atom2 Observed Difference Status"); + LOG_INFO("LDT INFO FORMAT: Chain1 Residue1 ResNum1 Atom1 Chain2 Residue2 ResNum2 Atom2 ModelDist TargetDist Difference Tolerance Status"); + } for (size_t i=0; i<files.size(); ++i) { EntityHandle model=load(files[i], profile); if (!model) { if (!profile.fault_tolerant) { - return -1; + exit(-1); } continue; } EntityView v=model.CreateFullView(); - if (filter_clashes) { - v=alg::FilterClashes(v); + + // The code in this following block is only used to make CASP9 models load correctly and normally commented out + EntityView model2=model.Select("aname!=CEN,NV,OT1,OT,CAY,CY,OXT,1OCT,NT,OT2,2OCT,OVL1,OC1,O1,OC2,O2,OVU1"); + EntityView v1=model2.Select("not (rname==GLY and aname==CB)"); + boost::filesystem::path pathstring(files[i]); + + #if BOOST_FILESYSTEM_VERSION==3 + String filestring=pathstring.filename().string(); + #else + String filestring=pathstring.file_string(); + #endif + + if (filestring.substr(5,5)=="TS257" || filestring.substr(5,5)=="TS458" ) { + for (AtomHandleIter ait=v1.GetHandle().AtomsBegin();ait!=v1.GetHandle().AtomsEnd();++ait){ + AtomHandle aitv = *ait; + String atomname=aitv.GetName(); + String firstletter=atomname.substr(0,1); + aitv.SetElement(firstletter); + } + } + std::cout << "File: " << files[i] << std::endl; + std::pair<int,int> cov = compute_coverage(v,glob_dist_list); + std::cout << "Coverage: " << (float(cov.first)/float(cov.second)) << " (" << cov.first << " out of " << cov.second << " residues)" << std::endl; + + if (structural_checks) { + boost::filesystem::path loc(parameter_filename); + boost::filesystem::ifstream infile(loc); + if (!infile) { + std::cout << "Could not find " << parameter_filename << std::endl; + exit(-1); + } + std::vector<String> stereo_chemical_props; + String line; + while (std::getline(infile, line)) + { + std::stringstream line_stream(line); + stereo_chemical_props.push_back(line); + } + StereoChemicalParams bond_table = FillStereoChemicalParams("Bond",stereo_chemical_props); + if (bond_table.IsEmpty()) { + std::cout << "Error reading the Bond section of the stereo-chemical parameter file." << std::endl; + exit(-1); + } + StereoChemicalParams angle_table = FillStereoChemicalParams("Angle",stereo_chemical_props); + if (angle_table.IsEmpty()) { + std::cout << "Error reading the Angles section of the stereo-chemical parameter file." << std::endl; + exit(-1); + } + + ClashingDistances nonbonded_table = FillClashingDistances(stereo_chemical_props,min_default_distance,min_distance_tolerance); + + if (nonbonded_table.IsEmpty()) { + std::cout << "Error reading the Clashing section of the stereo-chemical parameter file." << std::endl; + exit(-1); + } + EntityView v=alg::CheckStereoChemistry(v,bond_table,angle_table,bond_tolerance,angle_tolerance); + cov = compute_coverage(v,glob_dist_list); + std::cout << "Coverage after stereo-chemical checks: " << (float(cov.first)/float(cov.second)) << " (" << cov.first << " out of " << cov.second << " residues)" << std::endl; + v=alg::FilterClashes(v,nonbonded_table); + cov = compute_coverage(v,glob_dist_list); + std::cout << "Coverage after clashing checks: " << (float(cov.first)/float(cov.second)) << " (" << cov.first << " out of " << cov.second << " residues)" << std::endl; } - float cutoffs[]={0.5,1,2,4}; - float ldt=0.0; - for (int n=0; n<4; ++n) { - ldt+=alg::LocalDistTest(v, ref_view, cutoffs[n], 8.0); + if (cov.first==0) { + std::cout << "Global LDT score: 0.0" << std::endl; + return 0; } - ldt/=4.0; - std::cout << files[i] << " " << ldt << std::endl; + Real ldt=LDTHA(v, glob_dist_list); + + std::cout << "Global LDT score: " << ldt << std::endl; + std::cout << "Local LDT Score:" << std::endl; + std::cout << "Chain\tResName\tResNum\tScore" << std::endl; + String labels[]={"localldt0.5","localldt1","localldt2","ldtlocal4"}; + for (ResidueViewIter rit=v.ResiduesBegin();rit!=v.ResiduesEnd();++rit){ + ResidueView ritv = *rit; + Real ldt_local_sum = 0; + if (ritv.HasProp("localldt0.5")) { + for (int n=0; n<4; ++n) { + ldt_local_sum+=ritv.GetFloatProp(labels[n]); + } + ldt_local_sum/=4.0; + std::cout << ritv.GetChain() << "\t" << ritv.GetName() << "\t" << ritv.GetNumber() << '\t' << ldt_local_sum << std::endl; + } + } + std::cout << std::endl; } return 0; -} \ No newline at end of file +} diff --git a/modules/mol/alg/src/local_dist_test.cc b/modules/mol/alg/src/local_dist_test.cc index 5441f681b2349797eb6b0a38266d63285dbe7616..83d842226ac03a401796a111dcdf3334365f8a61 100644 --- a/modules/mol/alg/src/local_dist_test.cc +++ b/modules/mol/alg/src/local_dist_test.cc @@ -1,6 +1,7 @@ #include <ost/log.hh> #include <ost/mol/mol.hh> #include "local_dist_test.hh" +#include <boost/concept_check.hpp> namespace ost { namespace mol { namespace alg { @@ -37,7 +38,8 @@ bool swappable(const String& rname, const String& aname) if (rname=="ASP") { return (aname=="OD1" || aname=="OD2"); } - if (rname=="VAL") { + if (rname=="VAL") { + return (aname=="CG1" || aname=="CG2"); } if (rname=="TYR" || rname=="PHE") { @@ -49,73 +51,103 @@ bool swappable(const String& rname, const String& aname) return false; } -std::pair<Real, Real> calc_overlap1(ResidueView ref_res, - EntityView ref, +std::pair<bool,Real> within_tolerance(Real mdl_dist, const ReferenceDistance& ref_dist, Real tol) +{ + Real min = ref_dist.GetMaxDistance(); + Real max = ref_dist.GetMaxDistance(); + bool within_tol = false; + Real difference = 0; + if (mdl_dist>=min && mdl_dist <=max) { + within_tol=true; + } else if (mdl_dist < min && std::abs(min-mdl_dist) < tol) { + within_tol = true; + } else if (mdl_dist > max && std::abs(mdl_dist-max) < tol) { + within_tol = true; + } + if (within_tol == false) { + if (mdl_dist > max) { + difference = mdl_dist-(max+tol); + } else { + difference = mdl_dist-(min-tol); + } + } + return std::make_pair<bool,Real>(within_tol,difference); +} + + +std::pair<Real, Real> calc_overlap1(const ResidueDistanceList& res_distance_list, ChainView mdl_chain, - Real tol, Real max_dist, bool only_fixed, - bool swap,std::vector<std::pair<Real, Real> >& overlap_list ) + Real tol, bool only_fixed, + bool swap,std::vector<std::pair<Real, Real> >& overlap_list, bool log ) { std::pair<Real, Real> overlap(0.0, 0.0); - AtomViewList ref_atoms=ref_res.GetAtomList(); - ResidueView mdl_res=mdl_chain.FindResidue(ref_res.GetNumber()); - AtomViewList within; - if (max_dist<0){ - within=ref.GetAtomList(); - } - for (AtomViewList::iterator ai=ref_atoms.begin(), - ae=ref_atoms.end(); ai!=ae; ++ai) { - if (ai->GetElement()=="H") { continue; } - String name=swap ? swapped_name(ai->GetName()) : ai->GetName(); + ResidueView mdl_res=mdl_chain.FindResidue(res_distance_list[0].GetFirstAtom().GetResNum()); + for (ResidueDistanceList::const_iterator ai=res_distance_list.begin(), + ae=res_distance_list.end(); ai!=ae; ++ai) { + UniqueAtomIdentifier first_atom=ai->GetFirstAtom(); + UniqueAtomIdentifier second_atom=ai->GetSecondAtom(); + String name=swap ? swapped_name(first_atom.GetAtomName()) : first_atom.GetAtomName(); AtomView av1=mdl_res ? mdl_res.FindAtom(name) : AtomView(); - if (max_dist>=0){ - within=ref.FindWithin(ai->GetPos(), max_dist); - } - for (AtomViewList::iterator aj=within.begin(), - ae2=within.end(); aj!=ae2; ++aj) { - if (aj->GetElement()=="H") { continue; } - if (only_fixed) { - if (aj->GetResidue().GetNumber()==ref_res.GetNumber()) { + + if (only_fixed) { + if (swappable(second_atom.GetResidueName(), second_atom.GetAtomName())) { continue; - } - if (swappable(aj->GetResidue().GetName(), aj->GetName())) { - continue; - } - AtomView av2=mdl_chain.FindAtom(aj->GetResidue().GetNumber(), - aj->GetName()); - overlap.second+=1.0; - if (!(av1 && av2)) { - continue; - } - Real mdl_dist=geom::Length(av1.GetPos()-av2.GetPos()); - Real ref_dist=geom::Length(ai->GetPos()-aj->GetPos()); - if (std::abs(mdl_dist-ref_dist)<tol) { - overlap.first+=1; - } + } + AtomView av2=mdl_chain.FindAtom(second_atom.GetResNum(),second_atom.GetAtomName()); + overlap.second+=1.0; + if (!(av1 && av2)) { continue; } - if (aj->GetResidue().GetNumber()>ref_res.GetNumber()) { - AtomView av2=mdl_chain.FindAtom(aj->GetResidue().GetNumber(), - aj->GetName()); - overlap.second+=1.0; - overlap_list[ref_res.GetIndex()].second+=1.0; - overlap_list[aj->GetResidue().GetIndex()].second+=1.0; - if (!(av1 && av2)) { - continue; - } - Real mdl_dist=geom::Length(av1.GetPos()-av2.GetPos()); - Real ref_dist=geom::Length(ai->GetPos()-aj->GetPos()); - if (std::abs(mdl_dist-ref_dist)<tol) { - overlap.first+=1; - overlap_list[ref_res.GetIndex()].first+=1.0; - overlap_list[aj->GetResidue().GetIndex()].first+=1.0; - } + Real mdl_dist=geom::Length(av1.GetPos()-av2.GetPos()); + ReferenceDistance ref_dist=*ai; + if (within_tolerance(mdl_dist,ref_dist,tol).first) { + if (log) { + LOG_VERBOSE("LDT:" << " " << av1.GetResidue().GetChain() << " " << av1.GetResidue().GetName() << " " << av1.GetResidue().GetNumber() << " " << av1.GetName() + << " " << av2.GetResidue().GetChain() << " " << av2.GetResidue().GetName() << " " << av2.GetResidue().GetNumber() << " " << av2.GetName() << " " + << mdl_dist << " " << ref_dist.GetMinDistance() << " " << ref_dist.GetMaxDistance() << " " << tol << " " << "PASS") + } + overlap.first+=1; + } else { + if (log) { + LOG_VERBOSE("LDT:" << " " << av1.GetResidue().GetChain() << " " << av1.GetResidue().GetName() << " " << av1.GetResidue().GetNumber() << " " << av1.GetName() + << " " << av2.GetResidue().GetChain() << " " << av2.GetResidue().GetName() << " " << av2.GetResidue().GetNumber() << " " << av2.GetName() << " " + << mdl_dist << " " << ref_dist.GetMinDistance() << " " << mdl_dist-ref_dist.GetMinDistance() << " " << tol << " " << "FAIL") + } } - } - } + continue; + } + AtomView av2=mdl_chain.FindAtom(second_atom.GetResNum(), second_atom.GetAtomName()); + overlap.second+=1.0; + if (av1) { + overlap_list[av1.GetResidue().GetIndex()].second+=1.0; + } + if (av2) { + overlap_list[av2.GetResidue().GetIndex()].second+=1.0; + } + if (!(av1 && av2)) { + continue; + } + + Real mdl_dist=geom::Length(av1.GetPos()-av2.GetPos()); + ReferenceDistance ref_dist=*ai; + if (within_tolerance(mdl_dist,ref_dist,tol).first) { + LOG_VERBOSE("LDT:" << " " << av1.GetResidue().GetChain() << " " << av1.GetResidue().GetName() << " " << av1.GetResidue().GetNumber() << " " << av1.GetName() + << " " << av2.GetResidue().GetChain() << " " << av2.GetResidue().GetName() << " " << av2.GetResidue().GetNumber() << " " << av2.GetName() << " " + << mdl_dist << " " << ref_dist.GetMinDistance() << " " << mdl_dist-ref_dist.GetMinDistance() << " " << tol << " " << "PASS") + overlap.first+=1; + overlap_list[av1.GetResidue().GetIndex()].first+=1.0; + overlap_list[av2.GetResidue().GetIndex()].first+=1.0; + } else { + LOG_VERBOSE("LDT:" << " " << av1.GetResidue().GetChain() << " " << av1.GetResidue().GetName() << " " << av1.GetResidue().GetNumber() << " " << av1.GetName() + << " " << av2.GetResidue().GetChain() << " " << av2.GetResidue().GetName() << " " << av2.GetResidue().GetNumber() << " " << av2.GetName() << " " + << mdl_dist << " " << ref_dist.GetMinDistance() << " " << mdl_dist-ref_dist.GetMinDistance() << " " << tol << " " << "FAIL") + } + } return overlap; } + std::pair<Real, Real> calc_overlap2(const seq::ConstSequenceHandle& ref_seq, const seq::ConstSequenceHandle& mdl_seq, int pos, Real tol, Real max_dist, @@ -143,7 +175,10 @@ std::pair<Real, Real> calc_overlap2(const seq::ConstSequenceHandle& ref_seq, } for (AtomViewList::iterator aj=within.begin(), ae2=within.end(); aj!=ae2; ++aj) { - if (aj->GetElement()=="H") { continue; } + if (aj->GetElement()=="H" || + aj->GetResidue().GetChain()!=ai->GetResidue().GetChain()) { + continue; + } if (only_fixed) { if (aj->GetResidue().GetNumber()==ref_res.GetNumber()) { continue; @@ -172,7 +207,8 @@ std::pair<Real, Real> calc_overlap2(const seq::ConstSequenceHandle& ref_seq, continue; } else { if (aj->GetResidue().GetNumber()>ref_res.GetNumber()) { - overlap.second+=1.0; + overlap.second+=1.0; + try { int aln_pos=ref_seq.GetPos(aj->GetResidue().GetIndex()); ResidueView r2=mdl_seq.GetResidue(aln_pos); @@ -198,81 +234,194 @@ std::pair<Real, Real> calc_overlap2(const seq::ConstSequenceHandle& ref_seq, } -Real LocalDistTest(const EntityView& mdl, const EntityView& ref, - Real cutoff, Real max_dist, const String& local_ldt_property_string) +bool IsStandardResidue(String rn) +{ + String upper_rn=rn; + std::transform(rn.begin(),rn.end(),rn.begin(),toupper); + if (upper_rn == "ALA" || + upper_rn == "ARG" || + upper_rn == "ASN" || + upper_rn == "ASP" || + upper_rn == "GLN" || + upper_rn == "GLU" || + upper_rn == "LYS" || + upper_rn == "SER" || + upper_rn == "CYS" || + upper_rn == "TYR" || + upper_rn == "TRP" || + upper_rn == "THR" || + upper_rn == "VAL" || + upper_rn == "ILE" || + upper_rn == "MET" || + upper_rn == "LEU" || + upper_rn == "GLY" || + upper_rn == "PRO" || + upper_rn == "HIS" || + upper_rn == "PHE") { + return true; + } + return false; +} + +bool UniqueAtomIdentifier::operator==(const UniqueAtomIdentifier& rhs) const +{ + if (chain_ == rhs.GetChainName() && + residue_ == rhs.GetResNum() && + residue_name_ == rhs.GetResidueName() && + atom_ == rhs.GetAtomName() ) { + return true; + } + return false; +} + +bool ReferenceDistance::IsValid() const +{ + if (mind_ == -1.0 and maxd_ == -1.0) { + return false; + } + return true; +} + +void ReferenceDistance::Print() const +{ + if (this->IsValid() == true) { + std::cout << first_atom_.GetChainName() << " " << first_atom_.GetResNum() << " " << first_atom_.GetResidueName() << " " << first_atom_.GetAtomName() << " " << + second_atom_.GetChainName() << " " << second_atom_.GetResNum() << " " << second_atom_.GetResidueName() << " " << second_atom_.GetAtomName() << " " << + mind_ << " " << maxd_ << std::endl; + } else { + std::cout << first_atom_.GetChainName() << " " << first_atom_.GetResNum() << " " << first_atom_.GetResidueName() << " Placeholder" << std::endl; + } +} + +bool ReferenceDistance::operator==(const ReferenceDistance& rhs) const +{ + if (first_atom_ == rhs.GetFirstAtom() && + second_atom_ == rhs.GetSecondAtom() && + mind_ == rhs.GetMinDistance() && + maxd_ == rhs.GetMaxDistance() ) { + return true; + } + return false; +} + + + + +GlobalDistanceList CreateDistanceList(const EntityView& ref,Real max_dist) +{ + GlobalDistanceList dist_list; + ResidueViewList ref_residues=ref.GetChainList()[0].GetResidueList(); + for (ResidueViewList::iterator i=ref_residues.begin(), e=ref_residues.end(); i!=e; ++i) { + ResidueView rview = (*i); + if (IsStandardResidue(rview.GetName())) { + ResidueDistanceList res_dist_list; + AtomViewList ref_atoms=(*i).GetAtomList(); + AtomViewList within; + if (max_dist<0){ + dist_list.push_back(res_dist_list); + within=ref.GetAtomList(); + } + for (AtomViewList::iterator ai=ref_atoms.begin(), ae=ref_atoms.end(); ai!=ae; ++ai) { + UniqueAtomIdentifier first_atom(ai->GetResidue().GetChain().GetName(),ai->GetResidue().GetNumber(),ai->GetResidue().GetName(),ai->GetName()); + if (ai->GetElement()=="H") { continue; } + if (max_dist>=0){ + within=ref.FindWithin(ai->GetPos(), max_dist); + } + for (AtomViewList::iterator aj=within.begin(), ae2=within.end(); aj!=ae2; ++aj) { + UniqueAtomIdentifier second_atom(aj->GetResidue().GetChain().GetName(),aj->GetResidue().GetNumber(),aj->GetResidue().GetName(),aj->GetName()); + if (aj->GetElement()=="H" || + aj->GetResidue().GetChain()!=ai->GetResidue().GetChain()) { + continue; + } + if (aj->GetResidue().GetNumber()>i->GetNumber()) { + Real dist=geom::Length(ai->GetPos()-aj->GetPos()); + ReferenceDistance ref_dist(first_atom,second_atom,dist,dist); + res_dist_list.push_back(ref_dist); + } + } + } + if (res_dist_list.size()==0) { + UniqueAtomIdentifier current_residue_fake_atom(rview.GetChain().GetName(),rview.GetNumber(),rview.GetName(),"CA"); + ReferenceDistance fake_ref_distance(current_residue_fake_atom,current_residue_fake_atom,-1.0,-1.0); + res_dist_list.push_back(fake_ref_distance); + } + dist_list.push_back(res_dist_list); + } + } + return dist_list; +} + + +Real LocalDistTest(const EntityView& mdl, const GlobalDistanceList& glob_dist_list, + Real cutoff, const String& local_ldt_property_string) { - if (!mdl.GetResidueCount()) { LOG_WARNING("model structures doesn't contain any residues"); return 0.0; } - - if (!ref.GetResidueCount()) { - LOG_WARNING("reference structures doesn't contain any residues"); + if (glob_dist_list.size()==0) { + LOG_WARNING("global reference list is empty"); return 0.0; } - ResidueViewList ref_residues=ref.GetResidueList(); - std::vector<std::pair<Real, Real> > overlap_list(ref_residues.size(), std::pair<Real, Real>(0.0, 0.0)); + std::vector<std::pair<Real, Real> > overlap_list(mdl.GetResidueCount(), std::pair<Real, Real>(0.0, 0.0)); ChainView mdl_chain=mdl.GetChainList()[0]; // Residues with symmetric side-chains require special treatment as there are // two possible ways to name the atoms. We calculate the overlap with the // fixed atoms and take the solution that gives bigger scores. - XCSEditor edi=ref.GetHandle().EditXCS(BUFFERED_EDIT); - for (ResidueViewList::iterator - i=ref_residues.begin(), e=ref_residues.end(); i!=e; ++i) { - const String rname=i->GetName(); - ResidueView mdl_res=mdl_chain.FindResidue(i->GetNumber()); - if (!mdl_res) { - continue; - } - if (!(rname=="GLU" || rname=="ASP" || rname=="VAL" || rname=="TYR" || - rname=="PHE" || rname=="LYS" || rname=="ARG")) { + XCSEditor edi=mdl.GetHandle().EditXCS(BUFFERED_EDIT); + for (GlobalDistanceList::const_iterator i=glob_dist_list.begin(), e=glob_dist_list.end(); i!=e; ++i) { + ResidueDistanceList rdl = *i; + if (!rdl[0].IsValid()) { continue; } - - std::pair<Real, Real> ov1=calc_overlap1(*i, ref, mdl_chain, - cutoff, max_dist, true, - false, overlap_list); - std::pair<Real, Real> ov2=calc_overlap1(*i, ref, mdl_chain, - cutoff, max_dist, true, - true, overlap_list); + + ResNum rnum = rdl[0].GetFirstAtom().GetResNum() ; + String rname=rdl[0].GetFirstAtom().GetResidueName(); + ResidueView mdl_res=mdl_chain.FindResidue(rnum); + if (!mdl_res) { + continue; + } + if (!(rname=="GLU" || rname=="ASP" || rname=="VAL" || rname=="TYR" || rname=="PHE" || rname=="LYS" || rname=="ARG")) { + continue; + } + std::pair<Real, Real> ov1=calc_overlap1(*i, mdl_chain, + cutoff, true, + false, overlap_list,false); + + std::pair<Real, Real> ov2=calc_overlap1(*i, mdl_chain, + cutoff, true, + true, overlap_list,false); if (ov1.first/ov1.second<ov2.first/ov2.second) { - AtomViewList atoms=mdl_res.GetAtomList(); - for (AtomViewList::iterator j=atoms.begin(), - e2=atoms.end(); j!=e2; ++j) { - if (swappable(rname, j->GetName())) { - edi.RenameAtom(j->GetHandle(), swapped_name(j->GetName())); - } - } + AtomViewList atoms=mdl_res.GetAtomList(); + for (AtomViewList::iterator j=atoms.begin(), e2=atoms.end(); j!=e2; ++j) { + if (swappable(rname, j->GetName())) { + edi.RenameAtom(j->GetHandle(), swapped_name(j->GetName())); + } + } } } + overlap_list.clear(); std::pair<Real, Real> total_ov(0.0, 0.0); - for (ResidueViewList::iterator - i=ref_residues.begin(), e=ref_residues.end(); i!=e; ++i) { - std::pair<Real, Real> ov1=calc_overlap1(*i, ref, mdl_chain, cutoff, - max_dist, false, false, overlap_list); - total_ov.first+=ov1.first; - total_ov.second+=ov1.second; - } - - // attach local per-residue LDT as property: - if(local_ldt_property_string!="") { - for (ResidueViewList::iterator - i=ref_residues.begin(), e=ref_residues.end(); i!=e; ++i) { - std::pair<Real, Real> ov1=calc_overlap1(*i, ref, mdl_chain, cutoff, - max_dist, false, false, overlap_list); - total_ov.first+=ov1.first; - total_ov.second+=ov1.second; - Real local_ldt=overlap_list[(*i).GetIndex()].first/(overlap_list[(*i).GetIndex()].second ? overlap_list[(*i).GetIndex()].second : 1); - if (mdl_chain.FindResidue((*i).GetNumber()).IsValid()) { - ResidueView mdl_res=mdl_chain.FindResidue((*i).GetNumber()); - mdl_res.SetFloatProp(local_ldt_property_string, local_ldt); - } + for (GlobalDistanceList::const_iterator i=glob_dist_list.begin(), e=glob_dist_list.end(); i!=e; ++i) { + ResidueDistanceList rdl = *i; + if (rdl[0].IsValid()) { + std::pair<Real, Real> ov1=calc_overlap1(*i, mdl_chain, cutoff, + false, false, overlap_list,true); + total_ov.first+=ov1.first; + total_ov.second+=ov1.second; } - mdl_chain.SetFloatProp(local_ldt_property_string, total_ov.first/(total_ov.second ? total_ov.second : 1)); + if(local_ldt_property_string!="") { + ResNum rn = rdl[0].GetFirstAtom().GetResNum(); + ResidueView mdlr=mdl_chain.FindResidue(rn); + if (mdlr.IsValid()) { + int mdl_res_index =mdlr.GetIndex(); + Real local_ldt=overlap_list[mdl_res_index].first/(overlap_list[mdl_res_index].second ? overlap_list[mdl_res_index].second : 1); + ResidueView res_to_wr = mdl_chain.FindResidue((*i)[0].GetFirstAtom().GetResNum()); + res_to_wr.SetFloatProp(local_ldt_property_string, local_ldt); + } + } } overlap_list.clear(); - return total_ov.first/(total_ov.second ? total_ov.second : 1); } @@ -327,4 +476,17 @@ Real LocalDistTest(const ost::seq::AlignmentHandle& aln, return 0.0; } +Real LDTHA(EntityView& v, const GlobalDistanceList& global_dist_list) +{ + + Real cutoffs[]={0.5,1,2,4}; + String labels[]={"localldt0.5","localldt1","localldt2","ldtlocal4"}; + Real ldt=0.0; + for (int n=0; n<4; ++n) { + ldt+=alg::LocalDistTest(v, global_dist_list, cutoffs[n], labels[n]); + } + ldt/=4.0; + return ldt; +} + }}} diff --git a/modules/mol/alg/src/local_dist_test.hh b/modules/mol/alg/src/local_dist_test.hh index 76ef238034ea095ec26eebff64e08e48b60b0e8e..74e0f4f29ca00b54340a683a036904d3eb66e596 100644 --- a/modules/mol/alg/src/local_dist_test.hh +++ b/modules/mol/alg/src/local_dist_test.hh @@ -25,15 +25,70 @@ namespace ost { namespace mol { namespace alg { + +class UniqueAtomIdentifier +{ + +public: + UniqueAtomIdentifier(const String& chain,const ResNum& residue,const String& residue_name, const String& atom): chain_(chain),residue_(residue),residue_name_(residue_name),atom_(atom) {} + + String GetChainName() const { return chain_; } + ResNum GetResNum() const { return residue_; } + String GetResidueName() const { return residue_name_; } + String GetAtomName() const { return atom_; } + bool operator==(const UniqueAtomIdentifier& rhs) const; + +private: + + String chain_; + ResNum residue_; + String residue_name_; + String atom_; +}; + +class ReferenceDistance +{ + +public: + + ReferenceDistance(const UniqueAtomIdentifier& first_atom, const UniqueAtomIdentifier& second_atom, Real mind, Real maxd): + first_atom_(first_atom),second_atom_(second_atom),mind_(mind),maxd_(maxd) {} + UniqueAtomIdentifier GetFirstAtom() const {return first_atom_;} + UniqueAtomIdentifier GetSecondAtom() const {return second_atom_;} + Real GetMinDistance() const {return mind_ ;} + Real GetMaxDistance() const {return maxd_ ;} + bool IsValid() const; + void Print() const; + bool operator==(const ReferenceDistance& rhs) const; + +private: + + UniqueAtomIdentifier first_atom_; + UniqueAtomIdentifier second_atom_; + Real mind_; + Real maxd_; +}; + +typedef std::vector<ReferenceDistance> ResidueDistanceList; +typedef std::vector<ResidueDistanceList> GlobalDistanceList; + Real DLLEXPORT_OST_MOL_ALG LocalDistTest(const EntityView& mdl, - const EntityView& ref, - Real cutoff, Real max_dist, + const GlobalDistanceList& dist_list, + Real cutoff, const String& local_ldt_property_string=""); Real DLLEXPORT_OST_MOL_ALG LocalDistTest(const ost::seq::AlignmentHandle& aln, - Real cutoff, Real max_dist, + Real cutoff, Real max_dist, int ref_index=0, int mdl_index=1); + +Real DLLEXPORT_OST_MOL_ALG LDTHA(EntityView& v, const GlobalDistanceList& global_dist_list); + +GlobalDistanceList CreateDistanceList(const EntityView& ref,Real max_dist); +bool IsStandardResidue(String rn); + + + }}} #endif diff --git a/modules/mol/alg/src/new_stereo_chemical_props.txt b/modules/mol/alg/src/new_stereo_chemical_props.txt new file mode 100644 index 0000000000000000000000000000000000000000..25262efd7689fc76f4d6ea1a7c75e342e840ea1d --- /dev/null +++ b/modules/mol/alg/src/new_stereo_chemical_props.txt @@ -0,0 +1,345 @@ +Bond Residue Mean StdDev +CA-CB ALA 1.520 0.021 +N-CA ALA 1.459 0.020 +CA-C ALA 1.525 0.026 +C-O ALA 1.229 0.019 +CA-CB ARG 1.535 0.022 +CB-CG ARG 1.521 0.027 +CG-CD ARG 1.515 0.025 +CD-NE ARG 1.460 0.017 +NE-CZ ARG 1.326 0.013 +CZ-NH1 ARG 1.326 0.013 +CZ-NH2 ARG 1.326 0.013 +N-CA ARG 1.459 0.020 +CA-C ARG 1.525 0.026 +C-O ARG 1.229 0.019 +CA-CB ASN 1.527 0.026 +CB-CG ASN 1.506 0.023 +CG-OD1 ASN 1.235 0.022 +CG-ND2 ASN 1.324 0.025 +N-CA ASN 1.459 0.020 +CA-C ASN 1.525 0.026 +C-O ASN 1.229 0.019 +CA-CB ASP 1.535 0.022 +CB-CG ASP 1.513 0.021 +CG-OD1 ASP 1.249 0.023 +CG-OD2 ASP 1.249 0.023 +N-CA ASP 1.459 0.020 +CA-C ASP 1.525 0.026 +C-O ASP 1.229 0.019 +CA-CB CYS 1.526 0.013 +CB-SG CYS 1.812 0.016 +N-CA CYS 1.459 0.020 +CA-C CYS 1.525 0.026 +C-O CYS 1.229 0.019 +CA-CB GLU 1.535 0.022 +CB-CG GLU 1.517 0.019 +CG-CD GLU 1.515 0.015 +CD-OE1 GLU 1.252 0.011 +CD-OE2 GLU 1.252 0.011 +N-CA GLU 1.459 0.020 +CA-C GLU 1.525 0.026 +C-O GLU 1.229 0.019 +CA-CB GLN 1.535 0.022 +CB-CG GLN 1.521 0.027 +CG-CD GLN 1.506 0.023 +CD-OE1 GLN 1.235 0.022 +CD-NE2 GLN 1.324 0.025 +N-CA GLN 1.459 0.020 +CA-C GLN 1.525 0.026 +C-O GLN 1.229 0.019 +N-CA GLY 1.456 0.015 +CA-C GLY 1.514 0.016 +C-O GLY 1.232 0.016 +CA-CB HIS 1.535 0.022 +CB-CG HIS 1.492 0.016 +CG-ND1 HIS 1.369 0.015 +CG-CD2 HIS 1.353 0.017 +ND1-CE1 HIS 1.343 0.025 +CD2-NE2 HIS 1.415 0.021 +CE1-NE2 HIS 1.322 0.023 +N-CA HIS 1.459 0.020 +CA-C HIS 1.525 0.026 +C-O HIS 1.229 0.019 +CA-CB ILE 1.544 0.023 +CB-CG1 ILE 1.536 0.028 +CB-CG2 ILE 1.524 0.031 +CG1-CD1 ILE 1.500 0.069 +N-CA ILE 1.459 0.020 +CA-C ILE 1.525 0.026 +C-O ILE 1.229 0.019 +CA-CB LEU 1.533 0.023 +CB-CG LEU 1.521 0.029 +CG-CD1 LEU 1.514 0.037 +CG-CD2 LEU 1.514 0.037 +N-CA LEU 1.459 0.020 +CA-C LEU 1.525 0.026 +C-O LEU 1.229 0.019 +CA-CB LYS 1.535 0.022 +CB-CG LYS 1.521 0.027 +CG-CD LYS 1.520 0.034 +CD-CE LYS 1.508 0.025 +CE-NZ LYS 1.486 0.025 +N-CA LYS 1.459 0.020 +CA-C LYS 1.525 0.026 +C-O LYS 1.229 0.019 +CA-CB MET 1.535 0.022 +CB-CG MET 1.509 0.032 +CG-SD MET 1.807 0.026 +SD-CE MET 1.774 0.056 +N-CA MET 1.459 0.020 +CA-C MET 1.525 0.026 +C-O MET 1.229 0.019 +CA-CB PHE 1.535 0.022 +CB-CG PHE 1.509 0.017 +CG-CD1 PHE 1.383 0.015 +CG-CD2 PHE 1.383 0.015 +CD1-CE1 PHE 1.388 0.020 +CD2-CE2 PHE 1.388 0.020 +CE1-CZ PHE 1.369 0.019 +CE2-CZ PHE 1.369 0.019 +N-CA PHE 1.459 0.020 +CA-C PHE 1.525 0.026 +C-O PHE 1.229 0.019 +CA-CB PRO 1.531 0.020 +CB-CG PRO 1.495 0.050 +CG-CD PRO 1.502 0.033 +CD-N PRO 1.474 0.014 +N-CA PRO 1.468 0.017 +CA-C PRO 1.524 0.020 +C-O PRO 1.228 0.020 +CA-CB SER 1.525 0.015 +CB-OG SER 1.418 0.013 +N-CA SER 1.459 0.020 +CA-C SER 1.525 0.026 +C-O SER 1.229 0.019 +CA-CB THR 1.529 0.026 +CB-OG1 THR 1.428 0.020 +CB-CG2 THR 1.519 0.033 +N-CA THR 1.459 0.020 +CA-C THR 1.525 0.026 +C-O THR 1.229 0.019 +CA-CB TRP 1.535 0.022 +CB-CG TRP 1.498 0.018 +CG-CD1 TRP 1.363 0.014 +CG-CD2 TRP 1.432 0.017 +CD1-NE1 TRP 1.375 0.017 +NE1-CE2 TRP 1.371 0.013 +CD2-CE2 TRP 1.409 0.012 +CD2-CE3 TRP 1.399 0.015 +CE2-CZ2 TRP 1.393 0.017 +CE3-CZ3 TRP 1.380 0.017 +CZ2-CH2 TRP 1.369 0.019 +CZ3-CH2 TRP 1.396 0.016 +N-CA TRP 1.459 0.020 +CA-C TRP 1.525 0.026 +C-O TRP 1.229 0.019 +CA-CB TYR 1.535 0.022 +CB-CG TYR 1.512 0.015 +CG-CD1 TYR 1.387 0.013 +CG-CD2 TYR 1.387 0.013 +CD1-CE1 TYR 1.389 0.015 +CD2-CE2 TYR 1.389 0.015 +CE1-CZ TYR 1.381 0.013 +CE2-CZ TYR 1.381 0.013 +CZ-OH TYR 1.374 0.017 +N-CA TYR 1.459 0.020 +CA-C TYR 1.525 0.026 +C-O TYR 1.229 0.019 +CA-CB VAL 1.543 0.021 +CB-CG1 VAL 1.524 0.021 +CB-CG2 VAL 1.524 0.021 +N-CA VAL 1.459 0.020 +CA-C VAL 1.525 0.026 +C-O VAL 1.229 0.019 +- + +Angle Residue Mean StdDev +N-CA-CB ALA 110.1 1.4 +CB-CA-C ALA 110.1 1.5 +N-CA-C ALA 111.0 2.7 +CA-C-O ALA 120.1 2.1 +N-CA-CB ARG 110.6 1.8 +CB-CA-C ARG 110.4 2.0 +CA-CB-CG ARG 113.4 2.2 +CB-CG-CD ARG 111.6 2.6 +CG-CD-NE ARG 111.8 2.1 +CD-NE-CZ ARG 123.6 1.4 +NE-CZ-NH1 ARG 120.3 0.5 +NE-CZ-NH2 ARG 120.3 0.5 +NH1-CZ-NH2 ARG 119.4 1.1 +N-CA-C ARG 111.0 2.7 +CA-C-O ARG 120.1 2.1 +N-CA-CB ASN 110.6 1.8 +CB-CA-C ASN 110.4 2.0 +CA-CB-CG ASN 113.4 2.2 +CB-CG-ND2 ASN 116.7 2.4 +CB-CG-OD1 ASN 121.6 2.0 +ND2-CG-OD1 ASN 121.9 2.3 +N-CA-C ASN 111.0 2.7 +CA-C-O ASN 120.1 2.1 +N-CA-CB ASP 110.6 1.8 +CB-CA-C ASP 110.4 2.0 +CA-CB-CG ASP 113.4 2.2 +CB-CG-OD1 ASP 118.3 0.9 +CB-CG-OD2 ASP 118.3 0.9 +OD1-CG-OD2 ASP 123.3 1.9 +N-CA-C ASP 111.0 2.7 +CA-C-O ASP 120.1 2.1 +N-CA-CB CYS 110.8 1.5 +CB-CA-C CYS 111.5 1.2 +CA-CB-SG CYS 114.2 1.1 +N-CA-C CYS 111.0 2.7 +CA-C-O CYS 120.1 2.1 +N-CA-CB GLU 110.6 1.8 +CB-CA-C GLU 110.4 2.0 +CA-CB-CG GLU 113.4 2.2 +CB-CG-CD GLU 114.2 2.7 +CG-CD-OE1 GLU 118.3 2.0 +CG-CD-OE2 GLU 118.3 2.0 +OE1-CD-OE2 GLU 123.3 1.2 +N-CA-C GLU 111.0 2.7 +CA-C-O GLU 120.1 2.1 +N-CA-CB GLN 110.6 1.8 +CB-CA-C GLN 110.4 2.0 +CA-CB-CG GLN 113.4 2.2 +CB-CG-CD GLN 111.6 2.6 +CG-CD-OE1 GLN 121.6 2.0 +CG-CD-NE2 GLN 116.7 2.4 +OE1-CD-NE2 GLN 121.9 2.3 +N-CA-C GLN 111.0 2.7 +CA-C-O GLN 120.1 2.1 +N-CA-C GLY 113.1 2.5 +CA-C-O GLY 120.6 1.8 +N-CA-CB HIS 110.6 1.8 +CB-CA-C HIS 110.4 2.0 +CA-CB-CG HIS 113.6 1.7 +CB-CG-ND1 HIS 123.2 2.5 +CB-CG-CD2 HIS 130.8 3.1 +CG-ND1-CE1 HIS 108.2 1.4 +ND1-CE1-NE2 HIS 109.9 2.2 +CE1-NE2-CD2 HIS 106.6 2.5 +NE2-CD2-CG HIS 109.2 1.9 +CD2-CG-ND1 HIS 106.0 1.4 +N-CA-C HIS 111.0 2.7 +CA-C-O HIS 120.1 2.1 +N-CA-CB ILE 110.8 2.3 +CB-CA-C ILE 111.6 2.0 +CA-CB-CG1 ILE 111.0 1.9 +CB-CG1-CD1 ILE 113.9 2.8 +CA-CB-CG2 ILE 110.9 2.0 +CG1-CB-CG2 ILE 111.4 2.2 +N-CA-C ILE 111.0 2.7 +CA-C-O ILE 120.1 2.1 +N-CA-CB LEU 110.4 2.0 +CB-CA-C LEU 110.2 1.9 +CA-CB-CG LEU 115.3 2.3 +CB-CG-CD1 LEU 111.0 1.7 +CB-CG-CD2 LEU 111.0 1.7 +CD1-CG-CD2 LEU 110.5 3.0 +N-CA-C LEU 111.0 2.7 +CA-C-O LEU 120.1 2.1 +N-CA-CB LYS 110.6 1.8 +CB-CA-C LYS 110.4 2.0 +CA-CB-CG LYS 113.4 2.2 +CB-CG-CD LYS 111.6 2.6 +CG-CD-CE LYS 111.9 3.0 +CD-CE-NZ LYS 111.7 2.3 +N-CA-C LYS 111.0 2.7 +CA-C-O LYS 120.1 2.1 +N-CA-CB MET 110.6 1.8 +CB-CA-C MET 110.4 2.0 +CA-CB-CG MET 113.3 1.7 +CB-CG-SD MET 112.4 3.0 +CG-SD-CE MET 100.2 1.6 +N-CA-C MET 111.0 2.7 +CA-C-O MET 120.1 2.1 +N-CA-CB PHE 110.6 1.8 +CB-CA-C PHE 110.4 2.0 +CA-CB-CG PHE 113.9 2.4 +CB-CG-CD1 PHE 120.8 0.7 +CB-CG-CD2 PHE 120.8 0.7 +CD1-CG-CD2 PHE 118.3 1.3 +CG-CD1-CE1 PHE 120.8 1.1 +CG-CD2-CE2 PHE 120.8 1.1 +CD1-CE1-CZ PHE 120.1 1.2 +CD2-CE2-CZ PHE 120.1 1.2 +CE1-CZ-CE2 PHE 120.0 1.8 +N-CA-C PHE 111.0 2.7 +CA-C-O PHE 120.1 2.1 +N-CA-CB PRO 103.3 1.2 +CB-CA-C PRO 111.7 2.1 +CA-CB-CG PRO 104.8 1.9 +CB-CG-CD PRO 106.5 3.9 +CG-CD-N PRO 103.2 1.5 +CA-N-CD PRO 111.7 1.4 +N-CA-C PRO 112.1 2.6 +CA-C-O PRO 120.2 2.4 +N-CA-CB SER 110.5 1.5 +CB-CA-C SER 110.1 1.9 +CA-CB-OG SER 111.2 2.7 +N-CA-C SER 111.0 2.7 +CA-C-O SER 120.1 2.1 +N-CA-CB THR 110.3 1.9 +CB-CA-C THR 111.6 2.7 +CA-CB-OG1 THR 109.0 2.1 +CA-CB-CG2 THR 112.4 1.4 +OG1-CB-CG2 THR 110.0 2.3 +N-CA-C THR 111.0 2.7 +CA-C-O THR 120.1 2.1 +N-CA-CB TRP 110.6 1.8 +CB-CA-C TRP 110.4 2.0 +CA-CB-CG TRP 113.7 1.9 +CB-CG-CD1 TRP 127.0 1.3 +CB-CG-CD2 TRP 126.6 1.3 +CD1-CG-CD2 TRP 106.3 0.8 +CG-CD1-NE1 TRP 110.1 1.0 +CD1-NE1-CE2 TRP 109.0 0.9 +NE1-CE2-CD2 TRP 107.3 1.0 +CE2-CD2-CG TRP 107.3 0.8 +CG-CD2-CE3 TRP 133.9 0.9 +NE1-CE2-CZ2 TRP 130.4 1.1 +CE3-CD2-CE2 TRP 118.7 1.2 +CD2-CE2-CZ2 TRP 122.3 1.2 +CE2-CZ2-CH2 TRP 117.4 1.0 +CZ2-CH2-CZ3 TRP 121.6 1.2 +CH2-CZ3-CE3 TRP 121.2 1.1 +CZ3-CE3-CD2 TRP 118.8 1.3 +N-CA-C TRP 111.0 2.7 +CA-C-O TRP 120.1 2.1 +N-CA-CB TYR 110.6 1.8 +CB-CA-C TYR 110.4 2.0 +CA-CB-CG TYR 113.4 1.9 +CB-CG-CD1 TYR 121.0 0.6 +CB-CG-CD2 TYR 121.0 0.6 +CD1-CG-CD2 TYR 117.9 1.1 +CG-CD1-CE1 TYR 121.3 0.8 +CG-CD2-CE2 TYR 121.3 0.8 +CD1-CE1-CZ TYR 119.8 0.9 +CD2-CE2-CZ TYR 119.8 0.9 +CE1-CZ-CE2 TYR 119.8 1.6 +CE1-CZ-OH TYR 120.1 2.7 +CE2-CZ-OH TYR 120.1 2.7 +N-CA-C TYR 111.0 2.7 +CA-C-O TYR 120.1 2.1 +N-CA-CB VAL 111.5 2.2 +CB-CA-C VAL 111.4 1.9 +CA-CB-CG1 VAL 110.9 1.5 +CA-CB-CG2 VAL 110.9 1.5 +CG1-CB-CG2 VAL 110.9 1.6 +N-CA-C VAL 111.0 2.7 +CA-C-O VAL 120.1 2.1 +- + +Non-bonded distance Minimum Dist Tolerance +C-C 3.4 1.5 +C-N 3.25 1.5 +C-S 3.5 1.5 +C-O 3.22 1.5 +N-N 3.1 1.5 +N-S 3.35 1.5 +N-O 3.07 1.5 +O-S 3.32 1.5 +O-O 3.04 1.5 +S-S 2.03 1.0 +- diff --git a/modules/mol/alg/src/stereo_chemical_props.txt b/modules/mol/alg/src/stereo_chemical_props.txt new file mode 100644 index 0000000000000000000000000000000000000000..f17af3cf31baf8789c648fb1d5f1eff1d882a46d --- /dev/null +++ b/modules/mol/alg/src/stereo_chemical_props.txt @@ -0,0 +1,367 @@ +# This file contains stereochemical parameters used to evaluate the quality of models. +# Bond distances and Angles come from Engh,Huber (1991). Non bonded distances come from + +Bond Residue Mean StdDev +N-CA ALA 1.458 0.019 +CA-C ALA 1.525 0.021 +C-O ALA 1.231 0.02 +CA-CB ALA 1.521 0.033 +N-CA CYS 1.458 0.019 +CA-C CYS 1.525 0.021 +C-O CYS 1.231 0.02 +CA-CB CYS 1.53 0.02 +CB-SG CYS 1.808 0.033 +N-CA ASP 1.458 0.019 +CA-C ASP 1.525 0.021 +C-O ASP 1.231 0.02 +CA-CB ASP 1.53 0.02 +CB-CG ASP 1.516 0.025 +CG-OD1 ASP 1.249 0.019 +CG-OD2 ASP 1.249 0.019 +N-CA GLU 1.458 0.019 +CA-C GLU 1.525 0.021 +C-O GLU 1.231 0.02 +CA-CB GLU 1.53 0.02 +CB-CG GLU 1.52 0.03 +CG-CD GLU 1.516 0.025 +CD-OE1 GLU 1.249 0.019 +CD-OE2 GLU 1.249 0.019 +N-CA PHE 1.458 0.019 +CA-C PHE 1.525 0.021 +C-O PHE 1.231 0.02 +CA-CB PHE 1.53 0.02 +CB-CG PHE 1.502 0.023 +CG-CD1 PHE 1.384 0.021 +CG-CD2 PHE 1.384 0.021 +CD1-CE1 PHE 1.382 0.03 +CD2-CE2 PHE 1.382 0.03 +CE1-CZ PHE 1.382 0.03 +CE2-CZ PHE 1.382 0.03 +N-CA GLY 1.451 0.016 +CA-C GLY 1.516 0.018 +C-O GLY 1.231 0.02 +N-CA HIS 1.458 0.019 +CA-C HIS 1.525 0.021 +C-O HIS 1.231 0.02 +CA-CB HIS 1.53 0.02 +CB-CG HIS 1.497 0.014 +CG-ND1 HIS 1.378 0.011 +CG-CD2 HIS 1.354 0.011 +ND1-CE1 HIS 1.321 0.01 +CD2-NE2 HIS 1.374 0.011 +CE1-NE2 HIS 1.321 0.01 +N-CA ILE 1.458 0.019 +CA-C ILE 1.525 0.021 +C-O ILE 1.231 0.02 +CA-CB ILE 1.54 0.027 +CB-CG1 ILE 1.53 0.02 +CB-CG2 ILE 1.521 0.033 +CG1-CD1 ILE 1.513 0.039 +N-CA LYS 1.458 0.019 +CA-C LYS 1.525 0.021 +C-O LYS 1.231 0.02 +CA-CB LYS 1.53 0.02 +CB-CG LYS 1.52 0.03 +CG-CD LYS 1.52 0.03 +CD-CE LYS 1.52 0.03 +CE-NZ LYS 1.489 0.03 +N-CA LEU 1.458 0.019 +CA-C LEU 1.525 0.021 +C-O LEU 1.231 0.02 +CA-CB LEU 1.53 0.02 +CB-CG LEU 1.53 0.02 +CG-CD1 LEU 1.521 0.033 +CG-CD2 LEU 1.521 0.033 +N-CA MET 1.458 0.019 +CA-C MET 1.525 0.021 +C-O MET 1.231 0.02 +CA-CB MET 1.53 0.02 +CB-CG MET 1.52 0.03 +CG-SD MET 1.803 0.034 +SD-CE MET 1.791 0.059 +N-CA ASN 1.458 0.019 +CA-C ASN 1.525 0.021 +C-O ASN 1.231 0.02 +CA-CB ASN 1.53 0.02 +CB-CG ASN 1.516 0.025 +CG-OD1 ASN 1.231 0.02 +CG-ND2 ASN 1.328 0.021 +N-CA PRO 1.466 0.015 +CA-C PRO 1.525 0.021 +C-O PRO 1.231 0.02 +CA-CB PRO 1.53 0.02 +CB-CG PRO 1.492 0.05 +CG-CD PRO 1.503 0.034 +CD-N PRO 1.473 0.014 +N-CA GLN 1.458 0.019 +CA-C GLN 1.525 0.021 +C-O GLN 1.231 0.02 +CA-CB GLN 1.53 0.02 +CB-CG GLN 1.52 0.03 +CG-CD GLN 1.516 0.025 +CD-OE1 GLN 1.231 0.02 +CD-NE2 GLN 1.328 0.021 +N-CA ARG 1.458 0.019 +CA-C ARG 1.525 0.021 +C-O ARG 1.231 0.02 +CA-CB ARG 1.53 0.02 +CB-CG ARG 1.52 0.03 +CG-CD ARG 1.52 0.03 +CD-NE ARG 1.46 0.018 +NE-CZ ARG 1.329 0.014 +CZ-NH1 ARG 1.326 0.018 +CZ-NH2 ARG 1.326 0.018 +N-CA SER 1.458 0.019 +CA-C SER 1.525 0.021 +C-O SER 1.231 0.02 +CA-CB SER 1.53 0.02 +CB-OG SER 1.417 0.02 +N-CA THR 1.458 0.019 +CA-C THR 1.525 0.021 +C-O THR 1.231 0.02 +CA-CB THR 1.54 0.027 +CB-OG1 THR 1.433 0.016 +CB-CG2 THR 1.521 0.033 +N-CA VAL 1.458 0.019 +CA-C VAL 1.525 0.021 +C-O VAL 1.231 0.02 +CA-CB VAL 1.54 0.027 +CB-CG1 VAL 1.521 0.033 +CB-CG2 VAL 1.521 0.033 +N-CA TRP 1.458 0.019 +CA-C TRP 1.525 0.021 +C-O TRP 1.231 0.02 +CA-CB TRP 1.53 0.02 +CB-CG TRP 1.498 0.031 +CG-CD1 TRP 1.365 0.025 +CG-CD2 TRP 1.433 0.018 +CD1-NE1 TRP 1.374 0.021 +NE1-CE2 TRP 1.37 0.011 +CD2-CE2 TRP 1.409 0.017 +CD2-CE3 TRP 1.398 0.016 +CE2-CZ2 TRP 1.394 0.021 +CE3-CZ3 TRP 1.382 0.03 +CZ2-CH2 TRP 1.368 0.019 +CZ3-CH2 TRP 1.4 0.025 +N-CA TYR 1.458 0.019 +CA-C TYR 1.525 0.021 +C-O TYR 1.231 0.02 +CA-CB TYR 1.53 0.02 +CB-CG TYR 1.512 0.022 +CG-CD1 TYR 1.389 0.021 +CG-CD2 TYR 1.389 0.021 +CD1-CE1 TYR 1.382 0.03 +CD2-CE2 TYR 1.382 0.03 +CE1-CZ TYR 1.378 0.024 +CE2-CZ TYR 1.378 0.024 +CZ-OH TYR 1.376 0.021 +- + +Angle Residue Mean StdDev +N-CA-C ALA 111.2 2.8 +CA-C-O ALA 120.8 1.7 +N-CA-CB ALA 110.4 1.5 +C-CA-CB ALA 110.5 1.5 +N-CA-C CYS 111.2 2.8 +CA-C-O CYS 120.8 1.7 +N-CA-CB CYS 110.5 1.7 +C-CA-CB CYS 110.1 1.9 +N-CA-C ASP 111.2 2.8 +CA-C-O ASP 120.8 1.7 +N-CA-CB ASP 110.5 1.7 +C-CA-CB ASP 110.1 1.9 +CA-CB-CG ASP 112.6 1.0 +CB-CG-OD2 ASP 118.4 2.3 +CB-CG-OD1 ASP 118.4 2.3 +OD2-CG-OD1 ASP 122.9 2.4 +N-CA-C GLU 111.2 2.8 +CA-C-O GLU 120.8 1.7 +N-CA-CB GLU 110.5 1.7 +C-CA-CB GLU 110.1 1.9 +CA-CB-CG GLU 114.1 2.0 +CB-CG-CD GLU 112.6 1.7 +CG-CD-OE2 GLU 118.4 2.3 +CG-CD-OE1 GLU 118.4 2.3 +OE2-CD-OE1 GLU 122.9 2.4 +N-CA-C PHE 111.2 2.8 +CA-C-O PHE 120.8 1.7 +N-CA-CB PHE 110.5 1.7 +C-CA-CB PHE 110.1 1.9 +CA-CB-CG PHE 113.8 1.0 +CB-CG-CD1 PHE 120.7 1.7 +CB-CG-CD2 PHE 120.7 1.7 +CG-CD1-CE1 PHE 120.7 1.7 +CG-CD2-CE2 PHE 120.7 1.7 +CD1-CE1-CZ PHE 120.0 1.8 +CD2-CE2-CZ PHE 120.0 1.8 +CE1-CZ-CE2 PHE 120.0 1.8 +CD1-CG-CD2 PHE 118.6 1.5 +N-CA-C GLY 112.5 2.9 +CA-C-O GLY 120.8 2.1 +N-CA-C HIS 111.2 2.8 +CA-C-O HIS 120.8 1.7 +N-CA-CB HIS 110.5 1.7 +C-CA-CB HIS 110.1 1.9 +CA-CB-CG HIS 113.8 1.0 +CB-CG-ND1 HIS 122.7 1.5 +CG-ND1-CE1 HIS 109.3 1.7 +ND1-CE1-NE2 HIS 108.4 1.0 +CE1-NE2-CD2 HIS 109.0 1.0 +NE2-CD2-CG HIS 107.2 1.0 +CD2-CG-ND1 HIS 106.1 1.0 +CB-CG-CD2 HIS 131.2 1.3 +N-CA-C ILE 111.2 2.8 +CA-C-O ILE 120.8 1.7 +N-CA-CB ILE 111.5 1.7 +C-CA-CB ILE 109.1 2.2 +CA-CB-CG2 ILE 110.5 1.7 +CA-CB-CG1 ILE 110.4 1.7 +CG2-CB-CG1 ILE 110.7 3.0 +CB-CG1-CD1 ILE 113.8 2.1 +N-CA-C LYS 111.2 2.8 +CA-C-O LYS 120.8 1.7 +N-CA-CB LYS 110.5 1.7 +C-CA-CB LYS 110.1 1.9 +CA-CB-CG LYS 114.1 2.0 +CB-CG-CD LYS 111.3 2.3 +CG-CD-CE LYS 111.3 2.3 +CD-CE-NZ LYS 111.9 3.2 +N-CA-C LEU 111.2 2.8 +CA-C-O LEU 120.8 1.7 +N-CA-CB LEU 110.5 1.7 +C-CA-CB LEU 110.1 1.9 +CA-CB-CG LEU 116.3 3.5 +CB-CG-CD1 LEU 110.7 3.0 +CB-CG-CD2 LEU 110.7 3.0 +CD1-CG-CD2 LEU 110.8 2.2 +N-CA-C MET 111.2 2.8 +CA-C-O MET 120.8 1.7 +N-CA-CB MET 110.5 1.7 +C-CA-CB MET 110.1 1.9 +CA-CB-CG MET 114.1 2.0 +CB-CG-SD MET 112.7 3.0 +CG-SD-CE MET 100.9 2.2 +N-CA-C ASN 111.2 2.8 +CA-C-O ASN 120.8 1.7 +N-CA-CB ASN 110.5 1.7 +C-CA-CB ASN 110.1 1.9 +CA-CB-CG ASN 112.6 1.0 +CB-CG-ND2 ASN 116.4 1.5 +CB-CG-OD1 ASN 120.8 2.0 +ND2-CG-OD1 ASN 122.6 1.0 +N-CA-C PRO 111.8 2.5 +CA-C-O PRO 120.8 1.7 +N-CA-CB PRO 103.0 1.1 +C-CA-CB PRO 110.1 1.9 +CA-CB-CG PRO 104.5 1.9 +CB-CG-CD PRO 106.1 3.2 +CG-CD-N PRO 103.2 1.5 +CD-N-CA PRO 112.0 1.4 +N-CA-C GLN 111.2 2.8 +CA-C-O GLN 120.8 1.7 +N-CA-CB GLN 110.5 1.7 +C-CA-CB GLN 110.1 1.9 +CA-CB-CG GLN 114.1 2.0 +CB-CG-CD GLN 112.6 1.7 +CG-CD-NE2 GLN 116.4 1.5 +CG-CD-OE1 GLN 120.8 2.0 +NE2-CD-OE1 GLN 122.6 1.0 +N-CA-C ARG 111.2 2.8 +CA-C-O ARG 120.8 1.7 +N-CA-CB ARG 110.5 1.7 +C-CA-CB ARG 110.1 1.9 +CA-CB-CG ARG 114.1 2.0 +CB-CG-CD ARG 111.3 2.3 +CG-CD-NE ARG 112.0 2.2 +CD-NE-CZ ARG 124.2 1.5 +NE-CZ-NH1 ARG 120.0 1.9 +NE-CZ-NH2 ARG 120.0 1.9 +NH1-CZ-NH2 ARG 119.7 1.8 +N-CA-C SER 111.2 2.8 +CA-C-O SER 120.8 1.7 +N-CA-CB SER 110.5 1.7 +C-CA-CB SER 110.1 1.9 +CA-CB-OG SER 111.1 2.0 +N-CA-C THR 111.2 2.8 +CA-C-O THR 120.8 1.7 +N-CA-CB THR 111.5 1.7 +C-CA-CB THR 109.1 2.2 +CA-CB-CG2 THR 110.5 1.7 +CA-CB-OG1 THR 109.6 1.5 +CG2-CB-OG1 THR 109.3 2.0 +N-CA-C VAL 111.2 2.8 +CA-C-O VAL 120.8 1.7 +N-CA-CB VAL 111.5 1.7 +C-CA-CB VAL 109.1 2.2 +CA-CB-CG1 VAL 110.5 1.7 +CA-CB-CG2 VAL 110.5 1.7 +CG1-CB-CG2 VAL 110.8 2.2 +N-CA-C TRP 111.2 2.8 +CA-C-O TRP 120.8 1.7 +N-CA-CB TRP 110.5 1.7 +C-CA-CB TRP 110.1 1.9 +CA-CB-CG TRP 113.6 1.9 +CB-CG-CD1 TRP 126.9 1.5 +CB-CG-CD2 TRP 126.8 1.4 +CD1-CG-CD2 TRP 106.3 1.6 +CG-CD1-NE1 TRP 110.2 1.3 +CD1-NE1-CE2 TRP 108.9 1.8 +NE1-CE2-CZ2 TRP 130.1 1.5 +NE1-CE2-CD2 TRP 107.4 1.3 +CZ2-CE2-CD2 TRP 122.4 1.0 +CE2-CZ2-CH2 TRP 117.5 1.3 +CZ2-CH2-CZ3 TRP 121.5 1.3 +CH2-CZ3-CE3 TRP 121.1 1.3 +CZ3-CE3-CD2 TRP 118.6 1.3 +CE3-CD2-CG TRP 133.9 1.0 +CE3-CD2-CE2 TRP 118.8 1.0 +CG-CD2-CE2 TRP 107.2 1.2 +N-CA-C TYR 111.2 2.8 +CA-C-O TYR 120.8 1.7 +N-CA-CB TYR 110.5 1.7 +C-CA-CB TYR 110.1 1.9 +CA-CB-CG TYR 113.9 1.8 +CB-CG-CD1 TYR 120.8 1.5 +CB-CG-CD2 TYR 120.8 1.5 +CG-CD1-CE1 TYR 121.2 1.5 +CG-CD2-CE2 TYR 121.2 1.5 +CD1-CE1-CZ TYR 119.6 1.8 +CD2-CE2-CZ TYR 119.6 1.8 +CE1-CZ-CE2 TYR 120.3 2.0 +CD1-CG-CD2 TYR 118.1 1.5 +CE1-CZ-OH TYR 119.9 3.0 +CE2-CZ-OH TYR 119.9 3.0 +- + +Non-bonded distance Minimum Dist Tolerance +C-C 2.10 0.5 +C-N 2.10 0.5 +C-S 2.45 0.5 +C-O 2.25 0.5 +N-N 2.05 0.5 +N-S 2.55 0.5 +N-O 2.10 0.5 +O-S 2.45 0.5 +O-O 2.05 0.5 +S-S 1.80 0.5 +- + + + + + + + + + + + + + + + + + + + + diff --git a/modules/mol/base/pymod/CMakeLists.txt b/modules/mol/base/pymod/CMakeLists.txt index 87369f260e9e199fbcd107304f729f616d0d45c6..3f514b2b8afba9e8f95473898b9649da2b3afcb7 100644 --- a/modules/mol/base/pymod/CMakeLists.txt +++ b/modules/mol/base/pymod/CMakeLists.txt @@ -22,4 +22,6 @@ wrap_mol.cc export_entity_property_mapper.cc ) -pymod(NAME mol CPP ${OST_BASE_PYMOD_SOURCES} PY __init__.py) +if (NOT ENABLE_STATIC) + pymod(NAME mol CPP ${OST_BASE_PYMOD_SOURCES} PY __init__.py) +endif() diff --git a/modules/mol/base/pymod/wrap_mol.cc b/modules/mol/base/pymod/wrap_mol.cc index f29d1377f4bc0ccf14289b50df67e994208e99e5..33b09e2f20b4c1126f05cf501c04a599663048f9 100644 --- a/modules/mol/base/pymod/wrap_mol.cc +++ b/modules/mol/base/pymod/wrap_mol.cc @@ -19,7 +19,9 @@ #include <boost/python.hpp> #include <ost/mol/transform.hh> #include <ost/mol/editor_base.hh> +#if(OST_INFO_ENABLED) #include <ost/info/info.hh> +#endif using namespace boost::python; using namespace ost::mol; @@ -95,7 +97,9 @@ BOOST_PYTHON_MODULE(_ost_mol) .def("ApplyZAxisTranslation",&Transform::ApplyZAxisTranslation) .def("ApplyAxisRotation",&Transform::ApplyAxisRotation) ; +#if(OST_INFO_ENABLED) def("TransformToInfo", &TransformToInfo); def("TransformFromInfo", &TransformFromInfo); - +#endif + } diff --git a/modules/mol/base/src/CMakeLists.txt b/modules/mol/base/src/CMakeLists.txt index 1c2649f70ea0230dc4c5021afd9f2a618af60dcd..134eb4e25691507a50039077bdf58099b57ae9ea 100644 --- a/modules/mol/base/src/CMakeLists.txt +++ b/modules/mol/base/src/CMakeLists.txt @@ -100,7 +100,13 @@ foreach(_impl_src ${OST_MOL_IMPL_SOURCES}) list(APPEND OST_MOL_SOURCES impl/${_impl_src}) endforeach() +if(ENABLE_INFO) + set (INFO_DEPS ost_info) +else() + list(APPEND LINK ${Boost_REGEX_LIBRARY}) +endif() + module(NAME mol SOURCES ${OST_MOL_SOURCES} HEADERS ${OST_MOL_IMPL_HEADERS} IN_DIR impl ${OST_MOL_HEADERS} HEADER_OUTPUT_DIR ost/mol - DEPENDS_ON ost_geom ost_base ost_info) + DEPENDS_ON ost_geom ost_base ${INFO_DEPS}) diff --git a/modules/mol/base/src/transform.cc b/modules/mol/base/src/transform.cc index ffee262dec1767ac26e6645ead08fb3d8bd3acf6..c1ffbff6b8a34bf6016d01fba72deeba8a2f4fdb 100644 --- a/modules/mol/base/src/transform.cc +++ b/modules/mol/base/src/transform.cc @@ -16,9 +16,12 @@ // along with this library; if not, write to the Free Software Foundation, Inc., // 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA //------------------------------------------------------------------------------ + +#include <ost/config.hh> +#if(OST_INFO_ENABLED) #include <ost/info/info.hh> #include <ost/info/geom_info_conversion.hh> - +#endif #include "transform.hh" namespace ost { @@ -193,6 +196,7 @@ void Transform::update_tm() ttm_ = Transpose(tm_); } +#if(OST_INFO_ENABLED) Transform TransformFromInfo(const info::InfoGroup& group) { if (!group.HasItem("center")) { @@ -222,5 +226,6 @@ void TransformToInfo(const Transform& transform, info::InfoGroup& group) info::InfoGroup rot=group.CreateGroup("rotation"); info::Mat3ToInfo(transform.GetRot(), rot); } +#endif }} // ns diff --git a/modules/mol/base/src/transform.hh b/modules/mol/base/src/transform.hh index 5c9acd27605bbff805b40eaac297c83219cd5582..1ed33135e1ca1287f0e2c9debc151aeacca069cc 100644 --- a/modules/mol/base/src/transform.hh +++ b/modules/mol/base/src/transform.hh @@ -23,8 +23,11 @@ Author: Ansgar Philippsen */ +#include <ost/config.hh> #include <ost/geom/geom.hh> +#if(OST_INFO_ENABLED) #include <ost/info/info_fw.hh> +#endif #include <ost/mol/module_config.hh> namespace ost { namespace mol { @@ -81,6 +84,7 @@ private: void update_tm(); }; +#if(OST_INFO_ENABLED) /// \brief read transformation from info group /// \relates Transform Transform DLLEXPORT_OST_MOL TransformFromInfo(const info::InfoGroup& group); @@ -88,6 +92,7 @@ Transform DLLEXPORT_OST_MOL TransformFromInfo(const info::InfoGroup& group); /// \relates Transform void DLLEXPORT_OST_MOL TransformToInfo(const Transform& transform, info::InfoGroup& group); +#endif }} // ns #endif diff --git a/modules/seq/alg/pymod/CMakeLists.txt b/modules/seq/alg/pymod/CMakeLists.txt index dfe07488ea145a451a10f6bb6a47facbc9b3cf40..0821b510a21cb8ad806b21a958a3592f24f6679f 100644 --- a/modules/seq/alg/pymod/CMakeLists.txt +++ b/modules/seq/alg/pymod/CMakeLists.txt @@ -1,7 +1,8 @@ set(OST_SEQ_ALG_PYMOD_SOURCES wrap_seq_alg.cc ) - -pymod(NAME seq_alg OUTPUT_DIR ost/seq/alg - CPP ${OST_SEQ_ALG_PYMOD_SOURCES} - PY __init__.py mat.py renumber.py) +if (NOT ENABLE_STATIC) + pymod(NAME seq_alg OUTPUT_DIR ost/seq/alg + CPP ${OST_SEQ_ALG_PYMOD_SOURCES} + PY __init__.py mat.py renumber.py) +endif() diff --git a/modules/seq/alg/src/CMakeLists.txt b/modules/seq/alg/src/CMakeLists.txt index fe23aa52cce246216e0aeb8b10c578f795e27881..ccffcacf464cc22d85f62a6d5190067b76622cb7 100644 --- a/modules/seq/alg/src/CMakeLists.txt +++ b/modules/seq/alg/src/CMakeLists.txt @@ -16,10 +16,13 @@ local_align.cc global_align.cc sequence_identity.cc ins_del.cc -subst_weight_matrix.cc conservation.cc ) +if (ENABLE_INFO) + list (APPEND OST_SEQ_ALG_SOURCES subst_weight_matrix.cc) +endif() + module(NAME seq_alg HEADER_OUTPUT_DIR ost/seq/alg SOURCES ${OST_SEQ_ALG_SOURCES} HEADERS ${OST_SEQ_ALG_HEADERS} DEPENDS_ON ost_seq) diff --git a/modules/seq/alg/src/subst_weight_matrix.hh b/modules/seq/alg/src/subst_weight_matrix.hh index f310893ab6a002a830d432a0b07d0547fbb3943d..97f0ef825cb45dda7e2572558b2917498e87a353 100644 --- a/modules/seq/alg/src/subst_weight_matrix.hh +++ b/modules/seq/alg/src/subst_weight_matrix.hh @@ -21,7 +21,11 @@ #include <ctype.h> #include <string.h> +#include <boost/shared_ptr.hpp> +#include <ost/config.hh> +#if(OST_INFO_ENABLED) #include <ost/info/info_fw.hh> +#endif #include <ost/seq/alg/module_config.hh> /* @@ -86,12 +90,14 @@ private: WeightType weights_[ALPHABET_SIZE*ALPHABET_SIZE]; }; +#if(OST_INFO_ENABLED) SubstWeightMatrixPtr DLLEXPORT_OST_SEQ_ALG SubstWeightMatrixFromInfo(const info::InfoGroup& group); void DLLEXPORT_OST_SEQ_ALG SubstWeightMatrixToInfo(const SubstWeightMatrixPtr& subst_mat, info::InfoGroup& group); +#endif }}} diff --git a/modules/seq/base/pymod/CMakeLists.txt b/modules/seq/base/pymod/CMakeLists.txt index af105daed127eca4d4bd3d0fb7e11656d6e5e05a..f2aac4ea51cb0cd57fed4d304199db0a420158fb 100644 --- a/modules/seq/base/pymod/CMakeLists.txt +++ b/modules/seq/base/pymod/CMakeLists.txt @@ -3,4 +3,6 @@ set(OST_SEQ_PYMOD_SOURCES wrap_seq.cc ) -pymod(NAME seq CPP ${OST_SEQ_PYMOD_SOURCES} PY __init__.py) +if (NOT ENABLE_STATIC) + pymod(NAME seq CPP ${OST_SEQ_PYMOD_SOURCES} PY __init__.py) +endif() diff --git a/modules/seq/base/pymod/export_sequence.cc b/modules/seq/base/pymod/export_sequence.cc index 5ec0f088fe1bca98b9486936faeb6041d48c236f..269ce3a7cb584704d5074505180d653ffe93539c 100644 --- a/modules/seq/base/pymod/export_sequence.cc +++ b/modules/seq/base/pymod/export_sequence.cc @@ -25,7 +25,10 @@ #include <ost/export_helper/pair_to_tuple_conv.hh> #include <ost/generic_property.hh> #include <ost/export_helper/generic_property_def.hh> +#include <ost/config.hh> +#if(OST_INFO_ENABLED) #include <ost/info/info.hh> +#endif #include <ost/mol/mol.hh> #include <ost/seq/sequence_handle.hh> #include <ost/seq/alignment_handle.hh> @@ -412,13 +415,15 @@ void export_sequence() def("CreateSequenceList", &CreateSequenceList); def("SequenceFromChain", seq_from_chain_a); def("SequenceFromChain", seq_from_chain_b); +#if(OST_INFO_ENABLED) def("SequenceToInfo", &SequenceToInfo); + def("SequenceListToInfo", &SequenceListToInfo); + def("SequenceFromInfo", &SequenceFromInfo); + def("SequenceListFromInfo", &SequenceListFromInfo); +#endif def("ViewsFromSequences", &ViewsFromSequences, (arg("seq1"), arg("seq2"))); def("ViewsFromAlignment", &ViewsFromAlignment, (arg("aln"), arg("index1")=0, arg("index2")=1)); - def("SequenceListToInfo", &SequenceListToInfo); - def("SequenceFromInfo", &SequenceFromInfo); def("CreateAlignment", &CreateAlignment); def("AlignmentFromSequenceList", &AlignmentFromSequenceList); - def("SequenceListFromInfo", &SequenceListFromInfo); } diff --git a/modules/seq/base/src/CMakeLists.txt b/modules/seq/base/src/CMakeLists.txt index 6a22a5ad2a575ca7f633a6bde5c00ae31d1ed2b9..8ef75076e739e4cf90e01e97f5e9582f22cd67cf 100644 --- a/modules/seq/base/src/CMakeLists.txt +++ b/modules/seq/base/src/CMakeLists.txt @@ -29,8 +29,13 @@ alignment_handle.cc sequence_op.cc views_from_sequences.cc ) -module(NAME seq SOURCES ${OST_SEQ_SOURCES} - HEADERS ${OST_SEQ_IMPL_HEADERS} IN_DIR impl - ${OST_SEQ_HEADERS} - DEPENDS_ON ost_info ost_mol) +if (ENABLE_INFO) + set(INFO_DEPS ost_info) +endif() + + +module(NAME seq SOURCES ${OST_SEQ_SOURCES} + HEADERS ${OST_SEQ_IMPL_HEADERS} IN_DIR impl + ${OST_SEQ_HEADERS} + DEPENDS_ON ost_mol ${INFO_DEPS}) \ No newline at end of file diff --git a/modules/seq/base/src/impl/sequence_impl.cc b/modules/seq/base/src/impl/sequence_impl.cc index 2a0570b37e9795372f36983353b3ea7502692dc9..733eaf1b8e17f765581a4cb1e527beb2bf3483ef 100644 --- a/modules/seq/base/src/impl/sequence_impl.cc +++ b/modules/seq/base/src/impl/sequence_impl.cc @@ -21,8 +21,11 @@ */ #include <boost/format.hpp> - +#include <ost/config.hh> +#if(OST_INFO_ENABLED) #include <ost/info/info.hh> +#endif + #include <ost/integrity_error.hh> #include <ost/mol/chain_view.hh> @@ -281,6 +284,7 @@ bool SequenceImpl::HasAttachedView() const return attached_view_.IsValid(); } +#if(OST_INFO_ENABLED) void SequenceImplToInfo(const SequenceImplPtr& sequence, info::InfoGroup& group) { group.SetTextData(sequence->GetString()); @@ -301,6 +305,7 @@ SequenceImplPtr SequenceImplFromInfo(const info::InfoGroup& group) sequence->SetOffset(offset); return sequence; } +#endif int SequenceImpl::GetFirstNonGap() const { diff --git a/modules/seq/base/src/impl/sequence_impl.hh b/modules/seq/base/src/impl/sequence_impl.hh index 05ba042f0b1db1ac933760eff20302618f731b23..fecad2ca921599ecd85c58ee33e6c184bdbd5a52 100644 --- a/modules/seq/base/src/impl/sequence_impl.hh +++ b/modules/seq/base/src/impl/sequence_impl.hh @@ -27,7 +27,10 @@ #include <boost/shared_ptr.hpp> #include <ost/generic_property.hh> +#include <ost/config.hh> +#if(OST_INFO_ENABLED) #include <ost/info/info_fw.hh> +#endif #include <ost/mol/residue_prop.hh> #include <ost/mol/entity_view.hh> #include <ost/mol/residue_view.hh> @@ -186,14 +189,15 @@ private: /// \internal typedef std::vector<SequenceImplPtr> SequenceList; +#if(OST_INFO_ENABLED) /// \internal -void DLLEXPORT_OST_SEQ SequenceImplToInfo(const SequenceImplPtr& sequence, - info::InfoGroup& group); -/// \internal -SequenceImplPtr DLLEXPORT_OST_SEQ +SequenceImplPtr DLLEXPORT_OST_SEQ SequenceImplFromInfo(const info::InfoGroup& group); /// \internal -SequenceImplFromInfo(const info::InfoGroup& group); +void DLLEXPORT_OST_SEQ SequenceImplToInfo(const SequenceImplPtr& sequence, + info::InfoGroup& group); +#endif + }}} //ns #endif diff --git a/modules/seq/base/src/impl/sequence_list_impl.cc b/modules/seq/base/src/impl/sequence_list_impl.cc index bd332872bb1c2b1d531d50a3aa820e7fb5f083ac..6580aac92bf8032f3b40de53a28a3df23670565f 100644 --- a/modules/seq/base/src/impl/sequence_list_impl.cc +++ b/modules/seq/base/src/impl/sequence_list_impl.cc @@ -18,7 +18,10 @@ //------------------------------------------------------------------------------ #include <limits> +#include <ost/config.hh> +#if(OST_INFO_ENABLED) #include <ost/info/info.hh> +#endif #include <ost/seq/impl/sequence_list_impl.hh> namespace ost { namespace seq { namespace impl { @@ -154,6 +157,7 @@ SequenceListImplPtr SequenceListImpl::Copy() const return new_ali; } +#if(OST_INFO_ENABLED) void SequenceListImplToInfo(const SequenceListImplPtr& seq_list, info::InfoGroup& group) { @@ -175,6 +179,7 @@ SequenceListImplPtr SequenceListImplFromInfo(info::InfoGroup& group) } return seq_list; } +#endif SequenceListImplPtr SequenceListImpl::Slice(int first, int n) const { diff --git a/modules/seq/base/src/impl/sequence_list_impl.hh b/modules/seq/base/src/impl/sequence_list_impl.hh index 52443dcd64178222c688918aae9ee94dd27267f7..cb69e41ead9bfbc91975b3ce5062bde00b836eef 100644 --- a/modules/seq/base/src/impl/sequence_list_impl.hh +++ b/modules/seq/base/src/impl/sequence_list_impl.hh @@ -94,6 +94,7 @@ private: std::vector<SequenceImplPtr> list_; }; +#if(OST_INFO_ENABLED) /// \brief export sequence list impl to info /// \internal void DLLEXPORT_OST_SEQ @@ -104,6 +105,7 @@ SequenceListImplToInfo(const SequenceListImplPtr& seq_list, /// \internal SequenceListImplPtr DLLEXPORT_OST_SEQ SequenceListImplFromInfo(info::InfoGroup& group); +#endif }}} diff --git a/modules/seq/base/src/sequence_handle.cc b/modules/seq/base/src/sequence_handle.cc index 8f0d6cce7cae08564d50a81d9b09dc5923a00991..627ebdc36ee0501a7ff5fcf2926af7c199dae592 100644 --- a/modules/seq/base/src/sequence_handle.cc +++ b/modules/seq/base/src/sequence_handle.cc @@ -226,6 +226,8 @@ void SequenceHandle::AttachView(const mol::EntityView& view, Impl()->AttachView(view, chain_name); } +#if(OST_INFO_ENABLED) + /// \brief export sequence to info void SequenceToInfo(const ConstSequenceHandle& sequence, info::InfoGroup& group) @@ -238,6 +240,8 @@ SequenceHandle SequenceFromInfo(info::InfoGroup& group) { return SequenceHandle(impl::SequenceImplFromInfo(group)); } +#endif + std::ostream& operator<<(std::ostream& os, const ConstSequenceHandle& sequence) diff --git a/modules/seq/base/src/sequence_handle.hh b/modules/seq/base/src/sequence_handle.hh index 103c6aeb43156039960cdfd3eed8b375fe7f672f..937387c797bc42f28b0fe902f1e9af256d6fa416 100644 --- a/modules/seq/base/src/sequence_handle.hh +++ b/modules/seq/base/src/sequence_handle.hh @@ -25,7 +25,10 @@ #include <ost/base.hh> #include <ost/generic_property.hh> +#include <ost/config.hh> +#if(OST_INFO_ENABLED) #include <ost/info/info_fw.hh> +#endif #include <ost/seq/module_config.hh> #include <ost/mol/residue_view.hh> @@ -302,13 +305,15 @@ private: SequenceHandle DLLEXPORT_OST_SEQ CreateSequence(const String& name, const String& seq, const String& role="UNKNOWN"); - +#if(OST_INFO_ENABLED) /// \brief export sequence to info void DLLEXPORT_OST_SEQ SequenceToInfo(const ConstSequenceHandle& sequence, info::InfoGroup& group); /// \brief create sequence from info SequenceHandle DLLEXPORT_OST_SEQ SequenceFromInfo(info::InfoGroup& group); +#endif + DLLEXPORT_OST_SEQ std::ostream& operator<<(std::ostream& os, const ConstSequenceHandle& sequence); diff --git a/modules/seq/base/src/sequence_list.cc b/modules/seq/base/src/sequence_list.cc index eb45568fdbb639c1a14eab4732f076f9d500bcee..52474a3d71b40ccb2498bcc245f4564755fda048 100644 --- a/modules/seq/base/src/sequence_list.cc +++ b/modules/seq/base/src/sequence_list.cc @@ -22,7 +22,10 @@ */ #include <ost/invalid_handle.hh> +#include <ost/config.hh> +#if(OST_INFO_ENABLED) #include <ost/info/info.hh> +#endif #include <ost/seq/impl/sequence_list_impl.hh> #include <ost/seq/sequence_list.hh> @@ -180,6 +183,7 @@ int SequenceList::GetMaxLength() const return impl_->GetMaxLength(); } +#if(OST_INFO_ENABLED) /// \brief export sequence list to info void SequenceListToInfo(const ConstSequenceList& seq_list, info::InfoGroup& group) @@ -192,6 +196,7 @@ SequenceList SequenceListFromInfo(info::InfoGroup& group) { return SequenceList(impl::SequenceListImplFromInfo(group)); } +#endif SequenceList::operator ConstSequenceList() const { diff --git a/modules/seq/base/src/sequence_list.hh b/modules/seq/base/src/sequence_list.hh index 71067438d0404a0af7c41a6138b3fb09c403433f..2e6895c6e62b19b52e31aad3cebc1d9de8904cec 100644 --- a/modules/seq/base/src/sequence_list.hh +++ b/modules/seq/base/src/sequence_list.hh @@ -124,12 +124,14 @@ protected: SequenceList DLLEXPORT_OST_SEQ CreateSequenceList(); ConstSequenceList DLLEXPORT_OST_SEQ CreateConstSequenceList(); +#if(OST_INFO_ENABLED) /// \brief export sequence list to info void DLLEXPORT_OST_SEQ SequenceListToInfo(const ConstSequenceList& seq_list, info::InfoGroup& group); /// \brief create sequence list object from info SequenceList DLLEXPORT_OST_SEQ SequenceListFromInfo(info::InfoGroup& group); +#endif }} #endif diff --git a/scripts/CMakeLists.txt b/scripts/CMakeLists.txt index 734e377e86e68961beddc9c96b444c6bb9cec86b..0b6b429a45beebc7c2233d65218dba89fa86f32d 100644 --- a/scripts/CMakeLists.txt +++ b/scripts/CMakeLists.txt @@ -12,32 +12,34 @@ else() add_dependencies(ost_scripts _ost_io) endif() -if(WIN32) - script(NAME dng.bat INPUT dng.bat.in SUBSTITUTE ${SUBST_DICT} - TARGET ost_scripts) - script(NAME ost.bat INPUT ost.bat.in SUBSTITUTE ${SUBST_DICT} - TARGET ost_scripts) - script(NAME gipltng.bat INPUT gipltng.bat.in SUBSTITUTE ${SUBST_DICT}) -else() - script(NAME ost_config INPUT ost_config.in SUBSTITUTE ${SUBST_DICT} - TARGET ost_scripts OUTPUT_DIR ${LIBEXEC_PATH}) - script(NAME ost INPUT ost.in SUBSTITUTE ${SUBST_DICT} - TARGET ost_scripts) - if (ENABLE_GUI) - script(NAME dng INPUT dng.in SUBSTITUTE ${SUBST_DICT} +if (NOT ENABLE_STATIC) + if(WIN32) + script(NAME dng.bat INPUT dng.bat.in SUBSTITUTE ${SUBST_DICT} + TARGET ost_scripts) + script(NAME ost.bat INPUT ost.bat.in SUBSTITUTE ${SUBST_DICT} TARGET ost_scripts) + script(NAME gipltng.bat INPUT gipltng.bat.in SUBSTITUTE ${SUBST_DICT}) + else() + script(NAME ost_config INPUT ost_config.in SUBSTITUTE ${SUBST_DICT} + TARGET ost_scripts OUTPUT_DIR ${LIBEXEC_PATH}) + script(NAME ost INPUT ost.in SUBSTITUTE ${SUBST_DICT} + TARGET ost_scripts) + if (ENABLE_GUI) + script(NAME dng INPUT dng.in SUBSTITUTE ${SUBST_DICT} + TARGET ost_scripts) + endif() endif() -endif() -set(INIT_SCRIPTS - init_cl.py -) + set(INIT_SCRIPTS + init_cl.py + ) -if (ENABLE_GUI) - list(APPEND INIT_SCRIPTS init.py) -endif() -copy_if_different("./" "${STAGE_DIR}/${LIB_DIR}/openstructure" + if (ENABLE_GUI) + list(APPEND INIT_SCRIPTS init.py) + endif() + copy_if_different("./" "${STAGE_DIR}/${LIB_DIR}/openstructure" "${INIT_SCRIPTS}" "python init scripts" ost_scripts) -install(FILES ${INIT_SCRIPTS} DESTINATION "${LIB_DIR}/openstructure") + install(FILES ${INIT_SCRIPTS} DESTINATION "${LIB_DIR}/openstructure") +endif() diff --git a/scripts/README.txt b/scripts/README.txt new file mode 100644 index 0000000000000000000000000000000000000000..5258171c4e6d10fd9d21b7c877ddc4db7691d2cc --- /dev/null +++ b/scripts/README.txt @@ -0,0 +1,10 @@ +1. Setup the rpm build environment (See guides on the web) +2. Checkout openstructure source in a fodler called 'openstructure-1.1d' +3. Copy the compounds.chemlib into the folder +4. Remove '.git' and '.gitignore' from the folder +5. COmpress the source with 'tar -cJvf openstructuere.tar.xz openstructure-1.1d' +6. Put the zipped source in '~/rpmbuild/SOURCES' +7. Put the desktop file in '~/rpmbuild/SOURCES' +8. Put the spec file in '~/rpmbuild/SPECS' +9. Go the the 'SPECS' directory and build with 'rpmbuild -ba openstructure.spec' +