File: bind_valist.cpp

package info (click to toggle)
apbs 3.4.1-7
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 199,188 kB
  • sloc: ansic: 284,988; cpp: 60,416; fortran: 44,896; xml: 13,895; sh: 13,838; python: 8,105; yacc: 2,922; makefile: 1,428; f90: 989; objc: 448; lex: 294; awk: 266; sed: 205; java: 134; csh: 79
file content (97 lines) | stat: -rw-r--r-- 3,131 bytes parent folder | download | duplicates (3)
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
#include "bind_valist.hpp"

void Valist_load(Valist *self,
                 int size,
                 std::vector<double> x,
                 std::vector<double> y,
                 std::vector<double> z,
                 std::vector<double> chg,
                 std::vector<double> rad)
{

  int i, j;
  double pos[3];

  Vatom *atom;

  VASSERT(self != VNULL);

  self->atoms = static_cast<Vatom*>(Vmem_malloc(self->vmem, size, sizeof(Vatom)));
  self->number = size;
  for (i = 0; i < size; i++) {
    pos[0] = x[i];
    pos[1] = y[i];
    pos[2] = z[i];
    Vatom_setCharge(&(self->atoms[i]), chg[i]);
    Vatom_setRadius(&(self->atoms[i]), rad[i]);
    Vatom_setPosition(&(self->atoms[i]), pos);
    Vatom_setAtomID(&(self->atoms[i]), i);
  }

  self->center[0] = 0.0;
  self->center[1] = 0.0;
  self->center[2] = 0.0;
  self->maxrad = 0.0;
  self->charge = 0.0;

  /* Reset stat variables */
  atom = &(self->atoms[0]);
  for (i = 0; i < 3; i++) {
    self->maxcrd[i] = self->mincrd[i] = atom->position[i];
  }
  self->maxrad = atom->radius;

  for (i = 0; i < self->number; i++) {
    atom = &(self->atoms[i]);
    for (j = 0; j < 3; j++) {
      if (atom->position[j] < self->mincrd[j])
        self->mincrd[j] = atom->position[j];
      if (atom->position[j] > self->maxcrd[j])
        self->maxcrd[j] = atom->position[j];
    }
    if (atom->radius > self->maxrad) self->maxrad = atom->radius;
    self->charge = self->charge + atom->charge;
  }

  self->center[0] = 0.5 * (self->maxcrd[0] + self->mincrd[0]);
  self->center[1] = 0.5 * (self->maxcrd[1] + self->mincrd[1]);
  self->center[2] = 0.5 * (self->maxcrd[2] + self->mincrd[2]);
}

/**
 * @brief Class to bind sValist to C++ STL types for better interfacing
 * with python.
 */
struct Valist_glue : public Valist
{
  std::array<double, 3> center;   /**< Molecule center (xmin - xmax)/2, etc.*/
  std::array<double, 3> mincrd;   /**< Minimum coordinates */
  std::array<double, 3> maxcrd;   /**< Maximum coordinates */
  std::vector<Vatom> vatoms;       /**< Atom list */
};

void bind_valist(py::module &m)
{
  py::class_<Valist_glue>(m, "Valist")
    .def(py::init<>())
    .def("__del__", [](Valist* self) { Valist_dtor(&self); })
    .def("load", &Valist_load)
    .def("getAtomList"    , &Valist_getAtomList)
    .def("getCenterX"     , &Valist_getCenterX)
    .def("getCenterY"     , &Valist_getCenterY)
    .def("getCenterZ"     , &Valist_getCenterZ)
    .def("getNumberAtoms" , &Valist_getNumberAtoms)
    .def("getAtom"        , &Valist_getAtom)
    .def("memChk"         , &Valist_memChk)
    .def("readPQR"        , &Valist_readPQR)
    .def("readPDB"        , &Valist_readPDB)
    .def("readXML"        , &Valist_readXML)
    .def_readwrite("number"     , &Valist::number)
    .def_readwrite("center"     , &Valist_glue::center)
    .def_readwrite("mincrd"     , &Valist_glue::mincrd)
    .def_readwrite("maxcrd"     , &Valist_glue::maxcrd)
    .def_readwrite("maxrad"     , &Valist::maxrad)
    .def_readwrite("charge"     , &Valist::charge)
    .def_readwrite("vatoms"     , &Valist_glue::vatoms)
    .def_readwrite("vmem"       , &Valist::vmem);
}