/*
* International Union of Pure and Applied Chemistry (IUPAC)
* International Chemical Identifier (InChI)
* Version 1
* Software version 1.01
* July 21, 2006
* Developed at NIST
*/
#ifndef __EXTR_CT_H__
#define __EXTR_CT_H__
#include "mode.h"
#include "ichisize.h"
struct AtData {
char element[3];
int maxvalence;
};
#define NUM_CHEM_ELEMENTS 127 /* well above number of known chem. elements */
#define AT_ISO_SORT_KEY_MULT 32 /* up to 32 identical hydrogen isotopes */
/* (similar to T_GROUP_ISOWT_MULT) */
/* changed from 16 9-12-2003 */
typedef long AT_ISO_SORT_KEY; /* signed, should hold up to 4096*max_iso_diff */
/* (similar to T_GROUP_ISOWT) */
/*
= num_1H + AT_ISO_SORT_KEY_MULT*(num_D + AT_ISO_SORT_KEY_MULT*(num_T+AT_ISO_SORT_KEY_MULT*iso_atw_diff))
*/
/* typedef signed char AT_ISOTOPIC; */ /* + or - */
typedef struct tagStereoCarb {
AT_NUMB at_num;
U_CHAR parity;
} AT_STEREO_CARB;
typedef struct tagStereoDble {
AT_NUMB at_num1;
AT_NUMB at_num2;
U_CHAR parity;
} AT_STEREO_DBLE;
typedef struct tagIsotopicAtom {
AT_NUMB at_num;
NUM_H num_1H;
NUM_H num_D;
NUM_H num_T;
NUM_H iso_atw_diff;
} AT_ISOTOPIC;
typedef AT_NUMB AT_STEREO;
#define BYTE_BITS 8 /* number of bits in one byte */
#define BOND_MASK 0xf /* 4 bits */
#define BOND_BITS 4 /* 3 or 4 does not matter; 2 is too small for BOND_TAUTOM */
#define BOND_ADD (BOND_BITS==2?-1:0) /* subtract 1 from bonds stored in CT */
typedef struct tagAtom {
char elname[ATOM_EL_LEN];
AT_NUMB neighbor[MAXVAL]; /* changed to unsigned 2-2-95. D.Ch. */
AT_NUMB init_rank; /* also used in remove_terminal_HDT() to save orig. at. number */
AT_NUMB orig_at_number;
AT_NUMB orig_compt_at_numb;
/* low 3 bits=bond type;
high 5 bits (in case of cut-vertex atom) = an attached part number
*/
U_CHAR bond_type[MAXVAL];
U_CHAR el_number; /* periodic table number = charge of the nucleus = number of the protons */
/* U_CHAR hill_type; */ /* number in psudo hill order */
S_CHAR valence;
S_CHAR chem_bonds_valence; /* 8-24-00 to treat tautomer centerpoints, etc. */
S_CHAR num_H; /* first not including D, T; add_DT_to_num_H() includes. */
S_CHAR num_iso_H[NUM_H_ISOTOPES]; /* num 1H, 2H(D), 3H(T) */
S_CHAR cFlags;
S_CHAR iso_atw_diff; /* abs(iso_atw_diff) < 127 or 31 - ??? */
AT_ISO_SORT_KEY iso_sort_key; /* = num_1H + AT_ISO_SORT_KEY_MULT^1*num_D
+ AT_ISO_SORT_KEY_MULT^2*num_T
+ AT_ISO_SORT_KEY_MULT^3*iso_atw_diff
*/
S_CHAR charge;
S_CHAR radical; /* 1=>doublet(.), 2=> triplet as singlet (:) ???? why are they same ???? */
S_CHAR marked;
AT_NUMB endpoint; /* tautomer analysis. If != 0 then the hydrogens & (-)charge are in the tautomer group. */
/*
Pairs stereo_bond_neighbor[] and stereo_bond_neighbor2[], etc
initially refer to non-isotopic and isotopic cases, respectively.
To use same stereo processing code these arrays are swapped when
switching from non-isotopic to isotopic processing and back.
*/
AT_NUMB stereo_bond_neighbor[MAX_NUM_STEREO_BONDS]; /* Original number of an opposite atom */
AT_NUMB stereo_bond_neighbor2[MAX_NUM_STEREO_BONDS]; /* (stereo bond neighbor) +1; */
S_CHAR stereo_bond_ord[MAX_NUM_STEREO_BONDS]; /* Ordering number of a bond/neighbor in the direction to the */
S_CHAR stereo_bond_ord2[MAX_NUM_STEREO_BONDS]; /* stereo bond opposite atom (important for cumulenes); */
S_CHAR stereo_bond_z_prod[MAX_NUM_STEREO_BONDS]; /* Relative atom-neighbors */
S_CHAR stereo_bond_z_prod2[MAX_NUM_STEREO_BONDS]; /* double bond planes orientation; */
S_CHAR stereo_bond_parity[MAX_NUM_STEREO_BONDS]; /* parity + MULT_STEREOBOND*chain_length, */
S_CHAR stereo_bond_parity2[MAX_NUM_STEREO_BONDS]; /* where: */
/*
parity (Mask 0x07=BITS_PARITY):
0 = AB_PARITY_NONE = not a stereo bond
1/2 = AB_PARITY_ODD/EVEN = bond parity defined from initial ranks
3 = AB_PARITY_UNKN = geometry is unknown to the user
4 = AB_PARITY_UNDF = not enough geometry info to find the parity
6 = AB_PARITY_CALC = calculate later from the neighbor ranks; some ot them can be
replaced with AB_PARITY_ODD/EVEN after equivalence ranks have been determined
length (Mask 0x38=MASK_CUMULENE_LEN, length=stereo_bond_parity[i]/MULT_STEREOBOND):
0 => double or alternating stereogenic bond
1 => cumulene with 2 double bonds (stereogenic center)
2 => cumulene with 3 double bonds (stereogenic bond)
length <= (MAX_CUMULENE_LEN=2)
bit KNOWN_PARITIES_EQL = 0x40: all pairs of const. equ. atoms are connected by stereo bonds
and these bonds have identical parities
*/
S_CHAR parity; /* -- Mask 0x07=BITS_PARITY: --
0 = AB_PARITY_NONE => no parity; also parity&0x38 = 0
1 = AB_PARITY_ODD => odd parity
2 = AB_PARITY_EVEN => even parity
3 = AB_PARITY_UNKN => user marked as unknown parity
4 = AB_PARITY_UNDF => parity cannot be defined because of symmetry or not well defined geometry
*/
S_CHAR parity2; /* parity including parity due to isotopic terminal H */
/* bit msks: 0x07 => known parity (1,2,3,4) or AB_PARITY_CALC=6, AB_PARITY_IISO = 6 */
/* 0x40 => KNOWN_PARITIES_EQL */
S_CHAR stereo_atom_parity; /* similar to stereo_bond_parity[]: known in advance AB_PARITY_* value + KNOWN_PARITIES_EQL bit */
S_CHAR stereo_atom_parity2;
S_CHAR final_parity; /* defined by equivalence ranks */
S_CHAR final_parity2; /* defined by equivalence ranks, incl. due to terminal isotopic H */
S_CHAR bAmbiguousStereo;
S_CHAR bHasStereoOrEquToStereo;
S_CHAR bHasStereoOrEquToStereo2;
#if( FIND_RING_SYSTEMS == 1 )
S_CHAR bCutVertex;
AT_NUMB nRingSystem;
AT_NUMB nNumAtInRingSystem;
AT_NUMB nBlockSystem;
#if( FIND_RINS_SYSTEMS_DISTANCES == 1 )
AT_NUMB nDistanceFromTerminal;
#endif
#endif
S_CHAR z_dir[3];
} sp_ATOM ;
#define BOND_SINGLE BOND_TYPE_SINGLE /* 1 */
#define BOND_DOUBLE BOND_TYPE_DOUBLE /* 2 */
#define BOND_TRIPLE BOND_TYPE_TRIPLE /* 3 */
#define BOND_ALTERN BOND_TYPE_ALTERN /* 4 single/double */
#define BOND_ALT_123 5 /* single/double/triple */
#define BOND_ALT_13 6 /* single/triple */
#define BOND_ALT_23 7 /* double/triple */
#define BOND_TAUTOM 8
#define BOND_ALT12NS 9
#define BOND_NUMDIF 9 /* number of different kinds of bonds */
#define BOND_TYPE_MASK 0x0f
#define BOND_MARK_ALL 0xf0 /* complement to BOND_TYPE_MASK */
#define BOND_MARK_ALT12 0x10
#define BOND_MARK_ALT123 0x20
#define BOND_MARK_ALT13 0x30
#define BOND_MARK_ALT23 0x40
#define BOND_MARK_ALT12NS 0x50 /* 1 or 2, non-stereo */
#define BOND_MARK_MASK 0x70
#define ACTUAL_ORDER(PBNS, IAT,IBOND, BTYPE) ( ((PBNS) && (PBNS)->edge && (PBNS)->vert &&\
((BTYPE)==BOND_ALT_123 || (BTYPE)==BOND_ALT_13 || (BTYPE)==BOND_ALT_23))? (PBNS)->edge[(PBNS)->vert[IAT].iedge[IBOND]].flow+BOND_TYPE_SINGLE:(BTYPE))
#define BITS_PARITY 0x07 /* mask to retrieve half-bond parity */
#define MASK_CUMULENE_LEN 0x38 /* mask to retrieve (cumulene chain length - 1)*MULT_STEREOBOND */
#define KNOWN_PARITIES_EQL 0x40 /* parity is same for all pairs of constit. equivalent atoms */
#define MAX_CUMULENE_LEN 2 /* max number of bonds in a cumulene chain - 1 */
#define MULT_STEREOBOND 0x08 /* multiplier for cumulene chain length
odd length => chiral, even length => stereogenic bond */
#define MAKE_BITS_CUMULENE_LEN(X) ((X)*MULT_STEREOBOND)
#define GET_BITS_CUMULENE_LEN(X) ((X)&MASK_CUMULENE_LEN)
#define BOND_CHAIN_LEN(X) (GET_BITS_CUMULENE_LEN(X)/MULT_STEREOBOND) /* 0 => double bond, 1 => allene, 2 => cumulene,..*/
#define IS_ALLENE_CHAIN(X) ((GET_BITS_CUMULENE_LEN(X)/MULT_STEREOBOND)%2)
/* atom or bond parity value definitions */
#define AB_PARITY_NONE 0 /* 0 => no parity; also parity&0x38 = 0 */
#define AB_PARITY_ODD 1 /* 1 => odd parity */
#define AB_PARITY_EVEN 2 /* 2 => even parity */
#define AB_PARITY_UNKN 3 /* 3 => user marked as unknown parity */
#define AB_PARITY_UNDF 4 /* 4 => parity cannot be defined because of symmetry or not well defined geometry */
#define AB_PARITY_IISO 5 /* 5 => no parity because of identical atoms */
#define AB_PARITY_CALC 6 /* 6 => calculate parity later */
#define AB_PARITY_0D 8 /* 8 => bit signifies 0D case -- not used */
#define AB_INV_PARITY_BITS (AB_PARITY_ODD ^ AB_PARITY_EVEN)
#define AB_MAX_KNOWN_PARITY 4 /* precalculated from const. equivalence parities */
#define AB_MIN_KNOWN_PARITY 1
#define AB_MAX_PART_DEFINED_PARITY 3 /* 1, 2, 3 => defined parities, uncluding 'unknown' */
#define AB_MIN_PART_DEFINED_PARITY 1 /* min(AB_PARITY_ODD, AB_PARITY_EVEN, AB_PARITY_UNKN) */
#define AB_MAX_WELL_DEFINED_PARITY 2 /* 1, 2 => well defined parities, uncluding 'unknown' */
#define AB_MIN_WELL_DEFINED_PARITY 1 /* min(AB_PARITY_ODD, AB_PARITY_EVEN) */
#define AB_MIN_ILL_DEFINED_PARITY 3
#define AB_MAX_ILL_DEFINED_PARITY 4
#define AB_MAX_ANY_PARITY 4
#define AB_MIN_ANY_PARITY 1
#define AMBIGUOUS_STEREO 1
#define AMBIGUOUS_STEREO_ATOM 2
#define AMBIGUOUS_STEREO_BOND 4
#define AMBIGUOUS_STEREO_ATOM_ISO 8
#define AMBIGUOUS_STEREO_BOND_ISO 16
#define AMBIGUOUS_STEREO_ERROR 32
#define MIN_DOT_PROD 50 /* min value of at->stereo_bond_z_prod[i] to define parity */
#define ATOM_PARITY_VAL(X) (X)
#define ATOM_PARITY_PART_DEF(X) (AB_MIN_PART_DEFINED_PARITY <= (X) && (X) <= AB_MAX_PART_DEFINED_PARITY)
#define ATOM_PARITY_ILL_DEF(X) (AB_MIN_ILL_DEFINED_PARITY <= (X) && (X) <= AB_MAX_ILL_DEFINED_PARITY)
#define ATOM_PARITY_KNOWN(X) (AB_MIN_KNOWN_PARITY <= (X) && (X) <= AB_MAX_KNOWN_PARITY)
#define ATOM_PARITY_WELL_DEF(X) (AB_MIN_WELL_DEFINED_PARITY <= (X) && (X) <= AB_MAX_WELL_DEFINED_PARITY)
#define ATOM_PARITY_NOT_UNKN(X) (ATOM_PARITY_KNOWN(X) && (X) != AB_PARITY_UNKN)
#define PARITY_VAL(X) ((X) & BITS_PARITY)
#define PARITY_PART_DEF(X) (AB_MIN_PART_DEFINED_PARITY <= PARITY_VAL(X) && PARITY_VAL(X) <= AB_MAX_PART_DEFINED_PARITY)
#define PARITY_ILL_DEF(X) (AB_MIN_ILL_DEFINED_PARITY <= PARITY_VAL(X) && PARITY_VAL(X) <= AB_MAX_ILL_DEFINED_PARITY)
#define PARITY_KNOWN(X) (AB_MIN_KNOWN_PARITY <= PARITY_VAL(X) && PARITY_VAL(X) <= AB_MAX_KNOWN_PARITY)
#define PARITY_WELL_DEF(X) (AB_MIN_WELL_DEFINED_PARITY <= PARITY_VAL(X) && PARITY_VAL(X) <= AB_MAX_WELL_DEFINED_PARITY)
#define PARITY_CALCULATE(X) (AB_PARITY_CALC == PARITY_VAL(X))
#define BOND_PARITY_PART_DEFINED(X) (PARITY_PART_DEF(X) || PARITY_CALCULATE(X))
#define BOND_PARITY_PART_KNOWN(X) (PARITY_KNOWN(X) || PARITY_CALCULATE(X))
#define ALL_BUT_PARITY(X) ((X)&~BITS_PARITY)
#define ALWAYS_SET_STEREO_PARITY 0
#define NO_ISOLATED_NON_6RING_AROM_BOND 0 /* for Yuri */
#define SAVE_6_AROM_CENTERS 0 /* for Yuri */
#endif /* __EXTR_CT_H__ */
syntax highlighted by Code2HTML, v. 0.9.1