@@ -28,28 +28,27 @@ static PyObject * cpydock_calculate_energy(PyObject *self, PyObject *args) {
28
28
PyArrayObject * rec_charges , * lig_charges , * rec_vdw , * lig_vdw , * rec_vdw_radii , * lig_vdw_radii = NULL ;
29
29
PyArrayObject * rec_hydrogens , * lig_hydrogens , * rec_asa , * lig_asa , * rec_des_energy , * lig_des_energy = NULL ;
30
30
double atom_elec , total_elec , total_vdw , total_solvation_rec , total_solvation_lig , vdw_energy , vdw_radius , p6 , k , solv_rec , solv_lig ;
31
- unsigned int rec_len , lig_len , i , j ;
32
- double * * rec_array , * * lig_array , x , y , z , distance2 ;
31
+ unsigned int rec_len , lig_len , i , j , interface_len , * interface_receptor , * interface_ligand ;
32
+ double * * rec_array , * * lig_array , x , y , z , distance2 , interface_cutoff ;
33
33
npy_intp dims [2 ];
34
- PyArray_Descr * descr ;
35
34
double * rec_c_charges , * lig_c_charges , * rec_c_vdw , * lig_c_vdw , * rec_c_vdw_radii , * lig_c_vdw_radii = NULL ;
36
35
double * rec_c_asa , * lig_c_asa , * rec_c_des_energy , * lig_c_des_energy = NULL ;
37
36
unsigned int * rec_c_hydrogens , * lig_c_hydrogens = NULL ;
38
37
double * min_rec_distance , * min_lig_distance = NULL ;
39
- PyObject * result = PyTuple_New (4 );
38
+ PyObject * result = PyTuple_New (6 );
40
39
41
40
total_elec = 0.0 ;
42
41
atom_elec = 0.0 ;
43
42
total_vdw = 0.0 ;
44
43
total_solvation_rec = 0.0 ;
45
44
total_solvation_lig = 0.0 ;
45
+ interface_cutoff = 3.9 ;
46
+ interface_len = 0 ;
46
47
47
- if (PyArg_ParseTuple (args , "OOOOOOOOOOOOOO" ,
48
+ if (PyArg_ParseTuple (args , "OOOOOOOOOOOOOO|d " ,
48
49
& receptor_coordinates , & ligand_coordinates , & rec_charges , & lig_charges ,
49
50
& rec_vdw , & lig_vdw , & rec_vdw_radii , & lig_vdw_radii , & rec_hydrogens , & lig_hydrogens ,
50
- & rec_asa , & lig_asa , & rec_des_energy , & lig_des_energy )) {
51
-
52
- descr = PyArray_DescrFromType (NPY_DOUBLE );
51
+ & rec_asa , & lig_asa , & rec_des_energy , & lig_des_energy , interface_cutoff )) {
53
52
54
53
tmp0 = PyObject_GetAttrString (receptor_coordinates , "coordinates" );
55
54
tmp1 = PyObject_GetAttrString (ligand_coordinates , "coordinates" );
@@ -59,10 +58,10 @@ static PyObject * cpydock_calculate_energy(PyObject *self, PyObject *args) {
59
58
60
59
dims [1 ] = 3 ;
61
60
dims [0 ] = rec_len ;
62
- PyArray_AsCArray ((PyObject * * )& tmp0 , (void * * )& rec_array , dims , 2 , descr );
61
+ PyArray_AsCArray ((PyObject * * )& tmp0 , (void * * )& rec_array , dims , 2 , PyArray_DescrFromType ( NPY_DOUBLE ) );
63
62
64
63
dims [0 ] = lig_len ;
65
- PyArray_AsCArray ((PyObject * * )& tmp1 , (void * * )& lig_array , dims , 2 , descr );
64
+ PyArray_AsCArray ((PyObject * * )& tmp1 , (void * * )& lig_array , dims , 2 , PyArray_DescrFromType ( NPY_DOUBLE ) );
66
65
67
66
// Get pointers to the Python array structures
68
67
rec_c_charges = PyArray_GETPTR1 (rec_charges , 0 );
@@ -81,6 +80,8 @@ static PyObject * cpydock_calculate_energy(PyObject *self, PyObject *args) {
81
80
// Structures to store the atom at minimal distance of a given atom
82
81
min_rec_distance = malloc (rec_len * sizeof (double ));
83
82
min_lig_distance = malloc (lig_len * sizeof (double ));
83
+ interface_receptor = malloc (lig_len * sizeof (unsigned int ));
84
+ interface_ligand = malloc (lig_len * sizeof (unsigned int ));
84
85
for (i = 0 ; i < rec_len ; i ++ ) min_rec_distance [i ] = HUGE_DISTANCE ;
85
86
for (j = 0 ; j < lig_len ; j ++ ) min_lig_distance [j ] = HUGE_DISTANCE ;
86
87
@@ -109,14 +110,25 @@ static PyObject * cpydock_calculate_energy(PyObject *self, PyObject *args) {
109
110
}
110
111
111
112
// Van der Waals energy
112
- if (distance2 <= VDW_DIST_CUTOFF2 ){
113
+ if (distance2 <= VDW_DIST_CUTOFF2 ) {
113
114
vdw_energy = sqrt (rec_c_vdw [i ] * lig_c_vdw [j ]);
114
115
vdw_radius = rec_c_vdw_radii [i ] + lig_c_vdw_radii [j ];
115
116
p6 = pow (vdw_radius , 6 ) / pow (distance2 , 3 );
116
117
k = vdw_energy * (p6 * p6 - 2.0 * p6 );
117
118
if (k > VDW_CUTOFF ) k = VDW_CUTOFF ;
118
119
total_vdw += k ;
119
120
}
121
+
122
+ if (sqrt (distance2 ) <= interface_cutoff ) {
123
+ interface_receptor [interface_len ] = i ;
124
+ interface_ligand [interface_len ++ ] = j ;
125
+ }
126
+
127
+ }
128
+
129
+ if (!(interface_len %lig_len )) {
130
+ interface_receptor = realloc (interface_receptor , (interface_len /lig_len + 1 )* lig_len * sizeof (unsigned int ));
131
+ interface_ligand = realloc (interface_ligand , (interface_len /lig_len + 1 )* lig_len * sizeof (unsigned int ));
120
132
}
121
133
}
122
134
// Convert total electrostatics to Kcal/mol:
@@ -146,18 +158,23 @@ static PyObject * cpydock_calculate_energy(PyObject *self, PyObject *args) {
146
158
// Free structures
147
159
PyArray_Free (tmp0 , rec_array );
148
160
PyArray_Free (tmp1 , lig_array );
149
- Py_DECREF (descr );
150
161
Py_DECREF (tmp0 );
151
162
Py_DECREF (tmp1 );
152
163
free (min_rec_distance );
153
164
free (min_lig_distance );
154
165
}
155
166
167
+ interface_receptor = realloc (interface_receptor , interface_len * sizeof (unsigned int ));
168
+ interface_ligand = realloc (interface_ligand , interface_len * sizeof (unsigned int ));
169
+ dims [0 ] = interface_len ;
170
+
156
171
// Return a tuple with the following values for calculated energies:
157
172
PyTuple_SetItem (result , 0 , PyFloat_FromDouble (total_elec ));
158
173
PyTuple_SetItem (result , 1 , PyFloat_FromDouble (total_vdw ));
159
174
PyTuple_SetItem (result , 2 , PyFloat_FromDouble (total_solvation_rec ));
160
175
PyTuple_SetItem (result , 3 , PyFloat_FromDouble (total_solvation_lig ));
176
+ PyTuple_SetItem (result , 4 , PyArray_SimpleNewFromData (1 , dims , NPY_UINT , interface_receptor ));
177
+ PyTuple_SetItem (result , 5 , PyArray_SimpleNewFromData (1 , dims , NPY_UINT , interface_ligand ));
161
178
return result ;
162
179
}
163
180
0 commit comments