/*
* International Union of Pure and Applied Chemistry (IUPAC)
* International Chemical Identifier (InChI)
* Version 1
* Software version 1.01
* July 21, 2006
* Developed at NIST
*/
/* input/output format */
#ifndef __INPDEF_H__
#define __INPDEF_H__
#include "mode.h"
#include "comdef.h"
#include "ichidrp.h"
#define bDrawingLabelLeftShift endpoint /* for drawing only */
typedef S_SHORT ST_CAP_FLOW;
/* inp_ATOM::at_type */
#define ATT_NONE 0x0000
#define ATT_ACIDIC_CO 0x0001
#define ATT_ACIDIC_S 0x0002
#define ATT_OO 0x0004
#define ATT_ZOO 0x0008
#define ATT_NO 0x0010
#define ATT_N_O 0x0020
#define ATT_ATOM_N 0x0040
#define ATT_ATOM_P 0x0080
#define ATT_OTHER_NEG_O 0x0100
#define ATT_OTHER_ZO 0x0200 /* -Z=O or =Z=O */
#define ATT_OH_MINUS 0x0400 /* OH(-), O=O,S,Se,Te */
#define ATT_O_PLUS 0x0800 /* -OH2(+), =OH(+), -OH(+)-, OH3(+), =O(+)-, etc; O=O,S,Se,Te */
#define ATT_PROTON 0x1000
#define ATT_HalAnion 0x2000
#define ATT_HalAcid 0x4000
#define AT_FLAG_ISO_H_POINT 0x01 /* may have isotopic H */
#define PERIODIC_NUMBER_H 1
#ifndef NUMH
#define NUM_ISO_H(AT,N) (AT[N].num_iso_H[0]+AT[N].num_iso_H[1]+AT[N].num_iso_H[2])
#define NUMH(AT,N) (AT[N].num_H+NUM_ISO_H(AT,N))
#endif
#define FlagSC_0D 1 /* bUsed0DParity */
#define FlagSB_0D 2 /* bUsed0DParity */
#define SB_PARITY_FLAG 0x38 /* mask for disconnected metal parity if it is different */
#define SB_PARITY_SHFT 3 /* number of right shift bits to get disconnected metal parity */
#define SB_PARITY_MASK 0x07
#define SB_PARITY_1(X) (X & SB_PARITY_MASK) /* refers to connected structure */
#define SB_PARITY_2(X) (((X) >> SB_PARITY_SHFT) & SB_PARITY_MASK) /* refers to connected structure */
typedef struct tagInputAtom {
char elname[ATOM_EL_LEN]; /* chem. element name */
U_CHAR el_number; /* number of the element in the Periodic Table */
AT_NUMB neighbor[MAXVAL]; /* positions (from 0) of the neighbors in the inp_ATOM array */
AT_NUMB orig_at_number; /* original atom number */
AT_NUMB orig_compt_at_numb; /* atom number within the component before terminal H removal */
S_CHAR bond_stereo[MAXVAL]; /* 1=Up,4=Either,6=Down; this atom is at the pointing wedge,
negative => on the opposite side; 3=Either double bond */
U_CHAR bond_type[MAXVAL]; /* 1..4; 4="aromatic", should be discouraged on input */
S_CHAR valence; /* number of bonds = number of neighbors */
S_CHAR chem_bonds_valence; /* sum of bond types (type 4 needs special treatment) */
S_CHAR num_H; /* number of implicit hydrogens including D and T */
S_CHAR num_iso_H[NUM_H_ISOTOPES]; /* number of implicit 1H, 2H(D), 3H(T) < 16 */
S_CHAR iso_atw_diff; /* =0 => natural isotopic abundances */
/* >0 => (mass) - (mass of the most abundant isotope) + 1 */
/* <0 => (mass) - (mass of the most abundant isotope) */
S_CHAR charge; /* charge */
S_CHAR radical; /* RADICAL_SINGLET, RADICAL_DOUBLET, or RADICAL_TRIPLET */
S_CHAR bAmbiguousStereo;
S_CHAR cFlags; /* AT_FLAG_ISO_H_POINT */
AT_NUMB at_type; /* ATT_NONE, ATT_ACIDIC */
AT_NUMB component; /* number of the structure component > 0 */
AT_NUMB endpoint; /* id of a tautomeric group */
AT_NUMB c_point; /* id of a positive charge group */
double x;
double y;
double z;
/* cml 0D parities */
S_CHAR bUsed0DParity; /* bit=1 => stereobond; bit=2 => stereocenter */
/* cml tetrahedral parity */
S_CHAR p_parity;
AT_NUMB p_orig_at_num[MAX_NUM_STEREO_ATOM_NEIGH];
/* cml bond parities */
S_CHAR sb_ord[MAX_NUM_STEREO_BONDS]; /* stereo bond/neighbor ordering number, starts from 0 */
/* neighbors on both sides of stereobond have same sign=> trans/T/E, diff. signs => cis/C/Z */
S_CHAR sn_ord[MAX_NUM_STEREO_BONDS]; /* ord. num. of the neighbor adjacent to the SB; starts from 0;
-1 means removed explicit H */
/* neighbors on both sides of stereobond have same parity => trans/T/E/2, diff. parities => cis/C/Z/1 */
S_CHAR sb_parity[MAX_NUM_STEREO_BONDS];
AT_NUMB sn_orig_at_num[MAX_NUM_STEREO_BONDS]; /* orig. at number of sn_ord[] neighbors */
#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; /* terminal atom or ring system has 1, next has 2, etc. */
#endif
#endif
} inp_ATOM;
typedef struct tagOrigAtom {
/* initially filled out by MolfileToOrigAtom */
/* may be changed by disconnecting salts and disconnecting metals */
inp_ATOM *at;
int num_dimensions;
int num_inp_bonds;
int num_inp_atoms;
/* may be changed by disconnecting salts and disconnecting metals */
int num_components; /* set by MarkDisconnectedComponents() and disconnecting metals */
int bDisconnectSalts; /* whether salt disconnection is possible */
int bDisconnectCoord; /* 0 if no disconnection needed else (Num Implicit H to disconnect)+1 */
#if( bRELEASE_VERSION == 0 )
int bExtract;
#endif
AT_NUMB *nCurAtLen; /* has max_num_components elements */
AT_NUMB *nOldCompNumber; /* 0 or component number in previous numbering */
int nNumEquSets; /* number of found component equivalence sets */
AT_NUMB *nEquLabels; /* num_inp_atoms elements, value>0 marks atoms in the set #value */
AT_NUMB *nSortedOrder; /* num_components elements, values = 1..num_components; only if num_components > 1 */
int bSavedInINCHI_LIB[INCHI_NUM];
int bPreprocessed[INCHI_NUM];
MOL_COORD *szCoord;
} ORIG_ATOM_DATA;
typedef struct tagOriginalStruct {
int num_atoms;
char *szAtoms;
char *szBonds;
char *szCoord;
} ORIG_STRUCT;
typedef struct tagAtomParmsForDrawing {
char at_string[ATOM_INFO_LEN];
int DrawingLabelLeftShift;
int DrawingLabelLength;
AT_NUMB nCanonNbr; /* if zero then do not use all data for the atom */
AT_NUMB nCanonEquNbr;
AT_NUMB nTautGroupCanonNbr;
AT_NUMB nTautGroupEquNbr;
S_CHAR cFlags; /* AT_FLAG_ISO_H_POINT */
#ifdef DISPLAY_DEBUG_DATA
int nDebugData;
#endif
S_CHAR cHighlightTheAtom;
S_CHAR cStereoCenterParity;
S_CHAR cStereoBondParity[MAX_STEREO_BONDS];
S_CHAR cStereoBondWarning[MAX_STEREO_BONDS];
S_CHAR cStereoBondNumber[MAX_STEREO_BONDS];
} inf_ATOM;
#define INF_STEREO_ABS 0x0001
#define INF_STEREO_REL 0x0002
#define INF_STEREO_RAC 0x0004
#define INF_STEREO_NORM 0x0008
#define INF_STEREO_INV 0x0010
#define INF_STEREO 0x0020
#define INF_STEREO_ABS_REL_RAC (INF_STEREO_ABS | INF_STEREO_REL | INF_STEREO_RAC)
#define INF_STEREO_NORM_INV (INF_STEREO_NORM | INF_STEREO_INV)
#define MAX_LEN_REMOVED_PROTONS 128
typedef struct tagInfoAtomData {
inf_ATOM *at;
int num_at;
AT_NUMB StereoFlags;
AT_NUMB num_components;
AT_NUMB *pStereoFlags;
int nNumRemovedProtons;
int num_removed_iso_H; /* number of exchangable isotopic H */
NUM_H num_iso_H[NUM_H_ISOTOPES]; /* number of exchangable isotopic H */
char szRemovedProtons[MAX_LEN_REMOVED_PROTONS];
} INF_ATOM_DATA;
typedef struct tagInputAtomData {
inp_ATOM *at;
inp_ATOM *at_fixed_bonds; /* tautomeric case, added or removed H */
int num_at;
int num_removed_H;
int num_bonds;
int num_isotopic;
int bExists;
int bDeleted;
int bHasIsotopicLayer;
int bTautomeric;
int bTautPreprocessed;
int nNumRemovedProtons;
NUM_H nNumRemovedProtonsIsotopic[NUM_H_ISOTOPES]; /* isotopic composition of removed protons, not included in num_iso_H[] */
NUM_H num_iso_H[NUM_H_ISOTOPES]; /* isotopic H on tautomeric atoms and those in nIsotopicEndpointAtomNumber */
INCHI_MODE bTautFlags;
INCHI_MODE bTautFlagsDone;
INCHI_MODE bNormalizationFlags;
} INP_ATOM_DATA;
typedef INP_ATOM_DATA INP_ATOM_DATA2[TAUT_NUM];
typedef struct tagNormCanonFlags {
INCHI_MODE bTautFlags[INCHI_NUM][TAUT_NUM];
INCHI_MODE bTautFlagsDone[INCHI_NUM][TAUT_NUM];
INCHI_MODE bNormalizationFlags[INCHI_NUM][TAUT_NUM];
int nCanonFlags[INCHI_NUM][TAUT_NUM];
} NORM_CANON_FLAGS;
typedef struct tagCompositeAtomData {
inp_ATOM *at;
int num_at;
int num_removed_H;
int num_bonds;
int num_isotopic;
int bExists;
int bDeleted; /* unused */
int bHasIsotopicLayer;
int bTautomeric;
int nNumRemovedProtons;
NUM_H nNumRemovedProtonsIsotopic[NUM_H_ISOTOPES]; /* isotopic composition of removed protons, not included in num_iso_H[] */
NUM_H num_iso_H[NUM_H_ISOTOPES]; /* isotopic H on tautomeric atoms and those in nIsotopicEndpointAtomNumber */
AT_NUMB *nOffsetAtAndH;
int num_components;
} COMP_ATOM_DATA;
/*
typedef COMP_ATOM_DATA COMP_ATOM_DATA3[TAUT_NUM+1];
*/
#define ADD_LEN_STRUCT_FPTRS 100 /* allocation increments */
typedef long INCHI_FPTR;
typedef struct tagStructFptrs {
INCHI_FPTR *fptr; /* input: fptr[cur_fptr] = file pointer to the structure to read */
/* output: fptr[cur_fptr+1] = file pointer to the next structure or EOF */
int len_fptr; /* allocated length of fptr */
int cur_fptr; /* input: k-1 to read the kth struct, k = 1, 2, 3,...; left unchanged; struct number := cur_fptr+1 */
int max_fptr; /* length of the filled out portion of fptr */
} STRUCT_FPTRS;
#define FLAG_INP_AT_CHIRAL 1
#define FLAG_INP_AT_NONCHIRAL 2
#define FLAG_SET_INP_AT_CHIRAL 4
#define FLAG_SET_INP_AT_NONCHIRAL 8
/* BILLY 8/6/04 */
#ifndef INCHI_ALL_CPP
#ifdef __cplusplus
extern "C" {
#endif
#endif
int MolfileToInpAtom( FILE *inp_molfile, int bDoNotAddH, inp_ATOM **at, MOL_COORD **szCoord, int max_num_at,
int *num_dimensions, int *num_bonds, const char *pSdfLabel, char *pSdfValue,
long *Id, long *lMolfileNumber, INCHI_MODE *pInpAtomFlags, int *err, char *pStrErr );
int MolfileToOrigAtom( FILE *inp_molfile, ORIG_ATOM_DATA *orig_at_data, int bMergeAllInputStructures,
int bGetOrigCoord, int bDoNotAddH,
const char *pSdfLabel, char *pSdfValue, long *lSdfId, long *lMolfileNumber,
INCHI_MODE *pInpAtomFlags, int *err, char *pStrErr );
int INChIToOrigAtom( FILE *inp_molfile, ORIG_ATOM_DATA *orig_at_data, int bMergeAllInputStructures,
int bGetOrigCoord, int bDoNotAddH, INPUT_TYPE nInputType,
char *pSdfLabel, char *pSdfValue, long *lSdfId,
INCHI_MODE *pInpAtomFlags, int *err, char *pStrErr );
int MarkDisconnectedComponents( ORIG_ATOM_DATA *orig_at_data, int bProcessOldCompNumbers );
int DisconnectSalts( ORIG_ATOM_DATA *orig_inp_data, int bDisconnect );
int DisconnectMetals( ORIG_ATOM_DATA *orig_inp_data, int bCheckMetalValence, INCHI_MODE *bTautFlagsDone );
int bMayDisconnectMetals( ORIG_ATOM_DATA *orig_inp_data, int bCheckMetalValence, INCHI_MODE *bTautFlagsDone );
int bHasMetalAtom( ORIG_ATOM_DATA *orig_inp_data );
int FixAdjacentRadicals( int num_inp_atoms, inp_ATOM *at ); /* FIX_ADJ_RAD == 1 */
int fix_odd_things( int num_atoms, inp_ATOM *at, int bFixBug );
int post_fix_odd_things( int num_atoms, inp_ATOM *at );
int remove_ion_pairs( int num_atoms, inp_ATOM *at );
int bFoundFeature( inp_ATOM *at, int num_atoms );
int CopyMOLfile(FILE *inp_file, long fPtrStart, long fPtrEnd, INCHI_FILE *prb_file, long nNumb);
void FreeInpAtom( inp_ATOM **at );
void FreeInfAtom( inf_ATOM **at );
void FreeOrigAtData( ORIG_ATOM_DATA *orig_at_data );
void FreeInpAtomData( INP_ATOM_DATA *inp_at_data );
void FreeCompAtomData( COMP_ATOM_DATA *inp_at_data );
void FreeInfoAtomData( INF_ATOM_DATA *inf_at_data );
int FixUnkn0DStereoBonds(inp_ATOM *at, int num_at);
inf_ATOM *CreateInfAtom( int num_atoms );
inp_ATOM *CreateInpAtom( int num_atoms );
int CreateInfoAtomData( INF_ATOM_DATA *inf_at_data, int num_atoms, int num_components );
int AllocateInfoAtomData( INF_ATOM_DATA *inf_at_data, int num_atoms, int num_components );
int DuplicateInfoAtomData( INF_ATOM_DATA *inf_at_data_to, const INF_ATOM_DATA *inf_at_data_from);
int CreateInpAtomData( INP_ATOM_DATA *inp_at_data, int num_atoms, int create_at_fixed_bonds );
int CreateCompAtomData( COMP_ATOM_DATA *inp_at_data, int num_atoms, int num_components, int bIntermediateTaut );
#ifndef INCHI_ANSI_ONLY
int DisplayInputStructure( char *szOutputString, inp_ATOM *at, INF_ATOM_DATA *inf_at_data, int num_at, DRAW_PARMS *dp );
#endif
void PrintFileName( const char *fmt, INCHI_FILE *output_file, const char *szFname );
void MySleep( unsigned long ms );
#ifndef __ICHITIME_H__
struct tagInchiTime;
int bInchiTimeIsOver( struct tagInchiTime *TickEnd );
#endif
int get_endpoint_valence( U_CHAR el_number );
#if( TEST_RENUMB_ATOMS == 1 ) /* { */
int CopyInpAtomData( INP_ATOM_DATA *dest_inp_at_data, INP_ATOM_DATA *src_inp_at_data );
void RenumbInpAtomData( INP_ATOM_DATA *dest_inp_at_data, INP_ATOM_DATA *src_inp_at_data, AT_RANK *new_ord );
void MakeNewOrd( int num_atoms, AT_RANK *new_ord );
#endif
int ReconcileAllCmlBondParities( inp_ATOM *at, int num_atoms, int bDisconnected );
/* BILLY 8/6/04 */
#ifndef INCHI_ALL_CPP
#ifdef __cplusplus
}
#endif
#endif
#endif /* __INPDEF_H__ */
syntax highlighted by Code2HTML, v. 0.9.1