rino 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (87) hide show
  1. data/README +44 -0
  2. data/Rakefile +123 -0
  3. data/ext/extconf.rb +26 -0
  4. data/ext/ruby_inchi_main.so +0 -0
  5. data/ext/src/aux2atom.h +2786 -0
  6. data/ext/src/comdef.h +148 -0
  7. data/ext/src/e_0dstereo.c +3014 -0
  8. data/ext/src/e_0dstereo.h +31 -0
  9. data/ext/src/e_comdef.h +57 -0
  10. data/ext/src/e_ctl_data.h +147 -0
  11. data/ext/src/e_ichi_io.c +498 -0
  12. data/ext/src/e_ichi_io.h +40 -0
  13. data/ext/src/e_ichi_parms.c +37 -0
  14. data/ext/src/e_ichi_parms.h +41 -0
  15. data/ext/src/e_ichicomp.h +50 -0
  16. data/ext/src/e_ichierr.h +40 -0
  17. data/ext/src/e_ichimain.c +593 -0
  18. data/ext/src/e_ichisize.h +43 -0
  19. data/ext/src/e_inchi_atom.c +75 -0
  20. data/ext/src/e_inchi_atom.h +33 -0
  21. data/ext/src/e_inpdef.h +41 -0
  22. data/ext/src/e_mode.h +706 -0
  23. data/ext/src/e_mol2atom.c +649 -0
  24. data/ext/src/e_readinch.c +58 -0
  25. data/ext/src/e_readmol.c +54 -0
  26. data/ext/src/e_readmol.h +180 -0
  27. data/ext/src/e_readstru.c +251 -0
  28. data/ext/src/e_readstru.h +33 -0
  29. data/ext/src/e_util.c +284 -0
  30. data/ext/src/e_util.h +61 -0
  31. data/ext/src/extr_ct.h +251 -0
  32. data/ext/src/ichi.h +206 -0
  33. data/ext/src/ichi_bns.c +7999 -0
  34. data/ext/src/ichi_bns.h +231 -0
  35. data/ext/src/ichican2.c +5000 -0
  36. data/ext/src/ichicano.c +2195 -0
  37. data/ext/src/ichicano.h +49 -0
  38. data/ext/src/ichicans.c +1625 -0
  39. data/ext/src/ichicant.h +379 -0
  40. data/ext/src/ichicomn.h +260 -0
  41. data/ext/src/ichicomp.h +50 -0
  42. data/ext/src/ichidrp.h +119 -0
  43. data/ext/src/ichierr.h +124 -0
  44. data/ext/src/ichiisot.c +101 -0
  45. data/ext/src/ichilnct.c +286 -0
  46. data/ext/src/ichimain.h +132 -0
  47. data/ext/src/ichimak2.c +1189 -0
  48. data/ext/src/ichimake.c +3812 -0
  49. data/ext/src/ichimake.h +205 -0
  50. data/ext/src/ichimap1.c +851 -0
  51. data/ext/src/ichimap2.c +2856 -0
  52. data/ext/src/ichimap4.c +1609 -0
  53. data/ext/src/ichinorm.c +741 -0
  54. data/ext/src/ichinorm.h +67 -0
  55. data/ext/src/ichiparm.c +45 -0
  56. data/ext/src/ichiparm.h +1441 -0
  57. data/ext/src/ichiprt1.c +3612 -0
  58. data/ext/src/ichiprt2.c +1511 -0
  59. data/ext/src/ichiprt3.c +3011 -0
  60. data/ext/src/ichiqueu.c +1003 -0
  61. data/ext/src/ichiring.c +326 -0
  62. data/ext/src/ichiring.h +49 -0
  63. data/ext/src/ichisize.h +35 -0
  64. data/ext/src/ichisort.c +539 -0
  65. data/ext/src/ichister.c +3538 -0
  66. data/ext/src/ichister.h +35 -0
  67. data/ext/src/ichitaut.c +3843 -0
  68. data/ext/src/ichitaut.h +387 -0
  69. data/ext/src/ichitime.h +74 -0
  70. data/ext/src/inchi_api.h +670 -0
  71. data/ext/src/inchi_dll.c +1480 -0
  72. data/ext/src/inchi_dll.h +34 -0
  73. data/ext/src/inchi_dll_main.c +23 -0
  74. data/ext/src/inchi_dll_main.h +31 -0
  75. data/ext/src/inpdef.h +328 -0
  76. data/ext/src/lreadmol.h +1246 -0
  77. data/ext/src/mode.h +706 -0
  78. data/ext/src/ruby_inchi_main.c +558 -0
  79. data/ext/src/runichi.c +4179 -0
  80. data/ext/src/strutil.c +3861 -0
  81. data/ext/src/strutil.h +182 -0
  82. data/ext/src/util.c +1130 -0
  83. data/ext/src/util.h +85 -0
  84. data/lib/clean_tempfile.rb +220 -0
  85. data/lib/rino.rb +111 -0
  86. data/test/test.rb +386 -0
  87. metadata +130 -0
