@@ -28,28 +28,28 @@ 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 , intf_array_size , * 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 ;
47
+ intf_array_size = 1 ;
46
48
47
- if (PyArg_ParseTuple (args , "OOOOOOOOOOOOOO" ,
49
+ if (PyArg_ParseTuple (args , "OOOOOOOOOOOOOO|d " ,
48
50
& receptor_coordinates , & ligand_coordinates , & rec_charges , & lig_charges ,
49
51
& 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 );
52
+ & rec_asa , & lig_asa , & rec_des_energy , & lig_des_energy , interface_cutoff )) {
53
53
54
54
tmp0 = PyObject_GetAttrString (receptor_coordinates , "coordinates" );
55
55
tmp1 = PyObject_GetAttrString (ligand_coordinates , "coordinates" );
@@ -59,10 +59,10 @@ static PyObject * cpydock_calculate_energy(PyObject *self, PyObject *args) {
59
59
60
60
dims [1 ] = 3 ;
61
61
dims [0 ] = rec_len ;
62
- PyArray_AsCArray ((PyObject * * )& tmp0 , (void * * )& rec_array , dims , 2 , descr );
62
+ PyArray_AsCArray ((PyObject * * )& tmp0 , (void * * )& rec_array , dims , 2 , PyArray_DescrFromType ( NPY_DOUBLE ) );
63
63
64
64
dims [0 ] = lig_len ;
65
- PyArray_AsCArray ((PyObject * * )& tmp1 , (void * * )& lig_array , dims , 2 , descr );
65
+ PyArray_AsCArray ((PyObject * * )& tmp1 , (void * * )& lig_array , dims , 2 , PyArray_DescrFromType ( NPY_DOUBLE ) );
66
66
67
67
// Get pointers to the Python array structures
68
68
rec_c_charges = PyArray_GETPTR1 (rec_charges , 0 );
@@ -81,6 +81,10 @@ static PyObject * cpydock_calculate_energy(PyObject *self, PyObject *args) {
81
81
// Structures to store the atom at minimal distance of a given atom
82
82
min_rec_distance = malloc (rec_len * sizeof (double ));
83
83
min_lig_distance = malloc (lig_len * sizeof (double ));
84
+
85
+ interface_receptor = malloc (lig_len * sizeof (unsigned int ));
86
+ interface_ligand = malloc (lig_len * sizeof (unsigned int ));
87
+
84
88
for (i = 0 ; i < rec_len ; i ++ ) min_rec_distance [i ] = HUGE_DISTANCE ;
85
89
for (j = 0 ; j < lig_len ; j ++ ) min_lig_distance [j ] = HUGE_DISTANCE ;
86
90
@@ -109,14 +113,26 @@ static PyObject * cpydock_calculate_energy(PyObject *self, PyObject *args) {
109
113
}
110
114
111
115
// Van der Waals energy
112
- if (distance2 <= VDW_DIST_CUTOFF2 ){
116
+ if (distance2 <= VDW_DIST_CUTOFF2 ) {
113
117
vdw_energy = sqrt (rec_c_vdw [i ] * lig_c_vdw [j ]);
114
118
vdw_radius = rec_c_vdw_radii [i ] + lig_c_vdw_radii [j ];
115
119
p6 = pow (vdw_radius , 6 ) / pow (distance2 , 3 );
116
120
k = vdw_energy * (p6 * p6 - 2.0 * p6 );
117
121
if (k > VDW_CUTOFF ) k = VDW_CUTOFF ;
118
122
total_vdw += k ;
119
123
}
124
+
125
+ if (sqrt (distance2 ) <= interface_cutoff ) {
126
+ interface_receptor [interface_len ] = i ;
127
+ interface_ligand [interface_len ++ ] = j ;
128
+ }
129
+
130
+ }
131
+
132
+ if (((interface_len + lig_len - 1 )/lig_len + 1 ) > intf_array_size ) {
133
+ intf_array_size ++ ;
134
+ interface_receptor = realloc (interface_receptor , intf_array_size * lig_len * sizeof (unsigned int ));
135
+ interface_ligand = realloc (interface_ligand , intf_array_size * lig_len * sizeof (unsigned int ));
120
136
}
121
137
}
122
138
// Convert total electrostatics to Kcal/mol:
@@ -146,18 +162,23 @@ static PyObject * cpydock_calculate_energy(PyObject *self, PyObject *args) {
146
162
// Free structures
147
163
PyArray_Free (tmp0 , rec_array );
148
164
PyArray_Free (tmp1 , lig_array );
149
- Py_DECREF (descr );
150
165
Py_DECREF (tmp0 );
151
166
Py_DECREF (tmp1 );
152
167
free (min_rec_distance );
153
168
free (min_lig_distance );
154
169
}
155
170
171
+ interface_receptor = realloc (interface_receptor , interface_len * sizeof (unsigned int ));
172
+ interface_ligand = realloc (interface_ligand , interface_len * sizeof (unsigned int ));
173
+ dims [0 ] = interface_len ;
174
+
156
175
// Return a tuple with the following values for calculated energies:
157
176
PyTuple_SetItem (result , 0 , PyFloat_FromDouble (total_elec ));
158
177
PyTuple_SetItem (result , 1 , PyFloat_FromDouble (total_vdw ));
159
178
PyTuple_SetItem (result , 2 , PyFloat_FromDouble (total_solvation_rec ));
160
179
PyTuple_SetItem (result , 3 , PyFloat_FromDouble (total_solvation_lig ));
180
+ PyTuple_SetItem (result , 4 , PyArray_SimpleNewFromData (1 , dims , NPY_UINT , interface_receptor ));
181
+ PyTuple_SetItem (result , 5 , PyArray_SimpleNewFromData (1 , dims , NPY_UINT , interface_ligand ));
161
182
return result ;
162
183
}
163
184
0 commit comments