Menu

#157 better perl bindings for rmsd calculations

2.3
open
API (57)
5
2012-10-23
2010-09-27
David Koes
No

I was trying to use the Perl interface to OpenBabel to do some RMSD calculations and found I couldn't since key functionality seemed to be missing. Specifically, the ability to manipulate SWIG C arrays in perl and access to a couple functions. Here are the changes I made to get things to work:

include/openbabel/obutil.h
156,164d155
< #ifndef __KCC
< extern "C" {
< OBAPI void rotate_coords(double,double m[3][3],unsigned int);
< OBAPI double calc_rms(double
,double,unsigned int);
< }
< #else
< OBAPI void rotate_coords(double
,double m[3][3],unsigned int);
< OBAPI double calc_rms(double,double,unsigned int);
< #endif
165a157,159

OBAPI void rotate_coords(double,double m[3][3],int);
OBAPI double calc_rms(double
,double*,unsigned int);

scripts/openbabel-perl.i
163,188d162
< // Add some helper functions for C arrays
< %inline %{
< double double_array(int size) {
< return (double
) malloc(sizeof(double)size);
< }
< void double_destroy(int
a) {
< free(a);
< }
< void double_set(double a, int i, double val) {
< a[i] = val;
< }
< double double_get(double
a, int i) {
< return a[i];
< }
<
< double (rotation_matrix())[3] {
< return (double (
)[3]) malloc(9sizeof(double));
< }
<
< void rotation_matrix_free(double (
m)[3])
< {
< free(m);
< }
<
< %}
<

Discussion

  • Geoff Hutchison

    Geoff Hutchison - 2010-09-27

    I don't know what version you've used for the patch -- it's definitely not SVN trunk. Could you e-mail me a patch for SVN trunk?

    Thanks very much,
    -Geoff

     
  • David Koes

    David Koes - 2010-09-28

    That was comparing against 2.2.3. Here's the diff for the trunk (note that rotate_coord had the wrong prototype, this is a subtle bug that is also fixed):

    Index: include/openbabel/obutil.h

    --- include/openbabel/obutil.h (revision 4112)
    +++ include/openbabel/obutil.h (working copy)
    @@ -153,10 +153,17 @@
    };

    //RMS helper methods/
    +#ifndef __KCC
    + extern "C" {
    + OBAPI void rotate_coords(double,double m[3][3],unsigned);
    + OBAPI double calc_rms(double
    ,double,unsigned int);
    + }
    +#else
    + OBAPI void rotate_coords(double
    ,double m[3][3],unsigned);
    + OBAPI double calc_rms(double,double,unsigned int);
    +#endif
    +
    #ifndef SWIG
    - OBAPI void rotate_coords(double,double m[3][3],int);
    - OBAPI double calc_rms(double
    ,double*,unsigned int);
    -
    //! \name String conversion utilities
    //@{
    // Documentation in obutil.cpp
    Index: scripts/openbabel-perl.i
    ===================================================================
    --- scripts/openbabel-perl.i (revision 4112)
    +++ scripts/openbabel-perl.i (working copy)
    @@ -276,6 +276,30 @@
    }
    %}

    +// Add some helper functions for C arrays
    +%inline %{
    +double double_array(int size) {
    + return (double
    ) malloc(sizeof(double)size);
    +}
    +void double_destroy(int
    a) {
    + free(a);
    +}
    +void double_set(double a, int i, double val) {
    + a[i] = val;
    +}
    +double double_get(double
    a, int i) {
    + return a[i];
    +}
    +
    +double (rotation_matrix())[3] {
    + return (double (
    )[3]) malloc(9sizeof(double));
    + }
    +
    +void rotation_matrix_free(double (
    m)[3]) {
    + free(m);
    +}
    +%}
    +
    %define MAKE_ITER_CLASS(itername, renamediter)
    %rename itername renamediter;
    %perlcode %{