data/ext/src/util.h ADDED
@@ -0,0 +1,85 @@
1
+ /*
2
+ * International Union of Pure and Applied Chemistry (IUPAC)
3
+ * International Chemical Identifier (InChI)
4
+ * Version 1
5
+ * Software version 1.00
6
+ * April 13, 2005
7
+ * Developed at NIST
8
+ */
9
+
10
+ #ifndef __UTIL_H__
11
+ #define __UTIL_H__
12
+
13
+ #include "inpdef.h"
14
+
15
+ /* BILLY 8/6/04 */
16
+ #ifndef INCHI_ALL_CPP
17
+ #ifdef __cplusplus
18
+ extern "C" {
19
+ #endif
20
+ #endif
21
+
22
+ int get_atw(const char *elname);
23
+ int get_atw_from_elnum( int nAtNum );
24
+ int get_num_H (const char* elname, int inp_num_H, S_CHAR num_iso_H[], int charge, int radical,
25
+ int chem_bonds_valence, int atom_input_valence, int bAliased, int bDoNotAddH, int bHasMetalNeighbor );
26
+ int extract_ChargeRadical( char *elname, int *pnRadical, int *pnCharge );
27
+ int extract_H_atoms( char *elname, S_CHAR num_iso_H[] );
28
+ int normalize_name( char* name );
29
+
30
+ int mystrncpy(char *target,const char *source,unsigned maxlen);
31
+ char* LtrimRtrim( char *p, int* nLen );
32
+ char* fgets_up_to_lf( char* line, int line_len, FILE* inp );
33
+ void remove_trailing_spaces( char* p );
34
+ void remove_one_lf( char* p);
35
+ void mystrrev( char *p );
36
+ #ifndef INCHI_LIBRARY
37
+ int my_fgets( char *szLine, int len, FILE *f, int *bTooLongLine );
38
+ int my_fgetsTab( char *szLine, int len, FILE *f, int *bTooLongLine );
39
+ int my_fgetsTab1( char *szLine, int len, FILE *f, int *bTooLongLine );
40
+ #endif
41
+ int my_fgetsUpToLfOrTab( char *szLine, int len, FILE *f );
42
+
43
+
44
+ AT_NUMB *is_in_the_list( AT_NUMB *pathAtom, AT_NUMB nNextAtom, int nPathLen );
45
+ int get_periodic_table_number( const char* elname );
46
+ int is_el_a_metal( int nPeriodicNum );
47
+ int get_el_valence( int nPeriodicNum, int charge, int val_num );
48
+ int get_unusual_el_valence( int nPeriodicNum, int charge, int radical, int bonds_valence, int num_H, int num_bonds );
49
+ int detect_unusual_el_valence( int nPeriodicNum, int charge, int radical, int bonds_valence, int num_H, int num_bonds );
50
+ int needed_unusual_el_valence( int nPeriodicNum, int charge, int radical, int bonds_valence, int num_H, int num_bonds );
51
+ int get_el_type( int nPeriodicNum );
52
+ int get_el_number( const char* elname );
53
+ int do_not_add_H( int nPeriodicNum );
54
+ int GetElementFormulaFromAtNum(int nAtNum, char *szElement );
55
+ int MakeRemovedProtonsString( int nNumRemovedProtons, NUM_H *nNumExchgIsotopicH, NUM_H *nNumRemovedProtonsIsotopic,
56
+ int bIsotopic, char *szRemovedProtons, int *num_removed_iso_H );
57
+
58
+ /* ion pairs and fixing bonds */
59
+ int num_of_H( inp_ATOM *at, int iat );
60
+ int has_other_ion_neigh( inp_ATOM *at, int iat, int iat_ion_neigh, const char *el, int el_len );
61
+ int has_other_ion_in_sphere_2(inp_ATOM *at, int iat, int iat_ion_neigh, const char *el, int el_len );
62
+ int nNoMetalNumBonds( inp_ATOM *at, int at_no );
63
+ int nNoMetalBondsValence( inp_ATOM *at, int at_no );
64
+ int nNoMetalNeighIndex( inp_ATOM *at, int at_no );
65
+ int nNoMetalOtherNeighIndex( inp_ATOM *at, int at_no, int cur_neigh );
66
+ int nNoMetalOtherNeighIndex2( inp_ATOM *at, int at_no, int cur_neigh, int cur_neigh2 );
67
+
68
+
69
+ /* IChICan2.c */
70
+ int SetBitFree( void );
71
+
72
+ void WriteCoord( char *str, double x );
73
+
74
+
75
+ extern int ERR_ELEM;
76
+
77
+ /* BILLY 8/6/04 */
78
+ #ifndef INCHI_ALL_CPP
79
+ #ifdef __cplusplus
80
+ }
81
+ #endif
82
+ #endif
83
+
84
+ #endif /* __UTIL_H__*/
85
+
@@ -0,0 +1,220 @@
1
+ # =================================
2
+ # Rino - The InChI Toolkit for Ruby
3
+ # =================================
4
+ #
5
+ # Project Info: http://rino.rubyforge.org
6
+ #
7
+ # Copyright (C) 2006 Richard L. Apodaca
8
+ #
9
+ # This library is free software; you can redistribute it and/or
10
+ # modify it under the terms of the GNU Lesser General Public
11
+ # License version 2.1 as published by the Free Software
12
+ # Foundation.
13
+ #
14
+ # This library is distributed in the hope that it will be useful,
15
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
16
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17
+ # Lesser General Public License for more details.
18
+ #
19
+ # You should have received a copy of the GNU Lesser General Public
20
+ # License along with this library; if not, write to the Free
21
+ # Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor
22
+ # Boston, MA 02111-1301, USA.
23
+ #
24
+ # This file originally appeared in the Ruby standard library
25
+ # as 'tempfile.rb' and has been modified as documented.
26
+
27
+ require 'delegate'
28
+ require 'tmpdir'
29
+
30
+ # A class for managing temporary files. This library is written to be
31
+ # thread safe.
32
+ # CleanTempfile is a slightly modified version of Tempfile in the standard
33
+ # Ruby library. Its open method opens the tempfile in write mode. This
34
+ # clears the contents of the previously written molfile which would
35
+ # otherwise be present in the standard Tempfile implementation.
36
+ class CleanTempfile < DelegateClass(File)
37
+ MAX_TRY = 10
38
+ @@cleanlist = []
39
+
40
+ # Creates a temporary file of mode 0600 in the temporary directory
41
+ # whose name is basename.pid.n and opens with mode "w+". A Tempfile
42
+ # object works just like a File object.
43
+ #
44
+ # If tmpdir is omitted, the temporary directory is determined by
45
+ # Dir::tmpdir provided by 'tmpdir.rb'.
46
+ # When $SAFE > 0 and the given tmpdir is tainted, it uses
47
+ # /tmp. (Note that ENV values are tainted by default)
48
+ def initialize(basename, tmpdir=Dir::tmpdir)
49
+ if $SAFE > 0 and tmpdir.tainted?
50
+ tmpdir = '/tmp'
51
+ end
52
+
53
+ lock = nil
54
+ n = failure = 0
55
+
56
+ begin
57
+ Thread.critical = true
58
+
59
+ begin
60
+ tmpname = File.join(tmpdir, make_tmpname(basename, n))
61
+ lock = tmpname + '.lock'
62
+ n += 1
63
+ end while @@cleanlist.include?(tmpname) or
64
+ File.exist?(lock) or File.exist?(tmpname)
65
+
66
+ Dir.mkdir(lock)
67
+ rescue
68
+ failure += 1
69
+ retry if failure < MAX_TRY
70
+ raise "cannot generate tempfile `%s'" % tmpname
71
+ ensure
72
+ Thread.critical = false
73
+ end
74
+
75
+ @data = [tmpname]
76
+ @clean_proc = Tempfile.callback(@data)
77
+ ObjectSpace.define_finalizer(self, @clean_proc)
78
+
79
+ @tmpfile = File.open(tmpname, File::RDWR|File::CREAT|File::EXCL, 0600)
80
+ @tmpname = tmpname
81
+ @@cleanlist << @tmpname
82
+ @data[1] = @tmpfile
83
+ @data[2] = @@cleanlist
84
+
85
+ super(@tmpfile)
86
+
87
+ # Now we have all the File/IO methods defined, you must not
88
+ # carelessly put bare puts(), etc. after this.
89
+
90
+ Dir.rmdir(lock)
91
+ end
92
+
93
+ def make_tmpname(basename, n)
94
+ sprintf('%s%d.%d', basename, $$, n)
95
+ end
96
+ private :make_tmpname
97
+
98
+ # Opens or reopens the file with mode "w+", rather than
99
+ # "r+" as in tempfile.rb.
100
+ def open
101
+ @tmpfile.close if @tmpfile
102
+
103
+ # uses 'w+' instead of 'r+' as used in tempfile.rb
104
+ @tmpfile = File.open(@tmpname, 'w+')
105
+ @data[1] = @tmpfile
106
+ __setobj__(@tmpfile)
107
+ end
108
+
109
+ def _close # :nodoc:
110
+ @tmpfile.close if @tmpfile
111
+ @data[1] = @tmpfile = nil
112
+ end
113
+ protected :_close
114
+
115
+ # Closes the file. If the optional flag is true, unlinks the file
116
+ # after closing.
117
+ #
118
+ # If you don't explicitly unlink the temporary file, the removal
119
+ # will be delayed until the object is finalized.
120
+ def close(unlink_now=false)
121
+ if unlink_now
122
+ close!
123
+ else
124
+ _close
125
+ end
126
+ end
127
+
128
+ # Closes and unlinks the file.
129
+ def close!
130
+ _close
131
+ @clean_proc.call
132
+ ObjectSpace.undefine_finalizer(self)
133
+ end
134
+
135
+ # Unlinks the file. On UNIX-like systems, it is often a good idea
136
+ # to unlink a temporary file immediately after creating and opening
137
+ # it, because it leaves other programs zero chance to access the
138
+ # file.
139
+ def unlink
140
+ # keep this order for thread safeness
141
+ begin
142
+ File.unlink(@tmpname) if File.exist?(@tmpname)
143
+ @@cleanlist.delete(@tmpname)
144
+ @data = @tmpname = nil
145
+ ObjectSpace.undefine_finalizer(self)
146
+ rescue Errno::EACCESS
147
+ # may not be able to unlink on Windows; just ignore
148
+ end
149
+ end
150
+ alias delete unlink
151
+
152
+ # Returns the full path name of the temporary file.
153
+ def path
154
+ @tmpname
155
+ end
156
+
157
+ # Returns the size of the temporary file. As a side effect, the IO
158
+ # buffer is flushed before determining the size.
159
+ def size
160
+ if @tmpfile
161
+ @tmpfile.flush
162
+ @tmpfile.stat.size
163
+ else
164
+ 0
165
+ end
166
+ end
167
+ alias length size
168
+
169
+ class << self
170
+ def callback(data) # :nodoc:
171
+ pid = $$
172
+ lambda{
173
+ if pid == $$
174
+ path, tmpfile, cleanlist = *data
175
+
176
+ print "removing ", path, "..." if $DEBUG
177
+
178
+ tmpfile.close if tmpfile
179
+
180
+ # keep this order for thread safeness
181
+ File.unlink(path) if File.exist?(path)
182
+ cleanlist.delete(path) if cleanlist
183
+
184
+ print "done\n" if $DEBUG
185
+ end
186
+ }
187
+ end
188
+
189
+ # If no block is given, this is a synonym for new().
190
+ #
191
+ # If a block is given, it will be passed tempfile as an argument,
192
+ # and the tempfile will automatically be closed when the block
193
+ # terminates. In this case, open() returns nil.
194
+ def open(*args)
195
+ tempfile = new(*args)
196
+
197
+ if block_given?
198
+ begin
199
+ yield(tempfile)
200
+ ensure
201
+ tempfile.close
202
+ end
203
+
204
+ nil
205
+ else
206
+ tempfile
207
+ end
208
+ end
209
+ end
210
+ end
211
+
212
+ if __FILE__ == $0
213
+ # $DEBUG = true
214
+ f = Tempfile.new("foo")
215
+ f.print("foo\n")
216
+ f.close
217
+ f.open
218
+ p f.gets # => "foo\n"
219
+ f.close!
220
+ end
data/lib/rino.rb ADDED
@@ -0,0 +1,111 @@
1
+ # =================================
2
+ # Rino - The InChI Toolkit for Ruby
3
+ # =================================
4
+ #
5
+ # Project Info: http://rino.rubyforge.org
6
+ #
7
+ # Copyright (C) 2006 Richard L. Apodaca
8
+ #
9
+ # This library is free software; you can redistribute it and/or
10
+ # modify it under the terms of the GNU Lesser General Public
11
+ # License version 2.1 as published by the Free Software
12
+ # Foundation.
13
+ #
14
+ # This library is distributed in the hope that it will be useful,
15
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
16
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17
+ # Lesser General Public License for more details.
18
+ #
19
+ # You should have received a copy of the GNU Lesser General Public
20
+ # License along with this library; if not, write to the Free
21
+ # Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor
22
+ # Boston, MA 02111-1301, USA.
23
+ #
24
+ # Typical usage:
25
+ #
26
+ # reader = Rino::MolfileReader.new
27
+ # inchi = reader.read(IO.read('benzene.mol'))
28
+ #
29
+ # puts inchi -> 'InChI=1/C6H6/c1-2-4-6-5-3-1/h1-6H'
30
+
31
+ $:.unshift File.join(File.dirname(__FILE__), "..", "ext")
32
+
33
+ require 'tempfile'
34
+ require 'clean_tempfile'
35
+ require 'ruby_inchi_main'
36
+
37
+ module Rino
38
+ # Creates an InChI string from a molfile. This class coordinates the creation
39
+ # and deletion of temporary i/o files according to the rules used by Tempfile.
40
+ class MolfileReader
41
+
42
+ # Accepts the same options as the InChI command line
43
+ # software. See: http://wwmm.ch.cam.ac.uk/inchifaq/ and the
44
+ # InChI Technical Manual for an explanation of these options.
45
+ #
46
+ # Example:
47
+ #
48
+ # reader = Rino::MolfileReader.new
49
+ #
50
+ # reader.options << "-Compress"
51
+ attr_reader :options
52
+
53
+ def initialize
54
+ @in = CleanTempfile.new("inchi_input.mol")
55
+ @out = Tempfile.new("inchi_output.txt")
56
+ @log = Tempfile.new("inchi_log.txt")
57
+ @prob = Tempfile.new("inchi_problem.txt")
58
+ @main = Main.new
59
+ @options = Array.new
60
+ end
61
+
62
+ #Reads the specified molfile encoded as a string, and returns the
63
+ #corresponding InChI identifier.
64
+ def read(molfile)
65
+ write_input(molfile)
66
+
67
+ @main.run(create_argv)
68
+
69
+ get_inchi
70
+ end
71
+
72
+ private
73
+
74
+ def write_input(molfile)
75
+ @in.open
76
+ @in << molfile
77
+ @in.close
78
+ end
79
+
80
+ def create_argv
81
+ result = ["", @in.path, @out.path, @log.path, @prob.path]
82
+
83
+ @options.each do |x|
84
+ result << x
85
+ end
86
+
87
+ result;
88
+ end
89
+
90
+ def get_inchi
91
+ result = ""
92
+
93
+ @out.open
94
+
95
+ 2.times do |i|
96
+ begin
97
+ @out.readline
98
+
99
+ rescue EOFError
100
+ raise "Unreadable molfile"
101
+ end
102
+ end
103
+
104
+ result = @out.readline.rstrip!
105
+
106
+ @out.close
107
+
108
+ result
109
+ end
110
+ end
111
+ end