rino 0.1.0 → 0.2.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.
- data/Rakefile +1 -1
- data/ext/extconf.rb +1 -24
- data/ext/libinchi.so +0 -0
- data/ext/src/aux2atom.h +120 -39
- data/ext/src/comdef.h +3 -3
- data/ext/src/dispstru.c +2547 -0
- data/ext/src/dispstru.h +73 -0
- data/ext/src/extr_ct.h +5 -2
- data/ext/src/ichi.h +27 -11
- data/ext/src/ichi_bns.c +1800 -254
- data/ext/src/ichi_bns.h +205 -4
- data/ext/src/ichican2.c +197 -86
- data/ext/src/ichicano.c +8 -13
- data/ext/src/ichicano.h +2 -2
- data/ext/src/ichicans.c +11 -6
- data/ext/src/ichicant.h +2 -2
- data/ext/src/ichicomn.h +2 -2
- data/ext/src/ichicomp.h +19 -4
- data/ext/src/ichidrp.h +9 -5
- data/ext/src/ichierr.h +5 -3
- data/ext/src/ichiisot.c +2 -2
- data/ext/src/ichimain.c +461 -0
- data/ext/src/ichimain.h +23 -15
- data/ext/src/ichimak2.c +6 -6
- data/ext/src/ichimake.c +843 -42
- data/ext/src/ichimake.h +4 -2
- data/ext/src/ichimap1.c +5 -5
- data/ext/src/ichimap2.c +2 -2
- data/ext/src/ichimap4.c +34 -21
- data/ext/src/ichinorm.c +11 -5
- data/ext/src/ichinorm.h +3 -2
- data/ext/src/ichiparm.c +2 -2
- data/ext/src/ichiparm.h +232 -30
- data/ext/src/ichiprt1.c +35 -11
- data/ext/src/ichiprt2.c +78 -7
- data/ext/src/ichiprt3.c +300 -120
- data/ext/src/ichiqueu.c +17 -2
- data/ext/src/ichiread.c +6932 -0
- data/ext/src/ichiring.c +3 -2
- data/ext/src/ichiring.h +2 -2
- data/ext/src/ichirvr1.c +4891 -0
- data/ext/src/ichirvr2.c +6344 -0
- data/ext/src/ichirvr3.c +5499 -0
- data/ext/src/ichirvr4.c +3177 -0
- data/ext/src/ichirvr5.c +1166 -0
- data/ext/src/ichirvr6.c +1287 -0
- data/ext/src/ichirvr7.c +2319 -0
- data/ext/src/ichirvrs.h +882 -0
- data/ext/src/ichisize.h +2 -2
- data/ext/src/ichisort.c +5 -5
- data/ext/src/ichister.c +281 -86
- data/ext/src/ichister.h +9 -3
- data/ext/src/ichitaut.c +208 -9
- data/ext/src/ichitaut.h +13 -11
- data/ext/src/ichitime.h +16 -2
- data/ext/src/inchicmp.h +107 -0
- data/ext/src/inpdef.h +6 -3
- data/ext/src/libinchi_wrap.c +912 -0
- data/ext/src/lreadmol.h +34 -31
- data/ext/src/mode.h +244 -7
- data/ext/src/mol2atom.c +1060 -0
- data/ext/src/mol2atom.h +31 -0
- data/ext/src/readinch.c +239 -0
- data/ext/src/readmol.c +28 -0
- data/ext/src/{e_readmol.h → readmol.h} +7 -9
- data/ext/src/runichi.c +251 -177
- data/ext/src/strutil.c +444 -238
- data/ext/src/strutil.h +150 -11
- data/ext/src/util.c +176 -118
- data/ext/src/util.h +15 -3
- data/lib/rino.rb +71 -3
- data/test/test.rb +33 -4
- metadata +22 -34
- data/ext/ruby_inchi_main.so +0 -0
- data/ext/src/e_0dstereo.c +0 -3014
- data/ext/src/e_0dstereo.h +0 -31
- data/ext/src/e_comdef.h +0 -57
- data/ext/src/e_ctl_data.h +0 -147
- data/ext/src/e_ichi_io.c +0 -498
- data/ext/src/e_ichi_io.h +0 -40
- data/ext/src/e_ichi_parms.c +0 -37
- data/ext/src/e_ichi_parms.h +0 -41
- data/ext/src/e_ichicomp.h +0 -50
- data/ext/src/e_ichierr.h +0 -40
- data/ext/src/e_ichimain.c +0 -593
- data/ext/src/e_ichisize.h +0 -43
- data/ext/src/e_inchi_atom.c +0 -75
- data/ext/src/e_inchi_atom.h +0 -33
- data/ext/src/e_inpdef.h +0 -41
- data/ext/src/e_mode.h +0 -706
- data/ext/src/e_mol2atom.c +0 -649
- data/ext/src/e_readinch.c +0 -58
- data/ext/src/e_readmol.c +0 -54
- data/ext/src/e_readstru.c +0 -251
- data/ext/src/e_readstru.h +0 -33
- data/ext/src/e_util.c +0 -284
- data/ext/src/e_util.h +0 -61
- data/ext/src/ichilnct.c +0 -286
- data/ext/src/inchi_api.h +0 -670
- data/ext/src/inchi_dll.c +0 -1480
- data/ext/src/inchi_dll.h +0 -34
- data/ext/src/inchi_dll_main.c +0 -23
- data/ext/src/inchi_dll_main.h +0 -31
- data/ext/src/ruby_inchi_main.c +0 -558
data/ext/src/ichister.h
CHANGED
@@ -2,8 +2,8 @@
|
|
2
2
|
* International Union of Pure and Applied Chemistry (IUPAC)
|
3
3
|
* International Chemical Identifier (InChI)
|
4
4
|
* Version 1
|
5
|
-
* Software version 1.
|
6
|
-
*
|
5
|
+
* Software version 1.01
|
6
|
+
* July 21, 2006
|
7
7
|
* Developed at NIST
|
8
8
|
*/
|
9
9
|
|
@@ -16,9 +16,10 @@ extern "C" {
|
|
16
16
|
#endif
|
17
17
|
#endif
|
18
18
|
int bCanAtomBeAStereoCenter( char *elname, S_CHAR charge, S_CHAR radical );
|
19
|
-
int bCanInpAtomBeAStereoCenter( inp_ATOM *at, int cur_at );
|
19
|
+
int bCanInpAtomBeAStereoCenter( inp_ATOM *at, int cur_at, int bPointedEdgeStereo );
|
20
20
|
int bCanAtomHaveAStereoBond( char *elname, S_CHAR charge, S_CHAR radical );
|
21
21
|
int bCanAtomBeTerminalAllene( char *elname, S_CHAR charge, S_CHAR radical );
|
22
|
+
int bCanAtomBeMiddleAllene( char *elname, S_CHAR charge, S_CHAR radical );
|
22
23
|
int bAtomHasValence3( char *elname, S_CHAR charge, S_CHAR radical );
|
23
24
|
int set_stereo_parity( inp_ATOM* at, sp_ATOM* at_output, int num_at, int num_removed_H,
|
24
25
|
int *nMaxNumStereoAtoms, int *nMaxNumStereoBonds, INCHI_MODE nMode,
|
@@ -26,6 +27,11 @@ int set_stereo_parity( inp_ATOM* at, sp_ATOM* at_output, int num_at, int num_rem
|
|
26
27
|
int get_opposite_sb_atom( inp_ATOM *at, int cur_atom, int icur2nxt,
|
27
28
|
int *pnxt_atom, int *pinxt2cur, int *pinxt_sb_parity_ord );
|
28
29
|
|
30
|
+
#define PES_BIT_POINT_EDGE_STEREO 1
|
31
|
+
#define PES_BIT_PHOSPHINE_STEREO 2
|
32
|
+
#define PES_BIT_ARSINE_STEREO 4
|
33
|
+
#define PES_BIT_FIX_SP3_BUG 8
|
34
|
+
|
29
35
|
#ifndef INCHI_ALL_CPP
|
30
36
|
#ifdef __cplusplus
|
31
37
|
}
|
data/ext/src/ichitaut.c
CHANGED
@@ -2,8 +2,8 @@
|
|
2
2
|
* International Union of Pure and Applied Chemistry (IUPAC)
|
3
3
|
* International Chemical Identifier (InChI)
|
4
4
|
* Version 1
|
5
|
-
* Software version 1.
|
6
|
-
*
|
5
|
+
* Software version 1.01
|
6
|
+
* July 21, 2006
|
7
7
|
* Developed at NIST
|
8
8
|
*/
|
9
9
|
|
@@ -724,6 +724,7 @@ int GetNeutralRepsIfNeeded( AT_NUMB *pri, AT_NUMB *prj, inp_ATOM *at, int num_at
|
|
724
724
|
if ( (c_point = at[ri].c_point) && (c_point == at[rj].c_point) &&
|
725
725
|
(at[ri].charge == 1 || at[rj].charge == 1) && cgi && cgi->num_c_groups > 0 ) {
|
726
726
|
/* at[ri] and at[rj] belong to the same charge group, at least one is charged */
|
727
|
+
/* MS VC++ 2005 reports unreachable code here ??? */
|
727
728
|
for ( k = 0; k < cgi->num_c_groups; k ++ ) {
|
728
729
|
if ( cgi->c_group[k].nGroupNumber == c_point ) {
|
729
730
|
/* cgi->c_group[k] is found to be this charge group */
|
@@ -2291,6 +2292,7 @@ int MarkSaltChargeGroups ( inp_ATOM *at, int num_atoms, S_GROUP_INFO *s_group_in
|
|
2291
2292
|
}
|
2292
2293
|
#endif
|
2293
2294
|
nNumCandidates = 0; /* always recalculate 2004-03-22 */
|
2295
|
+
num_tested = 0;
|
2294
2296
|
|
2295
2297
|
if ( nNumCandidates == 0 ) {
|
2296
2298
|
for ( i = 0, nNumCandidates = nNumOtherCandidates = nNumPOnlyCandidates = 0; i < num_atoms; i ++ ) {
|
@@ -2353,7 +2355,6 @@ int MarkSaltChargeGroups ( inp_ATOM *at, int num_atoms, S_GROUP_INFO *s_group_in
|
|
2353
2355
|
SALT_DONOR_Neg to SALT_ACCEPTOR : long distance migration of negative charges
|
2354
2356
|
SALT_DONOR_H to SALT_ACCEPTOR : long distance migration of H-atoms
|
2355
2357
|
*/
|
2356
|
-
num_tested = 0;
|
2357
2358
|
do {
|
2358
2359
|
nNumChanges = 0;
|
2359
2360
|
for ( i1 = 0; i1 < nNumCandidates; i1 ++ ) {
|
@@ -2944,7 +2945,10 @@ int MarkTautomerGroups( inp_ATOM *at, int num_atoms, T_GROUP_INFO *t_group_info,
|
|
2944
2945
|
int *pnum_t, max_num_t, bIgnoreIsotopic;
|
2945
2946
|
ENDPOINT_INFO eif1, eif2;
|
2946
2947
|
int nErr = 0;
|
2947
|
-
#define ALLOWED_EDGE(PBNS, IAT,IBOND) ( !PBNS || !PBNS->edge || !PBNS->vert || !PBNS->edge[PBNS->vert[IAT].iedge[IBOND]].forbidden)
|
2948
|
+
#define ALLOWED_EDGE(PBNS, IAT,IBOND) ( !(PBNS) || !(PBNS)->edge || !(PBNS)->vert || !(PBNS)->edge[(PBNS)->vert[IAT].iedge[IBOND]].forbidden)
|
2949
|
+
#define ACTUAL_ORDER(PBNS, IAT,IBOND, BTYPE) ( ((PBNS) && (PBNS)->edge && (PBNS)->vert &&\
|
2950
|
+
((BTYPE)==BOND_ALT_123 || (BTYPE)==BOND_ALT_13 || (BTYPE)==BOND_ALT_23))? (PBNS)->edge[(PBNS)->vert[IAT].iedge[IBOND]].flow+BOND_TYPE_SINGLE:(BTYPE))
|
2951
|
+
|
2948
2952
|
|
2949
2953
|
if ( !t_group_info || !(t_group_info->bTautFlags & TG_FLAG_TEST_TAUT__ATOMS) )
|
2950
2954
|
return 0;
|
@@ -2984,6 +2988,9 @@ int MarkTautomerGroups( inp_ATOM *at, int num_atoms, T_GROUP_INFO *t_group_info,
|
|
2984
2988
|
/* 1st endpoint candidate found. Find centerpoint candidate */
|
2985
2989
|
for ( j = 0; j < at[i].valence; j ++ ) {
|
2986
2990
|
bond_type = (int)at[i].bond_type[j] & ~BOND_MARK_ALL;
|
2991
|
+
#if( FIX_BOND23_IN_TAUT == 1 )
|
2992
|
+
bond_type = ACTUAL_ORDER(pBNS,i,j,bond_type);
|
2993
|
+
#endif
|
2987
2994
|
centerpoint = (int)at[i].neighbor[j]; /* a centerpoint candidate */
|
2988
2995
|
if ( (bond_type == BOND_DOUBLE ||
|
2989
2996
|
bond_type == BOND_ALTERN ||
|
@@ -3000,13 +3007,13 @@ int MarkTautomerGroups( inp_ATOM *at, int num_atoms, T_GROUP_INFO *t_group_info,
|
|
3000
3007
|
for ( k = 0, nNumEndPoints = 0, nNumBondPos = 0; k < at[centerpoint].valence; k ++ ) {
|
3001
3008
|
endpoint = at[centerpoint].neighbor[k]; /* endpoint candidate */
|
3002
3009
|
bond_type = (int)at[centerpoint].bond_type[k] & ~BOND_MARK_ALL;
|
3010
|
+
#if( FIX_BOND23_IN_TAUT == 1 )
|
3011
|
+
bond_type = ACTUAL_ORDER(pBNS,centerpoint,k,bond_type);
|
3012
|
+
#endif
|
3003
3013
|
bTautBond =
|
3004
3014
|
bNonTautBond =
|
3005
3015
|
bAltBond =
|
3006
3016
|
bPossiblyEndpoint = 0;
|
3007
|
-
if ( !( !pBNS || !pBNS->edge || !pBNS->vert || !pBNS->edge[pBNS->vert[centerpoint].iedge[k]].forbidden) ) {
|
3008
|
-
continue;
|
3009
|
-
}
|
3010
3017
|
if ( !ALLOWED_EDGE(pBNS, centerpoint, k) ) {
|
3011
3018
|
continue;
|
3012
3019
|
} else
|
@@ -3597,9 +3604,9 @@ int set_tautomer_iso_sort_keys( T_GROUP_INFO *t_group_info )
|
|
3597
3604
|
* No previous t_group_info adjustment due to throwing out disconnected parts of
|
3598
3605
|
* the chemical structure is needed.
|
3599
3606
|
*
|
3600
|
-
* Note2:
|
3607
|
+
* Note2: throws out t_groups containing negative charges only (IGNORE_TGROUP_WITHOUT_H==1)
|
3601
3608
|
* (leave their tautomeric bonds unchanged)
|
3602
|
-
* Note3:
|
3609
|
+
* Note3: removes negative charges from other tautomeric groups
|
3603
3610
|
* and adjust counts of mobile atoms if permitted (REMOVE_TGROUP_CHARGE==1)
|
3604
3611
|
*/
|
3605
3612
|
int CountTautomerGroups( sp_ATOM *at, int num_atoms, T_GROUP_INFO *t_group_info )
|
@@ -3789,6 +3796,198 @@ exit_function:
|
|
3789
3796
|
}
|
3790
3797
|
return ret;
|
3791
3798
|
}
|
3799
|
+
#if( READ_INCHI_STRING == 1 )
|
3800
|
+
#if( INCLUDE_NORMALIZATION_ENTRY_POINT == 1 )
|
3801
|
+
/********************************************************************************/
|
3802
|
+
int CountTautomerGroupsInpAt( inp_ATOM *at, int num_atoms, T_GROUP_INFO *t_group_info )
|
3803
|
+
{
|
3804
|
+
int i, j, ret = 0, nNumEndpoints, max_t_group, num_groups_noH;
|
3805
|
+
|
3806
|
+
AT_NUMB nGroupNumber, nNewGroupNumber, *nCurrEndpointAtNoPos = NULL;
|
3807
|
+
|
3808
|
+
T_GROUP *t_group;
|
3809
|
+
int num_t;
|
3810
|
+
/* int bIgnoreIsotopic, max_num_t; */
|
3811
|
+
AT_NUMB *nTautomerGroupNumber = NULL;
|
3812
|
+
AT_NUMB *nEndpointAtomNumber = NULL;
|
3813
|
+
AT_NUMB *tGroupNumber = NULL;
|
3814
|
+
|
3815
|
+
if ( !t_group_info || !t_group_info->t_group || 0 >= t_group_info->max_num_t_groups ) {
|
3816
|
+
return 0; /* empty t-groups */
|
3817
|
+
}
|
3818
|
+
num_t = t_group_info->num_t_groups;
|
3819
|
+
t_group = t_group_info->t_group;
|
3820
|
+
/*
|
3821
|
+
max_num_t = t_group_info->max_num_t_groups;
|
3822
|
+
bIgnoreIsotopic = t_group_info->bIgnoreIsotopic;
|
3823
|
+
*/
|
3824
|
+
num_groups_noH = 0;
|
3825
|
+
|
3826
|
+
/* the following 2 arrays are to be rebuilt here */
|
3827
|
+
if ( t_group_info->nEndpointAtomNumber ) {
|
3828
|
+
inchi_free ( t_group_info->nEndpointAtomNumber );
|
3829
|
+
t_group_info->nEndpointAtomNumber = NULL;
|
3830
|
+
}
|
3831
|
+
if ( t_group_info->tGroupNumber ) {
|
3832
|
+
inchi_free ( t_group_info->tGroupNumber );
|
3833
|
+
t_group_info->tGroupNumber = NULL;
|
3834
|
+
}
|
3835
|
+
/* find max_t_group */
|
3836
|
+
for ( i = 0, max_t_group = 0; i < t_group_info->num_t_groups; i ++ ) {
|
3837
|
+
if ( max_t_group < t_group[i].nGroupNumber )
|
3838
|
+
max_t_group = t_group[i].nGroupNumber;
|
3839
|
+
}
|
3840
|
+
/* allocate memory for temp storage of numbers of endpoints */
|
3841
|
+
if ( max_t_group &&
|
3842
|
+
!(nTautomerGroupNumber = (AT_NUMB*) inchi_calloc( max_t_group+1, sizeof(nTautomerGroupNumber[0]) ) /*temp*/ ) ) {
|
3843
|
+
goto err_exit_function; /* program error: out of RAM */ /* <BRKPT> */
|
3844
|
+
}
|
3845
|
+
|
3846
|
+
/* count endpoints for each tautomer group */
|
3847
|
+
for ( i = 0, nNumEndpoints = 0; i < num_atoms; i ++ ) {
|
3848
|
+
if ( (j = at[i].endpoint) == 0 )
|
3849
|
+
continue;
|
3850
|
+
if ( j > max_t_group ) /* debug only */
|
3851
|
+
goto err_exit_function; /* program error */ /* <BRKPT> */
|
3852
|
+
nTautomerGroupNumber[j] ++;
|
3853
|
+
nNumEndpoints ++;
|
3854
|
+
}
|
3855
|
+
|
3856
|
+
if ( !nNumEndpoints ) {
|
3857
|
+
goto exit_function; /* not a tautomer */
|
3858
|
+
}
|
3859
|
+
|
3860
|
+
/* allocate temporary array */
|
3861
|
+
if ( !(nEndpointAtomNumber = (AT_NUMB*) inchi_calloc( nNumEndpoints, sizeof(nEndpointAtomNumber[0]) ) ) ||
|
3862
|
+
!(nCurrEndpointAtNoPos = (AT_NUMB*) inchi_calloc( num_t, sizeof(nCurrEndpointAtNoPos[0]) ) /*temp*/ ) ) {
|
3863
|
+
goto err_exit_function; /* program error: out of RAM */ /* <BRKPT> */
|
3864
|
+
}
|
3865
|
+
/*
|
3866
|
+
* Remove missing endpoints from t_group. Since only one
|
3867
|
+
* disconnected part is processed, some endpoints groups may have disappeared.
|
3868
|
+
* Mark t_groups containing charges only for subsequent removal
|
3869
|
+
*/
|
3870
|
+
for ( i = 0, nNewGroupNumber = 0; i < num_t; /*i ++*/ ) {
|
3871
|
+
int bNoH = 0, nNumH;
|
3872
|
+
nGroupNumber = t_group[i].nGroupNumber;
|
3873
|
+
for ( j = 1, nNumH = t_group[i].num[0]; j < T_NUM_NO_ISOTOPIC; j ++ ) {
|
3874
|
+
nNumH -= (int)t_group[i].num[j];
|
3875
|
+
}
|
3876
|
+
if ( t_group[i].nNumEndpoints != nTautomerGroupNumber[(int)nGroupNumber]
|
3877
|
+
#if( IGNORE_TGROUP_WITHOUT_H == 1 )
|
3878
|
+
|| (bNoH = (t_group[i].num[0]==t_group[i].num[1])) /* only for (H,-) t-groups; (+) t-groups are not removed */
|
3879
|
+
#endif
|
3880
|
+
) {
|
3881
|
+
if ( !nTautomerGroupNumber[(int)nGroupNumber] || bNoH ) {
|
3882
|
+
/* the group belongs to another disconnected part of the structure or has only charges */
|
3883
|
+
/* Remove the group */
|
3884
|
+
num_t --;
|
3885
|
+
if ( i < num_t )
|
3886
|
+
memmove( t_group+i, t_group+i+1, (num_t-i)*sizeof(t_group[0]) );
|
3887
|
+
if ( bNoH ) {
|
3888
|
+
/* group contains no mobile hydrogen atoms, only charges. Prepare to remove it. */
|
3889
|
+
nTautomerGroupNumber[(int)nGroupNumber] = 0;
|
3890
|
+
num_groups_noH ++;
|
3891
|
+
}
|
3892
|
+
/*i --;*/
|
3893
|
+
} else {
|
3894
|
+
/* different number of endpoints */
|
3895
|
+
goto err_exit_function; /* program error */ /* <BRKPT> */
|
3896
|
+
}
|
3897
|
+
} else {
|
3898
|
+
/* renumber t_group and prepare to renumber at[i].endpoint */
|
3899
|
+
nTautomerGroupNumber[(int)nGroupNumber] =
|
3900
|
+
t_group[i].nGroupNumber = ++nNewGroupNumber; /* = i+1 */
|
3901
|
+
/* get first group atom orig. number position in the nEndpointAtomNumber[] */
|
3902
|
+
/* and in the tautomer endpoint canon numbers part of the connection table */
|
3903
|
+
t_group[i].nFirstEndpointAtNoPos = nCurrEndpointAtNoPos[i] =
|
3904
|
+
i? (t_group[i-1].nFirstEndpointAtNoPos+t_group[i-1].nNumEndpoints) : 0;
|
3905
|
+
t_group[i].num[0] = nNumH;
|
3906
|
+
#if( REMOVE_TGROUP_CHARGE == 1 )
|
3907
|
+
t_group[i].num[1] = 0; /* remove only (-) charges */
|
3908
|
+
#endif
|
3909
|
+
/* -- wrong condition. Disabled.
|
3910
|
+
if ( t_group[i].nGroupNumber != i + 1 ) { // for debug only
|
3911
|
+
goto err_exit_function; // program error
|
3912
|
+
}
|
3913
|
+
*/
|
3914
|
+
i ++;
|
3915
|
+
}
|
3916
|
+
}
|
3917
|
+
if ( num_t != nNewGroupNumber ) { /* for debug only */
|
3918
|
+
goto err_exit_function; /* program error */ /* <BRKPT> */
|
3919
|
+
}
|
3920
|
+
|
3921
|
+
/* check if any tautomer group was left */
|
3922
|
+
if ( !nNewGroupNumber ) {
|
3923
|
+
if ( !num_groups_noH )
|
3924
|
+
goto err_exit_function; /* program error: not a tautomer */ /* <BRKPT> */
|
3925
|
+
else
|
3926
|
+
goto exit_function;
|
3927
|
+
}
|
3928
|
+
/*
|
3929
|
+
* an array for tautomer group sorting later, at the time of storing Connection Table
|
3930
|
+
* Later the sorting consists out of 2 steps:
|
3931
|
+
* 1) Sort t_group[i].nNumEndpoints endpoint atom ranks within each endpoint group
|
3932
|
+
* starting from t_group[i].nFirstEndpointAtNoPos; i = 0..t_group_info->num_t_groups-1
|
3933
|
+
* 2) Sort the groups indexes t_group_info->tGroupNumber[]
|
3934
|
+
*/
|
3935
|
+
if ( !(tGroupNumber=
|
3936
|
+
(AT_NUMB*)inchi_calloc(nNewGroupNumber*TGSO_TOTAL_LEN, sizeof(tGroupNumber[0])))) {
|
3937
|
+
goto err_exit_function; /* out of RAM */
|
3938
|
+
}
|
3939
|
+
for ( i = 0; i < nNewGroupNumber; i ++ ) {
|
3940
|
+
tGroupNumber[i] = (AT_NUMB)i; /* initialization: original t_group number = (at[i]->endpoint-1) */
|
3941
|
+
}
|
3942
|
+
/*
|
3943
|
+
* renumber endpoint atoms and save their orig. atom
|
3944
|
+
* numbers for filling out the tautomer part of the LinearCT.
|
3945
|
+
* nCurrEndpointAtNoPos[j] is an index of the atom number in the nEndpointAtomNumber[]
|
3946
|
+
*/
|
3947
|
+
for ( i = 0; i < num_atoms; i ++ ) {
|
3948
|
+
if ( j = (int)at[i].endpoint ) {
|
3949
|
+
j = (int)(at[i].endpoint = nTautomerGroupNumber[j])-1; /* new t_group number */
|
3950
|
+
if ( j >= 0 ) { /* j=-1 in case of no mobile hydrogen atoms (charges only), group being removed */
|
3951
|
+
if ( nCurrEndpointAtNoPos[j] >= /* debug only */
|
3952
|
+
t_group[j].nFirstEndpointAtNoPos+t_group[j].nNumEndpoints ) {
|
3953
|
+
goto err_exit_function; /* program error */ /* <BRKPT> */
|
3954
|
+
}
|
3955
|
+
nEndpointAtomNumber[(int)nCurrEndpointAtNoPos[j] ++] = (AT_NUMB)i;
|
3956
|
+
} else {
|
3957
|
+
nNumEndpoints --; /* endpoint has been removed */
|
3958
|
+
}
|
3959
|
+
}
|
3960
|
+
}
|
3961
|
+
t_group_info->num_t_groups = nNewGroupNumber;
|
3962
|
+
t_group_info->nNumEndpoints = nNumEndpoints;
|
3963
|
+
t_group_info->nEndpointAtomNumber = nEndpointAtomNumber;
|
3964
|
+
t_group_info->tGroupNumber = tGroupNumber; /* only the 1st segment filled */
|
3965
|
+
inchi_free ( nTautomerGroupNumber );
|
3966
|
+
inchi_free ( nCurrEndpointAtNoPos );
|
3967
|
+
return nNumEndpoints + T_GROUP_HDR_LEN * nNewGroupNumber + 1; /* nLenLinearCTTautomer */
|
3968
|
+
|
3969
|
+
err_exit_function:
|
3970
|
+
ret = CT_TAUCOUNT_ERR;
|
3971
|
+
exit_function:
|
3972
|
+
/* release allocated memory; set "no tautomeric group" */
|
3973
|
+
if ( nEndpointAtomNumber )
|
3974
|
+
inchi_free ( nEndpointAtomNumber );
|
3975
|
+
if ( nTautomerGroupNumber )
|
3976
|
+
inchi_free ( nTautomerGroupNumber );
|
3977
|
+
if ( tGroupNumber )
|
3978
|
+
inchi_free ( tGroupNumber );
|
3979
|
+
if ( nCurrEndpointAtNoPos )
|
3980
|
+
inchi_free ( nCurrEndpointAtNoPos );
|
3981
|
+
t_group_info->nNumEndpoints = 0;
|
3982
|
+
t_group_info->num_t_groups = 0;
|
3983
|
+
if ( !ret && ((t_group_info->tni.bNormalizationFlags & FLAG_NORM_CONSIDER_TAUT) ||
|
3984
|
+
t_group_info->nNumIsotopicEndpoints>1 && (t_group_info->bTautFlagsDone & (TG_FLAG_FOUND_ISOTOPIC_H_DONE | TG_FLAG_FOUND_ISOTOPIC_ATOM_DONE))) ) {
|
3985
|
+
ret = 1; /* only protons have been (re)moved or neitralization happened */
|
3986
|
+
}
|
3987
|
+
return ret;
|
3988
|
+
}
|
3989
|
+
#endif
|
3990
|
+
#endif
|
3792
3991
|
/**************************************************************
|
3793
3992
|
* tautomers: Compare for sorting
|
3794
3993
|
******************************************************************/
|
data/ext/src/ichitaut.h
CHANGED
@@ -2,8 +2,8 @@
|
|
2
2
|
* International Union of Pure and Applied Chemistry (IUPAC)
|
3
3
|
* International Chemical Identifier (InChI)
|
4
4
|
* Version 1
|
5
|
-
* Software version 1.
|
6
|
-
*
|
5
|
+
* Software version 1.01
|
6
|
+
* July 21, 2006
|
7
7
|
* Developed at NIST
|
8
8
|
*/
|
9
9
|
|
@@ -137,15 +137,10 @@ typedef struct tagTautomerGroup {
|
|
137
137
|
|
138
138
|
/* offsets/num_t_groups within T_GROUP_INFO::tGroupNumber */
|
139
139
|
#define TGSO_CURR_ORDER 0 /* tGroupNumber: current sorting order */
|
140
|
-
#define
|
141
|
-
|
142
|
-
#define
|
143
|
-
#define
|
144
|
-
#define TGSO_SYMM_IORDER 4 /* tiGroupNumber: isotopic symmetry rank sorting order */
|
145
|
-
#define TGSO_SYMM_IRANK 5 /* tiSymmRank: isotopic symmetry ranks */
|
146
|
-
#define TGSO_SORT_IRANK 6 /* tiSortRank: current isotopic rank (positive ordering number) */
|
147
|
-
#define TGSO_MARK_IRANK 7 /* tiMarkGroup: the min. canonical number has been mapped on the endpoint */
|
148
|
-
#define TGSO_TOTAL_LEN 8
|
140
|
+
#define TGSO_SYMM_RANK 1 /* tSymmRank: symmetry ranks (no isotopes) = min. ordering number > 0. */
|
141
|
+
#define TGSO_SYMM_IORDER 2 /* tiGroupNumber: isotopic symmetry rank sorting order */
|
142
|
+
#define TGSO_SYMM_IRANK 3 /* tiSymmRank: isotopic symmetry ranks */
|
143
|
+
#define TGSO_TOTAL_LEN 4
|
149
144
|
|
150
145
|
/***************************************************/
|
151
146
|
/* flags for t_group_info->tni.bNormalizationFlags */
|
@@ -169,10 +164,17 @@ typedef struct tagTautomerGroup {
|
|
169
164
|
FLAG_PROTON_SINGLE_REMOVED | \
|
170
165
|
FLAG_PROTON_CHARGE_CANCEL )
|
171
166
|
|
167
|
+
#if( FIX_N_MINUS_NORN_BUG == 1 )
|
168
|
+
#define FLAG_FORCE_SALT_TAUT ( FLAG_PROTON_NP_HARD_REMOVED | \
|
169
|
+
FLAG_PROTON_AC_HARD_REMOVED | \
|
170
|
+
FLAG_PROTON_AC_HARD_ADDED | \
|
171
|
+
FLAG_PROTON_CHARGE_CANCEL )
|
172
|
+
#else
|
172
173
|
/* force salt tautomerism exploration */
|
173
174
|
#define FLAG_FORCE_SALT_TAUT ( FLAG_PROTON_NP_HARD_REMOVED | \
|
174
175
|
FLAG_PROTON_AC_HARD_REMOVED | \
|
175
176
|
FLAG_PROTON_AC_HARD_ADDED )
|
177
|
+
#endif
|
176
178
|
|
177
179
|
typedef struct tagTautomerNormInfo {
|
178
180
|
NUM_H nNumRemovedExplicitH; /* keeps track of explicit H */
|
data/ext/src/ichitime.h
CHANGED
@@ -2,8 +2,8 @@
|
|
2
2
|
* International Union of Pure and Applied Chemistry (IUPAC)
|
3
3
|
* International Chemical Identifier (InChI)
|
4
4
|
* Version 1
|
5
|
-
* Software version 1.
|
6
|
-
*
|
5
|
+
* Software version 1.01
|
6
|
+
* July 21, 2006
|
7
7
|
* Developed at NIST
|
8
8
|
*/
|
9
9
|
|
@@ -64,11 +64,25 @@ typedef struct tagInchiTime {
|
|
64
64
|
|
65
65
|
#endif
|
66
66
|
|
67
|
+
#ifndef INCHI_ALL_CPP
|
68
|
+
#ifdef __cplusplus
|
69
|
+
extern "C" {
|
70
|
+
#endif
|
71
|
+
#endif
|
72
|
+
|
73
|
+
|
67
74
|
void InchiTimeGet( inchiTime *TickEnd );
|
68
75
|
long InchiTimeMsecDiff( inchiTime *TickEnd, inchiTime *TickStart );
|
69
76
|
void InchiTimeAddMsec( inchiTime *TickEnd, unsigned long nNumMsec );
|
70
77
|
int bInchiTimeIsOver( inchiTime *TickEnd );
|
71
78
|
long InchiTimeElapsed( inchiTime *TickStart );
|
72
79
|
|
80
|
+
#ifndef INCHI_ALL_CPP
|
81
|
+
#ifdef __cplusplus
|
82
|
+
}
|
83
|
+
#endif
|
84
|
+
#endif
|
85
|
+
|
86
|
+
|
73
87
|
#endif /* __ICHITIME_H__ */
|
74
88
|
|
data/ext/src/inchicmp.h
ADDED
@@ -0,0 +1,107 @@
|
|
1
|
+
/*
|
2
|
+
* International Union of Pure and Applied Chemistry (IUPAC)
|
3
|
+
* International Chemical Identifier (InChI)
|
4
|
+
* Version 1
|
5
|
+
* Software version 1.01
|
6
|
+
* July 21, 2006
|
7
|
+
* Developed at NIST
|
8
|
+
*/
|
9
|
+
|
10
|
+
#ifndef __INCHICMP_H__
|
11
|
+
#define __INCHICMP_H__
|
12
|
+
|
13
|
+
typedef enum tagInchiCompareDiffBits {
|
14
|
+
INCHIDIFF_ZERO = 0x00000000,
|
15
|
+
INCHIDIFF_PROBLEM = 0x00000001, /* severe: at least one InChI does not exist */
|
16
|
+
INCHIDIFF_NUM_AT = 0x00000001, /* severe: different number of atoms in the skeleton */
|
17
|
+
INCHIDIFF_ATOMS = 0x00000001, /* severe: diiferent types of skeleton atoms */
|
18
|
+
INCHIDIFF_NUM_EL = 0x00000001, /* severe: formulas differ in another element */
|
19
|
+
INCHIDIFF_CON_LEN = 0x00000001, /* severe: different connection table lengths */
|
20
|
+
INCHIDIFF_CON_TBL = 0x00000001, /* severe: different connection tables */
|
21
|
+
INCHIDIFF_POSITION_H = 0x00000002, /* difference in non-taut (Mobile-H) or all H (Fixed-H) location/number */
|
22
|
+
INCHIDIFF_MORE_FH = 0x00000004, /* extra fixed H */
|
23
|
+
INCHIDIFF_LESS_FH = 0x00000004, /* missing fixed H */
|
24
|
+
INCHIDIFF_MORE_H = 0x00000008, /* formulas differ in number of H */
|
25
|
+
INCHIDIFF_LESS_H = 0x00000008, /* formulas differ in number of H */
|
26
|
+
INCHIDIFF_NO_TAUT = 0x00000010, /* restored structure has no taut groups while the original InChI has some */
|
27
|
+
INCHIDIFF_WRONG_TAUT = 0x00000020, /* restored has tautomerism while the original does not have it */
|
28
|
+
INCHIDIFF_SINGLE_TG = 0x00000040, /* restored has 1 taut. group while the original InChI has multiple tg */
|
29
|
+
INCHIDIFF_MULTIPLE_TG = 0x00000080, /* restored has multiple tg while the original InChI has only one tg */
|
30
|
+
INCHIDIFF_EXTRA_TG_ENDP = 0x00000100, /* extra tautomeric endpoint(s) in restored structure */
|
31
|
+
INCHIDIFF_MISS_TG_ENDP = 0x00000100, /* one or more tg endpoint is not in the restored structure */
|
32
|
+
INCHIDIFF_DIFF_TG_ENDP = 0x00000100, /* lists of tg endpoints are different */
|
33
|
+
INCHIDIFF_NUM_TG = 0x00000200, /* different number of tautomeric groups */
|
34
|
+
INCHIDIFF_TG = 0x00000200, /* different tautomeric groups */
|
35
|
+
INCHIDIFF_NUM_ISO_AT = 0x00000400, /* ?severe: restored struct. has different number of isotopic atoms */
|
36
|
+
INCHIDIFF_ISO_AT = 0x00000400, /* ?severe: restored struct. has different locations/isotopes of isotopic atoms */
|
37
|
+
INCHIDIFF_REM_ISO_H = 0x00000800, /* isotopic H removed */
|
38
|
+
INCHIDIFF_MOB_ISO_H = 0x00001000, /* different number of mobile exchangeable isotopic H */
|
39
|
+
INCHIDIFF_CHARGE = 0x00002000, /* restored structure has different charge */
|
40
|
+
INCHIDIFF_REM_PROT = 0x00004000, /* proton(s) removed/added from the restored structure */
|
41
|
+
INCHIDIFF_MOBH_PROTONS = 0x00008000, /* different proton balance */
|
42
|
+
INCHIDIFF_SC_INV = 0x00010000, /* restores structure has different inversion stereocenter mark */
|
43
|
+
INCHIDIFF_SC_PARITY = 0x00020000, /* restored structure has stereoatoms or allenes with different parity */
|
44
|
+
INCHIDIFF_SC_EXTRA_UNDF = 0x00040000, /* restored structure has extra undefined stereocenter(s) */
|
45
|
+
INCHIDIFF_SC_EXTRA = 0x00080000, /* restored structure has extra stereocenter(s) */
|
46
|
+
INCHIDIFF_SC_MISS_UNDF = 0x00100000, /* restored structure has not some undefined stereocenter(s) */
|
47
|
+
INCHIDIFF_SC_MISS = 0x00200000, /* restored structure has not some stereocenters that are not undefined */
|
48
|
+
INCHIDIFF_SB_PARITY = 0x00400000, /* restored structure has stereobonds or cumulenes with different parity */
|
49
|
+
INCHIDIFF_SB_EXTRA_UNDF = 0x00800000, /* restored structure has extra undefined stereobond(s) */
|
50
|
+
INCHIDIFF_SB_EXTRA = 0x01000000, /* restored structure has extra stereobond(s) */
|
51
|
+
INCHIDIFF_SB_MISS_UNDF = 0x02000000, /* restored structure has not some undefined stereocenters */
|
52
|
+
INCHIDIFF_SB_MISS = 0x04000000, /* restored structure has not some stereobonds that are not undefined */
|
53
|
+
INCHIDIFF_COMP_HLAYER = 0x08000000, /* Restored component has Mobile-H layer instead of both Mobile-H & Fixed-H or both instead of one */
|
54
|
+
INCHIDIFF_COMP_NUMBER = 0x10000000, /* wrong number of components */
|
55
|
+
INCHIDIFF_STR2INCHI_ERR = 0x20000000 /* Restored structure to InChI conversion error */
|
56
|
+
/* reserved
|
57
|
+
0x40000000
|
58
|
+
0x80000000
|
59
|
+
*/
|
60
|
+
} INCHIDIFF;
|
61
|
+
|
62
|
+
typedef enum tagtagCompareInchiMsgGroupID {
|
63
|
+
IDGRP_ZERO = 0,
|
64
|
+
IDGRP_ERR = 1,
|
65
|
+
IDGRP_H = 2,
|
66
|
+
IDGRP_MOB_GRP = 3,
|
67
|
+
IDGRP_ISO_AT = 4,
|
68
|
+
IDGRP_CHARGE = 5,
|
69
|
+
IDGRP_PROTONS = 6,
|
70
|
+
IDGRP_ISO_H = 7,
|
71
|
+
IDGRP_SC = 8,
|
72
|
+
IDGRP_SB = 9,
|
73
|
+
IDGRP_HLAYER =10,
|
74
|
+
IDGRP_COMP =11,
|
75
|
+
IDGRP_CONV_ERR =12
|
76
|
+
} CMP_INCHI_MSG_GROUP_ID;
|
77
|
+
|
78
|
+
|
79
|
+
typedef struct tagCompareInchiMsg {
|
80
|
+
INCHIDIFF nBit;
|
81
|
+
CMP_INCHI_MSG_GROUP_ID nGroupID;
|
82
|
+
const char *szMsg;
|
83
|
+
} CMP_INCHI_MSG;
|
84
|
+
|
85
|
+
typedef struct tagCompareInchiMsgGroup {
|
86
|
+
CMP_INCHI_MSG_GROUP_ID nGroupID;
|
87
|
+
const char *szGroupName;
|
88
|
+
} CMP_INCHI_MSG_GROUP;
|
89
|
+
|
90
|
+
|
91
|
+
|
92
|
+
|
93
|
+
|
94
|
+
|
95
|
+
#define INCHIDIFF_SB (INCHIDIFF_SB_PARITY | INCHIDIFF_SB_EXTRA_UNDF | INCHIDIFF_SB_EXTRA | INCHIDIFF_SB_MISS_UNDF | INCHIDIFF_SB_MISS)
|
96
|
+
#define INCHIDIFF_SC (INCHIDIFF_SC_PARITY | INCHIDIFF_SC_EXTRA_UNDF | INCHIDIFF_SC_EXTRA | INCHIDIFF_SC_MISS_UNDF | INCHIDIFF_SC_MISS)
|
97
|
+
|
98
|
+
#define INCHIDIFF_CONSTIT (INCHIDIFF_POSITION_H | INCHIDIFF_MORE_FH | INCHIDIFF_LESS_FH | INCHIDIFF_MORE_H | INCHIDIFF_LESS_H |\
|
99
|
+
INCHIDIFF_NO_TAUT | INCHIDIFF_WRONG_TAUT | INCHIDIFF_SINGLE_TG | INCHIDIFF_MULTIPLE_TG | \
|
100
|
+
INCHIDIFF_NUM_TG | INCHIDIFF_EXTRA_TG_ENDP | INCHIDIFF_MISS_TG_ENDP | INCHIDIFF_TG | \
|
101
|
+
INCHIDIFF_NUM_ISO_AT | INCHIDIFF_ISO_AT | INCHIDIFF_CHARGE | INCHIDIFF_REM_PROT | INCHIDIFF_REM_ISO_H |\
|
102
|
+
INCHIDIFF_DIFF_TG_ENDP)
|
103
|
+
#define INCHIDIFF_STEREO (INCHIDIFF_SC_INV | INCHIDIFF_SC_PARITY | INCHIDIFF_SC_EXTRA_UNDF | INCHIDIFF_SC_EXTRA | \
|
104
|
+
INCHIDIFF_SC_MISS_UNDF | INCHIDIFF_SC_MISS | INCHIDIFF_SB_PARITY | INCHIDIFF_SB_EXTRA_UNDF |\
|
105
|
+
INCHIDIFF_SB_EXTRA | INCHIDIFF_SB_MISS_UNDF | INCHIDIFF_SB_MISS)
|
106
|
+
|
107
|
+
#endif /* __INCHICMP_H__ */
|