/*
* 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 __INCHI_H__
#define __INCHI_H__
#include "comdef.h"
#define REQ_MODE_BASIC 0x000001 /* B include Fixed-H layer */
#define REQ_MODE_TAUT 0x000002 /* T include Mobile-H layer */
#define REQ_MODE_ISO 0x000004 /* I */
#define REQ_MODE_NON_ISO 0x000008 /* NI */
#define REQ_MODE_STEREO 0x000010 /* S */
#define REQ_MODE_ISO_STEREO 0x000020 /* IS */
#define REQ_MODE_NOEQ_STEREO 0x000040 /* SS */
#define REQ_MODE_REDNDNT_STEREO 0x000080 /* RS */
#define REQ_MODE_NO_ALT_SBONDS 0x000100 /* NASB */
/* new 10-10-2003 */
#define REQ_MODE_RELATIVE_STEREO 0x000200 /* REL All Relative Stereo */
#define REQ_MODE_RACEMIC_STEREO 0x000400 /* RAC All Racemic Stereo */
#define REQ_MODE_SC_IGN_ALL_UU 0x000800 /* IAUSC Ignore stereocenters if All Undef/Unknown */
#define REQ_MODE_SB_IGN_ALL_UU 0x001000 /* IAUSC Ignore stereobonds if All Undef/Unknown */
#define REQ_MODE_CHIR_FLG_STEREO 0x002000 /* SUCF If Chiral flag then Abs otherwise Rel stereo */
/* end of 10-10-2003 */
#define REQ_MODE_MIN_SB_RING_MASK 0x0F0000 /* RSB */
#define REQ_MODE_MIN_SB_RING_SHFT 16
#define REQ_MODE_DEFAULT (REQ_MODE_BASIC | REQ_MODE_TAUT | REQ_MODE_ISO | REQ_MODE_NON_ISO | REQ_MODE_STEREO)
#define WARN_FAILED_STEREO 0x0001
#define WARN_FAILED_ISOTOPIC 0x0002
#define WARN_FAILED_ISOTOPIC_STEREO 0x0004
#define ERR_NO_CANON_RESULTS 0x0008
/*********** compare components flags **********************************/
#define CMP_COMPONENTS 0x0001 /* perform compare components */
#define CMP_COMPONENTS_NONISO 0x0002 /* ignore isotopic */
#define CMP_COMPONENTS_NONTAUT 0x0004 /* compare non-tautomeric */
/****************** chemical identifier member definitions *************/
typedef struct tagINChI_IsotopicAtom {
AT_NUMB nAtomNumber; /* Canonical atom number */
NUM_H nIsoDifference; /* 0=non-isotopic; 1=rounded avg. atomic mass */
NUM_H nNum_H; /* number of 1H isotopic atoms attached */
NUM_H nNum_D; /* number of 2H isotopic atoms attached */
NUM_H nNum_T; /* number of 3H isotopic atoms attached */
} INChI_IsotopicAtom;
typedef struct tagINChI_IsotopicTGroup {
AT_NUMB nTGroupNumber; /* Tautomeric group number */
AT_NUMB nNum_H; /* number of 1H isotopic atoms */
AT_NUMB nNum_D; /* number of 2H isotopic atoms */
AT_NUMB nNum_T; /* number of 3H isotopic atoms */
} INChI_IsotopicTGroup;
typedef struct tagINChI_Stereo { /* [N] = allocated length */
/* ---- possibly tetrahedral stereogenic atoms */
int nNumberOfStereoCenters;
AT_NUMB *nNumber; /* Canonical number of a possibly tetrahedral
* stereogenic atom or allenes [nNumberOfAtoms] */
S_CHAR *t_parity; /* tetrahedral (relative, see nCompInv2Abs) atom parities [nNumberOfAtoms] */
/* ---- possibly tetrahedral stereogenic atoms of the iverted structure */
AT_NUMB *nNumberInv; /* Canonical number of a possibly tetrahedral
* stereogenic atom or allene [nNumberOfAtoms] */
S_CHAR *t_parityInv; /* tetrahedral inverted atom parities [nNumberOfAtoms] */
/* bFlagAbsStereoIsInverted = nCompInv2Abs==-1: Abs stereo = Inverted */
int nCompInv2Abs; /* 0=>Inv = Abs stereo; -1=> Inv < Abs stereo, +1=> Inv > Abs stereo */
int bTrivialInv; /* 1=> nCompInv2Abs!= 0 && Inverted = Abs stereo with inverted parities 1<-->2 */
/* ---- possibly stereogenic bonds and tetrahedral cumuleles */
int nNumberOfStereoBonds;
AT_NUMB *nBondAtom1; /* Canonical number of a first atom
* [number of bonds] */
AT_NUMB *nBondAtom2; /* Canonical number of a second atom
* [number of bonds] */
S_CHAR *b_parity; /* possibly stereogenic bond parities
* [number of bonds] */
} INChI_Stereo;
#define INCHI_FLAG_ACID_TAUT 0x0001 /* tautomerism of dissociated acid invoked */
#define INCHI_FLAG_REL_STEREO 0x0002 /* requested relative stereo */
#define INCHI_FLAG_RAC_STEREO 0x0004 /* requested racemic stereo */
#define INCHI_FLAG_SC_IGN_ALL_UU 0x0008 /* ignored all undefined/unknown stereocenters, non-isotopic */
#define INCHI_FLAG_SB_IGN_ALL_UU 0x0010 /* ignored all undefined/unknown stereocenters, non-isotopic */
#define INCHI_FLAG_SC_IGN_ALL_ISO_UU 0x0020 /* ignored all undefined/unknown stereocenters, isotopic */
#define INCHI_FLAG_SB_IGN_ALL_ISO_UU 0x0040 /* ignored all undefined/unknown stereocenters, isotopic */
#define INCHI_FLAG_HARD_ADD_REM_PROTON 0x0080 /* in normalization a proton has been added or removed along alt path */
#define INCHI_OUT_NO_AUX_INFO 0x0001 /* do not output Aux Info */
#define INCHI_OUT_SHORT_AUX_INFO 0x0002 /* output short version of Aux Info */
#define INCHI_OUT_ONLY_AUX_INFO 0x0004 /* output only Aux Info */
#define INCHI_OUT_EMBED_REC 0x0008 /* embed reconnected INChI into disconnected INChI */
#define INCHI_OUT_SDFILE_ONLY 0x0010 /* save input data in a Molfile instead of creating INChI */
#define INCHI_OUT_XML 0x0020 /* output xml INChI */
#define INCHI_OUT_PLAIN_TEXT 0x0040 /* output plain text INChI */
#define INCHI_OUT_PLAIN_TEXT_COMMENTS 0x0080 /* output plain text annotation */
#define INCHI_OUT_XML_TEXT_COMMENTS 0x0100 /* output xml text annotation */
#define INCHI_OUT_WINCHI_WINDOW 0x0200 /* output into wINChI text window */
#define INCHI_OUT_TABBED_OUTPUT 0x0400 /* tab-delimited (only for plain text) */
#define INCHI_OUT_SDFILE_ATOMS_DT 0x0800 /* SDfile output H isotopes as D and T */
#define INCHI_OUT_SDFILE_SPLIT 0x1000 /* Split SDfile into components */
#define INCHI_OUT_PRINT_OPTIONS (INCHI_OUT_EMBED_REC | \
INCHI_OUT_XML | \
INCHI_OUT_PLAIN_TEXT | \
INCHI_OUT_PLAIN_TEXT_COMMENTS | \
INCHI_OUT_XML_TEXT_COMMENTS)
/*******REQ_MODE_SB_IGN_ALL_UU*************** chemical identifier definition *****************/
typedef struct tagINChI { /* [N] = allocated length */
int nErrorCode; /* 0 = success */
INCHI_MODE nFlags; /* INCHI_FLAG_ACID_TAUT tautomerism of dissociated acid invoked
INCHI_FLAG_REL_STEREO requested relative stereo
INCHI_FLAG_RAC_STEREO requested racemic stereo
INCHI_FLAG_SC_IGN_ALL_UU ignored all undefined/unknown stereocenters, non-isotopic
INCHI_FLAG_SB_IGN_ALL_UU ignored all undefined/unknown stereocenters, non-isotopic
INCHI_FLAG_SC_IGN_ALL_ISO_UU ignored all undefined/unknown stereocenters, isotopic
INCHI_FLAG_SB_IGN_ALL_ISO_UU ignored all undefined/unknown stereocenters, isotopic
INCHI_FLAG_HARD_ADD_REM_PROTON in normalization a proton has been added or removed along alt path
*/
/* ---- basic & tautomer layer */
int nTotalCharge;
int nNumberOfAtoms;
char *szHillFormula;
U_CHAR *nAtom; /* atomic numbers [nNumberOfAtoms] from the Periodic Table */
int lenConnTable;
AT_NUMB *nConnTable; /* Connection table [nNumberOfAtoms+NumberOfBonds] */
int lenTautomer;
AT_NUMB *nTautomer; /* NumGroups; ((NumAt+1, NumH, At1..AtNumAt),...); {INCHI_T_NUM_MOVABLE = 1} - old
* NumGroups; ((NumAt+2, NumH, Num(-), At1..AtNumAt),...); {INCHI_T_NUM_MOVABLE = 2} - new
* Allocated length: [5*nNumberOfAtoms/2+1], see Alloc_INChI(...) */
S_CHAR *nNum_H; /* number of terminal hydrogen atoms on each atom; in tautomeric
* representation these H on tautomeric atoms are not included [nNumberOfAtoms] */
S_CHAR *nNum_H_fixed;/* number of terminal hydrogen atoms on tautomeric atoms,
* in non-atautomeric representation only [nNumberOfAtoms] */
/* ---- isotopic & isotopic tautomeric layer */
int nNumberOfIsotopicAtoms;
INChI_IsotopicAtom *IsotopicAtom; /* [nNumberOfIsotopicAtoms] */
int nNumberOfIsotopicTGroups;
/* in reversing InChI keeps a pointer to stolen from AuxInfo coordinates */
INChI_IsotopicTGroup *IsotopicTGroup; /* [nNumberOfIsotopicAtoms] */
/* ---- stereo layer */
INChI_Stereo *Stereo;
INChI_Stereo *StereoIsotopic;
/* not including mobile H groups */
AT_NUMB *nPossibleLocationsOfIsotopicH; /* [0]=> length including 0th element, location1,...*/
int bDeleted;
#if( bREUSE_INCHI == 1 )
int nRefCount;
#endif
#if( bRELEASE_VERSION == 0 )
int bExtract;
#endif
#if( READ_INCHI_STRING == 1 )
int nLink; /* negative: ignore InChI; positive: index of (Reconnected component) + 1 linked to it */
#endif
} INChI;
typedef INChI *PINChI2[TAUT_NUM];
typedef struct tagOrigInfo {
S_CHAR cCharge;
S_CHAR cRadical; /* 0=none, 1=doublet, 2=triplet, 3=unknown */
S_CHAR cUnusualValence; /* see get_unusual_el_valence() */
} ORIG_INFO;
/******************** auxiliary chemical identifier info **************/
typedef struct tagINChI_Aux { /* [N] = allocated length */
int nErrorCode; /* 0 = success */
int nNumberOfAtoms;
int nNumberOfTGroups; /* non-zero only in tautomeric representation */
int bIsIsotopic; /* filled out even though isotopic has not been requested */
int bIsTautomeric; /* filled out even though tautomeric has not been requested; non-zero if taut exists */
/* canonical numbers of the atoms: nOrigAtNosInCanonOrd[i-1]+1 = */
/* input atom number for the canonical number i */
AT_NUMB *nOrigAtNosInCanonOrd; /* [nNumberOfInputAtoms*1.5]; */
AT_NUMB *nIsotopicOrigAtNosInCanonOrd; /* [nNumberOfInputAtoms*1.5]; */
/* same for the inverted structure */
AT_NUMB *nOrigAtNosInCanonOrdInv; /* inveterted stereo [nNumberOfInputAtoms*1.5]; */
AT_NUMB *nIsotopicOrigAtNosInCanonOrdInv; /* [nNumberOfInputAtoms*1.5]; */
AT_NUMB *nConstitEquNumbers; /* [nNumberOfAtoms*1.5] */
AT_NUMB *nConstitEquTGroupNumbers; /* [nNumberOfAtoms/2] */
AT_NUMB *nConstitEquIsotopicNumbers; /* [nNumberOfAtoms*1.5] */
AT_NUMB *nConstitEquIsotopicTGroupNumbers; /* [nNumberOfAtoms/2] */
#if( bREUSE_INCHI == 1 )
int nRefCount;
#endif
#if( TEST_RENUMB_ATOMS == 1 )
unsigned long ulNormTime;
unsigned long ulCanonTime;
#endif
ORIG_INFO *OrigInfo;
MOL_COORD *szOrigCoord;
NUM_H nNumRemovedProtons;
NUM_H nNumRemovedIsotopicH[NUM_H_ISOTOPES]; /* isotopic H that may be exchanged and considered
randomly distributed, including removed protons;
order: 0=>1H, 1=>D, 2=>T */
int bDeleted;
INCHI_MODE bTautFlags; /* t_group_info->bTautFlags */
INCHI_MODE bTautFlagsDone; /* t_group_info->bTautFlagsDone */
INCHI_MODE bNormalizationFlags; /* t_group_info->tni.bNormalizationFlags */
int nCanonFlags;
} INChI_Aux;
typedef INChI_Aux *PINChI_Aux2[TAUT_NUM];
/********************* array of pointers for sorting components and INChI output *********/
typedef struct tagINChIforSort {
INChI *pINChI[TAUT_NUM];
INChI_Aux *pINChI_Aux[TAUT_NUM];
short ord_number; /* for stable sort */
short n1; /* points to the original; used in structure reconstruction only */
short n2; /* points to the original; used in structure reconstruction only */
short n3; /* points to the original; used in structure reconstruction only */
}INCHI_SORT;
#endif /* __INCHI_H__ */
syntax highlighted by Code2HTML, v. 0.9.1