File: search.cpp

package info (click to toggle)
gemmi 0.7.4%2Bds-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 6,644 kB
  • sloc: cpp: 64,445; python: 5,425; ansic: 4,545; sh: 374; makefile: 112; javascript: 86; f90: 42
file content (147 lines) | stat: -rw-r--r-- 6,747 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
// Copyright 2018 Global Phasing Ltd.

#include "gemmi/neighbor.hpp"
#include "gemmi/linkhunt.hpp"
#include "gemmi/bond_idx.hpp"
#include "common.h"
#include <nanobind/stl/bind_vector.h>
#include <nanobind/stl/string.h>
#include <nanobind/stl/vector.h>

using namespace gemmi;

NB_MAKE_OPAQUE(std::vector<NeighborSearch::Mark*>)

void add_search(nb::module_& m) {
  nb::class_<NeighborSearch> neighbor_search(m, "NeighborSearch");
  nb::class_<NeighborSearch::Mark>(neighbor_search, "Mark")
    .def_ro("pos", &NeighborSearch::Mark::pos)
    .def_ro("altloc", &NeighborSearch::Mark::altloc)
    .def_ro("element", &NeighborSearch::Mark::element)
    .def_ro("image_idx", &NeighborSearch::Mark::image_idx)
    .def_ro("chain_idx", &NeighborSearch::Mark::chain_idx)
    .def_ro("residue_idx", &NeighborSearch::Mark::residue_idx)
    .def_ro("atom_idx", &NeighborSearch::Mark::atom_idx)
    .def("to_cra", (CRA (NeighborSearch::Mark::*)(Model&) const)
                   &NeighborSearch::Mark::to_cra)
    .def("to_site", (SmallStructure::Site& (NeighborSearch::Mark::*)(SmallStructure&) const)
                    &NeighborSearch::Mark::to_site)
    .def("__repr__", [](const NeighborSearch::Mark& self) {
        return cat("<gemmi.NeighborSearch.Mark ", int(self.image_idx), " of atom ",
                   self.chain_idx, '/', self.residue_idx, '/', self.atom_idx,
                   " element ", self.element.name(), ">");
    });
  nb::bind_vector<std::vector<NeighborSearch::Mark*>>(m, "VectorMarkPtr");
  neighbor_search
    .def_ro("radius_specified", &NeighborSearch::radius_specified)
    .def(nb::init<Model&, const UnitCell&, double>(),
         nb::arg("model"), nb::arg("cell"), nb::arg("max_radius")/*,
         nb::keep_alive<1, 2>()*/)
    .def("__init__", [](NeighborSearch* ns, Structure& st,
                        double max_radius, int model_index) {
      new(ns) NeighborSearch(st.models.at(model_index), st.cell, max_radius);
    }, nb::arg("st"), nb::arg("max_radius"), nb::arg("model_index")=0,
        nb::keep_alive<1, 2>())
    .def(nb::init<SmallStructure&, double>(),
         nb::arg("small_structure"), nb::arg("max_radius"),
         nb::keep_alive<1, 2>())
    .def("populate", &NeighborSearch::populate, nb::arg("include_h")=true,
         "Usually run after constructing NeighborSearch.")
    .def("add_chain", &NeighborSearch::add_chain,
         nb::arg("chain"), nb::arg("include_h")=true)
    .def("add_atom", &NeighborSearch::add_atom,
         nb::arg("atom"), nb::arg("n_ch"), nb::arg("n_res"), nb::arg("n_atom"),
         "Lower-level alternative to populate()")
    .def("add_site", &NeighborSearch::add_site,
         nb::arg("site"), nb::arg("n"),
         "Lower-level alternative to populate() for SmallStructure")
    .def("find_atoms", &NeighborSearch::find_atoms,
         nb::arg("pos"), nb::arg("alt")='\0',
         nb::kw_only(), nb::arg("min_dist")=0, nb::arg("radius")=0,
         nb::rv_policy::move, nb::keep_alive<0, 1>())
    .def("find_neighbors", &NeighborSearch::find_neighbors,
         nb::arg("atom"), nb::arg("min_dist")=0, nb::arg("max_dist")=0,
         nb::rv_policy::move, nb::keep_alive<0, 1>())
    .def("find_nearest_atom", &NeighborSearch::find_nearest_atom,
         nb::arg("pos"), nb::arg("radius")=INFINITY,
         nb::rv_policy::reference_internal)
    .def("find_site_neighbors", &NeighborSearch::find_site_neighbors,
         nb::arg("atom"), nb::arg("min_dist")=0, nb::arg("max_dist")=0,
         nb::rv_policy::move, nb::keep_alive<0, 1>())
    .def("dist", &NeighborSearch::dist)
    .def("get_image_transformation", &NeighborSearch::get_image_transformation)
    .def_prop_ro("grid_cell",
        [](const NeighborSearch& self) { return self.grid.unit_cell; })
    .def("__repr__", [](const NeighborSearch& self) {
        return cat("<gemmi.NeighborSearch with grid ",
                   self.grid.nu, ", ", self.grid.nv, ", ", self.grid.nw, '>');
    });

  nb::class_<ContactSearch> contactsearch(m, "ContactSearch");
  nb::enum_<ContactSearch::Ignore> csignore(contactsearch, "Ignore");
  nb::class_<ContactSearch::Result> csresult(contactsearch, "Result");

  contactsearch
    .def(nb::init<double>())
    .def_rw("search_radius", &ContactSearch::search_radius)
    .def_rw("ignore", &ContactSearch::ignore)
    .def_rw("twice", &ContactSearch::twice)
    .def_rw("special_pos_cutoff_sq", &ContactSearch::special_pos_cutoff_sq)
    .def_rw("min_occupancy", &ContactSearch::min_occupancy)
    .def("setup_atomic_radii", &ContactSearch::setup_atomic_radii)
    .def("get_radius", [](const ContactSearch& self, Element el) {
        return self.get_radius(el.elem);
    })
    .def("set_radius", [](ContactSearch& self, Element el, float r) {
        self.set_radius(el.elem, r);
    })
    .def("find_contacts", &ContactSearch::find_contacts)
    ;

  csignore
    .value("Nothing", ContactSearch::Ignore::Nothing)
    .value("SameResidue", ContactSearch::Ignore::SameResidue)
    .value("AdjacentResidues", ContactSearch::Ignore::AdjacentResidues)
    .value("SameChain", ContactSearch::Ignore::SameChain)
    .value("SameAsu", ContactSearch::Ignore::SameAsu);

  csresult
    .def_ro("partner1", &ContactSearch::Result::partner1)
    .def_ro("partner2", &ContactSearch::Result::partner2)
    .def_ro("image_idx", &ContactSearch::Result::image_idx)
    .def_prop_ro("dist", [](ContactSearch::Result& self) {
        return std::sqrt(self.dist_sq);
    })
    ;

  nb::class_<LinkHunt> linkhunt(m, "LinkHunt");
  nb::class_<LinkHunt::Match> linkhuntmatch(linkhunt, "Match");
  linkhunt
    .def(nb::init<>())
    .def("index_chem_links", &LinkHunt::index_chem_links,
         nb::arg("monlib"), nb::arg("use_alias")=true, nb::keep_alive<1, 2>())
    .def("find_possible_links", &LinkHunt::find_possible_links,
         nb::arg("st"), nb::arg("bond_margin"), nb::arg("radius_margin"),
         nb::arg("ignore")=ContactSearch::Ignore::SameResidue)
    ;

  linkhuntmatch
    .def_ro("chem_link", &LinkHunt::Match::chem_link)
    .def_ro("chem_link_count", &LinkHunt::Match::chem_link_count)
    .def_ro("cra1", &LinkHunt::Match::cra1)
    .def_ro("cra2", &LinkHunt::Match::cra2)
    .def_ro("same_image", &LinkHunt::Match::same_image)
    .def_ro("bond_length", &LinkHunt::Match::bond_length)
    .def_ro("conn", &LinkHunt::Match::conn)
    ;

  nb::class_<BondIndex>(m, "BondIndex")
    .def(nb::init<const Model&>(), nb::keep_alive<1, 2>())
    .def("add_link", &BondIndex::add_link)
    .def("add_monomer_bonds", &BondIndex::add_monomer_bonds)
    .def("are_linked", &BondIndex::are_linked)
    .def("graph_distance", &BondIndex::graph_distance,
         nb::arg("a"), nb::arg("b"), nb::arg("same_index"),
         nb::arg("max_distance")=4)
    ;
}