From 47974ddeff4f87c8d886c936e510dad2d3c41c9e Mon Sep 17 00:00:00 2001 From: Christoph Mueller Date: Thu, 19 Feb 2026 12:17:22 +0000 Subject: [PATCH 01/18] Created first unit test --- .../tests/test_unit/test_atropisomers.cpp | 53 +++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 INCHI-1-TEST/tests/test_unit/test_atropisomers.cpp diff --git a/INCHI-1-TEST/tests/test_unit/test_atropisomers.cpp b/INCHI-1-TEST/tests/test_unit/test_atropisomers.cpp new file mode 100644 index 00000000..98148b11 --- /dev/null +++ b/INCHI-1-TEST/tests/test_unit/test_atropisomers.cpp @@ -0,0 +1,53 @@ +#include +#include + +extern "C" +{ +#include "../../../INCHI-1-SRC/INCHI_BASE/src/inchi_api.h" +#include "../../../INCHI-1-SRC/INCHI_BASE/src/mode.h" +} + +TEST(test_atropisomers, test_Atropisomers_molfile_v2) +{ + const char *molblock = + "test_mol_2 \n" + " Ketcher 1302610202D 1 1.00000 0.00000 0 \n" + " \n" + " 13 12 0 0 0 0 0 0 0 0999 V2000 \n" + " 2.9420 -4.1000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 3.8080 -3.6000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 4.6740 -4.1000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 5.5401 -3.6000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 6.4061 -4.1000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 7.2721 -3.6000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 8.1381 -4.1000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 6.4061 -5.1000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 5.5401 -2.6000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 5.5401 -5.6000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 5.5401 -6.6000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 6.4061 -2.1000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 6.4061 -1.1000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 1 2 1 0 0 0 \n" + " 2 3 1 0 0 0 \n" + " 3 4 1 0 0 0 \n" + " 4 5 1 0 0 0 \n" + " 5 6 1 0 0 0 \n" + " 6 7 1 0 0 0 \n" + " 5 8 1 0 0 0 \n" + " 4 9 1 0 0 0 \n" + " 8 10 1 0 0 0 \n" + " 10 11 1 0 0 0 \n" + " 9 12 1 0 0 0 \n" + " 12 13 1 0 0 0 \n" + "M END \n"; + + char options[] = "-EnhancedStereochemistry"; + inchi_Output output; + inchi_Output *poutput = &output; + const char expected_inchi[] = "InChI=1B/C13H28/c1-5-9-12(8-4)13(10-6-2)11-7-3/h12-13H,5-11H2,1-4H3"; + + EXPECT_EQ(MakeINCHIFromMolfileText(molblock, options, poutput), 1); + EXPECT_STREQ(poutput->szInChI, expected_inchi); + + FreeINCHI(poutput); +} From 26e466bf80553d848b10f41b592e3e2f858e91c1 Mon Sep 17 00:00:00 2001 From: Christoph Mueller Date: Thu, 19 Feb 2026 12:43:23 +0000 Subject: [PATCH 02/18] Added parameter "-Atropisomers" to enable calling atropisomer-specific routines --- INCHI-1-SRC/INCHI_BASE/src/ichidrp.h | 3 ++- INCHI-1-SRC/INCHI_BASE/src/ichiparm.c | 18 ++++++++++++++---- INCHI-1-SRC/INCHI_BASE/src/ichiprt1.c | 9 +++++++++ INCHI-1-SRC/INCHI_BASE/src/strutil.c | 15 +++++++++++++++ INCHI-1-SRC/INCHI_BASE/src/strutil.h | 12 ++++++++++++ .../tests/test_unit/test_atropisomers.cpp | 4 ++-- 6 files changed, 54 insertions(+), 7 deletions(-) diff --git a/INCHI-1-SRC/INCHI_BASE/src/ichidrp.h b/INCHI-1-SRC/INCHI_BASE/src/ichidrp.h index 7e0e7673..b34df3bd 100644 --- a/INCHI-1-SRC/INCHI_BASE/src/ichidrp.h +++ b/INCHI-1-SRC/INCHI_BASE/src/ichidrp.h @@ -187,7 +187,8 @@ typedef struct tagInputParms { int bNoWarnings; /* v. 1.06+ suppress warning messages */ int bHideInChI; /* v. 1.06+ Do not print InChI itself */ - int bEnhancedStereo; + int bEnhancedStereo; /* v. 1.0?+ enable enhanced stereochemistry */ + int Atropisomers; /* v. 1.0?+ enable atropisomeric stereochemistry */ /* */ INCHI_MODE bTautFlags; diff --git a/INCHI-1-SRC/INCHI_BASE/src/ichiparm.c b/INCHI-1-SRC/INCHI_BASE/src/ichiparm.c index dcf4d9b8..d83652e3 100644 --- a/INCHI-1-SRC/INCHI_BASE/src/ichiparm.c +++ b/INCHI-1-SRC/INCHI_BASE/src/ichiparm.c @@ -123,7 +123,8 @@ int set_common_options_by_parg(const char* pArg, int* pbNoWarnings, int* pbMergeHash, int* pbHideInChI, - int* pbEnhancedStereochemistry); + int* pbEnhancedStereochemistry, + int* pbAtropisomers); /**************************************************************************** @@ -167,7 +168,8 @@ int set_common_options_by_parg(const char* pArg, int* pbNoWarnings, int* pbMergeHash, int* pbHideInChI, - int* pbEnhancedStereochemistry + int* pbEnhancedStereochemistry, + int* pbAtropisomers ) { int got = 0; @@ -273,6 +275,11 @@ int set_common_options_by_parg(const char* pArg, *pbEnhancedStereochemistry = 1; got = 1; } + else if (!inchi_stricmp(pArg, "Atropisomers")) + { + *pbAtropisomers = 1; + got = 1; + } #ifndef USE_STDINCHI_API /* These options DO TURN OFF Std flag */ @@ -651,6 +658,7 @@ int ReadCommandLineParms(int argc, int bUnchargedAcidTaut = (CHARGED_SALTS_ONLY == 0); int bMergeSaltTGroups = (DISCONNECT_SALTS == 1); int bEnhancedStereochemistry = 0; + int bAtropisomers = 0; #if ( MIN_SB_RING_SIZE > 0 ) int nMinDbRinSize = MIN_SB_RING_SIZE, mdbr = 0; #endif @@ -804,7 +812,7 @@ int ReadCommandLineParms(int argc, &bFoldPolymerSRU, &bFrameShiftScheme, &bStereoAtZz, &bNPZz, &bNoWarnings, &bMergeHash, &bHideInChI, - &bEnhancedStereochemistry); + &bEnhancedStereochemistry, &bAtropisomers); if (got) { ; @@ -1253,7 +1261,7 @@ int ReadCommandLineParms(int argc, &bFoldPolymerSRU, &bFrameShiftScheme, &bStereoAtZz, &bNPZz, &bNoWarnings, &bMergeHash, &bHideInChI, - &bEnhancedStereochemistry); + &bEnhancedStereochemistry, &bAtropisomers); if (got) { @@ -2132,6 +2140,8 @@ int ReadCommandLineParms(int argc, ip->bEnhancedStereo = bEnhancedStereochemistry; + ip->Atropisomers = bAtropisomers; + return 0; } diff --git a/INCHI-1-SRC/INCHI_BASE/src/ichiprt1.c b/INCHI-1-SRC/INCHI_BASE/src/ichiprt1.c index 0ee22261..0b82fd73 100644 --- a/INCHI-1-SRC/INCHI_BASE/src/ichiprt1.c +++ b/INCHI-1-SRC/INCHI_BASE/src/ichiprt1.c @@ -1642,6 +1642,11 @@ int OutputINChI1( CANON_GLOBALS *pCG, { set_EnhancedStereo_t_m_layers(orig_inp_data, pINChI, pINChI_Aux); } + + if (ip->Atropisomers) + { + set_Atropisomer_t_m_layers(orig_inp_data, pINChI, pINChI_Aux); + } } } if (bCompExists) @@ -1732,6 +1737,10 @@ int OutputINChI1( CANON_GLOBALS *pCG, { is_beta = 1; } + else if (ip->Atropisomers) + { + is_beta = 1; + } OutputINCHI_VersionAndKind( out_file, strbuf, bINChIOutputOptions, is_beta, pLF, pTAB ); } diff --git a/INCHI-1-SRC/INCHI_BASE/src/strutil.c b/INCHI-1-SRC/INCHI_BASE/src/strutil.c index cfaf9e8e..88018bc3 100644 --- a/INCHI-1-SRC/INCHI_BASE/src/strutil.c +++ b/INCHI-1-SRC/INCHI_BASE/src/strutil.c @@ -4460,6 +4460,21 @@ int set_EnhancedStereo_t_m_layers( const ORIG_ATOM_DATA *orig_inp_data, return ret; } +/** + * @brief Set t- and m-layers object for atropisomer stereochemistry + * + * @param orig_inp_data Pointer to original input atom data + * @param inchi Pointer to INChI structure + * @param aux Pointer to INChI auxiliary data + * @return int + */ +int set_Atropisomer_t_m_layers( const ORIG_ATOM_DATA *orig_inp_data, + const INChI *inchi, + const INChI_Aux *aux) +{ + +} + /**************************************************************************** Set the (disconnected) component numbers in ORIG_ATOM_DATA 'at[*].component' NB: components are (stable) sorted by number of heavy atoms diff --git a/INCHI-1-SRC/INCHI_BASE/src/strutil.h b/INCHI-1-SRC/INCHI_BASE/src/strutil.h index df950476..2c75024d 100644 --- a/INCHI-1-SRC/INCHI_BASE/src/strutil.h +++ b/INCHI-1-SRC/INCHI_BASE/src/strutil.h @@ -69,6 +69,18 @@ extern "C" const INChI *inchi, const INChI_Aux *aux); + /** + * @brief Set t- and m-layers object for atropisomer stereochemistry + * + * @param orig_inp_data Pointer to original input atom data + * @param inchi Pointer to INChI structure + * @param aux Pointer to INChI auxiliary data + * @return int + */ + int set_Atropisomer_t_m_layers(const ORIG_ATOM_DATA *orig_inp_data, + const INChI *inchi, + const INChI_Aux *aux); + /** * @brief Get the canonical atom number object * diff --git a/INCHI-1-TEST/tests/test_unit/test_atropisomers.cpp b/INCHI-1-TEST/tests/test_unit/test_atropisomers.cpp index 98148b11..7d12ead9 100644 --- a/INCHI-1-TEST/tests/test_unit/test_atropisomers.cpp +++ b/INCHI-1-TEST/tests/test_unit/test_atropisomers.cpp @@ -7,7 +7,7 @@ extern "C" #include "../../../INCHI-1-SRC/INCHI_BASE/src/mode.h" } -TEST(test_atropisomers, test_Atropisomers_molfile_v2) +TEST(test_atropisomers, test_dummy) { const char *molblock = "test_mol_2 \n" @@ -41,7 +41,7 @@ TEST(test_atropisomers, test_Atropisomers_molfile_v2) " 12 13 1 0 0 0 \n" "M END \n"; - char options[] = "-EnhancedStereochemistry"; + char options[] = "-Atropisomers"; inchi_Output output; inchi_Output *poutput = &output; const char expected_inchi[] = "InChI=1B/C13H28/c1-5-9-12(8-4)13(10-6-2)11-7-3/h12-13H,5-11H2,1-4H3"; From 3e6bf4dc9652d18ad2d5ea0eea128f7de41bc7ee Mon Sep 17 00:00:00 2001 From: Christoph Mueller Date: Thu, 19 Feb 2026 15:39:24 +0000 Subject: [PATCH 03/18] Added simple code for atom detection --- INCHI-1-SRC/INCHI_BASE/src/ichimake.c | 12 ++++ INCHI-1-SRC/INCHI_BASE/src/strutil.c | 46 ++++++++++++ .../tests/test_unit/test_atropisomers.cpp | 70 +++++++++++-------- 3 files changed, 97 insertions(+), 31 deletions(-) diff --git a/INCHI-1-SRC/INCHI_BASE/src/ichimake.c b/INCHI-1-SRC/INCHI_BASE/src/ichimake.c index 0826571d..916e772b 100644 --- a/INCHI-1-SRC/INCHI_BASE/src/ichimake.c +++ b/INCHI-1-SRC/INCHI_BASE/src/ichimake.c @@ -3901,6 +3901,18 @@ int Create_INChI(CANON_GLOBALS* pCG, /*fix_odd_things( num_atoms, out_at );*/ #if ( FIND_RING_SYSTEMS == 1 ) MarkRingSystemsInp(out_at, num_atoms, 0); + + if (ip->Atropisomers) { + for (i = 0; i < num_atoms; i++) { + if (out_at[i].nRingSystem > 0) { + orig_inp_data->at[i].nRingSystem = out_at[i].nRingSystem; + } + if (out_at[i].nNumAtInRingSystem > 0) { + orig_inp_data->at[i].nNumAtInRingSystem = out_at[i].nNumAtInRingSystem; + } + } + } + #endif /* duplicate the preprocessed structure so that all supplied out_norm_data[]->at buffers are filled */ if (out_at != out_norm_data[TAUT_YES]->at && out_norm_data[TAUT_YES]->at) diff --git a/INCHI-1-SRC/INCHI_BASE/src/strutil.c b/INCHI-1-SRC/INCHI_BASE/src/strutil.c index 88018bc3..1e7a1758 100644 --- a/INCHI-1-SRC/INCHI_BASE/src/strutil.c +++ b/INCHI-1-SRC/INCHI_BASE/src/strutil.c @@ -4472,7 +4472,53 @@ int set_Atropisomer_t_m_layers( const ORIG_ATOM_DATA *orig_inp_data, const INChI *inchi, const INChI_Aux *aux) { + int ret = 0; + + if (orig_inp_data == NULL) + { + return 1; + } + + if (inchi == NULL || aux == NULL) + { + return 1; + } + + if (aux->nOrigAtNosInCanonOrd == NULL || + aux->nNumberOfAtoms <= 0) { + return 1; + } + + for (int i = 0; i < orig_inp_data->num_inp_atoms; i++) { + // Canonical atom number: i (0-based) + // Access atom properties, e.g.: + int num_neighbors = orig_inp_data->at[i].valence; + AT_NUMB *neighbors = orig_inp_data->at[i].neighbor; // array of neighbor indices + int is_in_ring_1 = orig_inp_data->at[i].nRingSystem; // ring membership flag + int is_in_ring_2 = orig_inp_data->at[i].nNumAtInRingSystem; // ring membership flag + // int is_in_ring_3 = orig_inp_data->at[i].ring + + // Example: print neighbors + printf("Atom %d (ring %d %d) neighbors:", i + 1, is_in_ring_1, is_in_ring_2); // 1-based for display + if (is_in_ring_2 > 1) { + for (int j = 0; j < num_neighbors; j++) { + if (orig_inp_data->at[neighbors[j]].nNumAtInRingSystem > 1 && + orig_inp_data->at[neighbors[j]].nRingSystem != orig_inp_data->at[i].nRingSystem) { + printf(" %d %d", neighbors[j] + 1, orig_inp_data->at[i].bond_stereo); + } + + } + } + + printf("\n"); + // Example: print ring membership + // if (is_in_ring) { + // printf("Atom %d is in a ring\n", i + 1); + // } + } + + return ret; } /**************************************************************************** diff --git a/INCHI-1-TEST/tests/test_unit/test_atropisomers.cpp b/INCHI-1-TEST/tests/test_unit/test_atropisomers.cpp index 7d12ead9..0de52541 100644 --- a/INCHI-1-TEST/tests/test_unit/test_atropisomers.cpp +++ b/INCHI-1-TEST/tests/test_unit/test_atropisomers.cpp @@ -10,41 +10,49 @@ extern "C" TEST(test_atropisomers, test_dummy) { const char *molblock = - "test_mol_2 \n" - " Ketcher 1302610202D 1 1.00000 0.00000 0 \n" - " \n" - " 13 12 0 0 0 0 0 0 0 0999 V2000 \n" - " 2.9420 -4.1000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" - " 3.8080 -3.6000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" - " 4.6740 -4.1000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" - " 5.5401 -3.6000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" - " 6.4061 -4.1000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" - " 7.2721 -3.6000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" - " 8.1381 -4.1000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" - " 6.4061 -5.1000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" - " 5.5401 -2.6000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" - " 5.5401 -5.6000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" - " 5.5401 -6.6000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" - " 6.4061 -2.1000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" - " 6.4061 -1.1000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" - " 1 2 1 0 0 0 \n" - " 2 3 1 0 0 0 \n" - " 3 4 1 0 0 0 \n" - " 4 5 1 0 0 0 \n" - " 5 6 1 0 0 0 \n" - " 6 7 1 0 0 0 \n" - " 5 8 1 0 0 0 \n" - " 4 9 1 0 0 0 \n" - " 8 10 1 0 0 0 \n" - " 10 11 1 0 0 0 \n" - " 9 12 1 0 0 0 \n" - " 12 13 1 0 0 0 \n" - "M END \n"; + "test mol \n" + " Ketcher 2192614182D 1 1.00000 0.00000 0 \n" + " \n" + " 16 17 0 0 1 0 0 0 0 0999 V2000 \n" + " 6.7160 -7.9750 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 5.8500 -7.4750 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 4.9840 -7.9750 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 4.9840 -8.9750 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 5.8500 -9.4750 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 6.7160 -8.9750 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 6.7160 -5.9750 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 5.8500 -6.4750 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 4.9840 -5.9750 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 4.9840 -4.9750 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 6.7160 -4.9750 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 5.8500 -4.4750 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 7.5821 -6.4750 0.0000 Br 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 4.1179 -6.4750 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 4.1179 -7.4749 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 7.5821 -7.4750 0.0000 Br 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 1 6 1 0 0 0 0 \n" + " 1 2 2 0 0 0 0 \n" + " 2 3 1 1 0 0 0 \n" + " 2 8 1 0 0 0 0 \n" + " 3 4 2 0 0 0 0 \n" + " 5 4 1 0 0 0 0 \n" + " 5 6 2 0 0 0 0 \n" + " 8 7 1 1 0 0 0 \n" + " 7 11 2 0 0 0 0 \n" + " 8 9 2 0 0 0 0 \n" + " 9 10 1 0 0 0 0 \n" + " 10 12 2 0 0 0 0 \n" + " 12 11 1 0 0 0 0 \n" + " 7 13 1 0 0 0 0 \n" + " 9 14 1 0 0 0 0 \n" + " 3 15 1 0 0 0 0 \n" + " 1 16 1 0 0 0 0 \n" + "M END \n"; char options[] = "-Atropisomers"; inchi_Output output; inchi_Output *poutput = &output; - const char expected_inchi[] = "InChI=1B/C13H28/c1-5-9-12(8-4)13(10-6-2)11-7-3/h12-13H,5-11H2,1-4H3"; + const char expected_inchi[] = "InChI=1B/C12H6Br2Cl2/c13-7-3-1-5-9(15)11(7)12-8(14)4-2-6-10(12)16/h1-6H"; EXPECT_EQ(MakeINCHIFromMolfileText(molblock, options, poutput), 1); EXPECT_STREQ(poutput->szInChI, expected_inchi); From b17b70705b40e16d862fe4305340c96c6a13dc8e Mon Sep 17 00:00:00 2001 From: Christoph Mueller Date: Fri, 20 Feb 2026 14:24:26 +0000 Subject: [PATCH 04/18] Added first prototype for atom+bond identification for atropisomers --- INCHI-1-SRC/INCHI_BASE/src/ichimake.c | 10 + INCHI-1-SRC/INCHI_BASE/src/strutil.c | 87 +++-- .../tests/test_unit/test_atropisomers.cpp | 367 +++++++++++++++++- 3 files changed, 440 insertions(+), 24 deletions(-) diff --git a/INCHI-1-SRC/INCHI_BASE/src/ichimake.c b/INCHI-1-SRC/INCHI_BASE/src/ichimake.c index 916e772b..bd652ecb 100644 --- a/INCHI-1-SRC/INCHI_BASE/src/ichimake.c +++ b/INCHI-1-SRC/INCHI_BASE/src/ichimake.c @@ -3910,6 +3910,16 @@ int Create_INChI(CANON_GLOBALS* pCG, if (out_at[i].nNumAtInRingSystem > 0) { orig_inp_data->at[i].nNumAtInRingSystem = out_at[i].nNumAtInRingSystem; } + if (out_at[i].nBlockSystem > 0) { + orig_inp_data->at[i].nBlockSystem = out_at[i].nBlockSystem; + } + for (int j = 0; j < out_at[i].valence; j++) { + if (out_at[i].bond_stereo[j] > 0) { + orig_inp_data->at[i].bond_stereo[j] = out_at[i].bond_stereo[j]; + // printf("%d %d\n", i, out_at[i].bond_stereo[j]); + } + + } } } diff --git a/INCHI-1-SRC/INCHI_BASE/src/strutil.c b/INCHI-1-SRC/INCHI_BASE/src/strutil.c index 1e7a1758..b26e8688 100644 --- a/INCHI-1-SRC/INCHI_BASE/src/strutil.c +++ b/INCHI-1-SRC/INCHI_BASE/src/strutil.c @@ -4489,34 +4489,77 @@ int set_Atropisomer_t_m_layers( const ORIG_ATOM_DATA *orig_inp_data, return 1; } + printf("-------------------\n"); + for (int i = 0; i < orig_inp_data->num_inp_atoms; i++) { - // Canonical atom number: i (0-based) - // Access atom properties, e.g.: - int num_neighbors = orig_inp_data->at[i].valence; - AT_NUMB *neighbors = orig_inp_data->at[i].neighbor; // array of neighbor indices - int is_in_ring_1 = orig_inp_data->at[i].nRingSystem; // ring membership flag - int is_in_ring_2 = orig_inp_data->at[i].nNumAtInRingSystem; // ring membership flag - // int is_in_ring_3 = orig_inp_data->at[i].ring - - // Example: print neighbors - printf("Atom %d (ring %d %d) neighbors:", i + 1, is_in_ring_1, is_in_ring_2); // 1-based for display - if (is_in_ring_2 > 1) { - for (int j = 0; j < num_neighbors; j++) { - if (orig_inp_data->at[neighbors[j]].nNumAtInRingSystem > 1 && - orig_inp_data->at[neighbors[j]].nRingSystem != orig_inp_data->at[i].nRingSystem) { - printf(" %d %d", neighbors[j] + 1, orig_inp_data->at[i].bond_stereo); - } + const inp_ATOM atom_i = orig_inp_data->at[i]; + + int num_neighbors_i = atom_i.valence; + const AT_NUMB *neighbors = atom_i.neighbor; + // printf("Atom %d with %d neighbors; ring system id %d; num atoms in ring %d\n", i + 1, num_neighbors, orig_inp_data->at[i].nRingSystem, orig_inp_data->at[i].nNumAtInRingSystem); + if (num_neighbors_i == 3) { + for (int j = 0; j < num_neighbors_i; j++) { + const inp_ATOM atom_j = orig_inp_data->at[neighbors[j]]; + int num_neighbors_j = atom_j.valence; + + if (num_neighbors_j == 3 && + atom_i.bond_stereo[j] == 0 && + atom_i.bond_type[j] == 1) { + + if (atom_i.nNumAtInRingSystem > 1 || + atom_j.nNumAtInRingSystem > 1) { + + int nof_wedge_bonds_i = 0; + int has_double_bond_i = 0; + for (int k = 0; k < num_neighbors_i; k++) { + if (atom_i.bond_stereo[k] == 1 || + atom_i.bond_stereo[k] == 4 || + atom_i.bond_stereo[k] == 6) { + nof_wedge_bonds_i++; + } + if (atom_i.bond_type[k] == 2) { + has_double_bond_i = 1; + } + } + int nof_wedge_bonds_j = 0; + int has_double_bond_j = 0; + for (int k = 0; k < num_neighbors_j; k++) { + if (atom_j.bond_stereo[k] == 1 || + atom_j.bond_stereo[k] == 4 || + atom_j.bond_stereo[k] == 6) { + nof_wedge_bonds_j++; + } + if (atom_j.bond_type[k] == 2) { + has_double_bond_j = 1; + } + } + + if (nof_wedge_bonds_i > 0 || + nof_wedge_bonds_j > 0) { + + // if(atom_i.nRingSystem != atom_j.nRingSystem) { + // printf("Atropisomer candidate: Atom %d with neighbor %d\n", i + 1, neighbors[j] + 1); + // } else { + if (has_double_bond_i || has_double_bond_j) { + printf("Atropisomer candidate: atom %d with atom %d; bond type %d; bond stereo %d\n", + i + 1, neighbors[j] + 1, atom_i.bond_type[j], atom_i.bond_stereo[j]); + printf("atom type %d %d\n", atom_i.el_number, atom_j.el_number); + printf("has double bond %d %d\n", has_double_bond_i, has_double_bond_j); + printf("ring info #atoms in rings %d %d\n", atom_i.nNumAtInRingSystem, atom_j.nNumAtInRingSystem); + printf("ring info ring ids %d %d\n", atom_i.nRingSystem, atom_j.nRingSystem); + printf("ring info block ids %d %d\n", atom_i.nBlockSystem, atom_j.nBlockSystem); + } + // } + } + } + + } } } + } - printf("\n"); - // Example: print ring membership - // if (is_in_ring) { - // printf("Atom %d is in a ring\n", i + 1); - // } - } return ret; } diff --git a/INCHI-1-TEST/tests/test_unit/test_atropisomers.cpp b/INCHI-1-TEST/tests/test_unit/test_atropisomers.cpp index 0de52541..c8eded60 100644 --- a/INCHI-1-TEST/tests/test_unit/test_atropisomers.cpp +++ b/INCHI-1-TEST/tests/test_unit/test_atropisomers.cpp @@ -7,10 +7,10 @@ extern "C" #include "../../../INCHI-1-SRC/INCHI_BASE/src/mode.h" } -TEST(test_atropisomers, test_dummy) +TEST(test_atropisomers, test_dummy_1) { const char *molblock = - "test mol \n" + "atropisomer test mol \n" " Ketcher 2192614182D 1 1.00000 0.00000 0 \n" " \n" " 16 17 0 0 1 0 0 0 0 0999 V2000 \n" @@ -59,3 +59,366 @@ TEST(test_atropisomers, test_dummy) FreeINCHI(poutput); } + +TEST(test_atropisomers, test_dummy_2) +{ + const char *molblock = + "atropisomer test mol \n" + " Ketcher 2202610402D 1 1.00000 0.00000 0 \n" + " \n" + " 25 28 0 0 1 0 0 0 0 0999 V2000 \n" + " 6.2229 -3.4324 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 8.0096 -3.6108 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 7.1896 -3.0101 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 7.8699 -4.5953 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 6.0956 -4.4735 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 6.9105 -5.0541 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 6.0587 -6.8139 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 7.8275 -6.8325 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 6.8777 -6.3069 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 7.9085 -7.7852 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 6.1259 -7.8397 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 7.0613 -8.3249 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 8.4672 -5.1980 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 8.4510 -6.2674 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 9.4062 -5.3893 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 9.4009 -6.0976 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 10.3049 -4.9122 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 10.2817 -6.5709 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 10.9561 -5.7358 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 10.5172 -3.9146 0.0000 H 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 10.4810 -7.5491 0.0000 H 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 5.4299 -2.8268 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 4.5119 -3.2022 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 5.2852 -8.3732 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 4.3939 -7.8951 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 3 1 2 0 0 0 \n" + " 1 5 1 0 0 0 \n" + " 5 6 2 0 0 0 \n" + " 6 4 1 1 0 0 \n" + " 4 2 2 0 0 0 \n" + " 9 7 1 1 0 0 \n" + " 7 11 2 0 0 0 \n" + " 12 10 2 0 0 0 \n" + " 10 8 1 0 0 0 \n" + " 8 9 2 0 0 0 \n" + " 6 9 1 0 0 0 \n" + " 4 13 1 0 0 0 \n" + " 8 14 1 0 0 0 \n" + " 13 15 1 0 0 0 \n" + " 14 16 1 0 0 0 \n" + " 15 16 1 0 0 0 \n" + " 15 17 1 0 0 0 \n" + " 16 18 1 0 0 0 \n" + " 17 19 1 0 0 0 \n" + " 18 19 1 0 0 0 \n" + " 17 20 1 6 0 0 \n" + " 18 21 1 1 0 0 \n" + " 1 22 1 0 0 0 \n" + " 22 23 1 0 0 0 \n" + " 11 24 1 0 0 0 \n" + " 24 25 1 0 0 0 \n" + " 12 11 1 1 0 0 \n" + " 3 2 1 1 0 0 \n" + "M END \n"; + + + char options[] = "-Atropisomers"; + inchi_Output output; + inchi_Output *poutput = &output; + const char expected_inchi[] = "InChI=1B/C20H22O3/c1-21-17-5-3-13-7-15-11-23-12-16(15)8-14-4-6-18(22-2)10-20(14)19(13)9-17/h3-6,9-10,15-16H,7-8,11-12H2,1-2H3"; + + EXPECT_EQ(MakeINCHIFromMolfileText(molblock, options, poutput), 1); + EXPECT_STREQ(poutput->szInChI, expected_inchi); + + FreeINCHI(poutput); +} + +TEST(test_atropisomers, test_dummy_3) +{ + const char *molblock = + "atropisomer test mol \n" + " Ketcher 2202610482D 1 1.00000 0.00000 0 \n" + " \n" + " 22 25 0 0 1 0 0 0 0 0999 V2000 \n" + " 2.8848 -2.2501 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 4.6152 -2.2496 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 3.7516 -1.7500 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 4.6152 -3.2505 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 2.8848 -3.2550 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 3.7538 -3.7500 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 5.4796 -1.7512 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 6.3468 -2.2515 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 5.4858 -3.7529 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 6.3490 -3.2475 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 2.8348 -5.3751 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 4.5652 -5.3746 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 3.7016 -4.8750 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 4.5652 -6.3755 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 2.8348 -6.3800 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 3.7038 -6.8750 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 5.4296 -4.8762 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 6.2968 -5.3765 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 5.4358 -6.8779 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 6.2990 -6.3725 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 7.2171 -3.7439 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 7.1622 -4.8755 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 3 1 2 0 0 0 \n" + " 1 5 1 0 0 0 \n" + " 5 6 2 0 0 0 \n" + " 6 4 1 0 0 0 \n" + " 4 2 1 0 0 0 \n" + " 2 3 1 0 0 0 \n" + " 4 9 2 0 0 0 \n" + " 9 10 1 1 0 0 \n" + " 10 8 1 0 0 0 \n" + " 7 2 2 0 0 0 \n" + " 13 11 2 0 0 0 \n" + " 11 15 1 0 0 0 \n" + " 15 16 2 0 0 0 \n" + " 16 14 1 0 0 0 \n" + " 14 12 1 0 0 0 \n" + " 12 13 1 0 0 0 \n" + " 14 19 2 0 0 0 \n" + " 19 20 1 0 0 0 \n" + " 20 18 2 0 0 0 \n" + " 18 17 1 0 0 0 \n" + " 17 12 2 0 0 0 \n" + " 9 17 1 0 0 0 \n" + " 10 21 1 0 0 0 \n" + " 18 22 1 0 0 0 \n" + " 7 8 1 1 0 0 \n" + "M END \n"; + + char options[] = "-Atropisomers"; + inchi_Output output; + inchi_Output *poutput = &output; + const char expected_inchi[] = "InChI=1B/C20H16O2/c21-17-11-9-13-5-1-3-7-15(13)19(17)20-16-8-4-2-6-14(16)10-12-18(20)22/h1-11,18,21-22H,12H2"; + + EXPECT_EQ(MakeINCHIFromMolfileText(molblock, options, poutput), 1); + EXPECT_STREQ(poutput->szInChI, expected_inchi); + + FreeINCHI(poutput); +} + +TEST(test_atropisomers, test_dummy_4) +{ + const char *molblock = + "atropisomer test mol \n" + " Ketcher 2202610562D 1 1.00000 0.00000 0 \n" + " \n" + " 24 25 0 0 1 0 0 0 0 0999 V2000 \n" + " 9.1250 -2.5500 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 9.9910 -3.0500 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 9.9910 -4.0500 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 9.1250 -4.5500 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 8.2590 -4.0500 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 8.2590 -3.0500 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 7.1288 -7.8500 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 6.2598 -7.3550 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 7.9902 -7.3505 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 7.1266 -5.8500 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 7.9902 -6.3496 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 6.2598 -6.3501 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 7.1272 -4.8500 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 6.2612 -4.3500 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 6.2612 -3.3500 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 5.3952 -4.8500 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 4.5292 -4.3500 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 5.3939 -5.8499 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 8.8564 -5.8500 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 8.8564 -4.8500 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 9.7224 -6.3500 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 4.8939 -6.7160 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 5.8939 -4.9839 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 4.5279 -5.3499 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 2 1 1 0 0 0 \n" + " 3 2 1 0 0 0 \n" + " 4 3 1 0 0 0 \n" + " 5 4 1 0 0 0 \n" + " 6 5 1 0 0 0 \n" + " 1 6 1 0 0 0 \n" + " 11 10 2 0 0 0 \n" + " 9 11 1 0 0 0 \n" + " 7 9 2 0 0 0 \n" + " 8 7 1 0 0 0 \n" + " 12 8 2 0 0 0 \n" + " 10 12 1 1 0 0 \n" + " 10 13 1 0 0 0 \n" + " 13 5 1 0 0 0 \n" + " 13 14 1 6 0 0 \n" + " 14 15 2 0 0 0 \n" + " 14 16 1 0 0 0 \n" + " 16 17 2 0 0 0 \n" + " 12 18 1 0 0 0 \n" + " 11 19 1 0 0 0 \n" + " 19 20 2 0 0 0 0 \n" + " 19 21 1 0 0 0 0 \n" + " 22 18 1 0 0 0 0 \n" + " 18 23 1 0 0 0 0 \n" + " 18 24 1 0 0 0 0 \n" + "M STY 1 1 SUP \n" + "M SLB 1 1 1 \n" + "M SAP 1 1 19 0 \n" + "M SAL 1 3 19 20 21 \n" + "M SBL 1 1 20 \n" + "M SMT 1 CONH2 \n" + "M STY 1 2 SUP \n" + "M SLB 1 2 2 \n" + "M SAP 2 1 18 0 \n" + "M SAL 2 4 18 22 23 24 \n" + "M SBL 2 1 19 \n" + "M SMT 2 tBu \n" + "M END \n"; + + + char options[] = "-Atropisomers"; + inchi_Output output; + inchi_Output *poutput = &output; + const char expected_inchi[] = "InChI=1B/C20H28N2O2/c1-5-17(23)22(14-10-7-6-8-11-14)18-15(19(21)24)12-9-13-16(18)20(2,3)4/h5,9,12-14H,1,6-8,10-11H2,2-4H3,(H2,21,24)"; + + EXPECT_EQ(MakeINCHIFromMolfileText(molblock, options, poutput), 1); + EXPECT_STREQ(poutput->szInChI, expected_inchi); + + FreeINCHI(poutput); +} + +TEST(test_atropisomers, test_dummy_5_no_wedge_bonds) +{ + const char *molblock = + "atropisomer test mol \n" + " Ketcher 2202613492D 1 1.00000 0.00000 0 \n" + " \n" + " 33 37 0 0 0 0 0 0 0 0999 V2000 \n" + " -4.6637 -1.0934 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " -3.9945 -1.8366 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " -4.2024 -2.8147 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " -3.3364 -3.3147 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " -2.5933 -2.6456 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " -3.0000 -1.7321 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " -2.5000 -0.8660 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " -3.0000 -0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " -2.5000 0.8660 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " -1.5000 0.8660 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " -1.0000 -0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " -1.5000 -0.8660 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 0.0000 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 0.5000 0.8660 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 0.0000 1.7321 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " -1.0000 1.7321 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 1.4781 0.6581 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 1.5827 -0.3364 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 2.4487 -0.8364 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 0.6691 -0.7431 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 0.6342 -1.7425 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " -0.2487 -2.2120 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " -0.2836 -3.2114 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 0.5644 -3.7413 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 1.4474 -3.2718 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 1.4823 -2.2725 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 2.3652 -1.8030 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 3.2133 -2.3329 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " -1.0968 -1.6821 0.0000 F 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 2.2213 1.3272 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " -4.0000 -0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " -4.5000 0.8660 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " -3.2319 -4.3092 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 1 2 1 0 0 0 \n" + " 2 3 2 0 0 0 \n" + " 3 4 1 0 0 0 \n" + " 4 5 1 0 0 0 \n" + " 5 6 2 0 0 0 \n" + " 2 6 1 0 0 0 \n" + " 6 7 1 0 0 0 \n" + " 7 8 1 0 0 0 \n" + " 8 9 2 0 0 0 \n" + " 9 10 1 0 0 0 \n" + " 10 11 2 0 0 0 \n" + " 11 12 1 0 0 0 \n" + " 7 12 2 0 0 0 \n" + " 11 13 1 0 0 0 \n" + " 13 14 2 0 0 0 \n" + " 14 15 1 0 0 0 \n" + " 15 16 2 0 0 0 \n" + " 10 16 1 0 0 0 \n" + " 14 17 1 0 0 0 \n" + " 17 18 1 0 0 0 \n" + " 18 19 2 0 0 0 \n" + " 18 20 1 0 0 0 \n" + " 13 20 1 0 0 0 \n" + " 20 21 1 0 0 0 \n" + " 21 22 1 0 0 0 \n" + " 22 23 2 0 0 0 \n" + " 23 24 1 0 0 0 \n" + " 24 25 2 0 0 0 \n" + " 25 26 1 0 0 0 \n" + " 21 26 2 0 0 0 \n" + " 26 27 1 0 0 0 \n" + " 27 28 1 0 0 0 \n" + " 22 29 1 0 0 0 \n" + " 17 30 1 0 0 0 \n" + " 8 31 1 0 0 0 \n" + " 31 32 1 0 0 0 \n" + " 4 33 1 0 0 0 \n" + "M END \n"; + + char options[] = "-Atropisomers"; + inchi_Output output; + inchi_Output *poutput = &output; + const char expected_inchi[] = "InChI=1B/C23H21FN6O3/c1-12-15(11-28(2)27-12)13-6-14-17(7-19(13)32-4)26-9-18-21(14)30(23(31)29(18)3)22-16(24)8-25-10-20(22)33-5/h6-11H,1-5H3"; + + EXPECT_EQ(MakeINCHIFromMolfileText(molblock, options, poutput), 1); + EXPECT_STREQ(poutput->szInChI, expected_inchi); + + FreeINCHI(poutput); +} + +TEST(test_atropisomers, test_dummy_6_no_atropisomer_1) +{ + const char *molblock = + "non-atropisomer test mol \n" + " Ketcher 2202614 02D 1 1.00000 0.00000 0 \n" + " \n" + " 14 15 0 0 1 0 0 0 0 0999 V2000 \n" + " -0.6402 -0.4251 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 1.0902 -0.4246 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 0.2266 0.0750 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 1.0902 -1.4255 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " -0.6402 -1.4300 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 0.2288 -1.9250 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 1.9546 0.0738 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 2.8218 -0.4265 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 1.9608 -1.9279 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 2.8240 -1.4225 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 1.9548 1.0738 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 0.2272 1.0750 0.0000 Br 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 0.2327 -2.9250 0.0000 Br 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 1.9640 -2.9279 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 3 1 1 0 0 0 \n" + " 1 5 2 0 0 0 \n" + " 5 6 1 0 0 0 \n" + " 6 4 2 0 0 0 \n" + " 4 2 1 0 0 0 \n" + " 2 3 2 0 0 0 \n" + " 4 9 1 6 0 0 \n" + " 9 10 2 0 0 0 \n" + " 10 8 1 0 0 0 \n" + " 8 7 2 0 0 0 \n" + " 7 11 1 0 0 0 \n" + " 3 12 1 0 0 0 \n" + " 6 13 1 0 0 0 \n" + " 9 14 1 0 0 0 \n" + " 2 7 1 1 0 0 \n" + "M END \n"; + + char options[] = "-Atropisomers"; + inchi_Output output; + inchi_Output *poutput = &output; + const char expected_inchi[] = "InChI=1B"; + + EXPECT_EQ(MakeINCHIFromMolfileText(molblock, options, poutput), 1); + EXPECT_STREQ(poutput->szInChI, expected_inchi); + + FreeINCHI(poutput); +} + From 7c036b42073685ddd56715c1db36361a4750786e Mon Sep 17 00:00:00 2001 From: Christoph Mueller Date: Mon, 23 Feb 2026 13:35:31 +0000 Subject: [PATCH 05/18] added unit tests and files for ring detection --- INCHI-1-SRC/INCHI_BASE/src/ring_detection.c | 0 INCHI-1-SRC/INCHI_BASE/src/ring_detection.h | 0 INCHI-1-SRC/INCHI_BASE/src/runichi3.c | 64 +++++------ .../tests/test_unit/test_atropisomers.cpp | 106 +++++++++++++++++- .../tests/test_unit/test_enhancedStereo.cpp | 47 ++++++++ 5 files changed, 184 insertions(+), 33 deletions(-) create mode 100644 INCHI-1-SRC/INCHI_BASE/src/ring_detection.c create mode 100644 INCHI-1-SRC/INCHI_BASE/src/ring_detection.h diff --git a/INCHI-1-SRC/INCHI_BASE/src/ring_detection.c b/INCHI-1-SRC/INCHI_BASE/src/ring_detection.c new file mode 100644 index 00000000..e69de29b diff --git a/INCHI-1-SRC/INCHI_BASE/src/ring_detection.h b/INCHI-1-SRC/INCHI_BASE/src/ring_detection.h new file mode 100644 index 00000000..e69de29b diff --git a/INCHI-1-SRC/INCHI_BASE/src/runichi3.c b/INCHI-1-SRC/INCHI_BASE/src/runichi3.c index b326e28d..cb5d880b 100644 --- a/INCHI-1-SRC/INCHI_BASE/src/runichi3.c +++ b/INCHI-1-SRC/INCHI_BASE/src/runichi3.c @@ -245,7 +245,7 @@ int OrigAtData_Duplicate( ORIG_ATOM_DATA *new_orig_atom, - new_orig_atom->szCoord = NULL; + new_orig_atom->szCoord = NULL; if (orig_atom->szCoord) { new_orig_atom->szCoord = (MOL_COORD *) inchi_calloc(orig_nat, sizeof(new_orig_atom->szCoord[0])); @@ -255,10 +255,10 @@ int OrigAtData_Duplicate( ORIG_ATOM_DATA *new_orig_atom, } memcpy(new_orig_atom->szCoord, orig_atom->szCoord, orig_nat * sizeof(new_orig_atom->szCoord[0])); } - + /* Arrays that are not to be copied */ - + new_orig_atom->nEquLabels = NULL; new_orig_atom->nSortedOrder = NULL; @@ -1238,10 +1238,10 @@ OAD_PolymerUnit* OAD_PolymerUnit_New( int maxatoms, u2->blist[k] = blist->item[k]; } } - + } u2->bkbonds = NULL; - + exit_function: if (err) @@ -1528,7 +1528,7 @@ int OAD_ValidatePolymerAndPseudoElementData( ORIG_ATOM_DATA *orig_at_data, /* Assign polymer type and subunits type and check polymer data for consistency */ /* djb-rwth: addressing coverity ID #499497 -- TREAT_ERR properly used in all cases */ - + orig_at_data->valid_polymer = 0; if (treat_polymers && pd) { @@ -1595,29 +1595,29 @@ int OAD_ValidatePolymerAndPseudoElementData( ORIG_ATOM_DATA *orig_at_data, OAD_PolymerUnit_SetEndsAndCaps( u, orig_at_data, &err, pStrErr ); /* Reveal and store CRU caps and ends('stars and partners') - Also set `unit->cap1_is_undef`, `unit->cap2_is_undef`, `unit->cyclizable` + Also set `unit->cap1_is_undef`, `unit->cap2_is_undef`, `unit->cyclizable` */ if (err) { goto exit_function; } - + /* Set possibly missing unit parameters */ u->nbkbonds = 0; u->cyclizable = CLOSING_SRU_NOT_APPLICABLE; u->cyclized = 0; } - + OAD_ValidateAndSortOutPseudoElementAtoms( orig_at_data, treat_polymers, bNPZz, &err, pStrErr ); /* Here we: Make more polymer and pseudoatom data checks Convert both "*" and "Zz" temporarily to "Zy" (polymer-unrelated interal pseudoatoms) - If applicable, check each CRU and back-convert "Zy" to "Zz" (polymer-related + If applicable, check each CRU and back-convert "Zy" to "Zz" (polymer-related pseudoelement atoms) if they are for valid bi-undef-end CRU */ - + if (err) { /* already treated TREAT_ERR( err, 9040, "Improper pseudoelement atoms" ); */ @@ -1995,7 +1995,7 @@ int OAD_Polymer_CyclizeCloseableUnits( ORIG_ATOM_DATA *orig_at_data, /* Find stars and their partners */ OAD_PolymerUnit_SetEndsAndCaps( unit, orig_at_data, &err, pStrErr ); /* Reveal and store CRU caps and ends('stars and partners') - Also set `unit->cap1_is_undef`, `unit->cap2_is_undef`, `unit->cyclizable` + Also set `unit->cap1_is_undef`, `unit->cap2_is_undef`, `unit->cyclizable` */ if (err) { @@ -2157,7 +2157,7 @@ void OAD_PolymerUnit_UnlinkCapsAndConnectEndAtoms( OAD_PolymerUnit *unit, { unit->cyclized = 1; } - + return; } @@ -2258,8 +2258,8 @@ void OAD_PolymerUnit_FindEndsAndCaps( OAD_PolymerUnit *unit, *err = 0; return; } - - + + /**************************************************************************** Reveal and store CRU caps and ends ('stars and partners') ****************************************************************************/ @@ -2486,7 +2486,7 @@ int OAD_Polymer_PrepareWorkingSet( OAD_Polymer *p, } - /* Sort all units in modified alist's lexicographic order + /* Sort all units in modified alist's lexicographic order (modification is: longer list always go first ) */ for (i = 0; i < p->n; i++) { @@ -2582,7 +2582,7 @@ int OrigAtData_RemoveBond( int this_atom, int *num_inp_bonds ) { int del = 0; - + if (at && (this_atom >= 0) && (other_atom >= 0)) /* djb-rwth: fixing oss-fuzz issue #68329, #68286 */ { del = OrigAtData_RemoveHalfBond(this_atom, other_atom, at, bond_type, bond_stereo); @@ -2844,14 +2844,14 @@ void OAD_CollectFragmentBondsAndAtoms( ORIG_ATOM_DATA *orig_at_data, goto exit_function; } - spf->seen[0] = spf->start; + spf->seen[0] = spf->start; spf->nseen = 1; *n_fragbonds = 0; *n_fragatoms = 0; - subgraf_pathfinder_run( spf, + subgraf_pathfinder_run( spf, nforbidden, forbidden_orig, /* this corrects cinnectivity of subgraf... */ - n_fragbonds, fragbonds, + n_fragbonds, fragbonds, n_fragatoms, fragatoms); @@ -2884,7 +2884,7 @@ void OAD_Polymer_FindBackbones( ORIG_ATOM_DATA *at_data, continue; } - OAD_CollectBackboneBonds( at_data, + OAD_CollectBackboneBonds( at_data, at_data->polymer->units[i]->na, at_data->polymer->units[i]->alist, at_data->polymer->units[i]->end_atom1, @@ -2991,10 +2991,10 @@ void OAD_CollectBackboneAtoms(ORIG_ATOM_DATA *at_data, goto exit_function; } - spf->seen[0] = spf->start; spf->nseen = 1; + spf->seen[0] = spf->start; spf->nseen = 1; nbkbonds = 0; *nbkatoms = 0; - + subgraf_pathfinder_run(spf, 0, NULL, &nbkbonds, bkbonds, nbkatoms, bkatoms); subgraf_free(sg); @@ -3007,7 +3007,7 @@ void OAD_CollectBackboneAtoms(ORIG_ATOM_DATA *at_data, { imat_free(maxbkbonds, bkbonds); bkbonds = NULL; - } + } return; } @@ -3097,7 +3097,7 @@ int OAD_CollectReachableAtoms( ORIG_ATOM_DATA *orig_at_data, { inchi_free(atnums); } - + return ret; } @@ -3107,7 +3107,7 @@ int OAD_CollectReachableAtoms( ORIG_ATOM_DATA *orig_at_data, (for polymer CRU, these are the bonds potentially involved in frame shift) ****************************************************************************/ void OAD_CollectBackboneBonds(ORIG_ATOM_DATA *at_data, - int na, + int na, int *alist, int end_atom1, int end_atom2, @@ -3128,7 +3128,7 @@ void OAD_CollectBackboneBonds(ORIG_ATOM_DATA *at_data, /* unit->cyclizable = CLOSING_SRU_NOT_APPLICABLE; */ return; } - start = sg->orig2node[end_atom1]; + start = sg->orig2node[end_atom1]; end = sg->orig2node[end_atom2]; #if 0 if (start > end) @@ -3145,8 +3145,8 @@ void OAD_CollectBackboneBonds(ORIG_ATOM_DATA *at_data, /*unit->cyclizable = CLOSING_SRU_NOT_APPLICABLE;*/ return; } - spf->seen[0] = spf->start; - spf->nseen = 1; + spf->seen[0] = spf->start; + spf->nseen = 1; *nbkbonds = 0; subgraf_pathfinder_run( spf, 0, NULL, nbkbonds, @@ -3745,7 +3745,7 @@ void OAD_PolymerUnit_DebugTrace( OAD_PolymerUnit *u ) ITRACE_("}\n"); } } - + return; } @@ -4423,7 +4423,7 @@ void OAD_ValidateAndSortOutPseudoElementAtoms( ORIG_ATOM_DATA *orig_at_data, TREAT_ERR(*err, (70 + 5), "Invalid element(s):"); TREAT_ERR(*err, (70 + 5), orig_at_data->at[k].elname); continue; -#endif +#endif } is_star = !strcmp( orig_at_data->at[k].elname, "*" ); if (!is_star) @@ -4517,4 +4517,4 @@ int Inp_Atom_GetBondType(inp_ATOM *at, int iatom1, int iatom2) } return -1; -} \ No newline at end of file +} diff --git a/INCHI-1-TEST/tests/test_unit/test_atropisomers.cpp b/INCHI-1-TEST/tests/test_unit/test_atropisomers.cpp index c8eded60..cd1916b0 100644 --- a/INCHI-1-TEST/tests/test_unit/test_atropisomers.cpp +++ b/INCHI-1-TEST/tests/test_unit/test_atropisomers.cpp @@ -373,7 +373,110 @@ TEST(test_atropisomers, test_dummy_5_no_wedge_bonds) FreeINCHI(poutput); } -TEST(test_atropisomers, test_dummy_6_no_atropisomer_1) +TEST(test_atropisomers, test_dummy_6_two_atropisomer_bonds) +{ + const char *molblock = + "test mol atropisomer \n" + " -INDIGO-02232612272D \n" + " \n" + " 0 0 0 0 0 0 0 0 0 0 0 V3000 \n" + "M V30 BEGIN CTAB \n" + "M V30 COUNTS 35 38 0 0 0 \n" + "M V30 BEGIN ATOM \n" + "M V30 1 C 7.64682 -5.78999 0.0 0 \n" + "M V30 2 C 9.47015 -5.85956 0.0 0 \n" + "M V30 3 C 8.58333 -5.30104 0.0 0 \n" + "M V30 4 C 9.42738 -6.91249 0.0 0 \n" + "M V30 5 C 7.60313 -6.84054 0.0 0 \n" + "M V30 6 C 8.49613 -7.40423 0.0 0 \n" + "M V30 7 C 7.83065 -2.75985 0.0 0 \n" + "M V30 8 C 9.58077 -2.8408 0.0 0 \n" + "M V30 9 C 8.73115 -2.29671 0.0 0 \n" + "M V30 10 C 9.53681 -3.85648 0.0 0 \n" + "M V30 11 C 7.7836 -3.77279 0.0 0 \n" + "M V30 12 C 8.64006 -4.32505 0.0 0 \n" + "M V30 13 Br 6.90205 -7.15024 0.0 0 \n" + "M V30 14 Br 10.3254 -7.4481 0.0 0 \n" + "M V30 15 Br 6.93185 -4.22329 0.0 0 \n" + "M V30 16 Br 10.4302 -4.38621 0.0 0 \n" + "M V30 17 Cl 10.4134 -5.37898 0.0 0 \n" + "M V30 18 Cl 6.83923 -5.25149 0.0 0 \n" + "M V30 19 C 8.55343 -8.50701 0.0 0 \n" + "M V30 20 C 7.7261 -9.10432 0.0 0 \n" + "M V30 21 C 7.02177 -10.6261 0.0 0 \n" + "M V30 22 C 7.81179 -10.0708 0.0 0 \n" + "M V30 23 C 6.13959 -10.2141 0.0 0 \n" + "M V30 24 C 6.84915 -8.69665 0.0 0 \n" + "M V30 25 C 6.05278 -9.25201 0.0 0 \n" + "M V30 26 C 5.14001 -8.79074 0.0 0 \n" + "M V30 27 C 3.39085 -8.89047 0.0 0 \n" + "M V30 28 C 4.29687 -9.34501 0.0 0 \n" + "M V30 29 C 3.33353 -7.88488 0.0 0 \n" + "M V30 30 C 5.08172 -7.77981 0.0 0 \n" + "M V30 31 C 4.18147 -7.33019 0.0 0 \n" + "M V30 32 Br 5.94146 -7.18944 0.0 0 \n" + "M V30 33 Br 4.36521 -10.2925 0.0 0 \n" + "M V30 34 Cl 5.34468 -10.7571 0.0 0 \n" + "M V30 35 Cl 6.77442 -7.90166 0.0 0 \n" + "M V30 END ATOM \n" + "M V30 BEGIN BOND \n" + "M V30 1 1 3 1 CFG=1 \n" + "M V30 2 2 1 5 \n" + "M V30 3 1 5 6 \n" + "M V30 4 2 6 4 \n" + "M V30 5 1 4 2 \n" + "M V30 6 2 2 3 \n" + "M V30 7 2 9 7 \n" + "M V30 8 1 7 11 \n" + "M V30 9 2 11 12 \n" + "M V30 10 1 12 10 CFG=1 \n" + "M V30 11 2 10 8 \n" + "M V30 12 1 8 9 \n" + "M V30 13 1 12 3 \n" + "M V30 14 1 5 13 \n" + "M V30 15 1 4 14 \n" + "M V30 16 1 11 15 \n" + "M V30 17 1 10 16 \n" + "M V30 18 1 2 17 \n" + "M V30 19 1 1 18 \n" + "M V30 20 1 6 19 \n" + "M V30 21 1 19 20 \n" + "M V30 22 2 22 20 \n" + "M V30 23 1 20 24 \n" + "M V30 24 2 24 25 \n" + "M V30 25 1 25 23 CFG=1 \n" + "M V30 26 2 23 21 \n" + "M V30 27 1 21 22 \n" + "M V30 28 1 25 26 \n" + "M V30 29 2 28 26 \n" + "M V30 30 1 26 30 CFG=1 \n" + "M V30 31 2 30 31 \n" + "M V30 32 1 31 29 \n" + "M V30 33 2 29 27 \n" + "M V30 34 1 27 28 \n" + "M V30 35 1 30 32 \n" + "M V30 36 1 28 33 \n" + "M V30 37 1 23 34 \n" + "M V30 38 1 24 35 \n" + "M V30 END BOND \n" + "M V30 BEGIN COLLECTION \n" + "M V30 MDLV30/STEABS ATOMS=(4 3 12 25 26) \n" + "M V30 END COLLECTION \n" + "M V30 END CTAB \n" + "M END \n"; + + char options[] = "-Atropisomers"; + inchi_Output output; + inchi_Output *poutput = &output; + const char expected_inchi[] = "InChI=1B"; + + EXPECT_EQ(MakeINCHIFromMolfileText(molblock, options, poutput), 1); + EXPECT_STREQ(poutput->szInChI, expected_inchi); + + FreeINCHI(poutput); +} + +TEST(test_atropisomers, test_dummy_7_no_atropisomer_1) { const char *molblock = "non-atropisomer test mol \n" @@ -422,3 +525,4 @@ TEST(test_atropisomers, test_dummy_6_no_atropisomer_1) FreeINCHI(poutput); } + diff --git a/INCHI-1-TEST/tests/test_unit/test_enhancedStereo.cpp b/INCHI-1-TEST/tests/test_unit/test_enhancedStereo.cpp index 0a771802..5ee2cf51 100644 --- a/INCHI-1-TEST/tests/test_unit/test_enhancedStereo.cpp +++ b/INCHI-1-TEST/tests/test_unit/test_enhancedStereo.cpp @@ -1117,6 +1117,53 @@ TEST(test_enhancedStereo, test_EnhancedStereochemistry_differing_AND_groups_of_s FreeINCHI(poutput); } +TEST(test_enhancedStereo, test_EnhancedStereochemistry_abs_center_test_1) +{ + const char *molblock = + "test mol \n" + " -INDIGO-02232607492D \n" + " \n" + " 0 0 0 0 0 0 0 0 0 0 0 V3000 \n" + "M V30 BEGIN CTAB \n" + "M V30 COUNTS 7 6 0 0 0 \n" + "M V30 BEGIN ATOM \n" + "M V30 1 O 7.38571 -6.2125 0.0 0 \n" + "M V30 2 C 8.25174 -5.7125 0.0 0 \n" + "M V30 3 C 9.11776 -6.2125 0.0 0 CFG=1 \n" + "M V30 4 C 9.98379 -5.7125 0.0 0 CFG=2 \n" + "M V30 5 Cl 9.11776 -7.2125 0.0 0 \n" + "M V30 6 C 10.8498 -6.2125 0.0 0 \n" + "M V30 7 Br 9.98379 -4.7125 0.0 0 \n" + "M V30 END ATOM \n" + "M V30 BEGIN BOND \n" + "M V30 1 1 1 2 \n" + "M V30 2 1 2 3 \n" + "M V30 3 1 3 4 \n" + "M V30 4 1 3 5 CFG=1 \n" + "M V30 5 1 4 6 \n" + "M V30 6 1 4 7 CFG=1 \n" + "M V30 END BOND \n" + "M V30 BEGIN COLLECTION \n" + "M V30 MDLV30/STEABS ATOMS=(2 3 4) \n" + "M V30 END COLLECTION \n" + "M V30 END CTAB \n" + "M END \n"; + + + char options[] = "-EnhancedStereochemistry"; + inchi_Output output; + inchi_Output *poutput = &output; + const char expected_inchi[] = "InChI=1B/C4H8BrClO/c1-3(5)4(6)2-7/h3-4,7H,2H2,1H3/t3-,4-/m0/s1(3,4)"; + + EXPECT_EQ(MakeINCHIFromMolfileText(molblock, options, poutput), 0); + EXPECT_STREQ(poutput->szInChI, expected_inchi); + + poutput->szLog = nullptr; + poutput->szMessage = nullptr; + + FreeINCHI(poutput); +} + TEST(test_enhancedStereo, test_EnhancedStereochemistry_test_file_1) { From 7f34dbaaecbf90f0123c538d11e765f4a417489d Mon Sep 17 00:00:00 2001 From: Christoph Mueller Date: Wed, 25 Feb 2026 13:04:53 +0000 Subject: [PATCH 06/18] added parameter fix --- INCHI-1-SRC/INCHI_BASE/src/ichiparm.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/INCHI-1-SRC/INCHI_BASE/src/ichiparm.c b/INCHI-1-SRC/INCHI_BASE/src/ichiparm.c index 7d5f2cf7..16f24c04 100644 --- a/INCHI-1-SRC/INCHI_BASE/src/ichiparm.c +++ b/INCHI-1-SRC/INCHI_BASE/src/ichiparm.c @@ -124,7 +124,8 @@ int set_common_options_by_parg(const char* pArg, int* pbMergeHash, int* pbHideInChI, int* pbMolecularInorganics, /* @nnuk */ - int* pbEnhancedStereochemistry); + int* pbEnhancedStereochemistry, + int* pbAtropisomers); /**************************************************************************** @@ -169,7 +170,8 @@ int set_common_options_by_parg(const char* pArg, int* pbMergeHash, int* pbHideInChI, int* pbMolecularInorganics, /*@nnuk*/ - int* pbEnhancedStereochemistry + int* pbEnhancedStereochemistry, + int* pbAtropisomers ) { int got = 0; @@ -822,7 +824,7 @@ int ReadCommandLineParms(int argc, &bLargeMolecules, &bPolymers, &bFoldPolymerSRU, &bFrameShiftScheme, &bStereoAtZz, &bNPZz, - &bNoWarnings, &bMergeHash, &bHideInChI, &bMolecularInorganics, &bEnhancedStereochemistry); + &bNoWarnings, &bMergeHash, &bHideInChI, &bMolecularInorganics, &bEnhancedStereochemistry, &bAtropisomers); if (got) { ; @@ -1270,7 +1272,7 @@ int ReadCommandLineParms(int argc, &bLargeMolecules, &bPolymers, &bFoldPolymerSRU, &bFrameShiftScheme, &bStereoAtZz, &bNPZz, - &bNoWarnings, &bMergeHash, &bHideInChI, &bMolecularInorganics, &bEnhancedStereochemistry); + &bNoWarnings, &bMergeHash, &bHideInChI, &bMolecularInorganics, &bEnhancedStereochemistry, &bAtropisomers); if ( got ) { From 518ec8b4e281a29fc5b74f773ead50adec1f52cc Mon Sep 17 00:00:00 2001 From: Christoph Mueller Date: Wed, 25 Feb 2026 14:18:37 +0000 Subject: [PATCH 07/18] add ring detection prototype --- INCHI-1-SRC/INCHI_BASE/src/ring_detection.c | 104 ++++++++++++++++++++ INCHI-1-SRC/INCHI_BASE/src/ring_detection.h | 13 +++ 2 files changed, 117 insertions(+) diff --git a/INCHI-1-SRC/INCHI_BASE/src/ring_detection.c b/INCHI-1-SRC/INCHI_BASE/src/ring_detection.c index e69de29b..beadec6a 100644 --- a/INCHI-1-SRC/INCHI_BASE/src/ring_detection.c +++ b/INCHI-1-SRC/INCHI_BASE/src/ring_detection.c @@ -0,0 +1,104 @@ + +#include "mode.h" +#include "ring_detection.h" + + + // int ring_ids[MAX_RINGS_PER_ATOM]; + // int ring_count; + // int parent_id; // For BFS traversal + // int distance; + + +// Helper: Check if all atoms in ring 'child' are present in ring 'potential_parent' +bool is_subset(Ring* child, Ring* potential_parent) { + if (child->size >= potential_parent->size) return false; + + for (int i = 0; i < child->size; i++) { + bool found = false; + for (int j = 0; j < potential_parent->size; j++) { + if (child->atom_ids[i] == potential_parent->atom_ids[j]) { + found = true; + break; + } + } + if (!found) return false; + } + return true; +} + +// Logic to assign parent_id based on containment +void determine_ring_hierarchy(RingResult* rr) { + for (int i = 0; i < rr->count; i++) { + rr->rings[i].parent_id = -1; // Default + + int smallest_parent_size = 1e6; + + for (int j = 0; j < rr->count; j++) { + if (i == j) continue; + + if (is_subset(&rr->rings[i], &rr->rings[j])) { + // We want the most immediate parent (the smallest ring that contains it) + if (rr->rings[j].size < smallest_parent_size) { + rr->rings[i].parent_id = rr->rings[j].id; + smallest_parent_size = rr->rings[j].size; + } + } + } + } +} + +Ring create_ring_struct(Atom* atoms, int u_id, int v_id, int ring_id) { + int temp_path[MAX_NEIGHBORS * 5]; + int size = 0; + temp_path[size++] = v_id; + int curr = u_id; + while (curr != -1) { + temp_path[size++] = curr; + if (curr == v_id) break; + curr = atoms[curr].parent_id; + } + + Ring r; + r.id = ring_id; + r.size = size; + r.parent_id = -1; + r.atom_ids = (int*)malloc(sizeof(int) * size); + for (int i = 0; i < size; i++) { + r.atom_ids[i] = temp_path[i]; + atoms[temp_path[i]].ring_ids[atoms[temp_path[i]].ring_count++] = ring_id; + } + return r; +} + +RingResult find_unique_rings(Atom* atoms, int num_atoms) { + RingResult rr; + rr.rings = (Ring*)malloc(sizeof(Ring) * num_atoms); + rr.count = 0; + + for (int i = 0; i < num_atoms; i++) { + atoms[i].distance = -1; + atoms[i].parent_id = -1; + } + + int queue[MAX_NEIGHBORS * 10], head = 0, tail = 0; + atoms[0].distance = 0; + queue[tail++] = 0; + + while (head < tail) { + Atom* u = &atoms[queue[head++]]; + for (int i = 0; i < u->neighbor_count; i++) { + Atom* v = u->neighbors[i]; + if (v->distance == -1) { + v->distance = u->distance + 1; + v->parent_id = u->id; + queue[tail++] = v->id; + } else if (v->id != u->parent_id && u->distance >= v->distance) { + rr.rings[rr.count] = create_ring_struct(atoms, u->id, v->id, rr.count); + rr.count++; + } + } + } + + determine_ring_hierarchy(&rr); + return rr; +} diff --git a/INCHI-1-SRC/INCHI_BASE/src/ring_detection.h b/INCHI-1-SRC/INCHI_BASE/src/ring_detection.h index e69de29b..9526be87 100644 --- a/INCHI-1-SRC/INCHI_BASE/src/ring_detection.h +++ b/INCHI-1-SRC/INCHI_BASE/src/ring_detection.h @@ -0,0 +1,13 @@ + + +typedef struct Ring { + int id; + int* atom_ids; + int size; + int parent_id; // Added: ID of the larger ring containing this one +} Ring; + +typedef struct { + Ring* rings; + int count; +} RingResult; From cc0f40836d70513273b862b9a9e92941b5e47ea3 Mon Sep 17 00:00:00 2001 From: Christoph Mueller Date: Thu, 26 Feb 2026 15:26:11 +0000 Subject: [PATCH 08/18] added new ring detection based on hortons algorithm --- .../INCHI_API/libinchi/src/CMakeLists.txt | 2 + INCHI-1-SRC/INCHI_BASE/src/ichimake.c | 23 +- INCHI-1-SRC/INCHI_BASE/src/inpdef.h | 6 + INCHI-1-SRC/INCHI_BASE/src/ring_detection.c | 309 ++++++++++++++---- INCHI-1-SRC/INCHI_BASE/src/ring_detection.h | 17 +- INCHI-1-SRC/INCHI_BASE/src/strutil.c | 17 +- .../INCHI_EXE/inchi-1/src/CMakeLists.txt | 2 + 7 files changed, 293 insertions(+), 83 deletions(-) diff --git a/INCHI-1-SRC/INCHI_API/libinchi/src/CMakeLists.txt b/INCHI-1-SRC/INCHI_API/libinchi/src/CMakeLists.txt index 8fd3b273..3bb4733b 100644 --- a/INCHI-1-SRC/INCHI_API/libinchi/src/CMakeLists.txt +++ b/INCHI-1-SRC/INCHI_API/libinchi/src/CMakeLists.txt @@ -127,6 +127,8 @@ target_sources(libinchi PRIVATE ${P_BASE}/permutation_util.c ${P_BASE}/readinch.c ${P_BASE}/readinch.h + ${P_BASE}/ring_detection.c + ${P_BASE}/ring_detection.h ${P_BASE}/runichi.c ${P_BASE}/runichi2.c ${P_BASE}/runichi3.c diff --git a/INCHI-1-SRC/INCHI_BASE/src/ichimake.c b/INCHI-1-SRC/INCHI_BASE/src/ichimake.c index bd652ecb..b8e86825 100644 --- a/INCHI-1-SRC/INCHI_BASE/src/ichimake.c +++ b/INCHI-1-SRC/INCHI_BASE/src/ichimake.c @@ -54,6 +54,8 @@ #include "bcf_s.h" +#include "ring_detection.h" + /* Local functions */ @@ -3903,16 +3905,20 @@ int Create_INChI(CANON_GLOBALS* pCG, MarkRingSystemsInp(out_at, num_atoms, 0); if (ip->Atropisomers) { + RingResult *ring_result = find_rings(out_at, num_atoms); + + print_ring_result(ring_result); + + free_ring_result(ring_result); + for (i = 0; i < num_atoms; i++) { - if (out_at[i].nRingSystem > 0) { - orig_inp_data->at[i].nRingSystem = out_at[i].nRingSystem; - } - if (out_at[i].nNumAtInRingSystem > 0) { - orig_inp_data->at[i].nNumAtInRingSystem = out_at[i].nNumAtInRingSystem; - } - if (out_at[i].nBlockSystem > 0) { - orig_inp_data->at[i].nBlockSystem = out_at[i].nBlockSystem; + if (out_at[i].ring_count > 0) { + orig_inp_data->at[i].ring_count = out_at[i].ring_count; + for (int j = 0; j < out_at[i].ring_count; j++) { + orig_inp_data->at[i].ring_ids[j] = out_at[i].ring_ids[j]; + } } + for (int j = 0; j < out_at[i].valence; j++) { if (out_at[i].bond_stereo[j] > 0) { orig_inp_data->at[i].bond_stereo[j] = out_at[i].bond_stereo[j]; @@ -3921,6 +3927,7 @@ int Create_INChI(CANON_GLOBALS* pCG, } } + } #endif diff --git a/INCHI-1-SRC/INCHI_BASE/src/inpdef.h b/INCHI-1-SRC/INCHI_BASE/src/inpdef.h index 2981528e..ac6062a9 100644 --- a/INCHI-1-SRC/INCHI_BASE/src/inpdef.h +++ b/INCHI-1-SRC/INCHI_BASE/src/inpdef.h @@ -100,6 +100,9 @@ typedef S_SHORT ST_CAP_FLOW; #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 */ +#define RS_MAX_RINGS_PER_ATOM 10 + + /** * @brief Structure describing an input atom * @@ -190,6 +193,9 @@ typedef struct tagInputAtom AT_NUMB nNumAtInRingSystem; AT_NUMB nBlockSystem; + int ring_ids[RS_MAX_RINGS_PER_ATOM]; + int ring_count; + #if (FIND_RINS_SYSTEMS_DISTANCES == 1) AT_NUMB nDistanceFromTerminal; /* terminal atom or ring system has 1, next has 2, etc. */ #endif diff --git a/INCHI-1-SRC/INCHI_BASE/src/ring_detection.c b/INCHI-1-SRC/INCHI_BASE/src/ring_detection.c index beadec6a..e8fdf478 100644 --- a/INCHI-1-SRC/INCHI_BASE/src/ring_detection.c +++ b/INCHI-1-SRC/INCHI_BASE/src/ring_detection.c @@ -1,104 +1,285 @@ #include "mode.h" +#include "inpdef.h" #include "ring_detection.h" +int is_subset(Ring* child, + Ring* potential_parent) { - // int ring_ids[MAX_RINGS_PER_ATOM]; - // int ring_count; - // int parent_id; // For BFS traversal - // int distance; - - -// Helper: Check if all atoms in ring 'child' are present in ring 'potential_parent' -bool is_subset(Ring* child, Ring* potential_parent) { - if (child->size >= potential_parent->size) return false; + if (child->size >= potential_parent->size) { + return 0; + } for (int i = 0; i < child->size; i++) { - bool found = false; + int found = 0; for (int j = 0; j < potential_parent->size; j++) { if (child->atom_ids[i] == potential_parent->atom_ids[j]) { - found = true; + found = 1; break; } } - if (!found) return false; + if (!found) { + return 0; + } } - return true; + return 1; } -// Logic to assign parent_id based on containment void determine_ring_hierarchy(RingResult* rr) { for (int i = 0; i < rr->count; i++) { - rr->rings[i].parent_id = -1; // Default + rr->rings[i].parent_id = -1; int smallest_parent_size = 1e6; for (int j = 0; j < rr->count; j++) { - if (i == j) continue; + if (i == j) { + continue; + } if (is_subset(&rr->rings[i], &rr->rings[j])) { - // We want the most immediate parent (the smallest ring that contains it) if (rr->rings[j].size < smallest_parent_size) { rr->rings[i].parent_id = rr->rings[j].id; smallest_parent_size = rr->rings[j].size; + rr->rings[j].child_ids = (int*)inchi_realloc(rr->rings[j].child_ids, (rr->rings[j].child_count + 1) * sizeof(int)); + rr->rings[j].child_ids[rr->rings[j].child_count] = rr->rings[i].id; + rr->rings[j].child_count++; } } } } } -Ring create_ring_struct(Atom* atoms, int u_id, int v_id, int ring_id) { - int temp_path[MAX_NEIGHBORS * 5]; - int size = 0; - temp_path[size++] = v_id; - int curr = u_id; - while (curr != -1) { - temp_path[size++] = curr; - if (curr == v_id) break; - curr = atoms[curr].parent_id; - } - - Ring r; - r.id = ring_id; - r.size = size; - r.parent_id = -1; - r.atom_ids = (int*)malloc(sizeof(int) * size); - for (int i = 0; i < size; i++) { - r.atom_ids[i] = temp_path[i]; - atoms[temp_path[i]].ring_ids[atoms[temp_path[i]].ring_count++] = ring_id; - } - return r; +int get_ring_atom_overlap(const Ring *r1, const Ring *r2) { + int overlap = 0; + for (int i = 0; i < r1->size; i++) { + for (int j = 0; j < r2->size; j++) { + if (r1->atom_ids[i] == r2->atom_ids[j]) { + overlap++; + } + } + } + return overlap; } -RingResult find_unique_rings(Atom* atoms, int num_atoms) { - RingResult rr; - rr.rings = (Ring*)malloc(sizeof(Ring) * num_atoms); - rr.count = 0; - - for (int i = 0; i < num_atoms; i++) { - atoms[i].distance = -1; - atoms[i].parent_id = -1; - } - - int queue[MAX_NEIGHBORS * 10], head = 0, tail = 0; - atoms[0].distance = 0; - queue[tail++] = 0; - - while (head < tail) { - Atom* u = &atoms[queue[head++]]; - for (int i = 0; i < u->neighbor_count; i++) { - Atom* v = u->neighbors[i]; - if (v->distance == -1) { - v->distance = u->distance + 1; - v->parent_id = u->id; - queue[tail++] = v->id; - } else if (v->id != u->parent_id && u->distance >= v->distance) { - rr.rings[rr.count] = create_ring_struct(atoms, u->id, v->id, rr.count); - rr.count++; +int get_number_of_overlapping_rings(const Ring *r1, const Ring *r2) { + + int count = 0; + for (int i = 0; i < r1->child_count; i++) { + for (int j = 0; j < r2->child_count; j++) { + if (r1->child_ids[i] == r2->child_ids[j]) { + count++; } } } + return count; +} + +int get_number_of_common_rings(const inp_ATOM *atoms, + int num_atoms, + int atom1, + int atom2) { + + if (atoms == NULL || num_atoms <= 0) { + return 0; // Invalid input + } + + if (atom1 >= num_atoms || atom2 >= num_atoms) { + return 0; // Invalid atom indices + } + int count = 0; + for (int i = 0; i < atoms[atom1].ring_count; i++) { + int ring_id1 = atoms[atom1].ring_ids[i]; + for (int j = 0; j < atoms[atom2].ring_count; j++) { + int ring_id2 = atoms[atom2].ring_ids[j]; + if (ring_id1 == ring_id2) { + count++; + } + } + } + return count; +} + +void print_ring_result(const RingResult *rr) { + + printf("Number of rings: %d\n", rr->count); + + for (int i = 0; i < rr->count; i++) { + const Ring *r = &rr->rings[i]; + printf("Ring ID: %2d, Size: %2d, nof fused ring %2d, parent %2d, Atoms: ", + r->id, r->size, r->nof_unique_fused_ring, r->parent_id); + for (int j = 0; j < r->size; j++) { + printf("%d ", r->atom_ids[j]); + } + printf("\n"); + printf(" Child Ring IDs: "); + for(int j = 0; j < r->child_count; j++) { + printf(" %2d ", r->child_ids[j]); + } + printf("\n"); + } +} + +void free_ring_result(RingResult *rr) { + + if (rr == NULL) { + return; + } + + for (int i = 0; i < rr->count; i++) { + inchi_free(rr->rings[i].atom_ids); + inchi_free(rr->rings[i].child_ids); + } + inchi_free(rr->rings); + inchi_free(rr); +} + +void determine_fused_rings(RingResult* rr) { + + for (int nof_rings = 0; nof_rings < 100; nof_rings++) { + + for (int i = 0; i < rr->count; i++) { + Ring *r1 = &rr->rings[i]; + + if (nof_rings == r1->child_count) { + if (r1->child_count == 0) { + r1->nof_unique_fused_ring = 1; + } + if (r1->parent_id != -1) { + Ring *parent = &rr->rings[r1->parent_id]; + parent->nof_unique_fused_ring+=r1->nof_unique_fused_ring; + } + } + } + } +} + +void *create_new_ring(RingResult *rr, + inp_ATOM *atoms, + int *path, + int path_len) { + + // Ring *r = &rr->rings[rr->count]; //(Ring*)inchi_calloc(1, sizeof(Ring)); + rr->rings = (Ring*)inchi_realloc(rr->rings, (rr->count + 1) * sizeof(Ring)); + Ring *r = &rr->rings[rr->count]; + + r->id = rr->count; + r->size = path_len; + r->parent_id = -1; + r->child_count = 0; + r->child_ids = NULL; + r->nof_unique_fused_ring = 0; + r->atom_ids = (int*)inchi_calloc(path_len, sizeof(int)); + for (int i = 0; i < path_len; i++) { + r->atom_ids[i] = path[i]; + atoms[path[i]].ring_ids[atoms[path[i]].ring_count] = rr->count; + atoms[path[i]].ring_count++; + } + + rr->rings[rr->count] = *r; + rr->count++; +} + +int is_new_ring(RingResult *rr, + int *path, + int path_len) { + + for (int i = 0; i < rr->count; ++i) { + if (rr->rings[i].size != path_len) continue; + int match = 1; + for (int j = 0; j < path_len; ++j) { + int found = 0; + for (int k = 0; k < path_len; ++k) { + if (rr->rings[i].atom_ids[k] == path[j]) { + found = 1; + break; + } + } + if (!found) { + match = 0; + break; + } + } + if (match) return 0; + } + return 1; +} + +void dfs(RingResult *rr, + inp_ATOM* atoms, + int **adj, + int num_atoms, + int start, + int curr, + int *visited, + int *path, + int path_len) { + + visited[curr] = 1; + path[path_len] = curr; + path_len++; + + for (int i = 0; i < num_atoms; ++i) { + if (adj[curr][i]) { + if (i == start && path_len > 2) { + if (is_new_ring(rr, path, path_len)) { + + create_new_ring(rr, atoms, path, path_len); + + } + } else if (!visited[i]) { + // dfs(start, i, visited, path, path_len); + dfs(rr, atoms, adj, num_atoms, start, i, visited, path, path_len); + } + } + } + visited[curr] = 0; + + +} + +RingResult *find_rings(inp_ATOM* atoms, + int num_atoms) { + + if (atoms == NULL || num_atoms <= 0) { + return NULL; // Invalid input + } + + RingResult *rr = (RingResult*)inchi_calloc(1, sizeof(RingResult)); + rr->rings = NULL; //(Ring*)inchi_calloc(num_atoms * 10, sizeof(Ring)); + rr->count = 0; + + int visited[num_atoms]; + int path[num_atoms]; + int **adj = (int**)inchi_calloc(num_atoms, sizeof(int*)); //[num_atoms][num_atoms]; // Adjacency matrix + + for (int i = 0; i < num_atoms; ++i) { + adj[i] = (int*)inchi_calloc(num_atoms, sizeof(int)); + visited[i] = 0; + path[i] = -1; + + inp_ATOM *atom_i = &atoms[i]; + for (int j = 0; j < atom_i->valence; j++) { + int neighbor = atom_i->neighbor[j]; + adj[i][neighbor] = 1; + // adj[neighbor][i] = 1; // Undirected graph + } + } + + for (int i = 0; i < num_atoms; ++i) { + dfs(rr, atoms, adj, num_atoms, i, i, visited, path, 0); + } + + + determine_ring_hierarchy(rr); + + determine_fused_rings(rr); + + for (int i = 0; i < num_atoms; ++i) { + inchi_free(adj[i]); + } + inchi_free(adj); - determine_ring_hierarchy(&rr); return rr; } + + diff --git a/INCHI-1-SRC/INCHI_BASE/src/ring_detection.h b/INCHI-1-SRC/INCHI_BASE/src/ring_detection.h index 9526be87..f6bde465 100644 --- a/INCHI-1-SRC/INCHI_BASE/src/ring_detection.h +++ b/INCHI-1-SRC/INCHI_BASE/src/ring_detection.h @@ -2,12 +2,27 @@ typedef struct Ring { int id; - int* atom_ids; + int *atom_ids; int size; + int nof_unique_fused_ring; int parent_id; // Added: ID of the larger ring containing this one + int *child_ids; + int child_count; } Ring; typedef struct { Ring* rings; int count; } RingResult; + + +RingResult *find_rings(inp_ATOM* atoms, int num_atoms); + +int get_number_of_common_rings(const inp_ATOM* atoms, + int num_atoms, + int atom1, + int atom2); + +void print_ring_result(const RingResult *rr); + +void free_ring_result(RingResult *rr); diff --git a/INCHI-1-SRC/INCHI_BASE/src/strutil.c b/INCHI-1-SRC/INCHI_BASE/src/strutil.c index 9109585d..e50b91e3 100644 --- a/INCHI-1-SRC/INCHI_BASE/src/strutil.c +++ b/INCHI-1-SRC/INCHI_BASE/src/strutil.c @@ -55,6 +55,8 @@ #include "bcf_s.h" +#include "ring_detection.h" + /* Added fix to remove_ion_pairs() -- 2010-03-17 DT */ #define FIX_P_IV_Plus_O_Minus @@ -7198,8 +7200,8 @@ int set_Atropisomer_t_m_layers( const ORIG_ATOM_DATA *orig_inp_data, atom_i.bond_stereo[j] == 0 && atom_i.bond_type[j] == 1) { - if (atom_i.nNumAtInRingSystem > 1 || - atom_j.nNumAtInRingSystem > 1) { + if (atom_i.ring_count > 0 || + atom_j.ring_count > 0) { int nof_wedge_bonds_i = 0; int has_double_bond_i = 0; @@ -7229,19 +7231,14 @@ int set_Atropisomer_t_m_layers( const ORIG_ATOM_DATA *orig_inp_data, if (nof_wedge_bonds_i > 0 || nof_wedge_bonds_j > 0) { - // if(atom_i.nRingSystem != atom_j.nRingSystem) { - // printf("Atropisomer candidate: Atom %d with neighbor %d\n", i + 1, neighbors[j] + 1); - // } else { - if (has_double_bond_i || has_double_bond_j) { + if ((has_double_bond_i || has_double_bond_j)) { printf("Atropisomer candidate: atom %d with atom %d; bond type %d; bond stereo %d\n", i + 1, neighbors[j] + 1, atom_i.bond_type[j], atom_i.bond_stereo[j]); printf("atom type %d %d\n", atom_i.el_number, atom_j.el_number); printf("has double bond %d %d\n", has_double_bond_i, has_double_bond_j); - printf("ring info #atoms in rings %d %d\n", atom_i.nNumAtInRingSystem, atom_j.nNumAtInRingSystem); - printf("ring info ring ids %d %d\n", atom_i.nRingSystem, atom_j.nRingSystem); - printf("ring info block ids %d %d\n", atom_i.nBlockSystem, atom_j.nBlockSystem); + printf("nof shared rings %d\n", get_number_of_common_rings(orig_inp_data->at, orig_inp_data->num_inp_atoms, i, neighbors[j])); + } - // } } } diff --git a/INCHI-1-SRC/INCHI_EXE/inchi-1/src/CMakeLists.txt b/INCHI-1-SRC/INCHI_EXE/inchi-1/src/CMakeLists.txt index 8b83d19d..fbc1d5d7 100644 --- a/INCHI-1-SRC/INCHI_EXE/inchi-1/src/CMakeLists.txt +++ b/INCHI-1-SRC/INCHI_EXE/inchi-1/src/CMakeLists.txt @@ -102,6 +102,8 @@ target_sources(inchi-1 PRIVATE ${P_BASE}/permutation_util.c ${P_BASE}/readinch.c ${P_BASE}/readinch.h + ${P_BASE}/ring_detection.c + ${P_BASE}/ring_detection.h ${P_BASE}/runichi.c ${P_BASE}/runichi2.c ${P_BASE}/runichi3.c From b33addafb50f7a2d55681255c9258bf809239cb1 Mon Sep 17 00:00:00 2001 From: Christoph Mueller Date: Fri, 27 Feb 2026 14:16:07 +0000 Subject: [PATCH 09/18] Added ringsystem funcationalities and unit tests --- INCHI-1-SRC/INCHI_BASE/src/ichimake.c | 31 +- INCHI-1-SRC/INCHI_BASE/src/inpdef.h | 6 +- INCHI-1-SRC/INCHI_BASE/src/ring_detection.c | 288 +++++++---- INCHI-1-SRC/INCHI_BASE/src/ring_detection.h | 23 +- INCHI-1-SRC/INCHI_BASE/src/strutil.c | 37 +- .../tests/test_unit/test_atropisomers.cpp | 450 +++++++++++++++--- 6 files changed, 660 insertions(+), 175 deletions(-) diff --git a/INCHI-1-SRC/INCHI_BASE/src/ichimake.c b/INCHI-1-SRC/INCHI_BASE/src/ichimake.c index b8e86825..aae3114e 100644 --- a/INCHI-1-SRC/INCHI_BASE/src/ichimake.c +++ b/INCHI-1-SRC/INCHI_BASE/src/ichimake.c @@ -3905,11 +3905,32 @@ int Create_INChI(CANON_GLOBALS* pCG, MarkRingSystemsInp(out_at, num_atoms, 0); if (ip->Atropisomers) { - RingResult *ring_result = find_rings(out_at, num_atoms); + RingSystems *ring_result = find_rings(out_at, num_atoms); - print_ring_result(ring_result); + // print_ring_result(ring_result); - free_ring_result(ring_result); + for (i = 0; i < num_atoms; i++) { + out_at[i].fused_partner_atom_id = -1; + } + for (i = 0; i < num_atoms; i++) { + for (int j = i + 1; j < num_atoms; j++) { + // printf("%d %d\n", i, j); + if(is_fused_ring_pivot(ring_result, out_at, i, j)) { + // printf(">>> Found pivot atom pair: %d, %d\n", i, j); + out_at[i].fused_partner_atom_id = j; + out_at[j].fused_partner_atom_id = i; + } + } + } + + if (ring_result != NULL) { + // orig_inp_data->ring_id_to_size = (int*)inchi_calloc(ring_result->count, sizeof(int)); + for (i = 0; i < ring_result->count; i++) { + orig_inp_data->ring_id_to_size[i] = ring_result->rings[i].size; + } + } + + free_ring_system(ring_result); for (i = 0; i < num_atoms; i++) { if (out_at[i].ring_count > 0) { @@ -3924,8 +3945,10 @@ int Create_INChI(CANON_GLOBALS* pCG, orig_inp_data->at[i].bond_stereo[j] = out_at[i].bond_stereo[j]; // printf("%d %d\n", i, out_at[i].bond_stereo[j]); } - } + // if (out_at[i].fused_partner_atom_id > -1) { + orig_inp_data->at[i].fused_partner_atom_id = out_at[i].fused_partner_atom_id; + } } diff --git a/INCHI-1-SRC/INCHI_BASE/src/inpdef.h b/INCHI-1-SRC/INCHI_BASE/src/inpdef.h index ac6062a9..e4d47bf4 100644 --- a/INCHI-1-SRC/INCHI_BASE/src/inpdef.h +++ b/INCHI-1-SRC/INCHI_BASE/src/inpdef.h @@ -101,7 +101,7 @@ typedef S_SHORT ST_CAP_FLOW; #define SB_PARITY_2(X) (((X) >> SB_PARITY_SHFT) & SB_PARITY_MASK) /**< refers to connected structure */ #define RS_MAX_RINGS_PER_ATOM 10 - +#define RS_MAX_NOF_RINGS 1000 /** * @brief Structure describing an input atom @@ -196,6 +196,8 @@ typedef struct tagInputAtom int ring_ids[RS_MAX_RINGS_PER_ATOM]; int ring_count; + int fused_partner_atom_id; + #if (FIND_RINS_SYSTEMS_DISTANCES == 1) AT_NUMB nDistanceFromTerminal; /* terminal atom or ring system has 1, next has 2, etc. */ #endif @@ -467,6 +469,8 @@ typedef struct tagOrigAtom int valid_polymer; int n_zy; /* number of non-polymeric pseudoatoms (Zy) */ + int ring_id_to_size[RS_MAX_NOF_RINGS]; + } ORIG_ATOM_DATA; /** diff --git a/INCHI-1-SRC/INCHI_BASE/src/ring_detection.c b/INCHI-1-SRC/INCHI_BASE/src/ring_detection.c index e8fdf478..7d40f2d2 100644 --- a/INCHI-1-SRC/INCHI_BASE/src/ring_detection.c +++ b/INCHI-1-SRC/INCHI_BASE/src/ring_detection.c @@ -25,25 +25,26 @@ int is_subset(Ring* child, return 1; } -void determine_ring_hierarchy(RingResult* rr) { - for (int i = 0; i < rr->count; i++) { - rr->rings[i].parent_id = -1; +void determine_ring_hierarchy(RingSystems* rs) { + for (int i = 0; i < rs->count; i++) { + rs->rings[i].parent_id = -1; int smallest_parent_size = 1e6; - for (int j = 0; j < rr->count; j++) { + for (int j = 0; j < rs->count; j++) { if (i == j) { continue; } - if (is_subset(&rr->rings[i], &rr->rings[j])) { - if (rr->rings[j].size < smallest_parent_size) { - rr->rings[i].parent_id = rr->rings[j].id; - smallest_parent_size = rr->rings[j].size; - rr->rings[j].child_ids = (int*)inchi_realloc(rr->rings[j].child_ids, (rr->rings[j].child_count + 1) * sizeof(int)); - rr->rings[j].child_ids[rr->rings[j].child_count] = rr->rings[i].id; - rr->rings[j].child_count++; - } + if (is_subset(&rs->rings[i], &rs->rings[j])) { + // if (rs->rings[j].size < smallest_parent_size) { + rs->rings[i].parent_id = rs->rings[j].id; + // smallest_parent_size = rs->rings[j].size; + + rs->rings[j].child_ids = (int*)inchi_realloc(rs->rings[j].child_ids, (rs->rings[j].child_count + 1) * sizeof(int)); + rs->rings[j].child_ids[rs->rings[j].child_count] = rs->rings[i].id; + rs->rings[j].child_count++; + // } } } } @@ -74,122 +75,165 @@ int get_number_of_overlapping_rings(const Ring *r1, const Ring *r2) { return count; } -int get_number_of_common_rings(const inp_ATOM *atoms, - int num_atoms, - int atom1, - int atom2) { +int get_number_of_atomic_rings_from_atom(const RingSystems *rs, + int atom_id) { - if (atoms == NULL || num_atoms <= 0) { + if (atom_id < 0) { return 0; // Invalid input } - if (atom1 >= num_atoms || atom2 >= num_atoms) { - return 0; // Invalid atom indices - } int count = 0; - for (int i = 0; i < atoms[atom1].ring_count; i++) { - int ring_id1 = atoms[atom1].ring_ids[i]; - for (int j = 0; j < atoms[atom2].ring_count; j++) { - int ring_id2 = atoms[atom2].ring_ids[j]; - if (ring_id1 == ring_id2) { - count++; + for (int i = 0; i < rs->count; i++) { + const Ring *cur_ring = &rs->rings[i]; + if (cur_ring->child_count == 0) { + for (int j = 0; j < cur_ring->size; j++) { + if (cur_ring->atom_ids[j] == atom_id) { + count++; + } } } } return count; } -void print_ring_result(const RingResult *rr) { - - printf("Number of rings: %d\n", rr->count); - - for (int i = 0; i < rr->count; i++) { - const Ring *r = &rr->rings[i]; - printf("Ring ID: %2d, Size: %2d, nof fused ring %2d, parent %2d, Atoms: ", - r->id, r->size, r->nof_unique_fused_ring, r->parent_id); - for (int j = 0; j < r->size; j++) { - printf("%d ", r->atom_ids[j]); +int is_atom_in_ring(const Ring *r, int atom_id) { + for (int i = 0; i < r->size; i++) { + if (r->atom_ids[i] == atom_id) { + return 1; } - printf("\n"); - printf(" Child Ring IDs: "); - for(int j = 0; j < r->child_count; j++) { - printf(" %2d ", r->child_ids[j]); + } + return 0; +} + +int are_atoms_in_same_small_ring(const inp_ATOM* atoms, + const int *ring_id_to_size, + int atom_id1, int atom_id2, + int max_ring_size) { + + inp_ATOM atom1 = atoms[atom_id1]; + inp_ATOM atom2 = atoms[atom_id2]; + + for (int i = 0; i < atom1.ring_count; i++) { + int ring_id1 = atom1.ring_ids[i]; + if (ring_id_to_size[ring_id1] <= max_ring_size) { + for (int j = 0; j < atom2.ring_count; j++) { + int ring_id2 = atom2.ring_ids[j]; + if (ring_id1 == ring_id2) { + return 1; + } + } } - printf("\n"); } + return 0; } -void free_ring_result(RingResult *rr) { +void print_ring(const Ring *r) { + printf("Ring ID: %d, Size: %d, nof fused ring %d, parent %d, Atoms: ", + r->id, r->size, r->nof_atomic_rings, r->parent_id); + for (int i = 0; i < r->size; i++) { + printf("%d ", r->atom_ids[i]); + } + printf("\n"); + printf(" Child Ring IDs: "); + for(int i = 0; i < r->child_count; i++) { + printf(" %d ", r->child_ids[i]); + } + printf("\n"); +} + +void print_ring_result(const RingSystems *rs) { + + printf("Number of rings: %d\n", rs->count); + + for (int i = 0; i < rs->count; i++) { + const Ring *r = &rs->rings[i]; + print_ring(r); + } +} + +void free_ring_system(RingSystems *rs) { - if (rr == NULL) { + if (rs == NULL) { return; } - for (int i = 0; i < rr->count; i++) { - inchi_free(rr->rings[i].atom_ids); - inchi_free(rr->rings[i].child_ids); + for (int i = 0; i < rs->count; i++) { + inchi_free(rs->rings[i].atom_ids); + inchi_free(rs->rings[i].child_ids); } - inchi_free(rr->rings); - inchi_free(rr); + inchi_free(rs->rings); + inchi_free(rs); } -void determine_fused_rings(RingResult* rr) { +int sub_ring_counter(RingSystems* rs, const Ring *r, int *ring_counter) { + if (r->child_count == 0) { + ring_counter[r->id] = 1; + } else { + for (int i = 0; i < r->child_count; i++) { + sub_ring_counter(rs, &rs->rings[r->child_ids[i]], ring_counter); + } + } +} - for (int nof_rings = 0; nof_rings < 100; nof_rings++) { +void determine_fused_rings(RingSystems* rs) { - for (int i = 0; i < rr->count; i++) { - Ring *r1 = &rr->rings[i]; + for (int i = 0; i < rs->count; i++) { + Ring *cur_ring = &rs->rings[i]; - if (nof_rings == r1->child_count) { - if (r1->child_count == 0) { - r1->nof_unique_fused_ring = 1; - } - if (r1->parent_id != -1) { - Ring *parent = &rr->rings[r1->parent_id]; - parent->nof_unique_fused_ring+=r1->nof_unique_fused_ring; - } + int ring_counter[rs->count]; + for (int j = 0; j < rs->count; j++) { + ring_counter[j] = 0; + } + sub_ring_counter(rs, cur_ring, ring_counter); + + int count = 0; + for (int j = 0; j < rs->count; j++) { + if (ring_counter[j] > 0) { + count++; } } + + cur_ring->nof_atomic_rings = count; } } -void *create_new_ring(RingResult *rr, +void *create_new_ring(RingSystems *rs, inp_ATOM *atoms, int *path, int path_len) { - // Ring *r = &rr->rings[rr->count]; //(Ring*)inchi_calloc(1, sizeof(Ring)); - rr->rings = (Ring*)inchi_realloc(rr->rings, (rr->count + 1) * sizeof(Ring)); - Ring *r = &rr->rings[rr->count]; + // Ring *r = &rs->rings[rs->count]; //(Ring*)inchi_calloc(1, sizeof(Ring)); + rs->rings = (Ring*)inchi_realloc(rs->rings, (rs->count + 1) * sizeof(Ring)); + Ring *r = &rs->rings[rs->count]; - r->id = rr->count; + r->id = rs->count; r->size = path_len; r->parent_id = -1; r->child_count = 0; r->child_ids = NULL; - r->nof_unique_fused_ring = 0; + r->nof_atomic_rings = 0; r->atom_ids = (int*)inchi_calloc(path_len, sizeof(int)); for (int i = 0; i < path_len; i++) { r->atom_ids[i] = path[i]; - atoms[path[i]].ring_ids[atoms[path[i]].ring_count] = rr->count; + atoms[path[i]].ring_ids[atoms[path[i]].ring_count] = rs->count; atoms[path[i]].ring_count++; } - rr->rings[rr->count] = *r; - rr->count++; + rs->rings[rs->count] = *r; + rs->count++; } -int is_new_ring(RingResult *rr, +int is_new_ring(RingSystems *rs, int *path, int path_len) { - for (int i = 0; i < rr->count; ++i) { - if (rr->rings[i].size != path_len) continue; + for (int i = 0; i < rs->count; ++i) { + if (rs->rings[i].size != path_len) continue; int match = 1; for (int j = 0; j < path_len; ++j) { int found = 0; for (int k = 0; k < path_len; ++k) { - if (rr->rings[i].atom_ids[k] == path[j]) { + if (rs->rings[i].atom_ids[k] == path[j]) { found = 1; break; } @@ -204,7 +248,7 @@ int is_new_ring(RingResult *rr, return 1; } -void dfs(RingResult *rr, +void dfs(RingSystems *rs, inp_ATOM* atoms, int **adj, int num_atoms, @@ -221,14 +265,14 @@ void dfs(RingResult *rr, for (int i = 0; i < num_atoms; ++i) { if (adj[curr][i]) { if (i == start && path_len > 2) { - if (is_new_ring(rr, path, path_len)) { + if (is_new_ring(rs, path, path_len)) { - create_new_ring(rr, atoms, path, path_len); + create_new_ring(rs, atoms, path, path_len); } } else if (!visited[i]) { // dfs(start, i, visited, path, path_len); - dfs(rr, atoms, adj, num_atoms, start, i, visited, path, path_len); + dfs(rs, atoms, adj, num_atoms, start, i, visited, path, path_len); } } } @@ -237,16 +281,88 @@ void dfs(RingResult *rr, } -RingResult *find_rings(inp_ATOM* atoms, - int num_atoms) { +int is_fused_ring_pivot(const RingSystems *rs, + const inp_ATOM * atoms, + int atom_id1, int atom_id2) { + + if (atoms == NULL || rs == NULL || atom_id1 < 0 || atom_id2 < 0) { + return 0; // Invalid input + } + + int are_neighbours = 0; + + const inp_ATOM *atom1 = &atoms[atom_id1]; + const inp_ATOM *atom2 = &atoms[atom_id2]; + + if (atom1 == NULL || atom2 == NULL) { + return 0; // Invalid input + } + + if (atom1->valence <= 2 || atom2->valence <= 2) { + return 0; + } + + for (int i = 0; i < atom1->valence; i++) { + if (atom1->neighbor[i] == atom_id2) { + are_neighbours = 1; + break; + } + } + if (get_number_of_atomic_rings_from_atom(rs, atom_id1) < 2 && + get_number_of_atomic_rings_from_atom(rs, atom_id2) < 2) { + return 0; + } + + if (are_neighbours) { + for (int i = 0; i < rs->count; i++) { + const Ring *r = &rs->rings[i]; + int found_atom1 = 0; + int found_atom2 = 0; + for (int j = 0; j < r->size; j++) { + if (r->atom_ids[j] == atom_id1) { + found_atom1 = 1; + } + if (r->atom_ids[j] == atom_id2) { + found_atom2 = 1; + } + } + if (found_atom1 && found_atom2) { + if (r->nof_atomic_rings == 2) { + // printf("atom1 %d atom2 %d ring id %d nof atomic rings %d\n", + // atom_id1, atom_id2, r->id, r->nof_atomic_rings); + // print_ring(r); + int count = 0; + for (int j = 0; j < r->child_count; j++) { + const Ring *child_ring = &rs->rings[r->child_ids[j]]; + if (is_atom_in_ring(child_ring, atom_id1) && is_atom_in_ring(child_ring, atom_id2)) { + count++; + } + } + if (count == r->child_count) { + // printf("atom1 %d atom2 %d ring id %d nof atomic rings %d\n", + // atom_id1, atom_id2, r->id, r->nof_atomic_rings); + // print_ring(r); + // printf(">>> Found pivot atom pair: %d, %d\n", atom_id1, atom_id2); + return 1; + } + } + } + } + } + + return 0; +} + +RingSystems *find_rings(inp_ATOM* atoms, + int num_atoms) { if (atoms == NULL || num_atoms <= 0) { return NULL; // Invalid input } - RingResult *rr = (RingResult*)inchi_calloc(1, sizeof(RingResult)); - rr->rings = NULL; //(Ring*)inchi_calloc(num_atoms * 10, sizeof(Ring)); - rr->count = 0; + RingSystems *rs = (RingSystems*)inchi_calloc(1, sizeof(RingSystems)); + rs->rings = NULL; //(Ring*)inchi_calloc(num_atoms * 10, sizeof(Ring)); + rs->count = 0; int visited[num_atoms]; int path[num_atoms]; @@ -266,20 +382,20 @@ RingResult *find_rings(inp_ATOM* atoms, } for (int i = 0; i < num_atoms; ++i) { - dfs(rr, atoms, adj, num_atoms, i, i, visited, path, 0); + dfs(rs, atoms, adj, num_atoms, i, i, visited, path, 0); } - determine_ring_hierarchy(rr); + determine_ring_hierarchy(rs); - determine_fused_rings(rr); + determine_fused_rings(rs); for (int i = 0; i < num_atoms; ++i) { inchi_free(adj[i]); } inchi_free(adj); - return rr; + return rs; } diff --git a/INCHI-1-SRC/INCHI_BASE/src/ring_detection.h b/INCHI-1-SRC/INCHI_BASE/src/ring_detection.h index f6bde465..4330a657 100644 --- a/INCHI-1-SRC/INCHI_BASE/src/ring_detection.h +++ b/INCHI-1-SRC/INCHI_BASE/src/ring_detection.h @@ -1,10 +1,9 @@ - typedef struct Ring { int id; int *atom_ids; int size; - int nof_unique_fused_ring; + int nof_atomic_rings; int parent_id; // Added: ID of the larger ring containing this one int *child_ids; int child_count; @@ -13,16 +12,20 @@ typedef struct Ring { typedef struct { Ring* rings; int count; -} RingResult; +} RingSystems; + +RingSystems *find_rings(inp_ATOM* atoms, int num_atoms); -RingResult *find_rings(inp_ATOM* atoms, int num_atoms); +int is_fused_ring_pivot(const RingSystems *rs, + const inp_ATOM * atoms, + int atom_id1, int atom_id2); -int get_number_of_common_rings(const inp_ATOM* atoms, - int num_atoms, - int atom1, - int atom2); +void print_ring_result(const RingSystems *rs); -void print_ring_result(const RingResult *rr); +void free_ring_system(RingSystems *rs); -void free_ring_result(RingResult *rr); +int are_atoms_in_same_small_ring(const inp_ATOM* atoms, + const int *ring_id_to_size, + int atom_id1, int atom_id2, + int max_ring_size); diff --git a/INCHI-1-SRC/INCHI_BASE/src/strutil.c b/INCHI-1-SRC/INCHI_BASE/src/strutil.c index e50b91e3..c4d9d056 100644 --- a/INCHI-1-SRC/INCHI_BASE/src/strutil.c +++ b/INCHI-1-SRC/INCHI_BASE/src/strutil.c @@ -7188,12 +7188,26 @@ int set_Atropisomer_t_m_layers( const ORIG_ATOM_DATA *orig_inp_data, const inp_ATOM atom_i = orig_inp_data->at[i]; + // if (atom_i.is_fused_pivot_atom == 0) { + // continue; + // } + int num_neighbors_i = atom_i.valence; const AT_NUMB *neighbors = atom_i.neighbor; // printf("Atom %d with %d neighbors; ring system id %d; num atoms in ring %d\n", i + 1, num_neighbors, orig_inp_data->at[i].nRingSystem, orig_inp_data->at[i].nNumAtInRingSystem); if (num_neighbors_i == 3) { for (int j = 0; j < num_neighbors_i; j++) { + + if (i >= neighbors[j]) { + continue; + } + const inp_ATOM atom_j = orig_inp_data->at[neighbors[j]]; + + // if (atom_j.is_fused_pivot_atom == 0) { + // continue; + // } + int num_neighbors_j = atom_j.valence; if (num_neighbors_j == 3 && @@ -7232,12 +7246,23 @@ int set_Atropisomer_t_m_layers( const ORIG_ATOM_DATA *orig_inp_data, nof_wedge_bonds_j > 0) { if ((has_double_bond_i || has_double_bond_j)) { - printf("Atropisomer candidate: atom %d with atom %d; bond type %d; bond stereo %d\n", - i + 1, neighbors[j] + 1, atom_i.bond_type[j], atom_i.bond_stereo[j]); - printf("atom type %d %d\n", atom_i.el_number, atom_j.el_number); - printf("has double bond %d %d\n", has_double_bond_i, has_double_bond_j); - printf("nof shared rings %d\n", get_number_of_common_rings(orig_inp_data->at, orig_inp_data->num_inp_atoms, i, neighbors[j])); - + if ((atom_i.fused_partner_atom_id != j && + atom_j.fused_partner_atom_id != i) || + (atom_i.fused_partner_atom_id == -1 || + atom_j.fused_partner_atom_id == -1)) { + + if (are_atoms_in_same_small_ring(orig_inp_data->at, + orig_inp_data->ring_id_to_size, + i, neighbors[j], + 6) == 0) { + printf(">>> is atropisomer\n"); + printf("infos: atom %d with atom %d; bond type %d; bond stereo %d\n", + i, neighbors[j], atom_i.bond_type[j], atom_i.bond_stereo[j]); + printf("atom type %d %d\n", atom_i.el_number, atom_j.el_number); + printf("has double bond %d %d\n", has_double_bond_i, has_double_bond_j); + printf("fused pivot atoms %d %d\n", atom_i.fused_partner_atom_id, atom_j.fused_partner_atom_id); + } + } } } } diff --git a/INCHI-1-TEST/tests/test_unit/test_atropisomers.cpp b/INCHI-1-TEST/tests/test_unit/test_atropisomers.cpp index cd1916b0..d238aba4 100644 --- a/INCHI-1-TEST/tests/test_unit/test_atropisomers.cpp +++ b/INCHI-1-TEST/tests/test_unit/test_atropisomers.cpp @@ -201,76 +201,75 @@ TEST(test_atropisomers, test_dummy_3) FreeINCHI(poutput); } -TEST(test_atropisomers, test_dummy_4) +TEST(test_atropisomers, test_dummy_4_atypical_no_2_rings) { const char *molblock = - "atropisomer test mol \n" - " Ketcher 2202610562D 1 1.00000 0.00000 0 \n" - " \n" - " 24 25 0 0 1 0 0 0 0 0999 V2000 \n" - " 9.1250 -2.5500 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" - " 9.9910 -3.0500 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" - " 9.9910 -4.0500 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" - " 9.1250 -4.5500 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" - " 8.2590 -4.0500 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" - " 8.2590 -3.0500 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" - " 7.1288 -7.8500 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" - " 6.2598 -7.3550 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" - " 7.9902 -7.3505 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" - " 7.1266 -5.8500 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" - " 7.9902 -6.3496 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" - " 6.2598 -6.3501 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" - " 7.1272 -4.8500 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 \n" - " 6.2612 -4.3500 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" - " 6.2612 -3.3500 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 \n" - " 5.3952 -4.8500 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" - " 4.5292 -4.3500 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" - " 5.3939 -5.8499 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" - " 8.8564 -5.8500 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" - " 8.8564 -4.8500 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 \n" - " 9.7224 -6.3500 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 \n" - " 4.8939 -6.7160 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" - " 5.8939 -4.9839 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" - " 4.5279 -5.3499 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" - " 2 1 1 0 0 0 \n" - " 3 2 1 0 0 0 \n" - " 4 3 1 0 0 0 \n" - " 5 4 1 0 0 0 \n" - " 6 5 1 0 0 0 \n" - " 1 6 1 0 0 0 \n" - " 11 10 2 0 0 0 \n" - " 9 11 1 0 0 0 \n" - " 7 9 2 0 0 0 \n" - " 8 7 1 0 0 0 \n" - " 12 8 2 0 0 0 \n" - " 10 12 1 1 0 0 \n" - " 10 13 1 0 0 0 \n" - " 13 5 1 0 0 0 \n" - " 13 14 1 6 0 0 \n" - " 14 15 2 0 0 0 \n" - " 14 16 1 0 0 0 \n" - " 16 17 2 0 0 0 \n" - " 12 18 1 0 0 0 \n" - " 11 19 1 0 0 0 \n" - " 19 20 2 0 0 0 0 \n" - " 19 21 1 0 0 0 0 \n" - " 22 18 1 0 0 0 0 \n" - " 18 23 1 0 0 0 0 \n" - " 18 24 1 0 0 0 0 \n" - "M STY 1 1 SUP \n" - "M SLB 1 1 1 \n" - "M SAP 1 1 19 0 \n" - "M SAL 1 3 19 20 21 \n" - "M SBL 1 1 20 \n" - "M SMT 1 CONH2 \n" - "M STY 1 2 SUP \n" - "M SLB 1 2 2 \n" - "M SAP 2 1 18 0 \n" - "M SAL 2 4 18 22 23 24 \n" - "M SBL 2 1 19 \n" - "M SMT 2 tBu \n" - "M END \n"; - + "atropisomer atypical no 2 rings \n" + " Ketcher 2272612 82D 1 1.00000 0.00000 0 \n" + " \n" + " 24 25 0 0 1 0 0 0 0 0999 V2000 \n" + " 6.7791 -6.8681 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 8.4871 -6.8676 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 7.6347 -6.3744 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 8.4871 -7.8557 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 6.7791 -7.8601 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 7.6369 -8.3488 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 8.8265 -3.8573 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 8.8265 -4.8444 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 9.6814 -5.3380 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 10.5363 -4.8444 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 10.5363 -3.8573 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 9.6814 -3.3637 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 7.6353 -5.3873 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 6.8053 -4.8531 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 6.8529 -3.8671 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 5.9276 -5.3048 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 5.0975 -4.7705 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 9.3422 -6.3745 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 5.9243 -6.3744 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 9.3422 -5.3874 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 10.1971 -6.8680 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 5.4307 -7.2293 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 6.4179 -5.5196 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 5.0694 -5.8809 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 3 1 1 1 0 0 \n" + " 1 5 2 0 0 0 \n" + " 5 6 1 0 0 0 \n" + " 6 4 2 0 0 0 \n" + " 4 2 1 0 0 0 \n" + " 2 3 2 0 0 0 \n" + " 12 7 1 0 0 0 \n" + " 7 8 1 0 0 0 \n" + " 8 9 1 0 0 0 \n" + " 9 10 1 0 0 0 \n" + " 10 11 1 0 0 0 \n" + " 11 12 1 0 0 0 \n" + " 3 13 1 0 0 0 \n" + " 13 8 1 0 0 0 \n" + " 13 14 1 6 0 0 \n" + " 14 15 2 0 0 0 \n" + " 14 16 1 0 0 0 \n" + " 16 17 2 0 0 0 \n" + " 2 18 1 0 0 0 \n" + " 1 19 1 0 0 0 \n" + " 18 20 2 0 0 0 \n" + " 18 21 1 0 0 0 \n" + " 22 19 1 0 0 0 \n" + " 19 23 1 0 0 0 \n" + " 19 24 1 0 0 0 \n" + "M STY 1 1 SUP \n" + "M SLB 1 1 1 \n" + "M SAP 1 1 18 0 \n" + "M SAL 1 3 18 20 21 \n" + "M SBL 1 1 19 \n" + "M SMT 1 CONH2 \n" + "M STY 1 2 SUP \n" + "M SLB 1 2 2 \n" + "M SAP 2 1 19 0 \n" + "M SAL 2 4 19 22 23 24 \n" + "M SBL 2 1 20 \n" + "M SMT 2 tBu \n" + "M END \n"; char options[] = "-Atropisomers"; inchi_Output output; @@ -525,4 +524,319 @@ TEST(test_atropisomers, test_dummy_7_no_atropisomer_1) FreeINCHI(poutput); } +TEST(test_atropisomers, test_dummy_8_no_atropisomer) +{ + const char *molblock = + "no atropisomer \n" + " Ketcher 2272613152D 1 1.00000 0.00000 0 \n" + " \n" + " 19 22 0 0 1 0 0 0 0 0999 V2000 \n" + " 1.7386 -5.4033 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 3.4728 -5.4028 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 2.6073 -4.9019 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 3.4728 -6.4059 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 1.7386 -6.4105 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 2.6095 -6.9066 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 4.3393 -4.9032 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 5.2084 -5.4047 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 4.3455 -6.9095 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 5.2106 -6.4028 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 6.0695 -4.9058 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 6.9354 -5.4029 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 6.0800 -6.9019 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 6.9398 -6.3960 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 4.3470 -3.9142 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 6.0676 -3.9065 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 5.2026 -3.4159 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 4.3487 -7.9117 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 6.0854 -7.9042 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 3 1 2 0 0 0 \n" + " 1 5 1 0 0 0 \n" + " 5 6 2 0 0 0 \n" + " 6 4 1 0 0 0 \n" + " 4 2 2 0 0 0 \n" + " 2 3 1 0 0 0 \n" + " 4 9 1 0 0 0 \n" + " 9 10 2 0 0 0 \n" + " 10 8 1 0 0 0 \n" + " 8 7 2 0 0 0 \n" + " 7 2 1 0 0 0 \n" + " 10 13 1 1 0 0 \n" + " 13 14 2 0 0 0 \n" + " 14 12 1 0 0 0 \n" + " 12 11 2 0 0 0 \n" + " 11 16 1 0 0 0 \n" + " 16 17 2 0 0 0 \n" + " 17 15 1 0 0 0 \n" + " 15 7 1 0 0 0 \n" + " 9 18 1 0 0 0 \n" + " 13 19 1 0 0 0 \n" + " 8 11 1 6 0 0 \n" + "M END \n"; + + char options[] = "-Atropisomers"; + inchi_Output output; + inchi_Output *poutput = &output; + const char expected_inchi[] = "InChI=1B"; + + EXPECT_EQ(MakeINCHIFromMolfileText(molblock, options, poutput), 1); + EXPECT_STREQ(poutput->szInChI, expected_inchi); + + FreeINCHI(poutput); +} + +TEST(test_atropisomers, test_dummy_9_no_atropisomer) +{ + const char *molblock = + "no atropisomer \n" + " Ketcher 2272613262D 1 1.00000 0.00000 0 \n" + " \n" + " 11 12 0 0 1 0 0 0 0 0999 V2000 \n" + " 10.0575 -5.5286 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 11.7917 -5.5281 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 10.9262 -5.0272 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 11.7917 -6.5312 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 10.0575 -6.5357 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 10.9284 -7.0319 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 13.3281 -6.0349 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 12.7485 -5.2267 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 12.7368 -6.8411 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 10.9323 -8.0341 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 13.0431 -7.7954 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 3 1 1 0 0 0 \n" + " 1 5 2 0 0 0 \n" + " 5 6 1 0 0 0 \n" + " 6 4 2 0 0 0 \n" + " 4 2 1 0 0 0 \n" + " 2 3 1 1 0 0 \n" + " 4 9 1 1 0 0 \n" + " 9 7 2 0 0 0 \n" + " 7 8 1 0 0 0 \n" + " 8 2 2 0 0 0 \n" + " 6 10 1 0 0 0 \n" + " 9 11 1 0 0 0 \n" + "M END \n"; + + char options[] = "-Atropisomers"; + inchi_Output output; + inchi_Output *poutput = &output; + const char expected_inchi[] = "InChI=1B"; + + EXPECT_EQ(MakeINCHIFromMolfileText(molblock, options, poutput), 1); + EXPECT_STREQ(poutput->szInChI, expected_inchi); + + FreeINCHI(poutput); +} + +TEST(test_atropisomers, test_dummy_10_no_atropisomer) +{ + const char *molblock = + "no atropisomer \n" + " Ketcher 2272613352D 1 1.00000 0.00000 0 \n" + " \n" + " 13 15 0 0 1 0 0 0 0 0999 V2000 \n" + " 6.1045 -3.7191 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 7.8417 -4.0800 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 7.0986 -3.3949 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 7.5866 -5.0469 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 5.8981 -4.7379 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 6.6718 -5.3556 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 5.9176 -6.9529 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 7.5935 -6.6481 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 6.6749 -6.3496 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 7.8562 -7.5835 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 6.1260 -7.9570 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 7.1229 -8.2742 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 8.2186 -5.8385 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 3 1 2 0 0 0 \n" + " 1 5 1 0 0 0 \n" + " 5 6 2 0 0 0 \n" + " 6 4 1 1 0 0 \n" + " 4 2 2 0 0 0 \n" + " 9 7 1 1 0 0 \n" + " 7 11 2 0 0 0 \n" + " 12 10 2 0 0 0 \n" + " 10 8 1 0 0 0 \n" + " 8 9 2 0 0 0 \n" + " 6 9 1 0 0 0 \n" + " 4 13 1 0 0 0 \n" + " 13 8 1 0 0 0 \n" + " 3 2 1 1 0 0 \n" + " 12 11 1 1 0 0 \n" + "M END \n"; + + char options[] = "-Atropisomers"; + inchi_Output output; + inchi_Output *poutput = &output; + const char expected_inchi[] = "InChI=1B"; + + EXPECT_EQ(MakeINCHIFromMolfileText(molblock, options, poutput), 1); + EXPECT_STREQ(poutput->szInChI, expected_inchi); + FreeINCHI(poutput); +} + +TEST(test_atropisomers, test_dummy_11_no_atropisomer_3_fragments) +{ + const char *molblock = + "no atropisomers 3 fragments \n" + " Ketcher 2272613322D 1 1.00000 0.00000 0 \n" + " \n" + " 43 50 0 0 1 0 0 0 0 0999 V2000 \n" + " 6.1045 -3.7191 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 7.8417 -4.0800 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 7.0986 -3.3949 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 7.5866 -5.0469 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 5.8981 -4.7379 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 6.6718 -5.3556 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 5.9176 -6.9529 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 7.5935 -6.6481 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 6.6749 -6.3496 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 7.8562 -7.5835 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 6.1260 -7.9570 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 7.1229 -8.2742 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 8.2186 -5.8385 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 9.5037 -3.9296 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 11.2375 -3.9224 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 10.3782 -3.4263 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 11.2430 -4.9363 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 9.5000 -4.9492 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 10.3729 -5.4522 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 9.5486 -6.9885 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 11.2820 -6.9498 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 10.3915 -6.4693 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 11.3184 -7.9397 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 9.5860 -7.9925 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 10.4799 -8.4673 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 12.1187 -5.4213 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 12.1416 -6.4195 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 14.4400 -3.7870 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 16.1721 -3.9293 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 15.3591 -3.3591 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 16.0862 -4.9426 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 14.3481 -4.8068 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 15.1682 -5.3798 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 14.1926 -6.8106 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 15.9249 -6.9467 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 15.0897 -6.3821 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 15.8590 -7.9312 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 14.1208 -7.8014 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 14.9645 -8.3690 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 16.9116 -5.5047 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 16.8379 -6.5024 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 13.4463 -5.2285 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 13.3619 -6.2344 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 3 1 2 0 0 0 \n" + " 1 5 1 0 0 0 \n" + " 5 6 2 0 0 0 \n" + " 6 4 1 1 0 0 \n" + " 4 2 2 0 0 0 \n" + " 9 7 1 1 0 0 \n" + " 7 11 2 0 0 0 \n" + " 12 10 2 0 0 0 \n" + " 10 8 1 0 0 0 \n" + " 8 9 2 0 0 0 \n" + " 6 9 1 0 0 0 \n" + " 4 13 1 0 0 0 \n" + " 13 8 1 0 0 0 \n" + " 16 14 2 0 0 0 \n" + " 14 18 1 0 0 0 \n" + " 18 19 2 0 0 0 \n" + " 19 17 1 1 0 0 \n" + " 17 15 2 0 0 0 \n" + " 22 20 1 1 0 0 \n" + " 20 24 2 0 0 0 \n" + " 25 23 2 0 0 0 \n" + " 23 21 1 0 0 0 \n" + " 21 22 2 0 0 0 \n" + " 19 22 1 0 0 0 \n" + " 17 26 1 0 0 0 \n" + " 26 27 2 0 0 0 \n" + " 27 21 1 0 0 0 \n" + " 30 28 2 0 0 0 \n" + " 28 32 1 0 0 0 \n" + " 32 33 2 0 0 0 \n" + " 33 31 1 1 0 0 \n" + " 31 29 2 0 0 0 \n" + " 36 34 1 1 0 0 \n" + " 34 38 2 0 0 0 \n" + " 39 37 2 0 0 0 \n" + " 37 35 1 0 0 0 \n" + " 35 36 2 0 0 0 \n" + " 33 36 1 0 0 0 \n" + " 31 40 1 0 0 0 \n" + " 35 41 1 0 0 0 \n" + " 41 40 2 0 0 0 \n" + " 32 42 1 0 0 0 \n" + " 42 43 2 0 0 0 \n" + " 43 34 1 0 0 0 \n" + " 3 2 1 1 0 0 \n" + " 12 11 1 1 0 0 \n" + " 16 15 1 1 0 0 \n" + " 25 24 1 1 0 0 \n" + " 30 29 1 1 0 0 \n" + " 39 38 1 1 0 0 \n" + "M END \n"; + + char options[] = "-Atropisomers"; + inchi_Output output; + inchi_Output *poutput = &output; + const char expected_inchi[] = "InChI=1B"; + + EXPECT_EQ(MakeINCHIFromMolfileText(molblock, options, poutput), 1); + EXPECT_STREQ(poutput->szInChI, expected_inchi); + + FreeINCHI(poutput); +} + +TEST(test_atropisomers, test_dummy_12_atropisomer) +{ + const char *molblock = + "atropisomer test mol \n" + " Ketcher 2272615132D 1 1.00000 0.00000 0 \n" + " \n" + " 15 17 0 0 1 0 0 0 0 0999 V2000 \n" + " 5.4357 -3.2991 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 7.1745 -3.2986 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 6.3067 -2.7965 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 7.1745 -4.3043 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 5.4357 -4.3088 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 6.3090 -4.8062 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 5.4357 -6.6150 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 7.1745 -6.6145 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 6.3067 -6.1125 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 7.1745 -7.6203 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 5.4357 -7.6248 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 6.3090 -8.1222 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 8.0449 -6.1125 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 8.0452 -4.8059 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 8.2722 -5.4088 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 3 1 2 0 0 0 \n" + " 1 5 1 0 0 0 \n" + " 5 6 2 0 0 0 \n" + " 6 4 1 1 0 0 \n" + " 4 2 2 0 0 0 \n" + " 9 7 1 1 0 0 \n" + " 7 11 2 0 0 0 \n" + " 12 10 2 0 0 0 \n" + " 10 8 1 0 0 0 \n" + " 8 9 2 0 0 0 \n" + " 6 9 1 0 0 0 \n" + " 8 13 1 0 0 0 \n" + " 4 14 1 0 0 0 \n" + " 14 15 1 0 0 0 \n" + " 13 15 1 0 0 0 \n" + " 3 2 1 1 0 0 \n" + " 12 11 1 1 0 0 \n" + "M END \n"; + + char options[] = "-Atropisomers"; + inchi_Output output; + inchi_Output *poutput = &output; + const char expected_inchi[] = "InChI=1B"; + + EXPECT_EQ(MakeINCHIFromMolfileText(molblock, options, poutput), 1); + EXPECT_STREQ(poutput->szInChI, expected_inchi); + + FreeINCHI(poutput); +} From 46e4a6a3816368155c38f964270ea2576e36813e Mon Sep 17 00:00:00 2001 From: Christoph Mueller Date: Mon, 2 Mar 2026 14:14:10 +0000 Subject: [PATCH 10/18] refactored ring detection and atropisomer detection code --- .../INCHI_API/libinchi/src/CMakeLists.txt | 2 + INCHI-1-SRC/INCHI_BASE/src/atropisomers.c | 132 +++++++++++++++ INCHI-1-SRC/INCHI_BASE/src/atropisomers.h | 9 + INCHI-1-SRC/INCHI_BASE/src/ichimake.c | 43 ++--- INCHI-1-SRC/INCHI_BASE/src/inpdef.h | 12 +- INCHI-1-SRC/INCHI_BASE/src/ring_detection.c | 51 ++++-- INCHI-1-SRC/INCHI_BASE/src/ring_detection.h | 20 ++- INCHI-1-SRC/INCHI_BASE/src/strutil.c | 154 +++++------------- .../INCHI_EXE/inchi-1/src/CMakeLists.txt | 2 + .../tests/test_unit/test_atropisomers.cpp | 119 ++++++++++++-- 10 files changed, 364 insertions(+), 180 deletions(-) create mode 100644 INCHI-1-SRC/INCHI_BASE/src/atropisomers.c create mode 100644 INCHI-1-SRC/INCHI_BASE/src/atropisomers.h diff --git a/INCHI-1-SRC/INCHI_API/libinchi/src/CMakeLists.txt b/INCHI-1-SRC/INCHI_API/libinchi/src/CMakeLists.txt index 3bb4733b..45bae4c8 100644 --- a/INCHI-1-SRC/INCHI_API/libinchi/src/CMakeLists.txt +++ b/INCHI-1-SRC/INCHI_API/libinchi/src/CMakeLists.txt @@ -54,6 +54,8 @@ target_sources(libinchi PRIVATE ${P_IXA}/ixa_read_mol.c ${P_IXA}/ixa_status.c ${P_IXA}/ixa_status.h + ${P_BASE}/atropisomers.h + ${P_BASE}/atropisomers.c ${P_BASE}/bcf_s.h ${P_BASE}/bcf_s.c ${P_BASE}/extr_ct.h diff --git a/INCHI-1-SRC/INCHI_BASE/src/atropisomers.c b/INCHI-1-SRC/INCHI_BASE/src/atropisomers.c new file mode 100644 index 00000000..5a7d0c3c --- /dev/null +++ b/INCHI-1-SRC/INCHI_BASE/src/atropisomers.c @@ -0,0 +1,132 @@ + + +#include "inpdef.h" +#include "ring_detection.h" + + +void find_atropisomeric_atoms_and_bonds(inp_ATOM* out_at, + int num_atoms, + RingSystems *ring_result, + ORIG_ATOM_DATA *orig_inp_data, + int *fused_atom_partner) { + + + printf("-------------------\n"); + + for (int i = 0; i < num_atoms; i++) { + + int atom_id1 = i; + const inp_ATOM atom_i = out_at[atom_id1]; + + int num_neighbors_i = atom_i.valence; + + const AT_NUMB *neighbors = atom_i.neighbor; + + if (num_neighbors_i == 3) { + for (int j = 0; j < num_neighbors_i; j++) { + + int atom_id2 = neighbors[j]; + + if (atom_id1 >= atom_id2) { + continue; + } + + const inp_ATOM atom_j = out_at[atom_id2]; + + + + int num_neighbors_j = atom_j.valence; + + if (num_neighbors_j == 3 && + atom_i.bond_stereo[j] == 0 && + atom_i.bond_type[j] == 1) { + + if (ring_result->atom_to_ring_mapping[atom_id1].ring_count > 0 || + ring_result->atom_to_ring_mapping[atom_id2].ring_count > 0) { + + int nof_wedge_bonds_i = 0; + int has_double_bond_i = 0; + for (int k = 0; k < num_neighbors_i; k++) { + if (atom_i.bond_stereo[k] == 1 || + atom_i.bond_stereo[k] == 4 || + atom_i.bond_stereo[k] == 6) { + nof_wedge_bonds_i++; + } + if (atom_i.bond_type[k] == 2) { + has_double_bond_i = 1; + } + } + int nof_wedge_bonds_j = 0; + int has_double_bond_j = 0; + for (int k = 0; k < num_neighbors_j; k++) { + if (atom_j.bond_stereo[k] == 1 || + atom_j.bond_stereo[k] == 4 || + atom_j.bond_stereo[k] == 6) { + nof_wedge_bonds_j++; + } + if (atom_j.bond_type[k] == 2) { + has_double_bond_j = 1; + } + } + + if (nof_wedge_bonds_i > 0 || + nof_wedge_bonds_j > 0) { + + if ((has_double_bond_i || has_double_bond_j)) { + if ((fused_atom_partner[atom_id1] != j && + fused_atom_partner[atom_id2] != i) || + (fused_atom_partner[atom_id1] == -1 || + fused_atom_partner[atom_id2] == -1)) { + + if (are_atoms_in_same_small_ring(out_at, + ring_result, + atom_id1, atom_id2, + 6) == 0) { + printf(">>> is atropisomer\n"); + printf("infos: atom %d with atom %d; bond type %d; bond stereo %d\n", + atom_id1, atom_id2, atom_i.bond_type[j], atom_i.bond_stereo[j]); + // printf("atom type %d %d\n", atom_i.el_number, atom_j.el_number); + // printf("has double bond %d %d\n", has_double_bond_i, has_double_bond_j); + // printf("fused pivot atoms %d %d\n", fused_atom_partner[atom_id1], fused_atom_partner[atom_id2]); + + //TODO set atoms with atropisomeric bonds in out_at + orig_inp_data->is_atropisomer = 1; + } + } + } + } + } + } + } + } + } + + for (int i = 0; i < ring_result->count; i++) { + const Ring *cur_ring = &ring_result->rings[i]; + if (cur_ring->size >= 8) { + int count_single_bonds = 0; + int count_double_bonds = 0; + for (int j = 0; j < cur_ring->size; j++) { + int atom_id1 = cur_ring->atom_ids[j]; + int atom_id2 = cur_ring->atom_ids[(j + 1) % cur_ring->size]; + const inp_ATOM atom1 = out_at[atom_id1]; + for (int k = 0; k < atom1.valence; k++) { + if (atom1.neighbor[k] == atom_id2) { + if (atom1.bond_type[k] == 1) { + count_single_bonds++; + } else if (atom1.bond_type[k] == 2) { + count_double_bonds++; + } + } + } + } + + if (cur_ring->is_fused_ring == 0) { + printf(">>> ring id %d size %d nof single bonds %d nof double bonds %d fused ring %d\n", + cur_ring->id, cur_ring->size, + count_single_bonds, count_double_bonds, + cur_ring->is_fused_ring); + } + } + } +} diff --git a/INCHI-1-SRC/INCHI_BASE/src/atropisomers.h b/INCHI-1-SRC/INCHI_BASE/src/atropisomers.h new file mode 100644 index 00000000..db4eabc7 --- /dev/null +++ b/INCHI-1-SRC/INCHI_BASE/src/atropisomers.h @@ -0,0 +1,9 @@ + +#include "inpdef.h" +#include "ring_detection.h" + +void find_atropisomeric_atoms_and_bonds(inp_ATOM* out_at, + int num_atoms, + RingSystems *ring_result, + ORIG_ATOM_DATA *orig_inp_data, + int *fused_atom_partner); diff --git a/INCHI-1-SRC/INCHI_BASE/src/ichimake.c b/INCHI-1-SRC/INCHI_BASE/src/ichimake.c index aae3114e..7a088797 100644 --- a/INCHI-1-SRC/INCHI_BASE/src/ichimake.c +++ b/INCHI-1-SRC/INCHI_BASE/src/ichimake.c @@ -54,6 +54,7 @@ #include "bcf_s.h" +#include "atropisomers.h" #include "ring_detection.h" /* @@ -3904,53 +3905,35 @@ int Create_INChI(CANON_GLOBALS* pCG, #if ( FIND_RING_SYSTEMS == 1 ) MarkRingSystemsInp(out_at, num_atoms, 0); + orig_inp_data->is_atropisomer = 0; if (ip->Atropisomers) { RingSystems *ring_result = find_rings(out_at, num_atoms); // print_ring_result(ring_result); - + int fused_atom_partner[num_atoms]; for (i = 0; i < num_atoms; i++) { - out_at[i].fused_partner_atom_id = -1; + // out_at[i].fused_partner_atom_id = -1; + fused_atom_partner[i] = -1; } for (i = 0; i < num_atoms; i++) { for (int j = i + 1; j < num_atoms; j++) { - // printf("%d %d\n", i, j); if(is_fused_ring_pivot(ring_result, out_at, i, j)) { - // printf(">>> Found pivot atom pair: %d, %d\n", i, j); - out_at[i].fused_partner_atom_id = j; - out_at[j].fused_partner_atom_id = i; + fused_atom_partner[i] = j; + fused_atom_partner[j] = i; } } } - if (ring_result != NULL) { - // orig_inp_data->ring_id_to_size = (int*)inchi_calloc(ring_result->count, sizeof(int)); - for (i = 0; i < ring_result->count; i++) { - orig_inp_data->ring_id_to_size[i] = ring_result->rings[i].size; - } - } - - free_ring_system(ring_result); - - for (i = 0; i < num_atoms; i++) { - if (out_at[i].ring_count > 0) { - orig_inp_data->at[i].ring_count = out_at[i].ring_count; - for (int j = 0; j < out_at[i].ring_count; j++) { - orig_inp_data->at[i].ring_ids[j] = out_at[i].ring_ids[j]; - } - } + find_atropisomeric_atoms_and_bonds(out_at, num_atoms, ring_result, orig_inp_data, fused_atom_partner); - for (int j = 0; j < out_at[i].valence; j++) { - if (out_at[i].bond_stereo[j] > 0) { - orig_inp_data->at[i].bond_stereo[j] = out_at[i].bond_stereo[j]; - // printf("%d %d\n", i, out_at[i].bond_stereo[j]); - } + //map values to orig_inp_data + if (orig_inp_data->is_atropisomer) { + for (i = 0; i < num_atoms; i++) { + //todo set atoms with atropisomeric bonds in orig_atom_data } - // if (out_at[i].fused_partner_atom_id > -1) { - orig_inp_data->at[i].fused_partner_atom_id = out_at[i].fused_partner_atom_id; - } + free_ring_system(ring_result); } #endif diff --git a/INCHI-1-SRC/INCHI_BASE/src/inpdef.h b/INCHI-1-SRC/INCHI_BASE/src/inpdef.h index e4d47bf4..ec3c5823 100644 --- a/INCHI-1-SRC/INCHI_BASE/src/inpdef.h +++ b/INCHI-1-SRC/INCHI_BASE/src/inpdef.h @@ -100,9 +100,6 @@ typedef S_SHORT ST_CAP_FLOW; #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 */ -#define RS_MAX_RINGS_PER_ATOM 10 -#define RS_MAX_NOF_RINGS 1000 - /** * @brief Structure describing an input atom * @@ -193,11 +190,6 @@ typedef struct tagInputAtom AT_NUMB nNumAtInRingSystem; AT_NUMB nBlockSystem; - int ring_ids[RS_MAX_RINGS_PER_ATOM]; - int ring_count; - - int fused_partner_atom_id; - #if (FIND_RINS_SYSTEMS_DISTANCES == 1) AT_NUMB nDistanceFromTerminal; /* terminal atom or ring system has 1, next has 2, etc. */ #endif @@ -467,9 +459,9 @@ typedef struct tagOrigAtom OAD_Polymer *polymer; OAD_V3000 *v3000; int valid_polymer; - int n_zy; /* number of non-polymeric pseudoatoms (Zy) */ + int n_zy; /* number of non-polymeric pseudoatoms (Zy) */ - int ring_id_to_size[RS_MAX_NOF_RINGS]; + int is_atropisomer; /* flag indicating whether the structure is an atropisomer; it is set to 1 if the structure has been identified as an atropisomer during input processing, and 0 otherwise */ } ORIG_ATOM_DATA; diff --git a/INCHI-1-SRC/INCHI_BASE/src/ring_detection.c b/INCHI-1-SRC/INCHI_BASE/src/ring_detection.c index 7d40f2d2..11d4b0b1 100644 --- a/INCHI-1-SRC/INCHI_BASE/src/ring_detection.c +++ b/INCHI-1-SRC/INCHI_BASE/src/ring_detection.c @@ -1,8 +1,10 @@ #include "mode.h" #include "inpdef.h" + #include "ring_detection.h" + int is_subset(Ring* child, Ring* potential_parent) { @@ -106,18 +108,18 @@ int is_atom_in_ring(const Ring *r, int atom_id) { } int are_atoms_in_same_small_ring(const inp_ATOM* atoms, - const int *ring_id_to_size, + const RingSystems *rs, int atom_id1, int atom_id2, int max_ring_size) { inp_ATOM atom1 = atoms[atom_id1]; inp_ATOM atom2 = atoms[atom_id2]; - for (int i = 0; i < atom1.ring_count; i++) { - int ring_id1 = atom1.ring_ids[i]; - if (ring_id_to_size[ring_id1] <= max_ring_size) { - for (int j = 0; j < atom2.ring_count; j++) { - int ring_id2 = atom2.ring_ids[j]; + for (int i = 0; i < rs->atom_to_ring_mapping[atom_id1].ring_count; i++) { + int ring_id1 = rs->atom_to_ring_mapping[atom_id1].ring_ids[i]; + if (rs->rings[ring_id1].size <= max_ring_size) { + for (int j = 0; j < rs->atom_to_ring_mapping[atom_id2].ring_count; j++) { + int ring_id2 = rs->atom_to_ring_mapping[atom_id2].ring_ids[j]; if (ring_id1 == ring_id2) { return 1; } @@ -162,6 +164,11 @@ void free_ring_system(RingSystems *rs) { inchi_free(rs->rings[i].child_ids); } inchi_free(rs->rings); + + for (int i = 0; i < rs->num_atoms; i++) { + inchi_free(rs->atom_to_ring_mapping[i].ring_ids); + } + inchi_free(rs->atom_to_ring_mapping); inchi_free(rs); } @@ -212,11 +219,33 @@ void *create_new_ring(RingSystems *rs, r->child_count = 0; r->child_ids = NULL; r->nof_atomic_rings = 0; + r->is_fused_ring = 0; r->atom_ids = (int*)inchi_calloc(path_len, sizeof(int)); for (int i = 0; i < path_len; i++) { r->atom_ids[i] = path[i]; - atoms[path[i]].ring_ids[atoms[path[i]].ring_count] = rs->count; - atoms[path[i]].ring_count++; + + rs->atom_to_ring_mapping[path[i]].atom_id = path[i]; + rs->atom_to_ring_mapping[path[i]].ring_ids = (int*)inchi_realloc(rs->atom_to_ring_mapping[path[i]].ring_ids, + (rs->atom_to_ring_mapping[path[i]].ring_count + 1) * sizeof(int)); + rs->atom_to_ring_mapping[path[i]].ring_ids[rs->atom_to_ring_mapping[path[i]].ring_count] = r->id; + rs->atom_to_ring_mapping[path[i]].ring_count++; + + inp_ATOM atom = atoms[path[i]]; + for (int j = i + 1; j < path_len; j++) { + // prev, i, next + int prev_atom_id = path[i - 1 < 0 ? path_len - 1 : i - 1]; + int cur_atom_id = path[i]; + int next_atom_id = path[i + 1 >= path_len ? 0 : i + 1]; + int other_atom_id = path[j]; + for (int k = 0; k < atom.valence; k++) { + if (atom.neighbor[k] == prev_atom_id || atom.neighbor[k] == next_atom_id) { + continue; + } else if (atom.neighbor[k] == other_atom_id) + { + r->is_fused_ring = 1; + } + } + } } rs->rings[rs->count] = *r; @@ -277,8 +306,6 @@ void dfs(RingSystems *rs, } } visited[curr] = 0; - - } int is_fused_ring_pivot(const RingSystems *rs, @@ -363,6 +390,8 @@ RingSystems *find_rings(inp_ATOM* atoms, RingSystems *rs = (RingSystems*)inchi_calloc(1, sizeof(RingSystems)); rs->rings = NULL; //(Ring*)inchi_calloc(num_atoms * 10, sizeof(Ring)); rs->count = 0; + rs->num_atoms = num_atoms; + rs->atom_to_ring_mapping = (Atom2RingMapping*)inchi_calloc(num_atoms, sizeof(Atom2RingMapping)); int visited[num_atoms]; int path[num_atoms]; @@ -373,7 +402,7 @@ RingSystems *find_rings(inp_ATOM* atoms, visited[i] = 0; path[i] = -1; - inp_ATOM *atom_i = &atoms[i]; + const inp_ATOM *atom_i = &atoms[i]; for (int j = 0; j < atom_i->valence; j++) { int neighbor = atom_i->neighbor[j]; adj[i][neighbor] = 1; diff --git a/INCHI-1-SRC/INCHI_BASE/src/ring_detection.h b/INCHI-1-SRC/INCHI_BASE/src/ring_detection.h index 4330a657..6e3db9c4 100644 --- a/INCHI-1-SRC/INCHI_BASE/src/ring_detection.h +++ b/INCHI-1-SRC/INCHI_BASE/src/ring_detection.h @@ -1,4 +1,9 @@ +#ifndef _RING_DETECTION_H_ +#define _RING_DETECTION_H_ + +#define RS_MAX_RINGS_PER_ATOM 30 + typedef struct Ring { int id; int *atom_ids; @@ -7,14 +12,22 @@ typedef struct Ring { int parent_id; // Added: ID of the larger ring containing this one int *child_ids; int child_count; + int is_fused_ring; } Ring; +typedef struct Atom2RingMapping { + int atom_id; + int *ring_ids; + int ring_count; +} Atom2RingMapping; + typedef struct { Ring* rings; int count; + Atom2RingMapping* atom_to_ring_mapping; + int num_atoms; } RingSystems; - RingSystems *find_rings(inp_ATOM* atoms, int num_atoms); int is_fused_ring_pivot(const RingSystems *rs, @@ -26,6 +39,9 @@ void print_ring_result(const RingSystems *rs); void free_ring_system(RingSystems *rs); int are_atoms_in_same_small_ring(const inp_ATOM* atoms, - const int *ring_id_to_size, + const RingSystems *rs, int atom_id1, int atom_id2, int max_ring_size); + + +#endif diff --git a/INCHI-1-SRC/INCHI_BASE/src/strutil.c b/INCHI-1-SRC/INCHI_BASE/src/strutil.c index c4d9d056..e11f79c9 100644 --- a/INCHI-1-SRC/INCHI_BASE/src/strutil.c +++ b/INCHI-1-SRC/INCHI_BASE/src/strutil.c @@ -55,8 +55,6 @@ #include "bcf_s.h" -#include "ring_detection.h" - /* Added fix to remove_ion_pairs() -- 2010-03-17 DT */ #define FIX_P_IV_Plus_O_Minus @@ -7104,21 +7102,22 @@ int invert_parities(const INChI *inchi, return 0; } + /** - * @brief Set the enhanced stereochemistry information for t- and m-layers + * @brief Set t- and m-layers object for atropisomer stereochemistry * * @param orig_inp_data Pointer to original input atom data * @param inchi Pointer to INChI structure * @param aux Pointer to INChI auxiliary data - * @return Retruns 1 if not V3000, otherwise 0 + * @return int */ -int set_EnhancedStereo_t_m_layers( const ORIG_ATOM_DATA *orig_inp_data, - const INChI *inchi, - const INChI_Aux *aux) +int set_Atropisomer_t_m_layers( const ORIG_ATOM_DATA *orig_inp_data, + const INChI *inchi, + const INChI_Aux *aux) { int ret = 0; - if (!orig_inp_data->v3000) + if (orig_inp_data == NULL) { return 1; } @@ -7128,46 +7127,42 @@ int set_EnhancedStereo_t_m_layers( const ORIG_ATOM_DATA *orig_inp_data, return 1; } - if (inchi->Stereo == NULL || - inchi->Stereo->t_parity == NULL || - inchi->Stereo->nNumber == NULL || - inchi->Stereo->nNumberOfStereoCenters <= 0) { - return 1; - } - if (aux->nOrigAtNosInCanonOrd == NULL || aux->nNumberOfAtoms <= 0) { return 1; } - int ret_abs = invert_parities(inchi, aux, orig_inp_data->v3000->lists_steabs, orig_inp_data->v3000->n_steabs, 1); - int ret_rac = invert_parities(inchi, aux, orig_inp_data->v3000->lists_sterac, orig_inp_data->v3000->n_sterac, 0); - int ret_rel = invert_parities(inchi, aux, orig_inp_data->v3000->lists_sterel, orig_inp_data->v3000->n_sterel, 0); + //TODO + // - t layer parities for atropisomers + // -> t-parity[atom] = 1 (-) + // - m layer for atropisomers + // -> enantiomeric atropisomers: m1 (inchi->Stereo->nCompInv2Abs = -1; //m1) + // -> diastereomeric atropisomers: m0 (inchi->Stereo->nCompInv2Abs = 1; //m0) + // -> check number of stereocenters: if #stereocenter >= 2 - if ((orig_inp_data->v3000->n_steabs == 0) && - (orig_inp_data->v3000->n_sterel > 0 || - orig_inp_data->v3000->n_sterac)) { - inchi->Stereo->nCompInv2Abs = 1; //m0 + if (orig_inp_data->is_atropisomer) { + printf(">>>>> TODO set t- and m-layers for atropisomers\n"); } + return ret; } /** - * @brief Set t- and m-layers object for atropisomer stereochemistry + * @brief Set the enhanced stereochemistry information for t- and m-layers * * @param orig_inp_data Pointer to original input atom data * @param inchi Pointer to INChI structure * @param aux Pointer to INChI auxiliary data - * @return int + * @return Retruns 1 if not V3000, otherwise 0 */ -int set_Atropisomer_t_m_layers( const ORIG_ATOM_DATA *orig_inp_data, - const INChI *inchi, - const INChI_Aux *aux) +int set_EnhancedStereo_t_m_layers( const ORIG_ATOM_DATA *orig_inp_data, + const INChI *inchi, + const INChI_Aux *aux) { int ret = 0; - if (orig_inp_data == NULL) + if (!orig_inp_data->v3000) { return 1; } @@ -7177,103 +7172,28 @@ int set_Atropisomer_t_m_layers( const ORIG_ATOM_DATA *orig_inp_data, return 1; } + if (inchi->Stereo == NULL || + inchi->Stereo->t_parity == NULL || + inchi->Stereo->nNumber == NULL || + inchi->Stereo->nNumberOfStereoCenters <= 0) { + return 1; + } + if (aux->nOrigAtNosInCanonOrd == NULL || aux->nNumberOfAtoms <= 0) { return 1; } - printf("-------------------\n"); - - for (int i = 0; i < orig_inp_data->num_inp_atoms; i++) { - - const inp_ATOM atom_i = orig_inp_data->at[i]; - - // if (atom_i.is_fused_pivot_atom == 0) { - // continue; - // } - - int num_neighbors_i = atom_i.valence; - const AT_NUMB *neighbors = atom_i.neighbor; - // printf("Atom %d with %d neighbors; ring system id %d; num atoms in ring %d\n", i + 1, num_neighbors, orig_inp_data->at[i].nRingSystem, orig_inp_data->at[i].nNumAtInRingSystem); - if (num_neighbors_i == 3) { - for (int j = 0; j < num_neighbors_i; j++) { - - if (i >= neighbors[j]) { - continue; - } - - const inp_ATOM atom_j = orig_inp_data->at[neighbors[j]]; - - // if (atom_j.is_fused_pivot_atom == 0) { - // continue; - // } - - int num_neighbors_j = atom_j.valence; - - if (num_neighbors_j == 3 && - atom_i.bond_stereo[j] == 0 && - atom_i.bond_type[j] == 1) { - - if (atom_i.ring_count > 0 || - atom_j.ring_count > 0) { - - int nof_wedge_bonds_i = 0; - int has_double_bond_i = 0; - for (int k = 0; k < num_neighbors_i; k++) { - if (atom_i.bond_stereo[k] == 1 || - atom_i.bond_stereo[k] == 4 || - atom_i.bond_stereo[k] == 6) { - nof_wedge_bonds_i++; - } - if (atom_i.bond_type[k] == 2) { - has_double_bond_i = 1; - } - } - int nof_wedge_bonds_j = 0; - int has_double_bond_j = 0; - for (int k = 0; k < num_neighbors_j; k++) { - if (atom_j.bond_stereo[k] == 1 || - atom_j.bond_stereo[k] == 4 || - atom_j.bond_stereo[k] == 6) { - nof_wedge_bonds_j++; - } - if (atom_j.bond_type[k] == 2) { - has_double_bond_j = 1; - } - } - - if (nof_wedge_bonds_i > 0 || - nof_wedge_bonds_j > 0) { - - if ((has_double_bond_i || has_double_bond_j)) { - if ((atom_i.fused_partner_atom_id != j && - atom_j.fused_partner_atom_id != i) || - (atom_i.fused_partner_atom_id == -1 || - atom_j.fused_partner_atom_id == -1)) { - - if (are_atoms_in_same_small_ring(orig_inp_data->at, - orig_inp_data->ring_id_to_size, - i, neighbors[j], - 6) == 0) { - printf(">>> is atropisomer\n"); - printf("infos: atom %d with atom %d; bond type %d; bond stereo %d\n", - i, neighbors[j], atom_i.bond_type[j], atom_i.bond_stereo[j]); - printf("atom type %d %d\n", atom_i.el_number, atom_j.el_number); - printf("has double bond %d %d\n", has_double_bond_i, has_double_bond_j); - printf("fused pivot atoms %d %d\n", atom_i.fused_partner_atom_id, atom_j.fused_partner_atom_id); - } - } - } - } - } + int ret_abs = invert_parities(inchi, aux, orig_inp_data->v3000->lists_steabs, orig_inp_data->v3000->n_steabs, 1); + int ret_rac = invert_parities(inchi, aux, orig_inp_data->v3000->lists_sterac, orig_inp_data->v3000->n_sterac, 0); + int ret_rel = invert_parities(inchi, aux, orig_inp_data->v3000->lists_sterel, orig_inp_data->v3000->n_sterel, 0); - } - } - } + if ((orig_inp_data->v3000->n_steabs == 0) && + (orig_inp_data->v3000->n_sterel > 0 || + orig_inp_data->v3000->n_sterac)) { + inchi->Stereo->nCompInv2Abs = 1; //m0 } - - return ret; } diff --git a/INCHI-1-SRC/INCHI_EXE/inchi-1/src/CMakeLists.txt b/INCHI-1-SRC/INCHI_EXE/inchi-1/src/CMakeLists.txt index fbc1d5d7..187f0cb8 100644 --- a/INCHI-1-SRC/INCHI_EXE/inchi-1/src/CMakeLists.txt +++ b/INCHI-1-SRC/INCHI_EXE/inchi-1/src/CMakeLists.txt @@ -26,6 +26,8 @@ add_executable(inchi-1) target_sources(inchi-1 PRIVATE main.c + ${P_BASE}/atropisomers.h + ${P_BASE}/atropisomers.c ${P_BASE}/ichimain.c ${P_BASE}/dispstru.c ${P_BASE}/dispstru.h diff --git a/INCHI-1-TEST/tests/test_unit/test_atropisomers.cpp b/INCHI-1-TEST/tests/test_unit/test_atropisomers.cpp index d238aba4..d449352c 100644 --- a/INCHI-1-TEST/tests/test_unit/test_atropisomers.cpp +++ b/INCHI-1-TEST/tests/test_unit/test_atropisomers.cpp @@ -52,7 +52,7 @@ TEST(test_atropisomers, test_dummy_1) char options[] = "-Atropisomers"; inchi_Output output; inchi_Output *poutput = &output; - const char expected_inchi[] = "InChI=1B/C12H6Br2Cl2/c13-7-3-1-5-9(15)11(7)12-8(14)4-2-6-10(12)16/h1-6H"; + const char expected_inchi[] = "InChI=1B"; EXPECT_EQ(MakeINCHIFromMolfileText(molblock, options, poutput), 1); EXPECT_STREQ(poutput->szInChI, expected_inchi); @@ -126,7 +126,7 @@ TEST(test_atropisomers, test_dummy_2) char options[] = "-Atropisomers"; inchi_Output output; inchi_Output *poutput = &output; - const char expected_inchi[] = "InChI=1B/C20H22O3/c1-21-17-5-3-13-7-15-11-23-12-16(15)8-14-4-6-18(22-2)10-20(14)19(13)9-17/h3-6,9-10,15-16H,7-8,11-12H2,1-2H3"; + const char expected_inchi[] = "InChI=1B"; EXPECT_EQ(MakeINCHIFromMolfileText(molblock, options, poutput), 1); EXPECT_STREQ(poutput->szInChI, expected_inchi); @@ -193,7 +193,7 @@ TEST(test_atropisomers, test_dummy_3) char options[] = "-Atropisomers"; inchi_Output output; inchi_Output *poutput = &output; - const char expected_inchi[] = "InChI=1B/C20H16O2/c21-17-11-9-13-5-1-3-7-15(13)19(17)20-16-8-4-2-6-14(16)10-12-18(20)22/h1-11,18,21-22H,12H2"; + const char expected_inchi[] = "InChI=1B"; EXPECT_EQ(MakeINCHIFromMolfileText(molblock, options, poutput), 1); EXPECT_STREQ(poutput->szInChI, expected_inchi); @@ -274,7 +274,7 @@ TEST(test_atropisomers, test_dummy_4_atypical_no_2_rings) char options[] = "-Atropisomers"; inchi_Output output; inchi_Output *poutput = &output; - const char expected_inchi[] = "InChI=1B/C20H28N2O2/c1-5-17(23)22(14-10-7-6-8-11-14)18-15(19(21)24)12-9-13-16(18)20(2,3)4/h5,9,12-14H,1,6-8,10-11H2,2-4H3,(H2,21,24)"; + const char expected_inchi[] = "InChI=1B"; EXPECT_EQ(MakeINCHIFromMolfileText(molblock, options, poutput), 1); EXPECT_STREQ(poutput->szInChI, expected_inchi); @@ -282,7 +282,7 @@ TEST(test_atropisomers, test_dummy_4_atypical_no_2_rings) FreeINCHI(poutput); } -TEST(test_atropisomers, test_dummy_5_no_wedge_bonds) +TEST(test_atropisomers, test_dummy_5_no_atropisomer_no_wedge_bonds) { const char *molblock = "atropisomer test mol \n" @@ -516,7 +516,7 @@ TEST(test_atropisomers, test_dummy_7_no_atropisomer_1) char options[] = "-Atropisomers"; inchi_Output output; inchi_Output *poutput = &output; - const char expected_inchi[] = "InChI=1B"; + const char expected_inchi[] = "InChI=1B/C12H10Br2/c1-7-3-4-8(2)12-10(14)6-5-9(13)11(7)12/h3-6H,1-2H3"; EXPECT_EQ(MakeINCHIFromMolfileText(molblock, options, poutput), 1); EXPECT_STREQ(poutput->szInChI, expected_inchi); @@ -577,7 +577,7 @@ TEST(test_atropisomers, test_dummy_8_no_atropisomer) char options[] = "-Atropisomers"; inchi_Output output; inchi_Output *poutput = &output; - const char expected_inchi[] = "InChI=1B"; + const char expected_inchi[] = "InChI=1B/C18H14O/c1-11-7-8-13-9-10-19-18-15-6-4-3-5-14(15)12(2)16(11)17(13)18/h3-10H,1-2H3"; EXPECT_EQ(MakeINCHIFromMolfileText(molblock, options, poutput), 1); EXPECT_STREQ(poutput->szInChI, expected_inchi); @@ -620,7 +620,7 @@ TEST(test_atropisomers, test_dummy_9_no_atropisomer) char options[] = "-Atropisomers"; inchi_Output output; inchi_Output *poutput = &output; - const char expected_inchi[] = "InChI=1B"; + const char expected_inchi[] = "InChI=1B/C9H9NO/c1-6-3-4-11-9-8(6)7(2)5-10-9/h3-5H,1-2H3"; EXPECT_EQ(MakeINCHIFromMolfileText(molblock, options, poutput), 1); EXPECT_STREQ(poutput->szInChI, expected_inchi); @@ -668,7 +668,7 @@ TEST(test_atropisomers, test_dummy_10_no_atropisomer) char options[] = "-Atropisomers"; inchi_Output output; inchi_Output *poutput = &output; - const char expected_inchi[] = "InChI=1B"; + const char expected_inchi[] = "InChI=1B/C13H10/c1-3-7-12-10(5-1)9-11-6-2-4-8-13(11)12/h1-8H,9H2"; EXPECT_EQ(MakeINCHIFromMolfileText(molblock, options, poutput), 1); EXPECT_STREQ(poutput->szInChI, expected_inchi); @@ -781,7 +781,7 @@ TEST(test_atropisomers, test_dummy_11_no_atropisomer_3_fragments) char options[] = "-Atropisomers"; inchi_Output output; inchi_Output *poutput = &output; - const char expected_inchi[] = "InChI=1B"; + const char expected_inchi[] = "InChI=1B/C16H10.C14H10.C13H10/c1-3-11-7-9-13-5-2-6-14-10-8-12(4-1)15(11)16(13)14;1-3-7-13-11(5-1)9-10-12-6-2-4-8-14(12)13;1-3-7-12-10(5-1)9-11-6-2-4-8-13(11)12/h1-10H;1-10H;1-8H,9H2"; EXPECT_EQ(MakeINCHIFromMolfileText(molblock, options, poutput), 1); EXPECT_STREQ(poutput->szInChI, expected_inchi); @@ -840,3 +840,102 @@ TEST(test_atropisomers, test_dummy_12_atropisomer) FreeINCHI(poutput); } + +TEST(test_atropisomers, test_dummy_13_atropisomer_Caryophyllene) +{ + const char *molblock = + "5281515 Caryophyllene \n" + " -OEChem-03022602172D \n" + " \n" + " 39 40 0 1 0 0 0 0 0999 V2000 \n" + " 2.9665 1.2303 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 2.7095 0.2553 0.0000 C 0 0 1 0 0 0 0 0 0 0 0 0 \n" + " 3.6754 -0.0036 0.0000 C 0 0 2 0 0 0 0 0 0 0 0 0 \n" + " 3.9404 0.9693 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 2.4507 -0.7107 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 3.2233 2.1967 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 2.0000 1.4871 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 4.5415 0.4964 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 2.9507 -1.5767 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 5.4075 -0.0036 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 3.8167 -1.0767 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 5.5488 -1.0767 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 4.5415 1.4964 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 4.6827 -1.5767 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 3.8167 -0.0767 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 1.8880 0.4736 0.0000 H 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 3.7864 -0.8463 0.0000 H 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 4.5388 0.8072 0.0000 H 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 4.1017 1.5679 0.0000 H 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 1.9137 -0.4007 0.0000 H 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 2.0123 -1.1491 0.0000 H 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 3.8225 2.0375 0.0000 H 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 3.3825 2.7959 0.0000 H 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 2.6241 2.3559 0.0000 H 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 2.1592 2.0863 0.0000 H 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 1.4008 1.6463 0.0000 H 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 1.8408 0.8879 0.0000 H 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 2.4137 -1.8867 0.0000 H 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 3.2607 -2.1136 0.0000 H 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 6.0251 -0.0576 0.0000 H 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 5.5939 0.5877 0.0000 H 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 5.7860 -1.6495 0.0000 H 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 6.1476 -0.9162 0.0000 H 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 5.0784 1.8064 0.0000 H 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 4.0045 1.8064 0.0000 H 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 4.6827 -2.1967 0.0000 H 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 4.4367 -0.0767 0.0000 H 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 3.8167 0.5433 0.0000 H 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 3.1967 -0.0767 0.0000 H 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 1 2 1 0 0 0 0 \n" + " 1 4 1 0 0 0 0 \n" + " 1 6 1 0 0 0 0 \n" + " 1 7 1 0 0 0 0 \n" + " 2 3 1 0 0 0 0 \n" + " 2 5 1 0 0 0 0 \n" + " 2 16 1 6 0 0 0 \n" + " 3 4 1 0 0 0 0 \n" + " 3 8 1 0 0 0 0 \n" + " 3 17 1 1 0 0 0 \n" + " 4 18 1 0 0 0 0 \n" + " 4 19 1 0 0 0 0 \n" + " 5 9 1 0 0 0 0 \n" + " 5 20 1 0 0 0 0 \n" + " 5 21 1 0 0 0 0 \n" + " 6 22 1 0 0 0 0 \n" + " 6 23 1 0 0 0 0 \n" + " 6 24 1 0 0 0 0 \n" + " 7 25 1 0 0 0 0 \n" + " 7 26 1 0 0 0 0 \n" + " 7 27 1 0 0 0 0 \n" + " 8 10 1 0 0 0 0 \n" + " 8 13 2 0 0 0 0 \n" + " 9 11 1 0 0 0 0 \n" + " 9 28 1 0 0 0 0 \n" + " 9 29 1 0 0 0 0 \n" + " 10 12 1 0 0 0 0 \n" + " 10 30 1 0 0 0 0 \n" + " 10 31 1 0 0 0 0 \n" + " 11 14 2 0 0 0 0 \n" + " 11 15 1 0 0 0 0 \n" + " 12 14 1 0 0 0 0 \n" + " 12 32 1 0 0 0 0 \n" + " 12 33 1 0 0 0 0 \n" + " 13 34 1 0 0 0 0 \n" + " 13 35 1 0 0 0 0 \n" + " 14 36 1 0 0 0 0 \n" + " 15 37 1 0 0 0 0 \n" + " 15 38 1 0 0 0 0 \n" + " 15 39 1 0 0 0 0 \n" + "M END \n"; + + char options[] = "-Atropisomers"; + inchi_Output output; + inchi_Output *poutput = &output; + const char expected_inchi[] = "InChI=1B"; + + EXPECT_EQ(MakeINCHIFromMolfileText(molblock, options, poutput), 1); + EXPECT_STREQ(poutput->szInChI, expected_inchi); + + FreeINCHI(poutput); +} From d1e8cab8377c5f145534d294c4744c54bebd062d Mon Sep 17 00:00:00 2001 From: Christoph Mueller Date: Tue, 3 Mar 2026 14:23:51 +0000 Subject: [PATCH 11/18] clean up atropisomer code --- INCHI-1-SRC/INCHI_BASE/src/atropisomers.c | 1 + INCHI-1-SRC/INCHI_BASE/src/ring_detection.c | 108 +++++++++++++++++--- INCHI-1-SRC/INCHI_BASE/src/ring_detection.h | 1 + 3 files changed, 97 insertions(+), 13 deletions(-) diff --git a/INCHI-1-SRC/INCHI_BASE/src/atropisomers.c b/INCHI-1-SRC/INCHI_BASE/src/atropisomers.c index 5a7d0c3c..5592afda 100644 --- a/INCHI-1-SRC/INCHI_BASE/src/atropisomers.c +++ b/INCHI-1-SRC/INCHI_BASE/src/atropisomers.c @@ -79,6 +79,7 @@ void find_atropisomeric_atoms_and_bonds(inp_ATOM* out_at, fused_atom_partner[atom_id2] == -1)) { if (are_atoms_in_same_small_ring(out_at, + num_atoms, ring_result, atom_id1, atom_id2, 6) == 0) { diff --git a/INCHI-1-SRC/INCHI_BASE/src/ring_detection.c b/INCHI-1-SRC/INCHI_BASE/src/ring_detection.c index 11d4b0b1..9b7732ef 100644 --- a/INCHI-1-SRC/INCHI_BASE/src/ring_detection.c +++ b/INCHI-1-SRC/INCHI_BASE/src/ring_detection.c @@ -8,6 +8,15 @@ int is_subset(Ring* child, Ring* potential_parent) { + if (child == NULL || potential_parent == NULL) { + return 0; + } + + if (child->atom_ids == NULL || potential_parent->atom_ids == NULL) { + return 0; + } + + if (child->size >= potential_parent->size) { return 0; } @@ -28,6 +37,15 @@ int is_subset(Ring* child, } void determine_ring_hierarchy(RingSystems* rs) { + + if (rs == NULL) { + return; + } + + if (rs->rings == NULL) { + return; + } + for (int i = 0; i < rs->count; i++) { rs->rings[i].parent_id = -1; @@ -39,14 +57,11 @@ void determine_ring_hierarchy(RingSystems* rs) { } if (is_subset(&rs->rings[i], &rs->rings[j])) { - // if (rs->rings[j].size < smallest_parent_size) { rs->rings[i].parent_id = rs->rings[j].id; - // smallest_parent_size = rs->rings[j].size; rs->rings[j].child_ids = (int*)inchi_realloc(rs->rings[j].child_ids, (rs->rings[j].child_count + 1) * sizeof(int)); rs->rings[j].child_ids[rs->rings[j].child_count] = rs->rings[i].id; rs->rings[j].child_count++; - // } } } } @@ -54,6 +69,15 @@ void determine_ring_hierarchy(RingSystems* rs) { int get_ring_atom_overlap(const Ring *r1, const Ring *r2) { int overlap = 0; + + if (r1 == NULL || r2 == NULL) { + return overlap; + } + + if (r1->atom_ids == NULL || r2->atom_ids == NULL) { + return overlap; + } + for (int i = 0; i < r1->size; i++) { for (int j = 0; j < r2->size; j++) { if (r1->atom_ids[i] == r2->atom_ids[j]) { @@ -67,6 +91,15 @@ int get_ring_atom_overlap(const Ring *r1, const Ring *r2) { int get_number_of_overlapping_rings(const Ring *r1, const Ring *r2) { int count = 0; + + if (r1 == NULL || r2 == NULL) { + return count; + } + + if (r1->child_ids == NULL || r2->child_ids == NULL) { + return count; + } + for (int i = 0; i < r1->child_count; i++) { for (int j = 0; j < r2->child_count; j++) { if (r1->child_ids[i] == r2->child_ids[j]) { @@ -80,8 +113,16 @@ int get_number_of_overlapping_rings(const Ring *r1, const Ring *r2) { int get_number_of_atomic_rings_from_atom(const RingSystems *rs, int atom_id) { + if (rs == NULL) { + return 0; + } + + if (rs->rings == NULL) { + return 0; + } + if (atom_id < 0) { - return 0; // Invalid input + return 0; } int count = 0; @@ -99,6 +140,15 @@ int get_number_of_atomic_rings_from_atom(const RingSystems *rs, } int is_atom_in_ring(const Ring *r, int atom_id) { + + if (r == NULL) { + return 0; + } + + if (r->atom_ids == NULL) { + return 0; + } + for (int i = 0; i < r->size; i++) { if (r->atom_ids[i] == atom_id) { return 1; @@ -108,12 +158,29 @@ int is_atom_in_ring(const Ring *r, int atom_id) { } int are_atoms_in_same_small_ring(const inp_ATOM* atoms, + int num_atoms, const RingSystems *rs, int atom_id1, int atom_id2, int max_ring_size) { - inp_ATOM atom1 = atoms[atom_id1]; - inp_ATOM atom2 = atoms[atom_id2]; + if (atoms == NULL) { + return 0; + } + + if (rs == NULL) { + return 0; + } + + if (rs->atom_to_ring_mapping == NULL) { + return 0; + } + + if (atom_id1 >= num_atoms || atom_id2 >= num_atoms) { + return 0; + } + + const inp_ATOM atom1 = atoms[atom_id1]; + const inp_ATOM atom2 = atoms[atom_id2]; for (int i = 0; i < rs->atom_to_ring_mapping[atom_id1].ring_count; i++) { int ring_id1 = rs->atom_to_ring_mapping[atom_id1].ring_ids[i]; @@ -130,6 +197,11 @@ int are_atoms_in_same_small_ring(const inp_ATOM* atoms, } void print_ring(const Ring *r) { + + if (r == NULL) { + return; + } + printf("Ring ID: %d, Size: %d, nof fused ring %d, parent %d, Atoms: ", r->id, r->size, r->nof_atomic_rings, r->parent_id); for (int i = 0; i < r->size; i++) { @@ -145,6 +217,10 @@ void print_ring(const Ring *r) { void print_ring_result(const RingSystems *rs) { + if (rs == NULL) { + return; + } + printf("Number of rings: %d\n", rs->count); for (int i = 0; i < rs->count; i++) { @@ -184,6 +260,14 @@ int sub_ring_counter(RingSystems* rs, const Ring *r, int *ring_counter) { void determine_fused_rings(RingSystems* rs) { + if (rs == NULL) { + return; + } + + if (rs->rings == NULL) { + return 0; + } + for (int i = 0; i < rs->count; i++) { Ring *cur_ring = &rs->rings[i]; @@ -209,8 +293,9 @@ void *create_new_ring(RingSystems *rs, int *path, int path_len) { - // Ring *r = &rs->rings[rs->count]; //(Ring*)inchi_calloc(1, sizeof(Ring)); + rs->rings = (Ring*)inchi_realloc(rs->rings, (rs->count + 1) * sizeof(Ring)); + Ring *r = &rs->rings[rs->count]; r->id = rs->count; @@ -384,18 +469,18 @@ RingSystems *find_rings(inp_ATOM* atoms, int num_atoms) { if (atoms == NULL || num_atoms <= 0) { - return NULL; // Invalid input + return NULL; } RingSystems *rs = (RingSystems*)inchi_calloc(1, sizeof(RingSystems)); - rs->rings = NULL; //(Ring*)inchi_calloc(num_atoms * 10, sizeof(Ring)); + rs->rings = NULL; rs->count = 0; rs->num_atoms = num_atoms; rs->atom_to_ring_mapping = (Atom2RingMapping*)inchi_calloc(num_atoms, sizeof(Atom2RingMapping)); int visited[num_atoms]; int path[num_atoms]; - int **adj = (int**)inchi_calloc(num_atoms, sizeof(int*)); //[num_atoms][num_atoms]; // Adjacency matrix + int **adj = (int**)inchi_calloc(num_atoms, sizeof(int*)); for (int i = 0; i < num_atoms; ++i) { adj[i] = (int*)inchi_calloc(num_atoms, sizeof(int)); @@ -406,7 +491,6 @@ RingSystems *find_rings(inp_ATOM* atoms, for (int j = 0; j < atom_i->valence; j++) { int neighbor = atom_i->neighbor[j]; adj[i][neighbor] = 1; - // adj[neighbor][i] = 1; // Undirected graph } } @@ -414,9 +498,7 @@ RingSystems *find_rings(inp_ATOM* atoms, dfs(rs, atoms, adj, num_atoms, i, i, visited, path, 0); } - determine_ring_hierarchy(rs); - determine_fused_rings(rs); for (int i = 0; i < num_atoms; ++i) { diff --git a/INCHI-1-SRC/INCHI_BASE/src/ring_detection.h b/INCHI-1-SRC/INCHI_BASE/src/ring_detection.h index 6e3db9c4..f965baf2 100644 --- a/INCHI-1-SRC/INCHI_BASE/src/ring_detection.h +++ b/INCHI-1-SRC/INCHI_BASE/src/ring_detection.h @@ -39,6 +39,7 @@ void print_ring_result(const RingSystems *rs); void free_ring_system(RingSystems *rs); int are_atoms_in_same_small_ring(const inp_ATOM* atoms, + int num_atoms, const RingSystems *rs, int atom_id1, int atom_id2, int max_ring_size); From dedaefb13312e7000b57e95326a01218d8d52f99 Mon Sep 17 00:00:00 2001 From: Christoph Mueller Date: Wed, 4 Mar 2026 14:02:38 +0000 Subject: [PATCH 12/18] bugfix return value --- INCHI-1-SRC/INCHI_BASE/src/ring_detection.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/INCHI-1-SRC/INCHI_BASE/src/ring_detection.c b/INCHI-1-SRC/INCHI_BASE/src/ring_detection.c index 9b7732ef..eccc2af5 100644 --- a/INCHI-1-SRC/INCHI_BASE/src/ring_detection.c +++ b/INCHI-1-SRC/INCHI_BASE/src/ring_detection.c @@ -265,7 +265,7 @@ void determine_fused_rings(RingSystems* rs) { } if (rs->rings == NULL) { - return 0; + return; } for (int i = 0; i < rs->count; i++) { From f4fec0d65005f319818773d1a040a90cc68ab19f Mon Sep 17 00:00:00 2001 From: Christoph Mueller Date: Thu, 5 Mar 2026 15:14:30 +0000 Subject: [PATCH 13/18] added rule weighting and prototype for atropisomer encoding --- INCHI-1-SRC/INCHI_BASE/src/atropisomers.c | 156 +- INCHI-1-SRC/INCHI_BASE/src/ichimake.c | 2 +- INCHI-1-SRC/INCHI_BASE/src/ichiprt1.c | 5 +- INCHI-1-SRC/INCHI_BASE/src/inpdef.h | 2 + INCHI-1-SRC/INCHI_BASE/src/strutil.c | 31 +- .../atropisomers_test_file_1_orig.sdf | 3355 +++++++++++++++++ .../fixtures/atropisomers_test_file_1_v2.sdf | 3303 ++++++++++++++++ .../tests/test_unit/test_atropisomers.cpp | 220 +- 8 files changed, 7050 insertions(+), 24 deletions(-) create mode 100644 INCHI-1-TEST/tests/test_unit/fixtures/atropisomers_test_file_1_orig.sdf create mode 100644 INCHI-1-TEST/tests/test_unit/fixtures/atropisomers_test_file_1_v2.sdf diff --git a/INCHI-1-SRC/INCHI_BASE/src/atropisomers.c b/INCHI-1-SRC/INCHI_BASE/src/atropisomers.c index 5592afda..93a19ae5 100644 --- a/INCHI-1-SRC/INCHI_BASE/src/atropisomers.c +++ b/INCHI-1-SRC/INCHI_BASE/src/atropisomers.c @@ -4,15 +4,13 @@ #include "ring_detection.h" -void find_atropisomeric_atoms_and_bonds(inp_ATOM* out_at, +void find_atropisomeric_atoms_and_bonds_old(inp_ATOM* out_at, int num_atoms, RingSystems *ring_result, ORIG_ATOM_DATA *orig_inp_data, int *fused_atom_partner) { - printf("-------------------\n"); - for (int i = 0; i < num_atoms; i++) { int atom_id1 = i; @@ -33,8 +31,6 @@ void find_atropisomeric_atoms_and_bonds(inp_ATOM* out_at, const inp_ATOM atom_j = out_at[atom_id2]; - - int num_neighbors_j = atom_j.valence; if (num_neighbors_j == 3 && @@ -72,7 +68,7 @@ void find_atropisomeric_atoms_and_bonds(inp_ATOM* out_at, if (nof_wedge_bonds_i > 0 || nof_wedge_bonds_j > 0) { - if ((has_double_bond_i || has_double_bond_j)) { + // if ((has_double_bond_i || has_double_bond_j) || 1==1) { if ((fused_atom_partner[atom_id1] != j && fused_atom_partner[atom_id2] != i) || (fused_atom_partner[atom_id1] == -1 || @@ -94,8 +90,12 @@ void find_atropisomeric_atoms_and_bonds(inp_ATOM* out_at, orig_inp_data->is_atropisomer = 1; } } - } + // } + } else { + // printf(">>> not atropisomer because no wedge bonds: atom %d with atom %d; bond type %d; bond stereo %d\n", + // atom_id1, atom_id2, atom_i.bond_type[j], atom_i.bond_stereo[j]); } + } } } @@ -131,3 +131,145 @@ void find_atropisomeric_atoms_and_bonds(inp_ATOM* out_at, } } } + +void find_atropisomeric_atoms_and_bonds(inp_ATOM* out_at, + int num_atoms, + RingSystems *ring_result, + ORIG_ATOM_DATA *orig_inp_data, + int *fused_atom_partner) { + + + for (int i = 0; i < num_atoms; i++) { + + int atom_id1 = i; + const inp_ATOM atom_i = out_at[atom_id1]; + + int num_neighbors_i = atom_i.valence; + + const AT_NUMB *neighbors = atom_i.neighbor; + + if (num_neighbors_i == 3) { + for (int j = 0; j < num_neighbors_i; j++) { + int score = 0; + + + int atom_id2 = neighbors[j]; + + if (atom_id1 >= atom_id2) { + continue; + } + + const inp_ATOM atom_j = out_at[atom_id2]; + + int num_neighbors_j = atom_j.valence; + + score += (num_neighbors_j == 3); + score += (atom_i.bond_stereo[j] == 0); + + score -= ((atom_i.bond_stereo[j] == 1) || (atom_i.bond_stereo[j] == 4) || (atom_i.bond_stereo[j] == 6)) * 2; + + score += (atom_i.bond_type[j] == 1); + + score += (ring_result->atom_to_ring_mapping[atom_id1].ring_count > 0) * 3; + score += (ring_result->atom_to_ring_mapping[atom_id2].ring_count > 0) * 3; + + + int nof_wedge_bonds_i = 0; + int has_double_bond_i = 0; + for (int k = 0; k < num_neighbors_i; k++) { + if (atom_i.bond_stereo[k] == 1 || + atom_i.bond_stereo[k] == 4 || + atom_i.bond_stereo[k] == 6) { + nof_wedge_bonds_i++; + } + if (atom_i.bond_type[k] == 2) { + has_double_bond_i = 1; + } + } + int nof_wedge_bonds_j = 0; + int has_double_bond_j = 0; + for (int k = 0; k < num_neighbors_j; k++) { + if (atom_j.bond_stereo[k] == 1 || + atom_j.bond_stereo[k] == 4 || + atom_j.bond_stereo[k] == 6) { + nof_wedge_bonds_j++; + } + if (atom_j.bond_type[k] == 2) { + has_double_bond_j = 1; + } + } + + score += (nof_wedge_bonds_i > 0) * 3; + score += (nof_wedge_bonds_j > 0) * 3; + + score -= (nof_wedge_bonds_i == 0) * 2; + score -= (nof_wedge_bonds_j == 0) * 2; + + score += has_double_bond_i * 2; + score += has_double_bond_j * 2; + + score += (fused_atom_partner[atom_id1] != j && fused_atom_partner[atom_id2] != i); + score += (fused_atom_partner[atom_id1] == -1 || fused_atom_partner[atom_id2] == -1); + + int atom_in_same_small_ring = are_atoms_in_same_small_ring(out_at, + num_atoms, + ring_result, + atom_id1, atom_id2, + 6); + + score += (atom_in_same_small_ring == 0); + + score -= (atom_in_same_small_ring == 1) * 10; + + if (score > 10) { + printf(">>> potential atropisomer: atom id %2d atom id %2d --> score %2d (%d)\n", atom_id1, atom_id2, score, atom_in_same_small_ring); + orig_inp_data->is_atropisomer = 1; + + out_at[atom_id1].bAtropisomeric = 1; + out_at[atom_id2].bAtropisomeric = 1; + } + + // printf(">>> is atropisomer\n"); + // printf("infos: atom %d with atom %d; bond type %d; bond stereo %d\n", + // atom_id1, atom_id2, atom_i.bond_type[j], atom_i.bond_stereo[j]); + // printf("atom type %d %d\n", atom_i.el_number, atom_j.el_number); + // printf("has double bond %d %d\n", has_double_bond_i, has_double_bond_j); + // printf("fused pivot atoms %d %d\n", fused_atom_partner[atom_id1], fused_atom_partner[atom_id2]); + + //TODO set atoms with atropisomeric bonds in out_at + // orig_inp_data->is_atropisomer = 1; + + + } + } + } + + // for (int i = 0; i < ring_result->count; i++) { + // const Ring *cur_ring = &ring_result->rings[i]; + // if (cur_ring->size >= 8) { + // int count_single_bonds = 0; + // int count_double_bonds = 0; + // for (int j = 0; j < cur_ring->size; j++) { + // int atom_id1 = cur_ring->atom_ids[j]; + // int atom_id2 = cur_ring->atom_ids[(j + 1) % cur_ring->size]; + // const inp_ATOM atom1 = out_at[atom_id1]; + // for (int k = 0; k < atom1.valence; k++) { + // if (atom1.neighbor[k] == atom_id2) { + // if (atom1.bond_type[k] == 1) { + // count_single_bonds++; + // } else if (atom1.bond_type[k] == 2) { + // count_double_bonds++; + // } + // } + // } + // } + + // if (cur_ring->is_fused_ring == 0) { + // printf(">>> ring id %d size %d nof single bonds %d nof double bonds %d fused ring %d\n", + // cur_ring->id, cur_ring->size, + // count_single_bonds, count_double_bonds, + // cur_ring->is_fused_ring); + // } + // } + // } +} diff --git a/INCHI-1-SRC/INCHI_BASE/src/ichimake.c b/INCHI-1-SRC/INCHI_BASE/src/ichimake.c index 7a088797..febcf21b 100644 --- a/INCHI-1-SRC/INCHI_BASE/src/ichimake.c +++ b/INCHI-1-SRC/INCHI_BASE/src/ichimake.c @@ -3929,7 +3929,7 @@ int Create_INChI(CANON_GLOBALS* pCG, //map values to orig_inp_data if (orig_inp_data->is_atropisomer) { for (i = 0; i < num_atoms; i++) { - //todo set atoms with atropisomeric bonds in orig_atom_data + orig_inp_data->at[i].bAtropisomeric = out_at[i].bAtropisomeric; } } diff --git a/INCHI-1-SRC/INCHI_BASE/src/ichiprt1.c b/INCHI-1-SRC/INCHI_BASE/src/ichiprt1.c index f362561e..9262b068 100644 --- a/INCHI-1-SRC/INCHI_BASE/src/ichiprt1.c +++ b/INCHI-1-SRC/INCHI_BASE/src/ichiprt1.c @@ -1626,7 +1626,10 @@ int OutputINChI1( CANON_GLOBALS *pCG, if (ip->Atropisomers) { - set_Atropisomer_t_m_layers(orig_inp_data, pINChI, pINChI_Aux); + if (set_Atropisomer_t_m_layers(orig_inp_data, pINChI, pINChI_Aux)) { + io.sDifSegs[io.nCurINChISegment][DIFS_t_SATOMS] = DIFV_OUTPUT_FILL_T; + // io.sDifSegs[io.nCurINChISegment][DIFS_m_SP3INV] = DIFV_OUTPUT_FILL_T; + } } } } diff --git a/INCHI-1-SRC/INCHI_BASE/src/inpdef.h b/INCHI-1-SRC/INCHI_BASE/src/inpdef.h index ec3c5823..32e2e5f1 100644 --- a/INCHI-1-SRC/INCHI_BASE/src/inpdef.h +++ b/INCHI-1-SRC/INCHI_BASE/src/inpdef.h @@ -184,6 +184,8 @@ typedef struct tagInputAtom 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 */ + AT_NUMB bAtropisomeric; /* flag indicating if the atom is part of an atropisomeric bond */ + #if (FIND_RING_SYSTEMS == 1) S_CHAR bCutVertex; AT_NUMB nRingSystem; diff --git a/INCHI-1-SRC/INCHI_BASE/src/strutil.c b/INCHI-1-SRC/INCHI_BASE/src/strutil.c index e11f79c9..2c20fcf0 100644 --- a/INCHI-1-SRC/INCHI_BASE/src/strutil.c +++ b/INCHI-1-SRC/INCHI_BASE/src/strutil.c @@ -7119,17 +7119,17 @@ int set_Atropisomer_t_m_layers( const ORIG_ATOM_DATA *orig_inp_data, if (orig_inp_data == NULL) { - return 1; + return ret; } if (inchi == NULL || aux == NULL) { - return 1; + return ret; } if (aux->nOrigAtNosInCanonOrd == NULL || aux->nNumberOfAtoms <= 0) { - return 1; + return ret; } //TODO @@ -7142,6 +7142,31 @@ int set_Atropisomer_t_m_layers( const ORIG_ATOM_DATA *orig_inp_data, if (orig_inp_data->is_atropisomer) { printf(">>>>> TODO set t- and m-layers for atropisomers\n"); + + + int p_count = 0; + for (int i = 0; i < orig_inp_data->num_inp_atoms; i++) { + if (orig_inp_data->at[i].bAtropisomeric) { + inchi->Stereo->nNumberOfStereoCenters++; + + printf("atom id %d, is_atropisomer %d\n", i + 1, orig_inp_data->at[i].bAtropisomeric); + + AT_NUMB canon_atom_num = (AT_NUMB)get_canonical_atom_number(aux, i + 1); + // int parity_idx = get_parity_idx_from_canonical_atom_number(canon_atom_num, + // inchi->Stereo->nNumber, + // inchi->Stereo->nNumberOfStereoCenters); + // if (parity_idx == -1) { + int parity_idx = p_count; + p_count++; + // } + inchi->Stereo->nNumber[parity_idx] = canon_atom_num; + inchi->Stereo->t_parity[parity_idx] = 1; // set t-parity to 1 (-) for atropisomeric atoms + ret = 1; + } + } + + + } diff --git a/INCHI-1-TEST/tests/test_unit/fixtures/atropisomers_test_file_1_orig.sdf b/INCHI-1-TEST/tests/test_unit/fixtures/atropisomers_test_file_1_orig.sdf new file mode 100644 index 00000000..6347e791 --- /dev/null +++ b/INCHI-1-TEST/tests/test_unit/fixtures/atropisomers_test_file_1_orig.sdf @@ -0,0 +1,3355 @@ + + ACD/LABS03022623403D + + 16 17 0 0 1 0 0 0 0 0 55 V2000 + 1295.3291 -715.4121 0.0002 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1223.4492 -673.9116 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1151.5688 -715.4114 -0.0002 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1151.5684 -798.4111 -0.0002 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1223.4482 -839.9116 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1295.3286 -798.4121 0.0002 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1295.3296 -549.4120 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1223.4495 -590.9116 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1151.5696 -549.4114 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1151.5698 -466.4115 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1295.3301 -466.4120 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1223.4502 -424.9117 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1367.2095 -590.9126 0.0000 R 0 0 0 0 0 0 0 0 0 0 0 0 + 1079.6892 -590.9109 0.0000 R 0 0 0 0 0 0 0 0 0 0 0 0 + 1079.6890 -673.9106 -0.0002 R 0 0 0 0 0 0 0 0 0 0 0 0 + 1367.2095 -673.9127 0.0002 R 0 0 0 0 0 0 0 0 0 0 0 0 + 1 6 1 0 0 0 0 + 1 2 2 0 0 0 0 + 1 16 1 0 0 0 0 + 2 3 1 1 0 0 0 + 2 8 1 0 0 0 0 + 3 4 2 0 0 0 0 + 3 15 1 0 0 0 0 + 5 4 1 1 0 0 0 + 5 6 2 0 0 0 0 + 8 7 1 1 0 0 0 + 7 11 2 0 0 0 0 + 7 13 1 0 0 0 0 + 8 9 2 0 0 0 0 + 9 10 1 0 0 0 0 + 9 14 1 0 0 0 0 + 10 12 2 0 0 0 0 + 12 11 1 1 0 0 0 +A 13 +CO2H +M ZZJ 13 +M ZZJ 13 ACD/LABS03022623402D +M ZZJ 13 +M ZZJ 13 3 2 0 0 0 0 0 0 0 0 1 V2000 +M ZZJ 13 0.0000 0.0000 0.0000 C 0 0 0 0 0 3 0 0 0 0 0 0 +M ZZJ 13 0.0000 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 +M ZZJ 13 0.0000 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 +M ZZJ 13 1 2 2 0 0 0 0 +M ZZJ 13 1 3 1 0 0 0 0 +M ZZJ 13 M END +M ZZJ 13 $$$$ +A 14 +NO2 +M ZZJ 14 +M ZZJ 14 ACD/LABS03022623402D +M ZZJ 14 +M ZZJ 14 3 2 0 0 0 0 0 0 0 0 2 V2000 +M ZZJ 14 0.0000 0.0000 0.0000 N 0 3 0 0 0 3 0 0 0 0 0 0 +M ZZJ 14 0.0000 0.0000 0.0000 O 0 5 0 0 0 0 0 0 0 0 0 0 +M ZZJ 14 0.0000 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 +M ZZJ 14 1 2 1 0 0 0 0 +M ZZJ 14 1 3 2 0 0 0 0 +M ZZJ 14 M CHG 2 1 1 2 -1 +M ZZJ 14 M END +M ZZJ 14 $$$$ +A 15 +NO2 +M ZZJ 15 +M ZZJ 15 ACD/LABS03022623402D +M ZZJ 15 +M ZZJ 15 3 2 0 0 0 0 0 0 0 0 2 V2000 +M ZZJ 15 0.0000 0.0000 0.0000 N 0 3 0 0 0 3 0 0 0 0 0 0 +M ZZJ 15 0.0000 0.0000 0.0000 O 0 5 0 0 0 0 0 0 0 0 0 0 +M ZZJ 15 0.0000 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 +M ZZJ 15 1 2 1 0 0 0 0 +M ZZJ 15 1 3 2 0 0 0 0 +M ZZJ 15 M CHG 2 1 1 2 -1 +M ZZJ 15 M END +M ZZJ 15 $$$$ +A 16 +CO2H +M ZZJ 16 +M ZZJ 16 ACD/LABS03022623402D +M ZZJ 16 +M ZZJ 16 3 2 0 0 0 0 0 0 0 0 1 V2000 +M ZZJ 16 0.0000 0.0000 0.0000 C 0 0 0 0 0 3 0 0 0 0 0 0 +M ZZJ 16 0.0000 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 +M ZZJ 16 0.0000 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 +M ZZJ 16 1 2 2 0 0 0 0 +M ZZJ 16 1 3 1 0 0 0 0 +M ZZJ 16 M END +M ZZJ 16 $$$$ +M END +> +1 + +> +(1M)-6,6'-dinitro[1,1'-biphenyl]-2,2'-dicarboxylic acid + +> +InChI=1S/C14H8N2O8/c17-13(18)7-3-1-5-9(15(21)22)11(7)12-8(14(19)20)4-2-6-10(12)16(23)24/h1-6H,(H,17,18)(H,19,20) + +> +t11- or t11-,12-; m0 or m1 + +> +InChI=1S/C14H8N2O8/c17-13(18)7-3-1-5-9(15(21)22)11(7)12-8(14(19)20)4-2-6-10(12)16(23)24/h1-6H,(H,17,18)(H,19,20)/t11-/m0/s1 + +> +1-M + +$$$$ + + ACD/LABS03022623403D + + 16 17 0 0 1 0 0 0 0 0 55 V2000 + 1785.5693 -715.4121 -0.0002 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1857.4492 -673.9116 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1929.3296 -715.4114 0.0002 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1929.3301 -798.4111 0.0002 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1857.4502 -839.9116 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1785.5698 -798.4121 -0.0002 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1785.5688 -549.4120 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1857.4490 -590.9116 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1929.3289 -549.4114 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1929.3286 -466.4115 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1785.5684 -466.4120 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1857.4482 -424.9117 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1713.6890 -590.9126 0.0000 R 0 0 0 0 0 0 0 0 0 0 0 0 + 2001.2092 -590.9109 0.0000 R 0 0 0 0 0 0 0 0 0 0 0 0 + 2001.2095 -673.9106 0.0002 R 0 0 0 0 0 0 0 0 0 0 0 0 + 1713.6890 -673.9127 -0.0002 R 0 0 0 0 0 0 0 0 0 0 0 0 + 1 6 1 0 0 0 0 + 1 2 2 0 0 0 0 + 1 16 1 0 0 0 0 + 2 3 1 1 0 0 0 + 2 8 1 0 0 0 0 + 3 4 2 0 0 0 0 + 3 15 1 0 0 0 0 + 5 4 1 1 0 0 0 + 5 6 2 0 0 0 0 + 8 7 1 1 0 0 0 + 7 11 2 0 0 0 0 + 7 13 1 0 0 0 0 + 8 9 2 0 0 0 0 + 9 10 1 0 0 0 0 + 9 14 1 0 0 0 0 + 10 12 2 0 0 0 0 + 12 11 1 1 0 0 0 +A 13 +CO2H +M ZZJ 13 +M ZZJ 13 ACD/LABS03022623402D +M ZZJ 13 +M ZZJ 13 3 2 0 0 0 0 0 0 0 0 1 V2000 +M ZZJ 13 3496.8984 0.0000 0.0000 C 0 0 0 0 0 3 0 0 0 0 0 0 +M ZZJ 13 3496.8984 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 +M ZZJ 13 3496.8984 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 +M ZZJ 13 1 2 2 0 0 0 0 +M ZZJ 13 1 3 1 0 0 0 0 +M ZZJ 13 M END +M ZZJ 13 $$$$ +A 14 +NO2 +M ZZJ 14 +M ZZJ 14 ACD/LABS03022623402D +M ZZJ 14 +M ZZJ 14 3 2 0 0 0 0 0 0 0 0 2 V2000 +M ZZJ 14 3496.8984 0.0000 0.0000 N 0 3 0 0 0 3 0 0 0 0 0 0 +M ZZJ 14 3496.8984 0.0000 0.0000 O 0 5 0 0 0 0 0 0 0 0 0 0 +M ZZJ 14 3496.8984 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 +M ZZJ 14 1 2 1 0 0 0 0 +M ZZJ 14 1 3 2 0 0 0 0 +M ZZJ 14 M CHG 2 1 1 2 -1 +M ZZJ 14 M END +M ZZJ 14 $$$$ +A 15 +NO2 +M ZZJ 15 +M ZZJ 15 ACD/LABS03022623402D +M ZZJ 15 +M ZZJ 15 3 2 0 0 0 0 0 0 0 0 2 V2000 +M ZZJ 15 3496.8984 0.0000 0.0000 N 0 3 0 0 0 3 0 0 0 0 0 0 +M ZZJ 15 3496.8984 0.0000 0.0000 O 0 5 0 0 0 0 0 0 0 0 0 0 +M ZZJ 15 3496.8984 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 +M ZZJ 15 1 2 1 0 0 0 0 +M ZZJ 15 1 3 2 0 0 0 0 +M ZZJ 15 M CHG 2 1 1 2 -1 +M ZZJ 15 M END +M ZZJ 15 $$$$ +A 16 +CO2H +M ZZJ 16 +M ZZJ 16 ACD/LABS03022623402D +M ZZJ 16 +M ZZJ 16 3 2 0 0 0 0 0 0 0 0 1 V2000 +M ZZJ 16 3496.8984 0.0000 0.0000 C 0 0 0 0 0 3 0 0 0 0 0 0 +M ZZJ 16 3496.8984 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 +M ZZJ 16 3496.8984 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 +M ZZJ 16 1 2 2 0 0 0 0 +M ZZJ 16 1 3 1 0 0 0 0 +M ZZJ 16 M END +M ZZJ 16 $$$$ +M END +> +2 + +> +(1P)-6,6'-dinitro[1,1'-biphenyl]-2,2'-dicarboxylic acid + +> +InChI=1S/C14H8N2O8/c17-13(18)7-3-1-5-9(15(21)22)11(7)12-8(14(19)20)4-2-6-10(12)16(23)24/h1-6H,(H,17,18)(H,19,20) + +> +t11- or t11-,12-; m1 or m0 + +> +1-P + +$$$$ + + ACD/LABS03022623403D + + 16 17 0 0 1 0 0 0 0 0 55 V2000 + 4592.6582 -790.8242 0.0002 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4520.7783 -749.3237 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4448.8979 -790.8235 -0.0002 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4448.8975 -873.8232 -0.0002 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4520.7773 -915.3237 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4592.6577 -873.8242 0.0002 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4592.6587 -624.8241 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4520.7783 -666.3237 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4448.8984 -624.8235 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4448.8989 -541.8236 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4592.6592 -541.8241 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4520.7793 -500.3239 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4664.5386 -666.3247 0.0000 R 0 0 0 0 0 0 0 0 0 0 0 0 + 4377.0186 -666.3230 0.0000 R 0 0 0 0 0 0 0 0 0 0 0 0 + 4377.0181 -749.3228 -0.0002 R 0 0 0 0 0 0 0 0 0 0 0 0 + 4664.5386 -749.3248 0.0002 R 0 0 0 0 0 0 0 0 0 0 0 0 + 1 6 1 0 0 0 0 + 1 2 2 0 0 0 0 + 1 16 1 0 0 0 0 + 2 3 1 1 0 0 0 + 2 8 1 0 0 0 0 + 3 4 2 0 0 0 0 + 3 15 1 0 0 0 0 + 4 5 1 0 0 0 0 + 5 6 2 0 0 0 0 + 7 8 1 0 0 0 0 + 7 11 2 0 0 0 0 + 7 13 1 0 0 0 0 + 8 9 2 0 0 0 0 + 9 10 1 0 0 0 0 + 9 14 1 0 0 0 0 + 10 12 2 0 0 0 0 + 11 12 1 0 0 0 0 +A 13 +CO2H +M ZZJ 13 +M ZZJ 13 ACD/LABS03022623402D +M ZZJ 13 +M ZZJ 13 3 2 0 0 0 0 0 0 0 0 1 V2000 +M ZZJ 13 0.0000 0.0000 0.0000 C 0 0 0 0 0 3 0 0 0 0 0 0 +M ZZJ 13 0.0000 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 +M ZZJ 13 0.0000 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 +M ZZJ 13 1 2 2 0 0 0 0 +M ZZJ 13 1 3 1 0 0 0 0 +M ZZJ 13 M END +M ZZJ 13 $$$$ +A 14 +NO2 +M ZZJ 14 +M ZZJ 14 ACD/LABS03022623402D +M ZZJ 14 +M ZZJ 14 3 2 0 0 0 0 0 0 0 0 2 V2000 +M ZZJ 14 0.0000 0.0000 0.0000 N 0 3 0 0 0 3 0 0 0 0 0 0 +M ZZJ 14 0.0000 0.0000 0.0000 O 0 5 0 0 0 0 0 0 0 0 0 0 +M ZZJ 14 0.0000 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 +M ZZJ 14 1 2 1 0 0 0 0 +M ZZJ 14 1 3 2 0 0 0 0 +M ZZJ 14 M CHG 2 1 1 2 -1 +M ZZJ 14 M END +M ZZJ 14 $$$$ +A 15 +NO2 +M ZZJ 15 +M ZZJ 15 ACD/LABS03022623402D +M ZZJ 15 +M ZZJ 15 3 2 0 0 0 0 0 0 0 0 2 V2000 +M ZZJ 15 0.0000 0.0000 0.0000 N 0 3 0 0 0 3 0 0 0 0 0 0 +M ZZJ 15 0.0000 0.0000 0.0000 O 0 5 0 0 0 0 0 0 0 0 0 0 +M ZZJ 15 0.0000 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 +M ZZJ 15 1 2 1 0 0 0 0 +M ZZJ 15 1 3 2 0 0 0 0 +M ZZJ 15 M CHG 2 1 1 2 -1 +M ZZJ 15 M END +M ZZJ 15 $$$$ +A 16 +CO2H +M ZZJ 16 +M ZZJ 16 ACD/LABS03022623402D +M ZZJ 16 +M ZZJ 16 3 2 0 0 0 0 0 0 0 0 1 V2000 +M ZZJ 16 0.0000 0.0000 0.0000 C 0 0 0 0 0 3 0 0 0 0 0 0 +M ZZJ 16 0.0000 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 +M ZZJ 16 0.0000 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 +M ZZJ 16 1 2 2 0 0 0 0 +M ZZJ 16 1 3 1 0 0 0 0 +M ZZJ 16 M END +M ZZJ 16 $$$$ +M END +> +3 + +> +(1M)-6,6'-dinitro[1,1'-biphenyl]-2,2'-dicarboxylic acid + +> +InChI=1S/C14H8N2O8/c17-13(18)7-3-1-5-9(15(21)22)11(7)12-8(14(19)20)4-2-6-10(12)16(23)24/h1-6H,(H,17,18)(H,19,20) + +> +t11- or t11-,12-; m0 or m1 + +> +1-M + +$$$$ + + ACD/LABS03022623403D + + 16 17 0 0 1 0 0 0 0 0 55 V2000 + 5094.1387 -765.8242 -0.0002 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5166.0186 -724.3237 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5237.8989 -765.8235 0.0002 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5237.8994 -848.8232 0.0002 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5166.0195 -890.3237 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5094.1392 -848.8242 -0.0002 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5094.1382 -599.8241 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5166.0186 -641.3237 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5237.8984 -599.8235 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5237.8979 -516.8236 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5094.1377 -516.8241 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5166.0176 -475.3239 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5022.2583 -641.3247 0.0000 R 0 0 0 0 0 0 0 0 0 0 0 0 + 5309.7783 -641.3230 0.0000 R 0 0 0 0 0 0 0 0 0 0 0 0 + 5309.7788 -724.3228 0.0002 R 0 0 0 0 0 0 0 0 0 0 0 0 + 5022.2583 -724.3248 -0.0002 R 0 0 0 0 0 0 0 0 0 0 0 0 + 1 6 1 0 0 0 0 + 1 2 2 0 0 0 0 + 1 16 1 0 0 0 0 + 2 3 1 1 0 0 0 + 2 8 1 0 0 0 0 + 3 4 2 0 0 0 0 + 3 15 1 0 0 0 0 + 4 5 1 0 0 0 0 + 5 6 2 0 0 0 0 + 7 8 1 0 0 0 0 + 7 11 2 0 0 0 0 + 7 13 1 0 0 0 0 + 8 9 2 0 0 0 0 + 9 10 1 0 0 0 0 + 9 14 1 0 0 0 0 + 10 12 2 0 0 0 0 + 11 12 1 0 0 0 0 +A 13 +CO2H +M ZZJ 13 +M ZZJ 13 ACD/LABS03022623402D +M ZZJ 13 +M ZZJ 13 3 2 0 0 0 0 0 0 0 0 1 V2000 +M ZZJ 13 3496.8984 0.0000 0.0000 C 0 0 0 0 0 3 0 0 0 0 0 0 +M ZZJ 13 3496.8984 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 +M ZZJ 13 3496.8984 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 +M ZZJ 13 1 2 2 0 0 0 0 +M ZZJ 13 1 3 1 0 0 0 0 +M ZZJ 13 M END +M ZZJ 13 $$$$ +A 14 +NO2 +M ZZJ 14 +M ZZJ 14 ACD/LABS03022623402D +M ZZJ 14 +M ZZJ 14 3 2 0 0 0 0 0 0 0 0 2 V2000 +M ZZJ 14 3496.8984 0.0000 0.0000 N 0 3 0 0 0 3 0 0 0 0 0 0 +M ZZJ 14 3496.8984 0.0000 0.0000 O 0 5 0 0 0 0 0 0 0 0 0 0 +M ZZJ 14 3496.8984 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 +M ZZJ 14 1 2 1 0 0 0 0 +M ZZJ 14 1 3 2 0 0 0 0 +M ZZJ 14 M CHG 2 1 1 2 -1 +M ZZJ 14 M END +M ZZJ 14 $$$$ +A 15 +NO2 +M ZZJ 15 +M ZZJ 15 ACD/LABS03022623402D +M ZZJ 15 +M ZZJ 15 3 2 0 0 0 0 0 0 0 0 2 V2000 +M ZZJ 15 3496.8984 0.0000 0.0000 N 0 3 0 0 0 3 0 0 0 0 0 0 +M ZZJ 15 3496.8984 0.0000 0.0000 O 0 5 0 0 0 0 0 0 0 0 0 0 +M ZZJ 15 3496.8984 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 +M ZZJ 15 1 2 1 0 0 0 0 +M ZZJ 15 1 3 2 0 0 0 0 +M ZZJ 15 M CHG 2 1 1 2 -1 +M ZZJ 15 M END +M ZZJ 15 $$$$ +A 16 +CO2H +M ZZJ 16 +M ZZJ 16 ACD/LABS03022623402D +M ZZJ 16 +M ZZJ 16 3 2 0 0 0 0 0 0 0 0 1 V2000 +M ZZJ 16 3496.8984 0.0000 0.0000 C 0 0 0 0 0 3 0 0 0 0 0 0 +M ZZJ 16 3496.8984 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 +M ZZJ 16 3496.8984 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 +M ZZJ 16 1 2 2 0 0 0 0 +M ZZJ 16 1 3 1 0 0 0 0 +M ZZJ 16 M END +M ZZJ 16 $$$$ +M END +> +4 + +> +(1P)-6,6'-dinitro[1,1'-biphenyl]-2,2'-dicarboxylic acid + +> +InChI=1S/C14H8N2O8/c17-13(18)7-3-1-5-9(15(21)22)11(7)12-8(14(19)20)4-2-6-10(12)16(23)24/h1-6H,(H,17,18)(H,19,20) + +> +t11- or t11-,12-; m1 or m0 + +> +1-P + +$$$$ + + ACD/LABS03022623403D + + 24 25 0 0 1 0 0 0 0 0 2 V2000 + 5060.2773-1486.6484 -0.0002 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5132.1572-1445.1479 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5204.0376-1486.6477 0.0002 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5204.0381-1569.6475 0.0002 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5132.1582-1611.1479 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5060.2778-1569.6484 -0.0002 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5060.2769-1185.6483 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5132.1572-1227.1479 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5204.0371-1185.6477 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5204.0366-1102.6478 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5060.2764-1102.6483 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5132.1563-1061.1481 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4988.3970-1227.1489 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5275.9170-1227.1472 0.0000 N 0 3 0 0 0 0 0 0 0 0 0 0 + 5275.9175-1445.1470 0.0000 N 0 3 0 0 0 0 0 0 0 0 0 0 + 4988.3970-1445.1490 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4988.3979-1310.1489 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 4916.5166-1185.6498 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 5347.7969-1185.6469 0.0000 O 0 5 0 0 0 0 0 0 0 0 0 0 + 5275.9175-1310.1472 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 5275.9165-1362.1470 0.0000 O 0 5 0 0 0 0 0 0 0 0 0 0 + 5347.7979-1486.6462 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 4916.5176-1486.6499 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 4988.3960-1362.1490 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1 6 1 0 0 0 0 + 1 2 2 0 0 0 0 + 1 16 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 8 1 0 0 0 0 + 3 4 2 0 0 0 0 + 3 15 1 0 0 0 0 + 4 5 1 0 0 0 0 + 5 6 2 0 0 0 0 + 8 7 1 6 0 0 0 + 7 11 2 0 0 0 0 + 7 13 1 0 0 0 0 + 8 9 2 0 0 0 0 + 9 10 1 0 0 0 0 + 9 14 1 0 0 0 0 + 10 12 2 0 0 0 0 + 11 12 1 0 0 0 0 + 13 17 2 0 0 0 0 + 13 18 1 0 0 0 0 + 14 19 1 0 0 0 0 + 14 20 2 0 0 0 0 + 15 21 1 0 0 0 0 + 15 22 2 0 0 0 0 + 16 23 2 0 0 0 0 + 16 24 1 0 0 0 0 +M CHG 4 14 1 15 1 19 -1 21 -1 +M END +> +5 + +> +(1M)-6,6'-dinitro[1,1'-biphenyl]-2,2'-dicarboxylic acid + +> +InChI=1S/C14H8N2O8/c17-13(18)7-3-1-5-9(15(21)22)11(7)12-8(14(19)20)4-2-6-10(12)16(23)24/h1-6H,(H,17,18)(H,19,20) + +> +t11- or t11-,12-; m0 or m1 + +> +1-M + +$$$$ + + ACD/LABS03022623403D + + 24 25 0 0 1 0 0 0 0 0 2 V2000 + 4599.3164-1484.6484 0.0002 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4527.4365-1443.1479 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4455.5562-1484.6477 -0.0002 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4455.5557-1567.6475 -0.0002 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4527.4355-1609.1479 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4599.3159-1567.6484 0.0002 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4599.3169-1183.6483 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4527.4365-1225.1479 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4455.5566-1183.6477 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4455.5571-1100.6478 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4599.3174-1100.6483 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4527.4375-1059.1481 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4671.1968-1225.1489 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4383.6768-1225.1472 0.0000 N 0 3 0 0 0 0 0 0 0 0 0 0 + 4383.6763-1443.1470 0.0000 N 0 3 0 0 0 0 0 0 0 0 0 0 + 4671.1968-1443.1490 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4743.0771-1183.6494 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 4671.1963-1308.1489 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 4383.6768-1308.1472 0.0000 O 0 5 0 0 0 0 0 0 0 0 0 0 + 4311.7969-1183.6472 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 4311.7959-1484.6466 0.0000 O 0 5 0 0 0 0 0 0 0 0 0 0 + 4383.6768-1360.1470 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 4671.1973-1360.1490 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 4743.0767-1484.6495 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1 6 1 0 0 0 0 + 1 2 2 0 0 0 0 + 1 16 1 0 0 0 0 + 2 3 1 6 0 0 0 + 2 8 1 0 0 0 0 + 3 4 2 0 0 0 0 + 3 15 1 0 0 0 0 + 4 5 1 0 0 0 0 + 5 6 2 0 0 0 0 + 7 8 1 0 0 0 0 + 7 11 2 0 0 0 0 + 7 13 1 0 0 0 0 + 8 9 2 0 0 0 0 + 9 10 1 0 0 0 0 + 9 14 1 0 0 0 0 + 10 12 2 0 0 0 0 + 11 12 1 0 0 0 0 + 13 17 2 0 0 0 0 + 13 18 1 0 0 0 0 + 14 19 1 0 0 0 0 + 14 20 2 0 0 0 0 + 15 21 1 0 0 0 0 + 15 22 2 0 0 0 0 + 16 23 2 0 0 0 0 + 16 24 1 0 0 0 0 +M CHG 4 14 1 15 1 19 -1 21 -1 +M END +> +6 + +> +(1P)-6,6'-dinitro[1,1'-biphenyl]-2,2'-dicarboxylic acid + +> +InChI=1S/C14H8N2O8/c17-13(18)7-3-1-5-9(15(21)22)11(7)12-8(14(19)20)4-2-6-10(12)16(23)24/h1-6H,(H,17,18)(H,19,20) + +> +t11- or t11-,12-; m1 or m0 + +> +1-P + +$$$$ + + ACD/LABS03022623403D + + 16 17 0 0 1 0 0 0 0 0 1 V2000 + 507.2034 -252.2192 -0.0001 C 0 0 0 0 0 0 0 0 0 0 0 0 + 530.2050 -238.9392 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 553.2066 -252.2192 0.0001 C 0 0 0 0 0 0 0 0 0 0 0 0 + 553.2066 -278.7792 0.0001 C 0 0 0 0 0 0 0 0 0 0 0 0 + 530.2050 -292.0592 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 507.2034 -278.7792 -0.0001 C 0 0 0 0 0 0 0 0 0 0 0 0 + 553.2067 -199.0993 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 530.2051 -212.3792 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 507.2035 -199.0991 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 507.2036 -172.5392 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 553.2068 -172.5393 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 530.2053 -159.2592 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 576.2083 -212.3795 0.0000 Br 0 0 0 0 0 0 0 0 0 0 0 0 + 484.2018 -212.3790 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 576.2083 -238.9392 0.0002 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 484.2017 -238.9393 -0.0002 Br 0 0 0 0 0 0 0 0 0 0 0 0 + 1 6 1 0 0 0 0 + 1 2 2 0 0 0 0 + 1 16 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 8 1 0 0 0 0 + 3 4 2 0 0 0 0 + 3 15 1 0 0 0 0 + 4 5 1 0 0 0 0 + 5 6 2 0 0 0 0 + 7 8 2 0 0 0 0 + 7 11 1 0 0 0 0 + 7 13 1 0 0 0 0 + 8 9 1 1 0 0 0 + 9 10 2 0 0 0 0 + 9 14 1 0 0 0 0 + 10 12 1 0 0 0 0 + 11 12 2 0 0 0 0 +M END +> +7 + +> +(1M)-2,2'-dibromo-6,6'-dichloro-1,1'-biphenyl + +> +InChI=1S/C12H6Br2Cl2/c13-7-3-1-5-9(15)11(7)12-8(14)4-2-6-10(12)16/h1-6H + +> +t11- or t11-,12-; m0 or m1 + +> +2-M + +$$$$ + + ACD/LABS03022623403D + + 16 17 0 0 1 0 0 0 0 0 1 V2000 + 345.0727 -252.2755 -0.0001 C 0 0 0 0 0 0 0 0 0 0 0 0 + 368.0744 -238.9955 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 391.0760 -252.2755 0.0001 C 0 0 0 0 0 0 0 0 0 0 0 0 + 391.0760 -278.8354 0.0001 C 0 0 0 0 0 0 0 0 0 0 0 0 + 368.0744 -292.1154 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 345.0727 -278.8355 -0.0001 C 0 0 0 0 0 0 0 0 0 0 0 0 + 391.0761 -199.1556 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 368.0744 -212.4355 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 345.0729 -199.1554 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 345.0730 -172.5954 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 391.0762 -172.5956 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 368.0747 -159.3155 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 414.0776 -212.4358 0.0000 Br 0 0 0 0 0 0 0 0 0 0 0 0 + 322.0712 -212.4352 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 414.0776 -238.9954 0.0002 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 322.0711 -238.9955 -0.0002 Br 0 0 0 0 0 0 0 0 0 0 0 0 + 1 6 1 0 0 0 0 + 1 2 2 0 0 0 0 + 1 16 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 8 1 0 0 0 0 + 3 4 2 0 0 0 0 + 3 15 1 0 0 0 0 + 4 5 1 0 0 0 0 + 5 6 2 0 0 0 0 + 8 7 1 6 0 0 0 + 7 11 2 0 0 0 0 + 7 13 1 0 0 0 0 + 8 9 2 0 0 0 0 + 9 10 1 0 0 0 0 + 9 14 1 0 0 0 0 + 10 12 2 0 0 0 0 + 11 12 1 0 0 0 0 +M END +> +8 + +> +(1M)-2,2'-dibromo-6,6'-dichloro-1,1'-biphenyl + +> +InChI=1S/C12H6Br2Cl2/c13-7-3-1-5-9(15)11(7)12-8(14)4-2-6-10(12)16/h1-6H + +> +t11- or t11-,12-; m0 or m1 + +> +2-M + +$$$$ + + ACD/LABS03022623403D + + 16 17 0 0 1 0 0 0 0 0 1 V2000 + 555.5559 -101.0756 0.0001 C 0 0 0 0 0 0 0 0 0 0 0 0 + 532.5544 -87.7955 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 509.5527 -101.0754 -0.0001 C 0 0 0 0 0 0 0 0 0 0 0 0 + 509.5525 -127.6353 -0.0001 C 0 0 0 0 0 0 0 0 0 0 0 0 + 532.5541 -140.9155 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 555.5558 -127.6356 0.0001 C 0 0 0 0 0 0 0 0 0 0 0 0 + 555.5561 -47.9556 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 532.5544 -61.2355 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 509.5529 -47.9554 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 509.5530 -21.3954 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 555.5562 -21.3956 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 532.5547 -8.1155 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 578.5576 -61.2358 0.0000 Br 0 0 0 0 0 0 0 0 0 0 0 0 + 486.5511 -61.2352 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 486.5511 -87.7952 -0.0001 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 578.5576 -87.7958 0.0001 Br 0 0 0 0 0 0 0 0 0 0 0 0 + 1 6 1 0 0 0 0 + 1 2 2 0 0 0 0 + 1 16 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 8 1 0 0 0 0 + 3 4 2 0 0 0 0 + 3 15 1 0 0 0 0 + 4 5 1 0 0 0 0 + 5 6 2 0 0 0 0 + 7 8 2 0 0 0 0 + 7 11 1 0 0 0 0 + 7 13 1 0 0 0 0 + 8 9 1 6 0 0 0 + 9 10 2 0 0 0 0 + 9 14 1 0 0 0 0 + 10 12 1 0 0 0 0 + 11 12 2 0 0 0 0 +M END +> +9 + +> +(1M)-2,2'-dibromo-6,6'-dichloro-1,1'-biphenyl + +> +InChI=1S/C12H6Br2Cl2/c13-7-3-1-5-9(15)11(7)12-8(14)4-2-6-10(12)16/h1-6H + +> +t11- or t11-,12-; m0 or m1 + +> +2-M + +$$$$ + + ACD/LABS03022623403D + + 16 17 0 0 1 0 0 0 0 0 1 V2000 + 391.6106 -101.2637 0.0001 C 0 0 0 0 0 0 0 0 0 0 0 0 + 368.6090 -87.9836 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 345.6073 -101.2635 -0.0001 C 0 0 0 0 0 0 0 0 0 0 0 0 + 345.6072 -127.8234 -0.0001 C 0 0 0 0 0 0 0 0 0 0 0 0 + 368.6087 -141.1036 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 391.6105 -127.8237 0.0001 C 0 0 0 0 0 0 0 0 0 0 0 0 + 391.6108 -48.1437 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 368.6091 -61.4236 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 345.6076 -48.1435 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 345.6076 -21.5836 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 391.6109 -21.5837 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 368.6094 -8.3036 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 414.6123 -61.4239 0.0000 Br 0 0 0 0 0 0 0 0 0 0 0 0 + 322.6059 -61.4234 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 322.6058 -87.9833 -0.0001 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 414.6123 -87.9839 0.0001 Br 0 0 0 0 0 0 0 0 0 0 0 0 + 1 6 1 0 0 0 0 + 1 2 2 0 0 0 0 + 1 16 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 8 1 0 0 0 0 + 3 4 2 0 0 0 0 + 3 15 1 0 0 0 0 + 4 5 1 0 0 0 0 + 5 6 2 0 0 0 0 + 8 7 1 1 0 0 0 + 7 11 2 0 0 0 0 + 7 13 1 0 0 0 0 + 8 9 2 0 0 0 0 + 9 10 1 0 0 0 0 + 9 14 1 0 0 0 0 + 10 12 2 0 0 0 0 + 11 12 1 0 0 0 0 +M END +> +10 + +> +(1M)-2,2'-dibromo-6,6'-dichloro-1,1'-biphenyl + +> +InChI=1S/C12H6Br2Cl2/c13-7-3-1-5-9(15)11(7)12-8(14)4-2-6-10(12)16/h1-6H + +> +t11- or t11-,12-; m0 or m1 + +> +2-M + +$$$$ + + ACD/LABS03022623403D + + 16 17 0 0 1 0 0 0 0 0 1 V2000 + 199.5780 -252.4074 -0.0001 C 0 0 0 0 0 0 0 0 0 0 0 0 + 222.5797 -239.1273 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 245.5813 -252.4074 0.0001 C 0 0 0 0 0 0 0 0 0 0 0 0 + 245.5813 -278.9673 0.0001 C 0 0 0 0 0 0 0 0 0 0 0 0 + 222.5797 -292.2473 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 199.5780 -278.9674 -0.0001 C 0 0 0 0 0 0 0 0 0 0 0 0 + 245.5814 -199.2874 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 222.5798 -212.5673 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 199.5782 -199.2873 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 199.5783 -172.7273 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 245.5815 -172.7274 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 222.5800 -159.4474 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 268.5830 -212.5677 0.0000 Br 0 0 0 0 0 0 0 0 0 0 0 0 + 176.5765 -212.5671 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 268.5830 -239.1273 0.0002 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 176.5764 -239.1274 -0.0002 Br 0 0 0 0 0 0 0 0 0 0 0 0 + 1 6 1 0 0 0 0 + 1 2 2 0 0 0 0 + 1 16 1 0 0 0 0 + 2 3 1 1 0 0 0 + 2 8 1 0 0 0 0 + 3 4 2 0 0 0 0 + 3 15 1 0 0 0 0 + 4 5 1 0 0 0 0 + 5 6 2 0 0 0 0 + 7 8 2 0 0 0 0 + 7 11 1 0 0 0 0 + 7 13 1 0 0 0 0 + 8 9 1 1 0 0 0 + 9 10 2 0 0 0 0 + 9 14 1 0 0 0 0 + 10 12 1 0 0 0 0 + 11 12 2 0 0 0 0 +M END +> +11 + +> +(1M)-2,2'-dibromo-6,6'-dichloro-1,1'-biphenyl + +> +InChI=1S/C12H6Br2Cl2/c13-7-3-1-5-9(15)11(7)12-8(14)4-2-6-10(12)16/h1-6H + +> +t11- or t11-,12-; m0 or m1 + +> +2-M + +$$$$ + + ACD/LABS03022623403D + + 16 17 0 0 1 0 0 0 0 0 1 V2000 + 37.4474 -252.4636 -0.0001 C 0 0 0 0 0 0 0 0 0 0 0 0 + 60.4491 -239.1836 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 83.4507 -252.4636 0.0001 C 0 0 0 0 0 0 0 0 0 0 0 0 + 83.4507 -279.0236 0.0001 C 0 0 0 0 0 0 0 0 0 0 0 0 + 60.4491 -292.3036 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 37.4474 -279.0236 -0.0001 C 0 0 0 0 0 0 0 0 0 0 0 0 + 83.4508 -199.3437 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 60.4491 -212.6236 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 37.4476 -199.3435 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 37.4477 -172.7835 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 83.4509 -172.7837 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 60.4494 -159.5036 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 106.4523 -212.6239 0.0000 Br 0 0 0 0 0 0 0 0 0 0 0 0 + 14.4459 -212.6234 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 106.4523 -239.1835 0.0002 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 14.4458 -239.1837 -0.0002 Br 0 0 0 0 0 0 0 0 0 0 0 0 + 1 6 1 0 0 0 0 + 1 2 2 0 0 0 0 + 1 16 1 0 0 0 0 + 2 3 1 1 0 0 0 + 2 8 1 0 0 0 0 + 3 4 2 0 0 0 0 + 3 15 1 0 0 0 0 + 4 5 1 0 0 0 0 + 5 6 2 0 0 0 0 + 8 7 1 6 0 0 0 + 7 11 2 0 0 0 0 + 7 13 1 0 0 0 0 + 8 9 2 0 0 0 0 + 9 10 1 0 0 0 0 + 9 14 1 0 0 0 0 + 10 12 2 0 0 0 0 + 11 12 1 0 0 0 0 +M END +> +12 + +> +(1M)-2,2'-dibromo-6,6'-dichloro-1,1'-biphenyl + +> +InChI=1S/C12H6Br2Cl2/c13-7-3-1-5-9(15)11(7)12-8(14)4-2-6-10(12)16/h1-6H + +> +t11- or t11-,12-; m0 or m1 + +> +2-M + +$$$$ + + ACD/LABS03022623403D + + 16 17 0 0 1 0 0 0 0 0 1 V2000 + 247.9306 -101.2637 0.0001 C 0 0 0 0 0 0 0 0 0 0 0 0 + 224.9290 -87.9836 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 201.9273 -101.2635 -0.0001 C 0 0 0 0 0 0 0 0 0 0 0 0 + 201.9272 -127.8234 -0.0001 C 0 0 0 0 0 0 0 0 0 0 0 0 + 224.9287 -141.1036 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 247.9305 -127.8237 0.0001 C 0 0 0 0 0 0 0 0 0 0 0 0 + 247.9308 -48.1437 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 224.9291 -61.4236 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 201.9276 -48.1435 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 201.9276 -21.5836 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 247.9309 -21.5837 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 224.9294 -8.3036 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 270.9323 -61.4239 0.0000 Br 0 0 0 0 0 0 0 0 0 0 0 0 + 178.9258 -61.4234 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 178.9258 -87.9833 -0.0001 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 270.9323 -87.9839 0.0001 Br 0 0 0 0 0 0 0 0 0 0 0 0 + 1 6 1 0 0 0 0 + 1 2 2 0 0 0 0 + 1 16 1 0 0 0 0 + 2 3 1 1 0 0 0 + 2 8 1 0 0 0 0 + 3 4 2 0 0 0 0 + 3 15 1 0 0 0 0 + 4 5 1 0 0 0 0 + 5 6 2 0 0 0 0 + 7 8 2 0 0 0 0 + 7 11 1 0 0 0 0 + 7 13 1 0 0 0 0 + 8 9 1 6 0 0 0 + 9 10 2 0 0 0 0 + 9 14 1 0 0 0 0 + 10 12 1 0 0 0 0 + 11 12 2 0 0 0 0 +M END +> +13 + +> +(1M)-2,2'-dibromo-6,6'-dichloro-1,1'-biphenyl + +> +InChI=1S/C12H6Br2Cl2/c13-7-3-1-5-9(15)11(7)12-8(14)4-2-6-10(12)16/h1-6H + +> +t11- or t11-,12-; m0 or m1 + +> +2-M + +$$$$ + + ACD/LABS03022623403D + + 16 17 0 0 1 0 0 0 0 0 1 V2000 + 83.9853 -101.1319 0.0001 C 0 0 0 0 0 0 0 0 0 0 0 0 + 60.9837 -87.8517 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 37.9820 -101.1316 -0.0001 C 0 0 0 0 0 0 0 0 0 0 0 0 + 37.9819 -127.6916 -0.0001 C 0 0 0 0 0 0 0 0 0 0 0 0 + 60.9834 -140.9717 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 83.9852 -127.6919 0.0001 C 0 0 0 0 0 0 0 0 0 0 0 0 + 83.9855 -48.0118 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 60.9838 -61.2917 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 37.9823 -48.0116 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 37.9823 -21.4517 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 83.9856 -21.4518 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 60.9841 -8.1718 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 106.9870 -61.2920 0.0000 Br 0 0 0 0 0 0 0 0 0 0 0 0 + 14.9805 -61.2915 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 14.9805 -87.8514 -0.0001 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 106.9870 -87.8521 0.0001 Br 0 0 0 0 0 0 0 0 0 0 0 0 + 1 6 1 0 0 0 0 + 1 2 2 0 0 0 0 + 1 16 1 0 0 0 0 + 2 3 1 1 0 0 0 + 2 8 1 0 0 0 0 + 3 4 2 0 0 0 0 + 3 15 1 0 0 0 0 + 4 5 1 0 0 0 0 + 5 6 2 0 0 0 0 + 8 7 1 1 0 0 0 + 7 11 2 0 0 0 0 + 7 13 1 0 0 0 0 + 8 9 2 0 0 0 0 + 9 10 1 0 0 0 0 + 9 14 1 0 0 0 0 + 10 12 2 0 0 0 0 + 11 12 1 0 0 0 0 +M END +> +14 + +> +(1M)-2,2'-dibromo-6,6'-dichloro-1,1'-biphenyl + +> +InChI=1S/C12H6Br2Cl2/c13-7-3-1-5-9(15)11(7)12-8(14)4-2-6-10(12)16/h1-6H + +> +t11- or t11-,12-; m0 or m1 + +> +2-M + +$$$$ + + ACD/LABS03022623403D + + 16 17 0 0 1 0 0 0 0 0 1 V2000 + 1096.6582 -675.8242 0.0002 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1024.7783 -634.3237 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 952.8979 -675.8235 -0.0002 C 0 0 0 0 0 0 0 0 0 0 0 0 + 952.8975 -758.8232 -0.0002 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1024.7773 -800.3237 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1096.6577 -758.8242 0.0002 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1096.6587 -509.8241 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1024.7786 -551.3237 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 952.8987 -509.8235 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 952.8989 -426.8236 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1096.6592 -426.8241 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1024.7793 -385.3239 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1168.5386 -551.3247 0.0000 Br 0 0 0 0 0 0 0 0 0 0 0 0 + 881.0183 -551.3230 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 881.0181 -634.3228 -0.0002 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 1168.5386 -634.3248 0.0002 Br 0 0 0 0 0 0 0 0 0 0 0 0 + 1 6 1 0 0 0 0 + 1 2 2 0 0 0 0 + 1 16 1 0 0 0 0 + 2 3 1 1 0 0 0 + 2 8 1 0 0 0 0 + 3 4 2 0 0 0 0 + 3 15 1 0 0 0 0 + 4 5 1 0 0 0 0 + 5 6 2 0 0 0 0 + 7 8 2 0 0 0 0 + 7 11 1 0 0 0 0 + 7 13 1 0 0 0 0 + 8 9 1 1 0 0 0 + 9 10 2 0 0 0 0 + 9 14 1 0 0 0 0 + 10 12 1 0 0 0 0 + 11 12 2 0 0 0 0 +M END +> +15 + +> +2,2'-dibromo-6,6'-dichloro-1,1'-biphenyl + +> +InChI=1S/C12H6Br2Cl2/c13-7-3-1-5-9(15)11(7)12-8(14)4-2-6-10(12)16/h1-6H + +> +No stereo + +> +InChI=1S/C12H6Br2Cl2/c13-7-3-1-5-9(15)11(7)12-8(14)4-2-6-10(12)16/h1-6H + +> +2-0 + +$$$$ + + ACD/LABS03022623403D + + 16 17 0 0 1 0 0 0 0 0 1 V2000 + 1400.2273-1147.7360 -0.0004 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1472.1074-1106.2358 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1543.9875-1147.7360 0.0004 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1543.9875-1230.7357 0.0004 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1472.1074-1272.2358 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1400.2273-1230.7360 -0.0004 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1543.9878 -981.7362 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1472.1077-1023.2358 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1400.2278 -981.7356 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1400.2280 -898.7357 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1543.9883 -898.7362 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1472.1084 -857.2360 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1615.8677-1023.2368 0.0000 Br 0 0 0 0 0 0 0 0 0 0 0 0 + 1328.3474-1023.2351 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 1615.8677-1106.2357 0.0005 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 1328.3472-1106.2361 -0.0005 Br 0 0 0 0 0 0 0 0 0 0 0 0 + 1 6 1 0 0 0 0 + 1 2 2 0 0 0 0 + 1 16 1 0 0 0 0 + 2 3 1 6 0 0 0 + 2 8 1 0 0 0 0 + 3 4 2 0 0 0 0 + 3 15 1 0 0 0 0 + 4 5 1 0 0 0 0 + 5 6 2 0 0 0 0 + 8 7 1 6 0 0 0 + 7 11 2 0 0 0 0 + 7 13 1 0 0 0 0 + 8 9 2 0 0 0 0 + 9 10 1 0 0 0 0 + 9 14 1 0 0 0 0 + 10 12 2 0 0 0 0 + 11 12 1 0 0 0 0 +M END +> +16 + +> +2,2'-dibromo-6,6'-dichloro-1,1'-biphenyl + +> +InChI=1S/C12H6Br2Cl2/c13-7-3-1-5-9(15)11(7)12-8(14)4-2-6-10(12)16/h1-6H + +> +no stereo + +> +InChI=1S/C12H6Br2Cl2/c13-7-3-1-5-9(15)11(7)12-8(14)4-2-6-10(12)16/h1-6H + +> +2-0 + +$$$$ + + ACD/LABS03022623403D + + 22 25 0 0 1 0 0 0 0 0 1 V2000 + 786.3373-1510.6052 0.0004 O 0 0 0 0 0 0 0 0 0 0 0 0 + 714.4570-1552.1049 0.0002 C 0 0 0 0 0 0 0 0 0 0 0 0 + 642.5771-1510.6045 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 570.6968-1552.1042 -0.0002 C 0 0 0 0 0 0 0 0 0 0 0 0 + 570.6964-1635.1042 -0.0002 C 0 0 0 0 0 0 0 0 0 0 0 0 + 642.5762-1676.6045 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 714.4565-1635.1049 0.0002 C 0 0 0 0 0 0 0 0 0 0 0 0 + 786.3376-1427.6051 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 714.4577-1386.1049 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 642.5775-1427.6045 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 570.6975-1386.1042 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 570.6978-1303.1042 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 498.8179-1261.6040 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 426.9376-1303.1038 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 426.9373-1386.1038 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 498.8172-1427.6040 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 498.8168-1510.6038 -0.0004 C 0 0 0 0 0 0 0 0 0 0 0 0 + 426.9365-1552.1035 -0.0005 C 0 0 0 0 0 0 0 0 0 0 0 0 + 426.9361-1635.1035 -0.0005 C 0 0 0 0 0 0 0 0 0 0 0 0 + 498.8160-1676.6038 -0.0004 C 0 0 0 0 0 0 0 0 0 0 0 0 + 714.4580-1303.1049 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 642.5781-1261.6045 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 2 7 1 0 0 0 0 + 2 3 2 0 0 0 0 + 3 4 1 0 0 0 0 + 3 10 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 17 2 0 0 0 0 + 5 20 2 0 0 0 0 + 5 6 1 0 0 0 0 + 6 7 2 0 0 0 0 + 8 9 1 0 0 0 0 + 10 9 1 1 0 0 0 + 9 21 2 0 0 0 0 + 10 11 2 0 0 0 0 + 11 16 1 0 0 0 0 + 11 12 1 0 0 0 0 + 12 22 2 0 0 0 0 + 12 13 1 0 0 0 0 + 13 14 2 0 0 0 0 + 14 15 1 0 0 0 0 + 15 16 2 0 0 0 0 + 17 18 1 0 0 0 0 + 18 19 2 0 0 0 0 + 19 20 1 0 0 0 0 + 22 21 1 1 0 0 0 +M END +> +17 + +> +(1M)-[1,1'-binaphthalene]-2,2'-diol + +> +InChI=1S/C20H14O2/c21-17-11-9-13-5-1-3-7-15(13)19(17)20-16-8-4-2-6-14(16)10-12-18(20)22/h1-12,21-22H + +> +t19- or t19-,20-; m0 or m1 + +> +3-M + +$$$$ + + ACD/LABS03022623403D + + 22 25 0 0 1 0 0 0 0 0 1 V2000 + 786.3373-1510.6052 0.0004 O 0 0 0 0 0 0 0 0 0 0 0 0 + 714.4570-1552.1049 0.0002 C 0 0 0 0 0 0 0 0 0 0 0 0 + 642.5771-1510.6045 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 570.6968-1552.1042 -0.0002 C 0 0 0 0 0 0 0 0 0 0 0 0 + 570.6964-1635.1042 -0.0002 C 0 0 0 0 0 0 0 0 0 0 0 0 + 642.5762-1676.6045 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 714.4565-1635.1049 0.0002 C 0 0 0 0 0 0 0 0 0 0 0 0 + 786.3376-1427.6051 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 714.4577-1386.1049 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 642.5775-1427.6045 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 570.6975-1386.1042 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 570.6978-1303.1042 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 498.8179-1261.6040 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 426.9376-1303.1038 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 426.9373-1386.1038 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 498.8172-1427.6040 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 498.8168-1510.6038 -0.0004 C 0 0 0 0 0 0 0 0 0 0 0 0 + 426.9365-1552.1035 -0.0005 C 0 0 0 0 0 0 0 0 0 0 0 0 + 426.9361-1635.1035 -0.0005 C 0 0 0 0 0 0 0 0 0 0 0 0 + 498.8160-1676.6038 -0.0004 C 0 0 0 0 0 0 0 0 0 0 0 0 + 714.4580-1303.1049 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 642.5781-1261.6045 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 2 7 1 0 0 0 0 + 2 3 2 0 0 0 0 + 3 4 1 1 0 0 0 + 3 10 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 17 2 0 0 0 0 + 5 20 2 0 0 0 0 + 5 6 1 0 0 0 0 + 6 7 2 0 0 0 0 + 8 9 1 0 0 0 0 + 9 10 1 0 0 0 0 + 9 21 2 0 0 0 0 + 10 11 2 0 0 0 0 + 11 16 1 0 0 0 0 + 11 12 1 0 0 0 0 + 12 22 2 0 0 0 0 + 12 13 1 0 0 0 0 + 13 14 2 0 0 0 0 + 14 15 1 0 0 0 0 + 15 16 2 0 0 0 0 + 17 18 1 0 0 0 0 + 18 19 2 0 0 0 0 + 19 20 1 0 0 0 0 + 21 22 1 0 0 0 0 +M END +> +18 + +> +(1M)-[1,1'-binaphthalene]-2,2'-diol + +> +InChI=1S/C20H14O2/c21-17-11-9-13-5-1-3-7-15(13)19(17)20-16-8-4-2-6-14(16)10-12-18(20)22/h1-12,21-22H + +> +t19- or t19-,20-; m0 or m1 + +> +3-M + +$$$$ + + ACD/LABS03022623403D + + 22 25 0 0 1 0 0 0 0 0 1 V2000 + 786.3373-1510.6052 0.0004 O 0 0 0 0 0 0 0 0 0 0 0 0 + 714.4570-1552.1049 0.0002 C 0 0 0 0 0 0 0 0 0 0 0 0 + 642.5771-1510.6045 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 570.6968-1552.1042 -0.0002 C 0 0 0 0 0 0 0 0 0 0 0 0 + 570.6964-1635.1042 -0.0002 C 0 0 0 0 0 0 0 0 0 0 0 0 + 642.5762-1676.6045 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 714.4565-1635.1049 0.0002 C 0 0 0 0 0 0 0 0 0 0 0 0 + 786.3376-1427.6051 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 714.4577-1386.1049 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 642.5775-1427.6045 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 570.6975-1386.1042 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 570.6978-1303.1042 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 498.8179-1261.6040 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 426.9376-1303.1038 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 426.9373-1386.1038 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 498.8172-1427.6040 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 498.8168-1510.6038 -0.0004 C 0 0 0 0 0 0 0 0 0 0 0 0 + 426.9365-1552.1035 -0.0005 C 0 0 0 0 0 0 0 0 0 0 0 0 + 426.9361-1635.1035 -0.0005 C 0 0 0 0 0 0 0 0 0 0 0 0 + 498.8160-1676.6038 -0.0004 C 0 0 0 0 0 0 0 0 0 0 0 0 + 714.4580-1303.1049 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 642.5781-1261.6045 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 2 7 1 0 0 0 0 + 2 3 2 0 0 0 0 + 3 4 1 6 0 0 0 + 3 10 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 17 2 0 0 0 0 + 5 20 2 0 0 0 0 + 5 6 1 0 0 0 0 + 6 7 2 0 0 0 0 + 8 9 1 0 0 0 0 + 9 10 1 0 0 0 0 + 9 21 2 0 0 0 0 + 10 11 2 0 0 0 0 + 11 16 1 0 0 0 0 + 11 12 1 0 0 0 0 + 12 22 2 0 0 0 0 + 12 13 1 0 0 0 0 + 13 14 2 0 0 0 0 + 14 15 1 0 0 0 0 + 15 16 2 0 0 0 0 + 17 18 1 0 0 0 0 + 18 19 2 0 0 0 0 + 19 20 1 0 0 0 0 + 21 22 1 0 0 0 0 +M END +> +19 + +> +(1P)-[1,1'-binaphthalene]-2,2'-diol + +> +InChI=1S/C20H14O2/c21-17-11-9-13-5-1-3-7-15(13)19(17)20-16-8-4-2-6-14(16)10-12-18(20)22/h1-12,21-22H + +> +t19- or t19-,20-; m1 or m0 + +> +3-P + +$$$$ + + ACD/LABS03022623403D + + 22 25 0 0 1 0 0 0 0 0 1 V2000 + 786.3373-1510.6052 0.0004 O 0 0 0 0 0 0 0 0 0 0 0 0 + 714.4570-1552.1049 0.0002 C 0 0 0 0 0 0 0 0 0 0 0 0 + 642.5771-1510.6045 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 570.6968-1552.1042 -0.0002 C 0 0 0 0 0 0 0 0 0 0 0 0 + 570.6964-1635.1042 -0.0002 C 0 0 0 0 0 0 0 0 0 0 0 0 + 642.5762-1676.6045 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 714.4565-1635.1049 0.0002 C 0 0 0 0 0 0 0 0 0 0 0 0 + 786.3376-1427.6051 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 714.4577-1386.1049 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 642.5775-1427.6045 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 570.6975-1386.1042 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 570.6978-1303.1042 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 498.8179-1261.6040 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 426.9376-1303.1038 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 426.9373-1386.1038 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 498.8172-1427.6040 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 498.8168-1510.6038 -0.0004 C 0 0 0 0 0 0 0 0 0 0 0 0 + 426.9365-1552.1035 -0.0005 C 0 0 0 0 0 0 0 0 0 0 0 0 + 426.9361-1635.1035 -0.0005 C 0 0 0 0 0 0 0 0 0 0 0 0 + 498.8160-1676.6038 -0.0004 C 0 0 0 0 0 0 0 0 0 0 0 0 + 714.4580-1303.1049 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 642.5781-1261.6045 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 2 7 1 0 0 0 0 + 2 3 2 0 0 0 0 + 3 4 1 6 0 0 0 + 3 10 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 17 2 0 0 0 0 + 5 20 2 0 0 0 0 + 5 6 1 0 0 0 0 + 6 7 2 0 0 0 0 + 8 9 1 0 0 0 0 + 10 9 1 6 0 0 0 + 9 21 2 0 0 0 0 + 10 11 2 0 0 0 0 + 11 16 1 0 0 0 0 + 11 12 1 0 0 0 0 + 12 22 2 0 0 0 0 + 12 13 1 0 0 0 0 + 13 14 2 0 0 0 0 + 14 15 1 0 0 0 0 + 15 16 2 0 0 0 0 + 17 18 1 0 0 0 0 + 18 19 2 0 0 0 0 + 19 20 1 0 0 0 0 + 21 22 1 0 0 0 0 +M END +> +20 + +> +(1P)-[1,1'-binaphthalene]-2,2'-diol + +> +InChI=1S/C20H14O2/c21-17-11-9-13-5-1-3-7-15(13)19(17)20-16-8-4-2-6-14(16)10-12-18(20)22/h1-12,21-22H + +> +t19- or t19-,20-; m1 or m0 + +> +3-P + +$$$$ + + ACD/LABS03022623403D + + 22 25 0 0 1 0 0 0 0 0 1 V2000 + 786.3373-1510.6052 0.0004 O 0 0 0 0 0 0 0 0 0 0 0 0 + 714.4570-1552.1049 0.0002 C 0 0 0 0 0 0 0 0 0 0 0 0 + 642.5771-1510.6045 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 570.6968-1552.1042 -0.0002 C 0 0 0 0 0 0 0 0 0 0 0 0 + 570.6964-1635.1042 -0.0002 C 0 0 0 0 0 0 0 0 0 0 0 0 + 642.5762-1676.6045 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 714.4565-1635.1049 0.0002 C 0 0 0 0 0 0 0 0 0 0 0 0 + 786.3376-1427.6051 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 714.4577-1386.1049 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 642.5775-1427.6045 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 570.6975-1386.1042 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 570.6978-1303.1042 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 498.8179-1261.6040 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 426.9376-1303.1038 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 426.9373-1386.1038 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 498.8172-1427.6040 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 498.8168-1510.6038 -0.0004 C 0 0 0 0 0 0 0 0 0 0 0 0 + 426.9365-1552.1035 -0.0005 C 0 0 0 0 0 0 0 0 0 0 0 0 + 426.9361-1635.1035 -0.0005 C 0 0 0 0 0 0 0 0 0 0 0 0 + 498.8160-1676.6038 -0.0004 C 0 0 0 0 0 0 0 0 0 0 0 0 + 714.4580-1303.1049 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 642.5781-1261.6045 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 2 7 2 0 0 0 0 + 3 2 1 1 0 0 0 + 3 4 2 0 0 0 0 + 3 10 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 17 1 0 0 0 0 + 5 20 1 0 0 0 0 + 5 6 2 0 0 0 0 + 6 7 1 0 0 0 0 + 8 9 1 0 0 0 0 + 10 9 1 6 0 0 0 + 9 21 2 0 0 0 0 + 10 11 2 0 0 0 0 + 11 16 1 0 0 0 0 + 11 12 1 0 0 0 0 + 12 22 2 0 0 0 0 + 12 13 1 0 0 0 0 + 13 14 2 0 0 0 0 + 14 15 1 0 0 0 0 + 15 16 2 0 0 0 0 + 17 18 2 0 0 0 0 + 18 19 1 0 0 0 0 + 19 20 2 0 0 0 0 + 21 22 1 0 0 0 0 +M END +> +21 + +> +(1P)-[1,1'-binaphthalene]-2,2'-diol + +> +InChI=1S/C20H14O2/c21-17-11-9-13-5-1-3-7-15(13)19(17)20-16-8-4-2-6-14(16)10-12-18(20)22/h1-12,21-22H + +> +t19- or t19-,20-; m1 or m0 + +> +3-P + +$$$$ + + ACD/LABS03022623403D + + 23 26 0 0 1 0 0 0 0 0 1 V2000 + 3987.9617-1521.4817 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 3938.6409-1454.1653 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3859.3274-1479.4922 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3859.3274-1563.4712 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3938.6409-1588.7982 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3776.0149-1479.4922 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3703.3662-1438.1692 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3631.3843-1479.4922 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3631.3843-1563.4712 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3703.3662-1604.7942 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3776.0149-1563.4712 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3703.3662-1354.1902 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3631.3843-1312.8672 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3559.4021-1354.1902 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3559.4021-1438.1692 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3559.4021-1604.7942 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3559.4021-1688.1067 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3631.3843-1729.4297 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3703.3662-1688.1067 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3486.7537-1312.8672 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 3414.5718-1355.7886 -0.0002 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3486.7537-1729.4297 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 3414.7717-1688.1067 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 5 1 0 0 0 0 + 2 3 1 0 0 0 0 + 3 6 1 0 0 0 0 + 3 4 1 0 0 0 0 + 4 11 1 0 0 0 0 + 4 5 1 0 0 0 0 + 6 7 1 0 0 0 0 + 7 12 2 0 0 0 0 + 8 7 1 1 0 0 0 + 8 15 2 0 0 0 0 + 8 9 1 0 0 0 0 + 9 10 2 0 0 0 0 + 9 16 1 1 0 0 0 + 10 19 1 0 0 0 0 + 10 11 1 0 0 0 0 + 13 12 1 1 0 0 0 + 13 14 2 0 0 0 0 + 14 15 1 0 0 0 0 + 14 20 1 0 0 0 0 + 16 17 2 0 0 0 0 + 18 17 1 1 0 0 0 + 17 22 1 0 0 0 0 + 18 19 2 0 0 0 0 + 20 21 1 0 0 0 0 + 22 23 1 0 0 0 0 +M END +> +22 + +> +(8aM)-7,10-dimethoxy-1,3,3a,4,13,13a-hexahydrodibenzo[4,5:6,7]cycloocta[1,2-c]furan + +> +InChI=1S/C20H22O3/c1-21-17-5-3-13-7-15-11-23-12-16(15)8-14-4-6-18(22-2)10-20(14)19(13)9-17/h3-6,9-10,15-16H,7-8,11-12H2,1-2H3 + +> +cyclic + +> +4-M + +$$$$ + + ACD/LABS03022623403D + + 23 26 0 0 1 0 0 0 0 0 1 V2000 + 3987.9617-1521.4817 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 3938.6409-1454.1653 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3859.3274-1479.4922 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3859.3274-1563.4712 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3938.6409-1588.7982 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3776.0149-1479.4922 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3703.3662-1438.1692 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3631.3843-1479.4922 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3631.3843-1563.4712 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3703.3662-1604.7942 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3776.0149-1563.4712 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3703.3662-1354.1902 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3631.3843-1312.8672 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3559.4021-1354.1902 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3559.4021-1438.1692 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3559.4021-1604.7942 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3559.4021-1688.1067 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3631.3843-1729.4297 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3703.3662-1688.1067 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3486.7537-1312.8672 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 3414.5718-1355.7886 -0.0002 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3486.7537-1729.4297 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 3414.7717-1688.1067 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 5 1 0 0 0 0 + 2 3 1 0 0 0 0 + 3 6 1 0 0 0 0 + 3 4 1 0 0 0 0 + 4 11 1 0 0 0 0 + 4 5 1 0 0 0 0 + 6 7 1 0 0 0 0 + 7 12 2 0 0 0 0 + 8 7 1 1 0 0 0 + 8 15 2 0 0 0 0 + 8 9 1 0 0 0 0 + 9 10 2 0 0 0 0 + 9 16 1 0 0 0 0 + 10 19 1 0 0 0 0 + 10 11 1 0 0 0 0 + 12 13 1 0 0 0 0 + 13 14 2 0 0 0 0 + 14 15 1 0 0 0 0 + 14 20 1 0 0 0 0 + 16 17 2 0 0 0 0 + 17 18 1 0 0 0 0 + 17 22 1 0 0 0 0 + 18 19 2 0 0 0 0 + 20 21 1 0 0 0 0 + 22 23 1 0 0 0 0 +M END +> +23 + +> +(8aM)-7,10-dimethoxy-1,3,3a,4,13,13a-hexahydrodibenzo[4,5:6,7]cycloocta[1,2-c]furan + +> +InChI=1S/C20H22O3/c1-21-17-5-3-13-7-15-11-23-12-16(15)8-14-4-6-18(22-2)10-20(14)19(13)9-17/h3-6,9-10,15-16H,7-8,11-12H2,1-2H3 + +> +cyclic + +> +4-M + +$$$$ + + ACD/LABS03022623403D + + 23 26 0 0 1 0 0 0 0 0 1 V2000 + 3987.9617-1521.4817 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 3938.6409-1454.1653 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3859.3274-1479.4922 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3859.3274-1563.4712 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3938.6409-1588.7982 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3776.0149-1479.4922 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3703.3662-1438.1692 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3631.3843-1479.4922 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3631.3843-1563.4712 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3703.3662-1604.7942 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3776.0149-1563.4712 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3703.3662-1354.1902 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3631.3843-1312.8672 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3559.4021-1354.1902 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3559.4021-1438.1692 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3559.4021-1604.7942 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3559.4021-1688.1067 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3631.3843-1729.4297 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3703.3662-1688.1067 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3486.7537-1312.8672 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 3414.5718-1355.7886 -0.0002 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3486.7537-1729.4297 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 3414.7717-1688.1067 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 5 1 0 0 0 0 + 2 3 1 0 0 0 0 + 3 6 1 0 0 0 0 + 3 4 1 0 0 0 0 + 4 11 1 0 0 0 0 + 4 5 1 0 0 0 0 + 6 7 1 0 0 0 0 + 7 12 2 0 0 0 0 + 8 7 1 1 0 0 0 + 8 15 2 0 0 0 0 + 8 9 1 0 0 0 0 + 9 10 1 6 0 0 0 + 9 16 2 0 0 0 0 + 10 19 2 0 0 0 0 + 10 11 1 0 0 0 0 + 12 13 1 0 0 0 0 + 13 14 2 0 0 0 0 + 14 15 1 0 0 0 0 + 14 20 1 0 0 0 0 + 16 17 1 0 0 0 0 + 17 18 2 0 0 0 0 + 17 22 1 0 0 0 0 + 18 19 1 0 0 0 0 + 20 21 1 0 0 0 0 + 22 23 1 0 0 0 0 +M END +> +24 + +> +(8aM)-7,10-dimethoxy-1,3,3a,4,13,13a-hexahydrodibenzo[4,5:6,7]cycloocta[1,2-c]furan + +> +InChI=1S/C20H22O3/c1-21-17-5-3-13-7-15-11-23-12-16(15)8-14-4-6-18(22-2)10-20(14)19(13)9-17/h3-6,9-10,15-16H,7-8,11-12H2,1-2H3 + +> +cyclic + +> +4-M + +$$$$ + + ACD/LABS03022623403D + + 23 26 0 0 1 0 0 0 0 0 1 V2000 + 3987.9617-1521.4817 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 3938.6409-1454.1653 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3859.3274-1479.4922 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3859.3274-1563.4712 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3938.6409-1588.7982 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3776.0149-1479.4922 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3703.3662-1438.1692 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3631.3843-1479.4922 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3631.3843-1563.4712 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3703.3662-1604.7942 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3776.0149-1563.4712 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3703.3662-1354.1902 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3631.3843-1312.8672 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3559.4021-1354.1902 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3559.4021-1438.1692 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3559.4021-1604.7942 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3559.4021-1688.1067 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3631.3843-1729.4297 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3703.3662-1688.1067 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3486.7537-1312.8672 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 3414.5718-1355.7886 -0.0002 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3486.7537-1729.4297 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 3414.7717-1688.1067 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 5 1 0 0 0 0 + 2 3 1 0 0 0 0 + 3 6 1 0 0 0 0 + 3 4 1 0 0 0 0 + 4 11 1 0 0 0 0 + 4 5 1 0 0 0 0 + 6 7 1 0 0 0 0 + 7 12 2 0 0 0 0 + 7 8 1 0 0 0 0 + 8 15 2 0 0 0 0 + 8 9 1 0 0 0 0 + 9 10 1 6 0 0 0 + 9 16 2 0 0 0 0 + 10 19 2 0 0 0 0 + 10 11 1 0 0 0 0 + 12 13 1 0 0 0 0 + 13 14 2 0 0 0 0 + 14 15 1 0 0 0 0 + 14 20 1 0 0 0 0 + 16 17 1 0 0 0 0 + 17 18 2 0 0 0 0 + 17 22 1 0 0 0 0 + 18 19 1 0 0 0 0 + 20 21 1 0 0 0 0 + 22 23 1 0 0 0 0 +M END +> +25 + +> +(8aM)-7,10-dimethoxy-1,3,3a,4,13,13a-hexahydrodibenzo[4,5:6,7]cycloocta[1,2-c]furan + +> +InChI=1S/C20H22O3/c1-21-17-5-3-13-7-15-11-23-12-16(15)8-14-4-6-18(22-2)10-20(14)19(13)9-17/h3-6,9-10,15-16H,7-8,11-12H2,1-2H3 + +> +cyclic + +> +4-M + +$$$$ + + ACD/LABS03022623403D + + 23 26 0 0 1 0 0 0 0 0 1 V2000 + 3987.9617-1521.4817 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 3938.6409-1454.1653 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3859.3274-1479.4922 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3859.3274-1563.4712 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3938.6409-1588.7982 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3776.0149-1479.4922 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3703.3662-1438.1692 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3631.3843-1479.4922 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3631.3843-1563.4712 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3703.3662-1604.7942 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3776.0149-1563.4712 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3703.3662-1354.1902 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3631.3843-1312.8672 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3559.4021-1354.1902 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3559.4021-1438.1692 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3559.4021-1604.7942 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3559.4021-1688.1067 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3631.3843-1729.4297 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3703.3662-1688.1067 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3486.7537-1312.8672 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 3414.5718-1355.7886 -0.0002 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3486.7537-1729.4297 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 3414.7717-1688.1067 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 5 1 0 0 0 0 + 2 3 1 0 0 0 0 + 3 6 1 0 0 0 0 + 3 4 1 0 0 0 0 + 4 11 1 0 0 0 0 + 4 5 1 0 0 0 0 + 6 7 1 0 0 0 0 + 7 12 2 0 0 0 0 + 7 8 1 0 0 0 0 + 8 15 2 0 0 0 0 + 8 9 1 0 0 0 0 + 9 10 1 1 0 0 0 + 9 16 2 0 0 0 0 + 10 19 2 0 0 0 0 + 10 11 1 0 0 0 0 + 12 13 1 0 0 0 0 + 13 14 2 0 0 0 0 + 14 15 1 0 0 0 0 + 14 20 1 0 0 0 0 + 16 17 1 0 0 0 0 + 17 18 2 0 0 0 0 + 17 22 1 0 0 0 0 + 18 19 1 0 0 0 0 + 20 21 1 0 0 0 0 + 22 23 1 0 0 0 0 +M END +> +26 + +> +(8a%{P})-7,10-dimethoxy-1,3,3a,4,13,13a-hexahydrodibenzo[4,5:6,7]cycloocta[1,2-%{c}]furan + +> +InChI=1S/C20H22O3/c1-21-17-5-3-13-7-15-11-23-12-16(15)8-14-4-6-18(22-2)10-20(14)19(13)9-17/h3-6,9-10,15-16H,7-8,11-12H2,1-2H3 + +> +cyclic + +> +4-P + +$$$$ + + ACD/LABS03022623402D + + 21 23 0 0 1 0 0 0 0 0 1 V2000 + 569.3500-2618.8357 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 569.3495-2701.8357 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 497.4701-2577.3354 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 497.4692-2743.3354 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 425.5898-2618.8350 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 425.5894-2701.8350 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 497.4704-2494.3352 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 564.6191-2445.5493 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 430.3222-2445.5488 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 538.9709-2366.6118 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 455.9710-2366.6113 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 641.2302-2577.3359 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 353.7098-2577.3347 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 645.8053-2462.8064 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 701.3433-2401.1257 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 594.5090-2304.9309 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 675.6953-2322.1880 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 351.3845-2471.1968 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 599.7307-2505.4556 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 682.7299-2649.2161 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 713.1105-2535.8364 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 3 2 0 0 0 0 + 1 12 1 0 0 0 0 + 2 4 2 0 0 0 0 + 3 5 1 0 0 0 0 + 3 7 1 0 0 0 0 + 4 6 1 0 0 0 0 + 5 6 2 0 0 0 0 + 5 13 1 0 0 0 0 + 7 8 1 1 0 0 0 + 7 9 1 6 0 0 0 + 8 14 1 0 0 0 0 + 8 10 2 0 0 0 0 + 9 11 2 0 0 0 0 + 9 18 1 0 0 0 0 + 10 11 1 0 0 0 0 + 10 16 1 0 0 0 0 + 12 19 1 0 0 0 0 + 12 20 1 0 0 0 0 + 12 21 1 0 0 0 0 + 14 15 2 0 0 0 0 + 15 17 1 0 0 0 0 + 16 17 2 0 0 0 0 +M END +> +27 + +> +(1%{M})-1-(2-%{tert}-butyl-6-methylphenyl)-2-methyl-1%{H}-indole + +> +InChI=1S/C20H23N/c1-14-9-8-11-17(20(3,4)5)19(14)21-15(2)13-16-10-6-7-12-18(16)21/h6-13H,1-5H3 + +> +C-N bond + +> +5-M + +$$$$ + + ACD/LABS03022623402D + + 21 23 0 0 1 0 0 0 0 0 1 V2000 + 648.4788-3218.2957 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 648.8419-3301.5486 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 576.9389-3177.1064 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 576.7898-3342.7427 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 505.4301-3218.4766 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 505.7932-3301.7295 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 576.9390-3094.5864 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 510.0637-3046.1812 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 643.3132-3045.7405 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 535.6176-2967.2646 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 618.3402-2966.7300 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 720.3550-3177.6448 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 433.8858-3177.3005 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 428.8904-3063.4988 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 373.2622-3001.8831 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 480.0027-2905.6533 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 398.8163-2922.9668 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 722.2295-3071.2947 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 678.6306-3105.4209 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 761.8970-3248.6235 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 792.0487-3135.7485 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 3 2 0 0 0 0 + 1 12 1 0 0 0 0 + 2 4 2 0 0 0 0 + 3 5 1 0 0 0 0 + 3 7 1 0 0 0 0 + 4 6 1 0 0 0 0 + 5 6 2 0 0 0 0 + 5 13 1 0 0 0 0 + 7 8 1 1 0 0 0 + 7 9 1 6 0 0 0 + 8 14 1 0 0 0 0 + 8 10 2 0 0 0 0 + 9 11 2 0 0 0 0 + 9 18 1 0 0 0 0 + 10 11 1 0 0 0 0 + 10 16 1 0 0 0 0 + 12 19 1 0 0 0 0 + 12 20 1 0 0 0 0 + 12 21 1 0 0 0 0 + 14 15 2 0 0 0 0 + 15 17 1 0 0 0 0 + 16 17 2 0 0 0 0 +M END +> +28 + +> +(1%{M})-1-(2-%{tert}-butyl-6-methylphenyl)-2-methyl-1%{H}-indole + +> +InChI=1S/C20H23N/c1-14-9-8-11-17(20(3,4)5)19(14)21-15(2)13-16-10-6-7-12-18(16)21/h6-13H,1-5H3 + +> +C-N bond + +> +??? + +> +5-M + +$$$$ + + ACD/LABS03022623402D + + 22 25 0 0 1 0 0 0 0 0 1 V2000 + 1505.8762-2602.5000 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 1438.7273-2553.7146 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1573.0249-2553.7100 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1464.3730-2474.7769 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1547.3696-2474.7642 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1357.5464-2570.9697 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1302.0117-2509.2869 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1408.8398-2413.1021 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1327.6592-2430.3569 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1651.9636-2579.3552 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1505.8779-2685.4993 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 1573.0269-2734.2847 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1438.7294-2734.2893 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1547.3811-2813.2224 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1464.3845-2813.2351 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1654.2078-2717.0295 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1709.7424-2778.7126 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1602.9143-2874.8972 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1684.0950-2857.6423 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1359.7906-2708.6438 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1713.6427-2523.8152 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1298.1115-2764.1836 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 1 0 0 0 + 1 3 1 6 0 0 0 + 1 11 1 0 0 0 0 + 2 6 1 0 0 0 0 + 2 4 2 0 0 0 0 + 3 5 2 0 0 0 0 + 3 10 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 8 1 0 0 0 0 + 6 7 2 0 0 0 0 + 7 9 1 0 0 0 0 + 8 9 2 0 0 0 0 + 10 21 1 0 0 0 0 + 11 12 1 1 0 0 0 + 11 13 1 6 0 0 0 + 12 16 1 0 0 0 0 + 12 14 2 0 0 0 0 + 13 15 2 0 0 0 0 + 13 20 1 0 0 0 0 + 14 15 1 0 0 0 0 + 14 18 1 0 0 0 0 + 16 17 2 0 0 0 0 + 17 19 1 0 0 0 0 + 18 19 2 0 0 0 0 + 20 22 1 0 0 0 0 +M END +> +29 + +> +(1%{M})-2,2'-diethyl-1,1'-biindole + +> +InChI=1S/C20H20N2/c1-3-17-13-15-9-5-7-11-19(15)21(17)22-18(4-2)14-16-10-6-8-12-20(16)22/h5-14H,3-4H2,1-2H3 + +> +N-N bond + +> +6-M + +$$$$ + + ACD/LABS03022623402D + + 22 25 0 0 1 0 0 0 0 0 1 V2000 + 2193.7524-2655.0000 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 2126.6035-2606.2146 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2260.9011-2606.2100 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2152.2493-2527.2769 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2235.2458-2527.2642 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2045.4226-2623.4697 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1989.8879-2561.7869 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2096.7161-2465.6021 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2015.5354-2482.8569 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2339.8398-2631.8552 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2193.7542-2737.9993 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 2260.9031-2786.7847 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2126.6055-2786.7893 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2235.2573-2865.7224 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2152.2607-2865.7351 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2342.0840-2769.5295 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2397.6187-2831.2126 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2290.7905-2927.3972 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2371.9712-2910.1423 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2047.6670-2761.1438 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2401.5190-2576.3152 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1985.9878-2816.6836 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 3 1 0 0 0 0 + 1 11 1 0 0 0 0 + 2 6 1 0 0 0 0 + 2 4 2 0 0 0 0 + 3 5 2 0 0 0 0 + 3 10 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 8 1 0 0 0 0 + 6 7 2 0 0 0 0 + 7 9 1 0 0 0 0 + 8 9 2 0 0 0 0 + 10 21 1 0 0 0 0 + 11 12 1 6 0 0 0 + 11 13 1 1 0 0 0 + 12 16 1 0 0 0 0 + 12 14 2 0 0 0 0 + 13 15 2 0 0 0 0 + 13 20 1 0 0 0 0 + 14 15 1 0 0 0 0 + 14 18 1 0 0 0 0 + 16 17 2 0 0 0 0 + 17 19 1 0 0 0 0 + 18 19 2 0 0 0 0 + 20 22 1 0 0 0 0 +M END +> +30 + +> +(1%{P})-2,2'-diethyl-1,1'-biindole + +> +InChI=1S/C20H20N2/c1-3-17-13-15-9-5-7-11-19(15)21(17)22-18(4-2)14-16-10-6-8-12-20(16)22/h5-14H,3-4H2,1-2H3 + +> +N-N bond + +> +6-P + +$$$$ + + ACD/LABS03022623402D + + 22 25 0 0 1 0 0 0 0 0 1 V2000 + 2193.7524-2655.0000 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 2126.6035-2606.2146 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2260.9011-2606.2100 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2152.2493-2527.2769 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2235.2458-2527.2642 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2045.4226-2623.4697 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1989.8879-2561.7869 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2096.7161-2465.6021 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2015.5354-2482.8569 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2339.8398-2631.8552 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2193.7542-2737.9993 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 2260.9031-2786.7847 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2126.6055-2786.7893 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2235.2573-2865.7224 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2152.2607-2865.7351 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2342.0840-2769.5295 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2397.6187-2831.2126 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2290.7905-2927.3972 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2371.9712-2910.1423 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2047.6670-2761.1438 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2401.5190-2576.3152 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1985.9878-2816.6836 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 3 1 1 1 0 0 0 + 1 11 1 0 0 0 0 + 2 6 1 0 0 0 0 + 2 4 2 0 0 0 0 + 3 5 1 0 0 0 0 + 3 10 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 8 1 0 0 0 0 + 6 7 2 0 0 0 0 + 7 9 1 0 0 0 0 + 8 9 2 0 0 0 0 + 10 21 1 0 0 0 0 + 11 12 1 6 0 0 0 + 11 13 1 1 0 0 0 + 12 16 1 0 0 0 0 + 12 14 2 0 0 0 0 + 13 15 2 0 0 0 0 + 13 20 1 0 0 0 0 + 14 15 1 0 0 0 0 + 14 18 1 0 0 0 0 + 16 17 2 0 0 0 0 + 17 19 1 0 0 0 0 + 18 19 2 0 0 0 0 + 20 22 1 0 0 0 0 +M END +> +31 + +> +(2%{R})-2,2'-diethyl-2,3-dihydro-1,1'-biindole + +> +InChI=1S/C20H22N2/c1-3-17-13-15-9-5-7-11-19(15)21(17)22-18(4-2)14-16-10-6-8-12-20(16)22/h5-13,18H,3-4,14H2,1-2H3/t18-/m1/s1 + +> +no atropisomers? wedge direction? Absent double bond? + +> +InChI=1S/C20H22N2/c1-3-17-13-15-9-5-7-11-19(15)21(17)22-18(4-2)14-16-10-6-8-12-20(16)22/h5-13,18H,3-4,14H2,1-2H3/t18-/m1/s1 + +> +7-0 + +$$$$ + + ACD/LABS03022623402D + + 18 20 0 0 1 0 0 0 0 0 1 V2000 + 1505.8762-2602.5000 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 1438.7273-2553.7146 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1573.0249-2553.7100 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1464.3730-2474.7769 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1547.3696-2474.7642 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1357.5464-2570.9697 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1302.0117-2509.2869 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1408.8398-2413.1021 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1327.6592-2430.3569 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1651.9636-2579.3552 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1505.8779-2685.4993 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 1573.0269-2734.2847 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1438.7294-2734.2893 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1547.3811-2813.2224 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1464.3845-2813.2351 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1654.2078-2717.0295 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1359.7906-2708.6438 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1298.1115-2764.1836 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 1 0 0 0 + 1 3 1 6 0 0 0 + 1 11 1 0 0 0 0 + 2 6 1 0 0 0 0 + 2 4 2 0 0 0 0 + 3 5 2 0 0 0 0 + 3 10 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 8 1 0 0 0 0 + 6 7 2 0 0 0 0 + 7 9 1 0 0 0 0 + 8 9 2 0 0 0 0 + 12 11 1 1 0 0 0 + 11 13 1 0 0 0 0 + 12 16 1 0 0 0 0 + 12 14 1 0 0 0 0 + 13 15 1 0 0 0 0 + 13 17 1 1 0 0 0 + 14 15 2 0 0 0 0 + 17 18 1 0 0 0 0 +M END +> +32 + +> +1-[(2%{R},5%{S})-2-ethyl-5-methyl-2,5-dihydro-1%{H}-pyrrol-1-yl]-2-methyl-1%{H}-indole + +> +InChI=1S/C16H20N2/c1-4-15-10-9-12(2)17(15)18-13(3)11-14-7-5-6-8-16(14)18/h5-12,15H,4H2,1-3H3/t12-,15+/m0/s1 + +> +no atropisomers, absent double bond? + +> +8-0 + +$$$$ + + ACD/LABS03022623402D + + 16 17 0 0 1 0 0 0 0 0 1 V2000 + 1505.8762-2602.5000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1505.8779-2685.4993 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 1573.0269-2734.2847 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1438.7294-2734.2893 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1547.3811-2813.2224 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1464.3845-2813.2351 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1654.2078-2717.0295 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1359.7906-2708.6438 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1298.1115-2764.1836 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1342.5314-2627.4583 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1433.9960-2561.0005 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1577.7590-2560.9946 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1433.9984-2477.9954 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1577.7576-2477.9966 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1505.8772-2436.4968 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1649.6403-2602.4927 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 11 1 0 0 0 0 + 1 12 2 0 0 0 0 + 2 3 1 1 0 0 0 + 2 4 1 0 0 0 0 + 3 7 2 0 0 0 0 + 3 5 1 0 0 0 0 + 4 6 1 0 0 0 0 + 4 8 2 0 0 0 0 + 5 6 2 0 0 0 0 + 8 9 1 0 0 0 0 + 8 10 1 0 0 0 0 + 11 13 2 0 0 0 0 + 12 14 1 0 0 0 0 + 12 16 1 0 0 0 0 + 13 15 1 0 0 0 0 + 14 15 2 0 0 0 0 +M END +> +33 + +> +(1%{P})-1-(2-methylphenyl)-5-(propan-2-ylidene)-1,5-dihydro-2%{H}-pyrrol-2-one + +> +InChI=1S/C14H15NO/c1-10(2)12-8-9-14(16)15(12)13-7-5-4-6-11(13)3/h4-9H,1-3H3 + +> +C-N bond + +> +9-P + +$$$$ + + ACD/LABS03022623402D + + 12 13 0 0 1 0 0 0 0 0 1 V2000 + 3027.8818-2490.5000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3027.8818-2573.5000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2955.9961-2449.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2955.9961-2615.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2884.1182-2490.5000 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 2884.1182-2573.5000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2955.9941-2698.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3027.8728-2739.5027 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2884.1096-2739.5024 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3027.8667-2822.5078 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 2884.1077-2822.5005 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2955.9863-2864.0034 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 3 2 0 0 0 0 + 2 4 2 0 0 0 0 + 3 5 1 0 0 0 0 + 4 6 1 1 0 0 0 + 4 7 1 0 0 0 0 + 5 6 2 0 0 0 0 + 7 8 1 0 0 0 0 + 7 9 2 0 0 0 0 + 8 10 2 0 0 0 0 + 9 11 1 0 0 0 0 + 10 12 1 0 0 0 0 + 11 12 2 0 0 0 0 +M END +> +34 + +> +(3%{M})-3,3'-bipyridine + +> +InChI=1S/C10H8N2/c1-3-9(7-11-5-1)10-4-2-6-12-8-10/h1-8H + +> +not sure, we can demand more substituents + +> +10-M + +$$$$ + + ACD/LABS03022623403D + + 12 13 0 0 1 0 0 0 0 0 1 V2000 + 1682.1162 -181.4966 0.0002 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1682.1123 -264.4966 0.0002 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1754.0039 -140.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1753.9961 -306.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1825.8799 -181.5034 -0.0002 N 0 0 0 0 0 0 0 0 0 0 0 0 + 1825.8760 -264.5034 -0.0002 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1753.9941 -389.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1825.8728 -430.5027 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1682.1096 -430.5024 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1825.8667 -513.5078 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 1682.1077 -513.5005 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1753.9863 -555.0034 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 3 2 0 0 0 0 + 2 4 2 0 0 0 0 + 3 5 1 0 0 0 0 + 4 6 1 1 0 0 0 + 4 7 1 0 0 0 0 + 5 6 2 0 0 0 0 + 7 8 1 0 0 0 0 + 7 9 2 0 0 0 0 + 8 10 2 0 0 0 0 + 9 11 1 0 0 0 0 + 10 12 1 0 0 0 0 + 11 12 2 0 0 0 0 +M END +> +35 + +> +(3%{M})-3,3'-bipyridine + +> +InChI=1S/C10H8N2/c1-3-9(7-11-5-1)10-4-2-6-12-8-10/h1-8H + +> +not sure, we can demand more substituents + +> +10-M + +$$$$ + + ACD/LABS03022623403D + + 16 17 0 0 1 0 0 0 0 0 1 V2000 + 1768.7833-2147.4492 0.0002 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1696.9033-2105.9487 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1625.0229-2147.4485 -0.0002 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1625.0225-2230.4482 -0.0002 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1696.9023-2271.9487 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1768.7828-2230.4492 0.0002 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1768.7838-1981.4491 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1696.9036-2022.9487 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1625.0238-1981.4485 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1625.0239-1898.4486 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1768.7843-1898.4491 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1696.9044-1856.9489 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1840.6636-2022.9497 0.0000 Br 0 0 0 0 0 0 0 0 0 0 0 0 + 1553.1434-2022.9480 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 1553.1431-2105.9478 -0.0002 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 1840.6636-2105.9497 0.0002 Br 0 0 0 0 0 0 0 0 0 0 0 0 + 1 6 1 0 0 0 0 + 1 2 2 0 0 0 0 + 1 16 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 8 1 0 0 0 0 + 3 4 2 0 0 0 0 + 3 15 1 0 0 0 0 + 4 5 1 0 0 0 0 + 5 6 2 0 0 0 0 + 8 7 1 6 0 0 0 + 7 11 2 0 0 0 0 + 7 13 1 0 0 0 0 + 8 9 2 0 0 0 0 + 9 10 1 0 0 0 0 + 9 14 1 0 0 0 0 + 10 12 2 0 0 0 0 + 11 12 1 0 0 0 0 +M END +> +36 + +> +(1%{P})-2,2'-dibromo-6,6'-dichloro-1,1'-biphenyl + +> +InChI=1S/C12H6Br2Cl2/c13-7-3-1-5-9(15)11(7)12-8(14)4-2-6-10(12)16/h1-6H + +> +2-P + +$$$$ + + ACD/LABS03022623403D + + 22 23 0 0 0 0 0 0 0 0 1 V2000 + 403.3425 -482.1330 -114.1859 C 0 0 0 0 0 0 0 0 0 0 0 0 + 353.5771 -440.0458 -57.1438 C 0 0 0 0 0 0 0 0 0 0 0 0 + 304.7174 -484.9386 -1.5249 C 0 0 0 0 0 0 0 0 0 0 0 0 + 305.9860 -571.4039 -2.6112 C 0 0 0 0 0 0 0 0 0 0 0 0 + 356.2111 -613.1661 -59.3073 C 0 0 0 0 0 0 0 0 0 0 0 0 + 404.9135 -568.6181 -115.1958 C 0 0 0 0 0 0 0 0 0 0 0 0 + 428.4961 -305.2857 -65.8171 C 0 0 0 0 0 0 0 0 0 0 0 0 + 353.7670 -347.6302 -54.8419 C 0 0 0 0 0 0 0 0 0 0 0 0 + 280.7309 -303.0066 -41.4023 C 0 0 0 0 0 0 0 0 0 0 0 0 + 282.7693 -216.5248 -38.2930 C 0 0 0 0 0 0 0 0 0 0 0 0 + 430.5862 -218.9056 -62.9605 C 0 0 0 0 0 0 0 0 0 0 0 0 + 357.7472 -174.5399 -49.0143 C 0 0 0 0 0 0 0 0 0 0 0 0 + 527.4489 -365.5167 -84.6889 Br 0 0 0 0 0 0 0 0 0 0 0 0 + 187.5525 -354.7539 -28.4471 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 242.5731 -433.3481 69.0891 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 469.4398 -421.7666 -189.9211 Br 0 0 0 0 0 0 0 0 0 0 0 0 + 266.8408 -607.1929 42.1508 H 0 0 0 0 0 0 0 0 0 0 0 0 + 357.3781 -682.4103 -60.0046 H 0 0 0 0 0 0 0 0 0 0 0 0 + 445.3757 -602.1533 -160.6899 H 0 0 0 0 0 0 0 0 0 0 0 0 + 224.3030 -180.7813 -27.1965 H 0 0 0 0 0 0 0 0 0 0 0 0 + 490.7367 -185.4303 -71.7363 H 0 0 0 0 0 0 0 0 0 0 0 0 + 359.3899 -105.2715 -46.3666 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 6 1 0 0 0 0 + 1 2 2 0 0 0 0 + 1 16 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 8 1 0 0 0 0 + 3 4 2 0 0 0 0 + 3 15 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 17 1 0 0 0 0 + 5 6 2 0 0 0 0 + 5 18 1 0 0 0 0 + 6 19 1 0 0 0 0 + 7 8 1 0 0 0 0 + 7 11 2 0 0 0 0 + 7 13 1 0 0 0 0 + 8 9 2 0 0 0 0 + 9 10 1 0 0 0 0 + 9 14 1 0 0 0 0 + 10 12 2 0 0 0 0 + 10 20 1 0 0 0 0 + 11 12 1 0 0 0 0 + 11 21 1 0 0 0 0 + 12 22 1 0 0 0 0 +M END +> +37 + +> +(1%{M})-2,2'-dibromo-6,6'-dichloro-1,1'-biphenyl + +> +InChI=1S/C12H6Br2Cl2/c13-7-3-1-5-9(15)11(7)12-8(14)4-2-6-10(12)16/h1-6H + +> +3D + +> +2-M + +$$$$ + + ACD/LABS03022623403D + + 22 23 0 0 0 0 0 0 0 0 1 V2000 + 925.4636 -490.1227 -10.8242 C 0 0 0 0 0 0 0 0 0 0 0 0 + 975.9981 -445.5172 -65.1364 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1025.8662 -487.7090 -121.9026 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1025.2061 -574.1543 -124.3303 C 0 0 0 0 0 0 0 0 0 0 0 0 + 974.6407 -618.5795 -70.0677 C 0 0 0 0 0 0 0 0 0 0 0 0 + 924.7480 -576.5359 -13.3191 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1051.2555 -310.2320 -71.0543 C 0 0 0 0 0 0 0 0 0 0 0 0 + 976.6850 -353.3560 -62.5096 C 0 0 0 0 0 0 0 0 0 0 0 0 + 902.8052 -309.6276 -51.5178 C 0 0 0 0 0 0 0 0 0 0 0 0 + 903.4716 -223.1728 -48.9403 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1051.9537 -223.7854 -68.5985 C 0 0 0 0 0 0 0 0 0 0 0 0 + 978.0772 -180.2498 -57.4839 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1151.4659 -369.2850 -86.2557 Br 0 0 0 0 0 0 0 0 0 0 0 0 + 810.2143 -362.8769 -40.9030 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 1088.7844 -432.6606 -189.2094 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 857.6651 -433.1527 66.1463 Br 0 0 0 0 0 0 0 0 0 0 0 0 + 1065.2400 -607.8625 -169.8069 H 0 0 0 0 0 0 0 0 0 0 0 0 + 974.1014 -687.8818 -72.0603 H 0 0 0 0 0 0 0 0 0 0 0 0 + 884.1593 -612.1210 30.1933 H 0 0 0 0 0 0 0 0 0 0 0 0 + 844.2202 -188.2884 -40.0282 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1111.7466 -189.3803 -75.5410 H 0 0 0 0 0 0 0 0 0 0 0 0 + 978.6613 -110.9498 -55.4232 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 6 1 0 0 0 0 + 1 2 2 0 0 0 0 + 1 16 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 8 1 0 0 0 0 + 3 4 2 0 0 0 0 + 3 15 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 17 1 0 0 0 0 + 5 6 2 0 0 0 0 + 5 18 1 0 0 0 0 + 6 19 1 0 0 0 0 + 7 8 1 0 0 0 0 + 7 11 2 0 0 0 0 + 7 13 1 0 0 0 0 + 8 9 2 0 0 0 0 + 9 10 1 0 0 0 0 + 9 14 1 0 0 0 0 + 10 12 2 0 0 0 0 + 10 20 1 0 0 0 0 + 11 12 1 0 0 0 0 + 11 21 1 0 0 0 0 + 12 22 1 0 0 0 0 +M END +> +38 + +> +(1%{P})-2,2'-dibromo-6,6'-dichloro-1,1'-biphenyl + +> +InChI=1S/C12H6Br2Cl2/c13-7-3-1-5-9(15)11(7)12-8(14)4-2-6-10(12)16/h1-6H + +> +3D + +> +2-P + +$$$$ + + ACD/LABS03022623403D + + 32 33 0 0 0 0 0 0 0 0 2 V2000 + 1750.5176 -571.3364 -80.0950 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1804.9939 -550.5455 -20.5802 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1858.6106 -607.3187 7.5457 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1858.4424 -684.2209 -23.8283 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1804.3333 -704.6630 -83.3561 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1750.4187 -648.2515 -111.3355 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1747.6858 -438.7017 63.0222 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1807.7996 -468.2164 13.3146 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1872.8423 -420.0203 -5.6150 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1878.2864 -343.1353 25.1256 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1753.1841 -361.6453 93.2022 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1818.3889 -313.8614 74.4917 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1677.3024 -487.2190 84.3417 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1936.1011 -451.1788 -58.5762 N 0 3 0 0 0 0 0 0 0 0 0 0 + 1915.8525 -585.1500 70.9230 N 0 3 0 0 0 0 0 0 0 0 0 0 + 1692.2029 -513.0626 -110.5103 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1643.2415 -525.4774 33.2026 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1650.0321 -488.0287 161.0731 O 0 0 0 0 0 0 0 0 0 0 0 0 + 2005.5361 -412.7657 -64.8926 O 0 5 0 0 0 0 0 0 0 0 0 0 + 1926.2197 -514.4163 -93.8519 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1916.0107 -510.9251 99.8357 O 0 5 0 0 0 0 0 0 0 0 0 0 + 1958.7461 -635.9981 101.0953 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1702.5399 -481.2664 -174.7472 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1626.2474 -495.5988 -66.2283 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1901.8110 -729.4104 -1.3497 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1804.1709 -766.3130 -108.5770 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1706.8579 -664.7610 -158.8597 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1930.6021 -304.9662 10.1384 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1705.0358 -338.1431 132.6683 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1822.5063 -252.0234 99.0611 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1603.2056 -518.6179 174.7472 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1584.9814 -462.0991 -88.0912 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 6 1 0 0 0 0 + 1 2 2 0 0 0 0 + 1 16 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 8 1 0 0 0 0 + 3 4 2 0 0 0 0 + 3 15 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 25 1 0 0 0 0 + 5 6 2 0 0 0 0 + 5 26 1 0 0 0 0 + 6 27 1 0 0 0 0 + 7 8 1 0 0 0 0 + 7 11 2 0 0 0 0 + 7 13 1 0 0 0 0 + 8 9 2 0 0 0 0 + 9 10 1 0 0 0 0 + 9 14 1 0 0 0 0 + 10 12 2 0 0 0 0 + 10 28 1 0 0 0 0 + 11 12 1 0 0 0 0 + 11 29 1 0 0 0 0 + 12 30 1 0 0 0 0 + 13 17 2 0 0 0 0 + 13 18 1 0 0 0 0 + 14 19 1 0 0 0 0 + 14 20 2 0 0 0 0 + 15 21 1 0 0 0 0 + 15 22 2 0 0 0 0 + 16 23 2 0 0 0 0 + 16 24 1 0 0 0 0 + 18 31 1 0 0 0 0 + 24 32 1 0 0 0 0 +M CHG 4 14 1 15 1 19 -1 21 -1 +M END +> +39 + +> +(1%{P})-6,6'-dinitro[1,1'-biphenyl]-2,2'-dicarboxylic acid + +> +InChI=1S/C14H8N2O8/c17-13(18)7-3-1-5-9(15(21)22)11(7)12-8(14(19)20)4-2-6-10(12)16(23)24/h1-6H,(H,17,18)(H,19,20) + +> +3D + +> +1-P + +$$$$ + + ACD/LABS03022623403D + + 32 33 0 0 0 0 0 0 0 0 2 V2000 + 2366.1211 -675.1193 21.8612 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2410.4861 -610.4289 -5.8233 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2474.6162 -623.3884 -57.0787 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2494.9993 -700.4260 -80.1637 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2450.5835 -764.7903 -52.6459 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2386.0500 -752.0714 -1.9422 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2321.8643 -488.7558 -5.9283 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2391.6638 -527.2480 18.5300 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2446.1450 -487.0553 66.6731 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2431.8003 -408.6631 89.8958 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2307.7507 -410.4383 17.4075 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2362.5022 -370.3027 65.0912 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2262.0557 -529.0380 -56.8456 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2519.7856 -527.9182 92.9096 N 0 3 0 0 0 0 0 0 0 0 0 0 + 2520.8484 -554.7446 -86.8585 N 0 3 0 0 0 0 0 0 0 0 0 0 + 2297.7822 -663.3746 76.3248 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2281.2346 -554.9070 -121.7002 O 0 0 0 0 0 0 0 0 0 0 0 0 + 2185.0261 -536.4710 -31.0310 O 0 0 0 0 0 0 0 0 0 0 0 0 + 2581.9705 -485.4105 118.7409 O 0 5 0 0 0 0 0 0 0 0 0 0 + 2525.7686 -600.3974 85.5918 O 0 0 0 0 0 0 0 0 0 0 0 0 + 2491.7363 -481.0682 -78.2719 O 0 5 0 0 0 0 0 0 0 0 0 0 + 2586.8362 -564.9368 -116.5774 O 0 0 0 0 0 0 0 0 0 0 0 0 + 2232.2463 -687.7059 57.4033 O 0 0 0 0 0 0 0 0 0 0 0 0 + 2308.1165 -625.4195 147.6910 O 0 0 0 0 0 0 0 0 0 0 0 0 + 2546.7866 -710.4727 -120.8080 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2466.6167 -826.5935 -71.2991 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2350.1968 -803.7446 19.7491 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2475.8477 -376.6582 128.2949 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2252.1443 -379.9426 -2.5241 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2350.8640 -307.3475 83.2814 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2146.1470 -563.7944 -63.3899 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2263.4761 -618.3550 183.3867 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 6 1 0 0 0 0 + 1 2 2 0 0 0 0 + 1 16 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 8 1 0 0 0 0 + 3 4 2 0 0 0 0 + 3 15 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 25 1 0 0 0 0 + 5 6 2 0 0 0 0 + 5 26 1 0 0 0 0 + 6 27 1 0 0 0 0 + 7 8 1 0 0 0 0 + 7 11 2 0 0 0 0 + 7 13 1 0 0 0 0 + 8 9 2 0 0 0 0 + 9 10 1 0 0 0 0 + 9 14 1 0 0 0 0 + 10 12 2 0 0 0 0 + 10 28 1 0 0 0 0 + 11 12 1 0 0 0 0 + 11 29 1 0 0 0 0 + 12 30 1 0 0 0 0 + 13 17 2 0 0 0 0 + 13 18 1 0 0 0 0 + 14 19 1 0 0 0 0 + 14 20 2 0 0 0 0 + 15 21 1 0 0 0 0 + 15 22 2 0 0 0 0 + 16 23 2 0 0 0 0 + 16 24 1 0 0 0 0 + 18 31 1 0 0 0 0 + 24 32 1 0 0 0 0 +M CHG 4 14 1 15 1 19 -1 21 -1 +M END +> +40 + +> +(1%{M})-6,6'-dinitro[1,1'-biphenyl]-2,2'-dicarboxylic acid + +> +InChI=1S/C14H8N2O8/c17-13(18)7-3-1-5-9(15(21)22)11(7)12-8(14(19)20)4-2-6-10(12)16(23)24/h1-6H,(H,17,18)(H,19,20) + +> +3D + +> +1-M + +$$$$ + + ACD/LABS03022623403D + + 36 39 0 0 0 0 0 0 0 0 1 V2000 + 498.0763-1391.7839 -299.0648 O 0 0 0 0 0 0 0 0 0 0 0 0 + 530.3590-1436.5226 -234.6511 C 0 0 0 0 0 0 0 0 0 0 0 0 + 582.1680-1397.6227 -177.1590 C 0 0 0 0 0 0 0 0 0 0 0 0 + 614.6850-1443.8304 -111.0919 C 0 0 0 0 0 0 0 0 0 0 0 0 + 595.3661-1528.2797 -103.3930 C 0 0 0 0 0 0 0 0 0 0 0 0 + 543.5988-1566.3462 -161.1515 C 0 0 0 0 0 0 0 0 0 0 0 0 + 511.0643-1520.4037 -226.6779 C 0 0 0 0 0 0 0 0 0 0 0 0 + 746.7010-1341.2540 -181.7434 O 0 0 0 0 0 0 0 0 0 0 0 0 + 685.6276-1282.8364 -189.3065 C 0 0 0 0 0 0 0 0 0 0 0 0 + 602.5217-1307.0992 -187.6624 C 0 0 0 0 0 0 0 0 0 0 0 0 + 540.3887-1246.8434 -196.0735 C 0 0 0 0 0 0 0 0 0 0 0 0 + 562.1613-1163.1547 -205.3319 C 0 0 0 0 0 0 0 0 0 0 0 0 + 500.6906-1102.8923 -213.6928 C 0 0 0 0 0 0 0 0 0 0 0 0 + 417.3236-1125.7070 -213.0546 C 0 0 0 0 0 0 0 0 0 0 0 0 + 395.3644-1208.8110 -204.0422 C 0 0 0 0 0 0 0 0 0 0 0 0 + 456.7369-1269.1130 -195.4865 C 0 0 0 0 0 0 0 0 0 0 0 0 + 666.6664-1406.8782 -52.4277 C 0 0 0 0 0 0 0 0 0 0 0 0 + 698.9536-1453.2502 12.9951 C 0 0 0 0 0 0 0 0 0 0 0 0 + 679.5919-1537.2012 20.2091 C 0 0 0 0 0 0 0 0 0 0 0 0 + 627.8028-1574.6791 -37.9965 C 0 0 0 0 0 0 0 0 0 0 0 0 + 707.0078-1199.5881 -198.5082 C 0 0 0 0 0 0 0 0 0 0 0 0 + 645.3090-1139.6837 -206.4027 C 0 0 0 0 0 0 0 0 0 0 0 0 + 511.8473-1330.4288 -304.9285 H 0 0 0 0 0 0 0 0 0 0 0 0 + 528.1885-1633.6580 -154.9271 H 0 0 0 0 0 0 0 0 0 0 0 0 + 469.3985-1550.9052 -272.9466 H 0 0 0 0 0 0 0 0 0 0 0 0 + 807.3887-1323.8186 -182.8536 H 0 0 0 0 0 0 0 0 0 0 0 0 + 518.2650-1036.2131 -220.9159 H 0 0 0 0 0 0 0 0 0 0 0 0 + 368.0804-1077.3636 -219.7705 H 0 0 0 0 0 0 0 0 0 0 0 0 + 328.4902-1227.1085 -203.6753 H 0 0 0 0 0 0 0 0 0 0 0 0 + 438.7770-1335.6727 -188.1167 H 0 0 0 0 0 0 0 0 0 0 0 0 + 682.5651-1339.6132 -57.8845 H 0 0 0 0 0 0 0 0 0 0 0 0 + 740.3918-1423.1025 59.6963 H 0 0 0 0 0 0 0 0 0 0 0 0 + 705.5688-1574.4307 72.6148 H 0 0 0 0 0 0 0 0 0 0 0 0 + 612.2697-1642.0012 -32.2233 H 0 0 0 0 0 0 0 0 0 0 0 0 + 773.7479-1180.8347 -199.5581 H 0 0 0 0 0 0 0 0 0 0 0 0 + 662.4907-1072.8971 -213.5833 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 23 1 0 0 0 0 + 2 7 1 0 0 0 0 + 2 3 2 0 0 0 0 + 3 4 1 0 0 0 0 + 3 10 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 17 2 0 0 0 0 + 5 20 2 0 0 0 0 + 5 6 1 0 0 0 0 + 6 7 2 0 0 0 0 + 6 24 1 0 0 0 0 + 7 25 1 0 0 0 0 + 8 9 1 0 0 0 0 + 8 26 1 0 0 0 0 + 9 10 1 0 0 0 0 + 9 21 2 0 0 0 0 + 10 11 2 0 0 0 0 + 11 16 1 0 0 0 0 + 11 12 1 0 0 0 0 + 12 22 2 0 0 0 0 + 12 13 1 0 0 0 0 + 13 14 2 0 0 0 0 + 13 27 1 0 0 0 0 + 14 15 1 0 0 0 0 + 14 28 1 0 0 0 0 + 15 16 2 0 0 0 0 + 15 29 1 0 0 0 0 + 16 30 1 0 0 0 0 + 17 18 1 0 0 0 0 + 17 31 1 0 0 0 0 + 18 19 2 0 0 0 0 + 18 32 1 0 0 0 0 + 19 20 1 0 0 0 0 + 19 33 1 0 0 0 0 + 20 34 1 0 0 0 0 + 21 22 1 0 0 0 0 + 21 35 1 0 0 0 0 + 22 36 1 0 0 0 0 +M END +> +41 + +> +(1%{M})-[1,1'-binaphthalene]-2,2'-diol + +> +InChI=1S/C20H14O2/c21-17-11-9-13-5-1-3-7-15(13)19(17)20-16-8-4-2-6-14(16)10-12-18(20)22/h1-12,21-22H + +> +3D + +> +3-M + +$$$$ + + ACD/LABS03022623403D + + 36 39 0 0 0 0 0 0 0 0 1 V2000 + 1768.9490-1437.1235 24.7201 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1716.6997-1489.4648 -16.9774 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1657.5729-1457.2971 -71.4048 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1604.6666-1511.2489 -114.4813 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1611.3928-1596.9401 -102.0499 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1670.3788-1628.3999 -47.5175 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1723.0640-1574.7841 -5.0117 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1793.9948-1365.5594 -127.4590 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1722.5676-1322.9772 -110.6354 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1652.5698-1365.4142 -82.3495 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1579.6901-1321.3469 -64.7338 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1577.6083-1235.1671 -76.2412 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1505.6088-1190.4385 -59.3841 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1435.0571-1231.2864 -30.8082 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1436.5511-1316.9618 -19.0501 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1508.6094-1361.7412 -35.9994 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1545.0814-1481.1469 -169.6950 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1492.9028-1535.6935 -211.8651 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1499.9395-1620.8204 -199.0775 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1559.2064-1651.4703 -144.1947 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1720.1180-1237.3751 -121.7758 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1647.7408-1193.5376 -104.6988 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1764.6793-1374.7170 16.0291 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1675.4502-1696.8671 -37.8388 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1770.4686-1600.2340 38.7171 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1845.0812-1334.6543 -148.0368 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1504.4473-1121.7562 -68.7897 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1377.3119-1195.3571 -17.3290 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1379.9669-1349.7555 3.9698 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1509.3986-1430.4156 -26.4974 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1539.1080-1412.8777 -180.2147 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1445.3751-1511.1490 -255.9758 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1458.0344-1664.5283 -232.8511 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1564.8868-1719.8102 -133.9745 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1776.3634-1203.7830 -144.4720 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1645.9359-1124.8348 -113.8473 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 23 1 0 0 0 0 + 2 7 1 0 0 0 0 + 2 3 2 0 0 0 0 + 3 4 1 0 0 0 0 + 3 10 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 17 2 0 0 0 0 + 5 20 2 0 0 0 0 + 5 6 1 0 0 0 0 + 6 7 2 0 0 0 0 + 6 24 1 0 0 0 0 + 7 25 1 0 0 0 0 + 8 9 1 0 0 0 0 + 8 26 1 0 0 0 0 + 9 10 1 0 0 0 0 + 9 21 2 0 0 0 0 + 10 11 2 0 0 0 0 + 11 16 1 0 0 0 0 + 11 12 1 0 0 0 0 + 12 22 2 0 0 0 0 + 12 13 1 0 0 0 0 + 13 14 2 0 0 0 0 + 13 27 1 0 0 0 0 + 14 15 1 0 0 0 0 + 14 28 1 0 0 0 0 + 15 16 2 0 0 0 0 + 15 29 1 0 0 0 0 + 16 30 1 0 0 0 0 + 17 18 1 0 0 0 0 + 17 31 1 0 0 0 0 + 18 19 2 0 0 0 0 + 18 32 1 0 0 0 0 + 19 20 1 0 0 0 0 + 19 33 1 0 0 0 0 + 20 34 1 0 0 0 0 + 21 22 1 0 0 0 0 + 21 35 1 0 0 0 0 + 22 36 1 0 0 0 0 +M END +> +42 + +> +(1%{P})-[1,1'-binaphthalene]-2,2'-diol + +> +InChI=1S/C20H14O2/c21-17-11-9-13-5-1-3-7-15(13)19(17)20-16-8-4-2-6-14(16)10-12-18(20)22/h1-12,21-22H + +> +3D + +> +3-P + +$$$$ + + ACD/LABS03022623402D + + 14 13 0 0 1 0 0 0 0 0 1 V2000 + 672.0000 -594.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 755.0000 -594.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 630.5001 -522.1198 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 796.4999 -665.8802 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 630.4998 -665.8799 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 796.5002 -522.1201 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 547.4998 -665.8795 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 671.9992 -737.7603 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 754.9996 -737.7601 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 879.4999 -665.8806 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 672.0004 -450.2398 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 547.5001 -522.1194 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 879.5002 -522.1205 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 755.0008 -450.2397 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 3 1 0 0 0 0 + 1 5 2 0 0 0 0 + 2 4 2 0 0 0 0 + 2 6 1 1 0 0 0 + 3 11 1 0 0 0 0 + 3 12 1 0 0 0 0 + 4 9 1 0 0 0 0 + 4 10 1 0 0 0 0 + 5 7 1 0 0 0 0 + 5 8 1 0 0 0 0 + 6 13 1 0 0 0 0 + 6 14 1 0 0 0 0 +M END +> +43 + +> +InChI=1S/C14H26/c1-9(2)13(10(3)4)14(11(5)6)12(7)8/h9,11H,1-8H3 + +> +Atropisomers exists for bulky substituents, so should be recognized while rare + +$$$$ + + ACD/LABS03022623402D + + 14 14 0 0 1 0 0 0 0 0 1 V2000 + 493.8820-1452.5000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 493.8820-1535.5000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 421.9960-1411.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 421.9960-1577.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 350.1180-1452.5000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 350.1180-1535.5000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 421.9942-1328.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 493.8734-1286.4985 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 350.1133-1286.5013 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 577.1343-1284.9489 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 493.8721-1203.4985 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 278.2378-1411.0002 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 565.7614-1410.9989 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 637.6421-1452.4979 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 3 2 0 0 0 0 + 1 13 1 0 0 0 0 + 2 4 2 0 0 0 0 + 3 5 1 1 0 0 0 + 3 7 1 0 0 0 0 + 4 6 1 0 0 0 0 + 5 6 2 0 0 0 0 + 5 12 1 0 0 0 0 + 7 8 1 0 0 0 0 + 7 9 2 0 0 0 0 + 8 10 1 0 0 0 0 + 8 11 1 0 0 0 0 + 13 14 1 0 0 0 0 +M END +> +44 + +> +Atropisomers exists for bulky substituents, so should be recognized while rare + +$$$$ + + ACD/LABS03022623402D + + 19 19 0 0 1 0 0 0 0 0 1 V2000 + 1543.7472-1174.6802 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 1471.7451-1133.3922 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1543.7472-1258.2631 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1399.7429-1174.6802 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1471.7451-1299.5510 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1471.7451-1050.3129 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1615.7493-1133.3922 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1615.7493-1299.5510 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1687.7515-1258.2631 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 1328.2443-1050.3129 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1759.7535-1133.3922 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1328.2443-1133.3922 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1399.7429-1009.0249 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1543.7472-1009.0249 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1687.7515-1174.6802 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1399.7429-1258.2631 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1615.7493-1050.3129 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1831.7556-1174.6802 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1543.7472 -926.4490 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 3 1 0 0 0 0 + 1 7 1 0 0 0 0 + 2 4 1 1 0 0 0 + 2 6 2 0 0 0 0 + 3 5 2 0 0 0 0 + 3 8 1 0 0 0 0 + 4 12 2 0 0 0 0 + 4 16 1 0 0 0 0 + 6 13 1 0 0 0 0 + 6 14 1 0 0 0 0 + 7 15 1 0 0 0 0 + 7 17 1 1 0 0 0 + 8 9 1 0 0 0 0 + 10 13 2 0 0 0 0 + 10 12 1 0 0 0 0 + 11 15 1 0 0 0 0 + 11 18 1 0 0 0 0 + 14 19 1 0 0 0 0 +M END +> +45 + +> +Well known pesticide and herbicide. Atropisomers exist + +$$$$ + + ACD/LABS03022623403D + + 28 33 0 0 1 0 0 0 0 0 1 V2000 + 99.8844 -27.7200 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 99.8844 -54.2800 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 76.8810 -14.4400 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 76.8810 -67.5600 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 53.8800 -27.7200 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 53.8800 -54.2800 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 76.8804 -94.1200 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 99.8815 -107.4009 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 53.8773 -107.4007 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 99.8796 -133.9624 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 53.8767 -133.9601 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 76.8778 -147.2410 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 30.8792 -14.4417 0.0001 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.8786 -27.7234 0.0001 C 0 0 0 0 0 0 0 0 0 0 0 0 + 30.8807 -67.5596 0.0001 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.8800 -54.2812 0.0001 C 0 0 0 0 0 0 0 0 0 0 0 0 + 30.8774 -94.1221 0.0001 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.8769 -107.4030 0.0001 C 0 0 0 0 0 0 0 0 0 0 0 0 + 30.8775 -147.2388 0.0001 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.8776 -133.9603 0.0001 C 0 0 0 0 0 0 0 0 0 0 0 0 + 122.8845 -94.1233 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 145.8856 -107.4073 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 122.8795 -147.2442 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 145.8825 -133.9667 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 122.8851 -14.4416 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 145.8858 -27.7231 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 122.8840 -67.5594 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 145.8846 -54.2809 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 3 1 0 0 0 0 + 1 25 1 0 0 0 0 + 1 2 2 0 0 0 0 + 4 2 1 1 0 0 0 + 2 27 1 0 0 0 0 + 3 5 1 0 0 0 0 + 4 6 1 0 0 0 0 + 4 7 2 0 0 0 0 + 5 13 1 0 0 0 0 + 5 6 2 0 0 0 0 + 6 15 1 0 0 0 0 + 7 8 1 0 0 0 0 + 7 9 1 0 0 0 0 + 8 21 1 0 0 0 0 + 8 10 2 0 0 0 0 + 9 17 1 0 0 0 0 + 9 11 2 0 0 0 0 + 10 12 1 0 0 0 0 + 10 23 1 0 0 0 0 + 11 12 1 0 0 0 0 + 11 19 1 0 0 0 0 + 13 14 2 0 0 0 0 + 14 16 1 0 0 0 0 + 15 16 2 0 0 0 0 + 17 18 2 0 0 0 0 + 18 20 1 0 0 0 0 + 19 20 2 0 0 0 0 + 21 22 2 0 0 0 0 + 22 24 1 0 0 0 0 + 23 24 2 0 0 0 0 + 25 26 2 0 0 0 0 + 26 28 1 0 0 0 0 + 27 28 2 0 0 0 0 +M END +> +46 + +> +InChI=1S/C24H14N2O2/c1-4-8-20-15(5-1)23(17-9-11-26-14-22(17)28-20)24-16-6-2-3-7-19(16)27-21-10-12-25-13-18(21)24/h1-14H/b24-23- + +> +Special case - needs both double bond config and atropisomer-like descriptor + +> +Z,M + +$$$$ + + ACD/LABS03022623403D + + 28 33 0 0 1 0 0 0 0 0 1 V2000 + 288.0444 -26.1200 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 288.0444 -52.6800 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 265.0410 -12.8400 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 265.0410 -65.9600 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 242.0400 -26.1200 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 242.0400 -52.6800 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 265.0404 -92.5200 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 288.0415 -105.8008 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 242.0373 -105.8007 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 288.0396 -132.3624 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 242.0367 -132.3602 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 265.0378 -145.6411 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 219.0392 -12.8417 0.0001 C 0 0 0 0 0 0 0 0 0 0 0 0 + 196.0386 -26.1234 0.0001 C 0 0 0 0 0 0 0 0 0 0 0 0 + 219.0406 -65.9595 0.0001 C 0 0 0 0 0 0 0 0 0 0 0 0 + 196.0399 -52.6812 0.0001 C 0 0 0 0 0 0 0 0 0 0 0 0 + 219.0374 -92.5221 0.0001 C 0 0 0 0 0 0 0 0 0 0 0 0 + 196.0369 -105.8030 0.0001 C 0 0 0 0 0 0 0 0 0 0 0 0 + 219.0375 -145.6389 0.0001 C 0 0 0 0 0 0 0 0 0 0 0 0 + 196.0376 -132.3602 0.0001 C 0 0 0 0 0 0 0 0 0 0 0 0 + 311.0445 -92.5233 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 334.0456 -105.8073 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 311.0395 -145.6442 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 334.0425 -132.3666 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 311.0451 -12.8416 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 334.0458 -26.1231 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 311.0440 -65.9594 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 334.0446 -52.6810 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 3 1 0 0 0 0 + 1 25 1 0 0 0 0 + 1 2 2 0 0 0 0 + 4 2 1 6 0 0 0 + 2 27 1 0 0 0 0 + 3 5 1 0 0 0 0 + 4 6 1 0 0 0 0 + 4 7 2 0 0 0 0 + 5 13 1 0 0 0 0 + 5 6 2 0 0 0 0 + 6 15 1 0 0 0 0 + 7 8 1 0 0 0 0 + 7 9 1 0 0 0 0 + 8 21 1 0 0 0 0 + 8 10 2 0 0 0 0 + 9 17 1 0 0 0 0 + 9 11 2 0 0 0 0 + 10 12 1 0 0 0 0 + 10 23 1 0 0 0 0 + 11 12 1 0 0 0 0 + 11 19 1 0 0 0 0 + 13 14 2 0 0 0 0 + 14 16 1 0 0 0 0 + 15 16 2 0 0 0 0 + 17 18 2 0 0 0 0 + 18 20 1 0 0 0 0 + 19 20 2 0 0 0 0 + 21 22 2 0 0 0 0 + 22 24 1 0 0 0 0 + 23 24 2 0 0 0 0 + 25 26 2 0 0 0 0 + 26 28 1 0 0 0 0 + 27 28 2 0 0 0 0 +M END +> +47 + +> +InChI=1S/C24H14N2O2/c1-4-8-20-15(5-1)23(17-9-11-26-14-22(17)28-20)24-16-6-2-3-7-19(16)27-21-10-12-25-13-18(21)24/h1-14H/b24-23- + +> +Special case - needs both double bond config and atropisomer-like descriptor + +> +Z,P + +$$$$ + + ACD/LABS03022623403D + + 28 33 0 0 1 0 0 0 0 0 1 V2000 + 463.0844 -22.6000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 463.0844 -49.1600 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 440.0809 -9.3200 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 440.0809 -62.4400 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 417.0800 -22.6000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 417.0800 -49.1600 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 440.0804 -89.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 417.0789 -102.2801 0.0001 C 0 0 0 0 0 0 0 0 0 0 0 0 + 463.0831 -102.2815 -0.0001 C 0 0 0 0 0 0 0 0 0 0 0 0 + 417.0799 -128.8417 0.0001 C 0 0 0 0 0 0 0 0 0 0 0 0 + 463.0828 -128.8409 -0.0001 C 0 0 0 0 0 0 0 0 0 0 0 0 + 440.0812 -142.1210 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 394.0792 -9.3217 0.0001 C 0 0 0 0 0 0 0 0 0 0 0 0 + 371.0786 -22.6034 0.0001 C 0 0 0 0 0 0 0 0 0 0 0 0 + 394.0807 -62.4395 0.0001 C 0 0 0 0 0 0 0 0 0 0 0 0 + 371.0800 -49.1612 0.0001 C 0 0 0 0 0 0 0 0 0 0 0 0 + 486.0836 -89.0038 -0.0002 C 0 0 0 0 0 0 0 0 0 0 0 0 + 509.0836 -102.2854 -0.0003 C 0 0 0 0 0 0 0 0 0 0 0 0 + 486.0815 -142.1205 -0.0002 C 0 0 0 0 0 0 0 0 0 0 0 0 + 509.0819 -128.8427 -0.0003 C 0 0 0 0 0 0 0 0 0 0 0 0 + 394.0764 -89.0016 0.0001 C 0 0 0 0 0 0 0 0 0 0 0 0 + 371.0748 -102.2849 0.0002 N 0 0 0 0 0 0 0 0 0 0 0 0 + 394.0795 -142.1226 0.0001 C 0 0 0 0 0 0 0 0 0 0 0 0 + 371.0770 -128.8442 0.0002 C 0 0 0 0 0 0 0 0 0 0 0 0 + 486.0851 -9.3216 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 509.0858 -22.6031 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 486.0840 -62.4394 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 509.0847 -49.1609 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 3 1 0 0 0 0 + 1 25 1 0 0 0 0 + 1 2 2 0 0 0 0 + 4 2 1 1 0 0 0 + 2 27 1 0 0 0 0 + 3 5 1 0 0 0 0 + 4 6 1 0 0 0 0 + 4 7 2 0 0 0 0 + 5 13 1 0 0 0 0 + 5 6 2 0 0 0 0 + 6 15 1 0 0 0 0 + 7 8 1 0 0 0 0 + 7 9 1 0 0 0 0 + 8 21 1 0 0 0 0 + 8 10 2 0 0 0 0 + 9 17 1 0 0 0 0 + 9 11 2 0 0 0 0 + 10 12 1 0 0 0 0 + 10 23 1 0 0 0 0 + 11 12 1 0 0 0 0 + 11 19 1 0 0 0 0 + 13 14 2 0 0 0 0 + 14 16 1 0 0 0 0 + 15 16 2 0 0 0 0 + 17 18 2 0 0 0 0 + 18 20 1 0 0 0 0 + 19 20 2 0 0 0 0 + 21 22 2 0 0 0 0 + 22 24 1 0 0 0 0 + 23 24 2 0 0 0 0 + 25 26 2 0 0 0 0 + 26 28 1 0 0 0 0 + 27 28 2 0 0 0 0 +M END +> +48 + +> +InChI=1S/C24H14N2O2/c1-4-8-20-15(5-1)23(17-9-11-26-14-22(17)28-20)24-16-6-2-3-7-19(16)27-21-10-12-25-13-18(21)24/h1-14H/b24-23+ + +> +Special case - needs both double bond config and atropisomer-like descriptor + +> +E,P + +$$$$ + + ACD/LABS03022623403D + + 28 33 0 0 1 0 0 0 0 0 1 V2000 + 651.2444 -21.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 651.2444 -47.5600 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 628.2409 -7.7200 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 628.2409 -60.8400 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 605.2400 -21.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 605.2400 -47.5600 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 628.2405 -87.4000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 605.2389 -100.6801 0.0001 C 0 0 0 0 0 0 0 0 0 0 0 0 + 651.2431 -100.6815 -0.0001 C 0 0 0 0 0 0 0 0 0 0 0 0 + 605.2399 -127.2416 0.0001 C 0 0 0 0 0 0 0 0 0 0 0 0 + 651.2428 -127.2410 -0.0001 C 0 0 0 0 0 0 0 0 0 0 0 0 + 628.2412 -140.5210 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 582.2392 -7.7217 0.0001 C 0 0 0 0 0 0 0 0 0 0 0 0 + 559.2386 -21.0034 0.0001 C 0 0 0 0 0 0 0 0 0 0 0 0 + 582.2406 -60.8395 0.0001 C 0 0 0 0 0 0 0 0 0 0 0 0 + 559.2400 -47.5612 0.0001 C 0 0 0 0 0 0 0 0 0 0 0 0 + 674.2436 -87.4037 -0.0002 C 0 0 0 0 0 0 0 0 0 0 0 0 + 697.2436 -100.6854 -0.0003 C 0 0 0 0 0 0 0 0 0 0 0 0 + 674.2415 -140.5205 -0.0002 C 0 0 0 0 0 0 0 0 0 0 0 0 + 697.2419 -127.2427 -0.0003 C 0 0 0 0 0 0 0 0 0 0 0 0 + 582.2364 -87.4017 0.0001 C 0 0 0 0 0 0 0 0 0 0 0 0 + 559.2348 -100.6849 0.0002 N 0 0 0 0 0 0 0 0 0 0 0 0 + 582.2395 -140.5226 0.0001 C 0 0 0 0 0 0 0 0 0 0 0 0 + 559.2370 -127.2442 0.0002 C 0 0 0 0 0 0 0 0 0 0 0 0 + 674.2451 -7.7216 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 697.2458 -21.0031 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 674.2440 -60.8394 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 697.2447 -47.5610 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 3 1 0 0 0 0 + 1 25 1 0 0 0 0 + 1 2 2 0 0 0 0 + 4 2 1 6 0 0 0 + 2 27 1 0 0 0 0 + 3 5 1 0 0 0 0 + 4 6 1 0 0 0 0 + 4 7 2 0 0 0 0 + 5 13 1 0 0 0 0 + 5 6 2 0 0 0 0 + 6 15 1 0 0 0 0 + 7 8 1 0 0 0 0 + 7 9 1 0 0 0 0 + 8 21 1 0 0 0 0 + 8 10 2 0 0 0 0 + 9 17 1 0 0 0 0 + 9 11 2 0 0 0 0 + 10 12 1 0 0 0 0 + 10 23 1 0 0 0 0 + 11 12 1 0 0 0 0 + 11 19 1 0 0 0 0 + 13 14 2 0 0 0 0 + 14 16 1 0 0 0 0 + 15 16 2 0 0 0 0 + 17 18 2 0 0 0 0 + 18 20 1 0 0 0 0 + 19 20 2 0 0 0 0 + 21 22 2 0 0 0 0 + 22 24 1 0 0 0 0 + 23 24 2 0 0 0 0 + 25 26 2 0 0 0 0 + 26 28 1 0 0 0 0 + 27 28 2 0 0 0 0 +M END +> +49 + +> +InChI=1S/C24H14N2O2/c1-4-8-20-15(5-1)23(17-9-11-26-14-22(17)28-20)24-16-6-2-3-7-19(16)27-21-10-12-25-13-18(21)24/h1-14H/b24-23+ + +> +Special case - needs both double bond config and atropisomer-like descriptor + +> +E,M + +$$$$ diff --git a/INCHI-1-TEST/tests/test_unit/fixtures/atropisomers_test_file_1_v2.sdf b/INCHI-1-TEST/tests/test_unit/fixtures/atropisomers_test_file_1_v2.sdf new file mode 100644 index 00000000..f6c1634a --- /dev/null +++ b/INCHI-1-TEST/tests/test_unit/fixtures/atropisomers_test_file_1_v2.sdf @@ -0,0 +1,3303 @@ +atropisomers_test_file_1_v2.sdf + ChemDraw03052609263D + + 24 25 0 0 0 0 0 0 0 0999 V2000 + 1.3190 -1.5230 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -0.7615 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.3190 -1.5230 -0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.3190 -3.0460 -0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.0000 -3.8075 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3189 -3.0460 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3190 1.5230 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 0.7615 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.3189 1.5230 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.3189 3.0460 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3190 3.0460 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 3.8075 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6379 0.7615 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9569 1.5230 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6379 -0.7615 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + -2.6379 0.7615 0.0000 N 0 3 0 0 0 0 0 0 0 0 0 0 + -3.9569 1.5230 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + -2.6379 -0.7615 0.0000 O 0 5 0 0 0 0 0 0 0 0 0 0 + -2.6379 -0.7615 0.0000 N 0 3 0 0 0 0 0 0 0 0 0 0 + -2.6379 0.7615 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + -3.9569 -1.5230 0.0000 O 0 5 0 0 0 0 0 0 0 0 0 0 + 2.6379 -0.7615 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6379 0.7615 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9569 -1.5230 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 13 14 2 0 + 13 15 1 0 + 7 13 1 0 + 16 17 2 0 + 16 18 1 0 + 9 16 1 0 + 19 20 2 0 + 19 21 1 0 + 3 19 1 0 + 22 23 2 0 + 22 24 1 0 + 1 22 1 0 + 1 6 1 0 + 1 2 2 0 + 2 3 1 1 + 2 8 1 0 + 3 4 2 0 + 5 4 1 1 + 5 6 2 0 + 8 7 1 1 + 7 11 2 0 + 8 9 2 0 + 9 10 1 0 + 10 12 2 0 + 12 11 1 1 +M CHG 4 16 1 18 -1 19 1 21 -1 +M STY 1 1 SUP +M SLB 1 1 1 +M SAL 1 3 13 14 15 +M SBL 1 1 3 +M SMT 1 CO2H +M SBV 1 3 -1.3190 0.7615 +M STY 1 2 SUP +M SLB 1 2 2 +M SAL 2 3 16 17 18 +M SBL 2 1 6 +M SMT 2 NO2 +M SBV 2 6 1.3190 0.7615 +M STY 1 3 SUP +M SLB 1 3 3 +M SAL 3 3 19 20 21 +M SBL 3 1 9 +M SMT 3 NO2 +M SBV 3 9 1.3190 -0.7615 +M STY 1 4 SUP +M SLB 1 4 4 +M SAL 4 3 22 23 24 +M SBL 4 1 12 +M SMT 4 CO2H +M SBV 4 12 -1.3190 -0.7615 +M END +> +t11- or t11-,12-; m0 or m1 + +> +1 + +> +(1M)-6,6'-dinitro[1,1'-biphenyl]-2,2'-dicarboxylic acid + +> +InChI=1S/C14H8N2O8/c17-13(18)7-3-1-5-9(15(21)22)11(7)12-8(14(19)20)4-2-6-10(12)16(23)24/h1-6H,(H,17,18)(H,19,20) + +> +InChI=1S/C14H8N2O8/c17-13(18)7-3-1-5-9(15(21)22)11(7)12-8(14(19)20)4-2-6-10(12)16(23)24/h1-6H,(H,17,18)(H,19,20)/t11-/m0/s1 + +> +1-M + +$$$$ +atropisomers_test_file_1_v2.sdf + ChemDraw03052609263D + + 24 25 0 0 0 0 0 0 0 0999 V2000 + -1.3190 -1.5230 -0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.0000 -0.7615 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3190 -1.5230 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3190 -3.0460 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -3.8075 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.3189 -3.0460 -0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.3190 1.5230 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.0000 0.7615 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3189 1.5230 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3189 3.0460 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.3190 3.0460 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.0000 3.8075 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -2.6379 0.7615 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -2.6379 -0.7615 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + -3.9569 1.5230 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6379 0.7615 0.0000 N 0 3 0 0 0 0 0 0 0 0 0 0 + 2.6379 -0.7615 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9569 1.5230 0.0000 O 0 5 0 0 0 0 0 0 0 0 0 0 + 2.6379 -0.7615 0.0000 N 0 3 0 0 0 0 0 0 0 0 0 0 + 3.9569 -1.5230 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6379 0.7615 0.0000 O 0 5 0 0 0 0 0 0 0 0 0 0 + -2.6379 -0.7615 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -3.9569 -1.5230 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + -2.6379 0.7615 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 13 14 2 0 + 13 15 1 0 + 7 13 1 0 + 16 17 2 0 + 16 18 1 0 + 9 16 1 0 + 19 20 2 0 + 19 21 1 0 + 3 19 1 0 + 22 23 2 0 + 22 24 1 0 + 1 22 1 0 + 1 6 1 0 + 1 2 2 0 + 2 3 1 1 + 2 8 1 0 + 3 4 2 0 + 5 4 1 1 + 5 6 2 0 + 8 7 1 1 + 7 11 2 0 + 8 9 2 0 + 9 10 1 0 + 10 12 2 0 + 12 11 1 1 +M CHG 4 16 1 18 -1 19 1 21 -1 +M STY 1 1 SUP +M SLB 1 1 1 +M SAL 1 3 13 14 15 +M SBL 1 1 3 +M SMT 1 CO2H +M SBV 1 3 1.3190 0.7615 +M STY 1 2 SUP +M SLB 1 2 2 +M SAL 2 3 16 17 18 +M SBL 2 1 6 +M SMT 2 NO2 +M SBV 2 6 -1.3190 0.7615 +M STY 1 3 SUP +M SLB 1 3 3 +M SAL 3 3 19 20 21 +M SBL 3 1 9 +M SMT 3 NO2 +M SBV 3 9 -1.3190 -0.7615 +M STY 1 4 SUP +M SLB 1 4 4 +M SAL 4 3 22 23 24 +M SBL 4 1 12 +M SMT 4 CO2H +M SBV 4 12 1.3190 -0.7615 +M END +> +t11- or t11-,12-; m1 or m0 + +> +2 + +> +(1P)-6,6'-dinitro[1,1'-biphenyl]-2,2'-dicarboxylic acid + +> +InChI=1S/C14H8N2O8/c17-13(18)7-3-1-5-9(15(21)22)11(7)12-8(14(19)20)4-2-6-10(12)16(23)24/h1-6H,(H,17,18)(H,19,20) + +> +1-P + +$$$$ +atropisomers_test_file_1_v2.sdf + ChemDraw03052609263D + + 24 25 0 0 0 0 0 0 0 0999 V2000 + 1.3190 -1.5230 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.0000 -0.7615 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.3190 -1.5230 -0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.3190 -3.0460 -0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.0000 -3.8075 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3189 -3.0460 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3190 1.5230 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.0000 0.7615 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.3190 1.5230 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.3189 3.0460 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3190 3.0460 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 3.8075 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6379 0.7615 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9569 1.5230 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6379 -0.7615 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + -2.6379 0.7615 0.0000 N 0 3 0 0 0 0 0 0 0 0 0 0 + -3.9569 1.5230 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + -2.6379 -0.7615 0.0000 O 0 5 0 0 0 0 0 0 0 0 0 0 + -2.6379 -0.7615 0.0000 N 0 3 0 0 0 0 0 0 0 0 0 0 + -2.6379 0.7615 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + -3.9569 -1.5230 0.0000 O 0 5 0 0 0 0 0 0 0 0 0 0 + 2.6379 -0.7615 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6379 0.7615 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9569 -1.5230 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 13 14 2 0 + 13 15 1 0 + 7 13 1 0 + 16 17 2 0 + 16 18 1 0 + 9 16 1 0 + 19 20 2 0 + 19 21 1 0 + 3 19 1 0 + 22 23 2 0 + 22 24 1 0 + 1 22 1 0 + 1 6 1 0 + 1 2 2 0 + 2 3 1 1 + 2 8 1 0 + 3 4 2 0 + 4 5 1 0 + 5 6 2 0 + 7 8 1 0 + 7 11 2 0 + 8 9 2 0 + 9 10 1 0 + 10 12 2 0 + 11 12 1 0 +M CHG 4 16 1 18 -1 19 1 21 -1 +M STY 1 1 SUP +M SLB 1 1 1 +M SAL 1 3 13 14 15 +M SBL 1 1 3 +M SMT 1 CO2H +M SBV 1 3 -1.3190 0.7615 +M STY 1 2 SUP +M SLB 1 2 2 +M SAL 2 3 16 17 18 +M SBL 2 1 6 +M SMT 2 NO2 +M SBV 2 6 1.3190 0.7615 +M STY 1 3 SUP +M SLB 1 3 3 +M SAL 3 3 19 20 21 +M SBL 3 1 9 +M SMT 3 NO2 +M SBV 3 9 1.3190 -0.7615 +M STY 1 4 SUP +M SLB 1 4 4 +M SAL 4 3 22 23 24 +M SBL 4 1 12 +M SMT 4 CO2H +M SBV 4 12 -1.3190 -0.7615 +M END +> +t11- or t11-,12-; m0 or m1 + +> +3 + +> +(1M)-6,6'-dinitro[1,1'-biphenyl]-2,2'-dicarboxylic acid + +> +InChI=1S/C14H8N2O8/c17-13(18)7-3-1-5-9(15(21)22)11(7)12-8(14(19)20)4-2-6-10(12)16(23)24/h1-6H,(H,17,18)(H,19,20) + +> +1-M + +$$$$ +atropisomers_test_file_1_v2.sdf + ChemDraw03052609263D + + 24 25 0 0 0 0 0 0 0 0999 V2000 + -1.3190 -1.5230 -0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -0.7615 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3190 -1.5230 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3190 -3.0460 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -3.8075 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.3189 -3.0460 -0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.3190 1.5230 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 0.7615 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3190 1.5230 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3189 3.0460 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.3190 3.0460 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.0000 3.8075 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -2.6379 0.7615 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -2.6379 -0.7615 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + -3.9569 1.5230 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6379 0.7615 0.0000 N 0 3 0 0 0 0 0 0 0 0 0 0 + 2.6379 -0.7615 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9569 1.5230 0.0000 O 0 5 0 0 0 0 0 0 0 0 0 0 + 2.6379 -0.7615 0.0000 N 0 3 0 0 0 0 0 0 0 0 0 0 + 3.9569 -1.5230 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6379 0.7615 0.0000 O 0 5 0 0 0 0 0 0 0 0 0 0 + -2.6379 -0.7615 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -3.9569 -1.5230 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + -2.6379 0.7615 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 13 14 2 0 + 13 15 1 0 + 7 13 1 0 + 16 17 2 0 + 16 18 1 0 + 9 16 1 0 + 19 20 2 0 + 19 21 1 0 + 3 19 1 0 + 22 23 2 0 + 22 24 1 0 + 1 22 1 0 + 1 6 1 0 + 1 2 2 0 + 2 3 1 1 + 2 8 1 0 + 3 4 2 0 + 4 5 1 0 + 5 6 2 0 + 7 8 1 0 + 7 11 2 0 + 8 9 2 0 + 9 10 1 0 + 10 12 2 0 + 11 12 1 0 +M CHG 4 16 1 18 -1 19 1 21 -1 +M STY 1 1 SUP +M SLB 1 1 1 +M SAL 1 3 13 14 15 +M SBL 1 1 3 +M SMT 1 CO2H +M SBV 1 3 1.3190 0.7615 +M STY 1 2 SUP +M SLB 1 2 2 +M SAL 2 3 16 17 18 +M SBL 2 1 6 +M SMT 2 NO2 +M SBV 2 6 -1.3190 0.7615 +M STY 1 3 SUP +M SLB 1 3 3 +M SAL 3 3 19 20 21 +M SBL 3 1 9 +M SMT 3 NO2 +M SBV 3 9 -1.3190 -0.7615 +M STY 1 4 SUP +M SLB 1 4 4 +M SAL 4 3 22 23 24 +M SBL 4 1 12 +M SMT 4 CO2H +M SBV 4 12 1.3190 -0.7615 +M END +> +t11- or t11-,12-; m1 or m0 + +> +4 + +> +(1P)-6,6'-dinitro[1,1'-biphenyl]-2,2'-dicarboxylic acid + +> +InChI=1S/C14H8N2O8/c17-13(18)7-3-1-5-9(15(21)22)11(7)12-8(14(19)20)4-2-6-10(12)16(23)24/h1-6H,(H,17,18)(H,19,20) + +> +1-P + +$$$$ +atropisomers_test_file_1_v2.sdf + ChemDraw03052609263D + + 24 25 0 0 0 0 0 0 0 0999 V2000 + -1.3190 -2.7616 -0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.0000 -2.0001 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3190 -2.7616 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3190 -4.2846 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -5.0461 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.3189 -4.2846 -0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.3190 2.7616 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.0000 2.0001 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3190 2.7616 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3189 4.2846 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.3190 4.2846 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.0000 5.0461 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -2.6379 2.0001 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6379 2.0001 0.0000 N 0 3 0 0 0 0 0 0 0 0 0 0 + 2.6379 -2.0001 0.0000 N 0 3 0 0 0 0 0 0 0 0 0 0 + -2.6379 -2.0001 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -2.6379 0.4771 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + -3.9569 2.7616 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9569 2.7616 0.0000 O 0 5 0 0 0 0 0 0 0 0 0 0 + 2.6379 0.4771 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6379 -0.4771 0.0000 O 0 5 0 0 0 0 0 0 0 0 0 0 + 3.9569 -2.7616 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + -3.9569 -2.7616 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + -2.6379 -0.4771 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1 6 1 0 + 1 2 2 0 + 1 16 1 0 + 2 3 1 0 + 2 8 1 0 + 3 4 2 0 + 3 15 1 0 + 4 5 1 0 + 5 6 2 0 + 8 7 1 6 + 7 11 2 0 + 7 13 1 0 + 8 9 2 0 + 9 10 1 0 + 9 14 1 0 + 10 12 2 0 + 11 12 1 0 + 13 17 2 0 + 13 18 1 0 + 14 19 1 0 + 14 20 2 0 + 15 21 1 0 + 15 22 2 0 + 16 23 2 0 + 16 24 1 0 +M CHG 4 14 1 15 1 19 -1 21 -1 +M END +> +t11- or t11-,12-; m0 or m1 + +> +5 + +> +(1M)-6,6'-dinitro[1,1'-biphenyl]-2,2'-dicarboxylic acid + +> +InChI=1S/C14H8N2O8/c17-13(18)7-3-1-5-9(15(21)22)11(7)12-8(14(19)20)4-2-6-10(12)16(23)24/h1-6H,(H,17,18)(H,19,20) + +> +1-M + +$$$$ +atropisomers_test_file_1_v2.sdf + ChemDraw03052609263D + + 24 25 0 0 0 0 0 0 0 0999 V2000 + 1.3190 -2.7616 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -2.0001 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.3190 -2.7616 -0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.3190 -4.2846 -0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.0000 -5.0461 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3189 -4.2846 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3190 2.7616 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 2.0001 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.3190 2.7616 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.3189 4.2846 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3190 4.2846 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 5.0461 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6379 2.0001 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -2.6379 2.0001 0.0000 N 0 3 0 0 0 0 0 0 0 0 0 0 + -2.6379 -2.0001 0.0000 N 0 3 0 0 0 0 0 0 0 0 0 0 + 2.6379 -2.0001 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9569 2.7616 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6379 0.4771 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + -2.6379 0.4771 0.0000 O 0 5 0 0 0 0 0 0 0 0 0 0 + -3.9569 2.7616 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + -3.9569 -2.7616 0.0000 O 0 5 0 0 0 0 0 0 0 0 0 0 + -2.6379 -0.4771 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6379 -0.4771 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9569 -2.7616 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1 6 1 0 + 1 2 2 0 + 1 16 1 0 + 2 3 1 6 + 2 8 1 0 + 3 4 2 0 + 3 15 1 0 + 4 5 1 0 + 5 6 2 0 + 7 8 1 0 + 7 11 2 0 + 7 13 1 0 + 8 9 2 0 + 9 10 1 0 + 9 14 1 0 + 10 12 2 0 + 11 12 1 0 + 13 17 2 0 + 13 18 1 0 + 14 19 1 0 + 14 20 2 0 + 15 21 1 0 + 15 22 2 0 + 16 23 2 0 + 16 24 1 0 +M CHG 4 14 1 15 1 19 -1 21 -1 +M END +> +t11- or t11-,12-; m1 or m0 + +> +6 + +> +(1P)-6,6'-dinitro[1,1'-biphenyl]-2,2'-dicarboxylic acid + +> +InChI=1S/C14H8N2O8/c17-13(18)7-3-1-5-9(15(21)22)11(7)12-8(14(19)20)4-2-6-10(12)16(23)24/h1-6H,(H,17,18)(H,19,20) + +> +1-P + +$$$$ +atropisomers_test_file_1_v2.sdf + ChemDraw03052609263D + + 16 17 0 0 0 0 0 0 0 0999 V2000 + -1.3190 -1.5230 -0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -0.7615 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3190 -1.5230 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3190 -3.0460 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -3.8075 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.3190 -3.0460 -0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3190 1.5230 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 0.7615 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.3189 1.5230 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.3189 3.0460 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3190 3.0460 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 3.8075 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6379 0.7615 0.0000 Br 0 0 0 0 0 0 0 0 0 0 0 0 + -2.6379 0.7615 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6379 -0.7615 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + -2.6379 -0.7615 -0.0000 Br 0 0 0 0 0 0 0 0 0 0 0 0 + 1 6 1 0 + 1 2 2 0 + 1 16 1 0 + 2 3 1 0 + 2 8 1 0 + 3 4 2 0 + 3 15 1 0 + 4 5 1 0 + 5 6 2 0 + 7 8 2 0 + 7 11 1 0 + 7 13 1 0 + 8 9 1 1 + 9 10 2 0 + 9 14 1 0 + 10 12 1 0 + 11 12 2 0 +M END +> +t11- or t11-,12-; m0 or m1 + +> +7 + +> +(1M)-2,2'-dibromo-6,6'-dichloro-1,1'-biphenyl + +> +InChI=1S/C12H6Br2Cl2/c13-7-3-1-5-9(15)11(7)12-8(14)4-2-6-10(12)16/h1-6H + +> +2-M + +$$$$ +atropisomers_test_file_1_v2.sdf + ChemDraw03052609263D + + 16 17 0 0 0 0 0 0 0 0999 V2000 + -1.3190 -1.5230 -0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -0.7615 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3190 -1.5230 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3190 -3.0460 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -3.8075 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.3190 -3.0460 -0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3190 1.5230 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 0.7615 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.3189 1.5230 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.3189 3.0460 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3190 3.0460 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 3.8075 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6379 0.7615 0.0000 Br 0 0 0 0 0 0 0 0 0 0 0 0 + -2.6379 0.7615 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6379 -0.7615 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + -2.6379 -0.7615 -0.0000 Br 0 0 0 0 0 0 0 0 0 0 0 0 + 1 6 1 0 + 1 2 2 0 + 1 16 1 0 + 2 3 1 0 + 2 8 1 0 + 3 4 2 0 + 3 15 1 0 + 4 5 1 0 + 5 6 2 0 + 8 7 1 6 + 7 11 2 0 + 7 13 1 0 + 8 9 2 0 + 9 10 1 0 + 9 14 1 0 + 10 12 2 0 + 11 12 1 0 +M END +> +t11- or t11-,12-; m0 or m1 + +> +8 + +> +(1M)-2,2'-dibromo-6,6'-dichloro-1,1'-biphenyl + +> +InChI=1S/C12H6Br2Cl2/c13-7-3-1-5-9(15)11(7)12-8(14)4-2-6-10(12)16/h1-6H + +> +2-M + +$$$$ +atropisomers_test_file_1_v2.sdf + ChemDraw03052609263D + + 16 17 0 0 0 0 0 0 0 0999 V2000 + 1.3190 -1.5230 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -0.7615 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.3190 -1.5230 -0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.3190 -3.0460 -0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.0000 -3.8075 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3189 -3.0460 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3190 1.5230 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 0.7615 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.3189 1.5230 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.3189 3.0460 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3190 3.0460 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 3.8075 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6379 0.7615 0.0000 Br 0 0 0 0 0 0 0 0 0 0 0 0 + -2.6379 0.7615 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + -2.6379 -0.7615 -0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6379 -0.7615 0.0000 Br 0 0 0 0 0 0 0 0 0 0 0 0 + 1 6 1 0 + 1 2 2 0 + 1 16 1 0 + 2 3 1 0 + 2 8 1 0 + 3 4 2 0 + 3 15 1 0 + 4 5 1 0 + 5 6 2 0 + 7 8 2 0 + 7 11 1 0 + 7 13 1 0 + 8 9 1 6 + 9 10 2 0 + 9 14 1 0 + 10 12 1 0 + 11 12 2 0 +M END +> +t11- or t11-,12-; m0 or m1 + +> +9 + +> +(1M)-2,2'-dibromo-6,6'-dichloro-1,1'-biphenyl + +> +InChI=1S/C12H6Br2Cl2/c13-7-3-1-5-9(15)11(7)12-8(14)4-2-6-10(12)16/h1-6H + +> +2-M + +$$$$ +atropisomers_test_file_1_v2.sdf + ChemDraw03052609263D + + 16 17 0 0 0 0 0 0 0 0999 V2000 + 1.3190 -1.5230 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.0000 -0.7615 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.3190 -1.5230 -0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.3190 -3.0460 -0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.0000 -3.8075 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3189 -3.0460 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3190 1.5230 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 0.7615 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.3189 1.5230 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.3189 3.0460 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3190 3.0460 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 3.8075 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6379 0.7615 0.0000 Br 0 0 0 0 0 0 0 0 0 0 0 0 + -2.6379 0.7615 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + -2.6379 -0.7615 -0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6379 -0.7615 0.0000 Br 0 0 0 0 0 0 0 0 0 0 0 0 + 1 6 1 0 + 1 2 2 0 + 1 16 1 0 + 2 3 1 0 + 2 8 1 0 + 3 4 2 0 + 3 15 1 0 + 4 5 1 0 + 5 6 2 0 + 8 7 1 1 + 7 11 2 0 + 7 13 1 0 + 8 9 2 0 + 9 10 1 0 + 9 14 1 0 + 10 12 2 0 + 11 12 1 0 +M END +> +t11- or t11-,12-; m0 or m1 + +> +10 + +> +(1M)-2,2'-dibromo-6,6'-dichloro-1,1'-biphenyl + +> +InChI=1S/C12H6Br2Cl2/c13-7-3-1-5-9(15)11(7)12-8(14)4-2-6-10(12)16/h1-6H + +> +2-M + +$$$$ +atropisomers_test_file_1_v2.sdf + ChemDraw03052609263D + + 16 17 0 0 0 0 0 0 0 0999 V2000 + -1.3190 -1.5230 -0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -0.7615 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3190 -1.5230 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3190 -3.0460 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -3.8075 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.3190 -3.0460 -0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3190 1.5230 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 0.7615 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.3189 1.5230 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.3189 3.0460 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3190 3.0460 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 3.8075 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6379 0.7615 0.0000 Br 0 0 0 0 0 0 0 0 0 0 0 0 + -2.6379 0.7615 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6379 -0.7615 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + -2.6379 -0.7615 -0.0000 Br 0 0 0 0 0 0 0 0 0 0 0 0 + 1 6 1 0 + 1 2 2 0 + 1 16 1 0 + 2 3 1 1 + 2 8 1 0 + 3 4 2 0 + 3 15 1 0 + 4 5 1 0 + 5 6 2 0 + 7 8 2 0 + 7 11 1 0 + 7 13 1 0 + 8 9 1 1 + 9 10 2 0 + 9 14 1 0 + 10 12 1 0 + 11 12 2 0 +M END +> +t11- or t11-,12-; m0 or m1 + +> +11 + +> +(1M)-2,2'-dibromo-6,6'-dichloro-1,1'-biphenyl + +> +InChI=1S/C12H6Br2Cl2/c13-7-3-1-5-9(15)11(7)12-8(14)4-2-6-10(12)16/h1-6H + +> +2-M + +$$$$ +atropisomers_test_file_1_v2.sdf + ChemDraw03052609263D + + 16 17 0 0 0 0 0 0 0 0999 V2000 + -1.3190 -1.5230 -0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -0.7615 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3190 -1.5230 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3190 -3.0460 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -3.8075 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.3190 -3.0460 -0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3190 1.5230 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 0.7615 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.3189 1.5230 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.3189 3.0460 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3190 3.0460 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 3.8075 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6379 0.7615 0.0000 Br 0 0 0 0 0 0 0 0 0 0 0 0 + -2.6379 0.7615 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6379 -0.7615 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + -2.6379 -0.7615 -0.0000 Br 0 0 0 0 0 0 0 0 0 0 0 0 + 1 6 1 0 + 1 2 2 0 + 1 16 1 0 + 2 3 1 1 + 2 8 1 0 + 3 4 2 0 + 3 15 1 0 + 4 5 1 0 + 5 6 2 0 + 8 7 1 6 + 7 11 2 0 + 7 13 1 0 + 8 9 2 0 + 9 10 1 0 + 9 14 1 0 + 10 12 2 0 + 11 12 1 0 +M END +> +t11- or t11-,12-; m0 or m1 + +> +12 + +> +(1M)-2,2'-dibromo-6,6'-dichloro-1,1'-biphenyl + +> +InChI=1S/C12H6Br2Cl2/c13-7-3-1-5-9(15)11(7)12-8(14)4-2-6-10(12)16/h1-6H + +> +2-M + +$$$$ +atropisomers_test_file_1_v2.sdf + ChemDraw03052609263D + + 16 17 0 0 0 0 0 0 0 0999 V2000 + 1.3190 -1.5230 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.0000 -0.7615 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.3190 -1.5230 -0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.3190 -3.0460 -0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.0000 -3.8075 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3189 -3.0460 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3190 1.5230 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 0.7615 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.3189 1.5230 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.3189 3.0460 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3190 3.0460 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 3.8075 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6379 0.7615 0.0000 Br 0 0 0 0 0 0 0 0 0 0 0 0 + -2.6379 0.7615 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + -2.6379 -0.7615 -0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6379 -0.7615 0.0000 Br 0 0 0 0 0 0 0 0 0 0 0 0 + 1 6 1 0 + 1 2 2 0 + 1 16 1 0 + 2 3 1 1 + 2 8 1 0 + 3 4 2 0 + 3 15 1 0 + 4 5 1 0 + 5 6 2 0 + 7 8 2 0 + 7 11 1 0 + 7 13 1 0 + 8 9 1 6 + 9 10 2 0 + 9 14 1 0 + 10 12 1 0 + 11 12 2 0 +M END +> +t11- or t11-,12-; m0 or m1 + +> +13 + +> +(1M)-2,2'-dibromo-6,6'-dichloro-1,1'-biphenyl + +> +InChI=1S/C12H6Br2Cl2/c13-7-3-1-5-9(15)11(7)12-8(14)4-2-6-10(12)16/h1-6H + +> +2-M + +$$$$ +atropisomers_test_file_1_v2.sdf + ChemDraw03052609263D + + 16 17 0 0 0 0 0 0 0 0999 V2000 + 1.3190 -1.5230 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.0000 -0.7615 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.3190 -1.5230 -0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.3190 -3.0460 -0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.0000 -3.8075 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3189 -3.0460 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3190 1.5230 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 0.7615 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.3189 1.5230 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.3189 3.0460 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3190 3.0460 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 3.8075 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6379 0.7615 0.0000 Br 0 0 0 0 0 0 0 0 0 0 0 0 + -2.6379 0.7615 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + -2.6379 -0.7615 -0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6379 -0.7615 0.0000 Br 0 0 0 0 0 0 0 0 0 0 0 0 + 1 6 1 0 + 1 2 2 0 + 1 16 1 0 + 2 3 1 1 + 2 8 1 0 + 3 4 2 0 + 3 15 1 0 + 4 5 1 0 + 5 6 2 0 + 8 7 1 1 + 7 11 2 0 + 7 13 1 0 + 8 9 2 0 + 9 10 1 0 + 9 14 1 0 + 10 12 2 0 + 11 12 1 0 +M END +> +t11- or t11-,12-; m0 or m1 + +> +14 + +> +(1M)-2,2'-dibromo-6,6'-dichloro-1,1'-biphenyl + +> +InChI=1S/C12H6Br2Cl2/c13-7-3-1-5-9(15)11(7)12-8(14)4-2-6-10(12)16/h1-6H + +> +2-M + +$$$$ +atropisomers_test_file_1_v2.sdf + ChemDraw03052609263D + + 16 17 0 0 0 0 0 0 0 0999 V2000 + 1.3190 -1.5230 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.0000 -0.7615 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.3190 -1.5230 -0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.3190 -3.0460 -0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.0000 -3.8075 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3189 -3.0460 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3190 1.5230 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 0.7615 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.3189 1.5230 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.3189 3.0460 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3190 3.0460 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 3.8075 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6379 0.7615 0.0000 Br 0 0 0 0 0 0 0 0 0 0 0 0 + -2.6379 0.7615 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + -2.6379 -0.7615 -0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6379 -0.7615 0.0000 Br 0 0 0 0 0 0 0 0 0 0 0 0 + 1 6 1 0 + 1 2 2 0 + 1 16 1 0 + 2 3 1 1 + 2 8 1 0 + 3 4 2 0 + 3 15 1 0 + 4 5 1 0 + 5 6 2 0 + 7 8 2 0 + 7 11 1 0 + 7 13 1 0 + 8 9 1 1 + 9 10 2 0 + 9 14 1 0 + 10 12 1 0 + 11 12 2 0 +M END +> +No stereo + +> +15 + +> +2,2'-dibromo-6,6'-dichloro-1,1'-biphenyl + +> +InChI=1S/C12H6Br2Cl2/c13-7-3-1-5-9(15)11(7)12-8(14)4-2-6-10(12)16/h1-6H + +> +InChI=1S/C12H6Br2Cl2/c13-7-3-1-5-9(15)11(7)12-8(14)4-2-6-10(12)16/h1-6H + +> +2-0 + +$$$$ +atropisomers_test_file_1_v2.sdf + ChemDraw03052609263D + + 16 17 0 0 0 0 0 0 0 0999 V2000 + -1.3190 -1.5230 -0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.0000 -0.7615 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3190 -1.5230 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3190 -3.0460 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.0000 -3.8075 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.3190 -3.0460 -0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3190 1.5230 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 0.7615 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.3189 1.5230 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.3189 3.0460 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3190 3.0460 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 3.8075 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6379 0.7615 0.0000 Br 0 0 0 0 0 0 0 0 0 0 0 0 + -2.6379 0.7615 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6379 -0.7615 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + -2.6379 -0.7615 -0.0000 Br 0 0 0 0 0 0 0 0 0 0 0 0 + 1 6 1 0 + 1 2 2 0 + 1 16 1 0 + 2 3 1 6 + 2 8 1 0 + 3 4 2 0 + 3 15 1 0 + 4 5 1 0 + 5 6 2 0 + 8 7 1 6 + 7 11 2 0 + 7 13 1 0 + 8 9 2 0 + 9 10 1 0 + 9 14 1 0 + 10 12 2 0 + 11 12 1 0 +M END +> +no stereo + +> +16 + +> +2,2'-dibromo-6,6'-dichloro-1,1'-biphenyl + +> +InChI=1S/C12H6Br2Cl2/c13-7-3-1-5-9(15)11(7)12-8(14)4-2-6-10(12)16/h1-6H + +> +InChI=1S/C12H6Br2Cl2/c13-7-3-1-5-9(15)11(7)12-8(14)4-2-6-10(12)16/h1-6H + +> +2-0 + +$$$$ +atropisomers_test_file_1_v2.sdf + ChemDraw03052609263D + + 22 25 0 0 0 0 0 0 0 0999 V2000 + 3.2974 -0.7615 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9784 -1.5230 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6595 -0.7615 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.6595 -1.5230 -0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.6595 -3.0460 -0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6595 -3.8075 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9784 -3.0460 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.2974 0.7615 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9784 1.5230 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6595 0.7615 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.6595 1.5230 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.6595 3.0460 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.9784 3.8075 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -3.2974 3.0460 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -3.2974 1.5230 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.9784 0.7615 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.9784 -0.7615 -0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -3.2974 -1.5230 -0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -3.2974 -3.0460 -0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.9784 -3.8075 -0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9785 3.0460 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6595 3.8075 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 + 2 7 1 0 + 2 3 2 0 + 3 4 1 0 + 3 10 1 0 + 4 5 1 0 + 4 17 2 0 + 5 20 2 0 + 5 6 1 0 + 6 7 2 0 + 8 9 1 0 + 10 9 1 1 + 9 21 2 0 + 10 11 2 0 + 11 16 1 0 + 11 12 1 0 + 12 22 2 0 + 12 13 1 0 + 13 14 2 0 + 14 15 1 0 + 15 16 2 0 + 17 18 1 0 + 18 19 2 0 + 19 20 1 0 + 22 21 1 1 +M END +> +t19- or t19-,20-; m0 or m1 + +> +17 + +> +(1M)-[1,1'-binaphthalene]-2,2'-diol + +> +InChI=1S/C20H14O2/c21-17-11-9-13-5-1-3-7-15(13)19(17)20-16-8-4-2-6-14(16)10-12-18(20)22/h1-12,21-22H + +> +3-M + +$$$$ +atropisomers_test_file_1_v2.sdf + ChemDraw03052609263D + + 22 25 0 0 0 0 0 0 0 0999 V2000 + 3.2974 -0.7615 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9784 -1.5230 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6595 -0.7615 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.6595 -1.5230 -0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.6595 -3.0460 -0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6595 -3.8075 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9784 -3.0460 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.2974 0.7615 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9784 1.5230 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6595 0.7615 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.6595 1.5230 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.6595 3.0460 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.9784 3.8075 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -3.2974 3.0460 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -3.2974 1.5230 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.9784 0.7615 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.9784 -0.7615 -0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -3.2974 -1.5230 -0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -3.2974 -3.0460 -0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.9784 -3.8075 -0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9785 3.0460 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6595 3.8075 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 + 2 7 1 0 + 2 3 2 0 + 3 4 1 1 + 3 10 1 0 + 4 5 1 0 + 4 17 2 0 + 5 20 2 0 + 5 6 1 0 + 6 7 2 0 + 8 9 1 0 + 9 10 1 0 + 9 21 2 0 + 10 11 2 0 + 11 16 1 0 + 11 12 1 0 + 12 22 2 0 + 12 13 1 0 + 13 14 2 0 + 14 15 1 0 + 15 16 2 0 + 17 18 1 0 + 18 19 2 0 + 19 20 1 0 + 21 22 1 0 +M END +> +t19- or t19-,20-; m0 or m1 + +> +18 + +> +(1M)-[1,1'-binaphthalene]-2,2'-diol + +> +InChI=1S/C20H14O2/c21-17-11-9-13-5-1-3-7-15(13)19(17)20-16-8-4-2-6-14(16)10-12-18(20)22/h1-12,21-22H + +> +3-M + +$$$$ +atropisomers_test_file_1_v2.sdf + ChemDraw03052609263D + + 22 25 0 0 0 0 0 0 0 0999 V2000 + 3.2974 -0.7615 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9784 -1.5230 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6595 -0.7615 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.6595 -1.5230 -0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.6595 -3.0460 -0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6595 -3.8075 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9784 -3.0460 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.2974 0.7615 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9784 1.5230 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6595 0.7615 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.6595 1.5230 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.6595 3.0460 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.9784 3.8075 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -3.2974 3.0460 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -3.2974 1.5230 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.9784 0.7615 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.9784 -0.7615 -0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -3.2974 -1.5230 -0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -3.2974 -3.0460 -0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.9784 -3.8075 -0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9785 3.0460 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6595 3.8075 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 + 2 7 1 0 + 2 3 2 0 + 3 4 1 6 + 3 10 1 0 + 4 5 1 0 + 4 17 2 0 + 5 20 2 0 + 5 6 1 0 + 6 7 2 0 + 8 9 1 0 + 9 10 1 0 + 9 21 2 0 + 10 11 2 0 + 11 16 1 0 + 11 12 1 0 + 12 22 2 0 + 12 13 1 0 + 13 14 2 0 + 14 15 1 0 + 15 16 2 0 + 17 18 1 0 + 18 19 2 0 + 19 20 1 0 + 21 22 1 0 +M END +> +t19- or t19-,20-; m1 or m0 + +> +19 + +> +(1P)-[1,1'-binaphthalene]-2,2'-diol + +> +InChI=1S/C20H14O2/c21-17-11-9-13-5-1-3-7-15(13)19(17)20-16-8-4-2-6-14(16)10-12-18(20)22/h1-12,21-22H + +> +3-P + +$$$$ +atropisomers_test_file_1_v2.sdf + ChemDraw03052609263D + + 22 25 0 0 0 0 0 0 0 0999 V2000 + 3.2974 -0.7615 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9784 -1.5230 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6595 -0.7615 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.6595 -1.5230 -0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.6595 -3.0460 -0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6595 -3.8075 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9784 -3.0460 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.2974 0.7615 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9784 1.5230 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6595 0.7615 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.6595 1.5230 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.6595 3.0460 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.9784 3.8075 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -3.2974 3.0460 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -3.2974 1.5230 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.9784 0.7615 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.9784 -0.7615 -0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -3.2974 -1.5230 -0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -3.2974 -3.0460 -0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.9784 -3.8075 -0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9785 3.0460 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6595 3.8075 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 + 2 7 1 0 + 2 3 2 0 + 3 4 1 6 + 3 10 1 0 + 4 5 1 0 + 4 17 2 0 + 5 20 2 0 + 5 6 1 0 + 6 7 2 0 + 8 9 1 0 + 10 9 1 6 + 9 21 2 0 + 10 11 2 0 + 11 16 1 0 + 11 12 1 0 + 12 22 2 0 + 12 13 1 0 + 13 14 2 0 + 14 15 1 0 + 15 16 2 0 + 17 18 1 0 + 18 19 2 0 + 19 20 1 0 + 21 22 1 0 +M END +> +t19- or t19-,20-; m1 or m0 + +> +20 + +> +(1P)-[1,1'-binaphthalene]-2,2'-diol + +> +InChI=1S/C20H14O2/c21-17-11-9-13-5-1-3-7-15(13)19(17)20-16-8-4-2-6-14(16)10-12-18(20)22/h1-12,21-22H + +> +3-P + +$$$$ +atropisomers_test_file_1_v2.sdf + ChemDraw03052609263D + + 22 25 0 0 0 0 0 0 0 0999 V2000 + 3.2974 -0.7615 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9784 -1.5230 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6595 -0.7615 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.6595 -1.5230 -0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.6595 -3.0460 -0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6595 -3.8075 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9784 -3.0460 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.2974 0.7615 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9784 1.5230 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6595 0.7615 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.6595 1.5230 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.6595 3.0460 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.9784 3.8075 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -3.2974 3.0460 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -3.2974 1.5230 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.9784 0.7615 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.9784 -0.7615 -0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -3.2974 -1.5230 -0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -3.2974 -3.0460 -0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.9784 -3.8075 -0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9785 3.0460 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6595 3.8075 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 + 2 7 2 0 + 3 2 1 1 + 3 4 2 0 + 3 10 1 0 + 4 5 1 0 + 4 17 1 0 + 5 20 1 0 + 5 6 2 0 + 6 7 1 0 + 8 9 1 0 + 10 9 1 6 + 9 21 2 0 + 10 11 2 0 + 11 16 1 0 + 11 12 1 0 + 12 22 2 0 + 12 13 1 0 + 13 14 2 0 + 14 15 1 0 + 15 16 2 0 + 17 18 2 0 + 18 19 1 0 + 19 20 2 0 + 21 22 1 0 +M END +> +t19- or t19-,20-; m1 or m0 + +> +21 + +> +(1P)-[1,1'-binaphthalene]-2,2'-diol + +> +InChI=1S/C20H14O2/c21-17-11-9-13-5-1-3-7-15(13)19(17)20-16-8-4-2-6-14(16)10-12-18(20)22/h1-12,21-22H + +> +3-P + +$$$$ +atropisomers_test_file_1_v2.sdf + ChemDraw03052609263D + + 23 26 0 0 0 0 0 0 0 0999 V2000 + 5.2409 -0.0061 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 4.3393 1.2245 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.8894 0.7615 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.8894 -0.7737 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.3393 -1.2367 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3664 0.7615 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0384 1.5169 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.2775 0.7615 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.2775 -0.7737 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0384 -1.5291 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3664 -0.7737 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0384 3.0521 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.2775 3.8075 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -2.5934 3.0521 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -2.5934 1.5169 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -2.5934 -1.5291 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -2.5934 -3.0521 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.2775 -3.8075 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0384 -3.0521 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -3.9214 3.8075 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + -5.2409 3.0229 -0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -3.9214 -3.8075 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + -5.2373 -3.0521 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 + 1 5 1 0 + 2 3 1 0 + 3 6 1 0 + 3 4 1 0 + 4 11 1 0 + 4 5 1 0 + 6 7 1 0 + 7 12 2 0 + 8 7 1 1 + 8 15 2 0 + 8 9 1 0 + 9 10 2 0 + 9 16 1 1 + 10 19 1 0 + 10 11 1 0 + 13 12 1 1 + 13 14 2 0 + 14 15 1 0 + 14 20 1 0 + 16 17 2 0 + 18 17 1 1 + 17 22 1 0 + 18 19 2 0 + 20 21 1 0 + 22 23 1 0 +M END +> +cyclic + +> +22 + +> +(8aM)-7,10-dimethoxy-1,3,3a,4,13,13a-hexahydrodibenzo[4,5:6,7]cycloocta[1,2-c]furan + +> +InChI=1S/C20H22O3/c1-21-17-5-3-13-7-15-11-23-12-16(15)8-14-4-6-18(22-2)10-20(14)19(13)9-17/h3-6,9-10,15-16H,7-8,11-12H2,1-2H3 + +> +4-M + +$$$$ +atropisomers_test_file_1_v2.sdf + ChemDraw03052609263D + + 23 26 0 0 0 0 0 0 0 0999 V2000 + 5.2409 -0.0061 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 4.3393 1.2245 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.8894 0.7615 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.8894 -0.7737 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.3393 -1.2367 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3664 0.7615 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0384 1.5169 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.2775 0.7615 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.2775 -0.7737 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0384 -1.5291 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3664 -0.7737 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0384 3.0521 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.2775 3.8075 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -2.5934 3.0521 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -2.5934 1.5169 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -2.5934 -1.5291 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -2.5934 -3.0521 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.2775 -3.8075 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0384 -3.0521 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -3.9214 3.8075 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + -5.2409 3.0229 -0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -3.9214 -3.8075 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + -5.2373 -3.0521 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 + 1 5 1 0 + 2 3 1 0 + 3 6 1 0 + 3 4 1 0 + 4 11 1 0 + 4 5 1 0 + 6 7 1 0 + 7 12 2 0 + 8 7 1 1 + 8 15 2 0 + 8 9 1 0 + 9 10 2 0 + 9 16 1 0 + 10 19 1 0 + 10 11 1 0 + 12 13 1 0 + 13 14 2 0 + 14 15 1 0 + 14 20 1 0 + 16 17 2 0 + 17 18 1 0 + 17 22 1 0 + 18 19 2 0 + 20 21 1 0 + 22 23 1 0 +M END +> +cyclic + +> +23 + +> +(8aM)-7,10-dimethoxy-1,3,3a,4,13,13a-hexahydrodibenzo[4,5:6,7]cycloocta[1,2-c]furan + +> +InChI=1S/C20H22O3/c1-21-17-5-3-13-7-15-11-23-12-16(15)8-14-4-6-18(22-2)10-20(14)19(13)9-17/h3-6,9-10,15-16H,7-8,11-12H2,1-2H3 + +> +4-M + +$$$$ +atropisomers_test_file_1_v2.sdf + ChemDraw03052609263D + + 23 26 0 0 0 0 0 0 0 0999 V2000 + 5.2409 -0.0061 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 4.3393 1.2245 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.8894 0.7615 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.8894 -0.7737 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.3393 -1.2367 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3664 0.7615 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0384 1.5169 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.2775 0.7615 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.2775 -0.7737 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0384 -1.5291 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3664 -0.7737 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0384 3.0521 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.2775 3.8075 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -2.5934 3.0521 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -2.5934 1.5169 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -2.5934 -1.5291 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -2.5934 -3.0521 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.2775 -3.8075 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0384 -3.0521 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -3.9214 3.8075 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + -5.2409 3.0229 -0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -3.9214 -3.8075 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + -5.2373 -3.0521 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 + 1 5 1 0 + 2 3 1 0 + 3 6 1 0 + 3 4 1 0 + 4 11 1 0 + 4 5 1 0 + 6 7 1 0 + 7 12 2 0 + 8 7 1 1 + 8 15 2 0 + 8 9 1 0 + 9 10 1 6 + 9 16 2 0 + 10 19 2 0 + 10 11 1 0 + 12 13 1 0 + 13 14 2 0 + 14 15 1 0 + 14 20 1 0 + 16 17 1 0 + 17 18 2 0 + 17 22 1 0 + 18 19 1 0 + 20 21 1 0 + 22 23 1 0 +M END +> +cyclic + +> +24 + +> +(8aM)-7,10-dimethoxy-1,3,3a,4,13,13a-hexahydrodibenzo[4,5:6,7]cycloocta[1,2-c]furan + +> +InChI=1S/C20H22O3/c1-21-17-5-3-13-7-15-11-23-12-16(15)8-14-4-6-18(22-2)10-20(14)19(13)9-17/h3-6,9-10,15-16H,7-8,11-12H2,1-2H3 + +> +4-M + +$$$$ +atropisomers_test_file_1_v2.sdf + ChemDraw03052609263D + + 23 26 0 0 0 0 0 0 0 0999 V2000 + 5.2409 -0.0061 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 4.3393 1.2245 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.8894 0.7615 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.8894 -0.7737 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.3393 -1.2367 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3664 0.7615 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0384 1.5169 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.2775 0.7615 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.2775 -0.7737 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0384 -1.5291 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3664 -0.7737 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0384 3.0521 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.2775 3.8075 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -2.5934 3.0521 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -2.5934 1.5169 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -2.5934 -1.5291 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -2.5934 -3.0521 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.2775 -3.8075 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0384 -3.0521 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -3.9214 3.8075 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + -5.2409 3.0229 -0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -3.9214 -3.8075 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + -5.2373 -3.0521 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 + 1 5 1 0 + 2 3 1 0 + 3 6 1 0 + 3 4 1 0 + 4 11 1 0 + 4 5 1 0 + 6 7 1 0 + 7 12 2 0 + 7 8 1 0 + 8 15 2 0 + 8 9 1 0 + 9 10 1 6 + 9 16 2 0 + 10 19 2 0 + 10 11 1 0 + 12 13 1 0 + 13 14 2 0 + 14 15 1 0 + 14 20 1 0 + 16 17 1 0 + 17 18 2 0 + 17 22 1 0 + 18 19 1 0 + 20 21 1 0 + 22 23 1 0 +M END +> +cyclic + +> +25 + +> +(8aM)-7,10-dimethoxy-1,3,3a,4,13,13a-hexahydrodibenzo[4,5:6,7]cycloocta[1,2-c]furan + +> +InChI=1S/C20H22O3/c1-21-17-5-3-13-7-15-11-23-12-16(15)8-14-4-6-18(22-2)10-20(14)19(13)9-17/h3-6,9-10,15-16H,7-8,11-12H2,1-2H3 + +> +4-M + +$$$$ +atropisomers_test_file_1_v2.sdf + ChemDraw03052609263D + + 23 26 0 0 0 0 0 0 0 0999 V2000 + 5.2409 -0.0061 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 4.3393 1.2245 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.8894 0.7615 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.8894 -0.7737 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.3393 -1.2367 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3664 0.7615 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0384 1.5169 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.2775 0.7615 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.2775 -0.7737 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0384 -1.5291 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3664 -0.7737 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0384 3.0521 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.2775 3.8075 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -2.5934 3.0521 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -2.5934 1.5169 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -2.5934 -1.5291 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -2.5934 -3.0521 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.2775 -3.8075 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0384 -3.0521 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -3.9214 3.8075 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + -5.2409 3.0229 -0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -3.9214 -3.8075 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + -5.2373 -3.0521 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 + 1 5 1 0 + 2 3 1 0 + 3 6 1 0 + 3 4 1 0 + 4 11 1 0 + 4 5 1 0 + 6 7 1 0 + 7 12 2 0 + 7 8 1 0 + 8 15 2 0 + 8 9 1 0 + 9 10 1 1 + 9 16 2 0 + 10 19 2 0 + 10 11 1 0 + 12 13 1 0 + 13 14 2 0 + 14 15 1 0 + 14 20 1 0 + 16 17 1 0 + 17 18 2 0 + 17 22 1 0 + 18 19 1 0 + 20 21 1 0 + 22 23 1 0 +M END +> +cyclic + +> +26 + +> +(8a%{P})-7,10-dimethoxy-1,3,3a,4,13,13a-hexahydrodibenzo[4,5:6,7]cycloocta[1,2-%{c}]furan + +> +InChI=1S/C20H22O3/c1-21-17-5-3-13-7-15-11-23-12-16(15)8-14-4-6-18(22-2)10-20(14)19(13)9-17/h3-6,9-10,15-16H,7-8,11-12H2,1-2H3 + +> +4-P + +$$$$ +atropisomers_test_file_1_v2.sdf + ChemDraw03052609262D + + 21 23 0 0 0 0 0 0 0 0999 V2000 + 0.3688 -0.9413 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.3688 -1.7663 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.3457 -0.5288 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.3457 -2.1788 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.0602 -0.9413 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.0602 -1.7663 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.3457 0.2962 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 0.3218 0.7811 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.0131 0.7811 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0668 1.5657 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.7582 1.5657 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.0833 -0.5288 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.7746 -0.5288 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1287 0.6096 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.6808 1.2227 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6189 2.1788 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.4258 2.0073 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.7977 0.5262 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6708 0.1857 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.4958 -1.2433 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.7977 -0.1163 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 + 1 3 2 0 + 1 12 1 0 + 2 4 2 0 + 3 5 1 0 + 3 7 1 0 + 4 6 1 0 + 5 6 2 0 + 5 13 1 0 + 7 8 1 1 + 7 9 1 6 + 8 14 1 0 + 8 10 2 0 + 9 11 2 0 + 9 18 1 0 + 10 11 1 0 + 10 16 1 0 + 12 19 1 0 + 12 20 1 0 + 12 21 1 0 + 14 15 2 0 + 15 17 1 0 + 16 17 2 0 +M END +> +C-N bond + +> +27 + +> +(1%{M})-1-(2-%{tert}-butyl-6-methylphenyl)-2-methyl-1%{H}-indole + +> +InChI=1S/C20H23N/c1-14-9-8-11-17(20(3,4)5)19(14)21-15(2)13-16-10-6-7-12-18(16)21/h6-13H,1-5H3 + +> +5-M + +$$$$ +atropisomers_test_file_1_v2.sdf + ChemDraw03052609262D + + 21 23 0 0 0 0 0 0 0 0999 V2000 + 0.6547 -0.9359 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6583 -1.7639 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.0569 -0.5262 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.0583 -2.1736 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.7681 -0.9377 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.7644 -1.7657 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.0569 0.2945 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + -0.7220 0.7759 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6033 0.7803 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.4678 1.5608 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.3549 1.5661 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3695 -0.5316 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.4796 -0.5281 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.5293 0.6037 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -2.0826 1.2165 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.0210 2.1736 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.8284 2.0014 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3882 0.5262 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.9545 0.1868 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.7827 -1.2375 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.0826 -0.1149 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 + 1 3 2 0 + 1 12 1 0 + 2 4 2 0 + 3 5 1 0 + 3 7 1 0 + 4 6 1 0 + 5 6 2 0 + 5 13 1 0 + 7 8 1 1 + 7 9 1 6 + 8 14 1 0 + 8 10 2 0 + 9 11 2 0 + 9 18 1 0 + 10 11 1 0 + 10 16 1 0 + 12 19 1 0 + 12 20 1 0 + 12 21 1 0 + 14 15 2 0 + 15 17 1 0 + 16 17 2 0 +M END +> +C-N bond + +> +28 + +> +(1%{M})-1-(2-%{tert}-butyl-6-methylphenyl)-2-methyl-1%{H}-indole + +> +InChI=1S/C20H23N/c1-14-9-8-11-17(20(3,4)5)19(14)21-15(2)13-16-10-6-7-12-18(16)21/h6-13H,1-5H3 + +> +??? + +> +5-M + +$$$$ +atropisomers_test_file_1_v2.sdf + ChemDraw03052609262D + + 22 25 0 0 0 0 0 0 0 0999 V2000 + -0.0000 0.4125 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + -0.6675 0.8974 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6674 0.8975 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.4125 1.6820 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.4124 1.6822 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.4744 0.7259 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -2.0264 1.3390 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.9645 2.2951 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.7715 2.1236 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.4521 0.6426 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -0.4125 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6675 -0.8974 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.6674 -0.8975 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.4125 -1.6820 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.4124 -1.6822 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.4744 -0.7259 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.0264 -1.3390 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.9645 -2.2951 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.7715 -2.1236 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.4521 -0.6426 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.0652 1.1946 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -2.0652 -1.1946 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 1 + 1 3 1 6 + 1 11 1 0 + 2 6 1 0 + 2 4 2 0 + 3 5 2 0 + 3 10 1 0 + 4 5 1 0 + 4 8 1 0 + 6 7 2 0 + 7 9 1 0 + 8 9 2 0 + 10 21 1 0 + 11 12 1 1 + 11 13 1 6 + 12 16 1 0 + 12 14 2 0 + 13 15 2 0 + 13 20 1 0 + 14 15 1 0 + 14 18 1 0 + 16 17 2 0 + 17 19 1 0 + 18 19 2 0 + 20 22 1 0 +M END +> +N-N bond + +> +29 + +> +(1%{M})-2,2'-diethyl-1,1'-biindole + +> +InChI=1S/C20H20N2/c1-3-17-13-15-9-5-7-11-19(15)21(17)22-18(4-2)14-16-10-6-8-12-20(16)22/h5-14H,3-4H2,1-2H3 + +> +6-M + +$$$$ +atropisomers_test_file_1_v2.sdf + ChemDraw03052609262D + + 22 25 0 0 0 0 0 0 0 0999 V2000 + -0.0000 0.4125 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + -0.6675 0.8974 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6674 0.8975 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.4125 1.6820 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.4124 1.6822 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.4744 0.7259 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -2.0264 1.3390 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.9645 2.2951 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.7715 2.1236 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.4521 0.6426 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -0.4125 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6675 -0.8974 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.6674 -0.8975 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.4125 -1.6820 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.4124 -1.6822 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.4744 -0.7259 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.0264 -1.3390 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.9645 -2.2951 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.7715 -2.1236 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.4521 -0.6426 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.0652 1.1946 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -2.0652 -1.1946 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 + 1 3 1 0 + 1 11 1 0 + 2 6 1 0 + 2 4 2 0 + 3 5 2 0 + 3 10 1 0 + 4 5 1 0 + 4 8 1 0 + 6 7 2 0 + 7 9 1 0 + 8 9 2 0 + 10 21 1 0 + 11 12 1 6 + 11 13 1 1 + 12 16 1 0 + 12 14 2 0 + 13 15 2 0 + 13 20 1 0 + 14 15 1 0 + 14 18 1 0 + 16 17 2 0 + 17 19 1 0 + 18 19 2 0 + 20 22 1 0 +M END +> +N-N bond + +> +30 + +> +(1%{P})-2,2'-diethyl-1,1'-biindole + +> +InChI=1S/C20H20N2/c1-3-17-13-15-9-5-7-11-19(15)21(17)22-18(4-2)14-16-10-6-8-12-20(16)22/h5-14H,3-4H2,1-2H3 + +> +6-P + +$$$$ +atropisomers_test_file_1_v2.sdf + ChemDraw03052609262D + + 22 25 0 0 1 0 0 0 0 0999 V2000 + -0.0000 0.4125 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + -0.6675 0.8974 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6674 0.8975 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.4125 1.6820 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.4124 1.6822 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.4744 0.7259 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -2.0264 1.3390 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.9645 2.2951 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.7715 2.1236 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.4521 0.6426 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -0.4125 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6675 -0.8974 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.6674 -0.8975 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.4125 -1.6820 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.4124 -1.6822 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.4744 -0.7259 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.0264 -1.3390 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.9645 -2.2951 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.7715 -2.1236 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.4521 -0.6426 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.0652 1.1946 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -2.0652 -1.1946 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 + 3 1 1 1 + 1 11 1 0 + 2 6 1 0 + 2 4 2 0 + 3 5 1 0 + 3 10 1 0 + 4 5 1 0 + 4 8 1 0 + 6 7 2 0 + 7 9 1 0 + 8 9 2 0 + 10 21 1 0 + 11 12 1 6 + 11 13 1 1 + 12 16 1 0 + 12 14 2 0 + 13 15 2 0 + 13 20 1 0 + 14 15 1 0 + 14 18 1 0 + 16 17 2 0 + 17 19 1 0 + 18 19 2 0 + 20 22 1 0 +M END +> +no atropisomers? wedge direction? Absent double bond? + +> +31 + +> +(2%{R})-2,2'-diethyl-2,3-dihydro-1,1'-biindole + +> +InChI=1S/C20H22N2/c1-3-17-13-15-9-5-7-11-19(15)21(17)22-18(4-2)14-16-10-6-8-12-20(16)22/h5-13,18H,3-4,14H2,1-2H3/t18-/m1/s1 + +> +InChI=1S/C20H22N2/c1-3-17-13-15-9-5-7-11-19(15)21(17)22-18(4-2)14-16-10-6-8-12-20(16)22/h5-13,18H,3-4,14H2,1-2H3/t18-/m1/s1 + +> +7-0 + +$$$$ +atropisomers_test_file_1_v2.sdf + ChemDraw03052609262D + + 18 20 0 0 1 0 0 0 0 0999 V2000 + 0.2954 0.1060 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + -0.3721 0.5910 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.9628 0.5910 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.1172 1.3756 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.7078 1.3757 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.1790 0.4195 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.7310 1.0326 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.6691 1.9886 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.4761 1.8171 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.7475 0.3361 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.2954 -0.7190 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 0.9628 -1.2039 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.3721 -1.2039 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.7079 -1.9885 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.1170 -1.9886 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.7698 -1.0324 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.1567 -0.9490 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.7698 -1.5011 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 1 + 1 3 1 6 + 1 11 1 0 + 2 6 1 0 + 2 4 2 0 + 3 5 2 0 + 3 10 1 0 + 4 5 1 0 + 4 8 1 0 + 6 7 2 0 + 7 9 1 0 + 8 9 2 0 + 12 11 1 1 + 11 13 1 0 + 12 16 1 0 + 12 14 1 0 + 13 15 1 0 + 13 17 1 1 + 14 15 2 0 + 17 18 1 0 +M END +> +no atropisomers, absent double bond? + +> +32 + +> +1-[(2%{R},5%{S})-2-ethyl-5-methyl-2,5-dihydro-1%{H}-pyrrol-1-yl]-2-methyl-1%{H}-indole + +> +InChI=1S/C16H20N2/c1-4-15-10-9-12(2)17(15)18-13(3)11-14-7-5-6-8-16(14)18/h5-12,15H,4H2,1-3H3/t12-,15+/m0/s1 + +> +8-0 + +$$$$ +atropisomers_test_file_1_v2.sdf + ChemDraw03052609262D + + 16 17 0 0 0 0 0 0 0 0999 V2000 + 0.2954 0.2223 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.2954 -0.6027 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 0.9628 -1.0876 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.3720 -1.0876 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.7079 -1.8722 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.1170 -1.8723 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.7698 -0.9161 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + -1.1567 -0.8327 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.7698 -1.3848 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.3282 -0.0258 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.4191 0.6348 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.0099 0.6349 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.4191 1.4599 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.0099 1.4598 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.2954 1.8723 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.7244 0.2224 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 + 1 11 1 0 + 1 12 2 0 + 2 3 1 1 + 2 4 1 0 + 3 7 2 0 + 3 5 1 0 + 4 6 1 0 + 4 8 2 0 + 5 6 2 0 + 8 9 1 0 + 8 10 1 0 + 11 13 2 0 + 12 14 1 0 + 12 16 1 0 + 13 15 1 0 + 14 15 2 0 +M END +> +C-N bond + +> +33 + +> +(1%{P})-1-(2-methylphenyl)-5-(propan-2-ylidene)-1,5-dihydro-2%{H}-pyrrol-2-one + +> +InChI=1S/C14H15NO/c1-10(2)12-8-9-14(16)15(12)13-7-5-4-6-11(13)3/h4-9H,1-3H3 + +> +9-P + +$$$$ +atropisomers_test_file_1_v2.sdf + ChemDraw03052609262D + + 12 13 0 0 0 0 0 0 0 0999 V2000 + 0.7145 1.6500 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.7145 0.8250 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 2.0625 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 0.4125 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.7144 1.6500 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + -0.7144 0.8250 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.0000 -0.4125 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.7145 -0.8250 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.7145 -0.8250 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.7144 -1.6501 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + -0.7145 -1.6500 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.0001 -2.0625 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 + 1 3 2 0 + 2 4 2 0 + 3 5 1 0 + 4 6 1 1 + 4 7 1 0 + 5 6 2 0 + 7 8 1 0 + 7 9 2 0 + 8 10 2 0 + 9 11 1 0 + 10 12 1 0 + 11 12 2 0 +M END +> +not sure, we can demand more substituents + +> +34 + +> +(3%{M})-3,3'-bipyridine + +> +InChI=1S/C10H8N2/c1-3-9(7-11-5-1)10-4-2-6-12-8-10/h1-8H + +> +10-M + +$$$$ +atropisomers_test_file_1_v2.sdf + ChemDraw03052609263D + + 12 13 0 0 0 0 0 0 0 0999 V2000 + -1.3189 3.0461 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.3190 1.5231 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0002 3.8075 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 0.7615 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3191 3.0460 -0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3190 1.5230 -0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -0.7615 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3189 -1.5230 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.3190 -1.5230 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3188 -3.0461 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + -1.3191 -3.0460 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.0001 -3.8075 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 + 1 3 2 0 + 2 4 2 0 + 3 5 1 0 + 4 6 1 1 + 4 7 1 0 + 5 6 2 0 + 7 8 1 0 + 7 9 2 0 + 8 10 2 0 + 9 11 1 0 + 10 12 1 0 + 11 12 2 0 +M END +> +not sure, we can demand more substituents + +> +35 + +> +(3%{M})-3,3'-bipyridine + +> +InChI=1S/C10H8N2/c1-3-9(7-11-5-1)10-4-2-6-12-8-10/h1-8H + +> +10-M + +$$$$ +atropisomers_test_file_1_v2.sdf + ChemDraw03052609263D + + 16 17 0 0 0 0 0 0 0 0999 V2000 + 1.3190 -1.5230 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.0000 -0.7615 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.3190 -1.5230 -0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.3190 -3.0460 -0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.0000 -3.8075 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3189 -3.0460 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3190 1.5230 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 0.7615 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.3189 1.5230 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.3189 3.0460 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3190 3.0460 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 3.8075 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6379 0.7615 0.0000 Br 0 0 0 0 0 0 0 0 0 0 0 0 + -2.6379 0.7615 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + -2.6379 -0.7615 -0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6379 -0.7615 0.0000 Br 0 0 0 0 0 0 0 0 0 0 0 0 + 1 6 1 0 + 1 2 2 0 + 1 16 1 0 + 2 3 1 0 + 2 8 1 0 + 3 4 2 0 + 3 15 1 0 + 4 5 1 0 + 5 6 2 0 + 8 7 1 6 + 7 11 2 0 + 7 13 1 0 + 8 9 2 0 + 9 10 1 0 + 9 14 1 0 + 10 12 2 0 + 11 12 1 0 +M END +> +36 + +> +(1%{P})-2,2'-dibromo-6,6'-dichloro-1,1'-biphenyl + +> +InChI=1S/C12H6Br2Cl2/c13-7-3-1-5-9(15)11(7)12-8(14)4-2-6-10(12)16/h1-6H + +> +2-P + +$$$$ +atropisomers_test_file_1_v2.sdf + ChemDraw03052609263D + + 22 23 0 0 0 0 0 0 0 0999 V2000 + 0.8071 -1.5545 -0.9467 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.0691 -0.8135 0.0576 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.9293 -1.6039 1.0368 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.9070 -3.1261 1.0177 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.0227 -3.8614 0.0195 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.8347 -3.0771 -0.9644 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.2499 1.5591 -0.0951 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.0657 0.8136 0.0981 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.3516 1.5992 0.3348 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.3157 3.1218 0.3895 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.2867 3.0799 -0.0448 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0043 3.8610 0.2007 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9921 0.4987 -0.4273 Br 0 0 0 0 0 0 0 0 0 0 0 0 + -2.9921 0.6882 0.5628 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + -2.0234 -0.6956 2.2800 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9708 -0.4917 -2.2800 Br 0 0 0 0 0 0 0 0 0 0 0 0 + -1.5961 -3.7562 1.8058 H 0 0 0 0 0 0 0 0 0 0 0 0 + -0.0022 -5.0805 0.0072 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.5471 -3.6675 -1.7654 H 0 0 0 0 0 0 0 0 0 0 0 0 + -2.3451 3.7511 0.5849 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3457 3.6692 -0.1993 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0333 5.0805 0.2474 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 6 1 0 + 1 2 2 0 + 1 16 1 0 + 2 3 1 0 + 2 8 1 0 + 3 4 2 0 + 3 15 1 0 + 4 5 1 0 + 4 17 1 0 + 5 6 2 0 + 5 18 1 0 + 6 19 1 0 + 7 8 1 0 + 7 11 2 0 + 7 13 1 0 + 8 9 2 0 + 9 10 1 0 + 9 14 1 0 + 10 12 2 0 + 10 20 1 0 + 11 12 1 0 + 11 21 1 0 + 12 22 1 0 +M END +> +3D + +> +37 + +> +(1%{M})-2,2'-dibromo-6,6'-dichloro-1,1'-biphenyl + +> +InChI=1S/C12H6Br2Cl2/c13-7-3-1-5-9(15)11(7)12-8(14)4-2-6-10(12)16/h1-6H + +> +2-M + +$$$$ +atropisomers_test_file_1_v2.sdf + ChemDraw03052609263D + + 22 23 0 0 0 0 0 0 0 0999 V2000 + -0.9752 -1.5974 0.8930 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.0853 -0.8119 -0.0635 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.7929 -1.5549 -1.0631 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.7813 -3.0772 -1.1059 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.1092 -3.8595 -0.1503 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.9878 -3.1191 0.8490 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.2400 1.5705 -0.1677 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.0732 0.8111 -0.0172 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.3742 1.5812 0.1763 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.3625 3.1037 0.2217 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.2523 3.0929 -0.1244 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.0487 3.8595 0.0713 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.0047 0.5306 -0.4354 Br 0 0 0 0 0 0 0 0 0 0 0 0 + -3.0047 0.6435 0.3633 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9009 -0.5854 -2.2484 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + -2.1691 -0.5941 2.2484 Br 0 0 0 0 0 0 0 0 0 0 0 0 + 1.4863 -3.6708 -1.9067 H 0 0 0 0 0 0 0 0 0 0 0 0 + -0.1187 -5.0799 -0.1854 H 0 0 0 0 0 0 0 0 0 0 0 0 + -1.7026 -3.7458 1.6153 H 0 0 0 0 0 0 0 0 0 0 0 0 + -2.4059 3.7180 0.3787 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3053 3.6988 -0.2467 H 0 0 0 0 0 0 0 0 0 0 0 0 + -0.0384 5.0799 0.1076 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 6 1 0 + 1 2 2 0 + 1 16 1 0 + 2 3 1 0 + 2 8 1 0 + 3 4 2 0 + 3 15 1 0 + 4 5 1 0 + 4 17 1 0 + 5 6 2 0 + 5 18 1 0 + 6 19 1 0 + 7 8 1 0 + 7 11 2 0 + 7 13 1 0 + 8 9 2 0 + 9 10 1 0 + 9 14 1 0 + 10 12 2 0 + 10 20 1 0 + 11 12 1 0 + 11 21 1 0 + 12 22 1 0 +M END +> +3D + +> +38 + +> +(1%{P})-2,2'-dibromo-6,6'-dichloro-1,1'-biphenyl + +> +InChI=1S/C12H6Br2Cl2/c13-7-3-1-5-9(15)11(7)12-8(14)4-2-6-10(12)16/h1-6H + +> +2-P + +$$$$ +atropisomers_test_file_1_v2.sdf + ChemDraw03052609263D + + 32 33 0 0 0 0 0 0 0 0999 V2000 + -0.8220 -1.1422 -1.4715 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.1789 -0.7602 -0.3781 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1639 -1.8032 0.1386 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1608 -3.2161 -0.4378 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.1667 -3.5917 -1.5314 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.8238 -2.5553 -2.0455 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.8740 1.2946 1.1579 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.2304 0.7524 0.2446 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.4254 1.6378 -0.1032 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.5254 3.0504 0.4616 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.7730 2.7103 1.7123 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.4250 3.5882 1.3686 C 0 0 0 0 0 0 0 0 0 0 0 0 + -2.1671 0.4033 1.5495 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.5876 1.0654 -1.0762 N 0 3 0 0 0 0 0 0 0 0 0 0 + 2.2156 -1.3960 1.3030 N 0 3 0 0 0 0 0 0 0 0 0 0 + -1.8934 -0.0715 -2.0303 C 0 0 0 0 0 0 0 0 0 0 0 0 + -2.7929 -0.2996 0.6100 O 0 0 0 0 0 0 0 0 0 0 0 0 + -2.6681 0.3884 2.9593 O 0 0 0 0 0 0 0 0 0 0 0 0 + 3.8633 1.7711 -1.1922 O 0 5 0 0 0 0 0 0 0 0 0 0 + 2.4060 -0.0964 -1.7243 O 0 0 0 0 0 0 0 0 0 0 0 0 + 2.2185 -0.0323 1.8342 O 0 5 0 0 0 0 0 0 0 0 0 0 + 3.0036 -2.3301 1.8573 O 0 0 0 0 0 0 0 0 0 0 0 0 + -1.7035 0.5126 -3.2105 O 0 0 0 0 0 0 0 0 0 0 0 0 + -3.1051 0.2493 -1.2168 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9576 -4.0463 -0.0248 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.1637 -4.7243 -1.9948 H 0 0 0 0 0 0 0 0 0 0 0 0 + -1.6241 -2.8586 -2.9186 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.4866 3.7516 0.1863 H 0 0 0 0 0 0 0 0 0 0 0 0 + -1.6576 3.1421 2.4374 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.5006 4.7243 1.8200 H 0 0 0 0 0 0 0 0 0 0 0 0 + -3.5284 -0.1736 3.2105 H 0 0 0 0 0 0 0 0 0 0 0 0 + -3.8633 0.8648 -1.6184 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 6 1 0 + 1 2 2 0 + 1 16 1 0 + 2 3 1 0 + 2 8 1 0 + 3 4 2 0 + 3 15 1 0 + 4 5 1 0 + 4 25 1 0 + 5 6 2 0 + 5 26 1 0 + 6 27 1 0 + 7 8 1 0 + 7 11 2 0 + 7 13 1 0 + 8 9 2 0 + 9 10 1 0 + 9 14 1 0 + 10 12 2 0 + 10 28 1 0 + 11 12 1 0 + 11 29 1 0 + 12 30 1 0 + 13 17 2 0 + 13 18 1 0 + 14 19 1 0 + 14 20 2 0 + 15 21 1 0 + 15 22 2 0 + 16 23 2 0 + 16 24 1 0 + 18 31 1 0 + 24 32 1 0 +M CHG 4 14 1 15 1 19 -1 21 -1 +M END +> +3D + +> +39 + +> +(1%{P})-6,6'-dinitro[1,1'-biphenyl]-2,2'-dicarboxylic acid + +> +InChI=1S/C14H8N2O8/c17-13(18)7-3-1-5-9(15(21)22)11(7)12-8(14(19)20)4-2-6-10(12)16(23)24/h1-6H,(H,17,18)(H,19,20) + +> +1-P + +$$$$ +atropisomers_test_file_1_v2.sdf + ChemDraw03052609263D + + 32 33 0 0 0 0 0 0 0 0999 V2000 + -0.0068 -1.9868 -0.1650 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.8082 -0.7984 -0.6736 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9864 -1.0365 -1.6152 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3608 -2.4517 -2.0393 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.5449 -3.6342 -1.5338 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.3593 -3.4005 -0.6023 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.8199 1.4369 -0.6755 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.4624 0.7297 -0.2262 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.4633 1.4681 0.6582 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1998 2.9083 1.0849 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.0791 2.8757 -0.2468 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.0733 3.6130 0.6292 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.9186 0.6969 -1.6109 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.8162 0.7174 1.1402 N 0 3 0 0 0 0 0 0 0 0 0 0 + 2.8357 0.2246 -2.1623 N 0 3 0 0 0 0 0 0 0 0 0 0 + -1.2623 -1.7710 0.8355 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.5663 0.2216 -2.8024 O 0 0 0 0 0 0 0 0 0 0 0 0 + -3.3337 0.5603 -1.1367 O 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9586 1.4983 1.6148 O 0 5 0 0 0 0 0 0 0 0 0 0 + 2.9261 -0.6141 1.0058 O 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3009 1.5781 -2.0046 O 0 5 0 0 0 0 0 0 0 0 0 0 + 4.0480 0.0374 -2.7083 O 0 0 0 0 0 0 0 0 0 0 0 0 + -2.4662 -2.2180 0.4879 O 0 0 0 0 0 0 0 0 0 0 0 0 + -1.0724 -1.0738 2.1466 O 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3122 -2.6363 -2.7860 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.8394 -4.7696 -1.8765 H 0 0 0 0 0 0 0 0 0 0 0 0 + -0.2994 -4.3498 -0.2038 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.0090 3.4962 1.7903 H 0 0 0 0 0 0 0 0 0 0 0 0 + -2.1007 3.4359 -0.6130 H 0 0 0 0 0 0 0 0 0 0 0 0 + -0.2871 4.7696 0.9633 H 0 0 0 0 0 0 0 0 0 0 0 0 + -4.0480 0.0583 -1.7312 H 0 0 0 0 0 0 0 0 0 0 0 0 + -1.8925 -0.9440 2.8024 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 6 1 0 + 1 2 2 0 + 1 16 1 0 + 2 3 1 0 + 2 8 1 0 + 3 4 2 0 + 3 15 1 0 + 4 5 1 0 + 4 25 1 0 + 5 6 2 0 + 5 26 1 0 + 6 27 1 0 + 7 8 1 0 + 7 11 2 0 + 7 13 1 0 + 8 9 2 0 + 9 10 1 0 + 9 14 1 0 + 10 12 2 0 + 10 28 1 0 + 11 12 1 0 + 11 29 1 0 + 12 30 1 0 + 13 17 2 0 + 13 18 1 0 + 14 19 1 0 + 14 20 2 0 + 15 21 1 0 + 15 22 2 0 + 16 23 2 0 + 16 24 1 0 + 18 31 1 0 + 24 32 1 0 +M CHG 4 14 1 15 1 19 -1 21 -1 +M END +> +3D + +> +40 + +> +(1%{M})-6,6'-dinitro[1,1'-biphenyl]-2,2'-dicarboxylic acid + +> +InChI=1S/C14H8N2O8/c17-13(18)7-3-1-5-9(15(21)22)11(7)12-8(14(19)20)4-2-6-10(12)16(23)24/h1-6H,(H,17,18)(H,19,20) + +> +1-M + +$$$$ +atropisomers_test_file_1_v2.sdf + ChemDraw03052609263D + + 36 39 0 0 0 0 0 0 0 0999 V2000 + -1.2314 -0.9285 -3.2240 O 0 0 0 0 0 0 0 0 0 0 0 0 + -0.6624 -1.7171 -2.0886 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.2508 -1.0314 -1.0753 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.8240 -1.8459 0.0893 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.4834 -3.3345 0.2250 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.4290 -4.0054 -0.7931 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.0025 -3.1956 -1.9481 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1510 -0.0378 -1.1561 O 0 0 0 0 0 0 0 0 0 0 0 0 + 2.0744 0.9919 -1.2894 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6096 0.5642 -1.2604 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.4856 1.6263 -1.4087 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.1018 3.1014 -1.5719 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.1854 4.1637 -1.7192 C 0 0 0 0 0 0 0 0 0 0 0 0 + -2.6548 3.7615 -1.7080 C 0 0 0 0 0 0 0 0 0 0 0 0 + -3.0419 2.2967 -1.5491 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.9601 1.2338 -1.3983 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.7402 -1.1946 1.1233 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3093 -2.0120 2.2765 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9681 -3.4917 2.4037 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.0552 -4.1523 1.3777 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.4513 2.4592 -1.4516 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3638 3.5152 -1.5907 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.9887 0.1530 -3.3274 H 0 0 0 0 0 0 0 0 0 0 0 0 + -0.7007 -5.1919 -0.6834 H 0 0 0 0 0 0 0 0 0 0 0 0 + -1.7369 -3.7333 -2.7637 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.2207 0.2695 -1.1756 H 0 0 0 0 0 0 0 0 0 0 0 0 + -0.8756 5.3390 -1.8465 H 0 0 0 0 0 0 0 0 0 0 0 0 + -3.5228 4.6136 -1.8264 H 0 0 0 0 0 0 0 0 0 0 0 0 + -4.2207 1.9742 -1.5427 H 0 0 0 0 0 0 0 0 0 0 0 0 + -2.2767 0.0605 -1.2684 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.0205 -0.0089 1.0271 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.0397 -1.4806 3.0997 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.4259 -4.1480 3.3274 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.7814 -5.3390 1.4795 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.6277 2.7898 -1.4701 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.6666 4.6924 -1.7173 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 + 1 23 1 0 + 2 7 1 0 + 2 3 2 0 + 3 4 1 0 + 3 10 1 0 + 4 5 1 0 + 4 17 2 0 + 5 20 2 0 + 5 6 1 0 + 6 7 2 0 + 6 24 1 0 + 7 25 1 0 + 8 9 1 0 + 8 26 1 0 + 9 10 1 0 + 9 21 2 0 + 10 11 2 0 + 11 16 1 0 + 11 12 1 0 + 12 22 2 0 + 12 13 1 0 + 13 14 2 0 + 13 27 1 0 + 14 15 1 0 + 14 28 1 0 + 15 16 2 0 + 15 29 1 0 + 16 30 1 0 + 17 18 1 0 + 17 31 1 0 + 18 19 2 0 + 18 32 1 0 + 19 20 1 0 + 19 33 1 0 + 20 34 1 0 + 21 22 1 0 + 21 35 1 0 + 22 36 1 0 +M END +> +3D + +> +41 + +> +(1%{M})-[1,1'-binaphthalene]-2,2'-diol + +> +InChI=1S/C20H14O2/c21-17-11-9-13-5-1-3-7-15(13)19(17)20-16-8-4-2-6-14(16)10-12-18(20)22/h1-12,21-22H + +> +3-M + +$$$$ +atropisomers_test_file_1_v2.sdf + ChemDraw03052609263D + + 36 39 0 0 0 0 0 0 0 0999 V2000 + 2.7821 -0.2882 2.3517 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.8606 -1.2113 1.6164 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.8179 -0.6439 0.6565 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.1152 -1.5954 -0.1032 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0035 -3.1067 0.1160 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.0437 -3.6615 1.0778 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9729 -2.7159 1.8274 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.2238 0.9739 -0.3321 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9641 1.7249 -0.0354 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.7296 0.9765 0.4635 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.5556 1.7536 0.7741 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.5924 3.2735 0.5712 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.8621 4.0623 0.8685 C 0 0 0 0 0 0 0 0 0 0 0 0 + -3.1063 3.3419 1.3724 C 0 0 0 0 0 0 0 0 0 0 0 0 + -3.0800 1.8310 1.5798 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.8092 1.0412 1.2809 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.1660 -1.0646 -1.0769 C 0 0 0 0 0 0 0 0 0 0 0 0 + -2.0862 -2.0265 -1.8206 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.9621 -3.5278 -1.5951 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.9169 -4.0683 -0.6272 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9209 3.2345 -0.2318 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6445 4.0076 0.0693 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.7068 0.8124 2.1984 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1332 -4.8689 1.2484 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.8089 -3.1647 2.5986 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.1247 1.5189 -0.6950 H 0 0 0 0 0 0 0 0 0 0 0 0 + -1.8826 5.2736 0.7026 H 0 0 0 0 0 0 0 0 0 0 0 0 + -4.1247 3.9756 1.6101 H 0 0 0 0 0 0 0 0 0 0 0 0 + -4.0779 1.2526 1.9858 H 0 0 0 0 0 0 0 0 0 0 0 0 + -1.7953 -0.1699 1.4485 H 0 0 0 0 0 0 0 0 0 0 0 0 + -1.2713 0.1394 -1.2625 H 0 0 0 0 0 0 0 0 0 0 0 0 + -2.9244 -1.5937 -2.5986 H 0 0 0 0 0 0 0 0 0 0 0 0 + -2.7011 -4.2986 -2.1907 H 0 0 0 0 0 0 0 0 0 0 0 0 + -0.8167 -5.2736 -0.4470 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9128 3.8270 -0.6321 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6127 5.2193 -0.0920 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 + 1 23 1 0 + 2 7 1 0 + 2 3 2 0 + 3 4 1 0 + 3 10 1 0 + 4 5 1 0 + 4 17 2 0 + 5 20 2 0 + 5 6 1 0 + 6 7 2 0 + 6 24 1 0 + 7 25 1 0 + 8 9 1 0 + 8 26 1 0 + 9 10 1 0 + 9 21 2 0 + 10 11 2 0 + 11 16 1 0 + 11 12 1 0 + 12 22 2 0 + 12 13 1 0 + 13 14 2 0 + 13 27 1 0 + 14 15 1 0 + 14 28 1 0 + 15 16 2 0 + 15 29 1 0 + 16 30 1 0 + 17 18 1 0 + 17 31 1 0 + 18 19 2 0 + 18 32 1 0 + 19 20 1 0 + 19 33 1 0 + 20 34 1 0 + 21 22 1 0 + 21 35 1 0 + 22 36 1 0 +M END +> +3D + +> +42 + +> +(1%{P})-[1,1'-binaphthalene]-2,2'-diol + +> +InChI=1S/C20H14O2/c21-17-11-9-13-5-1-3-7-15(13)19(17)20-16-8-4-2-6-14(16)10-12-18(20)22/h1-12,21-22H + +> +3-P + +$$$$ +atropisomers_test_file_1_v2.sdf + ChemDraw03052609262D + + 14 13 0 0 0 0 0 0 0 0999 V2000 + -0.4125 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.4125 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.8250 0.7145 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.8250 -0.7145 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.8250 -0.7145 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.8250 0.7145 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.6500 -0.7145 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.4125 -1.4289 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.4125 -1.4289 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.6500 -0.7145 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.4125 1.4289 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.6500 0.7145 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.6500 0.7145 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.4125 1.4289 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 + 1 3 1 0 + 1 5 2 0 + 2 4 2 0 + 2 6 1 1 + 3 11 1 0 + 3 12 1 0 + 4 9 1 0 + 4 10 1 0 + 5 7 1 0 + 5 8 1 0 + 6 13 1 0 + 6 14 1 0 +M END +> +Atropisomers exists for bulky substituents, so should be recognized while rare + +> +43 + +> +InChI=1S/C14H26/c1-9(2)13(10(3)4)14(11(5)6)12(7)8/h9,11H,1-8H3 + +$$$$ +atropisomers_test_file_1_v2.sdf + ChemDraw03052609262D + + 14 14 0 0 0 0 0 0 0 0999 V2000 + 0.3573 -0.6188 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.3573 -1.4438 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.3573 -0.2063 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.3573 -1.8563 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.0717 -0.6188 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.0717 -1.4438 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.3573 0.6187 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.3572 1.0313 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + -1.0718 1.0312 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1848 1.0467 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.3572 1.8563 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.7862 -0.2063 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.0717 -0.2062 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.7862 -0.6187 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 + 1 3 2 0 + 1 13 1 0 + 2 4 2 0 + 3 5 1 1 + 3 7 1 0 + 4 6 1 0 + 5 6 2 0 + 5 12 1 0 + 7 8 1 0 + 7 9 2 0 + 8 10 1 0 + 8 11 1 0 + 13 14 1 0 +M END +> +Atropisomers exists for bulky substituents, so should be recognized while rare + +> +44 + +$$$$ +atropisomers_test_file_1_v2.sdf + ChemDraw03052609262D + + 19 19 0 0 1 0 0 0 0 0999 V2000 + -0.3603 -0.6131 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + -1.0760 -0.2027 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.3603 -1.4439 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.7917 -0.6131 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.0760 -1.8543 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + -1.0760 0.6231 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.3553 -0.2027 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.3553 -1.8543 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.0710 -1.4439 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + -2.5024 0.6231 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.7867 -0.2027 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + -2.5024 -0.2027 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.7917 1.0335 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.3603 1.0335 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.0710 -0.6131 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.7917 -1.4439 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.3553 0.6231 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.5024 -0.6131 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.3603 1.8543 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 + 1 3 1 0 + 1 7 1 0 + 2 4 1 1 + 2 6 2 0 + 3 5 2 0 + 3 8 1 0 + 4 12 2 0 + 4 16 1 0 + 6 13 1 0 + 6 14 1 0 + 7 15 1 0 + 7 17 1 1 + 8 9 1 0 + 10 13 2 0 + 10 12 1 0 + 11 15 1 0 + 11 18 1 0 + 14 19 1 0 +M END +> +Well known pesticide and herbicide. Atropisomers exist + +> +45 + +$$$$ +atropisomers_test_file_1_v2.sdf + ChemDraw03052609262D + + 28 33 0 0 0 0 0 0 0 0999 V2000 + 0.7145 1.6501 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.7145 0.8251 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.0000 2.0626 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + -0.0000 0.4126 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.7145 1.6501 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.7145 0.8251 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.0000 -0.4124 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.7144 -0.8250 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.7146 -0.8250 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.7144 -1.6500 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.7146 -1.6500 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.0001 -2.0625 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + -1.4289 2.0626 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -2.1434 1.6500 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.4289 0.4126 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -2.1433 0.8250 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.4290 -0.4125 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -2.1434 -0.8250 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.4290 -2.0624 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -2.1434 -1.6500 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.4290 -0.4125 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.1434 -0.8252 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 1.4288 -2.0626 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.1433 -1.6502 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.4290 2.0626 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.1434 1.6500 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 1.4290 0.4126 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.1434 0.8251 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 3 1 0 + 1 25 1 0 + 1 2 2 0 + 4 2 1 1 + 2 27 1 0 + 3 5 1 0 + 4 6 1 0 + 4 7 2 0 + 5 13 1 0 + 5 6 2 0 + 6 15 1 0 + 7 8 1 0 + 7 9 1 0 + 8 21 1 0 + 8 10 2 0 + 9 17 1 0 + 9 11 2 0 + 10 12 1 0 + 10 23 1 0 + 11 12 1 0 + 11 19 1 0 + 13 14 2 0 + 14 16 1 0 + 15 16 2 0 + 17 18 2 0 + 18 20 1 0 + 19 20 2 0 + 21 22 2 0 + 22 24 1 0 + 23 24 2 0 + 25 26 2 0 + 26 28 1 0 + 27 28 2 0 +M END +> +Special case - needs both double bond config and atropisomer-like descriptor + +> +46 + +> +InChI=1S/C24H14N2O2/c1-4-8-20-15(5-1)23(17-9-11-26-14-22(17)28-20)24-16-6-2-3-7-19(16)27-21-10-12-25-13-18(21)24/h1-14H/b24-23- + +> +Z,M + +$$$$ +atropisomers_test_file_1_v2.sdf + ChemDraw03052609262D + + 28 33 0 0 0 0 0 0 0 0999 V2000 + 0.7145 1.6501 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.7145 0.8251 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.0000 2.0626 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + -0.0000 0.4126 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.7145 1.6501 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.7145 0.8251 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.0000 -0.4124 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.7144 -0.8250 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.7146 -0.8250 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.7144 -1.6500 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.7146 -1.6500 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.0001 -2.0625 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + -1.4289 2.0626 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -2.1434 1.6500 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.4289 0.4126 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -2.1433 0.8250 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.4290 -0.4125 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -2.1434 -0.8250 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.4290 -2.0624 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -2.1434 -1.6500 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.4290 -0.4125 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.1434 -0.8252 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 1.4288 -2.0626 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.1433 -1.6502 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.4290 2.0626 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.1434 1.6500 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 1.4290 0.4126 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.1434 0.8251 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 3 1 0 + 1 25 1 0 + 1 2 2 0 + 4 2 1 6 + 2 27 1 0 + 3 5 1 0 + 4 6 1 0 + 4 7 2 0 + 5 13 1 0 + 5 6 2 0 + 6 15 1 0 + 7 8 1 0 + 7 9 1 0 + 8 21 1 0 + 8 10 2 0 + 9 17 1 0 + 9 11 2 0 + 10 12 1 0 + 10 23 1 0 + 11 12 1 0 + 11 19 1 0 + 13 14 2 0 + 14 16 1 0 + 15 16 2 0 + 17 18 2 0 + 18 20 1 0 + 19 20 2 0 + 21 22 2 0 + 22 24 1 0 + 23 24 2 0 + 25 26 2 0 + 26 28 1 0 + 27 28 2 0 +M END +> +Special case - needs both double bond config and atropisomer-like descriptor + +> +47 + +> +InChI=1S/C24H14N2O2/c1-4-8-20-15(5-1)23(17-9-11-26-14-22(17)28-20)24-16-6-2-3-7-19(16)27-21-10-12-25-13-18(21)24/h1-14H/b24-23- + +> +Z,P + +$$$$ +atropisomers_test_file_1_v2.sdf + ChemDraw03052609263D + + 28 33 0 0 0 0 0 0 0 0999 V2000 + 1.3191 3.0461 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3191 1.5231 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 3.8077 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 0.7616 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.3189 3.0461 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.3189 1.5231 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -0.7614 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.3190 -1.5230 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3191 -1.5230 -0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.3189 -3.0461 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3190 -3.0460 -0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0001 -3.8076 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + -2.6379 3.8076 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -3.9568 3.0460 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -2.6378 0.7616 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -3.9567 1.5230 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6380 -0.7617 -0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9569 -1.5233 -0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6379 -3.8075 -0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9568 -3.0462 -0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -2.6380 -0.7615 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -3.9570 -1.5232 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + -2.6378 -3.8077 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -3.9569 -3.0462 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6381 3.8076 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9570 3.0460 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6380 0.7616 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9569 1.5231 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 3 1 0 + 1 25 1 0 + 1 2 2 0 + 4 2 1 1 + 2 27 1 0 + 3 5 1 0 + 4 6 1 0 + 4 7 2 0 + 5 13 1 0 + 5 6 2 0 + 6 15 1 0 + 7 8 1 0 + 7 9 1 0 + 8 21 1 0 + 8 10 2 0 + 9 17 1 0 + 9 11 2 0 + 10 12 1 0 + 10 23 1 0 + 11 12 1 0 + 11 19 1 0 + 13 14 2 0 + 14 16 1 0 + 15 16 2 0 + 17 18 2 0 + 18 20 1 0 + 19 20 2 0 + 21 22 2 0 + 22 24 1 0 + 23 24 2 0 + 25 26 2 0 + 26 28 1 0 + 27 28 2 0 +M END +> +Special case - needs both double bond config and atropisomer-like descriptor + +> +48 + +> +InChI=1S/C24H14N2O2/c1-4-8-20-15(5-1)23(17-9-11-26-14-22(17)28-20)24-16-6-2-3-7-19(16)27-21-10-12-25-13-18(21)24/h1-14H/b24-23+ + +> +E,P + +$$$$ +atropisomers_test_file_1_v2.sdf + ChemDraw03052609263D + + 28 33 0 0 0 0 0 0 0 0999 V2000 + 1.3191 3.0461 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3191 1.5231 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 3.8077 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 0.7616 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.3189 3.0461 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.3189 1.5231 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -0.7614 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.3190 -1.5230 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3191 -1.5230 -0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.3189 -3.0461 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3190 -3.0460 -0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0001 -3.8076 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + -2.6378 3.8076 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -3.9568 3.0459 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -2.6378 0.7616 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -3.9567 1.5230 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6380 -0.7617 -0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9569 -1.5233 -0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6379 -3.8075 -0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9568 -3.0461 -0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -2.6380 -0.7615 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -3.9570 -1.5232 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + -2.6378 -3.8077 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -3.9569 -3.0462 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6381 3.8076 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9570 3.0460 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6380 0.7616 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9569 1.5230 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 3 1 0 + 1 25 1 0 + 1 2 2 0 + 4 2 1 6 + 2 27 1 0 + 3 5 1 0 + 4 6 1 0 + 4 7 2 0 + 5 13 1 0 + 5 6 2 0 + 6 15 1 0 + 7 8 1 0 + 7 9 1 0 + 8 21 1 0 + 8 10 2 0 + 9 17 1 0 + 9 11 2 0 + 10 12 1 0 + 10 23 1 0 + 11 12 1 0 + 11 19 1 0 + 13 14 2 0 + 14 16 1 0 + 15 16 2 0 + 17 18 2 0 + 18 20 1 0 + 19 20 2 0 + 21 22 2 0 + 22 24 1 0 + 23 24 2 0 + 25 26 2 0 + 26 28 1 0 + 27 28 2 0 +M END +> +Special case - needs both double bond config and atropisomer-like descriptor + +> +49 + +> +InChI=1S/C24H14N2O2/c1-4-8-20-15(5-1)23(17-9-11-26-14-22(17)28-20)24-16-6-2-3-7-19(16)27-21-10-12-25-13-18(21)24/h1-14H/b24-23+ + +> +E,M + +$$$$ diff --git a/INCHI-1-TEST/tests/test_unit/test_atropisomers.cpp b/INCHI-1-TEST/tests/test_unit/test_atropisomers.cpp index d449352c..c8bb5503 100644 --- a/INCHI-1-TEST/tests/test_unit/test_atropisomers.cpp +++ b/INCHI-1-TEST/tests/test_unit/test_atropisomers.cpp @@ -7,7 +7,7 @@ extern "C" #include "../../../INCHI-1-SRC/INCHI_BASE/src/mode.h" } -TEST(test_atropisomers, test_dummy_1) +TEST(test_atropisomers, test_dummy_1_atropisomer) { const char *molblock = "atropisomer test mol \n" @@ -52,7 +52,7 @@ TEST(test_atropisomers, test_dummy_1) char options[] = "-Atropisomers"; inchi_Output output; inchi_Output *poutput = &output; - const char expected_inchi[] = "InChI=1B"; + const char expected_inchi[] = "InChI=1B/C12H6Br2Cl2/c13-7-3-1-5-9(15)11(7)12-8(14)4-2-6-10(12)16/h1-6H"; EXPECT_EQ(MakeINCHIFromMolfileText(molblock, options, poutput), 1); EXPECT_STREQ(poutput->szInChI, expected_inchi); @@ -60,7 +60,7 @@ TEST(test_atropisomers, test_dummy_1) FreeINCHI(poutput); } -TEST(test_atropisomers, test_dummy_2) +TEST(test_atropisomers, test_dummy_2_atropisomer) { const char *molblock = "atropisomer test mol \n" @@ -126,7 +126,7 @@ TEST(test_atropisomers, test_dummy_2) char options[] = "-Atropisomers"; inchi_Output output; inchi_Output *poutput = &output; - const char expected_inchi[] = "InChI=1B"; + const char expected_inchi[] = "InChI=1B/C20H22O3/c1-21-17-5-3-13-7-15-11-23-12-16(15)8-14-4-6-18(22-2)10-20(14)19(13)9-17/h3-6,9-10,15-16H,7-8,11-12H2,1-2H3"; EXPECT_EQ(MakeINCHIFromMolfileText(molblock, options, poutput), 1); EXPECT_STREQ(poutput->szInChI, expected_inchi); @@ -134,7 +134,7 @@ TEST(test_atropisomers, test_dummy_2) FreeINCHI(poutput); } -TEST(test_atropisomers, test_dummy_3) +TEST(test_atropisomers, test_dummy_3_atropismer) { const char *molblock = "atropisomer test mol \n" @@ -193,7 +193,7 @@ TEST(test_atropisomers, test_dummy_3) char options[] = "-Atropisomers"; inchi_Output output; inchi_Output *poutput = &output; - const char expected_inchi[] = "InChI=1B"; + const char expected_inchi[] = "InChI=1B/C20H16O2/c21-17-11-9-13-5-1-3-7-15(13)19(17)20-16-8-4-2-6-14(16)10-12-18(20)22/h1-11,18,21-22H,12H2"; EXPECT_EQ(MakeINCHIFromMolfileText(molblock, options, poutput), 1); EXPECT_STREQ(poutput->szInChI, expected_inchi); @@ -274,7 +274,7 @@ TEST(test_atropisomers, test_dummy_4_atypical_no_2_rings) char options[] = "-Atropisomers"; inchi_Output output; inchi_Output *poutput = &output; - const char expected_inchi[] = "InChI=1B"; + const char expected_inchi[] = "InChI=1B/C20H28N2O2/c1-5-17(23)22(14-10-7-6-8-11-14)18-15(19(21)24)12-9-13-16(18)20(2,3)4/h5,9,12-14H,1,6-8,10-11H2,2-4H3,(H2,21,24)"; EXPECT_EQ(MakeINCHIFromMolfileText(molblock, options, poutput), 1); EXPECT_STREQ(poutput->szInChI, expected_inchi); @@ -366,7 +366,7 @@ TEST(test_atropisomers, test_dummy_5_no_atropisomer_no_wedge_bonds) inchi_Output *poutput = &output; const char expected_inchi[] = "InChI=1B/C23H21FN6O3/c1-12-15(11-28(2)27-12)13-6-14-17(7-19(13)32-4)26-9-18-21(14)30(23(31)29(18)3)22-16(24)8-25-10-20(22)33-5/h6-11H,1-5H3"; - EXPECT_EQ(MakeINCHIFromMolfileText(molblock, options, poutput), 1); + EXPECT_EQ(MakeINCHIFromMolfileText(molblock, options, poutput), 0); EXPECT_STREQ(poutput->szInChI, expected_inchi); FreeINCHI(poutput); @@ -467,9 +467,9 @@ TEST(test_atropisomers, test_dummy_6_two_atropisomer_bonds) char options[] = "-Atropisomers"; inchi_Output output; inchi_Output *poutput = &output; - const char expected_inchi[] = "InChI=1B"; + const char expected_inchi[] = "InChI=1B/C25H10Br6Cl4/c26-12-3-1-4-13(27)17(12)19-16(32)8-7-10(23(19)33)9-11-21(30)24(34)20(25(35)22(11)31)18-14(28)5-2-6-15(18)29/h1-8H,9H2"; - EXPECT_EQ(MakeINCHIFromMolfileText(molblock, options, poutput), 1); + EXPECT_EQ(MakeINCHIFromMolfileText(molblock, options, poutput), 0); EXPECT_STREQ(poutput->szInChI, expected_inchi); FreeINCHI(poutput); @@ -833,7 +833,7 @@ TEST(test_atropisomers, test_dummy_12_atropisomer) char options[] = "-Atropisomers"; inchi_Output output; inchi_Output *poutput = &output; - const char expected_inchi[] = "InChI=1B"; + const char expected_inchi[] = "InChI=1B/C15H14/c1-3-10-14-12(6-1)8-5-9-13-7-2-4-11-15(13)14/h1-4,6-7,10-11H,5,8-9H2"; EXPECT_EQ(MakeINCHIFromMolfileText(molblock, options, poutput), 1); EXPECT_STREQ(poutput->szInChI, expected_inchi); @@ -932,10 +932,206 @@ TEST(test_atropisomers, test_dummy_13_atropisomer_Caryophyllene) char options[] = "-Atropisomers"; inchi_Output output; inchi_Output *poutput = &output; - const char expected_inchi[] = "InChI=1B"; + const char expected_inchi[] = "InChI=1B/C15H24/c1-11-6-5-7-12(2)13-10-15(3,4)14(13)9-8-11/h6,13-14H,2,5,7-10H2,1,3-4H3/b11-6+/t13-,14-/m1/s1"; EXPECT_EQ(MakeINCHIFromMolfileText(molblock, options, poutput), 1); EXPECT_STREQ(poutput->szInChI, expected_inchi); FreeINCHI(poutput); } + +TEST(test_atropisomers, test_dummy_14_atropisomer) +{ + const char *molblock = + "atropisomer test mol \n" + " ChemDraw03052610012D \n" + " \n" + " 22 25 0 0 0 0 0 0 0 0999 V2000 \n" + " -0.0000 0.4125 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " -0.6675 0.8974 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 0.6674 0.8975 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " -0.4125 1.6820 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 0.4124 1.6822 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " -1.4744 0.7259 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " -2.0264 1.3390 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " -0.9645 2.2951 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " -1.7715 2.1236 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 1.4521 0.6426 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 0.0000 -0.4125 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 0.6675 -0.8974 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " -0.6674 -0.8975 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 0.4125 -1.6820 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " -0.4124 -1.6822 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 1.4744 -0.7259 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 2.0264 -1.3390 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 0.9645 -2.2951 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 1.7715 -2.1236 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " -1.4521 -0.6426 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 2.0652 1.1946 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " -2.0652 -1.1946 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 1 2 1 1 \n" + " 1 3 1 6 \n" + " 1 11 1 0 \n" + " 2 6 1 0 \n" + " 2 4 2 0 \n" + " 3 5 2 0 \n" + " 3 10 1 0 \n" + " 4 5 1 0 \n" + " 4 8 1 0 \n" + " 6 7 2 0 \n" + " 7 9 1 0 \n" + " 8 9 2 0 \n" + " 10 21 1 0 \n" + " 11 12 1 1 \n" + " 11 13 1 6 \n" + " 12 16 1 0 \n" + " 12 14 2 0 \n" + " 13 15 2 0 \n" + " 13 20 1 0 \n" + " 14 15 1 0 \n" + " 14 18 1 0 \n" + " 16 17 2 0 \n" + " 17 19 1 0 \n" + " 18 19 2 0 \n" + " 20 22 1 0 \n" + "M END \n"; + + char options[] = "-Atropisomers"; + inchi_Output output; + inchi_Output *poutput = &output; + const char expected_inchi[] = "InChI=1B/C20H20N2/c1-3-17-13-15-9-5-7-11-19(15)21(17)22-18(4-2)14-16-10-6-8-12-20(16)22/h5-14H,3-4H2,1-2H3"; + + EXPECT_EQ(MakeINCHIFromMolfileText(molblock, options, poutput), 1); + EXPECT_STREQ(poutput->szInChI, expected_inchi); + + FreeINCHI(poutput); +} + +TEST(test_atropisomers, test_dummy_15_test_file_1) +{ + + const char* inchi_filename = "../../../../../INCHI-1-TEST/tests/test_unit/fixtures/atropisomers_test_file_1_v2.sdf"; + // const char* inchi_filename = "/workspaces/InChI/INCHI-1-TEST/tests/test_unit/fixtures/atropisomers_test_file_1.sdf"; + + std::ifstream file_inchi(inchi_filename, std::ios::binary); + ASSERT_TRUE(file_inchi.is_open()); + + // Read the whole file into a string + std::stringstream buffer; + buffer << file_inchi.rdbuf(); + std::string file_content = buffer.str(); + file_inchi.close(); + + // Split on "$$$$" + std::vector molblocks; + size_t pos = 0; + size_t prev = 0; + const std::string delimiter = "$$$$"; + while ((pos = file_content.find(delimiter, prev)) != std::string::npos) { + std::string mol = file_content.substr(prev, pos - prev); + // Optionally trim whitespace + size_t first_non_ws = mol.find_first_not_of(" \t\r\n"); + if (first_non_ws != std::string::npos) { + mol = mol.substr(first_non_ws); + molblocks.push_back(mol); + } + prev = pos + delimiter.length(); + } + // Add the last block if any + std::string mol = file_content.substr(prev); + size_t first_non_ws = mol.find_first_not_of(" \t\r\n"); + if (first_non_ws != std::string::npos) { + mol = mol.substr(first_non_ws); + molblocks.push_back(mol); + } + + std::vector list_expected_inchis = { + "InChI=1B/C14H8N2O8/c17-13(18)7-3-1-5-9(15(21)22)11(7)12-8(14(19)20)4-2-6-10(12)16(23)24/h1-6H,(H,17,18)(H,19,20)", + "InChI=1B/C14H8N2O8/c17-13(18)7-3-1-5-9(15(21)22)11(7)12-8(14(19)20)4-2-6-10(12)16(23)24/h1-6H,(H,17,18)(H,19,20)", + "InChI=1B/C14H8N2O8/c17-13(18)7-3-1-5-9(15(21)22)11(7)12-8(14(19)20)4-2-6-10(12)16(23)24/h1-6H,(H,17,18)(H,19,20)", + "InChI=1B/C14H8N2O8/c17-13(18)7-3-1-5-9(15(21)22)11(7)12-8(14(19)20)4-2-6-10(12)16(23)24/h1-6H,(H,17,18)(H,19,20)", + "InChI=1B/C14H8N2O8/c17-13(18)7-3-1-5-9(15(21)22)11(7)12-8(14(19)20)4-2-6-10(12)16(23)24/h1-6H,(H,17,18)(H,19,20)", + "InChI=1B/C14H8N2O8/c17-13(18)7-3-1-5-9(15(21)22)11(7)12-8(14(19)20)4-2-6-10(12)16(23)24/h1-6H,(H,17,18)(H,19,20)", + "InChI=1B/C12H6Br2Cl2/c13-7-3-1-5-9(15)11(7)12-8(14)4-2-6-10(12)16/h1-6H", + "InChI=1B/C12H6Br2Cl2/c13-7-3-1-5-9(15)11(7)12-8(14)4-2-6-10(12)16/h1-6H", + "InChI=1B/C12H6Br2Cl2/c13-7-3-1-5-9(15)11(7)12-8(14)4-2-6-10(12)16/h1-6H", + "InChI=1B/C12H6Br2Cl2/c13-7-3-1-5-9(15)11(7)12-8(14)4-2-6-10(12)16/h1-6H", + "InChI=1B/C12H6Br2Cl2/c13-7-3-1-5-9(15)11(7)12-8(14)4-2-6-10(12)16/h1-6H", + "InChI=1B/C12H6Br2Cl2/c13-7-3-1-5-9(15)11(7)12-8(14)4-2-6-10(12)16/h1-6H", + "InChI=1B/C12H6Br2Cl2/c13-7-3-1-5-9(15)11(7)12-8(14)4-2-6-10(12)16/h1-6H", + "InChI=1B/C12H6Br2Cl2/c13-7-3-1-5-9(15)11(7)12-8(14)4-2-6-10(12)16/h1-6H", + "InChI=1B/C12H6Br2Cl2/c13-7-3-1-5-9(15)11(7)12-8(14)4-2-6-10(12)16/h1-6H", + "InChI=1B/C12H6Br2Cl2/c13-7-3-1-5-9(15)11(7)12-8(14)4-2-6-10(12)16/h1-6H", + "InChI=1B/C20H14O2/c21-17-11-9-13-5-1-3-7-15(13)19(17)20-16-8-4-2-6-14(16)10-12-18(20)22/h1-12,21-22H", + "InChI=1B/C20H14O2/c21-17-11-9-13-5-1-3-7-15(13)19(17)20-16-8-4-2-6-14(16)10-12-18(20)22/h1-12,21-22H", + "InChI=1B/C20H14O2/c21-17-11-9-13-5-1-3-7-15(13)19(17)20-16-8-4-2-6-14(16)10-12-18(20)22/h1-12,21-22H", + "InChI=1B/C20H14O2/c21-17-11-9-13-5-1-3-7-15(13)19(17)20-16-8-4-2-6-14(16)10-12-18(20)22/h1-12,21-22H", + "InChI=1B/C20H14O2/c21-17-11-9-13-5-1-3-7-15(13)19(17)20-16-8-4-2-6-14(16)10-12-18(20)22/h1-12,21-22H", + "InChI=1B/C20H22O3/c1-21-17-5-3-13-7-15-11-23-12-16(15)8-14-4-6-18(22-2)10-20(14)19(13)9-17/h3-6,9-10,15-16H,7-8,11-12H2,1-2H3", + "InChI=1B/C20H22O3/c1-21-17-5-3-13-7-15-11-23-12-16(15)8-14-4-6-18(22-2)10-20(14)19(13)9-17/h3-6,9-10,15-16H,7-8,11-12H2,1-2H3", + "InChI=1B/C20H22O3/c1-21-17-5-3-13-7-15-11-23-12-16(15)8-14-4-6-18(22-2)10-20(14)19(13)9-17/h3-6,9-10,15-16H,7-8,11-12H2,1-2H3", + "InChI=1B/C20H22O3/c1-21-17-5-3-13-7-15-11-23-12-16(15)8-14-4-6-18(22-2)10-20(14)19(13)9-17/h3-6,9-10,15-16H,7-8,11-12H2,1-2H3", + "InChI=1B/C20H22O3/c1-21-17-5-3-13-7-15-11-23-12-16(15)8-14-4-6-18(22-2)10-20(14)19(13)9-17/h3-6,9-10,15-16H,7-8,11-12H2,1-2H3", + "InChI=1B/C20H23N/c1-14-9-8-11-17(20(3,4)5)19(14)21-15(2)13-16-10-6-7-12-18(16)21/h6-13H,1-5H3", + "InChI=1B/C20H23N/c1-14-9-8-11-17(20(3,4)5)19(14)21-15(2)13-16-10-6-7-12-18(16)21/h6-13H,1-5H3", + "InChI=1B/C20H20N2/c1-3-17-13-15-9-5-7-11-19(15)21(17)22-18(4-2)14-16-10-6-8-12-20(16)22/h5-14H,3-4H2,1-2H3", + "InChI=1B/C20H20N2/c1-3-17-13-15-9-5-7-11-19(15)21(17)22-18(4-2)14-16-10-6-8-12-20(16)22/h5-14H,3-4H2,1-2H3", + "InChI=1B/C20H22N2/c1-3-17-13-15-9-5-7-11-19(15)21(17)22-18(4-2)14-16-10-6-8-12-20(16)22/h5-13,18H,3-4,14H2,1-2H3/t18-/m1/s1", + "InChI=1B/C16H20N2/c1-4-15-10-9-12(2)17(15)18-13(3)11-14-7-5-6-8-16(14)18/h5-12,15H,4H2,1-3H3/t12-,15+/m0/s1", + "InChI=1B/C14H15NO/c1-10(2)12-8-9-14(16)15(12)13-7-5-4-6-11(13)3/h4-9H,1-3H3", + "InChI=1B/C10H8N2/c1-3-9(7-11-5-1)10-4-2-6-12-8-10/h1-8H", + "InChI=1B/C10H8N2/c1-3-9(7-11-5-1)10-4-2-6-12-8-10/h1-8H", + "InChI=1B/C12H6Br2Cl2/c13-7-3-1-5-9(15)11(7)12-8(14)4-2-6-10(12)16/h1-6H", + "InChI=1B/C12H6Br2Cl2/c13-7-3-1-5-9(15)11(7)12-8(14)4-2-6-10(12)16/h1-6H", + "InChI=1B/C12H6Br2Cl2/c13-7-3-1-5-9(15)11(7)12-8(14)4-2-6-10(12)16/h1-6H", + "InChI=1B/C14H8N2O8/c17-13(18)7-3-1-5-9(15(21)22)11(7)12-8(14(19)20)4-2-6-10(12)16(23)24/h1-6H,(H,17,18)(H,19,20)", + "InChI=1B/C14H8N2O8/c17-13(18)7-3-1-5-9(15(21)22)11(7)12-8(14(19)20)4-2-6-10(12)16(23)24/h1-6H,(H,17,18)(H,19,20)", + "InChI=1B/C20H14O2/c21-17-11-9-13-5-1-3-7-15(13)19(17)20-16-8-4-2-6-14(16)10-12-18(20)22/h1-12,21-22H", + "InChI=1B/C20H14O2/c21-17-11-9-13-5-1-3-7-15(13)19(17)20-16-8-4-2-6-14(16)10-12-18(20)22/h1-12,21-22H", + "InChI=1B/C14H26/c1-9(2)13(10(3)4)14(11(5)6)12(7)8/h9,11H,1-8H3", + "InChI=1B/C12H17NO/c1-5-10-8-6-7-9(2)11(10)12(14)13(3)4/h6-8H,5H2,1-4H3", + "InChI=1B/C15H22ClNO2/c1-5-13-8-6-7-11(2)15(13)17(14(18)9-16)12(3)10-19-4/h6-8,12H,5,9-10H2,1-4H3/t12-/m0/s1", + "InChI=1B/C24H14N2O2/c1-4-8-20-15(5-1)23(17-9-11-26-14-22(17)28-20)24-16-6-2-3-7-19(16)27-21-10-12-25-13-18(21)24/h1-14H/b24-23-", + "InChI=1B/C24H14N2O2/c1-4-8-20-15(5-1)23(17-9-11-26-14-22(17)28-20)24-16-6-2-3-7-19(16)27-21-10-12-25-13-18(21)24/h1-14H/b24-23-", + "InChI=1B/C24H14N2O2/c1-4-8-20-15(5-1)23(17-9-11-26-14-22(17)28-20)24-16-6-2-3-7-19(16)27-21-10-12-25-13-18(21)24/h1-14H/b24-23+", + "InChI=1B/C24H14N2O2/c1-4-8-20-15(5-1)23(17-9-11-26-14-22(17)28-20)24-16-6-2-3-7-19(16)27-21-10-12-25-13-18(21)24/h1-14H/b24-23+", + }; + + int nof_inchis = 49; + + // EXPECT_EQ(nof_inchis, molblocks.size()); + // EXPECT_EQ(nof_inchis, list_expected_inchis.size()); + + char options[] = "-Atropisomers"; + + for (int i = 0; i < nof_inchis; ++i) { + + inchi_Output output; + inchi_Output* poutput = &output; + + poutput->szLog = nullptr; + poutput->szMessage = nullptr; + poutput->szInChI = nullptr; + + printf("mol no %d\n", i + 1); + + int ret = MakeINCHIFromMolfileText(molblocks[i].c_str(), options, poutput); + + // EXPECT_LT(ret, 2); + + EXPECT_STREQ(poutput->szInChI, list_expected_inchis[i].c_str()); + + if (poutput->szLog) { + inchi_free(poutput->szLog); + poutput->szLog = nullptr; + } + if (poutput->szMessage) { + inchi_free(poutput->szMessage); + poutput->szMessage = nullptr; + } + if (poutput->szInChI) { + inchi_free(poutput->szInChI); + poutput->szInChI = nullptr; + } + } +} From 814887ae544d297c19308d73aee0390cee2871b9 Mon Sep 17 00:00:00 2001 From: Christoph Mueller Date: Fri, 6 Mar 2026 10:25:33 +0000 Subject: [PATCH 14/18] added code for atropisomer encoding (t+m layer), rule tweaking, planarity checking --- INCHI-1-SRC/INCHI_BASE/src/atropisomers.c | 52 ++++++++++++++++----- INCHI-1-SRC/INCHI_BASE/src/ichimake.c | 1 + INCHI-1-SRC/INCHI_BASE/src/ichiprt1.c | 12 ++--- INCHI-1-SRC/INCHI_BASE/src/ichister.c | 4 +- INCHI-1-SRC/INCHI_BASE/src/ichister.h | 4 +- INCHI-1-SRC/INCHI_BASE/src/inpdef.h | 2 + INCHI-1-SRC/INCHI_BASE/src/strutil.c | 57 +++++++++++++++++------ 7 files changed, 99 insertions(+), 33 deletions(-) diff --git a/INCHI-1-SRC/INCHI_BASE/src/atropisomers.c b/INCHI-1-SRC/INCHI_BASE/src/atropisomers.c index 93a19ae5..6c50c8b8 100644 --- a/INCHI-1-SRC/INCHI_BASE/src/atropisomers.c +++ b/INCHI-1-SRC/INCHI_BASE/src/atropisomers.c @@ -2,6 +2,8 @@ #include "inpdef.h" #include "ring_detection.h" +#include "ichister.h" + void find_atropisomeric_atoms_and_bonds_old(inp_ATOM* out_at, @@ -148,6 +150,11 @@ void find_atropisomeric_atoms_and_bonds(inp_ATOM* out_at, const AT_NUMB *neighbors = atom_i.neighbor; + double at_coord[4][3]; + at_coord[0][0] = out_at[atom_id1].x; + at_coord[0][1] = out_at[atom_id1].y; + at_coord[0][2] = out_at[atom_id1].z; + if (num_neighbors_i == 3) { for (int j = 0; j < num_neighbors_i; j++) { int score = 0; @@ -170,6 +177,8 @@ void find_atropisomeric_atoms_and_bonds(inp_ATOM* out_at, score += (atom_i.bond_type[j] == 1); + score -= (atom_i.bond_type[j] != 1) * 2; + score += (ring_result->atom_to_ring_mapping[atom_id1].ring_count > 0) * 3; score += (ring_result->atom_to_ring_mapping[atom_id2].ring_count > 0) * 3; @@ -185,6 +194,11 @@ void find_atropisomeric_atoms_and_bonds(inp_ATOM* out_at, if (atom_i.bond_type[k] == 2) { has_double_bond_i = 1; } + if (atom_id2 != out_at[atom_id1].neighbor[k]) { + at_coord[k + 1][0] = out_at[atom_i.neighbor[k]].x; + at_coord[k + 1][1] = out_at[atom_i.neighbor[k]].y; + at_coord[k + 1][2] = out_at[atom_i.neighbor[k]].z; + } } int nof_wedge_bonds_j = 0; int has_double_bond_j = 0; @@ -197,13 +211,18 @@ void find_atropisomeric_atoms_and_bonds(inp_ATOM* out_at, if (atom_j.bond_type[k] == 2) { has_double_bond_j = 1; } + if (atom_id1 != out_at[atom_id2].neighbor[k]) { + at_coord[3][0] = out_at[atom_j.neighbor[k]].x; + at_coord[3][1] = out_at[atom_j.neighbor[k]].y; + at_coord[3][2] = out_at[atom_j.neighbor[k]].z; + } } - score += (nof_wedge_bonds_i > 0) * 3; - score += (nof_wedge_bonds_j > 0) * 3; + score += (nof_wedge_bonds_i > 0) * 4; + score += (nof_wedge_bonds_j > 0) * 4; - score -= (nof_wedge_bonds_i == 0) * 2; - score -= (nof_wedge_bonds_j == 0) * 2; + score -= (nof_wedge_bonds_i == 0) * 3; + score -= (nof_wedge_bonds_j == 0) * 3; score += has_double_bond_i * 2; score += has_double_bond_j * 2; @@ -219,14 +238,30 @@ void find_atropisomeric_atoms_and_bonds(inp_ATOM* out_at, score += (atom_in_same_small_ring == 0); - score -= (atom_in_same_small_ring == 1) * 10; + // printf("are atom in small ring? %d %d\n", atom_in_same_small_ring, (atom_in_same_small_ring == 1) * 10); + score -= (atom_in_same_small_ring == 1) * 20; + + int planar_check = are_4at_in_one_plane(at_coord, 0.03); if (score > 10) { - printf(">>> potential atropisomer: atom id %2d atom id %2d --> score %2d (%d)\n", atom_id1, atom_id2, score, atom_in_same_small_ring); + printf(">>> FOUND atropisomer: atom id %2d atom id %2d planar check %d --> score %2d (%d)\n", atom_id1, atom_id2, planar_check, score, atom_in_same_small_ring); orig_inp_data->is_atropisomer = 1; + orig_inp_data->is_diasteroisomeric_atropisomer = ((nof_wedge_bonds_i > 0) && (nof_wedge_bonds_j > 0)); out_at[atom_id1].bAtropisomeric = 1; out_at[atom_id2].bAtropisomeric = 1; + + } else if (score > 9) { + if (planar_check == 0) { + printf(">>> FOUND atropisomer (higher score): atom id %2d atom id %2d planar check %d --> score %2d (%d)\n", atom_id1, atom_id2, planar_check, score, atom_in_same_small_ring); + orig_inp_data->is_atropisomer = 1; + orig_inp_data->is_diasteroisomeric_atropisomer = ((nof_wedge_bonds_i > 0) && (nof_wedge_bonds_j > 0)); + + out_at[atom_id1].bAtropisomeric = 1; + out_at[atom_id2].bAtropisomeric = 1; + } else { + // printf(">>> potential atropisomer (higher score): atom id %2d atom id %2d planar check %d --> score %2d (%d)\n", atom_id1, atom_id2, planar_check, score, atom_in_same_small_ring); + } } // printf(">>> is atropisomer\n"); @@ -235,11 +270,6 @@ void find_atropisomeric_atoms_and_bonds(inp_ATOM* out_at, // printf("atom type %d %d\n", atom_i.el_number, atom_j.el_number); // printf("has double bond %d %d\n", has_double_bond_i, has_double_bond_j); // printf("fused pivot atoms %d %d\n", fused_atom_partner[atom_id1], fused_atom_partner[atom_id2]); - - //TODO set atoms with atropisomeric bonds in out_at - // orig_inp_data->is_atropisomer = 1; - - } } } diff --git a/INCHI-1-SRC/INCHI_BASE/src/ichimake.c b/INCHI-1-SRC/INCHI_BASE/src/ichimake.c index febcf21b..e6f3f37e 100644 --- a/INCHI-1-SRC/INCHI_BASE/src/ichimake.c +++ b/INCHI-1-SRC/INCHI_BASE/src/ichimake.c @@ -3906,6 +3906,7 @@ int Create_INChI(CANON_GLOBALS* pCG, MarkRingSystemsInp(out_at, num_atoms, 0); orig_inp_data->is_atropisomer = 0; + orig_inp_data->is_diasteroisomeric_atropisomer = 0; if (ip->Atropisomers) { RingSystems *ring_result = find_rings(out_at, num_atoms); diff --git a/INCHI-1-SRC/INCHI_BASE/src/ichiprt1.c b/INCHI-1-SRC/INCHI_BASE/src/ichiprt1.c index 9262b068..5f37285d 100644 --- a/INCHI-1-SRC/INCHI_BASE/src/ichiprt1.c +++ b/INCHI-1-SRC/INCHI_BASE/src/ichiprt1.c @@ -1619,18 +1619,18 @@ int OutputINChI1( CANON_GLOBALS *pCG, } } - if (ip->bEnhancedStereo) - { - set_EnhancedStereo_t_m_layers(orig_inp_data, pINChI, pINChI_Aux); - } - if (ip->Atropisomers) { if (set_Atropisomer_t_m_layers(orig_inp_data, pINChI, pINChI_Aux)) { io.sDifSegs[io.nCurINChISegment][DIFS_t_SATOMS] = DIFV_OUTPUT_FILL_T; - // io.sDifSegs[io.nCurINChISegment][DIFS_m_SP3INV] = DIFV_OUTPUT_FILL_T; + io.sDifSegs[io.nCurINChISegment][DIFS_m_SP3INV] = DIFV_OUTPUT_FILL_T; } } + + if (ip->bEnhancedStereo) + { + set_EnhancedStereo_t_m_layers(orig_inp_data, pINChI, pINChI_Aux); + } } } if (bCompExists) diff --git a/INCHI-1-SRC/INCHI_BASE/src/ichister.c b/INCHI-1-SRC/INCHI_BASE/src/ichister.c index 2adfd55f..1c58830b 100644 --- a/INCHI-1-SRC/INCHI_BASE/src/ichister.c +++ b/INCHI-1-SRC/INCHI_BASE/src/ichister.c @@ -106,7 +106,7 @@ static int CompDble( const void *a1, const void *a2, void * ); static int Get2DTetrahedralAmbiguity( CANON_GLOBALS *pCG, double at_coord[][3], int bAddExplicitNeighbor, int bFix2DstereoBorderCase, double vMinAngle ); static double triple_prod_and_min_abs_sine2( double at_coord[][3], double central_at_coord[], int bAddedExplicitNeighbor, double *min_sine, int *bAmbiguous, double vMinSine ); -static int are_4at_in_one_plane( double at_coord[][3], double min_sine ); +// static int are_4at_in_one_plane( double at_coord[][3], double min_sine ); static int bInpAtomHasRequirdNeigh( inp_ATOM *at, int cur_at, int RequirdNeighType, int NumDbleBonds, int bStereoAtZz ); static int bIsSuitableHeteroInpAtom( inp_ATOM *at ); static int bIsOxide( inp_ATOM *at, int cur_at ); @@ -2190,7 +2190,7 @@ int half_stereo_bond_parity( inp_ATOM *at, { for (k = 0; k < 3; k++) { - at_coord[j][k] = 0; + at_coord[j][k] = 0; } } diff --git a/INCHI-1-SRC/INCHI_BASE/src/ichister.h b/INCHI-1-SRC/INCHI_BASE/src/ichister.h index 4731cbb0..12772625 100644 --- a/INCHI-1-SRC/INCHI_BASE/src/ichister.h +++ b/INCHI-1-SRC/INCHI_BASE/src/ichister.h @@ -56,9 +56,11 @@ extern "C" { int bCanAtomBeMiddleAllene( char *elname, S_CHAR charge, S_CHAR radical ); int bAtomHasValence3( char *elname, S_CHAR charge, S_CHAR radical ); - double dot_prod3(const double a[], const double b[]); + double dot_prod3(const double a[], const double b[]); void* cross_prod3(const double a[], const double b[], double result[]); + int are_4at_in_one_plane( double at_coord[][3], double min_sine ); + struct tagCANON_GLOBALS; int set_stereo_parity( struct tagCANON_GLOBALS *pCG, inp_ATOM* at, diff --git a/INCHI-1-SRC/INCHI_BASE/src/inpdef.h b/INCHI-1-SRC/INCHI_BASE/src/inpdef.h index 32e2e5f1..35c13107 100644 --- a/INCHI-1-SRC/INCHI_BASE/src/inpdef.h +++ b/INCHI-1-SRC/INCHI_BASE/src/inpdef.h @@ -465,6 +465,8 @@ typedef struct tagOrigAtom int is_atropisomer; /* flag indicating whether the structure is an atropisomer; it is set to 1 if the structure has been identified as an atropisomer during input processing, and 0 otherwise */ + int is_diasteroisomeric_atropisomer; + } ORIG_ATOM_DATA; /** diff --git a/INCHI-1-SRC/INCHI_BASE/src/strutil.c b/INCHI-1-SRC/INCHI_BASE/src/strutil.c index 2c20fcf0..565fc87b 100644 --- a/INCHI-1-SRC/INCHI_BASE/src/strutil.c +++ b/INCHI-1-SRC/INCHI_BASE/src/strutil.c @@ -7102,6 +7102,13 @@ int invert_parities(const INChI *inchi, return 0; } +int cmp_AT_NUMB(const void *a1, const void *a2) +{ + AT_NUMB n1 = *(const AT_NUMB *)a1; + AT_NUMB n2 = *(const AT_NUMB *)a2; + + return (int)n1 - (int)n2; +} /** * @brief Set t- and m-layers object for atropisomer stereochemistry @@ -7141,32 +7148,56 @@ int set_Atropisomer_t_m_layers( const ORIG_ATOM_DATA *orig_inp_data, // -> check number of stereocenters: if #stereocenter >= 2 if (orig_inp_data->is_atropisomer) { - printf(">>>>> TODO set t- and m-layers for atropisomers\n"); - + // printf(">>>>> TODO set t- and m-layers for atropisomers\n"); - int p_count = 0; for (int i = 0; i < orig_inp_data->num_inp_atoms; i++) { if (orig_inp_data->at[i].bAtropisomeric) { - inchi->Stereo->nNumberOfStereoCenters++; - printf("atom id %d, is_atropisomer %d\n", i + 1, orig_inp_data->at[i].bAtropisomeric); + // printf("atom id %d, is_atropisomer %d\n", i + 1, orig_inp_data->at[i].bAtropisomeric); AT_NUMB canon_atom_num = (AT_NUMB)get_canonical_atom_number(aux, i + 1); - // int parity_idx = get_parity_idx_from_canonical_atom_number(canon_atom_num, - // inchi->Stereo->nNumber, - // inchi->Stereo->nNumberOfStereoCenters); - // if (parity_idx == -1) { - int parity_idx = p_count; - p_count++; - // } + int parity_idx = get_parity_idx_from_canonical_atom_number(canon_atom_num, + inchi->Stereo->nNumber, + inchi->Stereo->nNumberOfStereoCenters); + if (parity_idx == -1) { + parity_idx = inchi->Stereo->nNumberOfStereoCenters; + inchi->Stereo->nNumberOfStereoCenters++; + } inchi->Stereo->nNumber[parity_idx] = canon_atom_num; - inchi->Stereo->t_parity[parity_idx] = 1; // set t-parity to 1 (-) for atropisomeric atoms + + inchi->Stereo->t_parity[parity_idx] = 1; + ret = 1; } } + for (int i = 0; i < inchi->Stereo->nNumberOfStereoCenters; i++) { + int min_idx = i; + for (int j = i + 1; j < inchi->Stereo->nNumberOfStereoCenters; j++) { + if (inchi->Stereo->nNumber[j] < inchi->Stereo->nNumber[min_idx]) { + min_idx = j; + } + } + if (min_idx != i) { + // Swap nNumber + int tmp_num = inchi->Stereo->nNumber[i]; + inchi->Stereo->nNumber[i] = inchi->Stereo->nNumber[min_idx]; + inchi->Stereo->nNumber[min_idx] = tmp_num; + // Swap t_parity to keep association + int tmp_parity = inchi->Stereo->t_parity[i]; + inchi->Stereo->t_parity[i] = inchi->Stereo->t_parity[min_idx]; + inchi->Stereo->t_parity[min_idx] = tmp_parity; + } + } + if (ret == 1) { + if (orig_inp_data->is_diasteroisomeric_atropisomer == 1) { + inchi->Stereo->nCompInv2Abs = 1; //m1 + } else { + inchi->Stereo->nCompInv2Abs = -1; + } + } } From f0b22b7fc21db8434e100c33090d7955416016fc Mon Sep 17 00:00:00 2001 From: Christoph Mueller Date: Fri, 20 Mar 2026 14:15:07 +0000 Subject: [PATCH 15/18] bugfixing, code cleanup and enantiomer detection for atropisomers is wrong. --- INCHI-1-SRC/INCHI_BASE/src/atropisomers.c | 221 ++++++++++------------ INCHI-1-SRC/INCHI_BASE/src/ichimake.c | 2 +- INCHI-1-SRC/INCHI_BASE/src/inpdef.h | 2 +- INCHI-1-SRC/INCHI_BASE/src/strutil.c | 9 +- 4 files changed, 109 insertions(+), 125 deletions(-) diff --git a/INCHI-1-SRC/INCHI_BASE/src/atropisomers.c b/INCHI-1-SRC/INCHI_BASE/src/atropisomers.c index 6c50c8b8..78cb9235 100644 --- a/INCHI-1-SRC/INCHI_BASE/src/atropisomers.c +++ b/INCHI-1-SRC/INCHI_BASE/src/atropisomers.c @@ -151,155 +151,138 @@ void find_atropisomeric_atoms_and_bonds(inp_ATOM* out_at, const AT_NUMB *neighbors = atom_i.neighbor; double at_coord[4][3]; - at_coord[0][0] = out_at[atom_id1].x; - at_coord[0][1] = out_at[atom_id1].y; - at_coord[0][2] = out_at[atom_id1].z; + at_coord[0][0] = atom_i.x; + at_coord[0][1] = atom_i.y; + at_coord[0][2] = atom_i.z; - if (num_neighbors_i == 3) { - for (int j = 0; j < num_neighbors_i; j++) { - int score = 0; + if (num_neighbors_i < 3) { + continue; + } + for (int j = 0; j < num_neighbors_i; j++) { + int score = 0; - int atom_id2 = neighbors[j]; + int atom_id2 = neighbors[j]; - if (atom_id1 >= atom_id2) { - continue; - } + if (atom_id1 >= atom_id2) { + continue; + } - const inp_ATOM atom_j = out_at[atom_id2]; + const inp_ATOM atom_j = out_at[atom_id2]; - int num_neighbors_j = atom_j.valence; + int num_neighbors_j = atom_j.valence; - score += (num_neighbors_j == 3); - score += (atom_i.bond_stereo[j] == 0); + if (num_neighbors_j < 3) { + continue; + } - score -= ((atom_i.bond_stereo[j] == 1) || (atom_i.bond_stereo[j] == 4) || (atom_i.bond_stereo[j] == 6)) * 2; + score += (num_neighbors_j == 3); - score += (atom_i.bond_type[j] == 1); + score += (atom_i.bond_stereo[j] == 0); + score -= ((atom_i.bond_stereo[j] == STEREO_SNGL_UP) || + (atom_i.bond_stereo[j] == STEREO_SNGL_EITHER) || + (atom_i.bond_stereo[j] == STEREO_SNGL_DOWN)) * 2; - score -= (atom_i.bond_type[j] != 1) * 2; + score += (atom_i.bond_type[j] == 1); + score -= (atom_i.bond_type[j] != 1) * 2; - score += (ring_result->atom_to_ring_mapping[atom_id1].ring_count > 0) * 3; - score += (ring_result->atom_to_ring_mapping[atom_id2].ring_count > 0) * 3; + score += (ring_result->atom_to_ring_mapping[atom_id1].ring_count > 0) * 3; + score += (ring_result->atom_to_ring_mapping[atom_id2].ring_count > 0) * 3; - int nof_wedge_bonds_i = 0; - int has_double_bond_i = 0; - for (int k = 0; k < num_neighbors_i; k++) { - if (atom_i.bond_stereo[k] == 1 || - atom_i.bond_stereo[k] == 4 || - atom_i.bond_stereo[k] == 6) { - nof_wedge_bonds_i++; - } - if (atom_i.bond_type[k] == 2) { - has_double_bond_i = 1; - } - if (atom_id2 != out_at[atom_id1].neighbor[k]) { - at_coord[k + 1][0] = out_at[atom_i.neighbor[k]].x; - at_coord[k + 1][1] = out_at[atom_i.neighbor[k]].y; - at_coord[k + 1][2] = out_at[atom_i.neighbor[k]].z; - } + int nof_wedge_bonds_i = 0; + int has_double_bond_i = 0; + int coord_count = 1; + for (int k = 0; k < num_neighbors_i; k++) { + if (atom_i.bond_stereo[k] == 1 || + atom_i.bond_stereo[k] == 4 || + atom_i.bond_stereo[k] == 6) { + nof_wedge_bonds_i++; } - int nof_wedge_bonds_j = 0; - int has_double_bond_j = 0; - for (int k = 0; k < num_neighbors_j; k++) { - if (atom_j.bond_stereo[k] == 1 || - atom_j.bond_stereo[k] == 4 || - atom_j.bond_stereo[k] == 6) { - nof_wedge_bonds_j++; - } - if (atom_j.bond_type[k] == 2) { - has_double_bond_j = 1; - } - if (atom_id1 != out_at[atom_id2].neighbor[k]) { - at_coord[3][0] = out_at[atom_j.neighbor[k]].x; - at_coord[3][1] = out_at[atom_j.neighbor[k]].y; - at_coord[3][2] = out_at[atom_j.neighbor[k]].z; + if (atom_i.bond_type[k] == 2) { + has_double_bond_i = 1; + } + if (atom_id2 != atom_i.neighbor[k]) { + if (coord_count <= 2) { + at_coord[coord_count][0] = out_at[atom_i.neighbor[k]].x; + at_coord[coord_count][1] = out_at[atom_i.neighbor[k]].y; + at_coord[coord_count][2] = out_at[atom_i.neighbor[k]].z; + coord_count++; } } + } + int nof_wedge_bonds_j = 0; + int has_double_bond_j = 0; + for (int k = 0; k < num_neighbors_j; k++) { + if (atom_j.bond_stereo[k] == 1 || + atom_j.bond_stereo[k] == 4 || + atom_j.bond_stereo[k] == 6) { + nof_wedge_bonds_j++; + } + if (atom_j.bond_type[k] == 2) { + has_double_bond_j = 1; + } + if (atom_id1 != atom_j.neighbor[k]) { + at_coord[3][0] = out_at[atom_j.neighbor[k]].x; + at_coord[3][1] = out_at[atom_j.neighbor[k]].y; + at_coord[3][2] = out_at[atom_j.neighbor[k]].z; + } + } - score += (nof_wedge_bonds_i > 0) * 4; - score += (nof_wedge_bonds_j > 0) * 4; + score += (nof_wedge_bonds_i > 0) * 4; + score += (nof_wedge_bonds_j > 0) * 4; - score -= (nof_wedge_bonds_i == 0) * 3; - score -= (nof_wedge_bonds_j == 0) * 3; + score -= (nof_wedge_bonds_i == 0) * 3; + score -= (nof_wedge_bonds_j == 0) * 3; - score += has_double_bond_i * 2; - score += has_double_bond_j * 2; + score += has_double_bond_i * 2; + score += has_double_bond_j * 2; - score += (fused_atom_partner[atom_id1] != j && fused_atom_partner[atom_id2] != i); - score += (fused_atom_partner[atom_id1] == -1 || fused_atom_partner[atom_id2] == -1); + score += (fused_atom_partner[atom_id1] != j && fused_atom_partner[atom_id2] != i); + score += (fused_atom_partner[atom_id1] == -1 || fused_atom_partner[atom_id2] == -1); - int atom_in_same_small_ring = are_atoms_in_same_small_ring(out_at, - num_atoms, - ring_result, - atom_id1, atom_id2, - 6); + int both_atoms_in_same_small_ring = are_atoms_in_same_small_ring(out_at, + num_atoms, + ring_result, + atom_id1, atom_id2, + 6); - score += (atom_in_same_small_ring == 0); + score += (both_atoms_in_same_small_ring == 0); - // printf("are atom in small ring? %d %d\n", atom_in_same_small_ring, (atom_in_same_small_ring == 1) * 10); - score -= (atom_in_same_small_ring == 1) * 20; + // printf("are atom in small ring? %d %d\n", atom_in_same_small_ring, (atom_in_same_small_ring == 1) * 10); + score -= (both_atoms_in_same_small_ring == 1) * 20; - int planar_check = are_4at_in_one_plane(at_coord, 0.03); + int is_planar = are_4at_in_one_plane(at_coord, 0.03); - if (score > 10) { - printf(">>> FOUND atropisomer: atom id %2d atom id %2d planar check %d --> score %2d (%d)\n", atom_id1, atom_id2, planar_check, score, atom_in_same_small_ring); - orig_inp_data->is_atropisomer = 1; - orig_inp_data->is_diasteroisomeric_atropisomer = ((nof_wedge_bonds_i > 0) && (nof_wedge_bonds_j > 0)); + int is_atropisomer = 0; - out_at[atom_id1].bAtropisomeric = 1; - out_at[atom_id2].bAtropisomeric = 1; + if (score > 10) { + is_atropisomer = 1; + } else if (score > 9) { + if (is_planar == 0) { + is_atropisomer = 1; + } else { + // TODO are more tests/rules needed?? + } + } - } else if (score > 9) { - if (planar_check == 0) { - printf(">>> FOUND atropisomer (higher score): atom id %2d atom id %2d planar check %d --> score %2d (%d)\n", atom_id1, atom_id2, planar_check, score, atom_in_same_small_ring); - orig_inp_data->is_atropisomer = 1; - orig_inp_data->is_diasteroisomeric_atropisomer = ((nof_wedge_bonds_i > 0) && (nof_wedge_bonds_j > 0)); + if (is_atropisomer == 1) { + printf(">>> FOUND atropisomer (higher score): atom id %2d atom id %2d is planar %d --> score %2d (%d)\n", atom_id1, atom_id2, is_planar, score, both_atoms_in_same_small_ring); + orig_inp_data->is_atropisomer = 1; - out_at[atom_id1].bAtropisomeric = 1; - out_at[atom_id2].bAtropisomeric = 1; - } else { - // printf(">>> potential atropisomer (higher score): atom id %2d atom id %2d planar check %d --> score %2d (%d)\n", atom_id1, atom_id2, planar_check, score, atom_in_same_small_ring); - } - } + //TODO this rule is not enough for setting the flag + orig_inp_data->is_enantiomeric_atropisomer = ((nof_wedge_bonds_i > 0) && (nof_wedge_bonds_j > 0)); - // printf(">>> is atropisomer\n"); - // printf("infos: atom %d with atom %d; bond type %d; bond stereo %d\n", - // atom_id1, atom_id2, atom_i.bond_type[j], atom_i.bond_stereo[j]); - // printf("atom type %d %d\n", atom_i.el_number, atom_j.el_number); - // printf("has double bond %d %d\n", has_double_bond_i, has_double_bond_j); - // printf("fused pivot atoms %d %d\n", fused_atom_partner[atom_id1], fused_atom_partner[atom_id2]); + out_at[atom_id1].bAtropisomeric = 1; + out_at[atom_id2].bAtropisomeric = 1; } + + // printf(">>> is atropisomer\n"); + // printf("infos: atom %d with atom %d; bond type %d; bond stereo %d\n", + // atom_id1, atom_id2, atom_i.bond_type[j], atom_i.bond_stereo[j]); + // printf("atom type %d %d\n", atom_i.el_number, atom_j.el_number); + // printf("has double bond %d %d\n", has_double_bond_i, has_double_bond_j); + // printf("fused pivot atoms %d %d\n", fused_atom_partner[atom_id1], fused_atom_partner[atom_id2]); } } - - // for (int i = 0; i < ring_result->count; i++) { - // const Ring *cur_ring = &ring_result->rings[i]; - // if (cur_ring->size >= 8) { - // int count_single_bonds = 0; - // int count_double_bonds = 0; - // for (int j = 0; j < cur_ring->size; j++) { - // int atom_id1 = cur_ring->atom_ids[j]; - // int atom_id2 = cur_ring->atom_ids[(j + 1) % cur_ring->size]; - // const inp_ATOM atom1 = out_at[atom_id1]; - // for (int k = 0; k < atom1.valence; k++) { - // if (atom1.neighbor[k] == atom_id2) { - // if (atom1.bond_type[k] == 1) { - // count_single_bonds++; - // } else if (atom1.bond_type[k] == 2) { - // count_double_bonds++; - // } - // } - // } - // } - - // if (cur_ring->is_fused_ring == 0) { - // printf(">>> ring id %d size %d nof single bonds %d nof double bonds %d fused ring %d\n", - // cur_ring->id, cur_ring->size, - // count_single_bonds, count_double_bonds, - // cur_ring->is_fused_ring); - // } - // } - // } } diff --git a/INCHI-1-SRC/INCHI_BASE/src/ichimake.c b/INCHI-1-SRC/INCHI_BASE/src/ichimake.c index e6f3f37e..4fd5782d 100644 --- a/INCHI-1-SRC/INCHI_BASE/src/ichimake.c +++ b/INCHI-1-SRC/INCHI_BASE/src/ichimake.c @@ -3906,7 +3906,7 @@ int Create_INChI(CANON_GLOBALS* pCG, MarkRingSystemsInp(out_at, num_atoms, 0); orig_inp_data->is_atropisomer = 0; - orig_inp_data->is_diasteroisomeric_atropisomer = 0; + orig_inp_data->is_enantiomeric_atropisomer = 0; if (ip->Atropisomers) { RingSystems *ring_result = find_rings(out_at, num_atoms); diff --git a/INCHI-1-SRC/INCHI_BASE/src/inpdef.h b/INCHI-1-SRC/INCHI_BASE/src/inpdef.h index 35c13107..b0a78af8 100644 --- a/INCHI-1-SRC/INCHI_BASE/src/inpdef.h +++ b/INCHI-1-SRC/INCHI_BASE/src/inpdef.h @@ -465,7 +465,7 @@ typedef struct tagOrigAtom int is_atropisomer; /* flag indicating whether the structure is an atropisomer; it is set to 1 if the structure has been identified as an atropisomer during input processing, and 0 otherwise */ - int is_diasteroisomeric_atropisomer; + int is_enantiomeric_atropisomer; } ORIG_ATOM_DATA; diff --git a/INCHI-1-SRC/INCHI_BASE/src/strutil.c b/INCHI-1-SRC/INCHI_BASE/src/strutil.c index 565fc87b..d4f01735 100644 --- a/INCHI-1-SRC/INCHI_BASE/src/strutil.c +++ b/INCHI-1-SRC/INCHI_BASE/src/strutil.c @@ -7142,10 +7142,11 @@ int set_Atropisomer_t_m_layers( const ORIG_ATOM_DATA *orig_inp_data, //TODO // - t layer parities for atropisomers // -> t-parity[atom] = 1 (-) + // -> should parity be set to (+) ??? // - m layer for atropisomers - // -> enantiomeric atropisomers: m1 (inchi->Stereo->nCompInv2Abs = -1; //m1) - // -> diastereomeric atropisomers: m0 (inchi->Stereo->nCompInv2Abs = 1; //m0) - // -> check number of stereocenters: if #stereocenter >= 2 + // -> enantiomeric atropisomers: m1 (inchi->Stereo->nCompInv2Abs = -1; //m1) (are mirror images) + // -> diastereomeric atropisomers: m0 (inchi->Stereo->nCompInv2Abs = 1; //m0) ??? + // -> rules? if (orig_inp_data->is_atropisomer) { // printf(">>>>> TODO set t- and m-layers for atropisomers\n"); @@ -7191,7 +7192,7 @@ int set_Atropisomer_t_m_layers( const ORIG_ATOM_DATA *orig_inp_data, } if (ret == 1) { - if (orig_inp_data->is_diasteroisomeric_atropisomer == 1) { + if (orig_inp_data->is_enantiomeric_atropisomer == 1) { inchi->Stereo->nCompInv2Abs = 1; //m1 } else { inchi->Stereo->nCompInv2Abs = -1; From 10662f008d2f21001df6fb68539993bb6d633aec Mon Sep 17 00:00:00 2001 From: Christoph Mueller Date: Mon, 30 Mar 2026 13:29:23 +0000 Subject: [PATCH 16/18] added unit tests for ring_detection and atropisomers; and added code for handling faulty values --- INCHI-1-SRC/INCHI_BASE/src/atropisomers.c | 150 +--- INCHI-1-SRC/INCHI_BASE/src/atropisomers.h | 9 +- INCHI-1-SRC/INCHI_BASE/src/ichimake.c | 15 +- INCHI-1-SRC/INCHI_BASE/src/ring_detection.c | 8 + INCHI-1-SRC/INCHI_BASE/src/ring_detection.h | 2 +- .../tests/test_unit/test_atropisomers.cpp | 10 + .../tests/test_unit/test_ring_detection.cpp | 808 ++++++++++++++++++ .../test_unit/test_strutil_enhancedStereo.cpp | 4 +- 8 files changed, 856 insertions(+), 150 deletions(-) create mode 100644 INCHI-1-TEST/tests/test_unit/test_ring_detection.cpp diff --git a/INCHI-1-SRC/INCHI_BASE/src/atropisomers.c b/INCHI-1-SRC/INCHI_BASE/src/atropisomers.c index 78cb9235..29bff988 100644 --- a/INCHI-1-SRC/INCHI_BASE/src/atropisomers.c +++ b/INCHI-1-SRC/INCHI_BASE/src/atropisomers.c @@ -5,141 +5,34 @@ #include "ichister.h" +int find_atropisomeric_atoms_and_bonds(inp_ATOM* out_at, + int num_atoms, + RingSystems *ring_result, + ORIG_ATOM_DATA *orig_inp_data) { -void find_atropisomeric_atoms_and_bonds_old(inp_ATOM* out_at, - int num_atoms, - RingSystems *ring_result, - ORIG_ATOM_DATA *orig_inp_data, - int *fused_atom_partner) { + int ret = 0; - - for (int i = 0; i < num_atoms; i++) { - - int atom_id1 = i; - const inp_ATOM atom_i = out_at[atom_id1]; - - int num_neighbors_i = atom_i.valence; - - const AT_NUMB *neighbors = atom_i.neighbor; - - if (num_neighbors_i == 3) { - for (int j = 0; j < num_neighbors_i; j++) { - - int atom_id2 = neighbors[j]; - - if (atom_id1 >= atom_id2) { - continue; - } - - const inp_ATOM atom_j = out_at[atom_id2]; - - int num_neighbors_j = atom_j.valence; - - if (num_neighbors_j == 3 && - atom_i.bond_stereo[j] == 0 && - atom_i.bond_type[j] == 1) { - - if (ring_result->atom_to_ring_mapping[atom_id1].ring_count > 0 || - ring_result->atom_to_ring_mapping[atom_id2].ring_count > 0) { - - int nof_wedge_bonds_i = 0; - int has_double_bond_i = 0; - for (int k = 0; k < num_neighbors_i; k++) { - if (atom_i.bond_stereo[k] == 1 || - atom_i.bond_stereo[k] == 4 || - atom_i.bond_stereo[k] == 6) { - nof_wedge_bonds_i++; - } - if (atom_i.bond_type[k] == 2) { - has_double_bond_i = 1; - } - } - int nof_wedge_bonds_j = 0; - int has_double_bond_j = 0; - for (int k = 0; k < num_neighbors_j; k++) { - if (atom_j.bond_stereo[k] == 1 || - atom_j.bond_stereo[k] == 4 || - atom_j.bond_stereo[k] == 6) { - nof_wedge_bonds_j++; - } - if (atom_j.bond_type[k] == 2) { - has_double_bond_j = 1; - } - } - - if (nof_wedge_bonds_i > 0 || - nof_wedge_bonds_j > 0) { - - // if ((has_double_bond_i || has_double_bond_j) || 1==1) { - if ((fused_atom_partner[atom_id1] != j && - fused_atom_partner[atom_id2] != i) || - (fused_atom_partner[atom_id1] == -1 || - fused_atom_partner[atom_id2] == -1)) { - - if (are_atoms_in_same_small_ring(out_at, - num_atoms, - ring_result, - atom_id1, atom_id2, - 6) == 0) { - printf(">>> is atropisomer\n"); - printf("infos: atom %d with atom %d; bond type %d; bond stereo %d\n", - atom_id1, atom_id2, atom_i.bond_type[j], atom_i.bond_stereo[j]); - // printf("atom type %d %d\n", atom_i.el_number, atom_j.el_number); - // printf("has double bond %d %d\n", has_double_bond_i, has_double_bond_j); - // printf("fused pivot atoms %d %d\n", fused_atom_partner[atom_id1], fused_atom_partner[atom_id2]); - - //TODO set atoms with atropisomeric bonds in out_at - orig_inp_data->is_atropisomer = 1; - } - } - // } - } else { - // printf(">>> not atropisomer because no wedge bonds: atom %d with atom %d; bond type %d; bond stereo %d\n", - // atom_id1, atom_id2, atom_i.bond_type[j], atom_i.bond_stereo[j]); - } - - } - } - } - } + if (out_at == NULL || num_atoms <= 0) { + return ret; } - for (int i = 0; i < ring_result->count; i++) { - const Ring *cur_ring = &ring_result->rings[i]; - if (cur_ring->size >= 8) { - int count_single_bonds = 0; - int count_double_bonds = 0; - for (int j = 0; j < cur_ring->size; j++) { - int atom_id1 = cur_ring->atom_ids[j]; - int atom_id2 = cur_ring->atom_ids[(j + 1) % cur_ring->size]; - const inp_ATOM atom1 = out_at[atom_id1]; - for (int k = 0; k < atom1.valence; k++) { - if (atom1.neighbor[k] == atom_id2) { - if (atom1.bond_type[k] == 1) { - count_single_bonds++; - } else if (atom1.bond_type[k] == 2) { - count_double_bonds++; - } - } - } - } + if (ring_result == NULL || orig_inp_data == NULL) { + return ret; + } - if (cur_ring->is_fused_ring == 0) { - printf(">>> ring id %d size %d nof single bonds %d nof double bonds %d fused ring %d\n", - cur_ring->id, cur_ring->size, - count_single_bonds, count_double_bonds, - cur_ring->is_fused_ring); + int fused_atom_partner[num_atoms]; + for (int i = 0; i < num_atoms; i++) { + // out_at[i].fused_partner_atom_id = -1; + fused_atom_partner[i] = -1; + } + for (int i = 0; i < num_atoms; i++) { + for (int j = i + 1; j < num_atoms; j++) { + if(is_fused_ring_pivot(ring_result, out_at, i, j)) { + fused_atom_partner[i] = j; + fused_atom_partner[j] = i; } } } -} - -void find_atropisomeric_atoms_and_bonds(inp_ATOM* out_at, - int num_atoms, - RingSystems *ring_result, - ORIG_ATOM_DATA *orig_inp_data, - int *fused_atom_partner) { - for (int i = 0; i < num_atoms; i++) { @@ -258,9 +151,11 @@ void find_atropisomeric_atoms_and_bonds(inp_ATOM* out_at, if (score > 10) { is_atropisomer = 1; + ret = 1; } else if (score > 9) { if (is_planar == 0) { is_atropisomer = 1; + ret = 1; } else { // TODO are more tests/rules needed?? } @@ -285,4 +180,5 @@ void find_atropisomeric_atoms_and_bonds(inp_ATOM* out_at, // printf("fused pivot atoms %d %d\n", fused_atom_partner[atom_id1], fused_atom_partner[atom_id2]); } } + return ret; } diff --git a/INCHI-1-SRC/INCHI_BASE/src/atropisomers.h b/INCHI-1-SRC/INCHI_BASE/src/atropisomers.h index db4eabc7..94929ed7 100644 --- a/INCHI-1-SRC/INCHI_BASE/src/atropisomers.h +++ b/INCHI-1-SRC/INCHI_BASE/src/atropisomers.h @@ -2,8 +2,7 @@ #include "inpdef.h" #include "ring_detection.h" -void find_atropisomeric_atoms_and_bonds(inp_ATOM* out_at, - int num_atoms, - RingSystems *ring_result, - ORIG_ATOM_DATA *orig_inp_data, - int *fused_atom_partner); +int find_atropisomeric_atoms_and_bonds(inp_ATOM* out_at, + int num_atoms, + RingSystems *ring_result, + ORIG_ATOM_DATA *orig_inp_data); diff --git a/INCHI-1-SRC/INCHI_BASE/src/ichimake.c b/INCHI-1-SRC/INCHI_BASE/src/ichimake.c index 4fd5782d..3327590c 100644 --- a/INCHI-1-SRC/INCHI_BASE/src/ichimake.c +++ b/INCHI-1-SRC/INCHI_BASE/src/ichimake.c @@ -3911,21 +3911,8 @@ int Create_INChI(CANON_GLOBALS* pCG, RingSystems *ring_result = find_rings(out_at, num_atoms); // print_ring_result(ring_result); - int fused_atom_partner[num_atoms]; - for (i = 0; i < num_atoms; i++) { - // out_at[i].fused_partner_atom_id = -1; - fused_atom_partner[i] = -1; - } - for (i = 0; i < num_atoms; i++) { - for (int j = i + 1; j < num_atoms; j++) { - if(is_fused_ring_pivot(ring_result, out_at, i, j)) { - fused_atom_partner[i] = j; - fused_atom_partner[j] = i; - } - } - } - find_atropisomeric_atoms_and_bonds(out_at, num_atoms, ring_result, orig_inp_data, fused_atom_partner); + int ret_ai = find_atropisomeric_atoms_and_bonds(out_at, num_atoms, ring_result, orig_inp_data); //map values to orig_inp_data if (orig_inp_data->is_atropisomer) { diff --git a/INCHI-1-SRC/INCHI_BASE/src/ring_detection.c b/INCHI-1-SRC/INCHI_BASE/src/ring_detection.c index eccc2af5..92fe915f 100644 --- a/INCHI-1-SRC/INCHI_BASE/src/ring_detection.c +++ b/INCHI-1-SRC/INCHI_BASE/src/ring_detection.c @@ -167,6 +167,10 @@ int are_atoms_in_same_small_ring(const inp_ATOM* atoms, return 0; } + if (num_atoms <= 0) { + return 0; + } + if (rs == NULL) { return 0; } @@ -175,6 +179,10 @@ int are_atoms_in_same_small_ring(const inp_ATOM* atoms, return 0; } + if (atom_id1 < 0 || atom_id2 < 0) { + return 0; + } + if (atom_id1 >= num_atoms || atom_id2 >= num_atoms) { return 0; } diff --git a/INCHI-1-SRC/INCHI_BASE/src/ring_detection.h b/INCHI-1-SRC/INCHI_BASE/src/ring_detection.h index f965baf2..81c73a55 100644 --- a/INCHI-1-SRC/INCHI_BASE/src/ring_detection.h +++ b/INCHI-1-SRC/INCHI_BASE/src/ring_detection.h @@ -38,7 +38,7 @@ void print_ring_result(const RingSystems *rs); void free_ring_system(RingSystems *rs); -int are_atoms_in_same_small_ring(const inp_ATOM* atoms, +int are_atoms_in_same_small_ring(const inp_ATOM *atoms, int num_atoms, const RingSystems *rs, int atom_id1, int atom_id2, diff --git a/INCHI-1-TEST/tests/test_unit/test_atropisomers.cpp b/INCHI-1-TEST/tests/test_unit/test_atropisomers.cpp index c8bb5503..bed064c1 100644 --- a/INCHI-1-TEST/tests/test_unit/test_atropisomers.cpp +++ b/INCHI-1-TEST/tests/test_unit/test_atropisomers.cpp @@ -5,6 +5,16 @@ extern "C" { #include "../../../INCHI-1-SRC/INCHI_BASE/src/inchi_api.h" #include "../../../INCHI-1-SRC/INCHI_BASE/src/mode.h" +#include "../../../INCHI-1-SRC/INCHI_BASE/src/atropisomers.h" +} + +TEST(test_atropisomers, find_atropisomeric_atoms_and_bonds__null_parameters) { + + find_atropisomeric_atoms_and_bonds(nullptr, + 0, + nullptr, + nullptr); + } TEST(test_atropisomers, test_dummy_1_atropisomer) diff --git a/INCHI-1-TEST/tests/test_unit/test_ring_detection.cpp b/INCHI-1-TEST/tests/test_unit/test_ring_detection.cpp new file mode 100644 index 00000000..1d1fab2a --- /dev/null +++ b/INCHI-1-TEST/tests/test_unit/test_ring_detection.cpp @@ -0,0 +1,808 @@ +#include + +extern "C" +{ +#include "../../../INCHI-1-SRC/INCHI_BASE/src/inpdef.h" +#include "../../../INCHI-1-SRC/INCHI_BASE/src/ring_detection.h" +#include "../../../INCHI-1-SRC/INCHI_BASE/src/strutil.h" +#include "../../../INCHI-1-SRC/INCHI_BASE/src/ichi_io.h" +} + +TEST(test_ring_detection, find_rings__no_ring) { + + int num_at = 3; + + inp_ATOM *atoms = CreateInpAtom(num_at); + + // Atom 0 connected to 1 + atoms[0].neighbor[0] = 1; + atoms[0].valence = 1; + + // Atom 1 connected to 0 + atoms[1].neighbor[0] = 0; + atoms[1].neighbor[1] = 2; + atoms[1].valence = 2; + + // Atom 1 connected to 0 + atoms[2].neighbor[0] = 1; + atoms[2].valence = 1; + + RingSystems* rs = find_rings(atoms, num_at); + + EXPECT_NE(rs, nullptr); + EXPECT_EQ(rs->count, 0); + + free_ring_system(rs); + + FreeInpAtom(&atoms); +} + +TEST(test_ring_detection, find_rings__single_triangle_ring) { + + int num_at = 3; + + inp_ATOM *atoms = CreateInpAtom(num_at); + + // Atom 0 connected to 1 and 2 + atoms[0].neighbor[0] = 1; + atoms[0].neighbor[1] = 2; + atoms[0].valence = 2; + + // Atom 1 connected to 0 and 2 + atoms[1].neighbor[0] = 0; + atoms[1].neighbor[1] = 2; + atoms[1].valence = 2; + + // Atom 2 connected to 0 and 1 + atoms[2].neighbor[0] = 0; + atoms[2].neighbor[1] = 1; + atoms[2].valence = 2; + + RingSystems* rs = find_rings(atoms, num_at); + + EXPECT_NE(rs, nullptr); + EXPECT_EQ(rs->count, 1); + + const Ring& ring = rs->rings[0]; + EXPECT_EQ(ring.size, 3); + + bool has0 = false, has1 = false, has2 = false; + for (int i = 0; i < ring.size; ++i) { + if (ring.atom_ids[i] == 0) has0 = true; + if (ring.atom_ids[i] == 1) has1 = true; + if (ring.atom_ids[i] == 2) has2 = true; + } + EXPECT_TRUE(has0 && has1 && has2); + + free_ring_system(rs); + + FreeInpAtom(&atoms); +} + +TEST(test_ring_detection, find_rings__benzene_ring) { + + int num_at = 6; + + inp_ATOM *atoms = CreateInpAtom(num_at); + + // Atom 0 connected to 1 and 5 + atoms[0].neighbor[0] = 5; + atoms[0].neighbor[1] = 1; + atoms[0].valence = 2; + + // Atom 1 connected to 0 and 2 + atoms[1].neighbor[0] = 0; + atoms[1].neighbor[1] = 2; + atoms[1].valence = 2; + + // Atom 2 connected to 1 and 3 + atoms[2].neighbor[0] = 1; + atoms[2].neighbor[1] = 3; + atoms[2].valence = 2; + + // Atom 3 connected to 2 and 4 + atoms[3].neighbor[0] = 2; + atoms[3].neighbor[1] = 4; + atoms[3].valence = 2; + + // Atom 4 connected to 3 and 5 + atoms[4].neighbor[0] = 3; + atoms[4].neighbor[1] = 5; + atoms[4].valence = 2; + + // Atom 5 connected to 4 and 0 + atoms[5].neighbor[0] = 4; + atoms[5].neighbor[1] = 0; + atoms[5].valence = 2; + + RingSystems* rs = find_rings(atoms, num_at); + + EXPECT_NE(rs, nullptr); + EXPECT_EQ(rs->count, 1); + + const Ring& ring = rs->rings[0]; + EXPECT_EQ(ring.size, 6); + + free_ring_system(rs); + + FreeInpAtom(&atoms); +} + +TEST(test_ring_detection, find_rings__molblock_ring_1_no_rings) { + + + INCHI_IOSTREAM input_stream; + + const char *molblock = + "enhanc_stereo1 \n" + " ACD/LABS08242216132D \n" + " \n" + " 0 0 0 0 0 0 0 0 0 0999 V3000 \n" + "M V30 BEGIN CTAB \n" + "M V30 COUNTS 18 17 0 0 1 \n" + "M V30 BEGIN ATOM \n" + "M V30 1 C 3424.1946 -1936.7935 0 0 \n" + "M V30 2 C 3352.3145 -1895.2935 0 0 \n" + "M V30 3 C 3280.4346 -1936.7935 0 0 \n" + "M V30 4 C 3208.5542 -1895.2935 0 0 \n" + "M V30 5 C 3136.6743 -1936.7935 0 0 \n" + "M V30 6 C 3064.7944 -1895.2935 0 0 \n" + "M V30 7 Br 3136.6743 -2019.7935 0 0 \n" + "M V30 8 Cl 3208.5542 -1812.2935 0 0 \n" + "M V30 9 Cl 3280.4346 -2019.7935 0 0 \n" + "M V30 10 Cl 3352.3145 -1812.2935 0 0 \n" + "M V30 11 Cl 3424.1946 -2019.7935 0 0 \n" + "M V30 12 C 3496.075 -1895.2935 0 0 \n" + "M V30 13 C 3567.9548 -1936.7942 0 0 \n" + "M V30 14 C 3639.835 -1895.2944 0 0 \n" + "M V30 15 C 3711.7148 -1936.7942 0 0 \n" + "M V30 16 Cl 3639.835 -1812.2944 0 0 \n" + "M V30 17 Cl 3567.9548 -2019.7942 0 0 \n" + "M V30 18 Cl 3496.075 -1812.2937 0 0 \n" + "M V30 END ATOM \n" + "M V30 BEGIN BOND \n" + "M V30 1 1 1 2 \n" + "M V30 2 1 1 11 CFG=3 \n" + "M V30 3 1 1 12 \n" + "M V30 4 1 2 3 \n" + "M V30 5 1 2 10 CFG=1 \n" + "M V30 6 1 3 4 \n" + "M V30 7 1 3 9 CFG=1 \n" + "M V30 8 1 4 5 \n" + "M V30 9 1 4 8 CFG=1 \n" + "M V30 10 1 5 6 \n" + "M V30 11 1 5 7 CFG=1 \n" + "M V30 12 1 12 13 \n" + "M V30 13 1 12 18 CFG=3 \n" + "M V30 14 1 13 14 \n" + "M V30 15 1 13 17 CFG=1 \n" + "M V30 16 1 14 15 \n" + "M V30 17 1 14 16 CFG=1 \n" + "M V30 END BOND \n" + "M V30 BEGIN COLLECTION \n" + "M V30 MDLV30/STERAC2 ATOMS=(1 1) \n" + "M V30 MDLV30/STERAC1 ATOMS=(2 2 3) \n" + "M V30 MDLV30/STEABS ATOMS=(2 4 5) \n" + "M V30 MDLV30/STEREL1 ATOMS=(2 12 13) \n" + "M V30 MDLV30/STEREL2 ATOMS=(1 14) \n" + "M V30 END COLLECTION \n" + "M V30 END CTAB \n" + "M END \n"; + + inchi_ios_init(&input_stream, INCHI_IOS_TYPE_STRING, nullptr); + inchi_ios_print_nodisplay(&input_stream, molblock); + + ORIG_ATOM_DATA *orig_inp_data = (ORIG_ATOM_DATA*)inchi_calloc(1, sizeof(ORIG_ATOM_DATA)); + int bMergeAllInputStructures = 0; + int bGetOrigCoord = 0; + int bDoNotAddH = 0; + int treat_polymers = 0; + int treat_NPZz = 0; + const char *pSdfLabel = nullptr; + char *pSdfValue = nullptr; + unsigned long *lSdfId = nullptr; + long *lMolfileNumber = nullptr; + INCHI_MODE pInpAtomFlags = 0; + int err = 0; + char *pStrErr = nullptr; + int bNoWarnings = 0; + + int ret = CreateOrigInpDataFromMolfile( + &input_stream, + orig_inp_data, + bMergeAllInputStructures, + bGetOrigCoord, + bDoNotAddH, + treat_polymers, + treat_NPZz, + pSdfLabel, + pSdfValue, + lSdfId, + lMolfileNumber, + &pInpAtomFlags, + &err, + pStrErr, + bNoWarnings); + + + RingSystems *rs = find_rings(orig_inp_data->at, orig_inp_data->num_inp_atoms); + + // print_ring_result(rs); + + EXPECT_NE(rs, nullptr); + EXPECT_EQ(rs->count, 0); + + FreeOrigAtData(orig_inp_data); + inchi_free(orig_inp_data); + + free_ring_system(rs); + + inchi_ios_free_str(&input_stream); +} + +TEST(test_ring_detection, find_rings__molblock_ring_2_two_rings) { + + + INCHI_IOSTREAM input_stream; + + const char *molblock = + "atropisomer test mol \n" + " Ketcher 2192614182D 1 1.00000 0.00000 0 \n" + " \n" + " 16 17 0 0 1 0 0 0 0 0999 V2000 \n" + " 6.7160 -7.9750 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 5.8500 -7.4750 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 4.9840 -7.9750 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 4.9840 -8.9750 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 5.8500 -9.4750 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 6.7160 -8.9750 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 6.7160 -5.9750 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 5.8500 -6.4750 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 4.9840 -5.9750 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 4.9840 -4.9750 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 6.7160 -4.9750 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 5.8500 -4.4750 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 7.5821 -6.4750 0.0000 Br 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 4.1179 -6.4750 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 4.1179 -7.4749 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 7.5821 -7.4750 0.0000 Br 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 1 6 1 0 0 0 0 \n" + " 1 2 2 0 0 0 0 \n" + " 2 3 1 1 0 0 0 \n" + " 2 8 1 0 0 0 0 \n" + " 3 4 2 0 0 0 0 \n" + " 5 4 1 0 0 0 0 \n" + " 5 6 2 0 0 0 0 \n" + " 8 7 1 1 0 0 0 \n" + " 7 11 2 0 0 0 0 \n" + " 8 9 2 0 0 0 0 \n" + " 9 10 1 0 0 0 0 \n" + " 10 12 2 0 0 0 0 \n" + " 12 11 1 0 0 0 0 \n" + " 7 13 1 0 0 0 0 \n" + " 9 14 1 0 0 0 0 \n" + " 3 15 1 0 0 0 0 \n" + " 1 16 1 0 0 0 0 \n" + "M END \n"; + + inchi_ios_init(&input_stream, INCHI_IOS_TYPE_STRING, nullptr); + inchi_ios_print_nodisplay(&input_stream, molblock); + + ORIG_ATOM_DATA *orig_inp_data = (ORIG_ATOM_DATA*)inchi_calloc(1, sizeof(ORIG_ATOM_DATA)); + int bMergeAllInputStructures = 0; + int bGetOrigCoord = 0; + int bDoNotAddH = 0; + int treat_polymers = 0; + int treat_NPZz = 0; + const char *pSdfLabel = nullptr; + char *pSdfValue = nullptr; + unsigned long *lSdfId = nullptr; + long *lMolfileNumber = nullptr; + INCHI_MODE pInpAtomFlags = 0; + int err = 0; + char *pStrErr = nullptr; + int bNoWarnings = 0; + + int ret = CreateOrigInpDataFromMolfile( + &input_stream, + orig_inp_data, + bMergeAllInputStructures, + bGetOrigCoord, + bDoNotAddH, + treat_polymers, + treat_NPZz, + pSdfLabel, + pSdfValue, + lSdfId, + lMolfileNumber, + &pInpAtomFlags, + &err, + pStrErr, + bNoWarnings); + + + RingSystems *rs = find_rings(orig_inp_data->at, orig_inp_data->num_inp_atoms); + + // print_ring_result(rs); + + EXPECT_NE(rs, nullptr); + EXPECT_EQ(rs->count, 2); + + EXPECT_EQ(rs->rings[0].size, 6); + EXPECT_EQ(rs->rings[1].size, 6); + + FreeOrigAtData(orig_inp_data); + inchi_free(orig_inp_data); + + free_ring_system(rs); + + inchi_ios_free_str(&input_stream); +} + +TEST(test_ring_detection, find_rings__molblock_ring_3_two_fused_rings) { + + INCHI_IOSTREAM input_stream; + + const char *molblock = + "test mol fused benzene \n" + " -INDIGO-03302612192D \n" + " \n" + " 0 0 0 0 0 0 0 0 0 0 0 V3000 \n" + "M V30 BEGIN CTAB \n" + "M V30 COUNTS 10 11 0 0 0 \n" + "M V30 BEGIN ATOM \n" + "M V30 1 C 4.83485 -5.40007 0.0 0 \n" + "M V30 2 C 6.56515 -5.39959 0.0 0 \n" + "M V30 3 C 5.70164 -4.89997 0.0 0 \n" + "M V30 4 C 6.56515 -6.40053 0.0 0 \n" + "M V30 5 C 4.83485 -6.40502 0.0 0 \n" + "M V30 6 C 5.70382 -6.90003 0.0 0 \n" + "M V30 7 C 7.42965 -4.90121 0.0 0 \n" + "M V30 8 C 8.29683 -5.40155 0.0 0 \n" + "M V30 9 C 7.4358 -6.90287 0.0 0 \n" + "M V30 10 C 8.29903 -6.39746 0.0 0 \n" + "M V30 END ATOM \n" + "M V30 BEGIN BOND \n" + "M V30 1 2 3 1 \n" + "M V30 2 1 1 5 \n" + "M V30 3 2 5 6 \n" + "M V30 4 1 6 4 \n" + "M V30 5 2 4 2 \n" + "M V30 6 1 2 3 \n" + "M V30 7 1 4 9 \n" + "M V30 8 2 9 10 \n" + "M V30 9 1 10 8 \n" + "M V30 10 2 8 7 \n" + "M V30 11 1 7 2 \n" + "M V30 END BOND \n" + "M V30 END CTAB \n" + "M END \n"; + + + inchi_ios_init(&input_stream, INCHI_IOS_TYPE_STRING, nullptr); + inchi_ios_print_nodisplay(&input_stream, molblock); + + ORIG_ATOM_DATA *orig_inp_data = (ORIG_ATOM_DATA*)inchi_calloc(1, sizeof(ORIG_ATOM_DATA)); + int bMergeAllInputStructures = 0; + int bGetOrigCoord = 0; + int bDoNotAddH = 0; + int treat_polymers = 0; + int treat_NPZz = 0; + const char *pSdfLabel = nullptr; + char *pSdfValue = nullptr; + unsigned long *lSdfId = nullptr; + long *lMolfileNumber = nullptr; + INCHI_MODE pInpAtomFlags = 0; + int err = 0; + char *pStrErr = nullptr; + int bNoWarnings = 0; + + int ret = CreateOrigInpDataFromMolfile( + &input_stream, + orig_inp_data, + bMergeAllInputStructures, + bGetOrigCoord, + bDoNotAddH, + treat_polymers, + treat_NPZz, + pSdfLabel, + pSdfValue, + lSdfId, + lMolfileNumber, + &pInpAtomFlags, + &err, + pStrErr, + bNoWarnings); + + + RingSystems *rs = find_rings(orig_inp_data->at, orig_inp_data->num_inp_atoms); + + // print_ring_result(rs); + + EXPECT_NE(rs, nullptr); + EXPECT_EQ(rs->count, 3); + + EXPECT_EQ(rs->rings[0].size, 6); + EXPECT_EQ(rs->rings[1].size, 10); + EXPECT_EQ(rs->rings[2].size, 6); + + FreeOrigAtData(orig_inp_data); + inchi_free(orig_inp_data); + + free_ring_system(rs); + + inchi_ios_free_str(&input_stream); +} + +TEST(test_ring_detection, find_rings__molblock_ring_4_three_fused_rings) { + + INCHI_IOSTREAM input_stream; + + const char *molblock = + "test mol \n" + " -INDIGO-03302612232D \n" + " \n" + " 0 0 0 0 0 0 0 0 0 0 0 V3000 \n" + "M V30 BEGIN CTAB \n" + "M V30 COUNTS 13 15 0 0 0 \n" + "M V30 BEGIN ATOM \n" + "M V30 1 C 4.83485 -5.40007 0.0 0 \n" + "M V30 2 C 6.56515 -5.39959 0.0 0 \n" + "M V30 3 C 5.70164 -4.89997 0.0 0 \n" + "M V30 4 C 6.56515 -6.40053 0.0 0 \n" + "M V30 5 C 4.83485 -6.40502 0.0 0 \n" + "M V30 6 C 5.70382 -6.90003 0.0 0 \n" + "M V30 7 C 7.42965 -4.90121 0.0 0 \n" + "M V30 8 C 8.29683 -5.40155 0.0 0 \n" + "M V30 9 C 7.4358 -6.90287 0.0 0 \n" + "M V30 10 C 8.29903 -6.39746 0.0 0 \n" + "M V30 11 C 9.82314 -5.90132 0.0 0 \n" + "M V30 12 C 9.246 -5.10027 0.0 0 \n" + "M V30 13 C 9.23791 -6.703 0.0 0 \n" + "M V30 END ATOM \n" + "M V30 BEGIN BOND \n" + "M V30 1 2 3 1 \n" + "M V30 2 1 1 5 \n" + "M V30 3 2 5 6 \n" + "M V30 4 1 6 4 \n" + "M V30 5 2 4 2 \n" + "M V30 6 1 2 3 \n" + "M V30 7 1 4 9 \n" + "M V30 8 2 9 10 \n" + "M V30 9 1 10 8 \n" + "M V30 10 2 8 7 \n" + "M V30 11 1 7 2 \n" + "M V30 12 1 10 13 \n" + "M V30 13 1 13 11 \n" + "M V30 14 2 11 12 \n" + "M V30 15 1 12 8 \n" + "M V30 END BOND \n" + "M V30 END CTAB \n" + "M END \n"; + + inchi_ios_init(&input_stream, INCHI_IOS_TYPE_STRING, nullptr); + inchi_ios_print_nodisplay(&input_stream, molblock); + + ORIG_ATOM_DATA *orig_inp_data = (ORIG_ATOM_DATA*)inchi_calloc(1, sizeof(ORIG_ATOM_DATA)); + int bMergeAllInputStructures = 0; + int bGetOrigCoord = 0; + int bDoNotAddH = 0; + int treat_polymers = 0; + int treat_NPZz = 0; + const char *pSdfLabel = nullptr; + char *pSdfValue = nullptr; + unsigned long *lSdfId = nullptr; + long *lMolfileNumber = nullptr; + INCHI_MODE pInpAtomFlags = 0; + int err = 0; + char *pStrErr = nullptr; + int bNoWarnings = 0; + + int ret = CreateOrigInpDataFromMolfile( + &input_stream, + orig_inp_data, + bMergeAllInputStructures, + bGetOrigCoord, + bDoNotAddH, + treat_polymers, + treat_NPZz, + pSdfLabel, + pSdfValue, + lSdfId, + lMolfileNumber, + &pInpAtomFlags, + &err, + pStrErr, + bNoWarnings); + + + RingSystems *rs = find_rings(orig_inp_data->at, orig_inp_data->num_inp_atoms); + + // print_ring_result(rs); + + EXPECT_NE(rs, nullptr); + EXPECT_EQ(rs->count, 6); + + EXPECT_EQ(rs->rings[0].size, 6); + EXPECT_EQ(rs->rings[1].size, 10); + EXPECT_EQ(rs->rings[2].size, 13); + EXPECT_EQ(rs->rings[3].size, 6); + EXPECT_EQ(rs->rings[4].size, 9); + EXPECT_EQ(rs->rings[5].size, 5); + + FreeOrigAtData(orig_inp_data); + inchi_free(orig_inp_data); + + free_ring_system(rs); + + inchi_ios_free_str(&input_stream); +} + +TEST(test_ring_detection, find_rings__molblock_ring_4_two_connected_rings) { + + INCHI_IOSTREAM input_stream; + + const char *molblock = + "2 connected rings \n" + " Ketcher 3302612292D 1 1.00000 0.00000 0 \n" + " \n" + " 11 12 0 0 0 0 0 0 0 0999 V2000 \n" + " 7.7000 -4.5965 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 9.2000 -5.4625 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 8.7000 -4.5965 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 8.7000 -6.3285 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 7.2000 -5.4625 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 7.7000 -6.3285 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 10.7000 -4.5965 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 9.7000 -4.5965 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 11.2000 -5.4625 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 9.7000 -6.3285 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 10.7000 -6.3285 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 \n" + " 3 1 2 0 0 0 \n" + " 1 5 1 0 0 0 \n" + " 5 6 2 0 0 0 \n" + " 6 4 1 0 0 0 \n" + " 4 2 2 0 0 0 \n" + " 2 3 1 0 0 0 \n" + " 8 2 2 0 0 0 \n" + " 2 10 1 0 0 0 \n" + " 10 11 2 0 0 0 \n" + " 11 9 1 0 0 0 \n" + " 9 7 2 0 0 0 \n" + " 7 8 1 0 0 0 \n" + "M END \n"; + + inchi_ios_init(&input_stream, INCHI_IOS_TYPE_STRING, nullptr); + inchi_ios_print_nodisplay(&input_stream, molblock); + + ORIG_ATOM_DATA *orig_inp_data = (ORIG_ATOM_DATA*)inchi_calloc(1, sizeof(ORIG_ATOM_DATA)); + int bMergeAllInputStructures = 0; + int bGetOrigCoord = 0; + int bDoNotAddH = 0; + int treat_polymers = 0; + int treat_NPZz = 0; + const char *pSdfLabel = nullptr; + char *pSdfValue = nullptr; + unsigned long *lSdfId = nullptr; + long *lMolfileNumber = nullptr; + INCHI_MODE pInpAtomFlags = 0; + int err = 0; + char *pStrErr = nullptr; + int bNoWarnings = 0; + + int ret = CreateOrigInpDataFromMolfile( + &input_stream, + orig_inp_data, + bMergeAllInputStructures, + bGetOrigCoord, + bDoNotAddH, + treat_polymers, + treat_NPZz, + pSdfLabel, + pSdfValue, + lSdfId, + lMolfileNumber, + &pInpAtomFlags, + &err, + pStrErr, + bNoWarnings); + + + RingSystems *rs = find_rings(orig_inp_data->at, orig_inp_data->num_inp_atoms); + + // print_ring_result(rs); + + EXPECT_NE(rs, nullptr); + EXPECT_EQ(rs->count, 2); + + EXPECT_EQ(rs->rings[0].size, 6); + EXPECT_EQ(rs->rings[1].size, 6); + + FreeOrigAtData(orig_inp_data); + inchi_free(orig_inp_data); + + free_ring_system(rs); + + inchi_ios_free_str(&input_stream); +} + +TEST(test_ring_detection, are_atoms_in_same_small_ring__one_ring) { + + int num_at = 7; + + inp_ATOM *atoms = CreateInpAtom(num_at); + + // Atom 0 connected to 1 and 5 + atoms[0].neighbor[0] = 5; + atoms[0].neighbor[1] = 1; + atoms[0].valence = 2; + + // Atom 1 connected to 0 and 2 + atoms[1].neighbor[0] = 0; + atoms[1].neighbor[1] = 2; + atoms[1].valence = 2; + + // Atom 2 connected to 1 and 3 + atoms[2].neighbor[0] = 1; + atoms[2].neighbor[1] = 3; + atoms[2].valence = 2; + + // Atom 3 connected to 2 and 4 + atoms[3].neighbor[0] = 2; + atoms[3].neighbor[1] = 4; + atoms[3].valence = 2; + + // Atom 4 connected to 3 and 5 + atoms[4].neighbor[0] = 3; + atoms[4].neighbor[1] = 5; + atoms[4].valence = 2; + + // Atom 5 connected to 4 and 0 + atoms[5].neighbor[0] = 4; + atoms[5].neighbor[1] = 0; + atoms[5].neighbor[2] = 6; + atoms[5].valence = 3; + + // Atom 6 connected to 5 + atoms[6].neighbor[0] = 5; + atoms[6].valence = 1; + + RingSystems* rs = find_rings(atoms, num_at); + + EXPECT_NE(rs, nullptr); + EXPECT_EQ(rs->count, 1); + + const Ring& ring = rs->rings[0]; + EXPECT_EQ(ring.size, 6); + + // print_ring_result(rs); + + EXPECT_EQ(are_atoms_in_same_small_ring(atoms, num_at, rs, 0, 1,10), 1); + EXPECT_EQ(are_atoms_in_same_small_ring(atoms, num_at, rs, 0, 1, 2), 0); + EXPECT_EQ(are_atoms_in_same_small_ring(atoms, num_at, rs, 6, 1, 10), 0); + EXPECT_EQ(are_atoms_in_same_small_ring(atoms, num_at, rs, 6, 1, 10), 0); + EXPECT_EQ(are_atoms_in_same_small_ring(atoms, num_at, rs, 6, 1, 10), 0); + + EXPECT_EQ(are_atoms_in_same_small_ring(nullptr, num_at, rs, 6, 1, 10), 0); + EXPECT_EQ(are_atoms_in_same_small_ring(atoms, num_at, nullptr, 6, 1, 10), 0); + EXPECT_EQ(are_atoms_in_same_small_ring(atoms, -15, rs, 6, 1, 10), 0); + EXPECT_EQ(are_atoms_in_same_small_ring(atoms, 100, rs, 6, 1, 10), 0); + + EXPECT_EQ(are_atoms_in_same_small_ring(atoms, num_at, rs, -2, 1, 10), 0); + EXPECT_EQ(are_atoms_in_same_small_ring(atoms, num_at, rs, 6, 12312, 10), 0); + EXPECT_EQ(are_atoms_in_same_small_ring(atoms, num_at, rs, 6, 1, -1), 0); + EXPECT_EQ(are_atoms_in_same_small_ring(atoms, num_at, rs, 6, 1, 100), 0); + + free_ring_system(rs); + + FreeInpAtom(&atoms); +} + +TEST(test_ring_detection, is_fused_ring_pivot__1_two_fused_rings) { + + INCHI_IOSTREAM input_stream; + + const char *molblock = + "test mol fused benzene \n" + " -INDIGO-03302612192D \n" + " \n" + " 0 0 0 0 0 0 0 0 0 0 0 V3000 \n" + "M V30 BEGIN CTAB \n" + "M V30 COUNTS 10 11 0 0 0 \n" + "M V30 BEGIN ATOM \n" + "M V30 1 C 4.83485 -5.40007 0.0 0 \n" + "M V30 2 C 6.56515 -5.39959 0.0 0 \n" + "M V30 3 C 5.70164 -4.89997 0.0 0 \n" + "M V30 4 C 6.56515 -6.40053 0.0 0 \n" + "M V30 5 C 4.83485 -6.40502 0.0 0 \n" + "M V30 6 C 5.70382 -6.90003 0.0 0 \n" + "M V30 7 C 7.42965 -4.90121 0.0 0 \n" + "M V30 8 C 8.29683 -5.40155 0.0 0 \n" + "M V30 9 C 7.4358 -6.90287 0.0 0 \n" + "M V30 10 C 8.29903 -6.39746 0.0 0 \n" + "M V30 END ATOM \n" + "M V30 BEGIN BOND \n" + "M V30 1 2 3 1 \n" + "M V30 2 1 1 5 \n" + "M V30 3 2 5 6 \n" + "M V30 4 1 6 4 \n" + "M V30 5 2 4 2 \n" + "M V30 6 1 2 3 \n" + "M V30 7 1 4 9 \n" + "M V30 8 2 9 10 \n" + "M V30 9 1 10 8 \n" + "M V30 10 2 8 7 \n" + "M V30 11 1 7 2 \n" + "M V30 END BOND \n" + "M V30 END CTAB \n" + "M END \n"; + + + inchi_ios_init(&input_stream, INCHI_IOS_TYPE_STRING, nullptr); + inchi_ios_print_nodisplay(&input_stream, molblock); + + ORIG_ATOM_DATA *orig_inp_data = (ORIG_ATOM_DATA*)inchi_calloc(1, sizeof(ORIG_ATOM_DATA)); + int bMergeAllInputStructures = 0; + int bGetOrigCoord = 0; + int bDoNotAddH = 0; + int treat_polymers = 0; + int treat_NPZz = 0; + const char *pSdfLabel = nullptr; + char *pSdfValue = nullptr; + unsigned long *lSdfId = nullptr; + long *lMolfileNumber = nullptr; + INCHI_MODE pInpAtomFlags = 0; + int err = 0; + char *pStrErr = nullptr; + int bNoWarnings = 0; + + int ret = CreateOrigInpDataFromMolfile( + &input_stream, + orig_inp_data, + bMergeAllInputStructures, + bGetOrigCoord, + bDoNotAddH, + treat_polymers, + treat_NPZz, + pSdfLabel, + pSdfValue, + lSdfId, + lMolfileNumber, + &pInpAtomFlags, + &err, + pStrErr, + bNoWarnings); + + + RingSystems *rs = find_rings(orig_inp_data->at, orig_inp_data->num_inp_atoms); + + print_ring_result(rs); + + EXPECT_NE(rs, nullptr); + EXPECT_EQ(rs->count, 3); + + EXPECT_EQ(rs->rings[0].size, 6); + EXPECT_EQ(rs->rings[1].size, 10); + EXPECT_EQ(rs->rings[2].size, 6); + + EXPECT_EQ(is_fused_ring_pivot(nullptr, orig_inp_data->at, 0, 1), 0); + + EXPECT_EQ(is_fused_ring_pivot(rs, nullptr, 0, 1), 0); + + EXPECT_EQ(is_fused_ring_pivot(rs, orig_inp_data->at, -1, 1), 0); + + EXPECT_EQ(is_fused_ring_pivot(rs, orig_inp_data->at, 0, 123423), 0); + + EXPECT_EQ(is_fused_ring_pivot(rs, orig_inp_data->at, 0, 1), 0); + + EXPECT_EQ(is_fused_ring_pivot(rs, orig_inp_data->at, 5, 6), 0); + + EXPECT_EQ(is_fused_ring_pivot(rs, orig_inp_data->at, 1, 3), 1); + + FreeOrigAtData(orig_inp_data); + inchi_free(orig_inp_data); + + free_ring_system(rs); + + inchi_ios_free_str(&input_stream); +} diff --git a/INCHI-1-TEST/tests/test_unit/test_strutil_enhancedStereo.cpp b/INCHI-1-TEST/tests/test_unit/test_strutil_enhancedStereo.cpp index b4b3bb0c..a3b97d9b 100644 --- a/INCHI-1-TEST/tests/test_unit/test_strutil_enhancedStereo.cpp +++ b/INCHI-1-TEST/tests/test_unit/test_strutil_enhancedStereo.cpp @@ -109,8 +109,7 @@ TEST(test_strutil_enhancedStereo, test_set_EnhancedStereo_t_m_layers_1) int found_num_bonds = 0; int found_num_isotopic = 0; - inp_ATOM *at = CreateInpAtom(num_at); - INChI *inchi = Alloc_INChI(at, num_at, &found_num_bonds, &found_num_isotopic, 0); + INChI *inchi = Alloc_INChI(orig_inp_data->at, num_at, &found_num_bonds, &found_num_isotopic, 0); AT_NUMB at_tmp[] = {0,1,2,3,4,5,6,7,8}; S_CHAR parity_tmp[] = {2,1,1,2,2,1,2,2,1}; @@ -151,7 +150,6 @@ TEST(test_strutil_enhancedStereo, test_set_EnhancedStereo_t_m_layers_1) inchi_free(orig_inp_data); Free_INChI_Aux(&pAux); Free_INChI(&inchi); - FreeInpAtom(&at); inchi_ios_free_str(&input_stream); From e20eb9c264c40a96304bec0382f74d0789bf13fe Mon Sep 17 00:00:00 2001 From: Christoph Mueller Date: Thu, 2 Apr 2026 14:09:28 +0000 Subject: [PATCH 17/18] added units for atropisomer code and enantiomer ident --- INCHI-1-SRC/INCHI_BASE/src/atropisomers.c | 3 -- INCHI-1-SRC/INCHI_BASE/src/ichimake.c | 1 - INCHI-1-SRC/INCHI_BASE/src/inpdef.h | 2 - INCHI-1-SRC/INCHI_BASE/src/strutil.c | 16 ++++++-- .../tests/test_unit/test_atropisomers.cpp | 41 +++++++++++++++++-- 5 files changed, 50 insertions(+), 13 deletions(-) diff --git a/INCHI-1-SRC/INCHI_BASE/src/atropisomers.c b/INCHI-1-SRC/INCHI_BASE/src/atropisomers.c index 29bff988..6c6d3d5f 100644 --- a/INCHI-1-SRC/INCHI_BASE/src/atropisomers.c +++ b/INCHI-1-SRC/INCHI_BASE/src/atropisomers.c @@ -165,9 +165,6 @@ int find_atropisomeric_atoms_and_bonds(inp_ATOM* out_at, printf(">>> FOUND atropisomer (higher score): atom id %2d atom id %2d is planar %d --> score %2d (%d)\n", atom_id1, atom_id2, is_planar, score, both_atoms_in_same_small_ring); orig_inp_data->is_atropisomer = 1; - //TODO this rule is not enough for setting the flag - orig_inp_data->is_enantiomeric_atropisomer = ((nof_wedge_bonds_i > 0) && (nof_wedge_bonds_j > 0)); - out_at[atom_id1].bAtropisomeric = 1; out_at[atom_id2].bAtropisomeric = 1; } diff --git a/INCHI-1-SRC/INCHI_BASE/src/ichimake.c b/INCHI-1-SRC/INCHI_BASE/src/ichimake.c index 3327590c..a5996fdc 100644 --- a/INCHI-1-SRC/INCHI_BASE/src/ichimake.c +++ b/INCHI-1-SRC/INCHI_BASE/src/ichimake.c @@ -3906,7 +3906,6 @@ int Create_INChI(CANON_GLOBALS* pCG, MarkRingSystemsInp(out_at, num_atoms, 0); orig_inp_data->is_atropisomer = 0; - orig_inp_data->is_enantiomeric_atropisomer = 0; if (ip->Atropisomers) { RingSystems *ring_result = find_rings(out_at, num_atoms); diff --git a/INCHI-1-SRC/INCHI_BASE/src/inpdef.h b/INCHI-1-SRC/INCHI_BASE/src/inpdef.h index b0a78af8..32e2e5f1 100644 --- a/INCHI-1-SRC/INCHI_BASE/src/inpdef.h +++ b/INCHI-1-SRC/INCHI_BASE/src/inpdef.h @@ -465,8 +465,6 @@ typedef struct tagOrigAtom int is_atropisomer; /* flag indicating whether the structure is an atropisomer; it is set to 1 if the structure has been identified as an atropisomer during input processing, and 0 otherwise */ - int is_enantiomeric_atropisomer; - } ORIG_ATOM_DATA; /** diff --git a/INCHI-1-SRC/INCHI_BASE/src/strutil.c b/INCHI-1-SRC/INCHI_BASE/src/strutil.c index d4f01735..ba39d2ab 100644 --- a/INCHI-1-SRC/INCHI_BASE/src/strutil.c +++ b/INCHI-1-SRC/INCHI_BASE/src/strutil.c @@ -7192,12 +7192,22 @@ int set_Atropisomer_t_m_layers( const ORIG_ATOM_DATA *orig_inp_data, } if (ret == 1) { - if (orig_inp_data->is_enantiomeric_atropisomer == 1) { - inchi->Stereo->nCompInv2Abs = 1; //m1 + if (aux->nOrigAtNosInCanonOrd && + aux->nOrigAtNosInCanonOrdInv && + aux->nNumberOfAtoms > 0) + { + int orderings_differ = memcmp(aux->nOrigAtNosInCanonOrd, + aux->nOrigAtNosInCanonOrdInv, + sizeof(aux->nOrigAtNosInCanonOrd[0]) * + aux->nNumberOfAtoms); + if (orderings_differ != 0) { + inchi->Stereo->nCompInv2Abs = -1; /* m1: enantiomeric */ + } else { + inchi->Stereo->nCompInv2Abs = 1; /* m0: achiral or diastereomeric */ + } } else { inchi->Stereo->nCompInv2Abs = -1; } - } } diff --git a/INCHI-1-TEST/tests/test_unit/test_atropisomers.cpp b/INCHI-1-TEST/tests/test_unit/test_atropisomers.cpp index bed064c1..795d811a 100644 --- a/INCHI-1-TEST/tests/test_unit/test_atropisomers.cpp +++ b/INCHI-1-TEST/tests/test_unit/test_atropisomers.cpp @@ -10,11 +10,44 @@ extern "C" TEST(test_atropisomers, find_atropisomeric_atoms_and_bonds__null_parameters) { - find_atropisomeric_atoms_and_bonds(nullptr, - 0, - nullptr, - nullptr); + int ret = find_atropisomeric_atoms_and_bonds(nullptr, + 0, + nullptr, + nullptr); + + EXPECT_EQ(ret, 0); + +} + +TEST(test_atropisomers, find_atropisomeric_atoms_and_bonds__atoms_below_min_valence) { + + const int num_atoms = 2; + inp_ATOM atoms[2] = {}; + + atoms[0].valence = 1; + atoms[0].neighbor[0] = 1; + atoms[0].bond_type[0] = 1; + atoms[0].x = 0.0; atoms[0].y = 0.0; atoms[0].z = 0.0; + + atoms[1].valence = 1; + atoms[1].neighbor[0] = 0; + atoms[1].bond_type[0] = 1; + atoms[1].x = 1.5; atoms[1].y = 0.0; atoms[1].z = 0.0; + + RingSystems *ring_result = find_rings(atoms, num_atoms); + ASSERT_NE(ring_result, nullptr); + + ORIG_ATOM_DATA orig_data = {}; + + int ret = find_atropisomeric_atoms_and_bonds(atoms, num_atoms, ring_result, &orig_data); + + EXPECT_EQ(ret, 0); + EXPECT_EQ(atoms[0].bAtropisomeric, 0); + EXPECT_EQ(atoms[1].bAtropisomeric, 0); + EXPECT_EQ(orig_data.is_atropisomer, 0); + + free_ring_system(ring_result); } TEST(test_atropisomers, test_dummy_1_atropisomer) From d15547c3e192b74db930ef785e7956090ca8e3c8 Mon Sep 17 00:00:00 2001 From: Christoph Mueller Date: Thu, 9 Apr 2026 14:19:16 +0000 Subject: [PATCH 18/18] added new test code for enantiomers --- INCHI-1-SRC/INCHI_BASE/src/atropisomers.c | 2 +- INCHI-1-SRC/INCHI_BASE/src/ichimake.c | 4 +- INCHI-1-SRC/INCHI_BASE/src/inpdef.h | 2 +- INCHI-1-SRC/INCHI_BASE/src/strutil.c | 80 ++++++++++++++----- .../tests/test_unit/test_atropisomers.cpp | 2 +- 5 files changed, 65 insertions(+), 25 deletions(-) diff --git a/INCHI-1-SRC/INCHI_BASE/src/atropisomers.c b/INCHI-1-SRC/INCHI_BASE/src/atropisomers.c index 6c6d3d5f..94201456 100644 --- a/INCHI-1-SRC/INCHI_BASE/src/atropisomers.c +++ b/INCHI-1-SRC/INCHI_BASE/src/atropisomers.c @@ -163,7 +163,7 @@ int find_atropisomeric_atoms_and_bonds(inp_ATOM* out_at, if (is_atropisomer == 1) { printf(">>> FOUND atropisomer (higher score): atom id %2d atom id %2d is planar %d --> score %2d (%d)\n", atom_id1, atom_id2, is_planar, score, both_atoms_in_same_small_ring); - orig_inp_data->is_atropisomer = 1; + orig_inp_data->bAtropisomer = 1; out_at[atom_id1].bAtropisomeric = 1; out_at[atom_id2].bAtropisomeric = 1; diff --git a/INCHI-1-SRC/INCHI_BASE/src/ichimake.c b/INCHI-1-SRC/INCHI_BASE/src/ichimake.c index a5996fdc..8714e170 100644 --- a/INCHI-1-SRC/INCHI_BASE/src/ichimake.c +++ b/INCHI-1-SRC/INCHI_BASE/src/ichimake.c @@ -3905,7 +3905,7 @@ int Create_INChI(CANON_GLOBALS* pCG, #if ( FIND_RING_SYSTEMS == 1 ) MarkRingSystemsInp(out_at, num_atoms, 0); - orig_inp_data->is_atropisomer = 0; + orig_inp_data->bAtropisomer = 0; if (ip->Atropisomers) { RingSystems *ring_result = find_rings(out_at, num_atoms); @@ -3914,7 +3914,7 @@ int Create_INChI(CANON_GLOBALS* pCG, int ret_ai = find_atropisomeric_atoms_and_bonds(out_at, num_atoms, ring_result, orig_inp_data); //map values to orig_inp_data - if (orig_inp_data->is_atropisomer) { + if (orig_inp_data->bAtropisomer) { for (i = 0; i < num_atoms; i++) { orig_inp_data->at[i].bAtropisomeric = out_at[i].bAtropisomeric; } diff --git a/INCHI-1-SRC/INCHI_BASE/src/inpdef.h b/INCHI-1-SRC/INCHI_BASE/src/inpdef.h index 32e2e5f1..310aa258 100644 --- a/INCHI-1-SRC/INCHI_BASE/src/inpdef.h +++ b/INCHI-1-SRC/INCHI_BASE/src/inpdef.h @@ -463,7 +463,7 @@ typedef struct tagOrigAtom int valid_polymer; int n_zy; /* number of non-polymeric pseudoatoms (Zy) */ - int is_atropisomer; /* flag indicating whether the structure is an atropisomer; it is set to 1 if the structure has been identified as an atropisomer during input processing, and 0 otherwise */ + int bAtropisomer; /* flag indicating whether the structure is an atropisomer; it is set to 1 if the structure has been identified as an atropisomer during input processing, and 0 otherwise */ } ORIG_ATOM_DATA; diff --git a/INCHI-1-SRC/INCHI_BASE/src/strutil.c b/INCHI-1-SRC/INCHI_BASE/src/strutil.c index ba39d2ab..6a31ce04 100644 --- a/INCHI-1-SRC/INCHI_BASE/src/strutil.c +++ b/INCHI-1-SRC/INCHI_BASE/src/strutil.c @@ -7148,7 +7148,7 @@ int set_Atropisomer_t_m_layers( const ORIG_ATOM_DATA *orig_inp_data, // -> diastereomeric atropisomers: m0 (inchi->Stereo->nCompInv2Abs = 1; //m0) ??? // -> rules? - if (orig_inp_data->is_atropisomer) { + if (orig_inp_data->bAtropisomer) { // printf(">>>>> TODO set t- and m-layers for atropisomers\n"); for (int i = 0; i < orig_inp_data->num_inp_atoms; i++) { @@ -7163,12 +7163,16 @@ int set_Atropisomer_t_m_layers( const ORIG_ATOM_DATA *orig_inp_data, if (parity_idx == -1) { parity_idx = inchi->Stereo->nNumberOfStereoCenters; inchi->Stereo->nNumberOfStereoCenters++; - } - inchi->Stereo->nNumber[parity_idx] = canon_atom_num; - inchi->Stereo->t_parity[parity_idx] = 1; + inchi->Stereo->nNumber[parity_idx] = canon_atom_num; + + inchi->Stereo->t_parity[parity_idx] = 1; //AB_PARITY_ODD; + + + ret = 1; + + } - ret = 1; } } @@ -7188,27 +7192,63 @@ int set_Atropisomer_t_m_layers( const ORIG_ATOM_DATA *orig_inp_data, int tmp_parity = inchi->Stereo->t_parity[i]; inchi->Stereo->t_parity[i] = inchi->Stereo->t_parity[min_idx]; inchi->Stereo->t_parity[min_idx] = tmp_parity; + } } - if (ret == 1) { - if (aux->nOrigAtNosInCanonOrd && - aux->nOrigAtNosInCanonOrdInv && - aux->nNumberOfAtoms > 0) - { - int orderings_differ = memcmp(aux->nOrigAtNosInCanonOrd, - aux->nOrigAtNosInCanonOrdInv, - sizeof(aux->nOrigAtNosInCanonOrd[0]) * - aux->nNumberOfAtoms); - if (orderings_differ != 0) { - inchi->Stereo->nCompInv2Abs = -1; /* m1: enantiomeric */ - } else { - inchi->Stereo->nCompInv2Abs = 1; /* m0: achiral or diastereomeric */ + /* Mixed classical + atropisomeric: inverting only the axis gives a diastereomer */ + int has_classical = 0; + for (int i = 0; i < inchi->Stereo->nNumberOfStereoCenters; i++) { + AT_NUMB canon = inchi->Stereo->nNumber[i]; + if (canon < 1 || canon > (AT_NUMB)aux->nNumberOfAtoms) continue; + /* nOrigAtNosInCanonOrd[canon-1] is 1-based original atom number */ + int orig_0based = (int)aux->nOrigAtNosInCanonOrd[canon - 1] - 1; + if (orig_0based < 0 || orig_0based >= orig_inp_data->num_inp_atoms) continue; + if (!orig_inp_data->at[orig_0based].bAtropisomeric) { + has_classical = 1; + break; + } + } + if (has_classical) { + inchi->Stereo->nCompInv2Abs = 1; /* m0: diastereomeric */ + return ret; + } + + /* Primary m-layer determination: compare canonical orderings + * at atropisomeric positions in the normal vs. inverted structure */ + if (aux->nOrigAtNosInCanonOrdInv) { + int atrop_orderings_differ = 0; + for (int i = 0; i < orig_inp_data->num_inp_atoms; i++) { + if (!orig_inp_data->at[i].bAtropisomeric) continue; + int cn = get_canonical_atom_number(aux, i + 1); + if (cn <= 0 || cn > aux->nNumberOfAtoms) continue; + if (aux->nOrigAtNosInCanonOrd[cn - 1] != + aux->nOrigAtNosInCanonOrdInv[cn - 1]) { + atrop_orderings_differ = 1; + break; } - } else { - inchi->Stereo->nCompInv2Abs = -1; } + inchi->Stereo->nCompInv2Abs = atrop_orderings_differ ? -1 : 1; + return ret; } + + /* Fallback: count atropisomeric axes with a defined parity. + * Odd count => net chirality => enantiomeric (m1). */ + int n_atrop_defined = 0; + for (int i = 0; i < inchi->Stereo->nNumberOfStereoCenters; i++) { + AT_NUMB canon = inchi->Stereo->nNumber[i]; + if (canon < 1 || canon > (AT_NUMB)aux->nNumberOfAtoms) continue; + int orig_0based = (int)aux->nOrigAtNosInCanonOrd[canon - 1] - 1; + if (orig_0based < 0 || orig_0based >= orig_inp_data->num_inp_atoms) continue; + if (!orig_inp_data->at[orig_0based].bAtropisomeric) continue; + if (inchi->Stereo->t_parity[i] == AB_PARITY_ODD || + inchi->Stereo->t_parity[i] == AB_PARITY_EVEN) { + n_atrop_defined++; + } + } + /* Two atoms per axis, so divide by 2 */ + inchi->Stereo->nCompInv2Abs = ((n_atrop_defined / 2) % 2 == 1) ? -1 : 1; + } diff --git a/INCHI-1-TEST/tests/test_unit/test_atropisomers.cpp b/INCHI-1-TEST/tests/test_unit/test_atropisomers.cpp index 795d811a..9fcd1d5c 100644 --- a/INCHI-1-TEST/tests/test_unit/test_atropisomers.cpp +++ b/INCHI-1-TEST/tests/test_unit/test_atropisomers.cpp @@ -45,7 +45,7 @@ TEST(test_atropisomers, find_atropisomeric_atoms_and_bonds__atoms_below_min_vale EXPECT_EQ(ret, 0); EXPECT_EQ(atoms[0].bAtropisomeric, 0); EXPECT_EQ(atoms[1].bAtropisomeric, 0); - EXPECT_EQ(orig_data.is_atropisomer, 0); + EXPECT_EQ(orig_data.bAtropisomer, 0); free_ring_system(ring_result); }