diff --git a/.travis.yml b/.travis.yml index 5504dff68..4bb240323 100644 --- a/.travis.yml +++ b/.travis.yml @@ -27,18 +27,13 @@ install: - sudo apt-get install -qq build-essential # and the base dependencies + - sudo apt-get install -qq openjdk-7-jdk swig # for the java wrappers + - sudo apt-get install libjpeg62 # for pillow - conda install -q numpy pillow # install the conda boost packages from the RDKit binstar channel. - # the python 2.7 build includes the java wrappers, this requires downgrading - # boost to avoid a SWIG error. - - if [[ "$TRAVIS_PYTHON_VERSION" == "2.7" ]]; then - sudo apt-get install -qq openjdk-7-jdk swig; - conda install -q -c rdkit boost=1.46.1; - else - conda install -q -c rdkit boost; - fi + - conda install -q -c rdkit boost before_script: @@ -48,11 +43,9 @@ before_script: - export PYTHONPATH=${RDBASE} - export LD_LIBRARY_PATH=${RDBASE}/lib - - if [[ "$TRAVIS_PYTHON_VERSION" == "2.7" ]]; then - mkdir $RDBASE/External/java_lib; - wget http://search.maven.org/remotecontent?filepath=junit/junit/4.10/junit-4.10.jar -O $RDBASE/External/java_lib/junit.jar; - ls -l $RDBASE/External/java_lib; - fi + - mkdir $RDBASE/External/java_lib + - wget http://search.maven.org/remotecontent?filepath=junit/junit/4.10/junit-4.10.jar -O $RDBASE/External/java_lib/junit.jar + - ls -l $RDBASE/External/java_lib - export PYTHON=`which python` - echo $PYTHON @@ -62,14 +55,10 @@ before_script: - echo $PY_SP_DIR - - if [[ "$TRAVIS_PYTHON_VERSION" == "2.7" ]]; then - export SWIG_WRAPPERS_OPTS="-D RDK_BUILD_SWIG_WRAPPERS=ON"; - fi - script: - mkdir build - cd build - - cmake -D Python_ADDITIONAL_VERSIONS=$TRAVIS_PYTHON_VERSION -D PYTHON_EXECUTABLE=$PYTHON -D PYTHON_LIBRARY=`find $PY_PREFIX -name "libpython$TRAVIS_PYTHON_VERSION*.so"` -D PYTHON_NUMPY_INCLUDE_PATH=$PY_SP_DIR/numpy/core/include -D BOOST_ROOT=$PY_PREFIX -D Boost_NO_SYSTEM_PATHS=ON $SWIG_WRAPPERS_OPTS .. + - cmake -D Python_ADDITIONAL_VERSIONS=$TRAVIS_PYTHON_VERSION -D PYTHON_EXECUTABLE=$PYTHON -D PYTHON_LIBRARY=`find $PY_PREFIX -name "libpython$TRAVIS_PYTHON_VERSION*.so"` -D PYTHON_NUMPY_INCLUDE_PATH=$PY_SP_DIR/numpy/core/include -D BOOST_ROOT=$PY_PREFIX -D Boost_NO_SYSTEM_PATHS=ON -D RDK_BUILD_SWIG_WRAPPERS=ON .. - cat CMakeCache.txt # useful for debugging/troubleshooting - make -j2 diff --git a/Code/DataStructs/ExplicitBitVect.cpp b/Code/DataStructs/ExplicitBitVect.cpp index ea72e42a7..84690cc84 100644 --- a/Code/DataStructs/ExplicitBitVect.cpp +++ b/Code/DataStructs/ExplicitBitVect.cpp @@ -1,6 +1,7 @@ // $Id$ // // Copyright (c) 2001-2008 greg Landrum and Rational Discovery LLC +// Copyright (c) 2014, Novartis Institutes for BioMedical Research Inc. // // @@ All Rights Reserved @@ // This file is part of the RDKit. @@ -111,6 +112,24 @@ ExplicitBitVect::ExplicitBitVect(const char *data,const unsigned int dataLen) return(ans); }; + ExplicitBitVect& ExplicitBitVect::operator^= (const ExplicitBitVect &other) { + *(dp_bits) ^= *(other.dp_bits); + d_numOnBits=dp_bits->count(); + return *this; + }; + + ExplicitBitVect& ExplicitBitVect::operator&= (const ExplicitBitVect &other) { + *(dp_bits) &= *(other.dp_bits); + d_numOnBits=dp_bits->count(); + return *this; + }; + + ExplicitBitVect& ExplicitBitVect::operator|= (const ExplicitBitVect &other) { + *(dp_bits) |= *(other.dp_bits); + d_numOnBits=dp_bits->count(); + return *this; + }; + ExplicitBitVect ExplicitBitVect::operator~ () const { ExplicitBitVect ans(d_size); *(ans.dp_bits) = ~(*dp_bits); @@ -118,6 +137,24 @@ ExplicitBitVect::ExplicitBitVect(const char *data,const unsigned int dataLen) return(ans); }; + ExplicitBitVect& ExplicitBitVect::operator+= (const ExplicitBitVect &other) { + dp_bits->resize(d_size+other.d_size); + unsigned int original_size = d_size; + d_size = dp_bits->size(); + for(unsigned i=0;icount(); + return *this; + }; + + ExplicitBitVect ExplicitBitVect::operator+ (const ExplicitBitVect &other) const { + ExplicitBitVect ans(*this); + return ans+=other; + }; + unsigned int ExplicitBitVect::getNumBits() const { return d_size; }; diff --git a/Code/DataStructs/ExplicitBitVect.h b/Code/DataStructs/ExplicitBitVect.h index 7a021d04d..957572c0e 100644 --- a/Code/DataStructs/ExplicitBitVect.h +++ b/Code/DataStructs/ExplicitBitVect.h @@ -1,5 +1,6 @@ // -// Copyright (c) 2003-2008 greg Landrum and Rational Discovery LLC +// Copyright (c) 2003-208 greg Landrum and Rational Discovery LLC +// Copyright (c) 2014, Novartis Institutes for BioMedical Research Inc. // // @@ All Rights Reserved @@ // This file is part of the RDKit. @@ -47,13 +48,21 @@ public: ExplicitBitVect operator& (const ExplicitBitVect &other) const; ExplicitBitVect operator| (const ExplicitBitVect &other) const; ExplicitBitVect operator~ () const; + /* concatenate two ExplicitBitVects */ + ExplicitBitVect operator+ (const ExplicitBitVect &other) const; + + ExplicitBitVect& operator^= (const ExplicitBitVect &other); + ExplicitBitVect& operator&= (const ExplicitBitVect &other); + ExplicitBitVect& operator|= (const ExplicitBitVect &other); + /* concatenate two ExplicitBitVects */ + ExplicitBitVect& operator+= (const ExplicitBitVect &other); + unsigned int getNumBits() const; unsigned int getNumOnBits() const; unsigned int getNumOffBits() const; void getOnBits (IntVect& v) const; - // FIX: complete these void clearBits() { dp_bits->reset(); }; std::string toString() const; diff --git a/Code/DataStructs/Wrap/wrap_ExplicitBV.cpp b/Code/DataStructs/Wrap/wrap_ExplicitBV.cpp index ad4dcadb7..78e68e4f3 100644 --- a/Code/DataStructs/Wrap/wrap_ExplicitBV.cpp +++ b/Code/DataStructs/Wrap/wrap_ExplicitBV.cpp @@ -88,9 +88,11 @@ struct EBV_wrapper { .def(python::self & python::self) .def(python::self | python::self) .def(python::self ^ python::self) + .def(python::self + python::self) .def(~python::self) .def(python::self == python::self) .def(python::self != python::self) + .def(python::self += python::self) .def_pickle(ebv_pickle_suite()) ; diff --git a/Code/DataStructs/testDatastructs.cpp b/Code/DataStructs/testDatastructs.cpp index 5a6a667ff..661de7a50 100644 --- a/Code/DataStructs/testDatastructs.cpp +++ b/Code/DataStructs/testDatastructs.cpp @@ -1,6 +1,6 @@ // $Id$ // -// Copyright (C) 2001-2010 Greg Landrum and Rational Discovery LLC +// Copyright (C) 2001-2014 Greg Landrum and Rational Discovery LLC // // @@ All Rights Reserved @@ // This file is part of the RDKit. @@ -1296,6 +1296,17 @@ void test13BitVectAllOnes() { } } +void test18BitVectConcatenation() { + { + ExplicitBitVect bv(32, false); + ExplicitBitVect bv2(32, true); + ExplicitBitVect bv3 = bv + bv2; + TEST_ASSERT(bv3.getNumBits() == 64); + TEST_ASSERT(bv3.getNumOnBits() == 32); + TEST_ASSERT(bv3.getNumOffBits() == 32); + } +} + int main(){ RDLog::InitLogs(); try{ @@ -1363,6 +1374,9 @@ int main(){ BOOST_LOG(rdInfoLog) << " Test BitVect with all ones -------------------------------" << std::endl; test13BitVectAllOnes(); + BOOST_LOG(rdInfoLog) << " Test Explicit BitVects: Concatenation Operation -------------------------------" << std::endl; + test18BitVectConcatenation(); + return 0; } diff --git a/Code/ForceField/MMFF/Params.cpp b/Code/ForceField/MMFF/Params.cpp index 65d57b9b6..2487dfb0c 100644 --- a/Code/ForceField/MMFF/Params.cpp +++ b/Code/ForceField/MMFF/Params.cpp @@ -1931,6 +1931,95 @@ namespace ForceFields { "53 53 2.67 1.6 E94\n"; + class MMFFHerschbachLaurieCollection * MMFFHerschbachLaurieCollection::ds_instance = NULL; + + extern const std::string defaultMMFFHerschbachLaurie ; + + MMFFHerschbachLaurieCollection * MMFFHerschbachLaurieCollection::getMMFFHerschbachLaurie (const std::string &mmffHerschbachLaurie ) + { + if (!ds_instance) { + ds_instance = new MMFFHerschbachLaurieCollection(mmffHerschbachLaurie ); + } + else if (mmffHerschbachLaurie != "") { + delete ds_instance; + ds_instance = new MMFFHerschbachLaurieCollection(mmffHerschbachLaurie ); + } + return ds_instance; + } + + MMFFHerschbachLaurieCollection::MMFFHerschbachLaurieCollection(std::string mmffHerschbachLaurie ) + { + if (mmffHerschbachLaurie == "") { + mmffHerschbachLaurie = defaultMMFFHerschbachLaurie ; + } + std::istringstream inStream(mmffHerschbachLaurie ); + std::string inLine = RDKit::getLine(inStream); + while (!(inStream.eof())) { + if (inLine[0] != '*') { + MMFFHerschbachLaurie mmffHerschbachLaurieObj; + boost::char_separator tabSep("\t"); + tokenizer tokens(inLine, tabSep); + tokenizer::iterator token = tokens.begin(); + + #ifdef RDKIT_MMFF_PARAMS_USE_STD_MAP + unsigned int iRow = boost::lexical_cast(*token); + #else + d_iRow.push_back((boost::uint8_t)(boost::lexical_cast(*token))); + #endif + ++token; + #ifdef RDKIT_MMFF_PARAMS_USE_STD_MAP + unsigned int jRow = boost::lexical_cast(*token); + #else + d_jRow.push_back((boost::uint8_t)boost::lexical_cast(*token)); + #endif + ++token; + mmffHerschbachLaurieObj.a_ij = boost::lexical_cast(*token); + ++token; + mmffHerschbachLaurieObj.d_ij = boost::lexical_cast(*token); + ++token; + mmffHerschbachLaurieObj.dp_ij = boost::lexical_cast(*token); + ++token; + #ifdef RDKIT_MMFF_PARAMS_USE_STD_MAP + d_params[iRow][jRow] = mmffHerschbachLaurieObj; + #else + d_params.push_back(mmffHerschbachLaurieObj); + #endif + } + inLine = RDKit::getLine(inStream); + } + } + + const std::string defaultMMFFHerschbachLaurie = + "*Table I. Parameters for Badger's Rule.\n" + "*\n" + "* i j a_ij d_ij dp_ij\n" + "0 0 1.26 0.025 0.025\n" + "0 1 1.66 0.30 0.36\n" + "0 2 1.84 0.38 0.58\n" + "0 3 1.98 0.49 0.65\n" + "0 4 2.03 0.51 0.80\n" + "0 5 2.03 0.25 0.81\n" + "1 1 1.91 0.68 0.68\n" + "1 2 2.28 0.74 0.92\n" + "1 3 2.35 0.85 1.02\n" + "1 4 2.33 0.68 1.12\n" + "1 5 2.50 0.97 1.22\n" + "2 2 2.41 1.18 1.18\n" + "2 3 2.52 1.02 1.28\n" + "2 4 2.61 1.28 1.40\n" + "2 5 2.60 0.84 1.24\n" + "3 3 2.58 1.41 1.35\n" + "3 4 2.66 0.86 1.48\n" + "3 5 2.75 1.14 1.55\n" + "4 4 2.85 1.62 1.62\n" + "4 5 2.76 1.25 1.51\n" + "0 30 1.85 0.15 0.53\n" + "0 40 1.84 0.61 0.61\n" + "0 50 1.78 0.97 0.62\n" + "1 30 2.08 1.14 0.97\n" + "1 40 2.34 1.17 1.08\n"; + + class MMFFCovRadPauEleCollection * MMFFCovRadPauEleCollection::ds_instance = NULL; extern const std::string defaultMMFFCovRadPauEle; diff --git a/Code/ForceField/MMFF/Params.h b/Code/ForceField/MMFF/Params.h index d5956209c..a3865dd4c 100644 --- a/Code/ForceField/MMFF/Params.h +++ b/Code/ForceField/MMFF/Params.h @@ -91,6 +91,15 @@ namespace ForceFields { double r0; }; + //! class to store parameters for Herschbach-Laurie's version + //! of Badger's rule + class MMFFHerschbachLaurie { + public: + double a_ij; + double d_ij; + double dp_ij; + }; + //! class to store covalent radius and Pauling electronegativity //! values for MMFF bond stretching empirical rule class MMFFCovRadPauEle { @@ -559,6 +568,81 @@ namespace ForceFields { #endif }; + class MMFFHerschbachLaurieCollection { + public: + //! gets a pointer to the singleton MMFFHerschbachLaurieCollection + /*! + \param mmffHerschbachLaurie (optional) a string with parameter data. See + below for more information about this argument + + \return a pointer to the singleton MMFFHerschbachLaurieCollection + + Notes: + - do not delete the pointer returned here + - if the singleton MMFFHerschbachLaurieCollection has already been instantiated and + \c mmffHerschbachLaurie is empty, the singleton will be returned. + - if \c mmffHerschbachLaurie is empty and the singleton MMFFHerschbachLaurieCollection has + not yet been instantiated, the default parameters (from Params.cpp) + will be used. + - if \c mmffHerschbachLaurie is supplied, a new singleton will be instantiated. + The current instantiation (if there is one) will be deleted. + */ + static MMFFHerschbachLaurieCollection *getMMFFHerschbachLaurie(const std::string &mmffHerschbachLaurie = ""); + //! Looks up the parameters for a particular key and returns them. + /*! + \return a pointer to the MMFFHerschbachLaurie object, NULL on failure. + */ + const MMFFHerschbachLaurie *operator()(const int iRow, const int jRow) { + + const MMFFHerschbachLaurie *mmffHerschbachLaurieParams = NULL; + unsigned int canIRow = iRow; + unsigned int canJRow = jRow; + if (iRow > jRow) { + canIRow = jRow; + canJRow = iRow; + } + #ifdef RDKIT_MMFF_PARAMS_USE_STD_MAP + std::map >::const_iterator res1; + std::map::const_iterator res2; + res1 = d_params.find(canIRow); + if (res1 != d_params.end()) { + res2 = ((*res1).second).find(canJRow); + if (res2 != ((*res1).second).end()) { + mmffHerschbachLaurieParams = &((*res2).second); + } + } + #else + std::pair::const_iterator, + std::vector::const_iterator> bounds; + bounds = std::equal_range + (d_iRow.begin(), d_iRow.end(), canIRow); + if (bounds.first != bounds.second) { + bounds = std::equal_range + (d_jRow.begin() + (bounds.first - d_iRow.begin()), + d_jRow.begin() + (bounds.second - d_iRow.begin()), + canJRow); + if (bounds.first != bounds.second) { + mmffHerschbachLaurieParams = &d_params[bounds.first - d_jRow.begin()]; + } + } + #endif + + return mmffHerschbachLaurieParams; + } + private: + //! to force this to be a singleton, the constructor must be private + MMFFHerschbachLaurieCollection(std::string mmffHerschbachLaurie); + static class MMFFHerschbachLaurieCollection *ds_instance; //!< the singleton + #ifdef RDKIT_MMFF_PARAMS_USE_STD_MAP + std::map > d_params; //!< the parameter 2D-map + #else + std::vector d_params; //!< the parameter vector + std::vector d_iRow; //! periodic row number vector for atom i + std::vector d_jRow; //! periodic row number vector for atom j + #endif + }; + class MMFFCovRadPauEleCollection { public: //! gets a pointer to the singleton MMFFCovRadPauEleCollection diff --git a/Code/GraphMol/Atom.h b/Code/GraphMol/Atom.h index 74db29f27..710f2f72f 100644 --- a/Code/GraphMol/Atom.h +++ b/Code/GraphMol/Atom.h @@ -276,23 +276,29 @@ namespace RDKit{ //! returns whether or not we match the argument /*! Notes: + The general rule is that if a property on this atom has a non-default value, + the property on the other atom must have the same value. + The exception to this is H counts, which are ignored. These turns out to be + impossible to handle generally, so rather than having odd and hard-to-explain + exceptions, we ignore them entirely. + Here are the rules for atom-atom matching: - | This | Other | Match | + | This | Other | Match | Reason | CCO | CCO | Yes | | CCO | CC[O-] | Yes | - | CC[O-] | CCO | No | + | CC[O-] | CCO | No | Charge | CC[O-] | CC[O-] | Yes | - | CC[OH] | CC[O-] | No | - | CC[OH] | CCOC | No | + | CC[OH] | CC[O-] | Yes | + | CC[OH] | CCOC | Yes | | CCO | CCOC | Yes | | CCC | CCC | Yes | | CCC | CC[14C] | Yes | - | CC[14C] | CCC | No | + | CC[14C] | CCC | No | Isotope | CC[14C] | CC[14C] | Yes | | C | OCO | Yes | | [CH] | OCO | Yes | | [CH2] | OCO | Yes | - | [CH3] | OCO | No | + | [CH3] | OCO | No | Radical | C | O[CH2]O | Yes | | [CH2] | O[CH2]O | Yes | */ diff --git a/Code/GraphMol/ChemReactions/CMakeLists.txt b/Code/GraphMol/ChemReactions/CMakeLists.txt index 68eb6cb74..d4212e9f7 100644 --- a/Code/GraphMol/ChemReactions/CMakeLists.txt +++ b/Code/GraphMol/ChemReactions/CMakeLists.txt @@ -1,14 +1,21 @@ rdkit_library(ChemReactions Reaction.cpp MDLParser.cpp DaylightParser.cpp ReactionPickler.cpp - ReactionWriter.cpp ReactionDepict.cpp - LINK_LIBRARIES Depictor FileParsers SubstructMatch ChemTransforms) + ReactionWriter.cpp ReactionDepict.cpp ReactionFingerprints.cpp ReactionUtils.cpp MoleculeParser.cpp ReactionRunner.cpp + LINK_LIBRARIES Descriptors Fingerprints Depictor FileParsers SubstructMatch ChemTransforms) rdkit_headers(Reaction.h ReactionParser.h - ReactionPickler.h DEST GraphMol/ChemReactions) + ReactionPickler.h + ReactionFingerprints.h + ReactionUtils.h + ReactionRunner.h DEST GraphMol/ChemReactions) rdkit_test(testReaction testReaction.cpp LINK_LIBRARIES ChemReactions ChemTransforms Depictor FileParsers SmilesParse SubstructMatch GraphMol RDGeneral RDGeometryLib ) +rdkit_test(testReactionFingerprints testReactionFingerprints.cpp LINK_LIBRARIES +ChemReactions Fingerprints ChemTransforms Depictor FileParsers SmilesParse SubstructMatch +GraphMol RDGeneral RDGeometryLib ) + add_subdirectory(Wrap) diff --git a/Code/GraphMol/ChemReactions/DaylightParser.cpp b/Code/GraphMol/ChemReactions/DaylightParser.cpp index e79f8b0ef..f97e2ca29 100644 --- a/Code/GraphMol/ChemReactions/DaylightParser.cpp +++ b/Code/GraphMol/ChemReactions/DaylightParser.cpp @@ -1,6 +1,6 @@ // $Id$ // -// Copyright (c) 2007, Novartis Institutes for BioMedical Research Inc. +// Copyright (c) 2007-2014, Novartis Institutes for BioMedical Research Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without @@ -151,23 +151,28 @@ namespace RDKit { } std::string reactText=text.substr(0,pos1); - std::vector reactSmarts=DaylightParserUtils::splitSmartsIntoComponents(reactText); - -#if 0 - // we don't currently do anything with this, but we could std::string agentText=""; if(pos2!=pos1+1){ agentText=text.substr(pos1+1,(pos2-pos1)-1); } -#endif std::string productText=text.substr(pos2+1); + + // recognize changes within the same molecules, e.g., intra molecular bond formation + // therefore we need to correctly interpret parenthesis and dots in the reaction smarts + std::vector reactSmarts=DaylightParserUtils::splitSmartsIntoComponents(reactText); + std::vector productSmarts=DaylightParserUtils::splitSmartsIntoComponents(productText); + ChemicalReaction *rxn=new ChemicalReaction(); for(std::vector::const_iterator txtIt=reactSmarts.begin(); txtIt!=reactSmarts.end();++txtIt){ ROMol *mol; - if(!useSmiles) mol=SmartsToMol(*txtIt,0,false,replacements); - else mol=SmilesToMol(*txtIt,0,false,replacements); + if(!useSmiles){ + mol=SmartsToMol(*txtIt,0,false,replacements); + } + else{ + mol=SmilesToMol(*txtIt,0,false,replacements); + } if(!mol){ std::string errMsg="Problems constructing reactant from SMARTS: "; errMsg += *txtIt; @@ -175,28 +180,47 @@ namespace RDKit { } rxn->addReactantTemplate(ROMOL_SPTR(mol)); } - //std::cerr << " ---------------------------------------------------------" << std::endl; - ROMol *prodMol; - if(!useSmiles) prodMol=SmartsToMol(productText,0,false,replacements); - else prodMol=SmilesToMol(productText,0,false,replacements); - if(!prodMol){ - std::string errMsg="Problems constructing product from SMARTS: "; - errMsg += productText; - throw ChemicalReactionParserException(errMsg); + for(std::vector::const_iterator txtIt=productSmarts.begin(); + txtIt!=productSmarts.end();++txtIt){ + ROMol *mol; + if(!useSmiles){ + mol=SmartsToMol(*txtIt,0,false,replacements); + } + else{ + mol=SmilesToMol(*txtIt,0,false,replacements); + } + if(!mol){ + std::string errMsg="Problems constructing product from SMARTS: "; + errMsg += *txtIt; + throw ChemicalReactionParserException(errMsg); + } + rxn->addProductTemplate(ROMOL_SPTR(mol)); } - std::vector prods=MolOps::getMolFrags(*prodMol,false); - delete prodMol; - for(std::vector::iterator pIt=prods.begin(); - pIt!=prods.end();++pIt){ - rxn->addProductTemplate(*pIt); - } - //std::cerr << " ---------------------------------------------------------" << std::endl; DaylightParserUtils::updateProductsStereochem(rxn); + + ROMol *agentMol; + //allow a reaction template to have no agent specified + if(agentText.size() != 0){ + if(!useSmiles) agentMol=SmartsToMol(agentText,0,false,replacements); + else agentMol=SmilesToMol(agentText,0,false,replacements); + + if(!agentMol){ + std::string errMsg="Problems constructing agent from SMARTS: "; + errMsg += agentText; + throw ChemicalReactionParserException(errMsg); + } + std::vector agents=MolOps::getMolFrags(*agentMol,false); + delete agentMol; + for(std::vector::iterator aIt=agents.begin(); + aIt!=agents.end();++aIt){ + rxn->addAgentTemplate(*aIt); + } + } // "SMARTS"-based reactions have implicit properties rxn->setImplicitPropertiesFlag(true); - + return rxn; } diff --git a/Code/GraphMol/ChemReactions/MDLParser.cpp b/Code/GraphMol/ChemReactions/MDLParser.cpp index a3a78099f..2789f2429 100644 --- a/Code/GraphMol/ChemReactions/MDLParser.cpp +++ b/Code/GraphMol/ChemReactions/MDLParser.cpp @@ -1,6 +1,6 @@ // $Id$ // -// Copyright (c) 2007, Novartis Institutes for BioMedical Research Inc. +// Copyright (c) 2007-2014, Novartis Institutes for BioMedical Research Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without @@ -63,10 +63,9 @@ namespace RDKit { if(inStream.eof()){ throw ChemicalReactionParserException("premature EOF hit."); } - rxn=new ChemicalReaction(); - unsigned int nReacts=0,nProds=0; + unsigned int nReacts=0,nProds=0,nAgents=0; unsigned int spos = 0; if(tempStr.size()<6){ throw ChemicalReactionParserException("rxn counts line is too short"); @@ -75,7 +74,14 @@ namespace RDKit { nReacts = FileParserUtils::stripSpacesAndCast(tempStr.substr(0,3)); spos = 3; nProds = FileParserUtils::stripSpacesAndCast(tempStr.substr(spos,3)); - spos = 6; + spos = 6;; + if(tempStr.size()>6){ + std::string trimmed=boost::trim_copy(tempStr.substr(spos,3)); + if(trimmed.size() > 0){ + nAgents = FileParserUtils::stripSpacesAndCast(tempStr.substr(spos,3)); + spos = 9; + } + } } catch (boost::bad_lexical_cast &) { delete rxn; rxn=0; @@ -83,7 +89,6 @@ namespace RDKit { errout << "Cannot convert " << tempStr.substr(spos,3) << " to int"; throw ChemicalReactionParserException(errout.str()) ; } - for(unsigned int i=0;iaddProductTemplate(ROMOL_SPTR(prod)); - } + } + + for(unsigned int i=0;iaddAgentTemplate(ROMOL_SPTR(agent)); + } + } + void ParseV3000RxnBlock(std::istream &inStream,unsigned int &line, ChemicalReaction *&rxn) { @@ -157,6 +184,10 @@ namespace RDKit { } unsigned int nReacts=FileParserUtils::stripSpacesAndCast(tokens[1]); unsigned int nProds=FileParserUtils::stripSpacesAndCast(tokens[2]); + unsigned int nAgents=0; + if(tokens.size()>3){ + nAgents=FileParserUtils::stripSpacesAndCast(tokens[3]); + } tempStr = FileParserUtils::getV3000Line(&inStream,line); boost::to_upper(tempStr); @@ -220,6 +251,39 @@ namespace RDKit { if(tempStr.length()<11 || tempStr.substr(0,11) != "END PRODUCT"){ throw FileParseException("END PRODUCT line not found") ; } + + if(nAgents){ + tempStr = FileParserUtils::getV3000Line(&inStream,line); + boost::to_upper(tempStr); + if(tempStr.length()<14 || tempStr.substr(0,14) != "BEGIN AGENT"){ + throw FileParseException("BEGIN AGENT line not found") ; + } + } + for(unsigned int i=0;iaddAgentTemplate(ROMOL_SPTR(dynamic_cast(agent))); + } + if(nAgents){ + tempStr = FileParserUtils::getV3000Line(&inStream,line); + boost::to_upper(tempStr); + if(tempStr.length()<12 || tempStr.substr(0,12) != "END AGENT"){ + throw FileParseException("END AGENT line not found") ; + } + } } } // end of local namespace @@ -253,7 +317,6 @@ namespace RDKit { res=0; throw e; } - // convert atoms to queries: for(MOL_SPTR_VECT::const_iterator iter=res->beginReactantTemplates(); iter != res->endReactantTemplates();++iter){ diff --git a/Code/GraphMol/ChemReactions/MoleculeParser.cpp b/Code/GraphMol/ChemReactions/MoleculeParser.cpp new file mode 100644 index 000000000..7495ac03f --- /dev/null +++ b/Code/GraphMol/ChemReactions/MoleculeParser.cpp @@ -0,0 +1,99 @@ +// $Id$ +// +// Copyright (c) 2014, Novartis Institutes for BioMedical Research Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following +// disclaimer in the documentation and/or other materials provided +// with the distribution. +// * Neither the name of Novartis Institutes for BioMedical Research Inc. +// nor the names of its contributors may be used to endorse or promote +// products derived from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// + +#include +#include +#include +#include + +namespace{ + +bool testForSameRXNRoleOfAllMoleculeAtoms(const RDKit::ROMol &mol, int role) +{ + RDKit::ROMol::ATOM_ITER_PAIR atItP = mol.getVertices(); + while(atItP.first != atItP.second ){ + const RDKit::Atom *oAtom=mol[*(atItP.first++)].get(); + if(oAtom->hasProp("molRxnRole") && oAtom->getProp("molRxnRole")!=role){ + return false; + } + } + return true; +} + +int getRXNRoleOfMolecule(const RDKit::ROMol &mol) +{ + RDKit::ROMol::ATOM_ITER_PAIR atItP = mol.getVertices(); + while(atItP.first != atItP.second ){ + const RDKit::Atom *oAtom=mol[*(atItP.first++)].get(); + if(oAtom->hasProp("molRxnRole")){ + return oAtom->getProp("molRxnRole"); + } + } + return -1; +} + +} + +namespace RDKit { + + ChemicalReaction * RxnMolToChemicalReaction(const ROMol &mol) + { + ChemicalReaction *rxn=new ChemicalReaction(); + + MOL_SPTR_VECT fragments = MolOps::getMolFrags(mol); + + unsigned countFragments = 0; + for(MOL_SPTR_VECT::iterator iter = fragments.begin(); + iter != fragments.end(); ++iter, countFragments++){ + int role = getRXNRoleOfMolecule(*iter->get()); + if(!testForSameRXNRoleOfAllMoleculeAtoms(*iter->get(), role)){ + BOOST_LOG(rdWarningLog)<<">> Atoms within one molecule have different RXN roles.\n"; + continue; + } + switch(role){ + case 1: + rxn->addReactantTemplate(*iter); + break; + case 2: + rxn->addProductTemplate(*iter); + break; + case 3: + rxn->addAgentTemplate(*iter); + break; + default: + BOOST_LOG(rdWarningLog)<<">> Fragment "<< countFragments <<" not included in the reaction, atoms do not have a correct RXN role.\n"; + } + } + return rxn; + } + +} diff --git a/Code/GraphMol/ChemReactions/Reaction.cpp b/Code/GraphMol/ChemReactions/Reaction.cpp index 0c183f591..d0a6a3ba1 100644 --- a/Code/GraphMol/ChemReactions/Reaction.cpp +++ b/Code/GraphMol/ChemReactions/Reaction.cpp @@ -1,6 +1,6 @@ // $Id$ // -// Copyright (c) 2007, Novartis Institutes for BioMedical Research Inc. +// Copyright (c) 2007-2014, Novartis Institutes for BioMedical Research Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without @@ -39,650 +39,16 @@ #include #include #include +#include +#include +#include +#include "GraphMol/ChemReactions/ReactionRunner.h" namespace RDKit { - typedef std::vector VectMatchVectType; - typedef std::vector< VectMatchVectType > VectVectMatchVectType; - - namespace ReactionUtils { - //! returns whether or not all reactants matched - bool getReactantMatches(const MOL_SPTR_VECT &reactants, - const MOL_SPTR_VECT &reactantTemplates, - VectVectMatchVectType &matchesByReactant){ - PRECONDITION(reactants.size()==reactantTemplates.size(),"reactant size mismatch"); - - matchesByReactant.clear(); - matchesByReactant.resize(reactants.size()); - - bool res=true; - for(unsigned int i=0;i matchesHere; - // NOTE that we are *not* uniquifying the results. - // This is because we need multiple matches in reactions. For example, - // The ring-closure coded as: - // [C:1]=[C:2] + [C:3]=[C:4][C:5]=[C:6] -> [C:1]1[C:2][C:3][C:4]=[C:5][C:6]1 - // should give 4 products here: - // [Cl]C=C + [Br]C=CC=C -> - // [Cl]C1C([Br])C=CCC1 - // [Cl]C1CC(Br)C=CC1 - // C1C([Br])C=CCC1[Cl] - // C1CC([Br])C=CC1[Cl] - // Yes, in this case there are only 2 unique products, but that's - // a factor of the reactants' symmetry. - // - // There's no particularly straightforward way of solving this problem of recognizing cases - // where we should give all matches and cases where we shouldn't; it's safer to just - // produce everything and let the client deal with uniquifying their results. - int matchCount=SubstructMatch(*(reactants[i]),*(reactantTemplates[i]),matchesHere,false,true,false); - BOOST_FOREACH(const MatchVectType &match,matchesHere){ - bool keep=true; - int pIdx,mIdx; - BOOST_FOREACH(boost::tie(pIdx,mIdx),match){ - if(reactants[i]->getAtomWithIdx(mIdx)->hasProp("_protected")){ - keep=false; - break; - } - } - if(keep){ - matchesByReactant[i].push_back(match); - } else { - --matchCount; - } - } - if(!matchCount){ - // no point continuing if we don't match one of the reactants: - res=false; - break; - } - } - return res; - } // end of getReactantMatches() - - void recurseOverReactantCombinations(const VectVectMatchVectType &matchesByReactant, - VectVectMatchVectType &matchesPerProduct, - unsigned int level,VectMatchVectType combination){ - unsigned int nReactants=matchesByReactant.size(); - RANGE_CHECK(0,level,nReactants-1); - PRECONDITION(combination.size()==nReactants,"bad combination size"); - for(VectMatchVectType::const_iterator reactIt=matchesByReactant[level].begin(); - reactIt != matchesByReactant[level].end(); ++reactIt){ - VectMatchVectType prod=combination; - prod[level] = *reactIt; - if(level==nReactants-1){ - // this is the bottom of the recursion: - matchesPerProduct.push_back(prod); - } else { - recurseOverReactantCombinations(matchesByReactant,matchesPerProduct,level+1,prod); - } - } - } //end of recurseOverReactantCombinations - - void updateImplicitAtomProperties(Atom *prodAtom,const Atom *reactAtom){ - PRECONDITION(prodAtom,"no product atom"); - PRECONDITION(reactAtom,"no reactant atom"); - if(prodAtom->getAtomicNum()!=reactAtom->getAtomicNum()){ - // if we changed atom identity all bets are off, just - // return - return; - } - if(!prodAtom->hasProp("_QueryFormalCharge")){ - prodAtom->setFormalCharge(reactAtom->getFormalCharge()); - } - if(!prodAtom->hasProp("_QueryIsotope")){ - prodAtom->setIsotope(reactAtom->getIsotope()); - } - if(!prodAtom->hasProp("_ReactionDegreeChanged")){ - if(!prodAtom->hasProp("_QueryHCount")){ - prodAtom->setNumExplicitHs(reactAtom->getNumExplicitHs()); - } - prodAtom->setNoImplicit(reactAtom->getNoImplicit()); - } - } - - void generateReactantCombinations(const VectVectMatchVectType &matchesByReactant, - VectVectMatchVectType &matchesPerProduct){ - matchesPerProduct.clear(); - VectMatchVectType tmp; - tmp.clear(); - tmp.resize(matchesByReactant.size()); - recurseOverReactantCombinations(matchesByReactant,matchesPerProduct,0,tmp); - } // end of generateReactantCombinations() - - RWMOL_SPTR initProduct(const ROMOL_SPTR prodTemplateSptr){ - const ROMol *prodTemplate=prodTemplateSptr.get(); - RWMol *res=new RWMol(); - - // --------- --------- --------- --------- --------- --------- - // Initialize by making a copy of the product template as a normal molecule. - // NOTE that we can't just use a normal copy because we do not want to end up - // with query atoms or bonds in the product. - - // copy in the atoms: - ROMol::ATOM_ITER_PAIR atItP = prodTemplate->getVertices(); - while(atItP.first != atItP.second ){ - Atom *oAtom=(*prodTemplate)[*(atItP.first++)].get(); - Atom *newAtom=new Atom(*oAtom); - res->addAtom(newAtom,false,true); - if(newAtom->hasProp("molAtomMapNumber")){ - // set bookmarks for the mapped atoms: - int mapNum; - newAtom->getProp("molAtomMapNumber",mapNum); - res->setAtomBookmark(newAtom,mapNum); - // now clear the molAtomMapNumber property so that it doesn't - // end up in the products (this was bug 3140490): - newAtom->clearProp("molAtomMapNumber"); - } - - newAtom->setChiralTag(Atom::CHI_UNSPECIFIED); - // if the product-template atom has the inversion flag set - // to 4 (=SET), then bring its stereochem over, otherwise we'll - // ignore it: - if(oAtom->hasProp("molInversionFlag")){ - int iFlag; - oAtom->getProp("molInversionFlag",iFlag); - if(iFlag==4) newAtom->setChiralTag(oAtom->getChiralTag()); - } - - // check for properties we need to set: - if(newAtom->hasProp("_QueryFormalCharge")){ - int val; - newAtom->getProp("_QueryFormalCharge",val); - newAtom->setFormalCharge(val); - } - if(newAtom->hasProp("_QueryHCount")){ - int val; - newAtom->getProp("_QueryHCount",val); - newAtom->setNumExplicitHs(val); - } - if(newAtom->hasProp("_QueryMass")){ - int val; - newAtom->getProp("_QueryMass",val); - newAtom->setMass(val); - } - if(newAtom->hasProp("_QueryIsotope")){ - int val; - newAtom->getProp("_QueryIsotope",val); - newAtom->setIsotope(val); - } - } - // and the bonds: - ROMol::BOND_ITER_PAIR bondItP = prodTemplate->getEdges(); - while(bondItP.first != bondItP.second ){ - const BOND_SPTR oldB=(*prodTemplate)[*(bondItP.first++)]; - unsigned int bondIdx; - bondIdx=res->addBond(oldB->getBeginAtomIdx(),oldB->getEndAtomIdx(),oldB->getBondType())-1; - // make sure we don't lose the bond dir information: - Bond *newB=res->getBondWithIdx(bondIdx); - newB->setBondDir(oldB->getBondDir()); - // Special case/hack: - // The product has been processed by the SMARTS parser. - // The SMARTS parser tags unspecified bonds as single, but then adds - // a query so that they match single or double - // This caused Issue 1748846 - // http://sourceforge.net/tracker/index.php?func=detail&aid=1748846&group_id=160139&atid=814650 - // We need to fix that little problem now: - if( oldB->hasQuery()){ - // remember that the product has been processed by the SMARTS parser. - std::string queryDescription=oldB->getQuery()->getDescription(); - if(queryDescription=="BondOr" && - oldB->getBondType()==Bond::SINGLE){ - // We need to fix that little problem now: - if(newB->getBeginAtom()->getIsAromatic() && newB->getEndAtom()->getIsAromatic()){ - newB->setBondType(Bond::AROMATIC); - newB->setIsAromatic(true); - } else { - newB->setBondType(Bond::SINGLE); - newB->setIsAromatic(false); - } - } else if(queryDescription=="BondNull") { - newB->setProp("NullBond",1); - } - } - } - - return RWMOL_SPTR(res); - } // end of initProduct() - - void addReactantAtomsAndBonds(const ChemicalReaction *rxn, - RWMOL_SPTR product,const ROMOL_SPTR reactantSptr, - const MatchVectType &match, - const ROMOL_SPTR reactantTemplate, - Conformer *productConf){ - PRECONDITION(rxn,"bad reaction"); - // start by looping over all matches and marking the reactant atoms that - // have already been "added" by virtue of being in the product. We'll also - // mark "skipped" atoms: those that are in the match, but not in this - // particular product (or, perhaps, not in any product) - // At the same time we'll set up a map between the indices of those - // atoms and their index in the product. - boost::dynamic_bitset<> mappedAtoms(reactantSptr->getNumAtoms()); - boost::dynamic_bitset<> skippedAtoms(reactantSptr->getNumAtoms()); - std::map reactProdAtomMap; // this maps atom indices from reactant->product - std::map prodReactAtomMap; // this maps atom indices from product->reactant - std::vector chiralAtomsToCheck; - for(unsigned int i=0;igetAtomWithIdx(match[i].first); - if(templateAtom->hasProp("molAtomMapNumber")){ - int molAtomMapNumber; - templateAtom->getProp("molAtomMapNumber",molAtomMapNumber); - - if(product->hasAtomBookmark(molAtomMapNumber)){ - unsigned int pIdx=product->getAtomWithBookmark(molAtomMapNumber)->getIdx(); - reactProdAtomMap[match[i].second] = pIdx; - mappedAtoms[match[i].second]=1; - CHECK_INVARIANT(pIdxgetNumAtoms(),"yikes!"); - prodReactAtomMap[pIdx]=match[i].second; - } else { - // this skippedAtom has an atomMapNumber, but it's not in this product - // (it's either in another product or it's not mapped at all). - skippedAtoms[match[i].second]=1; - } - } else { - // This skippedAtom appears in the match, but not in a product: - skippedAtoms[match[i].second]=1; - } - } - - boost::dynamic_bitset<> visitedAtoms(reactantSptr->getNumAtoms()); - - const ROMol *reactant=reactantSptr.get(); - - // ---------- ---------- ---------- ---------- ---------- ---------- - // Loop over the bonds in the product and look for those that have - // the NullBond property set. These are bonds for which no information - // (other than their existance) was provided in the template: - ROMol::BOND_ITER_PAIR bondItP = product->getEdges(); - while(bondItP.first != bondItP.second ){ - BOND_SPTR pBond=(*product)[*(bondItP.first)]; - ++bondItP.first; - if(pBond->hasProp("NullBond")){ - if(prodReactAtomMap.find(pBond->getBeginAtomIdx())!=prodReactAtomMap.end() && - prodReactAtomMap.find(pBond->getEndAtomIdx())!=prodReactAtomMap.end() ){ - // the bond is between two mapped atoms from this reactant: - const Bond *rBond=reactant->getBondBetweenAtoms(prodReactAtomMap[pBond->getBeginAtomIdx()], - prodReactAtomMap[pBond->getEndAtomIdx()]); - if(!rBond) continue; - pBond->setBondType(rBond->getBondType()); - pBond->setBondDir(rBond->getBondDir()); - pBond->setIsAromatic(rBond->getIsAromatic()); - pBond->clearProp("NullBond"); - } - } - } - - // ---------- ---------- ---------- ---------- ---------- ---------- - // Loop over the atoms in the match that were added to the product - // From the corresponding atom in the reactant, do a graph traversal - // to find other connected atoms that should be added: - for(unsigned int matchIdx=0;matchIdxgetAtomWithIdx(reactProdAtomMap[reactantAtomIdx]); - // and this is the corresponding atom in the reactant. - const Atom *reactantAtom=reactant->getAtomWithIdx(reactantAtomIdx); - - // which properties need to be set from the reactant? - if(productAtom->getAtomicNum()<=0){ - productAtom->setAtomicNum(reactantAtom->getAtomicNum()); - productAtom->setIsAromatic(reactantAtom->getIsAromatic()); - // don't copy isotope information over from dummy atoms - productAtom->setIsotope(reactantAtom->getIsotope()); - - // remove dummy labels (if present) - if(productAtom->hasProp("dummyLabel")) productAtom->clearProp("dummyLabel"); - if(productAtom->hasProp("_MolFileRLabel")) productAtom->clearProp("_MolFileRLabel"); - } - - - if(rxn->getImplicitPropertiesFlag()){ - updateImplicitAtomProperties(productAtom,reactantAtom); - } - - // One might be tempted to copy over the reactant atom's chirality into the - // product atom if chirality is not specified on the product. This would be a - // very bad idea because the order of bonds will almost certainly change on the - // atom and the chirality is referenced to bond order. - - // --------- --------- --------- --------- --------- --------- - // While we're here, set the stereochemistry - // FIX: this should be free-standing, not in this function. - if(reactantAtom->getChiralTag()!=Atom::CHI_UNSPECIFIED && - reactantAtom->getChiralTag()!=Atom::CHI_OTHER && - productAtom->hasProp("molInversionFlag")){ - int flagVal; - productAtom->getProp("molInversionFlag",flagVal); - switch(flagVal){ - case 0: - // FIX: should we clear the chirality or leave it alone? for now we leave it alone - //productAtom->setChiralTag(Atom::ChiralType::CHI_UNSPECIFIED); - productAtom->setChiralTag(reactantAtom->getChiralTag()); - break; - case 1: - // inversion - if(reactantAtom->getChiralTag()!=Atom::CHI_TETRAHEDRAL_CW && - reactantAtom->getChiralTag()!=Atom::CHI_TETRAHEDRAL_CCW){ - BOOST_LOG(rdWarningLog) << "unsupported chiral type on reactant atom ignored\n"; - } else { - productAtom->setChiralTag(reactantAtom->getChiralTag()); - productAtom->invertChirality(); - } - break; - case 2: - // retention: just set to the reactant - productAtom->setChiralTag(reactantAtom->getChiralTag()); - break; - case 3: - // remove stereo - productAtom->setChiralTag(Atom::CHI_UNSPECIFIED); - break; - case 4: - // set stereo, so leave it the way it was in the product template - break; - default: - BOOST_LOG(rdWarningLog) << "unrecognized chiral inversion/retention flag on product atom ignored\n"; - } - } - - // now traverse: - std::list< const Atom * > atomStack; - atomStack.push_back(reactantAtom); - while(!atomStack.empty()){ - const Atom *lReactantAtom = atomStack.front(); - atomStack.pop_front(); - - // each atom in the stack is guaranteed to already be in the product: - CHECK_INVARIANT(reactProdAtomMap.find(lReactantAtom->getIdx())!=reactProdAtomMap.end(), - "reactant atom on traversal stack not present in product."); - int lReactantAtomProductIndex=reactProdAtomMap[lReactantAtom->getIdx()]; - productAtom = product->getAtomWithIdx(lReactantAtomProductIndex); - visitedAtoms[lReactantAtom->getIdx()]=1; - - // Check our neighbors: - ROMol::ADJ_ITER nbrIdx,endNbrs; - boost::tie(nbrIdx,endNbrs) = reactant->getAtomNeighbors(lReactantAtom); - while(nbrIdx!=endNbrs){ - // Four possibilities here. The neighbor: - // 0) has been visited already: do nothing - // 1) is part of the match (thus already in the product): set a bond to it - // 2) has been added: set a bond to it - // 3) has not yet been added: add it, set a bond to it, and push it - // onto the stack - if(!visitedAtoms[*nbrIdx] && !skippedAtoms[*nbrIdx]){ - unsigned int productIdx; - bool addBond=false; - if(mappedAtoms[*nbrIdx]){ - // this is case 1 (neighbor in match); set a bond to the neighbor if this atom - // is not also in the match (match-match bonds were set when the product template was - // copied in to start things off).; - if(!mappedAtoms[lReactantAtom->getIdx()]){ - CHECK_INVARIANT(reactProdAtomMap.find(*nbrIdx)!=reactProdAtomMap.end(), - "reactant atom not present in product."); - addBond=true; - } - } else if(reactProdAtomMap.find(*nbrIdx)!=reactProdAtomMap.end()){ - // case 2, the neighbor has been added and we just need to set a bond to it: - addBond=true; - } else { - // case 3, add the atom, a bond to it, and push the atom onto the stack - const Atom *lReactantAtom=reactant->getAtomWithIdx(*nbrIdx); - Atom *newAtom = new Atom(*lReactantAtom); - productIdx=product->addAtom(newAtom,false,true); - reactProdAtomMap[*nbrIdx]=productIdx; - prodReactAtomMap[productIdx]=*nbrIdx; - addBond=true; - // update the stack: - atomStack.push_back(lReactantAtom); - // if the atom is chiral, we need to check its bond ordering later: - if(lReactantAtom->getChiralTag()!=Atom::CHI_UNSPECIFIED){ - chiralAtomsToCheck.push_back(lReactantAtom); - } - } - if(addBond){ - const Bond *origB=reactant->getBondBetweenAtoms(lReactantAtom->getIdx(),*nbrIdx); - unsigned int begIdx=origB->getBeginAtomIdx(); - unsigned int endIdx=origB->getEndAtomIdx(); - unsigned int bondIdx; - // add the bond, but make sure it has the same begin and end - // atom indices as the original: - bondIdx=product->addBond(reactProdAtomMap[begIdx], - reactProdAtomMap[endIdx], - origB->getBondType())-1; - //bondIdx=product->addBond(reactProdAtomMap[*nbrIdx],lReactantAtomProductIndex, - // origB->getBondType())-1; - Bond *newB=product->getBondWithIdx(bondIdx); - newB->setBondDir(origB->getBondDir()); - } - } - nbrIdx++; - } - } // end of atomStack traversal - - // now that we've added all the reactant's neighbors, check to see if - // it is chiral in the reactant but is not in the reaction. If so - // we need to worry about its chirality - productAtom = product->getAtomWithIdx(reactProdAtomMap[reactantAtomIdx]); - if(productAtom->getChiralTag()==Atom::CHI_UNSPECIFIED && - reactantAtom->getChiralTag()!=Atom::CHI_UNSPECIFIED && - reactantAtom->getChiralTag()!=Atom::CHI_OTHER && - !productAtom->hasProp("molInversionFlag") ){ - // we can only do something sensible here if we have the same number of bonds - // in the reactants and the products: - if(reactantAtom->getDegree()==productAtom->getDegree()){ - unsigned int nUnknown=0; - INT_LIST pOrder; - - ROMol::ADJ_ITER nbrIdx,endNbrs; - boost::tie(nbrIdx,endNbrs) = product->getAtomNeighbors(productAtom); - while(nbrIdx!=endNbrs){ - if(prodReactAtomMap.find(*nbrIdx)==prodReactAtomMap.end()){ - ++nUnknown; - // if there's more than one bond in the product that doesn't correspond to - // anything in the reactant, we're also doomed - if(nUnknown>1) break; - - // otherwise, add a -1 to the bond order that we'll fill in later - pOrder.push_back(-1); - } else { - const Bond *rBond=reactant->getBondBetweenAtoms(reactantAtom->getIdx(),prodReactAtomMap[*nbrIdx]); - CHECK_INVARIANT(rBond,"expected reactant bond not found"); - pOrder.push_back(rBond->getIdx()); - } - ++nbrIdx; - } - if(nUnknown==1){ - // find the reactant bond that hasn't yet been accounted for: - int unmatchedBond=-1; - boost::tie(nbrIdx,endNbrs) = reactant->getAtomNeighbors(reactantAtom); - while(nbrIdx!=endNbrs){ - const Bond *rBond=reactant->getBondBetweenAtoms(reactantAtom->getIdx(),*nbrIdx); - if(std::find(pOrder.begin(),pOrder.end(),rBond->getIdx())==pOrder.end()){ - unmatchedBond=rBond->getIdx(); - break; - } - ++nbrIdx; - } - // what must be true at this point: - // 1) there's a -1 in pOrder that we'll substitute for - // 2) unmatchedBond contains the index of the substitution - INT_LIST::iterator bPos=std::find(pOrder.begin(),pOrder.end(),-1); - if(unmatchedBond>=0 && bPos!=pOrder.end()){ - *bPos=unmatchedBond; - } - if(std::find(pOrder.begin(),pOrder.end(),-1)==pOrder.end()){ - nUnknown=0; - } - } - if(!nUnknown){ - productAtom->setChiralTag(reactantAtom->getChiralTag()); - int nSwaps = reactantAtom->getPerturbationOrder(pOrder); - if(nSwaps%2){ - productAtom->invertChirality(); - } - } - } - } - - } - } // end of loop over matched atoms - - // ---------- ---------- ---------- ---------- ---------- ---------- - // now we need to loop over atoms from the reactants that were chiral but not - // directly involved in the reaction in order to make sure their chirality hasn't - // been disturbed - for(std::vector::const_iterator atomIt=chiralAtomsToCheck.begin(); - atomIt!=chiralAtomsToCheck.end();++atomIt){ - const Atom *reactantAtom=*atomIt; - Atom *productAtom=product->getAtomWithIdx(reactProdAtomMap[reactantAtom->getIdx()]); - CHECK_INVARIANT(reactantAtom->getChiralTag()!=Atom::CHI_UNSPECIFIED, - "missing atom chirality."); - CHECK_INVARIANT(reactantAtom->getChiralTag()==productAtom->getChiralTag(), - "invalid product chirality."); - - if( reactantAtom->getOwningMol().getAtomDegree(reactantAtom) != - product->getAtomDegree(productAtom) ){ - // If the number of bonds to the atom has changed in the course of the - // reaction we're lost, so remove chirality. - // A word of explanation here: the atoms in the chiralAtomsToCheck set are - // not explicitly mapped atoms of the reaction, so we really have no idea what - // to do with this case. At the moment I'm not even really sure how this - // could happen, but better safe than sorry. - productAtom->setChiralTag(Atom::CHI_UNSPECIFIED); - } else if(reactantAtom->getChiralTag()==Atom::CHI_TETRAHEDRAL_CW || - reactantAtom->getChiralTag()==Atom::CHI_TETRAHEDRAL_CCW){ - // this will contain the indices of product bonds in the - // reactant order: - INT_LIST newOrder; - - ROMol::OEDGE_ITER beg,end; - boost::tie(beg,end) = reactantAtom->getOwningMol().getAtomBonds(reactantAtom); - while(beg!=end){ - const BOND_SPTR reactantBond=reactantAtom->getOwningMol()[*beg]; - unsigned int oAtomIdx=reactantBond->getOtherAtomIdx(reactantAtom->getIdx()); - CHECK_INVARIANT(reactProdAtomMap.find(oAtomIdx)!=reactProdAtomMap.end(), - "other atom from bond not mapped."); - const Bond *productBond; - productBond=product->getBondBetweenAtoms(productAtom->getIdx(), - reactProdAtomMap[oAtomIdx]); - CHECK_INVARIANT(productBond,"no matching bond found in product"); - newOrder.push_back(productBond->getIdx()); - ++beg; - } - int nSwaps=productAtom->getPerturbationOrder(newOrder); - if(nSwaps%2){ - productAtom->invertChirality(); - } - } else { - // not tetrahedral chirality, don't do anything. - } - } // end of loop over chiralAtomsToCheck - - // ---------- ---------- ---------- ---------- ---------- ---------- - // finally we may need to set the coordinates in the product conformer: - if(productConf){ - productConf->resize(product->getNumAtoms()); - if(reactantSptr->getNumConformers()){ - const Conformer &reactConf=reactantSptr->getConformer(); - if(reactConf.is3D()) productConf->set3D(true); - for(std::map::const_iterator pr=reactProdAtomMap.begin(); - pr!=reactProdAtomMap.end();++pr){ - productConf->setAtomPos(pr->second,reactConf.getAtomPos(pr->first)); - } - } - } // end of conformer update loop - - } // end of addReactantAtomsAndBonds() - } // End of namespace ReactionUtils - - - MOL_SPTR_VECT ChemicalReaction::generateOneProductSet(const MOL_SPTR_VECT &reactants, - const std::vector &reactantsMatch) const { - PRECONDITION(reactants.size()==reactantsMatch.size(),"vector size mismatch"); - MOL_SPTR_VECT res; - res.resize(this->getNumProductTemplates()); - - // if any of the reactants have a conformer, we'll go ahead and - // generate conformers for the products: - bool doConfs=false; - BOOST_FOREACH(ROMOL_SPTR reactant,reactants){ - if(reactant->getNumConformers()){ - doConfs=true; - break; - } - } - - unsigned int prodId=0; - for(MOL_SPTR_VECT::const_iterator pTemplIt=this->beginProductTemplates(); - pTemplIt!=this->endProductTemplates();++pTemplIt){ - RWMOL_SPTR product=ReactionUtils::initProduct(*pTemplIt); - Conformer *conf=0; - if(doConfs){ - conf = new Conformer(); - conf->set3D(false); - } - - for(unsigned int reactantId=0;reactantIdm_reactantTemplates[reactantId], - conf); - } - product->clearAllAtomBookmarks(); - if(doConfs){ - product->addConformer(conf,true); - } - res[prodId] = product; - ++prodId; - } - - return res; - } std::vector ChemicalReaction::runReactants(const MOL_SPTR_VECT reactants) const { - if(this->df_needsInit) { - throw ChemicalReactionException("initMatchers() must be called before runReactants()"); - } - if(reactants.size() != this->getNumReactantTemplates()){ - throw ChemicalReactionException("Number of reactants provided does not match number of reactant templates."); - } - BOOST_FOREACH(ROMOL_SPTR msptr,reactants){ - CHECK_INVARIANT(msptr,"bad molecule in reactants"); - } - - std::vector productMols; - productMols.clear(); - - // if we have no products, return now: - if(!this->getNumProductTemplates()){ - return productMols; - } - - // find the matches for each reactant: - VectVectMatchVectType matchesByReactant; - if(!ReactionUtils::getReactantMatches(reactants,this->m_reactantTemplates,matchesByReactant)){ - // some reactants didn't find a match, return an empty product list: - return productMols; - } - - // ------------------------------------------------------- - // we now have matches for each reactant, so we can start creating products: - - // start by doing the combinatorics on the matches: - VectVectMatchVectType reactantMatchesPerProduct; - ReactionUtils::generateReactantCombinations(matchesByReactant,reactantMatchesPerProduct); - productMols.resize(reactantMatchesPerProduct.size()); - - for(unsigned int productId=0;productId!=productMols.size();++productId){ - MOL_SPTR_VECT lProds=this->generateOneProductSet(reactants,reactantMatchesPerProduct[productId]); - productMols[productId]=lProds; - } - - return productMols; - } // end of ChemicalReaction::runReactants() + return run_Reactants(*this, reactants); + } ChemicalReaction::ChemicalReaction(const std::string &pickle) { ReactionPickler::reactionFromPickle(pickle,this); @@ -783,10 +149,18 @@ namespace RDKit { productNumbersSeen.end(),mapNum)!=productNumbersSeen.end(); if(seenAlready){ if(!silent){ - BOOST_LOG(rdErrorLog)<<"product atom-mapping number "<getDegree()!=(*atomIt)->getDegree()){ + (*atomIt)->setProp("_ReactionDegreeChanged",1); + } + } else { productNumbersSeen.push_back(mapNum); } @@ -798,7 +172,6 @@ namespace RDKit { BOOST_LOG(rdWarningLog)<<"product atom-mapping number "<get()->getNumHeavyAtoms() != mol.getNumHeavyAtoms()){ + continue; + } + if(iter->get()->getNumBonds() != mol.getNumBonds()){ + continue; + } + // not possible, update property cache not possible for const molecules +// if(iter->get()->getRingInfo()->numRings() != mol.getRingInfo()->numRings()){ +// return false; +// } + if(RDKit::Descriptors::calcAMW(*iter->get()) != RDKit::Descriptors::calcAMW(mol)){ + continue; + } + MatchVectType tvect; + if(SubstructMatch(mol,**iter,tvect)){ + return true; + } + } + return false; + } + + bool isMoleculeAgentOfReaction(const ChemicalReaction &rxn,const ROMol &mol){ + unsigned int ignore; + return isMoleculeAgentOfReaction(rxn,mol,ignore); + } + void addRecursiveQueriesToReaction(ChemicalReaction &rxn, const std::map &queries, std::string propName, @@ -1166,4 +574,56 @@ namespace RDKit { return res; } + void ChemicalReaction::removeUnmappedReactantTemplates( + double thresholdUnmappedAtoms, + bool moveToAgentTemplates, + MOL_SPTR_VECT *targetVector) + { + MOL_SPTR_VECT res_reactantTemplates; + for(MOL_SPTR_VECT::iterator iter = beginReactantTemplates(); + iter != endReactantTemplates(); ++iter){ + if(isReactionTemplateMoleculeAgent(*iter->get(), thresholdUnmappedAtoms)){ + if(moveToAgentTemplates){ + m_agentTemplates.push_back(*iter); + } + if(targetVector){ + targetVector->push_back(*iter); + } + } + else{ + res_reactantTemplates.push_back(*iter); + } + } + m_reactantTemplates.clear(); + m_reactantTemplates.insert(m_reactantTemplates.begin(), + res_reactantTemplates.begin(), res_reactantTemplates.end()); + res_reactantTemplates.clear(); + } + + void ChemicalReaction::removeUnmappedProductTemplates( + double thresholdUnmappedAtoms, + bool moveToAgentTemplates, + MOL_SPTR_VECT *targetVector) + { + MOL_SPTR_VECT res_productTemplates; + for(MOL_SPTR_VECT::iterator iter = beginProductTemplates(); + iter != endProductTemplates(); ++iter){ + if(isReactionTemplateMoleculeAgent(*iter->get(), thresholdUnmappedAtoms)){ + if(moveToAgentTemplates){ + m_agentTemplates.push_back(*iter); + } + if(targetVector){ + targetVector->push_back(*iter); + } + } + else{ + res_productTemplates.push_back(*iter); + } + } + m_productTemplates.clear(); + m_productTemplates.insert(m_productTemplates.begin(), + res_productTemplates.begin(), res_productTemplates.end()); + res_productTemplates.clear(); + } + } // end of RDKit namespace diff --git a/Code/GraphMol/ChemReactions/Reaction.h b/Code/GraphMol/ChemReactions/Reaction.h index eac10949c..853c538a0 100644 --- a/Code/GraphMol/ChemReactions/Reaction.h +++ b/Code/GraphMol/ChemReactions/Reaction.h @@ -1,5 +1,5 @@ // -// Copyright (c) 2007, Novartis Institutes for BioMedical Research Inc. +// Copyright (c) 2007-2014, Novartis Institutes for BioMedical Research Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without @@ -120,6 +120,7 @@ namespace RDKit{ df_implicitProperties=other.df_implicitProperties; m_reactantTemplates=other.m_reactantTemplates; m_productTemplates=other.m_productTemplates; + m_agentTemplates=other.m_agentTemplates; } //! construct a reaction from a pickle string ChemicalReaction(const std::string &binStr); @@ -135,6 +136,16 @@ namespace RDKit{ return this->m_reactantTemplates.size(); } + //! Adds a new agent template + /*! + \return the number of agent + + */ + unsigned int addAgentTemplate(ROMOL_SPTR mol){ + this->m_agentTemplates.push_back(mol); + return this->m_agentTemplates.size(); + } + //! Adds a new product template /*! \return the number of products @@ -145,6 +156,23 @@ namespace RDKit{ return this->m_productTemplates.size(); } + //! Removes the reactant templates from a reaction if atom mapping ratio is below a given threshold + /*! By default the removed reactant templates were attached to the agent templates. + /*! An alternative will be to provide a pointer to a molecule vector where these reactants should be saved. + */ + void removeUnmappedReactantTemplates( + double thresholdUnmappedAtoms = 0.2, + bool moveToAgentTemplates = true, + MOL_SPTR_VECT *targetVector = NULL); + + //! Removes the product templates from a reaction if its atom mapping ratio is below a given threshold + /*! By default the removed products templates were attached to the agent templates. + /*! An alternative will be to provide a pointer to a molecule vector where these products should be saved. + */ + void removeUnmappedProductTemplates( + double thresholdUnmappedAtoms =0.2, + bool moveToAgentTemplates = true, + MOL_SPTR_VECT *targetVector = NULL); //! Runs the reaction on a set of reactants /*! @@ -175,6 +203,13 @@ namespace RDKit{ return this->m_productTemplates.end(); } + MOL_SPTR_VECT::const_iterator beginAgentTemplates() const { + return this->m_agentTemplates.begin(); + } + MOL_SPTR_VECT::const_iterator endAgentTemplates() const { + return this->m_agentTemplates.end(); + } + MOL_SPTR_VECT::iterator beginReactantTemplates() { return this->m_reactantTemplates.begin(); } @@ -188,8 +223,16 @@ namespace RDKit{ MOL_SPTR_VECT::iterator endProductTemplates() { return this->m_productTemplates.end(); } + + MOL_SPTR_VECT::iterator beginAgentTemplates() { + return this->m_agentTemplates.begin(); + } + MOL_SPTR_VECT::iterator endAgentTemplates() { + return this->m_agentTemplates.end(); + } unsigned int getNumReactantTemplates() const { return this->m_reactantTemplates.size(); }; unsigned int getNumProductTemplates() const { return this->m_productTemplates.size(); }; + unsigned int getNumAgentTemplates() const { return this->m_agentTemplates.size(); }; //! initializes our internal reactant-matching datastructures. /*! @@ -244,10 +287,8 @@ namespace RDKit{ private: bool df_needsInit; bool df_implicitProperties; - MOL_SPTR_VECT m_reactantTemplates,m_productTemplates; + MOL_SPTR_VECT m_reactantTemplates,m_productTemplates,m_agentTemplates; ChemicalReaction &operator=(const ChemicalReaction &); // disable assignment - MOL_SPTR_VECT generateOneProductSet(const MOL_SPTR_VECT &reactants, - const std::vector &reactantsMatch) const; }; //! tests whether or not the molecule has a substructure match @@ -270,6 +311,16 @@ namespace RDKit{ //! \overload bool isMoleculeProductOfReaction(const ChemicalReaction &rxn,const ROMol &mol); + //! tests whether or not the molecule has a substructure match + //! to any of the reaction's agents + //! the \c which argument is used to return which of the agents + //! the molecule matches. If there's no match, it is equal to the number + //! of agents on return + bool isMoleculeAgentOfReaction(const ChemicalReaction &rxn,const ROMol &mol, + unsigned int &which); + //! \overload + bool isMoleculeAgentOfReaction(const ChemicalReaction &rxn,const ROMol &mol); + //! returns indices of the atoms in each reactant that are changed //! in the reaction /*! diff --git a/Code/GraphMol/ChemReactions/ReactionFingerprints.cpp b/Code/GraphMol/ChemReactions/ReactionFingerprints.cpp new file mode 100644 index 000000000..1641b5920 --- /dev/null +++ b/Code/GraphMol/ChemReactions/ReactionFingerprints.cpp @@ -0,0 +1,246 @@ +// $Id$ +// +// Copyright (c) 2014, Novartis Institutes for BioMedical Research Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following +// disclaimer in the documentation and/or other materials provided +// with the distribution. +// * Neither the name of Novartis Institutes for BioMedical Research Inc. +// nor the names of its contributors may be used to endorse or promote +// products derived from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// + +#include +#include +#include +#include +#include +#include +#include "GraphMol/ChemReactions/ReactionFingerprints.h" +#include +#include +#include +#include + +namespace{ + +ExplicitBitVect *concatenateBitsets(const ExplicitBitVect& first, const ExplicitBitVect& second) +{ + ExplicitBitVect *res = new ExplicitBitVect(first.size() + second.size()); + + for(unsigned i = 0; i < first.size(); i++){ + if(first[i]){ + res->setBit(i); + } + } + for(unsigned j = 0; j < second.size(); j++){ + if(second[j]){ + res->setBit(first.size()+j); + } + } + return res; +} + +RDKit::SparseIntVect *generateFingerprint(RDKit::ROMol &mol, + unsigned int fpSize, + RDKit::FingerprintType t) +{ + mol.updatePropertyCache(false); + RDKit::SparseIntVect *res; + switch(t){ + case RDKit::AtomPairFP: + { + RDKit::SparseIntVect *tmp1 = + RDKit::AtomPairs::getHashedAtomPairFingerprint(mol, fpSize); + res = new RDKit::SparseIntVect(fpSize); + BOOST_FOREACH(RDKit::SparseIntVect::StorageType::value_type val,tmp1->getNonzeroElements()){ + res->setVal(static_cast(val.first),val.second); + } + delete tmp1; + } + break; + case RDKit::TopologicalTorsion: + { + RDKit::SparseIntVect *tmp2 = + RDKit::AtomPairs::getHashedTopologicalTorsionFingerprint(mol, fpSize); + res = new RDKit::SparseIntVect(fpSize); + BOOST_FOREACH(RDKit::SparseIntVect::StorageType::value_type val,tmp2->getNonzeroElements()){ + res->setVal(static_cast(val.first),val.second); + } + delete tmp2; + } + break; + case RDKit::MorganFP: + { + if(!mol.getRingInfo()->isInitialized()){ + mol.updatePropertyCache(); + RDKit::MolOps::findSSSR(mol); + } + res = RDKit::MorganFingerprints::getHashedFingerprint(mol, 2,fpSize); + } + break; + default: + std::stringstream err; + err << ">> unsupported fingerprint type" << std::endl; + throw RDKit::ChemicalReactionException(err.str()); + } + return res; +} + +ExplicitBitVect *generateFingerprintAsBitVect(RDKit::ROMol &mol, + unsigned int fpSize, + RDKit::FingerprintType t) +{ + mol.updatePropertyCache(false); + ExplicitBitVect *res; + switch(t){ + case RDKit::AtomPairFP: + res = RDKit::AtomPairs::getHashedAtomPairFingerprintAsBitVect(mol, fpSize); + break; + case RDKit::RDKitFP: + res = RDKit::RDKFingerprintMol(mol,1, 7, fpSize); + break; + case RDKit::TopologicalTorsion: + res = RDKit::AtomPairs::getHashedTopologicalTorsionFingerprintAsBitVect(mol); + break; + case RDKit::MorganFP: + { + if(!mol.getRingInfo()->isInitialized()){ + mol.updatePropertyCache(); + RDKit::MolOps::findSSSR(mol); + } + res = RDKit::MorganFingerprints::getFingerprintAsBitVect(mol, 2, fpSize); + } + break; + case RDKit::PatternFP: + res = RDKit::PatternFingerprintMol(mol, fpSize); + break; + default: + std::stringstream err; + err << ">> unsupported fingerprint type" << std::endl; + throw RDKit::ChemicalReactionException(err.str()); + } + return res; +} + +} + +namespace RDKit{ + +SparseIntVect *generateFingerprintChemReactionAsCountVect(const ChemicalReaction &rxn, + unsigned int fpSize, + FingerprintType t, + ReactionMoleculeType mt) +{ + PRECONDITION(fpSize!=0,"fpSize==0"); + + SparseIntVect *result = new SparseIntVect(fpSize); + RDKit::MOL_SPTR_VECT::const_iterator begin = getStartIterator(rxn, mt); + RDKit::MOL_SPTR_VECT::const_iterator end = getEndIterator(rxn, mt); + for(; begin != end; ++begin){ + SparseIntVect *tmp = generateFingerprint(**begin, fpSize, t); + (*result) += *tmp; + delete tmp; + } + return result; +} + +ExplicitBitVect *generateFingerprintChemReactionAsBitVect(const ChemicalReaction &rxn, + unsigned int fpSize, + FingerprintType t, + ReactionMoleculeType mt) +{ + PRECONDITION(fpSize!=0,"fpSize==0"); + + ExplicitBitVect *result = new ExplicitBitVect(fpSize); + RDKit::MOL_SPTR_VECT::const_iterator begin = getStartIterator(rxn, mt); + RDKit::MOL_SPTR_VECT::const_iterator end = getEndIterator(rxn, mt); + for(; begin != end; ++begin){ + ExplicitBitVect *tmp = generateFingerprintAsBitVect(**begin, fpSize, t); + (*result) |= *tmp; + delete tmp; + } + return result; +} + +// caller owns the result, it must be deleted +ExplicitBitVect *StructuralFingerprintChemReaction(const ChemicalReaction &rxn, + const ReactionFingerprintParams ¶ms) +{ + PRECONDITION(params.fpSize!=0,"fpSize==0"); + + unsigned int fpSize_final = params.fpSize/2; + if(params.includeAgents){ + unsigned agent_fp_size = params.fpSize/3; + if(params.bitRatioAgents < 1.0){ + agent_fp_size = int(ceil(static_cast(params.fpSize) * params.bitRatioAgents)); + } + unsigned scaling = !(agent_fp_size%2) ? agent_fp_size : agent_fp_size - 1; + fpSize_final = (params.fpSize - scaling)/2; + } + unsigned int fpSize_agent = params.fpSize - 2*fpSize_final; + + ExplicitBitVect *reactantFP = generateFingerprintChemReactionAsBitVect(rxn, fpSize_final, params.fpType, Reactant); + ExplicitBitVect *productFP = generateFingerprintChemReactionAsBitVect(rxn, fpSize_final, params.fpType, Product); + ExplicitBitVect *res = new ExplicitBitVect; + /* concatenate the two bitvectors */ + (*res) = *reactantFP + *productFP; + if(fpSize_agent > 0){ + ExplicitBitVect *agentFP = generateFingerprintChemReactionAsBitVect(rxn, fpSize_agent, params.fpType, Agent); + (*res) += *agentFP; + delete agentFP; + } + + delete reactantFP; + delete productFP; + return res; +} + +SparseIntVect *DifferenceFingerprintChemReaction(const ChemicalReaction &rxn, + const ReactionFingerprintParams ¶ms) +{ + PRECONDITION(params.fpSize!=0,"fpSize==0"); + PRECONDITION(params.fpType>0 & params.fpType<4 ,"Fingerprinttype not supported"); + + SparseIntVect *reactantFP = generateFingerprintChemReactionAsCountVect(rxn, params.fpSize, params.fpType, Reactant); + SparseIntVect *productFP = generateFingerprintChemReactionAsCountVect(rxn, params.fpSize, params.fpType, Product); + SparseIntVect* res = new SparseIntVect; + if(params.includeAgents){ + SparseIntVect *agentFP = generateFingerprintChemReactionAsCountVect(rxn, params.fpSize, params.fpType, Agent); + (*productFP) *= params.nonAgentWeight; + (*reactantFP) *= params.nonAgentWeight; + (*agentFP) *= params.agentWeight; + (*res) = *productFP - *reactantFP + *agentFP; + delete agentFP; + } + /* subtract product FP from reactant FP */ + else{ + (*res) = *productFP - *reactantFP; + } + + delete reactantFP; + delete productFP; + return res; +} + +} diff --git a/Code/GraphMol/ChemReactions/ReactionFingerprints.h b/Code/GraphMol/ChemReactions/ReactionFingerprints.h new file mode 100644 index 000000000..255f1efc9 --- /dev/null +++ b/Code/GraphMol/ChemReactions/ReactionFingerprints.h @@ -0,0 +1,139 @@ +// +// Copyright (c) 2014, Novartis Institutes for BioMedical Research Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following +// disclaimer in the documentation and/or other materials provided +// with the distribution. +// * Neither the name of Novartis Institutes for BioMedical Research Inc. +// nor the names of its contributors may be used to endorse or promote +// products derived from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +#ifndef RD_REACTIONFINGERPRINTS_H +#define RD_REACTIONFINGERPRINTS_H + +#include +#include + +namespace RDKit{ + + class ChemicalReaction; + + enum FingerprintType{ + AtomPairFP = 1, + TopologicalTorsion, + MorganFP, + RDKitFP, + PatternFP + }; + + //! A struct for storing parameters to manipulate + //! the calculation of fingerprints of chemical reactions + /*! + Different parameters can be chosen to influence the generation + of chemical reaction fingerprints. Generally different setting + should be used for structural or difference fingerprints. + + \param includeAgents include the agents of a reaction for fingerprint generation + \param bitRatioAgents in structural fingerprints it determines the ratio of bits of + the agents in the fingerprint + \param nonAgentWeight in difference fingerprints weight factor for reactants and products + compared to agents + \param agentWeight if agents are included, agents could be weighted compared to reactants + and products in difference fingerprints + \param fpSize number of bits of the fingerprint + \param fpType kind of fingerprint used, e.g AtompairFP. Be aware that only AtompairFP, + TopologicalTorsion and MorganFP were supported in the difference fingerprint. + */ + struct ReactionFingerprintParams{ + + ReactionFingerprintParams(): + includeAgents(false), + bitRatioAgents(0.0), + nonAgentWeight(10), + agentWeight(0), + fpSize(2048), + fpType(AtomPairFP){} + + ReactionFingerprintParams(bool includeAgents, double bitRatioAgents, + unsigned int nonAgentWeight, int agentWeight, + unsigned int fpSize,FingerprintType fpType): + includeAgents(includeAgents), + bitRatioAgents(bitRatioAgents), + nonAgentWeight(nonAgentWeight), + agentWeight(agentWeight), + fpSize(fpSize), + fpType(fpType){} + + bool includeAgents; + double bitRatioAgents; + unsigned int nonAgentWeight; + int agentWeight; + unsigned int fpSize; + FingerprintType fpType; + }; + + const ReactionFingerprintParams DefaultStructuralFPParams(true, 0.2, 1, 1, 4096, PatternFP); + const ReactionFingerprintParams DefaultDifferenceFPParams(true, 0.0, 10, 1, 2048, AtomPairFP); + + //! Generates a structural fingerprint for a reaction + //! to use in screening + /*! + A structural fingerprint is generated as an ExplicitBitVect to use for searching + e.g. substructure in reactions. By default the fingerprint is generated as 4096 BitVect + using a PatternFP for reactants and products and tentatively agents which + were finally concatenated + + \param rxn: the reaction to be fingerprinted + \param params: specific settings to manipulate fingerprint generation + + \return the reaction fingerprint, as an ExplicitBitVect + + Notes: + - the caller is responsible for deleteing the result + */ + ExplicitBitVect *StructuralFingerprintChemReaction(const ChemicalReaction &rxn, + const ReactionFingerprintParams ¶ms = DefaultStructuralFPParams); + + + //! Generates a difference fingerprint for a reaction + //! to use in similarity search of reactions + /*! + A difference fingerprint is generated as a SparseIntVect to use for + similarity search of reactions. By default the fingerprint is generated as 2048 bit + hashed fingerprint subtracting AtompairFP of the reactants from the products' AtompairFP + and tentatively the agent AtompairFP is added + + \param rxn: the reaction to be fingerprinted + \param params: specific settings to manipulate fingerprint generation + + \return the reaction fingerprint, as an SparseIntVec + + Notes: + - the caller is responsible for deleteing the result + */ + SparseIntVect *DifferenceFingerprintChemReaction(const ChemicalReaction &rxn, + const ReactionFingerprintParams ¶ms = DefaultDifferenceFPParams); + +} + +#endif diff --git a/Code/GraphMol/ChemReactions/ReactionParser.h b/Code/GraphMol/ChemReactions/ReactionParser.h index fe7c126cd..7a9ca4ac8 100644 --- a/Code/GraphMol/ChemReactions/ReactionParser.h +++ b/Code/GraphMol/ChemReactions/ReactionParser.h @@ -1,5 +1,5 @@ // -// Copyright (c) 2007, Novartis Institutes for BioMedical Research Inc. +// Copyright (c) 2007-2014, Novartis Institutes for BioMedical Research Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without @@ -78,12 +78,34 @@ namespace RDKit{ std::map *replacements=0, bool useSmiles=false); + //! Parse a ROMol into a ChemicalReaction, RXN role must be set before + /*! + Alternative to build a reaction from a molecule (fragments) which have RXN roles + set as atom properties: "molRxnRole" (1=reactant, 2=product, 3=agent) + + \param mol ROMol with RXN roles set + */ + ChemicalReaction * RxnMolToChemicalReaction(const ROMol &mol); + + + //! returns the reaction SMARTS for a reaction std::string ChemicalReactionToRxnSmarts(ChemicalReaction &rxn); + //! returns the reaction SMILES for a reaction + std::string ChemicalReactionToRxnSmiles(ChemicalReaction &rxn); + //! returns an RXN block for a reaction - std::string ChemicalReactionToRxnBlock(const ChemicalReaction &rxn); + /*! + \param rxn chemical reaction + \param separateAgents flag to decide if agents were put in a seperate block, + otherwise they were included in the reactants block (default) + */ + std::string ChemicalReactionToRxnBlock(const ChemicalReaction &rxn, bool separateAgents=false); + //! returns a ROMol with RXN roles used to describe the reaction + ROMol* ChemicalReactionToRxnMol(const ChemicalReaction &rxn); + }; // end of RDKit namespace #endif diff --git a/Code/GraphMol/ChemReactions/ReactionPickler.cpp b/Code/GraphMol/ChemReactions/ReactionPickler.cpp index dda090e34..921092f0c 100644 --- a/Code/GraphMol/ChemReactions/ReactionPickler.cpp +++ b/Code/GraphMol/ChemReactions/ReactionPickler.cpp @@ -1,6 +1,7 @@ // $Id: MolPickler.cpp 1123 2009-06-01 13:04:33Z glandrum $ // // Copyright (C) 2009 Greg Landrum +// Copyright (c) 2014, Novartis Institutes for BioMedical Research Inc. // // @@ All Rights Reserved @@ // This file is part of the RDKit. @@ -23,7 +24,7 @@ using boost::uint32_t; namespace RDKit{ const int32_t ReactionPickler::versionMajor=1; - const int32_t ReactionPickler::versionMinor=0; + const int32_t ReactionPickler::versionMinor=1; const int32_t ReactionPickler::versionPatch=0; const int32_t ReactionPickler::endianId=0xDEADBEEF; @@ -101,6 +102,8 @@ namespace RDKit{ streamWrite(ss,tmpInt); tmpInt = static_cast(rxn->getNumProductTemplates()); streamWrite(ss,tmpInt); + tmpInt = static_cast(rxn->getNumAgentTemplates()); + streamWrite(ss,tmpInt); uint32_t flag = 0; if(rxn->getImplicitPropertiesFlag()) flag |= 0x1; @@ -125,7 +128,15 @@ namespace RDKit{ MolPickler::pickleMol(tmpl->get(),ss); } streamWrite(ss,ENDPRODUCTS); - + + if(rxn->getNumAgentTemplates()){ + streamWrite(ss,BEGINAGENTS); + for(MOL_SPTR_VECT::const_iterator tmpl=rxn->beginAgentTemplates(); + tmpl!=rxn->endAgentTemplates();++tmpl){ + MolPickler::pickleMol(tmpl->get(),ss); + } + streamWrite(ss,ENDAGENTS); + } streamWrite(ss,ENDREACTION); } // end of _pickle @@ -133,11 +144,13 @@ namespace RDKit{ PRECONDITION(rxn,"empty reaction"); Tags tag; - uint32_t numReactants,numProducts; + uint32_t numReactants,numProducts,numAgents=0; streamRead(ss,numReactants); streamRead(ss,numProducts); - + if(version>1000){ + streamRead(ss,numAgents); + } // we use this here and below to set df_needsInit, so don't re-use the variable uint32_t flag = 0; streamRead(ss,flag); @@ -174,6 +187,21 @@ namespace RDKit{ if(tag != ENDPRODUCTS){ throw ReactionPicklerException("Bad pickle format: ENDPRODUCTS tag not found."); } + if(numAgents!=0){ + streamRead(ss,tag); + if(tag != BEGINAGENTS){ + throw ReactionPicklerException("Bad pickle format: BEGINAGENTS tag not found."); + } + for(unsigned int i=0;iaddAgentTemplate(ROMOL_SPTR(mol)); + } + streamRead(ss,tag); + if(tag != ENDAGENTS){ + throw ReactionPicklerException("Bad pickle format: ENDAGENTS tag not found."); + } + } // need to do this after we add reactants and products rxn->df_needsInit = flag & 0x2; diff --git a/Code/GraphMol/ChemReactions/ReactionPickler.h b/Code/GraphMol/ChemReactions/ReactionPickler.h index 8571fd251..1c1e62b8b 100644 --- a/Code/GraphMol/ChemReactions/ReactionPickler.h +++ b/Code/GraphMol/ChemReactions/ReactionPickler.h @@ -1,5 +1,6 @@ // // Copyright (C) 2009 Greg Landrum +// Copyright (c) 2014, Novartis Institutes for BioMedical Research Inc. // // @@ All Rights Reserved @@ // This file is part of the RDKit. @@ -48,6 +49,8 @@ namespace RDKit{ ENDREACTANTS, BEGINPRODUCTS, ENDPRODUCTS, + BEGINAGENTS, + ENDAGENTS, ENDREACTION, } Tags; diff --git a/Code/GraphMol/ChemReactions/ReactionRunner.cpp b/Code/GraphMol/ChemReactions/ReactionRunner.cpp new file mode 100644 index 000000000..7d3404cd5 --- /dev/null +++ b/Code/GraphMol/ChemReactions/ReactionRunner.cpp @@ -0,0 +1,819 @@ +// $Id$ +// +// Copyright (c) 2014, Novartis Institutes for BioMedical Research Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following +// disclaimer in the documentation and/or other materials provided +// with the distribution. +// * Neither the name of Novartis Institutes for BioMedical Research Inc. +// nor the names of its contributors may be used to endorse or promote +// products derived from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "GraphMol/ChemReactions/ReactionRunner.h" +#include + +namespace RDKit { + typedef std::vector VectMatchVectType; + typedef std::vector< VectMatchVectType > VectVectMatchVectType; + + namespace ReactionRunnerUtils { + //! returns whether or not all reactants matched + bool getReactantMatches(const MOL_SPTR_VECT &reactants, + const ChemicalReaction &rxn, + VectVectMatchVectType &matchesByReactant) + { + PRECONDITION(reactants.size()==rxn.getNumReactantTemplates(),"reactant size mismatch"); + + matchesByReactant.clear(); + matchesByReactant.resize(reactants.size()); + + bool res=true; + unsigned int i=0; + for(MOL_SPTR_VECT::const_iterator iter = rxn.beginReactantTemplates(); + iter != rxn.endReactantTemplates(); ++iter, i++){ + std::vector< MatchVectType > matchesHere; + // NOTE that we are *not* uniquifying the results. + // This is because we need multiple matches in reactions. For example, + // The ring-closure coded as: + // [C:1]=[C:2] + [C:3]=[C:4][C:5]=[C:6] -> [C:1]1[C:2][C:3][C:4]=[C:5][C:6]1 + // should give 4 products here: + // [Cl]C=C + [Br]C=CC=C -> + // [Cl]C1C([Br])C=CCC1 + // [Cl]C1CC(Br)C=CC1 + // C1C([Br])C=CCC1[Cl] + // C1CC([Br])C=CC1[Cl] + // Yes, in this case there are only 2 unique products, but that's + // a factor of the reactants' symmetry. + // + // There's no particularly straightforward way of solving this problem of recognizing cases + // where we should give all matches and cases where we shouldn't; it's safer to just + // produce everything and let the client deal with uniquifying their results. + int matchCount=SubstructMatch(*(reactants[i]),*iter->get(), matchesHere, false, true, false); + BOOST_FOREACH(const MatchVectType &match, matchesHere){ + bool keep=true; + int pIdx,mIdx; + BOOST_FOREACH(boost::tie(pIdx,mIdx),match){ + if(reactants[i]->getAtomWithIdx(mIdx)->hasProp("_protected")){ + keep=false; + break; + } + } + if(keep){ + matchesByReactant[i].push_back(match); + } else { + --matchCount; + } + } + if(!matchCount){ + // no point continuing if we don't match one of the reactants: + res=false; + break; + } + } + return res; + } // end of getReactantMatches() + + void recurseOverReactantCombinations(const VectVectMatchVectType &matchesByReactant, + VectVectMatchVectType &matchesPerProduct, + unsigned int level,VectMatchVectType combination){ + unsigned int nReactants=matchesByReactant.size(); + RANGE_CHECK(0,level,nReactants-1); + PRECONDITION(combination.size()==nReactants,"bad combination size"); + for(VectMatchVectType::const_iterator reactIt=matchesByReactant[level].begin(); + reactIt != matchesByReactant[level].end(); ++reactIt){ + VectMatchVectType prod=combination; + prod[level] = *reactIt; + if(level==nReactants-1){ + // this is the bottom of the recursion: + matchesPerProduct.push_back(prod); + } else { + recurseOverReactantCombinations(matchesByReactant,matchesPerProduct,level+1,prod); + } + } + } //end of recurseOverReactantCombinations + + void updateImplicitAtomProperties(Atom *prodAtom,const Atom *reactAtom){ + PRECONDITION(prodAtom,"no product atom"); + PRECONDITION(reactAtom,"no reactant atom"); + if(prodAtom->getAtomicNum()!=reactAtom->getAtomicNum()){ + // if we changed atom identity all bets are off, just + // return + return; + } + if(!prodAtom->hasProp("_QueryFormalCharge")){ + prodAtom->setFormalCharge(reactAtom->getFormalCharge()); + } + if(!prodAtom->hasProp("_QueryIsotope")){ + prodAtom->setIsotope(reactAtom->getIsotope()); + } + if(!prodAtom->hasProp("_ReactionDegreeChanged")){ + if(!prodAtom->hasProp("_QueryHCount")){ + prodAtom->setNumExplicitHs(reactAtom->getNumExplicitHs()); + } + prodAtom->setNoImplicit(reactAtom->getNoImplicit()); + } + } + + void generateReactantCombinations(const VectVectMatchVectType &matchesByReactant, + VectVectMatchVectType &matchesPerProduct){ + matchesPerProduct.clear(); + VectMatchVectType tmp; + tmp.clear(); + tmp.resize(matchesByReactant.size()); + recurseOverReactantCombinations(matchesByReactant,matchesPerProduct,0,tmp); + } // end of generateReactantCombinations() + + RWMOL_SPTR initProduct(const ROMOL_SPTR prodTemplateSptr){ + const ROMol *prodTemplate=prodTemplateSptr.get(); + RWMol *res=new RWMol(); + + // --------- --------- --------- --------- --------- --------- + // Initialize by making a copy of the product template as a normal molecule. + // NOTE that we can't just use a normal copy because we do not want to end up + // with query atoms or bonds in the product. + + // copy in the atoms: + ROMol::ATOM_ITER_PAIR atItP = prodTemplate->getVertices(); + while(atItP.first != atItP.second ){ + Atom *oAtom=(*prodTemplate)[*(atItP.first++)].get(); + Atom *newAtom=new Atom(*oAtom); + res->addAtom(newAtom,false,true); + if(newAtom->hasProp("molAtomMapNumber")){ + // set bookmarks for the mapped atoms: + int mapNum; + newAtom->getProp("molAtomMapNumber",mapNum); + res->setAtomBookmark(newAtom,mapNum); + // now clear the molAtomMapNumber property so that it doesn't + // end up in the products (this was bug 3140490): + newAtom->clearProp("molAtomMapNumber"); + } + + newAtom->setChiralTag(Atom::CHI_UNSPECIFIED); + // if the product-template atom has the inversion flag set + // to 4 (=SET), then bring its stereochem over, otherwise we'll + // ignore it: + if(oAtom->hasProp("molInversionFlag")){ + int iFlag; + oAtom->getProp("molInversionFlag",iFlag); + if(iFlag==4) newAtom->setChiralTag(oAtom->getChiralTag()); + } + + // check for properties we need to set: + if(newAtom->hasProp("_QueryFormalCharge")){ + int val; + newAtom->getProp("_QueryFormalCharge",val); + newAtom->setFormalCharge(val); + } + if(newAtom->hasProp("_QueryHCount")){ + int val; + newAtom->getProp("_QueryHCount",val); + newAtom->setNumExplicitHs(val); + } + if(newAtom->hasProp("_QueryMass")){ + int val; + newAtom->getProp("_QueryMass",val); + newAtom->setMass(val); + } + if(newAtom->hasProp("_QueryIsotope")){ + int val; + newAtom->getProp("_QueryIsotope",val); + newAtom->setIsotope(val); + } + } + // and the bonds: + ROMol::BOND_ITER_PAIR bondItP = prodTemplate->getEdges(); + while(bondItP.first != bondItP.second ){ + const BOND_SPTR oldB=(*prodTemplate)[*(bondItP.first++)]; + unsigned int bondIdx; + bondIdx=res->addBond(oldB->getBeginAtomIdx(),oldB->getEndAtomIdx(),oldB->getBondType())-1; + // make sure we don't lose the bond dir information: + Bond *newB=res->getBondWithIdx(bondIdx); + newB->setBondDir(oldB->getBondDir()); + // Special case/hack: + // The product has been processed by the SMARTS parser. + // The SMARTS parser tags unspecified bonds as single, but then adds + // a query so that they match single or double + // This caused Issue 1748846 + // http://sourceforge.net/tracker/index.php?func=detail&aid=1748846&group_id=160139&atid=814650 + // We need to fix that little problem now: + if( oldB->hasQuery()){ + // remember that the product has been processed by the SMARTS parser. + std::string queryDescription=oldB->getQuery()->getDescription(); + if(queryDescription=="BondOr" && + oldB->getBondType()==Bond::SINGLE){ + // We need to fix that little problem now: + if(newB->getBeginAtom()->getIsAromatic() && newB->getEndAtom()->getIsAromatic()){ + newB->setBondType(Bond::AROMATIC); + newB->setIsAromatic(true); + } else { + newB->setBondType(Bond::SINGLE); + newB->setIsAromatic(false); + } + } else if(queryDescription=="BondNull") { + newB->setProp("NullBond",1); + } + } + } + return RWMOL_SPTR(res); + } // end of initProduct() + + struct ReactantProductAtomMapping{ + + ReactantProductAtomMapping(unsigned lenghtBitSet) + { + mappedAtoms.resize(lenghtBitSet); + skippedAtoms.resize(lenghtBitSet); + } + + boost::dynamic_bitset<> mappedAtoms; + boost::dynamic_bitset<> skippedAtoms; + std::map > reactProdAtomMap; + std::map prodReactAtomMap; + std::map prodAtomBondMap; + }; + + ReactantProductAtomMapping* getAtomMappingsReactantProduct(const MatchVectType &match, + const ROMol& reactantTemplate, RWMOL_SPTR product, unsigned numReactAtoms) + { + ReactantProductAtomMapping *mapping = new ReactantProductAtomMapping(numReactAtoms); + for(unsigned int i=0;ihasProp("molAtomMapNumber")){ + int molAtomMapNumber; + templateAtom->getProp("molAtomMapNumber",molAtomMapNumber); + + if(product->hasAtomBookmark(molAtomMapNumber)){ + RWMol::ATOM_PTR_LIST atomIdxs = product->getAllAtomsWithBookmark(molAtomMapNumber); + for(RWMol::ATOM_PTR_LIST::iterator iter = atomIdxs.begin(); + iter != atomIdxs.end(); ++iter){ + Atom * a = *iter; + unsigned int pIdx = a->getIdx(); + mapping->reactProdAtomMap[match[i].second].push_back(pIdx); + mapping->mappedAtoms[match[i].second]=1; + CHECK_INVARIANT(pIdxgetNumAtoms(),"yikes!"); + mapping->prodReactAtomMap[pIdx]=match[i].second; + } + } + else { + // this skippedAtom has an atomMapNumber, but it's not in this product + // (it's either in another product or it's not mapped at all). + mapping->skippedAtoms[match[i].second]=1; + } + } + else { + // This skippedAtom appears in the match, but not in a product: + mapping->skippedAtoms[match[i].second]=1; + } + } + return mapping; + } + + void setReactantBondPropertiesToProduct(RWMOL_SPTR product, const ROMol& reactant, + ReactantProductAtomMapping* mapping) + { + ROMol::BOND_ITER_PAIR bondItP = product->getEdges(); + while(bondItP.first != bondItP.second ){ + BOND_SPTR pBond=(*product)[*(bondItP.first)]; + ++bondItP.first; + if(pBond->hasProp("NullBond")){ + if(mapping->prodReactAtomMap.find(pBond->getBeginAtomIdx())!=mapping->prodReactAtomMap.end() && + mapping->prodReactAtomMap.find(pBond->getEndAtomIdx())!=mapping->prodReactAtomMap.end() ){ + // the bond is between two mapped atoms from this reactant: + unsigned begIdx = mapping->prodReactAtomMap[pBond->getBeginAtomIdx()]; + unsigned endIdx = mapping->prodReactAtomMap[pBond->getEndAtomIdx()]; + const Bond *rBond=reactant.getBondBetweenAtoms(begIdx,endIdx); + if(!rBond) continue; + pBond->setBondType(rBond->getBondType()); + pBond->setBondDir(rBond->getBondDir()); + pBond->setIsAromatic(rBond->getIsAromatic()); + pBond->clearProp("NullBond"); + } + } + } + } + + void checkProductChirality(Atom::ChiralType reactantChirality, Atom *productAtom) + { + int flagVal; + productAtom->getProp("molInversionFlag",flagVal); + + switch(flagVal){ + case 0: + // FIX: should we clear the chirality or leave it alone? for now we leave it alone + //productAtom->setChiralTag(Atom::ChiralType::CHI_UNSPECIFIED); + productAtom->setChiralTag(reactantChirality); + break; + case 1: + // inversion + if(reactantChirality!=Atom::CHI_TETRAHEDRAL_CW && reactantChirality!=Atom::CHI_TETRAHEDRAL_CCW){ + BOOST_LOG(rdWarningLog) << "unsupported chiral type on reactant atom ignored\n"; + } + else { + productAtom->setChiralTag(reactantChirality); + productAtom->invertChirality(); + } + break; + case 2: + // retention: just set to the reactant + productAtom->setChiralTag(reactantChirality); + break; + case 3: + // remove stereo + productAtom->setChiralTag(Atom::CHI_UNSPECIFIED); + break; + case 4: + // set stereo, so leave it the way it was in the product template + break; + default: + BOOST_LOG(rdWarningLog) << "unrecognized chiral inversion/retention flag on product atom ignored\n"; + } + } + + void setReactantAtomPropertiesToProduct( + Atom *productAtom, const Atom& reactantAtom, + bool setImplicitProperties) + { + // which properties need to be set from the reactant? + if(productAtom->getAtomicNum()<=0){ + productAtom->setAtomicNum(reactantAtom.getAtomicNum()); + productAtom->setIsAromatic(reactantAtom.getIsAromatic()); + // don't copy isotope information over from dummy atoms + productAtom->setIsotope(reactantAtom.getIsotope()); + + // remove dummy labels (if present) + if(productAtom->hasProp("dummyLabel")) productAtom->clearProp("dummyLabel"); + if(productAtom->hasProp("_MolFileRLabel")) productAtom->clearProp("_MolFileRLabel"); + } + if(setImplicitProperties){ + updateImplicitAtomProperties(productAtom,&reactantAtom); + } + // One might be tempted to copy over the reactant atom's chirality into the + // product atom if chirality is not specified on the product. This would be a + // very bad idea because the order of bonds will almost certainly change on the + // atom and the chirality is referenced to bond order. + + // --------- --------- --------- --------- --------- --------- + // While we're here, set the stereochemistry + // FIX: this should be free-standing, not in this function. + if(reactantAtom.getChiralTag()!=Atom::CHI_UNSPECIFIED && + reactantAtom.getChiralTag()!=Atom::CHI_OTHER && + productAtom->hasProp("molInversionFlag")){ + checkProductChirality(reactantAtom.getChiralTag(), productAtom); + } + } + + void setNewProductBond(const Bond& origB, RWMOL_SPTR product, + unsigned bondBeginIdx, unsigned bondEndIdx) + { + unsigned bondIdx = product->addBond(bondBeginIdx, bondEndIdx, origB.getBondType())-1; + Bond *newB = product->getBondWithIdx(bondIdx); + newB->setBondDir(origB.getBondDir()); + } + + void addMissingProductBonds(const Bond& origB, RWMOL_SPTR product, + ReactantProductAtomMapping* mapping) + { + unsigned int begIdx=origB.getBeginAtomIdx(); + unsigned int endIdx=origB.getEndAtomIdx(); + + std::vector prodBeginIdxs = mapping->reactProdAtomMap[begIdx]; + std::vector prodEndIdxs = mapping->reactProdAtomMap[endIdx]; + CHECK_INVARIANT(prodBeginIdxs.size() == prodEndIdxs.size(), + "Different number of start-end points for product bonds."); + for(unsigned i = 0; i < prodBeginIdxs.size(); i++){ + setNewProductBond(origB, product, prodBeginIdxs.at(i), prodEndIdxs.at(i)); + } + } + + void addMissingProductAtom(const Atom& reactAtom, unsigned reactNeighborIdx, + unsigned prodNeighborIdx, RWMOL_SPTR product, const ROMol& reactant, + ReactantProductAtomMapping* mapping) + { + Atom *newAtom = new Atom(reactAtom); + unsigned reactAtomIdx = reactAtom.getIdx(); + unsigned productIdx = product->addAtom(newAtom,false,true); + mapping->reactProdAtomMap[reactAtomIdx].push_back(productIdx); + mapping->prodReactAtomMap[productIdx] = reactAtomIdx; + // add the bonds + const Bond *origB = reactant.getBondBetweenAtoms(reactNeighborIdx,reactAtomIdx); + unsigned int begIdx=origB->getBeginAtomIdx(); + unsigned int endIdx=origB->getEndAtomIdx(); + if(begIdx == reactNeighborIdx){ + setNewProductBond(*origB, product, prodNeighborIdx, productIdx); + } + else{ + setNewProductBond(*origB, product, productIdx, prodNeighborIdx); + } + } + + + void addReactantNeighborsToProduct(const ROMol& reactant, const Atom& reactantAtom, + RWMOL_SPTR product, boost::dynamic_bitset<>& visitedAtoms, + std::vector& chiralAtomsToCheck, + ReactantProductAtomMapping* mapping) + { + std::list atomStack; + atomStack.push_back(&reactantAtom); + while(!atomStack.empty()){ + const Atom *lReactantAtom = atomStack.front(); + atomStack.pop_front(); + + // each atom in the stack is guaranteed to already be in the product: + CHECK_INVARIANT(mapping->reactProdAtomMap.find(lReactantAtom->getIdx()) != + mapping->reactProdAtomMap.end(), + "reactant atom on traversal stack not present in product."); + + std::vector lReactantAtomProductIndex = + mapping->reactProdAtomMap[lReactantAtom->getIdx()]; + unsigned lreactIdx = lReactantAtom->getIdx(); + visitedAtoms[lreactIdx] = 1; + // Check our neighbors: + ROMol::ADJ_ITER nbrIdx,endNbrs; + boost::tie(nbrIdx,endNbrs) = reactant.getAtomNeighbors(lReactantAtom); + while(nbrIdx!=endNbrs){ + // Four possibilities here. The neighbor: + // 0) has been visited already: do nothing + // 1) is part of the match (thus already in the product): set a bond to it + // 2) has been added: set a bond to it + // 3) has not yet been added: add it, set a bond to it, and push it + // onto the stack + if(!visitedAtoms[*nbrIdx] && !mapping->skippedAtoms[*nbrIdx]){ + if(mapping->mappedAtoms[*nbrIdx]){ + // this is case 1 (neighbor in match); set a bond to the neighbor if this atom + // is not also in the match (match-match bonds were set when the product template was + // copied in to start things off).; + if(!mapping->mappedAtoms[lreactIdx]){ + CHECK_INVARIANT(mapping->reactProdAtomMap.find(*nbrIdx)!=mapping->reactProdAtomMap.end(), + "reactant atom not present in product."); + const Bond *origB=reactant.getBondBetweenAtoms(lreactIdx,*nbrIdx); + addMissingProductBonds(*origB, product,mapping); + } + } + else if(mapping->reactProdAtomMap.find(*nbrIdx)!= mapping->reactProdAtomMap.end()){ + // case 2, the neighbor has been added and we just need to set a bond to it: + const Bond *origB=reactant.getBondBetweenAtoms(lreactIdx,*nbrIdx); + addMissingProductBonds(*origB, product,mapping); + } + else { + // case 3, add the atom, a bond to it, and push the atom onto the stack + const Atom *neighbor=reactant.getAtomWithIdx(*nbrIdx); + for(unsigned i = 0; i < lReactantAtomProductIndex.size(); i++){ + addMissingProductAtom(*neighbor, lreactIdx,lReactantAtomProductIndex[i], + product, reactant, mapping); + } + // update the stack: + atomStack.push_back(neighbor); + // if the atom is chiral, we need to check its bond ordering later: + if(neighbor->getChiralTag()!=Atom::CHI_UNSPECIFIED){ + chiralAtomsToCheck.push_back(neighbor); + } + } + } + nbrIdx++; + } + } // end of atomStack traversal + } + + void checkAndCorrectChiralityOfMatchingAtomsInProduct( + const ROMol& reactant, unsigned reactantAtomIdx, + const Atom& reactantAtom, RWMOL_SPTR product, + ReactantProductAtomMapping* mapping) + { + for(unsigned i = 0; i < mapping->reactProdAtomMap[reactantAtomIdx].size(); i++){ + unsigned productAtomIdx = mapping->reactProdAtomMap[reactantAtomIdx][i]; + Atom *productAtom = product->getAtomWithIdx(productAtomIdx); + + if(productAtom->getChiralTag() != Atom::CHI_UNSPECIFIED || + reactantAtom.getChiralTag() == Atom::CHI_UNSPECIFIED || + reactantAtom.getChiralTag() == Atom::CHI_OTHER || + productAtom->hasProp("molInversionFlag")){ + continue; + } + // we can only do something sensible here if we have the same number of bonds + // in the reactants and the products: + if(reactantAtom.getDegree() != productAtom->getDegree()){ + continue; + } + unsigned int nUnknown=0; + INT_LIST pOrder; + ROMol::ADJ_ITER nbrIdx,endNbrs; + boost::tie(nbrIdx,endNbrs) = product->getAtomNeighbors(productAtom); + while(nbrIdx != endNbrs){ + if(mapping->prodReactAtomMap.find(*nbrIdx) == mapping->prodReactAtomMap.end()){ + ++nUnknown; + // if there's more than one bond in the product that doesn't correspond to + // anything in the reactant, we're also doomed + if(nUnknown > 1) break; + // otherwise, add a -1 to the bond order that we'll fill in later + pOrder.push_back(-1); + } + else { + const Bond *rBond=reactant.getBondBetweenAtoms(reactantAtom.getIdx(),mapping->prodReactAtomMap[*nbrIdx]); + CHECK_INVARIANT(rBond,"expected reactant bond not found"); + pOrder.push_back(rBond->getIdx()); + } + ++nbrIdx; + } + if(nUnknown == 1){ + // find the reactant bond that hasn't yet been accounted for: + int unmatchedBond = -1; + boost::tie(nbrIdx,endNbrs) = reactant.getAtomNeighbors(&reactantAtom); + while(nbrIdx!=endNbrs){ + const Bond *rBond=reactant.getBondBetweenAtoms(reactantAtom.getIdx(),*nbrIdx); + if(std::find(pOrder.begin(),pOrder.end(),rBond->getIdx()) == pOrder.end()){ + unmatchedBond = rBond->getIdx(); + break; + } + ++nbrIdx; + } + // what must be true at this point: + // 1) there's a -1 in pOrder that we'll substitute for + // 2) unmatchedBond contains the index of the substitution + INT_LIST::iterator bPos=std::find(pOrder.begin(),pOrder.end(),-1); + if(unmatchedBond >= 0 && bPos != pOrder.end()){ + *bPos = unmatchedBond; + } + if(std::find(pOrder.begin(),pOrder.end(),-1) == pOrder.end()){ + nUnknown = 0; + } + } + if(!nUnknown){ + productAtom->setChiralTag(reactantAtom.getChiralTag()); + int nSwaps = reactantAtom.getPerturbationOrder(pOrder); + if(nSwaps%2){ + productAtom->invertChirality(); + } + } + } + } + + void checkAndCorrectChiralityOfProduct(const std::vector& chiralAtomsToCheck, + RWMOL_SPTR product, ReactantProductAtomMapping* mapping) + { + for(std::vector::const_iterator atomIt = chiralAtomsToCheck.begin(); + atomIt != chiralAtomsToCheck.end(); ++atomIt){ + const Atom *reactantAtom = *atomIt; + CHECK_INVARIANT(reactantAtom->getChiralTag()!=Atom::CHI_UNSPECIFIED, + "missing atom chirality."); + unsigned int reactAtomDegree = reactantAtom->getOwningMol().getAtomDegree(reactantAtom); + for(unsigned i = 0; i < mapping->reactProdAtomMap[reactantAtom->getIdx()].size(); i++){ + unsigned productAtomIdx = mapping->reactProdAtomMap[reactantAtom->getIdx()][i]; + Atom *productAtom = product->getAtomWithIdx(productAtomIdx); + CHECK_INVARIANT(reactantAtom->getChiralTag() == productAtom->getChiralTag(), + "invalid product chirality."); + + if(reactAtomDegree != product->getAtomDegree(productAtom) ){ + // If the number of bonds to the atom has changed in the course of the + // reaction we're lost, so remove chirality. + // A word of explanation here: the atoms in the chiralAtomsToCheck set are + // not explicitly mapped atoms of the reaction, so we really have no idea what + // to do with this case. At the moment I'm not even really sure how this + // could happen, but better safe than sorry. + productAtom->setChiralTag(Atom::CHI_UNSPECIFIED); + } + else if(reactantAtom->getChiralTag() == Atom::CHI_TETRAHEDRAL_CW || + reactantAtom->getChiralTag() == Atom::CHI_TETRAHEDRAL_CCW){ + // this will contain the indices of product bonds in the + // reactant order: + INT_LIST newOrder; + ROMol::OEDGE_ITER beg,end; + boost::tie(beg,end) = reactantAtom->getOwningMol().getAtomBonds(reactantAtom); + while(beg!=end){ + const BOND_SPTR reactantBond = reactantAtom->getOwningMol()[*beg]; + unsigned int oAtomIdx = reactantBond->getOtherAtomIdx(reactantAtom->getIdx()); + CHECK_INVARIANT(mapping->reactProdAtomMap.find(oAtomIdx) != mapping->reactProdAtomMap.end(), + "other atom from bond not mapped."); + const Bond *productBond; + unsigned neighborBondIdx = mapping->reactProdAtomMap[oAtomIdx][i]; + productBond = product->getBondBetweenAtoms(productAtom->getIdx(),neighborBondIdx); + CHECK_INVARIANT(productBond,"no matching bond found in product"); + newOrder.push_back(productBond->getIdx()); + ++beg; + } + int nSwaps=productAtom->getPerturbationOrder(newOrder); + if(nSwaps%2){ + productAtom->invertChirality(); + } + } + else { + // not tetrahedral chirality, don't do anything. + } + } + } // end of loop over chiralAtomsToCheck + } + + void generateProductConformers(Conformer *productConf, const ROMol& reactant, + ReactantProductAtomMapping* mapping) + { + if(!reactant.getNumConformers()){ + return; + } + const Conformer &reactConf=reactant.getConformer(); + if(reactConf.is3D()){ + productConf->set3D(true); + } + for(std::map >::const_iterator pr = mapping->reactProdAtomMap.begin(); + pr!=mapping->reactProdAtomMap.end();++pr){ + std::vector prodIdxs = pr->second; + if(prodIdxs.size()>1){ + BOOST_LOG(rdWarningLog) << "reactant atom match more than one product atom, coordinates need to be revised\n"; + } + // is this reliable when multiple product atom mapping occurs???? + for(unsigned i = 0; i < prodIdxs.size(); i++){ + productConf->setAtomPos(prodIdxs[i],reactConf.getAtomPos(pr->first)); + } + } + } + + + void addReactantAtomsAndBonds(const ChemicalReaction& rxn, + RWMOL_SPTR product,const ROMOL_SPTR reactantSptr, + const MatchVectType &match, + const ROMOL_SPTR reactantTemplate, + Conformer *productConf) + { + // start by looping over all matches and marking the reactant atoms that + // have already been "added" by virtue of being in the product. We'll also + // mark "skipped" atoms: those that are in the match, but not in this + // particular product (or, perhaps, not in any product) + // At the same time we'll set up a map between the indices of those + // atoms and their index in the product. + ReactantProductAtomMapping* mapping = + getAtomMappingsReactantProduct(match,*reactantTemplate,product,reactantSptr->getNumAtoms()); + + boost::dynamic_bitset<> visitedAtoms(reactantSptr->getNumAtoms()); + + const ROMol *reactant=reactantSptr.get(); + + // ---------- ---------- ---------- ---------- ---------- ---------- + // Loop over the bonds in the product and look for those that have + // the NullBond property set. These are bonds for which no information + // (other than their existance) was provided in the template: + setReactantBondPropertiesToProduct(product, *reactant, mapping); + + // ---------- ---------- ---------- ---------- ---------- ---------- + // Loop over the atoms in the match that were added to the product + // From the corresponding atom in the reactant, do a graph traversal + // to find other connected atoms that should be added: + + std::vector chiralAtomsToCheck; + for(unsigned matchIdx=0; matchIdxmappedAtoms[reactantAtomIdx]){ + CHECK_INVARIANT(mapping->reactProdAtomMap.find(reactantAtomIdx)!=mapping->reactProdAtomMap.end(), + "mapped reactant atom not present in product."); + + const Atom *reactantAtom=reactant->getAtomWithIdx(reactantAtomIdx); + for(unsigned i = 0; i < mapping->reactProdAtomMap[reactantAtomIdx].size(); i++){ + // here's a pointer to the atom in the product: + unsigned productAtomIdx = mapping->reactProdAtomMap[reactantAtomIdx][i]; + Atom *productAtom = product->getAtomWithIdx(productAtomIdx); + setReactantAtomPropertiesToProduct(productAtom, *reactantAtom,rxn.getImplicitPropertiesFlag()); + } + // now traverse: + addReactantNeighborsToProduct(*reactant, *reactantAtom, product, visitedAtoms, + chiralAtomsToCheck, mapping); + + // now that we've added all the reactant's neighbors, check to see if + // it is chiral in the reactant but is not in the reaction. If so + // we need to worry about its chirality + checkAndCorrectChiralityOfMatchingAtomsInProduct(*reactant, reactantAtomIdx, *reactantAtom, product, mapping); + } + } // end of loop over matched atoms + + // ---------- ---------- ---------- ---------- ---------- ---------- + // now we need to loop over atoms from the reactants that were chiral but not + // directly involved in the reaction in order to make sure their chirality hasn't + // been disturbed + checkAndCorrectChiralityOfProduct(chiralAtomsToCheck, product, mapping); + + // ---------- ---------- ---------- ---------- ---------- ---------- + // finally we may need to set the coordinates in the product conformer: + if(productConf){ + productConf->resize(product->getNumAtoms()); + generateProductConformers(productConf, *reactant, mapping); + } + } // end of addReactantAtomsAndBonds + + + MOL_SPTR_VECT generateOneProductSet(const ChemicalReaction& rxn, + const MOL_SPTR_VECT& reactants, + const std::vector &reactantsMatch) + { + PRECONDITION(reactants.size() == reactantsMatch.size(),"vector size mismatch"); + + // if any of the reactants have a conformer, we'll go ahead and + // generate conformers for the products: + bool doConfs=false; + BOOST_FOREACH(ROMOL_SPTR reactant,reactants){ + if(reactant->getNumConformers()){ + doConfs=true; + break; + } + } + + MOL_SPTR_VECT res; + res.resize(rxn.getNumProductTemplates()); + unsigned int prodId=0; + for(MOL_SPTR_VECT::const_iterator pTemplIt = rxn.beginProductTemplates(); + pTemplIt != rxn.endProductTemplates(); ++pTemplIt){ + // copy product template and its properties to a new product RWMol + RWMOL_SPTR product = initProduct(*pTemplIt); + Conformer *conf = 0; + if(doConfs){ + conf = new Conformer(); + conf->set3D(false); + } + + unsigned int reactantId = 0; + for(MOL_SPTR_VECT::const_iterator iter = rxn.beginReactantTemplates(); + iter != rxn.endReactantTemplates(); ++iter, reactantId++){ + addReactantAtomsAndBonds(rxn, product, reactants.at(reactantId), + reactantsMatch.at(reactantId), + *iter, conf); + } + product->clearAllAtomBookmarks(); + if(doConfs){ + product->addConformer(conf,true); + } + res[prodId] = product; + ++prodId; + } + return res; + } + }// end namespace RectionRunnerUtils + + std::vector run_Reactants(const ChemicalReaction& rxn, const MOL_SPTR_VECT& reactants) { + if(!rxn.isInitialized()) { + throw ChemicalReactionException("initMatchers() must be called before runReactants()"); + } + if(reactants.size() != rxn.getNumReactantTemplates()){ + throw ChemicalReactionException("Number of reactants provided does not match number of reactant templates."); + } + BOOST_FOREACH(ROMOL_SPTR msptr,reactants){ + CHECK_INVARIANT(msptr,"bad molecule in reactants"); + } + + std::vector productMols; + productMols.clear(); + + // if we have no products, return now: + if(!rxn.getNumProductTemplates()){ + return productMols; + } + + // find the matches for each reactant: + VectVectMatchVectType matchesByReactant; + if(!ReactionRunnerUtils::getReactantMatches(reactants, rxn, matchesByReactant)){ + // some reactants didn't find a match, return an empty product list: + return productMols; + } + // ------------------------------------------------------- + // we now have matches for each reactant, so we can start creating products: + // start by doing the combinatorics on the matches: + VectVectMatchVectType reactantMatchesPerProduct; + ReactionRunnerUtils::generateReactantCombinations(matchesByReactant,reactantMatchesPerProduct); + productMols.resize(reactantMatchesPerProduct.size()); + + for(unsigned int productId=0;productId!=productMols.size();++productId){ + MOL_SPTR_VECT lProds = ReactionRunnerUtils::generateOneProductSet(rxn, reactants,reactantMatchesPerProduct[productId]); + productMols[productId]=lProds; + } + + return productMols; + } // end of ChemicalReaction::runReactants() + + +} // end of RDKit namespace diff --git a/Code/GraphMol/ChemReactions/ReactionRunner.h b/Code/GraphMol/ChemReactions/ReactionRunner.h new file mode 100644 index 000000000..c631ef189 --- /dev/null +++ b/Code/GraphMol/ChemReactions/ReactionRunner.h @@ -0,0 +1,59 @@ +// +// Copyright (c) 2014, Novartis Institutes for BioMedical Research Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following +// disclaimer in the documentation and/or other materials provided +// with the distribution. +// * Neither the name of Novartis Institutes for BioMedical Research Inc. +// nor the names of its contributors may be used to endorse or promote +// products derived from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// + +#ifndef RD_REACTION_RUNNER_H +#define RD_REACTION_RUNNER_H + + +#include +#include + +namespace RDKit{ + //! Runs the reaction on a set of reactants + /*! + \param rxn: the template reaction we are interested + \param reactants: the reactants to be used. The length of this must be equal to + rxn->getNumReactantTemplates() + Caution: The order of the reactant templates determines the order of the reactants! + + \return a vector of vectors of products. Each subvector will be + rxn->getNumProductTemplates() long. + + We return a vector of vectors of products because each individual template may + map multiple times onto its reactant. This leads to multiple possible result + sets. + */ + std::vector run_Reactants(const ChemicalReaction& rxn, const MOL_SPTR_VECT& reactants); + +} // end of RDKit namespace + + +#endif diff --git a/Code/GraphMol/ChemReactions/ReactionUtils.cpp b/Code/GraphMol/ChemReactions/ReactionUtils.cpp new file mode 100644 index 000000000..1d8df9448 --- /dev/null +++ b/Code/GraphMol/ChemReactions/ReactionUtils.cpp @@ -0,0 +1,359 @@ +// $Id$ +// +// Copyright (c) 2014, Novartis Institutes for BioMedical Research Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following +// disclaimer in the documentation and/or other materials provided +// with the distribution. +// * Neither the name of Novartis Institutes for BioMedical Research Inc. +// nor the names of its contributors may be used to endorse or promote +// products derived from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// + +#include +#include +#include +#include +#include + +namespace RDKit { + +MOL_SPTR_VECT::const_iterator getStartIterator( + const ChemicalReaction &rxn, + ReactionMoleculeType t) +{ + MOL_SPTR_VECT::const_iterator begin; + if(t == Reactant){ + begin = rxn.beginReactantTemplates(); + } + if(t == Product){ + begin = rxn.beginProductTemplates();; + } + if(t == Agent){ + begin = rxn.beginAgentTemplates(); + } + return begin; +} + +MOL_SPTR_VECT::const_iterator getEndIterator( + const ChemicalReaction &rxn, + ReactionMoleculeType t) +{ + MOL_SPTR_VECT::const_iterator end; + if(t == Reactant){ + end = rxn.endReactantTemplates(); + } + if(t == Product){ + end = rxn.endProductTemplates();; + } + if(t == Agent){ + end = rxn.endAgentTemplates(); + } + return end; +} + + +namespace { + +unsigned getReactionMoleculeTemplatesNumAtoms( + const RDKit::ChemicalReaction &rxn, + RDKit::ReactionMoleculeType t, + bool onlyHeavy) +{ + unsigned numAtoms=0; + RDKit::MOL_SPTR_VECT::const_iterator begin = getStartIterator(rxn, t); + RDKit::MOL_SPTR_VECT::const_iterator end = getEndIterator(rxn, t); + + for(; begin != end; ++begin){ + if(onlyHeavy){ + numAtoms += begin->get()->getNumHeavyAtoms(); + } + else{ + numAtoms += begin->get()->getNumAtoms(); + } + } + return numAtoms; +} + +unsigned getReactionMoleculeTemplatesNumBonds( + const RDKit::ChemicalReaction &rxn, + RDKit::ReactionMoleculeType t, + bool onlyHeavy) +{ + unsigned numBonds=0; + RDKit::MOL_SPTR_VECT::const_iterator begin = getStartIterator(rxn, t); + RDKit::MOL_SPTR_VECT::const_iterator end = getEndIterator(rxn, t); + + for(; begin != end; ++begin){ + numBonds += begin->get()->getNumBonds(onlyHeavy); + } + return numBonds; +} + +double getReactionMoleculeTemplatesMW( + const RDKit::ChemicalReaction &rxn, + RDKit::ReactionMoleculeType t, + bool onlyHeavy) +{ + double mw=0.0; + RDKit::MOL_SPTR_VECT::const_iterator begin = getStartIterator(rxn, t); + RDKit::MOL_SPTR_VECT::const_iterator end = getEndIterator(rxn, t); + + for(; begin != end; ++begin){ + mw += RDKit::Descriptors::calcAMW(*begin->get(),onlyHeavy); + } + return mw; +} + +unsigned getReactionMoleculeTemplatesNumRings( + const RDKit::ChemicalReaction &rxn, + RDKit::ReactionMoleculeType t) +{ + unsigned numRings=0; + RDKit::MOL_SPTR_VECT::const_iterator begin = getStartIterator(rxn, t); + RDKit::MOL_SPTR_VECT::const_iterator end = getEndIterator(rxn, t); + + for(; begin != end; ++begin){ + if(begin->get()->getRingInfo()->isInitialized()){ + numRings += begin->get()->getRingInfo()->numRings(); + } + else{ + begin->get()->updatePropertyCache(); + RDKit::MolOps::findSSSR(*begin->get()); + numRings += begin->get()->getRingInfo()->numRings(); + } + } + return numRings; +} + +bool hasReactionMoleculeTemplateSubstructMatch( + const RDKit::ChemicalReaction &rxn, + const RDKit::ChemicalReaction &query_rxn, + RDKit::ReactionMoleculeType t) +{ + for(RDKit::MOL_SPTR_VECT::const_iterator begin = getStartIterator(rxn, t); + begin != getEndIterator(rxn, t); ++begin){ + for(RDKit::MOL_SPTR_VECT::const_iterator begin_query = getStartIterator(query_rxn, t); + begin_query != getEndIterator(query_rxn, t); ++begin_query){ + MatchVectType tvect; + if(SubstructMatch(*begin->get(), *begin_query->get(),tvect )){ + return true; + } + } + } + return false; +} + +} + +unsigned getReactantTemplatesNumAtoms(const ChemicalReaction &rxn, bool onlyHeavy) +{ + return getReactionMoleculeTemplatesNumAtoms(rxn, Reactant, onlyHeavy); +} + +unsigned getProductTemplatesNumAtoms(const ChemicalReaction &rxn, bool onlyHeavy) +{ + return getReactionMoleculeTemplatesNumAtoms(rxn, Product, onlyHeavy); +} + +unsigned getAgentTemplatesNumAtoms(const ChemicalReaction &rxn, bool onlyHeavy) +{ + return getReactionMoleculeTemplatesNumAtoms(rxn, Agent, onlyHeavy); +} + +unsigned getReactionNumAtoms(const ChemicalReaction &rxn, bool onlyHeavy, bool includeAgents) +{ + if(includeAgents){ + return (getReactantTemplatesNumAtoms(rxn, onlyHeavy) + + getProductTemplatesNumAtoms(rxn, onlyHeavy) + + getAgentTemplatesNumAtoms(rxn, onlyHeavy)); + } + return (getReactantTemplatesNumAtoms(rxn, onlyHeavy) + + getProductTemplatesNumAtoms(rxn, onlyHeavy)); + +} + +unsigned getReactantTemplatesNumBonds(const ChemicalReaction &rxn, bool onlyHeavy) +{ + return getReactionMoleculeTemplatesNumBonds(rxn, Reactant, onlyHeavy); +} + +unsigned getProductTemplatesNumBonds(const ChemicalReaction &rxn, bool onlyHeavy) +{ + return getReactionMoleculeTemplatesNumBonds(rxn, Product, onlyHeavy); +} + +unsigned getAgentTemplatesNumBonds(const ChemicalReaction &rxn, bool onlyHeavy) +{ + return getReactionMoleculeTemplatesNumBonds(rxn, Agent, onlyHeavy); +} + +unsigned getReactionNumBonds(const ChemicalReaction &rxn, bool onlyHeavy, bool includeAgents) +{ + if(includeAgents){ + return (getReactantTemplatesNumBonds(rxn, onlyHeavy) + + getProductTemplatesNumBonds(rxn, onlyHeavy) + + getAgentTemplatesNumBonds(rxn, onlyHeavy)); + } + return (getReactantTemplatesNumBonds(rxn, onlyHeavy) + + getProductTemplatesNumBonds(rxn, onlyHeavy)); +} + + +double calcReactantTemplatesMW(const ChemicalReaction &rxn, bool onlyHeavy) +{ + return getReactionMoleculeTemplatesMW(rxn, Reactant, onlyHeavy); +} + +double calcProductTemplatesMW(const ChemicalReaction &rxn, bool onlyHeavy) +{ + return getReactionMoleculeTemplatesMW(rxn, Product, onlyHeavy); +} + +double calcAgentTemplatesMW(const ChemicalReaction &rxn, bool onlyHeavy) +{ + return getReactionMoleculeTemplatesMW(rxn, Agent, onlyHeavy); +} + +double calcReactionMW(const ChemicalReaction &rxn, bool onlyHeavy, bool includeAgents) +{ + if(includeAgents){ + return(calcReactantTemplatesMW(rxn, onlyHeavy) + + calcProductTemplatesMW(rxn, onlyHeavy) + + calcAgentTemplatesMW(rxn, onlyHeavy)); + } + return(calcReactantTemplatesMW(rxn, onlyHeavy) + + calcProductTemplatesMW(rxn, onlyHeavy)); +} + +unsigned getReactantTemplatesNumRings(const ChemicalReaction &rxn) +{ + return getReactionMoleculeTemplatesNumRings(rxn, Reactant); +} + +unsigned getProductTemplatesNumRings(const ChemicalReaction &rxn) +{ + return getReactionMoleculeTemplatesNumRings(rxn, Product); +} + +unsigned getAgentTemplatesNumRings(const ChemicalReaction &rxn) +{ + return getReactionMoleculeTemplatesNumRings(rxn, Agent); +} + +unsigned getReactionNumRings(const ChemicalReaction &rxn, bool includeAgents) +{ + if(includeAgents){ + return(getReactantTemplatesNumRings(rxn) + + getProductTemplatesNumRings(rxn) + + getAgentTemplatesNumRings(rxn)); + } + return(getReactantTemplatesNumRings(rxn) + + getProductTemplatesNumRings(rxn)); +} + +bool hasReactantTemplateSubstructMatch( + const ChemicalReaction &rxn, + const ChemicalReaction &query_rxn) +{ + if(rxn.getNumReactantTemplates() < query_rxn.getNumReactantTemplates()){ + return false; + } + if(query_rxn.getNumReactantTemplates() == 0){ + return true; + } + return hasReactionMoleculeTemplateSubstructMatch(rxn, query_rxn, Reactant); +} + +bool hasProductTemplateSubstructMatch( + const ChemicalReaction &rxn, + const ChemicalReaction &query_rxn) +{ + if(rxn.getNumProductTemplates() < query_rxn.getNumProductTemplates()){ + return false; + } + if(query_rxn.getNumProductTemplates() == 0){ + return true; + } + return hasReactionMoleculeTemplateSubstructMatch(rxn, query_rxn, Product); +} + +bool hasAgentTemplateSubstructMatch( + const ChemicalReaction &rxn, + const ChemicalReaction &query_rxn) +{ + if(rxn.getNumAgentTemplates() < query_rxn.getNumAgentTemplates()){ + return false; + } + if(query_rxn.getNumAgentTemplates() == 0){ + return true; + } + return hasReactionMoleculeTemplateSubstructMatch(rxn, query_rxn, Agent); +} + +bool hasReactionSubstructMatch( + const ChemicalReaction &rxn, + const ChemicalReaction &query_rxn, bool includeAgents) +{ + if(includeAgents){ + return (hasReactantTemplateSubstructMatch(rxn, query_rxn) && + hasProductTemplateSubstructMatch(rxn, query_rxn) && + hasAgentTemplateSubstructMatch(rxn, query_rxn)); + } + return (hasReactantTemplateSubstructMatch(rxn, query_rxn) && + hasProductTemplateSubstructMatch(rxn, query_rxn)); +} + +bool hasReactionAtomMapping(const ChemicalReaction &rxn) +{ + RDKit::MOL_SPTR_VECT::const_iterator begin = getStartIterator(rxn, Reactant); + RDKit::MOL_SPTR_VECT::const_iterator end = getEndIterator(rxn, Reactant); + for(; begin != end; ++begin){ + const ROMol &reactant = *begin->get(); + if(MolOps::getNumAtomsWithDistinctProperty(reactant, "molAtomMapNumber")){ + return true; + } + } + begin = getStartIterator(rxn, Product); + end = getEndIterator(rxn, Product); + for(; begin != end; ++begin){ + const ROMol &reactant = *begin->get(); + if(MolOps::getNumAtomsWithDistinctProperty(reactant, "molAtomMapNumber")){ + return true; + } + } + return false; +} + +bool isReactionTemplateMoleculeAgent(const ROMol &mol, double agentThreshold) +{ + unsigned numMappedAtoms = MolOps::getNumAtomsWithDistinctProperty(mol, "molAtomMapNumber"); + unsigned numAtoms = mol.getNumHeavyAtoms(); + if(numAtoms > 0 && + static_cast(numMappedAtoms)/static_cast(numAtoms) >= agentThreshold){ + return false; + } + return true; +} + +} // end of RDKit namespace diff --git a/Code/GraphMol/ChemReactions/ReactionUtils.h b/Code/GraphMol/ChemReactions/ReactionUtils.h new file mode 100644 index 000000000..c45ee1ed6 --- /dev/null +++ b/Code/GraphMol/ChemReactions/ReactionUtils.h @@ -0,0 +1,94 @@ +// +// Copyright (c) 2014, Novartis Institutes for BioMedical Research Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following +// disclaimer in the documentation and/or other materials provided +// with the distribution. +// * Neither the name of Novartis Institutes for BioMedical Research Inc. +// nor the names of its contributors may be used to endorse or promote +// products derived from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// + +#ifndef __RD_REACTION_UTILS_H +#define __RD_REACTION_UTILS_H + +#include + +namespace RDKit{ + + enum ReactionMoleculeType{ + Reactant, + Product, + Agent + }; + + MOL_SPTR_VECT::const_iterator getStartIterator( + const ChemicalReaction &rxn, + ReactionMoleculeType t); + MOL_SPTR_VECT::const_iterator getEndIterator( + const ChemicalReaction &rxn, + ReactionMoleculeType t); + + unsigned getReactantTemplatesNumAtoms(const ChemicalReaction &rxn, bool onlyHeavy=true); + unsigned getProductTemplatesNumAtoms(const ChemicalReaction &rxn, bool onlyHeavy=true); + unsigned getAgentTemplatesNumAtoms(const ChemicalReaction &rxn, bool onlyHeavy=true); + unsigned getReactionNumAtoms(const ChemicalReaction &rxn, bool onlyHeavy=true, bool includeAgents=false); + + unsigned getReactantTemplatesNumBonds(const ChemicalReaction &rxn, bool onlyHeavy=true); + unsigned getProductTemplatesNumBonds(const ChemicalReaction &rxn, bool onlyHeavy=true); + unsigned getAgentTemplatesNumBonds(const ChemicalReaction &rxn, bool onlyHeavy=true); + unsigned getReactionNumBonds(const ChemicalReaction &rxn, bool onlyHeavy=true, bool includeAgents=false); + + double calcReactantTemplatesMW(const ChemicalReaction &rxn, bool onlyHeavy=true); + double calcProductTemplatesMW(const ChemicalReaction &rxn, bool onlyHeavy=true); + double calcAgentTemplatesMW(const ChemicalReaction &rxn, bool onlyHeavy=true); + double calcReactionMW(const ChemicalReaction &rxn, bool onlyHeavy=true, bool includeAgents=false); + + unsigned getReactantTemplatesNumRings(const ChemicalReaction &rxn); + unsigned getProductTemplatesNumRings(const ChemicalReaction &rxn); + unsigned getAgentTemplatesNumRings(const ChemicalReaction &rxn); + unsigned getReactionNumRings(const ChemicalReaction &rxn, bool includeAgents=false); + + bool hasReactantTemplateSubstructMatch( + const ChemicalReaction &rxn, + const ChemicalReaction &query_rxn); + + bool hasProductTemplateSubstructMatch( + const ChemicalReaction &rxn, + const ChemicalReaction &query_rxn); + + bool hasAgentTemplateSubstructMatch( + const ChemicalReaction &rxn, + const ChemicalReaction &query_rxn); + + bool hasReactionSubstructMatch( + const ChemicalReaction &rxn, + const ChemicalReaction &query_rxn, bool includeAgents=false); + + bool hasReactionAtomMapping(const ChemicalReaction &rxn); + + bool isReactionTemplateMoleculeAgent(const ROMol &mol, double agentThreshold); + +} // end of RDKit namespace + +#endif diff --git a/Code/GraphMol/ChemReactions/ReactionWriter.cpp b/Code/GraphMol/ChemReactions/ReactionWriter.cpp index 9fa26eda4..2e3e6b8b7 100644 --- a/Code/GraphMol/ChemReactions/ReactionWriter.cpp +++ b/Code/GraphMol/ChemReactions/ReactionWriter.cpp @@ -1,6 +1,6 @@ // $Id$ // -// Copyright (c) 2010, Novartis Institutes for BioMedical Research Inc. +// Copyright (c) 2010-2014, Novartis Institutes for BioMedical Research Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without @@ -34,34 +34,85 @@ #include #include #include +#include #include +namespace{ + +void setRXNRoleOfAllMoleculeAtoms(RDKit::ROMol &mol, int role) +{ + RDKit::ROMol::ATOM_ITER_PAIR atItP = mol.getVertices(); + while(atItP.first != atItP.second ){ + RDKit::Atom *oAtom=mol[*(atItP.first++)].get(); + oAtom->setProp("molRxnRole", role); + } +} + +std::string molToString(RDKit::ROMol &mol, bool toSmiles) +{ + if(toSmiles){ + return MolToSmiles(mol,true); + } + return MolToSmarts(mol,true); +} + +std::string ChemicalReactionToRxnToString(RDKit::ChemicalReaction &rxn, bool toSmiles) +{ + std::string res=""; + for(RDKit::MOL_SPTR_VECT::const_iterator iter=rxn.beginReactantTemplates(); + iter != rxn.endReactantTemplates();++iter){ + if(iter!=rxn.beginReactantTemplates()){ + res +="."; + } + res += molToString(**iter, toSmiles); + } + res += ">"; + for(RDKit::MOL_SPTR_VECT::const_iterator iter=rxn.beginAgentTemplates(); + iter != rxn.endAgentTemplates();++iter){ + if(iter!=rxn.beginAgentTemplates()){ + res +="."; + } + res += molToString(**iter, toSmiles); + } + res += ">"; + for(RDKit::MOL_SPTR_VECT::const_iterator iter=rxn.beginProductTemplates(); + iter != rxn.endProductTemplates();++iter){ + if(iter!=rxn.beginProductTemplates()){ + res +="."; + } + res += molToString(**iter, toSmiles); + } + return res; +} +} + namespace RDKit { //! returns the reaction SMARTS for a reaction std::string ChemicalReactionToRxnSmarts(ChemicalReaction &rxn){ - std::string res=""; - for(MOL_SPTR_VECT::const_iterator iter=rxn.beginReactantTemplates(); - iter != rxn.endReactantTemplates();++iter){ - if(iter!=rxn.beginReactantTemplates()) res +="."; - res += MolToSmarts(**iter,true); - } - res += ">>"; - for(MOL_SPTR_VECT::const_iterator iter=rxn.beginProductTemplates(); - iter != rxn.endProductTemplates();++iter){ - if(iter!=rxn.beginProductTemplates()) res +="."; - res += MolToSmarts(**iter,true); - } - return res; + return ChemicalReactionToRxnToString(rxn, false); }; + + //! returns the reaction SMILES for a reaction + std::string ChemicalReactionToRxnSmiles(ChemicalReaction &rxn){ + return ChemicalReactionToRxnToString(rxn, true); + }; + #if 1 //! returns an RXN block for a reaction - std::string ChemicalReactionToRxnBlock(const ChemicalReaction &rxn){ + std::string ChemicalReactionToRxnBlock(const ChemicalReaction &rxn, bool separateAgents){ std::ostringstream res; res<<"$RXN\n\n RDKit\n\n"; - res<get(), 1); + res->insertMol(*iter->get()); + } + for(MOL_SPTR_VECT::const_iterator iter=rxn.beginProductTemplates(); + iter != rxn.endProductTemplates();++iter){ + setRXNRoleOfAllMoleculeAtoms(*iter->get(), 2); + res->insertMol(*iter->get()); + } + for(MOL_SPTR_VECT::const_iterator iter=rxn.beginAgentTemplates(); + iter != rxn.endAgentTemplates();++iter){ + setRXNRoleOfAllMoleculeAtoms(*iter->get(), 3); + res->insertMol(*iter->get()); + } + return (ROMol *)res; + } + } diff --git a/Code/GraphMol/ChemReactions/Wrap/rdChemReactions.cpp b/Code/GraphMol/ChemReactions/Wrap/rdChemReactions.cpp index 5d2451a2f..f52533c47 100644 --- a/Code/GraphMol/ChemReactions/Wrap/rdChemReactions.cpp +++ b/Code/GraphMol/ChemReactions/Wrap/rdChemReactions.cpp @@ -1,6 +1,6 @@ // $Id$ // -// Copyright (c) 2007, Novartis Institutes for BioMedical Research Inc. +// Copyright (c) 2007-2014, Novartis Institutes for BioMedical Research Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without @@ -39,6 +39,8 @@ #include #include #include +#include +#include namespace python = boost::python; @@ -125,6 +127,49 @@ namespace RDKit { ROMol *res = const_cast(iter->get()); return res; } + ROMol * GetAgentTemplate(const ChemicalReaction *self,unsigned int which){ + if(which>=self->getNumAgentTemplates()){ + throw_value_error("requested template index too high"); + } + MOL_SPTR_VECT::const_iterator iter=self->beginAgentTemplates(); + iter += which; + ROMol *res = const_cast(iter->get()); + return res; + } + + void RemoveUnmappedReactantTemplates(ChemicalReaction *self, double thresholdUnmappedAtoms, bool moveToAgentTemplates, + python::object targetList){ + if(targetList==python::object()){ + self->removeUnmappedReactantTemplates(thresholdUnmappedAtoms, moveToAgentTemplates); + } + else{ + MOL_SPTR_VECT tmp; + self->removeUnmappedReactantTemplates(thresholdUnmappedAtoms, moveToAgentTemplates, &tmp); + python::list molList = python::extract(targetList); + if(tmp.size() > 0){ + for(unsigned int i = 0; i < tmp.size(); i++){ + molList.append(tmp.at(i)); + } + } + } + } + + void RemoveUnmappedProductTemplates(ChemicalReaction *self, double thresholdUnmappedAtoms, bool moveToAgentTemplates, + python::object targetList){ + if(targetList==python::object()){ + self->removeUnmappedProductTemplates(thresholdUnmappedAtoms, moveToAgentTemplates); + } + else{ + MOL_SPTR_VECT tmp; + self->removeUnmappedProductTemplates(thresholdUnmappedAtoms, moveToAgentTemplates, &tmp); + python::list molList = python::extract(targetList); + if(tmp.size() > 0){ + for(unsigned int i = 0; i < tmp.size(); i++){ + molList.append(tmp.at(i)); + } + } + } + } void Compute2DCoordsForReaction(RDKit::ChemicalReaction &rxn, double spacing=2.0, @@ -155,6 +200,10 @@ namespace RDKit { unsigned int which; return isMoleculeProductOfReaction(rxn,mol,which); } + bool IsMoleculeAgentOfReaction(const ChemicalReaction &rxn,const ROMol &mol){ + unsigned int which; + return isMoleculeAgentOfReaction(rxn,mol,which); + } ChemicalReaction *ReactionFromSmarts(const char *smarts, @@ -221,7 +270,28 @@ BOOST_PYTHON_MODULE(rdChemReactions) { python::register_exception_translator(&rdChemicalReactionParserExceptionTranslator); python::register_exception_translator(&rdChemicalReactionExceptionTranslator); - + + python::enum_("FingerprintType") + .value("AtomPairFP", RDKit::AtomPairFP) + .value("TopologicalTorsion", RDKit::TopologicalTorsion) + .value("MorganFP", RDKit::MorganFP) + .value("RDKitFP", RDKit::RDKitFP) + .value("PatternFP", RDKit::PatternFP) + ; + std::string docStringReactionFPParams = + "A class for storing parameters to manipulate the calculation of fingerprints of chemical reactions."; + + python::class_("ReactionFingerprintParams",docStringReactionFPParams.c_str(), + python::init<>("Constructor, takes no arguments")) + .def(python::init()) + .def_readwrite("fpSize", &RDKit::ReactionFingerprintParams::fpSize) + .def_readwrite("fpType", &RDKit::ReactionFingerprintParams::fpType) + .def_readwrite("bitRatioAgents", &RDKit::ReactionFingerprintParams::bitRatioAgents) + .def_readwrite("nonAgentWeight", &RDKit::ReactionFingerprintParams::nonAgentWeight) + .def_readwrite("agentWeight", &RDKit::ReactionFingerprintParams::agentWeight) + .def_readwrite("includeAgents", &RDKit::ReactionFingerprintParams::includeAgents) + ; + std::string docString = "A class for storing and applying chemical reactions.\n\ \n\ Sample Usage:\n\ @@ -243,10 +313,22 @@ Sample Usage:\n\ "returns the number of reactants this reaction expects") .def("GetNumProductTemplates",&RDKit::ChemicalReaction::getNumProductTemplates, "returns the number of products this reaction generates") + .def("GetNumAgentTemplates",&RDKit::ChemicalReaction::getNumAgentTemplates, + "returns the number of agents this reaction expects") .def("AddReactantTemplate",&RDKit::ChemicalReaction::addReactantTemplate, "adds a reactant (a Molecule) to the reaction") .def("AddProductTemplate",&RDKit::ChemicalReaction::addProductTemplate, "adds a product (a Molecule)") + .def("AddAgentTemplate",&RDKit::ChemicalReaction::addAgentTemplate, + "adds a agent (a Molecule)") + .def("RemoveUnmappedReactantTemplates",RDKit::RemoveUnmappedReactantTemplates, + (python::arg("self"), python::arg("thresholdUnmappedAtoms")=0.2,python::arg("moveToAgentTemplates")=true, + python::arg("targetList")=python::object()), + "Removes molecules with an atom mapping ratio below thresholdUnmappedAtoms from reactant templates to the agent templates or to a given targetList") + .def("RemoveUnmappedProductTemplates",RDKit::RemoveUnmappedProductTemplates, + (python::arg("self"), python::arg("thresholdUnmappedAtoms")=0.2,python::arg("moveToAgentTemplates")=true, + python::arg("targetList")=python::object()), + "Removes molecules with an atom mapping ratio below thresholdUnmappedAtoms from product templates to the agent templates or to a given targetList") .def("RunReactants",(PyObject *(*)(RDKit::ChemicalReaction *,python::tuple))RDKit::RunReactants, "apply the reaction to a sequence of reactant molecules and return the products as a tuple of tuples") .def("RunReactants",(PyObject *(*)(RDKit::ChemicalReaction *,python::list))RDKit::RunReactants, @@ -266,6 +348,10 @@ Sample Usage:\n\ (python::arg("self"),python::arg("which")), python::return_value_policy(), "returns one of our reactant templates") + .def("GetAgentTemplate",&RDKit::GetAgentTemplate, + (python::arg("self"),python::arg("which")), + python::return_value_policy(), + "returns one of our agent templates") .def("_setImplicitPropertiesFlag",&RDKit::ChemicalReaction::setImplicitPropertiesFlag, (python::arg("self"),python::arg("val")), "EXPERT USER: indicates that the reaction can have implicit properties") @@ -278,6 +364,8 @@ Sample Usage:\n\ "returns whether or not the molecule has a substructure match to one of the reactants.") .def("IsMoleculeProduct",RDKit::IsMoleculeProductOfReaction, "returns whether or not the molecule has a substructure match to one of the products.") + .def("IsMoleculeAgent",RDKit::IsMoleculeAgentOfReaction, + "returns whether or not the molecule has a substructure match to one of the agents.") .def("GetReactingAtoms",&RDKit::GetReactingAtoms, (python::arg("self"),python::arg("mappedAtomsOnly")=false), "returns a sequence of sequences with the atoms that change in the reaction") @@ -304,13 +392,23 @@ of the replacements argument.", python::def("ReactionFromRxnBlock",RDKit::RxnBlockToChemicalReaction, "construct a ChemicalReaction from an string in MDL rxn format", python::return_value_policy()); + python::def("ReactionFromMolecule",RDKit::RxnMolToChemicalReaction, + "construct a ChemicalReaction from an molecule if the RXN role property of the molecule is set", + python::return_value_policy()); python::def("ReactionToSmarts",RDKit::ChemicalReactionToRxnSmarts, (python::arg("reaction")), "construct a reaction SMARTS string for a ChemicalReaction"); - python::def("ReactionToRxnBlock",RDKit::ChemicalReactionToRxnBlock, + python::def("ReactionToSmiles",RDKit::ChemicalReactionToRxnSmiles, (python::arg("reaction")), + "construct a reaction SMILES string for a ChemicalReaction"); + python::def("ReactionToRxnBlock",RDKit::ChemicalReactionToRxnBlock, + (python::arg("reaction"), python::arg("separateAgents")=false), "construct a string in MDL rxn format for a ChemicalReaction"); + python::def("ReactionToMolecule",RDKit::ChemicalReactionToRxnMol, + (python::arg("reaction")), + "construct a molecule for a ChemicalReaction with RXN role property set", + python::return_value_policy()); docString = "Compute 2D coordinates for a reaction. \n\ ARGUMENTS: \n\n\ @@ -341,5 +439,82 @@ of the replacements argument.", python::arg("bondLength")=-1.0), docString.c_str()); + python::def("CreateDifferenceFingerprintForReaction",RDKit::DifferenceFingerprintChemReaction, + (python::arg("reaction"), + python::arg("ReactionFingerPrintParams")=RDKit::DefaultDifferenceFPParams), + "construct a difference fingerprint for a ChemicalReaction by subtracting the reactant " + "fingerprint from the product fingerprint", + python::return_value_policy()); + + python::def("CreateStructuralFingerprintForReaction",RDKit::StructuralFingerprintChemReaction, + (python::arg("reaction"), + python::arg("ReactionFingerPrintParams")=RDKit::DefaultStructuralFPParams), + "construct a structural fingerprint for a ChemicalReaction by concatenating the reactant " + "fingerprint and the product fingerprint", + python::return_value_policy()); + + python::def("IsReactionTemplateMoleculeAgent",RDKit::isReactionTemplateMoleculeAgent, + (python::arg("molecule"), python::arg("agentThreshold")), + "tests if a molecule can be classified as an agent depending on the ratio of mapped atoms and a give threshold"); + python::def("HasReactionAtomMapping",RDKit::hasReactionAtomMapping, + "tests if a reaction obtains any atom mapping"); + python::def("HasReactionSubstructMatch",RDKit::hasReactionSubstructMatch, + (python::arg("reaction"), python::arg("queryReaction"), python::arg("includeAgents")=false), + "tests if the queryReaction is a substructure of a reaction"); + python::def("HasAgentTemplateSubstructMatch",RDKit::hasAgentTemplateSubstructMatch, + (python::arg("reaction"), python::arg("queryReaction")), + "tests if the agents of a queryReaction are the same as those of a reaction"); + python::def("HasProductTemplateSubstructMatch",RDKit::hasProductTemplateSubstructMatch, + (python::arg("reaction"), python::arg("queryReaction")), + "tests if the products of a queryReaction are substructures of the products of a reaction"); + python::def("HasReactantTemplateSubstructMatch",RDKit::hasReactantTemplateSubstructMatch, + (python::arg("reaction"), python::arg("queryReaction")), + "tests if the reactants of a queryReaction are substructures of the reactants of a reaction"); + python::def("GetReactionNumRings",RDKit::getReactionNumRings, + (python::arg("reaction"), python::arg("includeAgents")=false), + "get the number of rings in a reaction template"); + python::def("GetAgentTemplatesNumRings",RDKit::getAgentTemplatesNumRings, + "get the number of rings found in the agents of a reaction template"); + python::def("getProductTemplatesNumRings",RDKit::getProductTemplatesNumRings, + "get the number of rings found in the products of a reaction template"); + python::def("getReactantTemplatesNumRings",RDKit::getReactantTemplatesNumRings, + "get the number of rings found in the reactants of a reaction template"); + python::def("CalcReactionMW",RDKit::calcReactionMW, + (python::arg("reaction"), python::arg("onlyHeavy")=true, python::arg("includeAgents")=false), + "calculates the molecular weight of a reaction template"); + python::def("CalcAgentTemplatesMW",RDKit::calcAgentTemplatesMW, + (python::arg("reaction"), python::arg("onlyHeavy")=true), + "calculates the molecular weight of the agents of a reaction template"); + python::def("CalcProductTemplatesMW",RDKit::calcProductTemplatesMW, + (python::arg("reaction"), python::arg("onlyHeavy")=true), + "calculates the molecular weight of the products of a reaction template"); + python::def("CalcReactantTemplatesMW",RDKit::calcReactantTemplatesMW, + (python::arg("reaction"), python::arg("onlyHeavy")=true), + "calculates the molecular weight of the reactants of a reaction template"); + python::def("GetReactionNumBonds",RDKit::getReactionNumBonds, + (python::arg("reaction"), python::arg("onlyHeavy")=true, python::arg("includeAgents")=false), + "returns the number of bonds of a reaction template"); + python::def("GetAgentTemplatesNumBonds",RDKit::getAgentTemplatesNumBonds, + (python::arg("reaction"), python::arg("onlyHeavy")=true), + "returns the number of bonds of the agents of a reaction template"); + python::def("GetProductTemplatesNumBonds",RDKit::getProductTemplatesNumBonds, + (python::arg("reaction"), python::arg("onlyHeavy")=true), + "returns the number of bonds of the products of a reaction template"); + python::def("GetReactantTemplatesNumBonds",RDKit::getReactantTemplatesNumBonds, + (python::arg("reaction"), python::arg("onlyHeavy")=true), + "returns the number of bonds of the reactants of a reaction template"); + python::def("GetReactionNumAtoms",RDKit::getReactionNumAtoms, + (python::arg("reaction"), python::arg("onlyHeavy")=true, python::arg("includeAgents")=false), + "returns the number of atoms of a reaction template"); + python::def("GetAgentTemplatesNumAtoms",RDKit::getAgentTemplatesNumAtoms, + (python::arg("reaction"), python::arg("onlyHeavy")=true), + "returns the number of atoms of the agents of a reaction template"); + python::def("GetProductTemplatesNumAtoms",RDKit::getProductTemplatesNumAtoms, + (python::arg("reaction"), python::arg("onlyHeavy")=true), + "returns the number of atoms of the products of a reaction template"); + python::def("GetReactantTemplatesNumAtoms",RDKit::getReactantTemplatesNumAtoms, + (python::arg("reaction"), python::arg("onlyHeavy")=true), + "returns the number of atoms of the reactants of a reaction template"); + } diff --git a/Code/GraphMol/ChemReactions/Wrap/testReactionWrapper.py b/Code/GraphMol/ChemReactions/Wrap/testReactionWrapper.py index febcfe1d5..06b1e2cd0 100644 --- a/Code/GraphMol/ChemReactions/Wrap/testReactionWrapper.py +++ b/Code/GraphMol/ChemReactions/Wrap/testReactionWrapper.py @@ -1,6 +1,6 @@ # $Id$ # -# Copyright (c) 2007, Novartis Institutes for BioMedical Research Inc. +# Copyright (c) 2007-2014, Novartis Institutes for BioMedical Research Inc. # All rights reserved. # # Redistribution and use in source and binary forms, with or without @@ -301,7 +301,11 @@ M END Chem.SanitizeMol(p[0]) def test10DotSeparation(self): - rxn = rdChemReactions.ReactionFromSmarts('[C:1]1[O:2][N:3]1>>[C:1]1[O:2].[N:3]1') + # 08/05/14 + # This test is changed due to a new behavior of the smarts + # reaction parser which now allows using parenthesis in products + # as well. original smiles: '[C:1]1[O:2][N:3]1>>[C:1]1[O:2].[N:3]1' + rxn = rdChemReactions.ReactionFromSmarts('[C:1]1[O:2][N:3]1>>([C:1]1[O:2].[N:3]1)') mol = Chem.MolFromSmiles('C1ON1') products = rxn.RunReactants([mol]) self.assertEqual(len(products),1) @@ -339,7 +343,11 @@ M END def test12Pickles(self): - rxn = rdChemReactions.ReactionFromSmarts('[C:1]1[O:2][N:3]1>>[C:1]1[O:2].[N:3]1') + # 08/05/14 + # This test is changed due to a new behavior of the smarts + # reaction parser which now allows using parenthesis in products + # as well. original smiles: '[C:1]1[O:2][N:3]1>>[C:1]1[O:2].[N:3]1' + rxn = rdChemReactions.ReactionFromSmarts('[C:1]1[O:2][N:3]1>>([C:1]1[O:2].[N:3]1)') pkl = cPickle.dumps(rxn) rxn = cPickle.loads(pkl) mol = Chem.MolFromSmiles('C1ON1') @@ -441,5 +449,36 @@ M END rxn.Initialize() self.assertRaises(ValueError,lambda : rxn.RunReactants((None,))) + def test19RemoveUnmappedMoleculesToAgents(self): + rxn = rdChemReactions.ReactionFromSmarts("[C:1]=[O:2].[N:3].C(=O)O>[OH2].[Na].[Cl]>[N:3]~[C:1]=[O:2]") + self.failUnless(rxn) + rxn.Initialize() + self.failUnless(rxn.GetNumReactantTemplates()==3) + self.failUnless(rxn.GetNumProductTemplates()==1) + self.failUnless(rxn.GetNumAgentTemplates()==3) + + rxn.RemoveUnmappedReactantTemplates() + rxn.RemoveUnmappedProductTemplates() + + self.failUnless(rxn.GetNumReactantTemplates()==2) + self.failUnless(rxn.GetNumProductTemplates()==1) + self.failUnless(rxn.GetNumAgentTemplates()==4) + + rxn = rdChemReactions.ReactionFromSmarts("[C:1]=[O:2].[N:3].C(=O)O>>[N:3]~[C:1]=[O:2].[OH2]") + self.failUnless(rxn) + rxn.Initialize() + self.failUnless(rxn.GetNumReactantTemplates()==3) + self.failUnless(rxn.GetNumProductTemplates()==2) + self.failUnless(rxn.GetNumAgentTemplates()==0) + + agentList=[] + rxn.RemoveUnmappedReactantTemplates(moveToAgentTemplates=False, targetList=agentList) + rxn.RemoveUnmappedProductTemplates(targetList=agentList) + + self.failUnless(rxn.GetNumReactantTemplates()==2) + self.failUnless(rxn.GetNumProductTemplates()==1) + self.failUnless(rxn.GetNumAgentTemplates()==1) + self.failUnless(len(agentList)==2) + if __name__ == '__main__': unittest.main() diff --git a/Code/GraphMol/ChemReactions/testData/rxn1.mol b/Code/GraphMol/ChemReactions/testData/rxn1.mol new file mode 100644 index 000000000..9344e2e23 --- /dev/null +++ b/Code/GraphMol/ChemReactions/testData/rxn1.mol @@ -0,0 +1,39 @@ +Reaction as molecule + RDKit 2D + + 18 16 0 0 0 0 0 0 0 0999 V2000 + -2.0042 -0.9333 0.0000 C 0 0 0 0 0 0 0 1 1 3 0 0 + -1.4340 -0.6042 0.0000 C 0 0 0 0 0 0 0 1 1 2 0 0 + -0.8639 -0.9333 0.0000 O 0 0 0 0 0 0 0 1 1 0 0 0 + -1.4340 0.0542 0.0000 O 0 0 0 0 0 0 0 1 1 1 0 0 + -2.0042 -1.5917 0.0000 N 0 0 0 0 0 0 0 1 1 4 0 0 + 2.1792 -0.9042 0.0000 C 0 0 0 0 0 0 0 1 2 7 0 0 + 2.7493 -0.5750 0.0000 C 0 0 0 0 0 0 0 1 2 6 0 0 + 3.3194 -0.9042 0.0000 O 0 0 0 0 0 0 0 1 2 0 0 0 + 2.7493 0.0833 0.0000 O 0 0 0 0 0 0 0 1 2 5 0 0 + 2.1792 -1.5625 0.0000 N 0 0 0 0 0 0 0 1 2 8 0 0 + 8.3875 -0.8083 0.0000 C 0 0 0 0 0 0 0 2 3 3 0 0 + 8.3875 -1.4667 0.0000 N 0 0 0 0 0 0 0 2 3 4 0 0 + 8.9579 -1.7958 0.0000 C 0 0 0 0 0 0 0 2 3 6 0 0 + 9.5282 -1.4667 0.0000 C 0 0 0 0 0 0 0 2 3 7 0 0 + 9.5282 -0.8083 0.0000 N 0 0 0 0 0 0 0 2 3 8 0 0 + 8.9579 -0.4792 0.0000 C 0 0 0 0 0 0 0 2 3 2 0 0 + 8.9579 0.1792 0.0000 O 0 0 0 0 0 0 0 2 3 1 0 0 + 8.9579 -2.4542 0.0000 O 0 0 0 0 0 0 0 2 3 5 0 0 + 1 2 1 0 + 2 4 2 0 + 2 3 1 0 + 1 5 1 0 + 6 7 1 0 + 7 9 2 0 + 7 8 1 0 + 6 10 1 0 + 12 13 1 0 + 13 14 1 0 + 14 15 1 0 + 15 16 1 0 + 11 12 1 0 + 16 17 2 0 + 11 16 1 0 + 13 18 2 0 +M END diff --git a/Code/GraphMol/ChemReactions/testData/rxn1_1.mol b/Code/GraphMol/ChemReactions/testData/rxn1_1.mol new file mode 100644 index 000000000..3db022010 --- /dev/null +++ b/Code/GraphMol/ChemReactions/testData/rxn1_1.mol @@ -0,0 +1,40 @@ +Reaction as molecule + RDKit 2D + + 18 17 0 0 0 0 0 0 0 0999 V2000 + -2.0042 -0.9333 0.0000 C 0 0 0 0 0 0 0 1 1 3 0 0 + -1.4340 -0.6042 0.0000 C 0 0 0 0 0 0 0 1 1 2 0 0 + -0.8639 -0.9333 0.0000 O 0 0 0 0 0 0 0 1 1 0 0 0 + -1.4340 0.0542 0.0000 O 0 0 0 0 0 0 0 1 1 1 0 0 + -2.0042 -1.5917 0.0000 N 0 0 0 0 0 0 0 1 1 4 0 0 + 2.1792 -0.9042 0.0000 C 0 0 0 0 0 0 0 1 2 7 0 0 + 2.7493 -0.5750 0.0000 C 0 0 0 0 0 0 0 1 2 6 0 0 + 3.3194 -0.9042 0.0000 O 0 0 0 0 0 0 0 1 2 0 0 0 + 2.7493 0.0833 0.0000 O 0 0 0 0 0 0 0 1 2 5 0 0 + 2.1792 -1.5625 0.0000 N 0 0 0 0 0 0 0 1 2 8 0 0 + 8.3875 -0.8083 0.0000 C 0 0 0 0 0 0 0 2 3 3 0 0 + 8.3875 -1.4667 0.0000 N 0 0 0 0 0 0 0 2 3 4 0 0 + 8.9579 -1.7958 0.0000 C 0 0 0 0 0 0 0 2 3 6 0 0 + 9.5282 -1.4667 0.0000 C 0 0 0 0 0 0 0 2 3 7 0 0 + 9.5282 -0.8083 0.0000 N 0 0 0 0 0 0 0 2 3 8 0 0 + 8.9579 -0.4792 0.0000 C 0 0 0 0 0 0 0 2 3 2 0 0 + 8.9579 0.1792 0.0000 O 0 0 0 0 0 0 0 2 3 1 0 0 + 8.9579 -2.4542 0.0000 O 0 0 0 0 0 0 0 2 3 5 0 0 + 1 2 1 0 + 2 4 2 0 + 2 3 1 0 + 1 5 1 0 + 6 7 1 0 + 7 9 2 0 + 7 8 1 0 + 6 10 1 0 + 12 13 1 0 + 13 14 1 0 + 14 15 1 0 + 15 16 1 0 + 11 12 1 0 + 16 17 2 0 + 11 16 1 0 + 13 18 2 0 + 10 11 1 0 +M END diff --git a/Code/GraphMol/ChemReactions/testData/rxn1_2.mol b/Code/GraphMol/ChemReactions/testData/rxn1_2.mol new file mode 100644 index 000000000..784e74975 --- /dev/null +++ b/Code/GraphMol/ChemReactions/testData/rxn1_2.mol @@ -0,0 +1,39 @@ +Reaction as molecule + RDKit 2D + + 18 16 0 0 0 0 0 0 0 0999 V2000 + -2.0042 -0.9333 0.0000 C 0 0 0 0 0 0 0 0 1 3 0 0 + -1.4340 -0.6042 0.0000 C 0 0 0 0 0 0 0 0 1 2 0 0 + -0.8639 -0.9333 0.0000 O 0 0 0 0 0 0 0 6 1 0 0 0 + -1.4340 0.0542 0.0000 O 0 0 0 0 0 0 0 0 1 1 0 0 + -2.0042 -1.5917 0.0000 N 0 0 0 0 0 0 0 0 1 4 0 0 + 2.1792 -0.9042 0.0000 C 0 0 0 0 0 0 0 1 2 7 0 0 + 2.7493 -0.5750 0.0000 C 0 0 0 0 0 0 0 1 2 6 0 0 + 3.3194 -0.9042 0.0000 O 0 0 0 0 0 0 0 1 2 0 0 0 + 2.7493 0.0833 0.0000 O 0 0 0 0 0 0 0 1 2 5 0 0 + 2.1792 -1.5625 0.0000 N 0 0 0 0 0 0 0 1 2 8 0 0 + 8.3875 -0.8083 0.0000 C 0 0 0 0 0 0 0 2 3 3 0 0 + 8.3875 -1.4667 0.0000 N 0 0 0 0 0 0 0 2 3 4 0 0 + 8.9579 -1.7958 0.0000 C 0 0 0 0 0 0 0 2 3 6 0 0 + 9.5282 -1.4667 0.0000 C 0 0 0 0 0 0 0 2 3 7 0 0 + 9.5282 -0.8083 0.0000 N 0 0 0 0 0 0 0 2 3 8 0 0 + 8.9579 -0.4792 0.0000 C 0 0 0 0 0 0 0 2 3 2 0 0 + 8.9579 0.1792 0.0000 O 0 0 0 0 0 0 0 2 3 1 0 0 + 8.9579 -2.4542 0.0000 O 0 0 0 0 0 0 0 2 3 5 0 0 + 1 2 1 0 + 2 4 2 0 + 2 3 1 0 + 1 5 1 0 + 6 7 1 0 + 7 9 2 0 + 7 8 1 0 + 6 10 1 0 + 12 13 1 0 + 13 14 1 0 + 14 15 1 0 + 15 16 1 0 + 11 12 1 0 + 16 17 2 0 + 11 16 1 0 + 13 18 2 0 +M END diff --git a/Code/GraphMol/ChemReactions/testData/rxn2.mol b/Code/GraphMol/ChemReactions/testData/rxn2.mol new file mode 100644 index 000000000..dda8f9d39 --- /dev/null +++ b/Code/GraphMol/ChemReactions/testData/rxn2.mol @@ -0,0 +1,41 @@ +$RXN + + RDKit + + 1 1 +$MOL + + RDKit + + 6 6 0 0 0 0 0 0 0 0999 V2000 + 0.0000 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 4 0 + 2 3 4 0 + 3 4 4 0 + 4 5 4 0 + 5 6 4 0 + 6 1 4 0 +M END +$MOL + + RDKit + + 6 6 0 0 0 0 0 0 0 0999 V2000 + 0.0000 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 0.0000 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 4 0 + 2 3 4 0 + 3 4 4 0 + 4 5 4 0 + 5 6 4 0 + 6 1 4 0 +M END diff --git a/Code/GraphMol/ChemReactions/testData/testpickle.bin b/Code/GraphMol/ChemReactions/testData/testpickle.bin new file mode 100644 index 000000000..41e485571 Binary files /dev/null and b/Code/GraphMol/ChemReactions/testData/testpickle.bin differ diff --git a/Code/GraphMol/ChemReactions/testReaction.cpp b/Code/GraphMol/ChemReactions/testReaction.cpp index a792ef25f..8d4af2b1d 100644 --- a/Code/GraphMol/ChemReactions/testReaction.cpp +++ b/Code/GraphMol/ChemReactions/testReaction.cpp @@ -1,6 +1,6 @@ // $Id$ // -// Copyright (c) 2007, Novartis Institutes for BioMedical Research Inc. +// Copyright (c) 2007-2014, Novartis Institutes for BioMedical Research Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without @@ -40,6 +40,10 @@ #include #include #include +#include +#include +#include +#include using namespace RDKit; @@ -75,7 +79,7 @@ void test1Basics(){ mol = SmilesToMol(smi); TEST_ASSERT(mol); reacts.push_back(ROMOL_SPTR(mol)); - + smi = "CN"; mol = SmilesToMol(smi); TEST_ASSERT(mol); @@ -104,7 +108,7 @@ void test1Basics(){ mol = SmilesToMol(smi); TEST_ASSERT(mol); reacts.push_back(ROMOL_SPTR(mol)); - + smi = "NCN"; mol = SmilesToMol(smi); TEST_ASSERT(mol); @@ -764,9 +768,11 @@ void test8Validation(){ smi = "[C:1](=[O:2])O.[N:3][C:4]>>[C:1](=[O:2])[N:3][C:1]"; rxn = RxnSmartsToChemicalReaction(smi); TEST_ASSERT(rxn); - TEST_ASSERT(!rxn->validate(nWarn,nError,false)); - TEST_ASSERT(nWarn==1); - TEST_ASSERT(nError==1); + /* 08/08/14 + * This test is changed due to allowing same atom mapping muliple times in the products */ + TEST_ASSERT(rxn->validate(nWarn,nError,false)); + TEST_ASSERT(nWarn==2); + TEST_ASSERT(nError==0); delete rxn; BOOST_LOG(rdInfoLog) << "\tdone" << std::endl; @@ -2276,7 +2282,12 @@ void test22DotsToRemoveBonds(){ BOOST_LOG(rdInfoLog) << "Testing using dots in the products to remove bonds." << std::endl; { - std::string smi = "[C:1]1[O:2][N:3]1>>[C:1]1[O:2].[N:3]1"; + /* 08/05/14 + * This test is changed due to a new behavior of the smarts reaction parser which now + * allows using parenthesis in products as well + * original smiles: + * std::string smi = "[C:1]1[O:2][N:3]1>>[C:1]1[O:2].[N:3]1"; */ + std::string smi = "[C:1]1[O:2][N:3]1>>([C:1]1[O:2].[N:3]1)"; ChemicalReaction *rxn = RxnSmartsToChemicalReaction(smi); TEST_ASSERT(rxn); TEST_ASSERT(rxn->getNumReactantTemplates()==1); @@ -2322,7 +2333,12 @@ void test23Pickling(){ MOL_SPTR_VECT reacts; std::vector prods; - smi="[C:1]1[O:2][N:3]1>>[C:1]1[O:2].[N:3]1"; + /* 08/05/14 + * This test is changed due to a new behavior of the smarts reaction parser which now + * allows using parenthesis in products as well + * original smiles: + * std::string smi = "[C:1]1[O:2][N:3]1>>[C:1]1[O:2].[N:3]1"; */ + smi="[C:1]1[O:2][N:3]1>>([C:1]1[O:2].[N:3]1)"; rxn = RxnSmartsToChemicalReaction(smi); TEST_ASSERT(rxn); TEST_ASSERT(rxn->getNumReactantTemplates()==1); @@ -4048,29 +4064,1355 @@ void test43Github243(){ } void test44Github290(){ - - BOOST_LOG(rdInfoLog) << "-------------------------------------" << std::endl; - BOOST_LOG(rdInfoLog) << "Testing github 290: seg fault while parsing rxn" << std::endl; - { - ChemicalReaction *rxn=new ChemicalReaction(); - delete rxn; - } - { - std::string rdbase = getenv("RDBASE"); - std::string fName = rdbase + "/Code/GraphMol/ChemReactions/testData/bogus_github290.rxn"; - - bool failed=false; - try{ - ChemicalReaction *rxn = RxnFileToChemicalReaction(fName); - } catch (ChemicalReactionParserException &) { - failed=true; + BOOST_LOG(rdInfoLog) << "-------------------------------------" << std::endl; + BOOST_LOG(rdInfoLog) << "Testing github 290: seg fault while parsing rxn" << std::endl; + { + ChemicalReaction *rxn=new ChemicalReaction(); + delete rxn; } + { + std::string rdbase = getenv("RDBASE"); + std::string fName = rdbase + "/Code/GraphMol/ChemReactions/testData/bogus_github290.rxn"; + bool failed=false; + try{ + ChemicalReaction *rxn = RxnFileToChemicalReaction(fName); + } catch (ChemicalReactionParserException &) { + failed=true; + } TEST_ASSERT(failed); } - + BOOST_LOG(rdInfoLog) << "\tdone" << std::endl; } +void test45SmilesWriter(){ + BOOST_LOG(rdInfoLog) << "-------------------------------------" << std::endl; + BOOST_LOG(rdInfoLog) << "Testing reaction SMILES writer." << std::endl; + unsigned int nWarn,nError; + + { + std::string smi; + smi="[C:1]=[O:2].[N:3]>>[N:3]~[C:1]=[O:2]"; + ChemicalReaction *rxn = RxnSmartsToChemicalReaction(smi, 0, true); + TEST_ASSERT(rxn); + TEST_ASSERT(rxn->getNumReactantTemplates()==2); + TEST_ASSERT(rxn->getNumProductTemplates()==1); + rxn->initReactantMatchers(); + TEST_ASSERT(rxn->validate(nWarn,nError,false)); + TEST_ASSERT(nWarn==0); + TEST_ASSERT(nError==0); + + std::string res=""; + for(MOL_SPTR_VECT::const_iterator iter=rxn->beginReactantTemplates(); + iter != rxn->endReactantTemplates();++iter){ + if(iter!=rxn->beginReactantTemplates()) res +="."; + res += MolToSmiles(**iter,true); + } + res += ">>"; + for(MOL_SPTR_VECT::const_iterator iter=rxn->beginProductTemplates(); + iter != rxn->endProductTemplates();++iter){ + if(iter!=rxn->beginProductTemplates()) res +="."; + res += MolToSmiles(**iter,true); + } + + smi = ChemicalReactionToRxnSmiles(*rxn); + TEST_ASSERT(smi==res) + TEST_ASSERT(smi=="[C:1]=[O:2].[N:3]>>[N:3]~[C:1]=[O:2]"); + + delete rxn; + rxn = RxnSmartsToChemicalReaction(smi, 0, true); + TEST_ASSERT(rxn); + TEST_ASSERT(rxn->getNumReactantTemplates()==2); + TEST_ASSERT(rxn->getNumProductTemplates()==1); + rxn->initReactantMatchers(); + TEST_ASSERT(rxn->validate(nWarn,nError,false)); + TEST_ASSERT(nWarn==0); + TEST_ASSERT(nError==0); + } + { + std::string smi; + smi="C=O.N>>N~C=O"; + ChemicalReaction *rxn = RxnSmartsToChemicalReaction(smi, 0, true); + TEST_ASSERT(rxn); + TEST_ASSERT(rxn->getNumReactantTemplates()==2); + TEST_ASSERT(rxn->getNumProductTemplates()==1); + + std::string res=""; + for(MOL_SPTR_VECT::const_iterator iter=rxn->beginReactantTemplates(); + iter != rxn->endReactantTemplates();++iter){ + if(iter!=rxn->beginReactantTemplates()) res +="."; + res += MolToSmiles(**iter,true); + } + res += ">>"; + for(MOL_SPTR_VECT::const_iterator iter=rxn->beginProductTemplates(); + iter != rxn->endProductTemplates();++iter){ + if(iter!=rxn->beginProductTemplates()) res +="."; + res += MolToSmiles(**iter,true); + } + + smi = ChemicalReactionToRxnSmiles(*rxn); + TEST_ASSERT(smi==res) + TEST_ASSERT(smi=="C=O.N>>N~C=O"); + + delete rxn; + rxn = RxnSmartsToChemicalReaction(smi, 0, true); + TEST_ASSERT(rxn); + TEST_ASSERT(rxn->getNumReactantTemplates()==2); + TEST_ASSERT(rxn->getNumProductTemplates()==1); + } + { + std::string smi; + smi="[S,C]=O.N>>N~[S,C]=O"; + ChemicalReaction *rxn = RxnSmartsToChemicalReaction(smi, 0, false); + TEST_ASSERT(rxn); + TEST_ASSERT(rxn->getNumReactantTemplates()==2); + TEST_ASSERT(rxn->getNumProductTemplates()==1); + + std::string res=""; + for(MOL_SPTR_VECT::const_iterator iter=rxn->beginReactantTemplates(); + iter != rxn->endReactantTemplates();++iter){ + if(iter!=rxn->beginReactantTemplates()) res +="."; + res += MolToSmiles(**iter,true); + } + res += ">>"; + for(MOL_SPTR_VECT::const_iterator iter=rxn->beginProductTemplates(); + iter != rxn->endProductTemplates();++iter){ + if(iter!=rxn->beginProductTemplates()) res +="."; + res += MolToSmiles(**iter,true); + } + + smi = ChemicalReactionToRxnSmiles(*rxn); + TEST_ASSERT(smi==res) + TEST_ASSERT(smi!="C=O.N>>N~C=O"); + TEST_ASSERT(smi=="O=S.N>>N~S=O"); + + delete rxn; + rxn = RxnSmartsToChemicalReaction(smi, 0, true); + TEST_ASSERT(rxn); + TEST_ASSERT(rxn->getNumReactantTemplates()==2); + TEST_ASSERT(rxn->getNumProductTemplates()==1); + } + + BOOST_LOG(rdInfoLog) << "\tdone" << std::endl; +} + +void test46Agents(){ + BOOST_LOG(rdInfoLog) << "-------------------------------------" << std::endl; + BOOST_LOG(rdInfoLog) << "Testing handling of reaction agents." << std::endl; + unsigned int nWarn,nError; + + { + std::string smi; + ROMol *mol=0; + + smi="[C:1]=[O:2].[N:3]>[OH2].[Na].[Cl]>[N:3]~[C:1]=[O:2]"; + ChemicalReaction *rxn = RxnSmartsToChemicalReaction(smi, 0, true); + TEST_ASSERT(rxn); + TEST_ASSERT(rxn->getNumReactantTemplates()==2); + TEST_ASSERT(rxn->getNumProductTemplates()==1); + TEST_ASSERT(rxn->getNumAgentTemplates()==3); + rxn->initReactantMatchers(); + TEST_ASSERT(rxn->validate(nWarn,nError,false)); + TEST_ASSERT(nWarn==0); + TEST_ASSERT(nError==0); + + smi = "C(=O)O"; + mol = SmartsToMol(smi); + TEST_ASSERT(mol); + rxn->addAgentTemplate(ROMOL_SPTR(mol)); + TEST_ASSERT(rxn->getNumAgentTemplates()==4); + + delete rxn; + } + { + std::string smi; + ROMol *mol=0; + + smi=">[OH2].[Na].[Cl]>"; + ChemicalReaction *rxn = RxnSmartsToChemicalReaction(smi, 0, true); + TEST_ASSERT(rxn); + TEST_ASSERT(rxn->getNumReactantTemplates()==0); + TEST_ASSERT(rxn->getNumProductTemplates()==0); + TEST_ASSERT(rxn->getNumAgentTemplates()==3); + + delete rxn; + } + { + std::string smi; + ROMol *mol=0; + MOL_SPTR_VECT agents; + + smi="[C:1]=[O:2].[N:3]>>[N:3]~[C:1]=[O:2]"; + ChemicalReaction *rxn = RxnSmartsToChemicalReaction(smi, 0, true); + TEST_ASSERT(rxn); + TEST_ASSERT(rxn->getNumReactantTemplates()==2); + TEST_ASSERT(rxn->getNumProductTemplates()==1); + TEST_ASSERT(rxn->getNumAgentTemplates()==0); + rxn->initReactantMatchers(); + TEST_ASSERT(rxn->validate(nWarn,nError,false)); + TEST_ASSERT(nWarn==0); + TEST_ASSERT(nError==0); + + smi = "C(=O)O"; + mol = SmartsToMol(smi); + TEST_ASSERT(mol); + rxn->addAgentTemplate(ROMOL_SPTR(mol)); + TEST_ASSERT(rxn->getNumAgentTemplates()==1); + + delete rxn; + } + { + std::string smi; + ROMol *mol=0; + unsigned int nWarn,nError,which; + MOL_SPTR_VECT agents; + + smi="[C:1]=[O:2].[N:3]>[OH2].[Na].[Cl]>[N:3]~[C:1]=[O:2]"; + ChemicalReaction *rxn = RxnSmartsToChemicalReaction(smi, 0, true); + TEST_ASSERT(rxn); + TEST_ASSERT(rxn->getNumReactantTemplates()==2); + TEST_ASSERT(rxn->getNumProductTemplates()==1); + TEST_ASSERT(rxn->getNumAgentTemplates()==3); + rxn->initReactantMatchers(); + TEST_ASSERT(rxn->validate(nWarn,nError,false)); + TEST_ASSERT(nWarn==0); + TEST_ASSERT(nError==0); + + smi = "O"; + mol = SmilesToMol(smi); + TEST_ASSERT(mol); + TEST_ASSERT(isMoleculeAgentOfReaction(*rxn,*mol,which)); + TEST_ASSERT(which==0); + TEST_ASSERT(isMoleculeAgentOfReaction(*rxn,*mol)); + delete(mol); + + smi = "C(=O)N"; + mol = SmilesToMol(smi); + TEST_ASSERT(mol); + TEST_ASSERT(!isMoleculeAgentOfReaction(*rxn,*mol,which)); + TEST_ASSERT(which==rxn->getNumAgentTemplates()); + TEST_ASSERT(!isMoleculeAgentOfReaction(*rxn,*mol)); + delete(mol); + + smi = "C(=O)O"; + mol = SmilesToMol(smi); + TEST_ASSERT(mol); + TEST_ASSERT(!isMoleculeAgentOfReaction(*rxn,*mol,which)); + TEST_ASSERT(which==rxn->getNumAgentTemplates()); + TEST_ASSERT(!isMoleculeAgentOfReaction(*rxn,*mol)); + delete(mol); + + smi = "C(=O)O"; + mol = SmilesToMol(smi); + TEST_ASSERT(mol); + rxn->addAgentTemplate(ROMOL_SPTR(mol)); + TEST_ASSERT(rxn->getNumAgentTemplates()==4); + + smi = "C(=O)O"; + mol = SmilesToMol(smi); + TEST_ASSERT(mol); + TEST_ASSERT(isMoleculeAgentOfReaction(*rxn,*mol,which)); + TEST_ASSERT(which==3); + delete(mol); + + delete rxn; + } + { + std::string smi1, smi2; + unsigned int nWarn,nError,which; + + smi1="[C:1]=[O:2].[N:3]>[OH2].[Na].[Cl]>[N:3]~[C:1]=[O:2]"; + ChemicalReaction *rxn = RxnSmartsToChemicalReaction(smi1, 0, true); + TEST_ASSERT(rxn); + TEST_ASSERT(rxn->getNumReactantTemplates()==2); + TEST_ASSERT(rxn->getNumProductTemplates()==1); + TEST_ASSERT(rxn->getNumAgentTemplates()==3); + rxn->initReactantMatchers(); + TEST_ASSERT(rxn->validate(nWarn,nError,false)); + TEST_ASSERT(nWarn==0); + TEST_ASSERT(nError==0); + + smi2="[C:1]=[O:2].[N:3]>>[N:3]~[C:1]=[O:2]"; + ChemicalReaction *rxnq = RxnSmartsToChemicalReaction(smi2, 0, true); + TEST_ASSERT(rxnq); + TEST_ASSERT(rxnq->getNumReactantTemplates()==2); + TEST_ASSERT(rxnq->getNumProductTemplates()==1); + TEST_ASSERT(rxnq->getNumAgentTemplates()==0); + rxnq->initReactantMatchers(); + TEST_ASSERT(rxnq->validate(nWarn,nError,false)); + TEST_ASSERT(nWarn==0); + TEST_ASSERT(nError==0); + + TEST_ASSERT(hasReactionSubstructMatch(*rxn, *rxnq, true)); + + delete rxn; + delete rxnq; + } + { + std::string smi1; + + unsigned int nWarn,nError,which; + + smi1="[C:1]=[O:2].[N:3].C(=O)O>[OH2].[Na].[Cl]>[N:3]~[C:1]=[O:2]"; + ChemicalReaction *rxn = RxnSmartsToChemicalReaction(smi1, 0, true); + TEST_ASSERT(rxn); + TEST_ASSERT(rxn->getNumReactantTemplates()==3); + TEST_ASSERT(rxn->getNumProductTemplates()==1); + TEST_ASSERT(rxn->getNumAgentTemplates()==3); + rxn->initReactantMatchers(); + + rxn->removeUnmappedReactantTemplates(); + rxn->removeUnmappedProductTemplates(); + TEST_ASSERT(rxn->getNumReactantTemplates()==2); + TEST_ASSERT(rxn->getNumProductTemplates()==1); + TEST_ASSERT(rxn->getNumAgentTemplates()==4); + delete rxn; + } + + BOOST_LOG(rdInfoLog) << "\tdone" << std::endl; +} + +void test47TestReactionMoleculeConversion(){ + BOOST_LOG(rdInfoLog) << "-------------------------------------" << std::endl; + BOOST_LOG(rdInfoLog) << "Testing the conversion of a molecule with Rxn role to a reaction and vice versa." << std::endl; + std::string rdbase = getenv("RDBASE"); + rdbase += "/Code/GraphMol/ChemReactions/testData/"; + + { + std::string fName; + fName = rdbase+"rxn1.mol"; + ROMol *m=MolFileToMol(fName); + TEST_ASSERT(m); + TEST_ASSERT(m->getNumAtoms()==18); + TEST_ASSERT(m->getNumBonds()==16); + + ChemicalReaction *rxn = RxnMolToChemicalReaction(*m); + + TEST_ASSERT(rxn->getNumReactantTemplates()==2); + TEST_ASSERT(rxn->getNumProductTemplates()==1); + TEST_ASSERT(rxn->getNumAgentTemplates()==0); + + ROMol* mol = ChemicalReactionToRxnMol(*rxn); + + TEST_ASSERT(mol->getAtomWithIdx(0)->hasProp("molRxnRole")); + TEST_ASSERT(mol->getAtomWithIdx(0)->getProp("molRxnRole")==1); + TEST_ASSERT(mol->getAtomWithIdx(10)->hasProp("molRxnRole")); + TEST_ASSERT(mol->getAtomWithIdx(10)->getProp("molRxnRole")==2); + + std::string smi1 = MolToSmiles(*m); + std::string smi2 = MolToSmiles(*mol); + + TEST_ASSERT(smi1==smi2) + + std::string smi3 = ChemicalReactionToRxnSmiles(*rxn); + ChemicalReaction *rxn2 = RxnMolToChemicalReaction(*mol); + std::string smi4 = ChemicalReactionToRxnSmiles(*rxn2); + + TEST_ASSERT(smi3==smi4) + + delete rxn; + delete rxn2; + delete m; + delete mol; + } + { + // test molecule with bond between reactant and product, same test as having different rxn roles in one fragment + std::string fName; + fName = rdbase+"rxn1_1.mol"; + ROMol *m=MolFileToMol(fName); + TEST_ASSERT(m); + TEST_ASSERT(m->getNumAtoms()==18); + TEST_ASSERT(m->getNumBonds()==17); + + ChemicalReaction *rxn = RxnMolToChemicalReaction(*m); + + TEST_ASSERT(rxn->getNumReactantTemplates()==1); + TEST_ASSERT(rxn->getNumProductTemplates()==0); + TEST_ASSERT(rxn->getNumAgentTemplates()==0); + + delete rxn; + delete m; + } + { + // test for molecule with correct rxn role for only one reactant + std::string fName; + fName = rdbase+"rxn1_2.mol"; + ROMol *m=MolFileToMol(fName); + TEST_ASSERT(m); + TEST_ASSERT(m->getNumAtoms()==18); + TEST_ASSERT(m->getNumBonds()==16); + + ChemicalReaction *rxn = RxnMolToChemicalReaction(*m); + + TEST_ASSERT(rxn->getNumReactantTemplates()==1); + TEST_ASSERT(rxn->getNumProductTemplates()==1); + TEST_ASSERT(rxn->getNumAgentTemplates()==0); + + delete rxn; + delete m;; + } + { + // test for molecule with correct rxn role for only one reactant + std::string smi="[C:1][C:2]>>[C:1].[C:2]"; + ChemicalReaction *rxn = RxnSmartsToChemicalReaction(smi); + + TEST_ASSERT(rxn->getNumReactantTemplates()==1); + TEST_ASSERT(rxn->getNumProductTemplates()==2); + TEST_ASSERT(rxn->getNumAgentTemplates()==0); + + ROMol* mol = ChemicalReactionToRxnMol(*rxn); + + TEST_ASSERT(mol->getAtomWithIdx(0)->hasProp("molRxnRole")); + TEST_ASSERT(mol->getAtomWithIdx(0)->getProp("molRxnRole")==1); + TEST_ASSERT(mol->getAtomWithIdx(2)->hasProp("molRxnRole")); + TEST_ASSERT(mol->getAtomWithIdx(2)->getProp("molRxnRole")==2); + TEST_ASSERT(mol->getAtomWithIdx(3)->hasProp("molRxnRole")); + TEST_ASSERT(mol->getAtomWithIdx(3)->getProp("molRxnRole")==2); + delete rxn; + delete mol; + + smi="[C:1][C:2]>[Na]>[C:1].[C:2]"; + rxn = RxnSmartsToChemicalReaction(smi); + + TEST_ASSERT(rxn->getNumReactantTemplates()==1); + TEST_ASSERT(rxn->getNumProductTemplates()==2); + TEST_ASSERT(rxn->getNumAgentTemplates()==1); + + mol = ChemicalReactionToRxnMol(*rxn); + + TEST_ASSERT(mol->getAtomWithIdx(0)->hasProp("molRxnRole")); + TEST_ASSERT(mol->getAtomWithIdx(0)->getProp("molRxnRole")==1); + TEST_ASSERT(mol->getAtomWithIdx(2)->hasProp("molRxnRole")); + TEST_ASSERT(mol->getAtomWithIdx(2)->getProp("molRxnRole")==2); + TEST_ASSERT(mol->getAtomWithIdx(4)->hasProp("molRxnRole")); + TEST_ASSERT(mol->getAtomWithIdx(4)->getProp("molRxnRole")==3); + delete rxn; + delete mol; + + smi="[C:1][C:2]>>"; + rxn = RxnSmartsToChemicalReaction(smi); + + TEST_ASSERT(rxn->getNumReactantTemplates()==1); + TEST_ASSERT(rxn->getNumProductTemplates()==0); + TEST_ASSERT(rxn->getNumAgentTemplates()==0); + + mol = ChemicalReactionToRxnMol(*rxn); + + TEST_ASSERT(mol->getAtomWithIdx(0)->hasProp("molRxnRole")); + TEST_ASSERT(mol->getAtomWithIdx(0)->getProp("molRxnRole")==1); + delete rxn; + delete mol; + + smi=">>[C:1].[C:2]"; + rxn = RxnSmartsToChemicalReaction(smi); + + TEST_ASSERT(rxn->getNumReactantTemplates()==0); + TEST_ASSERT(rxn->getNumProductTemplates()==2); + TEST_ASSERT(rxn->getNumAgentTemplates()==0); + + mol = ChemicalReactionToRxnMol(*rxn); + + TEST_ASSERT(mol->getAtomWithIdx(0)->hasProp("molRxnRole")); + TEST_ASSERT(mol->getAtomWithIdx(0)->getProp("molRxnRole")==2); + TEST_ASSERT(mol->getAtomWithIdx(1)->hasProp("molRxnRole")); + TEST_ASSERT(mol->getAtomWithIdx(1)->getProp("molRxnRole")==2); + + delete rxn; + delete mol; + } + BOOST_LOG(rdInfoLog) << "\tdone" << std::endl; +} + +void test48ParensInProducts1(){ + BOOST_LOG(rdInfoLog) << "-------------------------------------" << std::endl; + BOOST_LOG(rdInfoLog) << "Testing grouping parens in products1" << std::endl; + + { + std::string smi="[C:1][C:2]>>[C:1].[C:2]"; + ChemicalReaction *rxn = RxnSmartsToChemicalReaction(smi); + TEST_ASSERT(rxn); + TEST_ASSERT(rxn->getNumReactantTemplates()==1); + TEST_ASSERT(rxn->getNumProductTemplates()==2); + delete rxn; + } + + { + std::string smi="[C:1][C:2]>>([C:1].[C:2])"; + ChemicalReaction *rxn = RxnSmartsToChemicalReaction(smi); + TEST_ASSERT(rxn); + TEST_ASSERT(rxn->getNumReactantTemplates()==1); + TEST_ASSERT(rxn->getNumProductTemplates()==1); + delete rxn; + } + { + std::string smi="([C:1].C(=O)O).[C:2]>>([C:1].[C:2]).C(=O)O"; + ChemicalReaction *rxn = RxnSmartsToChemicalReaction(smi); + TEST_ASSERT(rxn); + TEST_ASSERT(rxn->getNumReactantTemplates()==2); + TEST_ASSERT(rxn->getNumProductTemplates()==2); + delete rxn; + } + + { + std::string smi="[C:1](=O)O.[C:2]>>[C:1][C:2].C(=O)O"; + ChemicalReaction *rxn = RxnSmartsToChemicalReaction(smi); + TEST_ASSERT(rxn); + TEST_ASSERT(rxn->getNumReactantTemplates()==2); + TEST_ASSERT(rxn->getNumProductTemplates()==2); + delete rxn; + } + + { + std::string smi="[C:1](=O)O.([C:2])>>[C:1][C:2].(C(=O)O)"; + ChemicalReaction *rxn = RxnSmartsToChemicalReaction(smi); + TEST_ASSERT(rxn); + TEST_ASSERT(rxn->getNumReactantTemplates()==2); + TEST_ASSERT(rxn->getNumProductTemplates()==2); + delete rxn; + } + { + std::string smi="[C:1](=O)O.([C:2].N)>>[C:1][C:2].(C(=O)O.N)"; + ChemicalReaction *rxn = RxnSmartsToChemicalReaction(smi); + TEST_ASSERT(rxn); + TEST_ASSERT(rxn->getNumReactantTemplates()==2); + TEST_ASSERT(rxn->getNumProductTemplates()==2); + delete rxn; + } + { + std::string smi="[C:1](=O)O.[C:2]>>([C:1][C:2]"; + ChemicalReaction *rxn=0; + try{ + rxn = RxnSmartsToChemicalReaction(smi); + } catch (const ChemicalReactionParserException &e){ + rxn=0; + } + TEST_ASSERT(!rxn); + } + { + std::string smi="[C:1](=O)O.[C:2]>>[C:1].([C:2]"; + ChemicalReaction *rxn=0; + try{ + rxn = RxnSmartsToChemicalReaction(smi); + } catch (const ChemicalReactionParserException &e){ + rxn=0; + } + TEST_ASSERT(!rxn); + } + { + std::string smi="[C:1](=O)O.[C:2]>>[C:1][C:2])"; + ChemicalReaction *rxn=0; + try{ + rxn = RxnSmartsToChemicalReaction(smi); + } catch (const ChemicalReactionParserException &e){ + rxn=0; + } + TEST_ASSERT(!rxn); + } + { + std::string smi="[C:1](=O)O.[C:2]>>[C:1]).[C:2]"; + ChemicalReaction *rxn=0; + try{ + rxn = RxnSmartsToChemicalReaction(smi); + } catch (const ChemicalReactionParserException &e){ + rxn=0; + } + TEST_ASSERT(!rxn); + } + + BOOST_LOG(rdInfoLog) << "\tdone" << std::endl; +} + +void test49ParensInProducts2(){ + BOOST_LOG(rdInfoLog) << "-------------------------------------" << std::endl; + BOOST_LOG(rdInfoLog) << "Testing grouping parens in products2" << std::endl; + + { + std::string smi="[C:1][O:2]>>([C:1].[O:2])"; + ChemicalReaction *rxn = RxnSmartsToChemicalReaction(smi); + TEST_ASSERT(rxn); + TEST_ASSERT(rxn->getNumReactantTemplates()==1); + TEST_ASSERT(rxn->getNumProductTemplates()==1); + rxn->initReactantMatchers(); + MOL_SPTR_VECT reacts; + reacts.clear(); + smi = "C1NO1"; + ROMol *mol = SmilesToMol(smi); + TEST_ASSERT(mol); + reacts.push_back(ROMOL_SPTR(mol)); + std::vector prods; + prods = rxn->runReactants(reacts); + TEST_ASSERT(prods.size()==1); + TEST_ASSERT(prods[0].size()==1); + TEST_ASSERT(prods[0][0]->getNumAtoms()==3); + TEST_ASSERT(prods[0][0]->getNumBonds()==2); + + delete rxn; + } + { + std::string smi="([N:1].[O:2])>>([N:1]C.[O:2]CCC)"; + ChemicalReaction *rxn = RxnSmartsToChemicalReaction(smi); + TEST_ASSERT(rxn); + TEST_ASSERT(rxn->getNumReactantTemplates()==1); + TEST_ASSERT(rxn->getNumProductTemplates()==1); + rxn->initReactantMatchers(); + MOL_SPTR_VECT reacts; + reacts.clear(); + smi = "Nn1ccc(O)c1"; + ROMol *mol = SmilesToMol(smi); + TEST_ASSERT(mol); + reacts.push_back(ROMOL_SPTR(mol)); + TEST_ASSERT(reacts.size()==1); + TEST_ASSERT(reacts[0]->getNumAtoms()==7); + TEST_ASSERT(reacts[0]->getNumBonds()==7); + std::vector prods; + prods = rxn->runReactants(reacts); + TEST_ASSERT(prods.size()==1); + TEST_ASSERT(prods[0].size()==1); + TEST_ASSERT(prods[0][0]->getNumAtoms()==11); + TEST_ASSERT(prods[0][0]->getNumBonds()==11); + + smi = "CCCOc1ccn(NC)c1"; + TEST_ASSERT(MolToSmiles(*prods[0][0]) == smi); + + delete rxn; + } + BOOST_LOG(rdInfoLog) << "\tdone" << std::endl; +} + +void test50RNXFileParserWithEmptyAgentColumn(){ + BOOST_LOG(rdInfoLog) << "-------------------------------------" << std::endl; + BOOST_LOG(rdInfoLog) << "Testing RNX file parser with empty agent column" << std::endl; + + { + std::string rdbase = getenv("RDBASE"); + std::string fName; + + fName = rdbase + "/Code/GraphMol/ChemReactions/testData/rxn2.mol"; + + ChemicalReaction *rxn = RxnFileToChemicalReaction(fName); + TEST_ASSERT(rxn); + TEST_ASSERT(rxn->getNumReactantTemplates()==1); + TEST_ASSERT(rxn->getNumProductTemplates()==1); + TEST_ASSERT(rxn->getNumAgentTemplates()==0); + + delete rxn; + } + + BOOST_LOG(rdInfoLog) << "\tdone" << std::endl; +} + +void test51RNXSmilesFromPatentData(){ + BOOST_LOG(rdInfoLog) << "-------------------------------------" << std::endl; + BOOST_LOG(rdInfoLog) << "Testing RNX from patent data" << std::endl; + unsigned int nWarn,nError; + { + // product atom-mapping numbers found multiple times, validation should fail + std::string smi = "[Na+].[Na+].[NH2:23][CH2:22][CH2:21][CH2:20][CH2:19][CH2:18][CH2:17][CH2:16][CH2:15][CH2:14][NH2:13].O=C([O-])[O-].[Cl:12][c:8]1[cH:9][cH:10][c:11]2[c:2](Cl)[n:3][cH:4][n:5][c:6]2[cH:7]1>CC(C)O>[Cl:12][c:8]1[cH:9][cH:10][c:11]2[c:6]([cH:7]1)[n:5][cH:4][n:3][c:2]2[NH:23][CH2:22][CH2:21][CH2:20][CH2:19][CH2:18][CH2:17][CH2:16][CH2:15][CH2:14][NH:13][c:2]1[n:3][cH:4][n:5][c:6]2[cH:7][c:8]([Cl:12])[cH:9][cH:10][c:11]21"; + ChemicalReaction *rxn = RxnSmartsToChemicalReaction(smi, 0, true); + TEST_ASSERT(rxn->validate(nWarn,nError,false)); + TEST_ASSERT(!nWarn==0); + TEST_ASSERT(nError==0); + + delete rxn; + } + { + // test removing reactant without heavyatoms to agents + std::string smi = "[S].[H][H].[CH3:2][CH2:1][O:3][C:4](=[O:20])[c:5]1[c:6]([O:17][CH2:18][CH3:19])[cH:7][c:8]([C:14](=[O:15])Cl)[cH:9][c:10]1[O:11][CH2:12][CH3:13].c1ccc2ncccc2c1>[Pd+2].[Ba+2].O=S(=O)([O-])[O-].O=S(=O)([O-])[O-]>[CH3:2][CH2:1][O:3][C:4](=[O:20])[c:5]1[c:6]([O:17][CH2:18][CH3:19])[cH:7][c:8]([CH:14]=[O:15])[cH:9][c:10]1[O:11][CH2:12][CH3:13]"; + ChemicalReaction *rxn = RxnSmartsToChemicalReaction(smi, 0, true); + rxn->initReactantMatchers(); + rxn->removeUnmappedReactantTemplates(); + rxn->removeUnmappedProductTemplates(); + delete rxn; + } + { + // reactant atom-mapping numbers found multiple times, validation should fail + std::string smi = "[BrH:1].[CH3:24][CH2:23][CH2:22][CH2:21][CH2:20][C:19](=[O:25])O[C:19](=[O:25])[CH2:20][CH2:21][CH2:22][CH2:23][CH3:24].[CH3:16][CH:15]1[N:14]([CH3:17])[CH:13]2[CH2:18][C:9]1([c:5]1[cH:6][cH:7][cH:8][c:3]([OH:2])[cH:4]1)[CH2:10][CH2:11][CH2:12]2>c1ccncc1>[BrH:1].[CH3:24][CH2:23][CH2:22][CH2:21][CH2:20][C:19](=[O:25])[O:2][c:3]1[cH:8][cH:7][cH:6][c:5]([C:9]23[CH2:18][CH:13]([CH2:12][CH2:11][CH2:10]2)[N:14]([CH3:17])[CH:15]3[CH3:16])[cH:4]1"; + ChemicalReaction *rxn = RxnSmartsToChemicalReaction(smi, 0, true); + TEST_ASSERT(!rxn->validate(nWarn,nError,false)); + TEST_ASSERT(nWarn==0); + TEST_ASSERT(nError!=0); + + delete rxn; + } + + BOOST_LOG(rdInfoLog) << "\tdone" << std::endl; +} + +void test52RedundantProductMappingNumbersAndRunReactants(){ + BOOST_LOG(rdInfoLog) << "-------------------------------------" << std::endl; + BOOST_LOG(rdInfoLog) << "Testing products redundant atom mapping numbers in run_reactants" << std::endl; + unsigned int nWarn,nError; + { + std::string smi = "[C:1]-[OH:2]>>[C:1]-[O:2]-[C:1]"; + ChemicalReaction *rxn = RxnSmartsToChemicalReaction(smi, 0, true); + TEST_ASSERT(rxn->validate(nWarn,nError,false)); + TEST_ASSERT(!nWarn==0); + TEST_ASSERT(nError==0); + rxn->initReactantMatchers(); + + MOL_SPTR_VECT reacts; + reacts.clear(); + smi = "N[13CH2]O"; + ROMol *mol = SmilesToMol(smi); + TEST_ASSERT(mol); + reacts.push_back(ROMOL_SPTR(mol)); + TEST_ASSERT(reacts.size()==1); + std::vector prods; + prods = rxn->runReactants(reacts); + + TEST_ASSERT(prods.size()==1); + TEST_ASSERT(prods[0].size()==1); + + smi = "N[13CH2]O[13CH2]N"; + TEST_ASSERT(MolToSmiles(*prods[0][0], true) == smi); + + delete rxn; + } + { + std::string smi = "[C:1]-[OH:2]>>[C:1]-[O:2]-[C:1]"; + ChemicalReaction *rxn = RxnSmartsToChemicalReaction(smi, 0, true); + TEST_ASSERT(rxn->validate(nWarn,nError,false)); + TEST_ASSERT(!nWarn==0); + TEST_ASSERT(nError==0); + rxn->initReactantMatchers(); + + MOL_SPTR_VECT reacts; + reacts.clear(); + smi = "[13CH3]O"; + ROMol *mol = SmilesToMol(smi); + TEST_ASSERT(mol); + reacts.push_back(ROMOL_SPTR(mol)); + TEST_ASSERT(reacts.size()==1); + std::vector prods; + prods = rxn->runReactants(reacts); + + TEST_ASSERT(prods.size()==1); + TEST_ASSERT(prods[0].size()==1); + TEST_ASSERT(prods[0][0]->getNumAtoms()==3); + TEST_ASSERT(prods[0][0]->getNumBonds()==2); + + smi = "[13CH3]O[13CH3]"; + TEST_ASSERT(MolToSmiles(*prods[0][0], true) == smi); + + delete rxn; + } + { + std::string smi = "[O:1]-[C:2]>>[O:1]-[C:2]-C-[C:2]-[O:1]"; + ChemicalReaction *rxn = RxnSmartsToChemicalReaction(smi, 0, true); + TEST_ASSERT(rxn->validate(nWarn,nError,false)); + TEST_ASSERT(!nWarn==0); + TEST_ASSERT(nError==0); + rxn->initReactantMatchers(); + + MOL_SPTR_VECT reacts; + reacts.clear(); + smi = "[13C]1OCN1"; + ROMol *mol = SmilesToMol(smi); + TEST_ASSERT(mol); + reacts.push_back(ROMOL_SPTR(mol)); + TEST_ASSERT(reacts.size()==1); + std::vector prods; + prods = rxn->runReactants(reacts); + + TEST_ASSERT(prods.size()==2); + TEST_ASSERT(prods[0].size()==1); + TEST_ASSERT(prods[1].size()==1); + + smi = "C([13C]1NCO1)[13C]1NCO1"; + TEST_ASSERT(MolToSmiles(*prods[0][0], true) == smi); + smi = "C(C1N[13C]O1)C1N[13C]O1"; + TEST_ASSERT(MolToSmiles(*prods[1][0], true) == smi); + + delete rxn; + } + + BOOST_LOG(rdInfoLog) << "\tdone" << std::endl; +} + +void test53ReactionSubstructureMatching(){ + BOOST_LOG(rdInfoLog) << "-------------------------------------" << std::endl; + BOOST_LOG(rdInfoLog) << "Testing reaction substructure matching w/o agents" << std::endl; + { + std::string smi = "c1ccccc1>>c1ccncc1"; + ChemicalReaction *query_rxn = RxnSmartsToChemicalReaction(smi, 0, true); + TEST_ASSERT(query_rxn); + TEST_ASSERT(query_rxn->getNumReactantTemplates()==1); + TEST_ASSERT(query_rxn->getNumProductTemplates()==1); + TEST_ASSERT(query_rxn->getNumAgentTemplates()==0); + + smi = "CCC.c1ccccc1>>CCC.c1ccncc1"; + ChemicalReaction *rxn = RxnSmartsToChemicalReaction(smi, 0, true); + TEST_ASSERT(rxn); + TEST_ASSERT(rxn->getNumReactantTemplates()==2); + TEST_ASSERT(rxn->getNumProductTemplates()==2); + TEST_ASSERT(rxn->getNumAgentTemplates()==0); + TEST_ASSERT(hasReactionSubstructMatch(*rxn, *query_rxn, false)); + TEST_ASSERT(hasReactionSubstructMatch(*rxn, *query_rxn, true)); + delete rxn; + + smi = "c1ccccc1.CCC>>CCC.c1ccncc1"; + rxn = RxnSmartsToChemicalReaction(smi, 0, true); + TEST_ASSERT(hasReactionSubstructMatch(*rxn, *query_rxn, false)); + TEST_ASSERT(hasReactionSubstructMatch(*rxn, *query_rxn, true)); + delete rxn; + + smi = "c1ccccc1.CCC>>c1ccncc1.CCC"; + rxn = RxnSmartsToChemicalReaction(smi, 0, true); + TEST_ASSERT(hasReactionSubstructMatch(*rxn, *query_rxn, false)); + TEST_ASSERT(hasReactionSubstructMatch(*rxn, *query_rxn, true)); + delete rxn; + + smi = "CCC.c1ccccc1.C(=O)O>>CCC.c1ccncc1.C(=O)O"; + rxn = RxnSmartsToChemicalReaction(smi, 0, true); + TEST_ASSERT(rxn); + TEST_ASSERT(rxn->getNumReactantTemplates()==3); + TEST_ASSERT(rxn->getNumProductTemplates()==3); + TEST_ASSERT(rxn->getNumAgentTemplates()==0); + TEST_ASSERT(hasReactionSubstructMatch(*rxn, *query_rxn, false)); + TEST_ASSERT(hasReactionSubstructMatch(*rxn, *query_rxn, true)); + delete rxn; + + smi = "CCC.C(=O)O.c1ccccc1>>CCC.c1ccncc1.C(=O)O"; + rxn = RxnSmartsToChemicalReaction(smi, 0, true); + TEST_ASSERT(hasReactionSubstructMatch(*rxn, *query_rxn, false)); + TEST_ASSERT(hasReactionSubstructMatch(*rxn, *query_rxn, true)); + delete rxn; + + smi = "CCC.C(=O)O.c1ccccc1>>CCC.C(=O)O.c1ccncc1"; + rxn = RxnSmartsToChemicalReaction(smi, 0, true); + TEST_ASSERT(hasReactionSubstructMatch(*rxn, *query_rxn, false)); + TEST_ASSERT(hasReactionSubstructMatch(*rxn, *query_rxn, true)); + delete rxn; + + smi = "CCC.c1ccccc1.C(=O)O>NC=O>CCC.c1ccncc1.C(=O)O"; + rxn = RxnSmartsToChemicalReaction(smi, 0, true); + TEST_ASSERT(rxn); + TEST_ASSERT(rxn->getNumReactantTemplates()==3); + TEST_ASSERT(rxn->getNumProductTemplates()==3); + TEST_ASSERT(rxn->getNumAgentTemplates()==1); + TEST_ASSERT(hasReactionSubstructMatch(*rxn, *query_rxn, false)); + TEST_ASSERT(hasReactionSubstructMatch(*rxn, *query_rxn, true)); + + delete query_rxn; + smi = "c1ccccc1>NC=O>c1ccncc1"; + query_rxn = RxnSmartsToChemicalReaction(smi, 0, true); + TEST_ASSERT(query_rxn); + TEST_ASSERT(query_rxn->getNumReactantTemplates()==1); + TEST_ASSERT(query_rxn->getNumProductTemplates()==1); + TEST_ASSERT(query_rxn->getNumAgentTemplates()==1); + TEST_ASSERT(hasReactionSubstructMatch(*rxn, *query_rxn, false)); + TEST_ASSERT(hasReactionSubstructMatch(*rxn, *query_rxn, true)); + delete rxn; + + smi = "CCC.c1ccccc1.C(=O)O>>CCC.c1ccncc1.C(=O)O"; + rxn = RxnSmartsToChemicalReaction(smi, 0, true); + TEST_ASSERT(rxn); + TEST_ASSERT(rxn->getNumReactantTemplates()==3); + TEST_ASSERT(rxn->getNumProductTemplates()==3); + TEST_ASSERT(rxn->getNumAgentTemplates()==0); + TEST_ASSERT(hasReactionSubstructMatch(*rxn, *query_rxn, false)); + TEST_ASSERT(!hasReactionSubstructMatch(*rxn, *query_rxn, true)); + delete rxn; + + smi = "CCC.c1ccccc1.C(=O)O>>CCC.c1ncncc1.C(=O)O"; + rxn = RxnSmartsToChemicalReaction(smi, 0, true); + TEST_ASSERT(rxn); + TEST_ASSERT(rxn->getNumReactantTemplates()==3); + TEST_ASSERT(rxn->getNumProductTemplates()==3); + TEST_ASSERT(rxn->getNumAgentTemplates()==0); + TEST_ASSERT(!hasReactionSubstructMatch(*rxn, *query_rxn, false)); + TEST_ASSERT(!hasReactionSubstructMatch(*rxn, *query_rxn, true)); + + delete rxn; + delete query_rxn; + } + + BOOST_LOG(rdInfoLog) << "\tdone" << std::endl; +} + +void test54RedundantProductMappingNumbersAndRSChirality(){ + BOOST_LOG(rdInfoLog) << "-------------------------------------" << std::endl; + BOOST_LOG(rdInfoLog) << "Testing products with redundant atom mapping numbers and chirality" << std::endl; + unsigned int nWarn,nError; + std::string smi, cip; + { + // perserve the stereo chemistry of the reactant in the product + smi = "[C:1][O:2]>>[C:1][O:2]N[O:2][C:1]"; + ChemicalReaction *rxn = RxnSmartsToChemicalReaction(smi, 0, true); + TEST_ASSERT(rxn->validate(nWarn,nError,false)); + TEST_ASSERT(!nWarn==0); + TEST_ASSERT(nError==0); + rxn->initReactantMatchers(); + + MOL_SPTR_VECT reacts; + reacts.clear(); + smi = "[OH][C@](F)(Cl)Br"; + ROMol *mol = SmilesToMol(smi); + TEST_ASSERT(mol); + MolOps::assignStereochemistry(*mol); + TEST_ASSERT(mol->getAtomWithIdx(1)->hasProp("_CIPCode")); + mol->getAtomWithIdx(1)->getProp("_CIPCode",cip); + TEST_ASSERT(cip=="S"); + + reacts.push_back(ROMOL_SPTR(mol)); + TEST_ASSERT(reacts.size()==1); + std::vector prods; + prods = rxn->runReactants(reacts); + + TEST_ASSERT(prods.size()==1); + TEST_ASSERT(prods[0].size()==1); + + std::cout << MolToSmiles(*prods[0][0], true) << std::endl; + smi = "F[C@@](Cl)(Br)ONO[C@](F)(Cl)Br"; + TEST_ASSERT(MolToSmiles(*prods[0][0], true) == smi); + + ROMOL_SPTR prod = prods[0][0]; + MolOps::sanitizeMol(*(static_cast(prod.get()))); + MolOps::assignStereochemistry(*prod); + TEST_ASSERT(prod->getAtomWithIdx(0)->getAtomicNum() == 6); + TEST_ASSERT(prod->getAtomWithIdx(0)->hasProp("_CIPCode")); + prod->getAtomWithIdx(0)->getProp("_CIPCode",cip); + TEST_ASSERT(cip=="S"); + TEST_ASSERT(prod->getAtomWithIdx(4)->getAtomicNum() == 6); + TEST_ASSERT(prod->getAtomWithIdx(4)->hasProp("_CIPCode")); + prod->getAtomWithIdx(4)->getProp("_CIPCode",cip); + TEST_ASSERT(cip=="S"); + } + { + // invert the stereo chemistry of one carbon of the reactant in the product + smi = "[C@:1][O:2]>>[C@:1][O:2]N[O:2][C@@:1]"; + ChemicalReaction *rxn = RxnSmartsToChemicalReaction(smi, 0, true); + TEST_ASSERT(rxn->validate(nWarn,nError,false)); + TEST_ASSERT(!nWarn==0); + TEST_ASSERT(nError==0); + rxn->initReactantMatchers(); + + MOL_SPTR_VECT reacts; + reacts.clear(); + smi = "[OH][C@](F)(Cl)Br"; + ROMol *mol = SmilesToMol(smi); + MolOps::assignStereochemistry(*mol); + TEST_ASSERT(mol->getAtomWithIdx(1)->hasProp("_CIPCode")); + mol->getAtomWithIdx(1)->getProp("_CIPCode",cip); + TEST_ASSERT(cip=="S"); + TEST_ASSERT(mol); + reacts.push_back(ROMOL_SPTR(mol)); + TEST_ASSERT(reacts.size()==1); + std::vector prods; + prods = rxn->runReactants(reacts); + + TEST_ASSERT(prods.size()==1); + TEST_ASSERT(prods[0].size()==1); + + std::cout << MolToSmiles(*prods[0][0], true) << std::endl; + smi = "F[C@](Cl)(Br)ONO[C@](F)(Cl)Br"; + TEST_ASSERT(MolToSmiles(*prods[0][0], true) == smi); + + ROMOL_SPTR prod = prods[0][0]; + MolOps::sanitizeMol(*(static_cast(prod.get()))); + MolOps::assignStereochemistry(*prod); + TEST_ASSERT(prod->getAtomWithIdx(0)->getAtomicNum() == 6); + TEST_ASSERT(prod->getAtomWithIdx(0)->hasProp("_CIPCode")); + prod->getAtomWithIdx(0)->getProp("_CIPCode",cip); + TEST_ASSERT(cip=="S"); + TEST_ASSERT(prod->getAtomWithIdx(4)->getAtomicNum() == 6); + TEST_ASSERT(prod->getAtomWithIdx(4)->hasProp("_CIPCode")); + prod->getAtomWithIdx(4)->getProp("_CIPCode",cip); + TEST_ASSERT(cip=="R"); + } + { + // Both carbons in the product (mapped with #2), should be (S) + smi = "[OH:5][C@:2]([F:3])([Cl:1])[Br:4]>>[F:3][C@@:2]([Cl:1])([Br:4])[O:5]N[O:5][C@:2]([F:3])([Cl:1])[Br:4]"; + ChemicalReaction *rxn = RxnSmartsToChemicalReaction(smi, 0, true); + TEST_ASSERT(rxn->validate(nWarn,nError,false)); + TEST_ASSERT(!nWarn==0); + TEST_ASSERT(nError==0); + + MOL_SPTR_VECT reacts; + rxn->initReactantMatchers(); + reacts.clear(); + + smi = "[OH][C@](F)(Cl)Br"; + ROMol *mol = SmilesToMol(smi); + TEST_ASSERT(mol); + MolOps::assignStereochemistry(*mol); + TEST_ASSERT(mol->getAtomWithIdx(1)->hasProp("_CIPCode")); + mol->getAtomWithIdx(1)->getProp("_CIPCode",cip); + TEST_ASSERT(cip=="S"); + + reacts.push_back(ROMOL_SPTR(mol)); + TEST_ASSERT(reacts.size()==1); + std::vector prods; + prods = rxn->runReactants(reacts); + + TEST_ASSERT(prods.size()==1); + TEST_ASSERT(prods[0].size()==1); + + std::cout << MolToSmiles(*prods[0][0], true) << std::endl; + smi = "F[C@@](Cl)(Br)ONO[C@](F)(Cl)Br"; + TEST_ASSERT(MolToSmiles(*prods[0][0], true) == smi); + + ROMOL_SPTR prod = prods[0][0]; + MolOps::sanitizeMol(*(static_cast(prod.get()))); + MolOps::assignStereochemistry(*prod); + TEST_ASSERT(prod->getAtomWithIdx(1)->hasProp("_CIPCode")); + prod->getAtomWithIdx(1)->getProp("_CIPCode",cip); + TEST_ASSERT(cip=="S"); + TEST_ASSERT(prod->getAtomWithIdx(7)->hasProp("_CIPCode")); + prod->getAtomWithIdx(7)->getProp("_CIPCode",cip); + TEST_ASSERT(cip=="S"); + + delete rxn; + } + { + // One carbon in the product (mapped with #2) should be (S), the other (R) + smi = "[OH:5][C@:2]([F:3])([Cl:1])[Br:4]>>[F:3][C@@:2]([Cl:1])([Br:4])[O:5]N[O:5][C@@:2]([F:3])([Cl:1])[Br:4]"; + ChemicalReaction *rxn = RxnSmartsToChemicalReaction(smi, 0, true); + TEST_ASSERT(rxn->validate(nWarn,nError,false)); + TEST_ASSERT(!nWarn==0); + TEST_ASSERT(nError==0); + + MOL_SPTR_VECT reacts; + rxn->initReactantMatchers(); + reacts.clear(); + + smi = "[OH][C@](F)(Cl)Br"; + ROMol *mol = SmilesToMol(smi); + TEST_ASSERT(mol); + MolOps::assignStereochemistry(*mol); + TEST_ASSERT(mol->getAtomWithIdx(1)->hasProp("_CIPCode")); + mol->getAtomWithIdx(1)->getProp("_CIPCode",cip); + TEST_ASSERT(cip=="S"); + + reacts.push_back(ROMOL_SPTR(mol)); + TEST_ASSERT(reacts.size()==1); + std::vector prods; + prods = rxn->runReactants(reacts); + + TEST_ASSERT(prods.size()==1); + TEST_ASSERT(prods[0].size()==1); + + std::cout << MolToSmiles(*prods[0][0], true) << std::endl; + smi = "F[C@](Cl)(Br)ONO[C@](F)(Cl)Br"; + TEST_ASSERT(MolToSmiles(*prods[0][0], true) == smi); + + ROMOL_SPTR prod = prods[0][0]; + MolOps::sanitizeMol(*(static_cast(prod.get()))); + MolOps::assignStereochemistry(*prod); + TEST_ASSERT(prod->getAtomWithIdx(1)->hasProp("_CIPCode")); + prod->getAtomWithIdx(1)->getProp("_CIPCode",cip); + TEST_ASSERT(cip=="S"); + TEST_ASSERT(prod->getAtomWithIdx(7)->hasProp("_CIPCode")); + prod->getAtomWithIdx(7)->getProp("_CIPCode",cip); + TEST_ASSERT(cip=="R"); + + delete rxn; + } + { + // Both carbons in the product (mapped with #2), should be (S) + smi = "[OH:5][C@:2]([F:3])([Cl:1])[Br:4]>>[F:3][C@@:2]([Cl:1])([Br:4])[O:5][C@:2]([F:3])([Cl:1])[Br:4]"; + ChemicalReaction *rxn = RxnSmartsToChemicalReaction(smi, 0, true); + TEST_ASSERT(rxn->validate(nWarn,nError,false)); + TEST_ASSERT(!nWarn==0); + TEST_ASSERT(nError==0); + + MOL_SPTR_VECT reacts; + rxn->initReactantMatchers(); + reacts.clear(); + + smi = "[OH][C@](F)(Cl)Br"; + ROMol *mol = SmilesToMol(smi); + TEST_ASSERT(mol); + MolOps::assignStereochemistry(*mol); + TEST_ASSERT(mol->getAtomWithIdx(1)->hasProp("_CIPCode")); + mol->getAtomWithIdx(1)->getProp("_CIPCode",cip); + TEST_ASSERT(cip=="S"); + + reacts.push_back(ROMOL_SPTR(mol)); + TEST_ASSERT(reacts.size()==1); + std::vector prods; + prods = rxn->runReactants(reacts); + + TEST_ASSERT(prods.size()==1); + TEST_ASSERT(prods[0].size()==1); + + std::cout << MolToSmiles(*prods[0][0], true) << std::endl; + smi = "F[C@@](Cl)(Br)O[C@](F)(Cl)Br"; + TEST_ASSERT(MolToSmiles(*prods[0][0], true) == smi); + + ROMOL_SPTR prod = prods[0][0]; + MolOps::sanitizeMol(*(static_cast(prod.get()))); + MolOps::assignStereochemistry(*prod); + TEST_ASSERT(prod->getAtomWithIdx(1)->hasProp("_CIPCode")); + prod->getAtomWithIdx(1)->getProp("_CIPCode",cip); + TEST_ASSERT(cip=="S"); + TEST_ASSERT(prod->getAtomWithIdx(5)->hasProp("_CIPCode")); + prod->getAtomWithIdx(5)->getProp("_CIPCode",cip); + TEST_ASSERT(cip=="S"); + + delete rxn; + } + { + //One carbon in the product (mapped with #2) should be (S), the other (R) + smi = "[OH:5][C@:2]([F:3])([Cl:1])[Br:4]>>[F:3][C@@:2]([Cl:1])([Br:4])[O:5][C@@:2]([F:3])([Cl:1])[Br:4]"; + ChemicalReaction *rxn = RxnSmartsToChemicalReaction(smi, 0, true); + TEST_ASSERT(rxn->validate(nWarn,nError,false)); + TEST_ASSERT(!nWarn==0); + TEST_ASSERT(nError==0); + + MOL_SPTR_VECT reacts; + rxn->initReactantMatchers(); + reacts.clear(); + + smi = "[OH][C@](F)(Cl)Br"; + ROMol *mol = SmilesToMol(smi); + TEST_ASSERT(mol); + MolOps::assignStereochemistry(*mol); + TEST_ASSERT(mol->getAtomWithIdx(1)->hasProp("_CIPCode")); + mol->getAtomWithIdx(1)->getProp("_CIPCode",cip); + TEST_ASSERT(cip=="S"); + + reacts.push_back(ROMOL_SPTR(mol)); + TEST_ASSERT(reacts.size()==1); + std::vector prods; + prods = rxn->runReactants(reacts); + + TEST_ASSERT(prods.size()==1); + TEST_ASSERT(prods[0].size()==1); + + std::cout << MolToSmiles(*prods[0][0], true) << std::endl; + smi = "F[C@](Cl)(Br)O[C@](F)(Cl)Br"; + TEST_ASSERT(MolToSmiles(*prods[0][0], true) == smi); + + ROMOL_SPTR prod = prods[0][0]; + MolOps::sanitizeMol(*(static_cast(prod.get()))); + MolOps::assignStereochemistry(*prod); + TEST_ASSERT(prod->getAtomWithIdx(1)->hasProp("_CIPCode")); + prod->getAtomWithIdx(1)->getProp("_CIPCode",cip); + TEST_ASSERT(cip=="S"); + TEST_ASSERT(prod->getAtomWithIdx(5)->hasProp("_CIPCode")); + prod->getAtomWithIdx(5)->getProp("_CIPCode",cip); + TEST_ASSERT(cip=="R"); + + delete rxn; + } + + + BOOST_LOG(rdInfoLog) << "\tdone" << std::endl; +} + +void test55RedundantProductMappingNumbersAndEZStereochemistry(){ + BOOST_LOG(rdInfoLog) << "-------------------------------------" << std::endl; + BOOST_LOG(rdInfoLog) << "Testing products with redundant atom mapping numbers and chirality" << std::endl; + unsigned int nWarn,nError; + std::string smi; + { + // both double bonds in the product are (E) + smi = "[CH3:1]\\[CH:2]=[CH:3]\\[CH3:4]>>[CH3:1]\\[CH:2]=[CH:3]\\[CH2:4][CH2:4]\\[CH:3]=[CH:2]\\[CH3:1]"; + ChemicalReaction *rxn = RxnSmartsToChemicalReaction(smi, 0, true); + TEST_ASSERT(rxn->validate(nWarn,nError,false)); + TEST_ASSERT(!nWarn==0); + TEST_ASSERT(nError==0); + + MOL_SPTR_VECT reacts; + rxn->initReactantMatchers(); + reacts.clear(); + + smi = "[CH3]\\[CH]=[CH]\\[CH3]"; + ROMol *mol = SmilesToMol(smi); + TEST_ASSERT(mol); + MolOps::assignStereochemistry(*mol); + TEST_ASSERT(mol->getBondWithIdx(1)->getStereo()==Bond::STEREOE); + reacts.push_back(ROMOL_SPTR(mol)); + TEST_ASSERT(reacts.size()==1); + std::vector prods; + prods = rxn->runReactants(reacts); + + TEST_ASSERT(prods.size()==2); + TEST_ASSERT(prods[0].size()==1); + TEST_ASSERT(prods[1].size()==1); + + smi = "C/C=C/CC/C=C/C"; + TEST_ASSERT(MolToSmiles(*prods[0][0], true) == smi); + TEST_ASSERT(MolToSmiles(*prods[1][0], true) == smi); + + ROMOL_SPTR prod = prods[0][0]; + MolOps::sanitizeMol(*(static_cast(prod.get()))); + MolOps::assignStereochemistry(*prod); + TEST_ASSERT(prod->getBondWithIdx(1)->getStereo()==Bond::STEREOE); + TEST_ASSERT(prod->getBondWithIdx(5)->getStereo()==Bond::STEREOE); + prod = prods[1][0]; + MolOps::sanitizeMol(*(static_cast(prod.get()))); + MolOps::assignStereochemistry(*prod); + TEST_ASSERT(prod->getBondWithIdx(1)->getStereo()==Bond::STEREOE); + TEST_ASSERT(prod->getBondWithIdx(5)->getStereo()==Bond::STEREOE); + + delete rxn; + } + { + // both double bonds in the product are (E) + smi = "[CH3:1]\\[CH:2]=[CH:3]\\[CH3:4]>>[CH3:1]\\[CH:2]=[CH:3]\\[CH2:4][CH2:4]\\[CH:3]=[CH:2]/[CH3:1]"; + ChemicalReaction *rxn = RxnSmartsToChemicalReaction(smi, 0, true); + TEST_ASSERT(rxn->validate(nWarn,nError,false)); + TEST_ASSERT(!nWarn==0); + TEST_ASSERT(nError==0); + + MOL_SPTR_VECT reacts; + rxn->initReactantMatchers(); + reacts.clear(); + + smi = "[CH3]\\[CH]=[CH]\\[CH3]"; + ROMol *mol = SmilesToMol(smi); + TEST_ASSERT(mol); + MolOps::assignStereochemistry(*mol); + TEST_ASSERT(mol->getBondWithIdx(1)->getStereo()==Bond::STEREOE); + reacts.push_back(ROMOL_SPTR(mol)); + TEST_ASSERT(reacts.size()==1); + std::vector prods; + prods = rxn->runReactants(reacts); + + TEST_ASSERT(prods.size()==2); + TEST_ASSERT(prods[0].size()==1); + TEST_ASSERT(prods[1].size()==1); + + smi = "C/C=C/CC/C=C\\C"; + TEST_ASSERT(MolToSmiles(*prods[0][0], true) == smi); + TEST_ASSERT(MolToSmiles(*prods[1][0], true) == smi); + + ROMOL_SPTR prod = prods[0][0]; + MolOps::sanitizeMol(*(static_cast(prod.get()))); + MolOps::assignStereochemistry(*prod); + TEST_ASSERT(prod->getBondWithIdx(1)->getStereo()==Bond::STEREOE); + TEST_ASSERT(prod->getBondWithIdx(5)->getStereo()==Bond::STEREOZ); + prod = prods[1][0]; + MolOps::sanitizeMol(*(static_cast(prod.get()))); + MolOps::assignStereochemistry(*prod); + TEST_ASSERT(prod->getBondWithIdx(1)->getStereo()==Bond::STEREOE); + TEST_ASSERT(prod->getBondWithIdx(5)->getStereo()==Bond::STEREOZ); + + delete rxn; + } + { + // both double bonds in the product are (E) + smi = "[CH3:1]\\[CH:2]=[CH:3]\\[CH3:4]>>[CH3:1]\\[CH:2]=[CH:3]\\[CH:3]=[CH:2]\\[CH3:1]"; + ChemicalReaction *rxn = RxnSmartsToChemicalReaction(smi, 0, true); + TEST_ASSERT(rxn->validate(nWarn,nError,false)); + TEST_ASSERT(!nWarn==0); + TEST_ASSERT(nError==0); + + MOL_SPTR_VECT reacts; + rxn->initReactantMatchers(); + reacts.clear(); + + smi = "[CH3]\\[CH]=[CH]\\[CH3]"; + ROMol *mol = SmilesToMol(smi); + TEST_ASSERT(mol); + MolOps::assignStereochemistry(*mol); + TEST_ASSERT(mol->getBondWithIdx(1)->getStereo()==Bond::STEREOE); + reacts.push_back(ROMOL_SPTR(mol)); + TEST_ASSERT(reacts.size()==1); + std::vector prods; + prods = rxn->runReactants(reacts); + + TEST_ASSERT(prods.size()==2); + TEST_ASSERT(prods[0].size()==1); + TEST_ASSERT(prods[1].size()==1); + + smi = "C/C=C/C=C/C"; + TEST_ASSERT(MolToSmiles(*prods[0][0], true) == smi); + TEST_ASSERT(MolToSmiles(*prods[1][0], true) == smi); + + ROMOL_SPTR prod = prods[0][0]; + MolOps::sanitizeMol(*(static_cast(prod.get()))); + MolOps::assignStereochemistry(*prod); + TEST_ASSERT(prod->getBondWithIdx(1)->getStereo()==Bond::STEREOE); + TEST_ASSERT(prod->getBondWithIdx(3)->getStereo()==Bond::STEREOE); + prod = prods[1][0]; + MolOps::sanitizeMol(*(static_cast(prod.get()))); + MolOps::assignStereochemistry(*prod); + TEST_ASSERT(prod->getBondWithIdx(1)->getStereo()==Bond::STEREOE); + TEST_ASSERT(prod->getBondWithIdx(3)->getStereo()==Bond::STEREOE); + + delete rxn; + } + BOOST_LOG(rdInfoLog) << "\tdone" << std::endl; +} + +void test56SimpleReactionUtils(){ + BOOST_LOG(rdInfoLog) << "-------------------------------------" << std::endl; + BOOST_LOG(rdInfoLog) << "Testing simple reaction utils functions" << std::endl; + unsigned int nWarn,nError; + { + std::string smi = "c1ccncc1Cc1ccccc1>[Na].[OH2]>c1ccncc1.c1ccccc1"; + ChemicalReaction *rxn = RxnSmartsToChemicalReaction(smi, 0, true); + TEST_ASSERT(rxn->validate(nWarn,nError,false)); + TEST_ASSERT(!nWarn==0); + TEST_ASSERT(nError==0); + rxn->initReactantMatchers(); + + TEST_ASSERT(rxn); + TEST_ASSERT(rxn->getNumReactantTemplates()==1); + TEST_ASSERT(rxn->getNumProductTemplates()==2); + TEST_ASSERT(rxn->getNumAgentTemplates()==2); + + double reactionMW = calcProductTemplatesMW(*rxn) + calcReactantTemplatesMW(*rxn); + double reactionMWAgentsIncluded = reactionMW + calcAgentTemplatesMW(*rxn); + + TEST_ASSERT(calcReactionMW(*rxn)==reactionMW); + TEST_ASSERT(calcReactionMW(*rxn, true,true)==reactionMWAgentsIncluded); + + unsigned reactionBonds = getAgentTemplatesNumBonds(*rxn) + getProductTemplatesNumBonds(*rxn) + + getReactantTemplatesNumBonds(*rxn); + + TEST_ASSERT(getReactionNumBonds(*rxn)==26); + TEST_ASSERT(getAgentTemplatesNumBonds(*rxn)==0); + TEST_ASSERT(getProductTemplatesNumBonds(*rxn)==12); + TEST_ASSERT(getReactantTemplatesNumBonds(*rxn)==14); + TEST_ASSERT(getReactionNumBonds(*rxn, true,true)==reactionBonds); + + unsigned reactionAtoms = getAgentTemplatesNumAtoms(*rxn) + getProductTemplatesNumAtoms(*rxn) + + getReactantTemplatesNumAtoms(*rxn); + + TEST_ASSERT(getReactionNumAtoms(*rxn)==25); + TEST_ASSERT(getAgentTemplatesNumAtoms(*rxn)==2); + TEST_ASSERT(getProductTemplatesNumAtoms(*rxn)==12); + TEST_ASSERT(getReactantTemplatesNumAtoms(*rxn)==13); + TEST_ASSERT(getReactionNumAtoms(*rxn, true,true)==reactionAtoms); + + TEST_ASSERT(getReactionNumRings(*rxn)==4); + TEST_ASSERT(getAgentTemplatesNumRings(*rxn)==0); + TEST_ASSERT(getProductTemplatesNumRings(*rxn)==2); + TEST_ASSERT(getReactantTemplatesNumRings(*rxn)==2); + + delete rxn; + } + BOOST_LOG(rdInfoLog) << "\tdone" << std::endl; +} + +void test57TestOldPickleVersion(){ + BOOST_LOG(rdInfoLog) << "-------------------------------------" << std::endl; + BOOST_LOG(rdInfoLog) << "Testing old pickle file with new agent version" << std::endl; + unsigned int nWarn,nError; + { + std::string pklName = getenv("RDBASE"); + pklName += "/Code/GraphMol/ChemReactions/testData/testpickle.bin"; + std::ifstream inStream(pklName.c_str(),std::ios_base::binary); + + ChemicalReaction *rxn = new ChemicalReaction(); + ReactionPickler::reactionFromPickle(inStream, rxn); + TEST_ASSERT(rxn->validate(nWarn,nError,false)); + TEST_ASSERT(nWarn==0); + TEST_ASSERT(nError==0); + rxn->initReactantMatchers(); + + TEST_ASSERT(rxn); + TEST_ASSERT(rxn->getNumReactantTemplates()==2); + TEST_ASSERT(rxn->getNumProductTemplates()==1); + + delete rxn; + } + BOOST_LOG(rdInfoLog) << "\tdone" << std::endl; +} int main() { RDLog::InitLogs(); @@ -4126,6 +5468,20 @@ int main() { test42ReactionSmiles(); test43Github243(); test44Github290(); + test45SmilesWriter(); + test46Agents(); + test47TestReactionMoleculeConversion(); + test48ParensInProducts1(); + test49ParensInProducts2(); + test50RNXFileParserWithEmptyAgentColumn(); + test51RNXSmilesFromPatentData(); + test52RedundantProductMappingNumbersAndRunReactants(); + test53ReactionSubstructureMatching(); + test54RedundantProductMappingNumbersAndRSChirality(); + test55RedundantProductMappingNumbersAndEZStereochemistry(); + test56SimpleReactionUtils(); + test57TestOldPickleVersion(); + BOOST_LOG(rdInfoLog) << "*******************************************************\n"; return(0); diff --git a/Code/GraphMol/ChemReactions/testReactionFingerprints.cpp b/Code/GraphMol/ChemReactions/testReactionFingerprints.cpp new file mode 100644 index 000000000..eeb1ac8ae --- /dev/null +++ b/Code/GraphMol/ChemReactions/testReactionFingerprints.cpp @@ -0,0 +1,673 @@ +// $Id$ +// +// Copyright (c) 2007, Novartis Institutes for BioMedical Research Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following +// disclaimer in the documentation and/or other materials provided +// with the distribution. +// * Neither the name of Novartis Institutes for BioMedical Research Inc. +// nor the names of its contributors may be used to endorse or promote +// products derived from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +#include +#include +#include +#include +#include +#include +#include +#include "GraphMol/ChemReactions/ReactionFingerprints.h" +#include +#include +#include + +using namespace RDKit; + +void testStructuralFingerprintsReaction(){ + + BOOST_LOG(rdErrorLog) << "-------------------------------------" << std::endl; + BOOST_LOG(rdErrorLog) << " Test Reaction StructuralFingerprint" << std::endl; + { + std::string reaction, reactionq; + ChemicalReaction* rxn, *rxnq; + + reaction = "C1CCCCC1>>C1CCNCC1"; + reactionq = "C1CCCCC1>>C1CCNCC1"; + + rxn = RxnSmartsToChemicalReaction(reaction,0,true); + rxnq = RxnSmartsToChemicalReaction(reactionq,0,true); + TEST_ASSERT(rxn); + TEST_ASSERT(rxnq); + ReactionFingerprintParams params; + params.fpType = PatternFP; + params.fpSize = 4096; + + ExplicitBitVect *rxnFP = StructuralFingerprintChemReaction(*rxn, params); + ExplicitBitVect *rxnqFP = StructuralFingerprintChemReaction(*rxnq, params); + TEST_ASSERT(AllProbeBitsMatch(*rxnqFP,*rxnFP)); + + TEST_ASSERT(rxn->getNumReactantTemplates() == 1); + TEST_ASSERT(rxn->getNumProductTemplates() == 1); + TEST_ASSERT(rxnq->getNumReactantTemplates() == 1); + TEST_ASSERT(rxnq->getNumProductTemplates() == 1); + + MOL_SPTR_VECT::const_iterator reacts_iter = rxn->beginReactantTemplates(); + MOL_SPTR_VECT::const_iterator reacts_iterq = rxnq->beginReactantTemplates(); + MOL_SPTR_VECT::const_iterator products_iter = rxn->beginProductTemplates(); + MOL_SPTR_VECT::const_iterator products_iterq = rxnq->beginProductTemplates(); + + MatchVectType mv; + TEST_ASSERT(SubstructMatch(*reacts_iter->get(),*reacts_iterq->get(),mv)) + TEST_ASSERT(SubstructMatch(*products_iter->get(),*products_iterq->get(),mv)) + + delete rxn; + delete rxnq; + delete rxnFP; + delete rxnqFP; + } + { + std::string reaction, reactionq; + ChemicalReaction* rxn, *rxnq; + + reaction = "C1CCCCC1>>C1CCNCC1"; + reactionq = "C1CCCCC1>>C1CCOCC1"; + + rxn = RxnSmartsToChemicalReaction(reaction,0,true); + rxnq = RxnSmartsToChemicalReaction(reactionq,0,true); + TEST_ASSERT(rxn); + TEST_ASSERT(rxnq); + + ReactionFingerprintParams params; + params.fpType = PatternFP; + params.fpSize = 4096; + + ExplicitBitVect *rxnFP = StructuralFingerprintChemReaction(*rxn, params); + ExplicitBitVect *rxnqFP = StructuralFingerprintChemReaction(*rxnq, params); + + TEST_ASSERT(!AllProbeBitsMatch(*rxnqFP,*rxnFP)); + + TEST_ASSERT(rxn->getNumReactantTemplates() == 1); + TEST_ASSERT(rxn->getNumProductTemplates() == 1); + TEST_ASSERT(rxnq->getNumReactantTemplates() == 1); + TEST_ASSERT(rxnq->getNumProductTemplates() == 1); + + MOL_SPTR_VECT::const_iterator reacts_iter = rxn->beginReactantTemplates(); + MOL_SPTR_VECT::const_iterator reacts_iterq = rxnq->beginReactantTemplates(); + MOL_SPTR_VECT::const_iterator products_iter = rxn->beginProductTemplates(); + MOL_SPTR_VECT::const_iterator products_iterq = rxnq->beginProductTemplates(); + + MatchVectType mv; + TEST_ASSERT(SubstructMatch(*reacts_iter->get(),*reacts_iterq->get(),mv)) + TEST_ASSERT(!SubstructMatch(*products_iter->get(),*products_iterq->get(),mv)) + + delete rxn; + delete rxnq; + delete rxnFP; + delete rxnqFP; + } + { + std::string reaction, reactionq, reactionq2; + ChemicalReaction* rxn, *rxnq, *rxnq2; + + reaction = "C1CCCCC1>>C1CCNCC1"; + reactionq = ">>C1CCNCC1"; + reactionq2 = ">>C1CCOCC1"; + + rxn = RxnSmartsToChemicalReaction(reaction,0,true); + rxnq = RxnSmartsToChemicalReaction(reactionq,0,true); + rxnq2 = RxnSmartsToChemicalReaction(reactionq2,0,true); + TEST_ASSERT(rxn); + TEST_ASSERT(rxnq); + TEST_ASSERT(rxnq2); + + ReactionFingerprintParams params; + params.fpType = PatternFP; + params.fpSize = 4096; + ExplicitBitVect *rxnFP = StructuralFingerprintChemReaction(*rxn, params); + ExplicitBitVect *rxnqFP = StructuralFingerprintChemReaction(*rxnq, params); + ExplicitBitVect *rxnq2FP = StructuralFingerprintChemReaction(*rxnq2, params); + + TEST_ASSERT(AllProbeBitsMatch(*rxnqFP,*rxnFP)); + TEST_ASSERT(!AllProbeBitsMatch(*rxnq2FP,*rxnFP)); + + TEST_ASSERT(rxn->getNumReactantTemplates() == 1); + TEST_ASSERT(rxn->getNumProductTemplates() == 1); + TEST_ASSERT(rxnq->getNumReactantTemplates() == 0); + TEST_ASSERT(rxnq->getNumProductTemplates() == 1); + TEST_ASSERT(rxnq2->getNumReactantTemplates() == 0); + TEST_ASSERT(rxnq2->getNumProductTemplates() == 1); + + MOL_SPTR_VECT::const_iterator products_iter = rxn->beginProductTemplates(); + MOL_SPTR_VECT::const_iterator products_iterq = rxnq->beginProductTemplates(); + MOL_SPTR_VECT::const_iterator products_iterq2 = rxnq2->beginProductTemplates(); + + MatchVectType mv; + TEST_ASSERT(SubstructMatch(*products_iter->get(),*products_iterq->get(),mv)) + TEST_ASSERT(!SubstructMatch(*products_iter->get(),*products_iterq2->get(),mv)) + + delete rxn; + delete rxnq; + delete rxnq2; + delete rxnFP; + delete rxnqFP; + delete rxnq2FP; + } + { + std::string reaction, reactionq, reactionq2; + ChemicalReaction* rxn, *rxnq, *rxnq2; + + reaction = "C1CCCCC1>>C1CCNCC1"; + reactionq = "C1CCCCC1>>"; + reactionq2 = "C1CCOCC1>>"; + + rxn = RxnSmartsToChemicalReaction(reaction,0,true); + rxnq = RxnSmartsToChemicalReaction(reactionq,0,true); + rxnq2 = RxnSmartsToChemicalReaction(reactionq2,0,true); + TEST_ASSERT(rxn); + TEST_ASSERT(rxnq); + TEST_ASSERT(rxnq2); + + ReactionFingerprintParams params; + params.fpType = PatternFP; + params.fpSize = 4096; + + ExplicitBitVect *rxnFP = StructuralFingerprintChemReaction(*rxn, params); + ExplicitBitVect *rxnqFP = StructuralFingerprintChemReaction(*rxnq, params); + ExplicitBitVect *rxnq2FP = StructuralFingerprintChemReaction(*rxnq2, params); + + TEST_ASSERT(AllProbeBitsMatch(*rxnqFP,*rxnFP)); + TEST_ASSERT(!AllProbeBitsMatch(*rxnq2FP,*rxnFP)); + + TEST_ASSERT(rxn->getNumReactantTemplates() == 1); + TEST_ASSERT(rxn->getNumProductTemplates() == 1); + TEST_ASSERT(rxnq->getNumReactantTemplates() == 1); + TEST_ASSERT(rxnq->getNumProductTemplates() == 0); + TEST_ASSERT(rxnq2->getNumReactantTemplates() == 1); + TEST_ASSERT(rxnq2->getNumProductTemplates() == 0); + + MOL_SPTR_VECT::const_iterator react_iter = rxn->beginReactantTemplates(); + MOL_SPTR_VECT::const_iterator react_iterq = rxnq->beginReactantTemplates(); + MOL_SPTR_VECT::const_iterator react_iterq2 = rxnq2->beginReactantTemplates(); + + MatchVectType mv; + TEST_ASSERT(SubstructMatch(*react_iter->get(),*react_iterq->get(),mv)) + TEST_ASSERT(!SubstructMatch(*react_iter->get(),*react_iterq2->get(),mv)) + + delete rxn; + delete rxnq; + delete rxnq2; + delete rxnFP; + delete rxnqFP; + delete rxnq2FP; + } + { + std::string reaction, reactionq, reactionq2; + ChemicalReaction* rxn, *rxnq, *rxnq2; + + reaction = "C1CCCCC1>>C1CCNCC1"; + reactionq = "CCC>>CNC"; + reactionq2 = "CCCCC>>CCCCN"; + + rxn = RxnSmartsToChemicalReaction(reaction,0,true); + rxnq = RxnSmartsToChemicalReaction(reactionq,0,true); + rxnq2 = RxnSmartsToChemicalReaction(reactionq2,0,true); + TEST_ASSERT(rxn); + TEST_ASSERT(rxnq); + TEST_ASSERT(rxnq2); + + ReactionFingerprintParams params; + params.fpType = PatternFP; + params.fpSize = 4096; + + ExplicitBitVect *rxnFP = StructuralFingerprintChemReaction(*rxn, params); + ExplicitBitVect *rxnqFP = StructuralFingerprintChemReaction(*rxnq, params); + ExplicitBitVect *rxnq2FP = StructuralFingerprintChemReaction(*rxnq2, params); + + TEST_ASSERT(AllProbeBitsMatch(*rxnqFP,*rxnFP)); + TEST_ASSERT(AllProbeBitsMatch(*rxnq2FP,*rxnFP)); + + TEST_ASSERT(rxn->getNumReactantTemplates() == 1); + TEST_ASSERT(rxn->getNumProductTemplates() == 1); + TEST_ASSERT(rxnq->getNumReactantTemplates() == 1); + TEST_ASSERT(rxnq->getNumProductTemplates() == 1); + TEST_ASSERT(rxnq2->getNumReactantTemplates() == 1); + TEST_ASSERT(rxnq2->getNumProductTemplates() == 1); + + MOL_SPTR_VECT::const_iterator react_iter = rxn->beginReactantTemplates(); + MOL_SPTR_VECT::const_iterator react_iterq = rxnq->beginReactantTemplates(); + MOL_SPTR_VECT::const_iterator react_iterq2 = rxnq2->beginReactantTemplates(); + MOL_SPTR_VECT::const_iterator products_iter = rxn->beginProductTemplates(); + MOL_SPTR_VECT::const_iterator products_iterq = rxnq->beginProductTemplates(); + MOL_SPTR_VECT::const_iterator products_iterq2 = rxnq2->beginProductTemplates(); + + MatchVectType mv; + TEST_ASSERT(SubstructMatch(*react_iter->get(),*react_iterq->get(),mv)) + TEST_ASSERT(SubstructMatch(*react_iter->get(),*react_iterq2->get(),mv)) + TEST_ASSERT(SubstructMatch(*products_iter->get(),*products_iterq->get(),mv)) + TEST_ASSERT(SubstructMatch(*products_iter->get(),*products_iterq2->get(),mv)) + + delete rxn; + delete rxnq; + delete rxnq2; + delete rxnFP; + delete rxnqFP; + delete rxnq2FP; + } + { + std::string reaction, reactionq, reactionq2; + ChemicalReaction* rxn, *rxnq, *rxnq2; + unsigned int nWarn,nError,which; + reaction = "C1CCCCC1>>C1CCNCC1"; + reactionq = "CCC>>CNC"; + reactionq2 = "CCCCC>>CCCCN"; + + rxn = RxnSmartsToChemicalReaction(reaction,0,true); + rxnq = RxnSmartsToChemicalReaction(reactionq,0,true); + rxnq2 = RxnSmartsToChemicalReaction(reactionq2,0,true); + TEST_ASSERT(rxn); + TEST_ASSERT(rxnq); + TEST_ASSERT(rxnq2); + + ReactionFingerprintParams params; + params.fpType = PatternFP; + params.fpSize = 4096; + + ExplicitBitVect *rxnFP = StructuralFingerprintChemReaction(*rxn, params); + ExplicitBitVect *rxnqFP = StructuralFingerprintChemReaction(*rxnq, params); + ExplicitBitVect *rxnq2FP = StructuralFingerprintChemReaction(*rxnq2, params); + + TEST_ASSERT(AllProbeBitsMatch(*rxnqFP,*rxnFP)); + TEST_ASSERT(AllProbeBitsMatch(*rxnq2FP,*rxnFP)); + + TEST_ASSERT(hasReactionSubstructMatch(*rxn, *rxnq)); + TEST_ASSERT(hasReactionSubstructMatch(*rxn, *rxnq2)); + + delete rxn; + delete rxnq; + delete rxnq2; + delete rxnFP; + delete rxnqFP; + delete rxnq2FP; + } + { + std::string reaction, reactionq, reactionq2; + ChemicalReaction* rxn, *rxnq, *rxnq2; + + reaction = "C1CCCCC1>>C1CCNCC1"; + reactionq = "C1CCCCC1>>C1CCNCC1"; + reactionq2 = "C1CCCCC1>>C1CCOCC1"; + + rxn = RxnSmartsToChemicalReaction(reaction,0,true); + rxnq = RxnSmartsToChemicalReaction(reactionq,0,true); + rxnq2 = RxnSmartsToChemicalReaction(reactionq2,0,true); + TEST_ASSERT(rxn); + TEST_ASSERT(rxnq); + TEST_ASSERT(rxnq2); + + ReactionFingerprintParams params; + params.fpType = MorganFP; + params.fpSize = 4096; + + ExplicitBitVect *rxnFP = StructuralFingerprintChemReaction(*rxn, params); + ExplicitBitVect *rxnqFP = StructuralFingerprintChemReaction(*rxnq, params); + ExplicitBitVect *rxnq2FP = StructuralFingerprintChemReaction(*rxnq2, params); + + TEST_ASSERT(AllProbeBitsMatch(*rxnqFP,*rxnFP)); + TEST_ASSERT(!AllProbeBitsMatch(*rxnq2FP,*rxnFP)); + + delete rxn; + delete rxnq; + delete rxnq2; + delete rxnFP; + delete rxnqFP; + delete rxnq2FP; + } + { + std::string reaction, reactionq, reactionq2; + ChemicalReaction* rxn, *rxnq, *rxnq2; + + reaction = "C1CCCCC1>>C1CCNCC1"; + reactionq = "C1CCCCC1>>C1CCNCC1"; + reactionq2 = "C1CCCCC1>>C1CCOCC1"; + + rxn = RxnSmartsToChemicalReaction(reaction,0,true); + rxnq = RxnSmartsToChemicalReaction(reactionq,0,true); + rxnq2 = RxnSmartsToChemicalReaction(reactionq2,0,true); + TEST_ASSERT(rxn); + TEST_ASSERT(rxnq); + TEST_ASSERT(rxnq2); + + ReactionFingerprintParams params; + params.fpSize = 4096; + + ExplicitBitVect *rxnFP = StructuralFingerprintChemReaction(*rxn, params); + ExplicitBitVect *rxnqFP = StructuralFingerprintChemReaction(*rxnq, params); + ExplicitBitVect *rxnq2FP = StructuralFingerprintChemReaction(*rxnq2, params); + + TEST_ASSERT(AllProbeBitsMatch(*rxnqFP,*rxnFP)); + TEST_ASSERT(!AllProbeBitsMatch(*rxnq2FP,*rxnFP)); + + delete rxn; + delete rxnq; + delete rxnq2; + delete rxnFP; + delete rxnqFP; + delete rxnq2FP; + } + { + std::string reaction, reactionq, reactionq2; + ChemicalReaction* rxn, *rxnq, *rxnq2; + + reaction = "C1CCCCC1>>C1CCNCC1"; + reactionq = "C1CCCCC1>>C1CCNCC1"; + reactionq2 = "C1CCCCC1>>C1CCOCC1"; + + rxn = RxnSmartsToChemicalReaction(reaction,0,true); + rxnq = RxnSmartsToChemicalReaction(reactionq,0,true); + rxnq2 = RxnSmartsToChemicalReaction(reactionq2,0,true); + TEST_ASSERT(rxn); + TEST_ASSERT(rxnq); + TEST_ASSERT(rxnq2); + + ReactionFingerprintParams params; + params.fpType = TopologicalTorsion; + params.fpSize = 4096; + + ExplicitBitVect *rxnFP = StructuralFingerprintChemReaction(*rxn, params); + ExplicitBitVect *rxnqFP = StructuralFingerprintChemReaction(*rxnq, params); + ExplicitBitVect *rxnq2FP = StructuralFingerprintChemReaction(*rxnq2, params); + + TEST_ASSERT(AllProbeBitsMatch(*rxnqFP,*rxnFP)); + TEST_ASSERT(!AllProbeBitsMatch(*rxnq2FP,*rxnFP)); + + delete rxn; + delete rxnq; + delete rxnq2; + delete rxnFP; + delete rxnqFP; + delete rxnq2FP; + } + { + std::string reaction, reactionq, reactionq2; + ChemicalReaction* rxn, *rxnq, *rxnq2; + + reaction = "C1CCCCC1>>C1CCNCC1"; + reactionq = "C1CCCCC1>>C1CCNCC1"; + reactionq2 = "C1CCCCC1>>C1CCOCC1"; + + rxn = RxnSmartsToChemicalReaction(reaction,0,true); + rxnq = RxnSmartsToChemicalReaction(reactionq,0,true); + rxnq2 = RxnSmartsToChemicalReaction(reactionq2,0,true); + TEST_ASSERT(rxn); + TEST_ASSERT(rxnq); + TEST_ASSERT(rxnq2); + + ReactionFingerprintParams params; + params.fpType = RDKitFP; + params.fpSize = 4096; + + ExplicitBitVect *rxnFP = StructuralFingerprintChemReaction(*rxn, params); + ExplicitBitVect *rxnqFP = StructuralFingerprintChemReaction(*rxnq, params); + ExplicitBitVect *rxnq2FP = StructuralFingerprintChemReaction(*rxnq2, params); + + TEST_ASSERT(AllProbeBitsMatch(*rxnqFP,*rxnFP)); + TEST_ASSERT(!AllProbeBitsMatch(*rxnq2FP,*rxnFP)); + + delete rxn; + delete rxnq; + delete rxnq2; + delete rxnFP; + delete rxnqFP; + delete rxnq2FP; + } + { + std::string reaction, reactionq, reactionq2; + ChemicalReaction* rxn, *rxnq, *rxnq2; + + reaction = "C1CCCCC1>>C1CCNCC1"; + reactionq = "C1CCCCC1>>C1CCNCC1"; + reactionq2 = "C1CCCCC1>>C1CCOCC1"; + + rxn = RxnSmartsToChemicalReaction(reaction,0,true); + rxnq = RxnSmartsToChemicalReaction(reactionq,0,true); + rxnq2 = RxnSmartsToChemicalReaction(reactionq2,0,true); + TEST_ASSERT(rxn); + TEST_ASSERT(rxnq); + TEST_ASSERT(rxnq2); + + ReactionFingerprintParams params; + params.fpType = RDKitFP; + params.fpSize = 4096; + + ExplicitBitVect *rxnFP = StructuralFingerprintChemReaction(*rxn, params); + ExplicitBitVect *rxnqFP = StructuralFingerprintChemReaction(*rxnq, params); + ExplicitBitVect *rxnq2FP = StructuralFingerprintChemReaction(*rxnq2, params); + + TEST_ASSERT(AllProbeBitsMatch(*rxnqFP,*rxnFP)); + TEST_ASSERT(!AllProbeBitsMatch(*rxnq2FP,*rxnFP)); + + delete rxn; + delete rxnq; + delete rxnq2; + delete rxnFP; + delete rxnqFP; + delete rxnq2FP; + } + { + std::string reaction, reactionq, reactionq2; + ChemicalReaction* rxn, *rxnq, *rxnq2; + + reaction = "C1CCCCC1>C(=O)O.[Na]>C1CCNCC1"; + reactionq = "C1CCCCC1>C(=O)O.[Na]>C1CCNCC1"; + reactionq2 = "C1CCCCC1>>C1CCNCC1"; + + rxn = RxnSmartsToChemicalReaction(reaction,0,true); + rxnq = RxnSmartsToChemicalReaction(reactionq,0,true); + rxnq2 = RxnSmartsToChemicalReaction(reactionq2,0,true); + TEST_ASSERT(rxn); + TEST_ASSERT(rxnq); + TEST_ASSERT(rxnq2); + + ExplicitBitVect *rxnFP = StructuralFingerprintChemReaction(*rxn, DefaultStructuralFPParams); + ExplicitBitVect *rxnqFP = StructuralFingerprintChemReaction(*rxnq, DefaultStructuralFPParams); + ExplicitBitVect *rxnq2FP = StructuralFingerprintChemReaction(*rxnq2, DefaultStructuralFPParams); + + TEST_ASSERT(AllProbeBitsMatch(*rxnqFP,*rxnFP)); + TEST_ASSERT(AllProbeBitsMatch(*rxnq2FP,*rxnFP)); + + delete rxn; + delete rxnq; + delete rxnq2; + delete rxnFP; + delete rxnqFP; + delete rxnq2FP; + } + { + std::string reaction, reactionq, reactionq2; + ChemicalReaction* rxn, *rxnq, *rxnq2; + + reaction = "C1CCCCC1>[Na]>C1CCNCC1"; + reactionq = "C1CCCCC1>C(=O)O.[Na]>C1CCNCC1"; + reactionq2 = "C1CCCCC1>>C1CCNCC1"; + + rxn = RxnSmartsToChemicalReaction(reaction,0,true); + rxnq = RxnSmartsToChemicalReaction(reactionq,0,true); + rxnq2 = RxnSmartsToChemicalReaction(reactionq2,0,true); + TEST_ASSERT(rxn); + TEST_ASSERT(rxnq); + TEST_ASSERT(rxnq2); + + ExplicitBitVect *rxnFP = StructuralFingerprintChemReaction(*rxn, DefaultStructuralFPParams); + ExplicitBitVect *rxnqFP = StructuralFingerprintChemReaction(*rxnq, DefaultStructuralFPParams); + ExplicitBitVect *rxnq2FP = StructuralFingerprintChemReaction(*rxnq2, DefaultStructuralFPParams); + + TEST_ASSERT(!AllProbeBitsMatch(*rxnqFP,*rxnFP)); + TEST_ASSERT(AllProbeBitsMatch(*rxnq2FP,*rxnFP)); + + delete rxn; + delete rxnq; + delete rxnq2; + delete rxnFP; + delete rxnqFP; + delete rxnq2FP; + } +} + +void testDifferenceFingerprintsReaction(){ + + BOOST_LOG(rdErrorLog) << "-------------------------------------" << std::endl; + BOOST_LOG(rdErrorLog) << " Test Reaction DifferenceFingerprint" << std::endl; + { + std::string reaction1, reaction2; + ChemicalReaction* rxn1, *rxn2; + + reaction1 = "C1CCCCC1>>C1CCCCC1"; + reaction2 = "C1CCCCC1>>C1CCNCC1"; + + rxn1 = RxnSmartsToChemicalReaction(reaction1,0,true); + rxn2 = RxnSmartsToChemicalReaction(reaction2,0,true); + TEST_ASSERT(rxn1); + TEST_ASSERT(rxn2); + + SparseIntVect *rxn1FP = DifferenceFingerprintChemReaction(*rxn1); + SparseIntVect *rxn2FP = DifferenceFingerprintChemReaction(*rxn2); + + TEST_ASSERT(TanimotoSimilarity(*rxn1FP,*rxn2FP) == 0.0);; + + delete rxn1; + delete rxn2; + delete rxn1FP; + delete rxn2FP; + } + { + std::string reaction1, reaction2; + ChemicalReaction* rxn1, *rxn2; + + reaction1 = "C1CCCCC1>>C1CCOCC1"; + reaction2 = "C1CCCCC1>>C1CCNCC1"; + + rxn1 = RxnSmartsToChemicalReaction(reaction1,0,true); + rxn2 = RxnSmartsToChemicalReaction(reaction2,0,true); + TEST_ASSERT(rxn1); + TEST_ASSERT(rxn2); + + SparseIntVect *rxn1FP = DifferenceFingerprintChemReaction(*rxn1); + SparseIntVect *rxn2FP = DifferenceFingerprintChemReaction(*rxn2); + + TEST_ASSERT(TanimotoSimilarity(*rxn1FP,*rxn2FP) > 0.0); + TEST_ASSERT(TanimotoSimilarity(*rxn1FP,*rxn2FP) <= 1.0); + + delete rxn1; + delete rxn2; + delete rxn1FP; + delete rxn2FP; + } + { + std::string reaction1, reaction2; + ChemicalReaction* rxn1, *rxn2; + + reaction1 = "c1ccccc1>>c1ccncn1"; + reaction2 = "c1ccccc1>>c1ccncc1"; + rxn1 = RxnSmartsToChemicalReaction(reaction1,0,true); + rxn2 = RxnSmartsToChemicalReaction(reaction2,0,true); + TEST_ASSERT(rxn1); + TEST_ASSERT(rxn2); + + SparseIntVect *rxn1FP = DifferenceFingerprintChemReaction(*rxn1); + SparseIntVect *rxn2FP = DifferenceFingerprintChemReaction(*rxn2); + + TEST_ASSERT(TanimotoSimilarity(*rxn1FP,*rxn2FP) > 0.0); + TEST_ASSERT(TanimotoSimilarity(*rxn1FP,*rxn2FP) <= 1.0); + + delete rxn1; + delete rxn2; + delete rxn1FP; + delete rxn2FP; + } + { + std::string reaction1, reaction2; + ChemicalReaction* rxn1, *rxn2; + + reaction1 = "c1ccccc1>>c1ccncn1"; + reaction2 = "c1ccccc1>>c1ccncc1"; + rxn1 = RxnSmartsToChemicalReaction(reaction1,0,true); + rxn2 = RxnSmartsToChemicalReaction(reaction2,0,true); + TEST_ASSERT(rxn1); + TEST_ASSERT(rxn2); + + ReactionFingerprintParams params; + params.fpType = MorganFP; + + SparseIntVect *rxn1FP = DifferenceFingerprintChemReaction(*rxn1, params); + SparseIntVect *rxn2FP = DifferenceFingerprintChemReaction(*rxn2, params); + + TEST_ASSERT(TanimotoSimilarity(*rxn1FP,*rxn2FP) > 0.0); + TEST_ASSERT(TanimotoSimilarity(*rxn1FP,*rxn2FP) <= 1.0); + + delete rxn1; + delete rxn2; + delete rxn1FP; + delete rxn2FP; + } + { + std::string reaction1, reaction2; + ChemicalReaction* rxn1, *rxn2; + + reaction1 = "c1ccccc1>>c1ccncn1"; + reaction2 = "c1ccccc1>>c1ccncc1"; + rxn1 = RxnSmartsToChemicalReaction(reaction1,0,true); + rxn2 = RxnSmartsToChemicalReaction(reaction2,0,true); + TEST_ASSERT(rxn1); + TEST_ASSERT(rxn2); + + ReactionFingerprintParams params; + params.fpType = TopologicalTorsion; + + SparseIntVect *rxn1FP = DifferenceFingerprintChemReaction(*rxn1, params); + SparseIntVect *rxn2FP = DifferenceFingerprintChemReaction(*rxn2, params); + + TEST_ASSERT(TanimotoSimilarity(*rxn1FP,*rxn2FP) > 0.0); + TEST_ASSERT(TanimotoSimilarity(*rxn1FP,*rxn2FP) <= 1.0); + + delete rxn1; + delete rxn2; + delete rxn1FP; + delete rxn2FP; + } +} + + +int main() { + RDLog::InitLogs(); + + BOOST_LOG(rdInfoLog) << "********************************************************\n"; + BOOST_LOG(rdInfoLog) << "Testing Chemical Reaction Fingerprints \n"; + + testStructuralFingerprintsReaction(); + testDifferenceFingerprintsReaction(); + + BOOST_LOG(rdInfoLog) << "*******************************************************\n"; + return(0); +} + + diff --git a/Code/GraphMol/Fingerprints/MorganFingerprints.cpp b/Code/GraphMol/Fingerprints/MorganFingerprints.cpp index 6969ef042..b0beef3d2 100644 --- a/Code/GraphMol/Fingerprints/MorganFingerprints.cpp +++ b/Code/GraphMol/Fingerprints/MorganFingerprints.cpp @@ -162,7 +162,7 @@ $([N;H0&+0]([C;!$(C(=O))])([C;!$(C(=O))])[C;!$(C(=O))])]", // Basic } else { v.setVal(bit,1); } - return elem; + return bit; } uint32_t updateElement(ExplicitBitVect &v,unsigned int elem, bool counting=false){ uint32_t bit=elem%v.getNumBits(); diff --git a/Code/GraphMol/Fingerprints/test1.cpp b/Code/GraphMol/Fingerprints/test1.cpp index 820e50b80..6f5233c37 100644 --- a/Code/GraphMol/Fingerprints/test1.cpp +++ b/Code/GraphMol/Fingerprints/test1.cpp @@ -1790,6 +1790,7 @@ void testMorganAtomInfo(){ TEST_ASSERT(bitInfo.size()==2); for(MorganFingerprints::BitInfoMap::const_iterator iter=bitInfo.begin(); iter!=bitInfo.end();++iter){ + TEST_ASSERT(iter->first<2048); TEST_ASSERT(fp->getBit(iter->first)); } for(MorganFingerprints::BitInfoMap::const_iterator iter=bitInfo.begin(); @@ -1804,6 +1805,7 @@ void testMorganAtomInfo(){ TEST_ASSERT(bitInfo.size()==5); for(MorganFingerprints::BitInfoMap::const_iterator iter=bitInfo.begin(); iter!=bitInfo.end();++iter){ + TEST_ASSERT(iter->first<2048); TEST_ASSERT(fp->getBit(iter->first)); } for(MorganFingerprints::BitInfoMap::const_iterator iter=bitInfo.begin(); @@ -1816,6 +1818,32 @@ void testMorganAtomInfo(){ delete mol; } + { // this was github issue #295 + + ROMol *mol; + MorganFingerprints::BitInfoMap bitInfo1,bitInfo2; + + mol = SmilesToMol("CCCCC"); + + ExplicitBitVect *fp; + fp = MorganFingerprints::getFingerprintAsBitVect(*mol,2,2048,0,0,false,true,false,&bitInfo1); + delete fp; + + SparseIntVect *iv; + iv = MorganFingerprints::getHashedFingerprint(*mol,2,2048,0,0,false,true,false,&bitInfo2); + delete iv; + + TEST_ASSERT(bitInfo1.size()==bitInfo2.size()); + + for(MorganFingerprints::BitInfoMap::const_iterator iter1=bitInfo1.begin(); + iter1!=bitInfo1.end();++iter1){ + TEST_ASSERT(iter1->first<2048); + TEST_ASSERT(bitInfo2.find(iter1->first)!=bitInfo2.end()); + } + + delete mol; + } + BOOST_LOG(rdErrorLog) << " done" << std::endl; } diff --git a/Code/GraphMol/ForceFieldHelpers/MMFF/AtomTyper.cpp b/Code/GraphMol/ForceFieldHelpers/MMFF/AtomTyper.cpp index e3cc9a5c3..4a859b195 100644 --- a/Code/GraphMol/ForceFieldHelpers/MMFF/AtomTyper.cpp +++ b/Code/GraphMol/ForceFieldHelpers/MMFF/AtomTyper.cpp @@ -48,6 +48,37 @@ namespace RDKit { return periodicTableRow; } + // given the atomic num, this function returns the periodic + // table row number, starting from 1 for helium + // Hydrogen has a special row number (0), while transition + // metals have the row number multiplied by 10 + unsigned int getPeriodicTableRowHL(const int atomicNum) + { + unsigned int periodicTableRow = 0; + + if (atomicNum == 2) { + periodicTableRow = 1; + } + else if ((atomicNum >= 3) && (atomicNum <= 10)) { + periodicTableRow = 2; + } + else if ((atomicNum >= 11) && (atomicNum <= 18)) { + periodicTableRow = 3; + } + else if ((atomicNum >= 19) && (atomicNum <= 36)) { + periodicTableRow = 4; + } + else if ((atomicNum >= 37) && (atomicNum <= 54)) { + periodicTableRow = 5; + } + if (((atomicNum >= 21) && (atomicNum <= 30)) + || ((atomicNum >= 39) && (atomicNum <= 48)) + || ((atomicNum >= 39) && (atomicNum <= 48))) { + periodicTableRow *= 10; + } + + return periodicTableRow; + } // given the MMFF atom type, this function returns true // if it is aromatic @@ -2473,9 +2504,12 @@ namespace RDKit { PRECONDITION(this->isValid(), "missing atom types - invalid force-field"); const MMFFBond *mmffBndkParams; + const MMFFHerschbachLaurie *mmffHerschbachLaurieParams; const MMFFProp *mmffAtomPropParams[2]; const MMFFCovRadPauEle *mmffAtomCovRadPauEleParams[2]; MMFFBndkCollection *mmffBndk = MMFFBndkCollection::getMMFFBndk(); + MMFFHerschbachLaurieCollection *mmffHerschbachLaurie = + MMFFHerschbachLaurieCollection::getMMFFHerschbachLaurie(); MMFFCovRadPauEleCollection *mmffCovRadPauEle = MMFFCovRadPauEleCollection::getMMFFCovRadPauEle(); MMFFPropCollection *mmffProp = MMFFPropCollection::getMMFFProp(); @@ -2593,11 +2627,23 @@ namespace RDKit { mmffBondParams->r0 = (r0_i[0] + r0_i[1] - c * pow(fabs (mmffAtomCovRadPauEleParams[0]->chi - mmffAtomCovRadPauEleParams[1]->chi), n) - delta); - // equation (19) - MMFF.V, page 625 - double coeff = mmffBndkParams->r0 / mmffBondParams->r0; - double coeff2 = coeff * coeff; - double coeff6 = coeff2 * coeff2 * coeff2; - mmffBondParams->kb = mmffBndkParams->kb * coeff6; + if (mmffBndkParams) { + // equation (19) - MMFF.V, page 625 + double coeff = mmffBndkParams->r0 / mmffBondParams->r0; + double coeff2 = coeff * coeff; + double coeff6 = coeff2 * coeff2 * coeff2; + mmffBondParams->kb = mmffBndkParams->kb * coeff6; + } + else { + // MMFF.V, page 627 + // Herschbach-Laurie version of Badger's rule + // J. Chem. Phys. 35, 458 (1961); http://dx.doi.org/10.1063/1.1731952 + // equation (8), page 5 + mmffHerschbachLaurieParams = (*mmffHerschbachLaurie) + (getPeriodicTableRowHL(atomicNum1), getPeriodicTableRowHL(atomicNum2)); + mmffBondParams->kb = pow(10.0, -(mmffBondParams->r0 + - mmffHerschbachLaurieParams->a_ij) / mmffHerschbachLaurieParams->d_ij); + } return (const ForceFields::MMFF::MMFFBond *)mmffBondParams; } diff --git a/Code/GraphMol/ForceFieldHelpers/MMFF/testMMFFHelpers.cpp b/Code/GraphMol/ForceFieldHelpers/MMFF/testMMFFHelpers.cpp index 5d05662bc..4ece37095 100644 --- a/Code/GraphMol/ForceFieldHelpers/MMFF/testMMFFHelpers.cpp +++ b/Code/GraphMol/ForceFieldHelpers/MMFF/testMMFFHelpers.cpp @@ -484,6 +484,24 @@ void testIssue242() BOOST_LOG(rdErrorLog) << " done" << std::endl; } +void testGithub308() +{ + BOOST_LOG(rdErrorLog) << "-------------------------------------" << std::endl; + BOOST_LOG(rdErrorLog) << " Testing github 308: crash during MMFF parameterization ." << std::endl; + ROMol *mol = SmilesToMol("FF"); + TEST_ASSERT(DGeomHelpers::EmbedMolecule(*mol) >= 0); + int needMore; + ForceFields::ForceField *field = 0; + TEST_ASSERT(mol); + MMFF::MMFFMolProperties mmffMolProperties(*mol); + TEST_ASSERT(mmffMolProperties.isValid()); + field = MMFF::constructForceField(*mol); + TEST_ASSERT(field); + field->initialize(); + needMore = field->minimize(200, 1.0e-6, 1.0e-3); + TEST_ASSERT(!needMore); +} + void testSFIssue1653802() { BOOST_LOG(rdErrorLog) << "-------------------------------------" << std::endl; @@ -734,6 +752,7 @@ int main() testMMFFBuilder2(); testIssue239(); testIssue242(); + testGithub308(); testSFIssue1653802(); testSFIssue2378119(); testMMFFBatch(); diff --git a/Code/GraphMol/MolOps.cpp b/Code/GraphMol/MolOps.cpp index 5bbc6c94a..eeab30ef3 100644 --- a/Code/GraphMol/MolOps.cpp +++ b/Code/GraphMol/MolOps.cpp @@ -1,6 +1,7 @@ // $Id$ // -// Copyright (C) 2001-2014 Greg Landrum and Rational Discovery LLC +// Copyright (C) 2001-2012 Greg Landrum and Rational Discovery LLC +// Copyright (c) 2014, Novartis Institutes for BioMedical Research Inc. // // @@ All Rights Reserved @@ // This file is part of the RDKit. @@ -30,6 +31,7 @@ #include #include +#include const int ci_LOCAL_INF=static_cast(1e8); @@ -516,5 +518,17 @@ namespace RDKit{ } return accum; }; + + unsigned getNumAtomsWithDistinctProperty(const ROMol& mol, std::string prop) + { + unsigned numPropAtoms=0; + for (ROMol::ConstAtomIterator ai = mol.beginAtoms(); + ai != mol.endAtoms(); ++ai) { + if((*ai)->hasProp(prop)){ + ++numPropAtoms; + } + } + return numPropAtoms; + } }; // end of namespace MolOps }; // end of namespace RDKit diff --git a/Code/GraphMol/MolOps.h b/Code/GraphMol/MolOps.h index 29b43d692..ce67b064f 100644 --- a/Code/GraphMol/MolOps.h +++ b/Code/GraphMol/MolOps.h @@ -1,5 +1,6 @@ // // Copyright (C) 2001-2012 Greg Landrum and Rational Discovery LLC +// Copyright (c) 2014, Novartis Institutes for BioMedical Research Inc. // // @@ All Rights Reserved @@ // This file is part of the RDKit. @@ -716,6 +717,9 @@ namespace RDKit{ void findPotentialStereoBonds(ROMol &mol,bool cleanIt=false); //@} + //! returns the number of atoms which have a particular property set + unsigned getNumAtomsWithDistinctProperty(const ROMol& mol, std::string prop); + }; // end of namespace MolOps }; // end of namespace RDKit diff --git a/Code/GraphMol/MolPickler.cpp b/Code/GraphMol/MolPickler.cpp index 8936aff8e..49198a11b 100644 --- a/Code/GraphMol/MolPickler.cpp +++ b/Code/GraphMol/MolPickler.cpp @@ -193,6 +193,8 @@ namespace RDKit{ query->setDataFunc(queryAtomHCount); } else if(descr=="AtomImplicitHCount"){ query->setDataFunc(queryAtomImplicitHCount); + } else if(descr=="AtomHasImplicitH"){ + query->setDataFunc(queryAtomHasImplicitH); } else if(descr=="AtomIsAromatic"){ query->setDataFunc(queryAtomAromatic); } else if(descr=="AtomIsAliphatic"){ diff --git a/Code/GraphMol/QueryOps.cpp b/Code/GraphMol/QueryOps.cpp index e56ba6b58..11bc45f69 100644 --- a/Code/GraphMol/QueryOps.cpp +++ b/Code/GraphMol/QueryOps.cpp @@ -205,6 +205,11 @@ ATOM_EQUALS_QUERY *makeAtomImplicitHCountQuery(int what){ res->setDescription("AtomImplicitHCount"); return res; } +ATOM_EQUALS_QUERY *makeAtomHasImplicitHQuery(){ + ATOM_EQUALS_QUERY *res=makeAtomSimpleQuery(true,queryAtomHasImplicitH); + res->setDescription("AtomHasImplicitH"); + return res; +} ATOM_EQUALS_QUERY *makeAtomAromaticQuery(){ ATOM_EQUALS_QUERY *res=makeAtomSimpleQuery(true,queryAtomAromatic); diff --git a/Code/GraphMol/QueryOps.h b/Code/GraphMol/QueryOps.h index b7f832dc2..c9fd90cfa 100644 --- a/Code/GraphMol/QueryOps.h +++ b/Code/GraphMol/QueryOps.h @@ -69,6 +69,7 @@ namespace RDKit{ static int queryAtomHeavyAtomDegree(Atom const * at) { return at->getTotalDegree()-at->getTotalNumHs(true); }; static int queryAtomHCount(Atom const * at) { return at->getTotalNumHs(true); }; static int queryAtomImplicitHCount(Atom const * at) { return at->getTotalNumHs(false); }; + static int queryAtomHasImplicitH(Atom const * at) { return int(at->getTotalNumHs(false)>0); }; static int queryAtomImplicitValence(Atom const * at) { return at->getImplicitValence(); }; static int queryAtomExplicitValence(Atom const * at) { return at->getExplicitValence() - at->getNumExplicitHs(); }; static int queryAtomTotalValence(Atom const * at) { return at->getExplicitValence()+at->getImplicitValence(); }; @@ -215,6 +216,15 @@ namespace RDKit{ //! \overload ATOM_EQUALS_QUERY *makeAtomHCountQuery(int what); + //! returns a Query for matching ring atoms + template + T *makeAtomHasImplicitHQuery(const std::string &descr){ + return makeAtomSimpleQuery(true,queryAtomHasImplicitH,descr); + } + //! \overload + ATOM_EQUALS_QUERY *makeAtomHasImplicitHQuery(); + + //! returns a Query for matching implicit hydrogen count template T *makeAtomImplicitHCountQuery(int what,const std::string &descr){ diff --git a/Code/GraphMol/SmilesParse/SmartsWrite.cpp b/Code/GraphMol/SmilesParse/SmartsWrite.cpp index e93adb4b1..7623c94cf 100644 --- a/Code/GraphMol/SmilesParse/SmartsWrite.cpp +++ b/Code/GraphMol/SmilesParse/SmartsWrite.cpp @@ -130,6 +130,9 @@ namespace RDKit { if (descrip == "AtomImplicitHCount") { res << "h" << query->getVal(); needParen = true; + }else if (descrip == "AtomHasImplicitH") { + res << "h"; + needParen = true; } else if (descrip == "AtomTotalValence") { res << "v" << query->getVal(); needParen = true; diff --git a/Code/GraphMol/SmilesParse/lex.yysmarts.cpp.cmake b/Code/GraphMol/SmilesParse/lex.yysmarts.cpp.cmake index 7383baa66..9a8b5b651 100644 --- a/Code/GraphMol/SmilesParse/lex.yysmarts.cpp.cmake +++ b/Code/GraphMol/SmilesParse/lex.yysmarts.cpp.cmake @@ -1,6 +1,6 @@ -#line 2 "/scratch/RDKit_git/Code/GraphMol/SmilesParse/lex.yysmarts.cpp" +#line 2 "/home/glandrum/RDKit_git/Code/GraphMol/SmilesParse/lex.yysmarts.cpp" -#line 4 "/scratch/RDKit_git/Code/GraphMol/SmilesParse/lex.yysmarts.cpp" +#line 4 "/home/glandrum/RDKit_git/Code/GraphMol/SmilesParse/lex.yysmarts.cpp" #define YY_INT_ALIGNED short int @@ -621,7 +621,7 @@ void smarts_lexer_error(const char *msg) { -#line 625 "/scratch/RDKit_git/Code/GraphMol/SmilesParse/lex.yysmarts.cpp" +#line 625 "/home/glandrum/RDKit_git/Code/GraphMol/SmilesParse/lex.yysmarts.cpp" #define INITIAL 0 #define IN_ATOM_STATE 1 @@ -871,7 +871,7 @@ YY_DECL #line 47 "smarts.ll" -#line 875 "/scratch/RDKit_git/Code/GraphMol/SmilesParse/lex.yysmarts.cpp" +#line 875 "/home/glandrum/RDKit_git/Code/GraphMol/SmilesParse/lex.yysmarts.cpp" yylval = yylval_param; @@ -1204,8 +1204,8 @@ YY_RULE_SETUP #line 176 "smarts.ll" { yylval->atom = new QueryAtom(); - yylval->atom->setQuery(makeAtomImplicitHCountQuery(1)); - return COMPLEX_ATOM_QUERY_TOKEN; + yylval->atom->setQuery(makeAtomHasImplicitHQuery()); + return IMPLICIT_H_ATOM_QUERY_TOKEN; } YY_BREAK case 104: @@ -1543,7 +1543,7 @@ YY_RULE_SETUP #line 345 "smarts.ll" ECHO; YY_BREAK -#line 1547 "/scratch/RDKit_git/Code/GraphMol/SmilesParse/lex.yysmarts.cpp" +#line 1547 "/home/glandrum/RDKit_git/Code/GraphMol/SmilesParse/lex.yysmarts.cpp" case YY_END_OF_BUFFER: { diff --git a/Code/GraphMol/SmilesParse/smarts.ll b/Code/GraphMol/SmilesParse/smarts.ll index f83e13eb0..9d00f5dc8 100644 --- a/Code/GraphMol/SmilesParse/smarts.ll +++ b/Code/GraphMol/SmilesParse/smarts.ll @@ -175,8 +175,8 @@ void smarts_lexer_error(const char *msg) { h { yylval->atom = new QueryAtom(); - yylval->atom->setQuery(makeAtomImplicitHCountQuery(1)); - return COMPLEX_ATOM_QUERY_TOKEN; + yylval->atom->setQuery(makeAtomHasImplicitHQuery()); + return IMPLICIT_H_ATOM_QUERY_TOKEN; } R { diff --git a/Code/GraphMol/SmilesParse/smarts.tab.cpp.cmake b/Code/GraphMol/SmilesParse/smarts.tab.cpp.cmake index 8bdc6fa96..c9a1ba8be 100644 --- a/Code/GraphMol/SmilesParse/smarts.tab.cpp.cmake +++ b/Code/GraphMol/SmilesParse/smarts.tab.cpp.cmake @@ -1,8 +1,10 @@ -/* A Bison parser, made by GNU Bison 2.5. */ -/* Bison implementation for Yacc-like parsers in C +/* A Bison parser, made by GNU Bison 2.4.1. */ + +/* Skeleton implementation for Bison's Yacc-like parsers in C - Copyright (C) 1984, 1989-1990, 2000-2011 Free Software Foundation, Inc. + Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006 + Free Software Foundation, Inc. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -44,7 +46,7 @@ #define YYBISON 1 /* Bison version. */ -#define YYBISON_VERSION "2.5" +#define YYBISON_VERSION "2.4.1" /* Skeleton name. */ #define YYSKELETON_NAME "yacc.c" @@ -73,8 +75,8 @@ /* Copy the first part of user declarations. */ -/* Line 268 of yacc.c */ -#line 3 "smarts.yy" +/* Line 189 of yacc.c */ +#line 1 "smarts.yy" // $Id$ @@ -98,7 +100,6 @@ extern int yysmarts_lex(YYSTYPE *,void *); #define YYDEBUG 1 -#define YYLEX_PARAM scanner void yysmarts_error( const char *input, @@ -121,8 +122,8 @@ namespace { } -/* Line 268 of yacc.c */ -#line 126 "/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp" +/* Line 189 of yacc.c */ +#line 127 "/home/glandrum/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp" /* Enabling traces. */ #ifndef YYDEBUG @@ -155,33 +156,34 @@ namespace { SIMPLE_ATOM_QUERY_TOKEN = 261, COMPLEX_ATOM_QUERY_TOKEN = 262, RINGSIZE_ATOM_QUERY_TOKEN = 263, - HYB_TOKEN = 264, - ZERO_TOKEN = 265, - NONZERO_DIGIT_TOKEN = 266, - GROUP_OPEN_TOKEN = 267, - GROUP_CLOSE_TOKEN = 268, - SEPARATOR_TOKEN = 269, - HASH_TOKEN = 270, - MINUS_TOKEN = 271, - PLUS_TOKEN = 272, - CHIRAL_MARKER_TOKEN = 273, - CHI_CLASS_TOKEN = 274, - CHI_CLASS_OH_TOKEN = 275, - H_TOKEN = 276, - AT_TOKEN = 277, - PERCENT_TOKEN = 278, - ATOM_OPEN_TOKEN = 279, - ATOM_CLOSE_TOKEN = 280, - NOT_TOKEN = 281, - AND_TOKEN = 282, - OR_TOKEN = 283, - SEMI_TOKEN = 284, - BEGIN_RECURSE = 285, - END_RECURSE = 286, - COLON_TOKEN = 287, - UNDERSCORE_TOKEN = 288, - BOND_TOKEN = 289, - EOS_TOKEN = 290 + IMPLICIT_H_ATOM_QUERY_TOKEN = 264, + HYB_TOKEN = 265, + ZERO_TOKEN = 266, + NONZERO_DIGIT_TOKEN = 267, + GROUP_OPEN_TOKEN = 268, + GROUP_CLOSE_TOKEN = 269, + SEPARATOR_TOKEN = 270, + HASH_TOKEN = 271, + MINUS_TOKEN = 272, + PLUS_TOKEN = 273, + CHIRAL_MARKER_TOKEN = 274, + CHI_CLASS_TOKEN = 275, + CHI_CLASS_OH_TOKEN = 276, + H_TOKEN = 277, + AT_TOKEN = 278, + PERCENT_TOKEN = 279, + ATOM_OPEN_TOKEN = 280, + ATOM_CLOSE_TOKEN = 281, + NOT_TOKEN = 282, + AND_TOKEN = 283, + OR_TOKEN = 284, + SEMI_TOKEN = 285, + BEGIN_RECURSE = 286, + END_RECURSE = 287, + COLON_TOKEN = 288, + UNDERSCORE_TOKEN = 289, + BOND_TOKEN = 290, + EOS_TOKEN = 291 }; #endif @@ -191,8 +193,8 @@ namespace { typedef union YYSTYPE { -/* Line 293 of yacc.c */ -#line 53 "smarts.yy" +/* Line 214 of yacc.c */ +#line 52 "smarts.yy" int moli; RDKit::QueryAtom * atom; @@ -201,8 +203,8 @@ typedef union YYSTYPE -/* Line 293 of yacc.c */ -#line 206 "/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp" +/* Line 214 of yacc.c */ +#line 208 "/home/glandrum/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp" } YYSTYPE; # define YYSTYPE_IS_TRIVIAL 1 # define yystype YYSTYPE /* obsolescent; will be withdrawn */ @@ -213,8 +215,8 @@ typedef union YYSTYPE /* Copy the second part of user declarations. */ -/* Line 343 of yacc.c */ -#line 218 "/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp" +/* Line 264 of yacc.c */ +#line 220 "/home/glandrum/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp" #ifdef short # undef short @@ -264,7 +266,7 @@ typedef short int yytype_int16; #define YYSIZE_MAXIMUM ((YYSIZE_T) -1) #ifndef YY_ -# if defined YYENABLE_NLS && YYENABLE_NLS +# if YYENABLE_NLS # if ENABLE_NLS # include /* INFRINGES ON USER NAME SPACE */ # define YY_(msgid) dgettext ("bison-runtime", msgid) @@ -317,11 +319,11 @@ YYID (yyi) # define alloca _alloca # else # define YYSTACK_ALLOC alloca -# if ! defined _ALLOCA_H && ! defined EXIT_SUCCESS && (defined __STDC__ || defined __C99__FUNC__ \ +# if ! defined _ALLOCA_H && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) # include /* INFRINGES ON USER NAME SPACE */ -# ifndef EXIT_SUCCESS -# define EXIT_SUCCESS 0 +# ifndef _STDLIB_H +# define _STDLIB_H 1 # endif # endif # endif @@ -344,24 +346,24 @@ YYID (yyi) # ifndef YYSTACK_ALLOC_MAXIMUM # define YYSTACK_ALLOC_MAXIMUM YYSIZE_MAXIMUM # endif -# if (defined __cplusplus && ! defined EXIT_SUCCESS \ +# if (defined __cplusplus && ! defined _STDLIB_H \ && ! ((defined YYMALLOC || defined malloc) \ && (defined YYFREE || defined free))) # include /* INFRINGES ON USER NAME SPACE */ -# ifndef EXIT_SUCCESS -# define EXIT_SUCCESS 0 +# ifndef _STDLIB_H +# define _STDLIB_H 1 # endif # endif # ifndef YYMALLOC # define YYMALLOC malloc -# if ! defined malloc && ! defined EXIT_SUCCESS && (defined __STDC__ || defined __C99__FUNC__ \ +# if ! defined malloc && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */ # endif # endif # ifndef YYFREE # define YYFREE free -# if ! defined free && ! defined EXIT_SUCCESS && (defined __STDC__ || defined __C99__FUNC__ \ +# if ! defined free && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) void free (void *); /* INFRINGES ON USER NAME SPACE */ # endif @@ -390,7 +392,23 @@ union yyalloc ((N) * (sizeof (yytype_int16) + sizeof (YYSTYPE)) \ + YYSTACK_GAP_MAXIMUM) -# define YYCOPY_NEEDED 1 +/* Copy COUNT objects from FROM to TO. The source and destination do + not overlap. */ +# ifndef YYCOPY +# if defined __GNUC__ && 1 < __GNUC__ +# define YYCOPY(To, From, Count) \ + __builtin_memcpy (To, From, (Count) * sizeof (*(From))) +# else +# define YYCOPY(To, From, Count) \ + do \ + { \ + YYSIZE_T yyi; \ + for (yyi = 0; yyi < (Count); yyi++) \ + (To)[yyi] = (From)[yyi]; \ + } \ + while (YYID (0)) +# endif +# endif /* Relocate STACK from its old location to the new one. The local variables YYSIZE and YYSTACKSIZE give the old and new number of @@ -410,43 +428,23 @@ union yyalloc #endif -#if defined YYCOPY_NEEDED && YYCOPY_NEEDED -/* Copy COUNT objects from FROM to TO. The source and destination do - not overlap. */ -# ifndef YYCOPY -# if defined __GNUC__ && 1 < __GNUC__ -# define YYCOPY(To, From, Count) \ - __builtin_memcpy (To, From, (Count) * sizeof (*(From))) -# else -# define YYCOPY(To, From, Count) \ - do \ - { \ - YYSIZE_T yyi; \ - for (yyi = 0; yyi < (Count); yyi++) \ - (To)[yyi] = (From)[yyi]; \ - } \ - while (YYID (0)) -# endif -# endif -#endif /* !YYCOPY_NEEDED */ - /* YYFINAL -- State number of the termination state. */ -#define YYFINAL 32 +#define YYFINAL 33 /* YYLAST -- Last index in YYTABLE. */ -#define YYLAST 385 +#define YYLAST 375 /* YYNTOKENS -- Number of terminals. */ -#define YYNTOKENS 36 +#define YYNTOKENS 37 /* YYNNTS -- Number of nonterminals. */ #define YYNNTS 18 /* YYNRULES -- Number of rules. */ -#define YYNRULES 75 +#define YYNRULES 77 /* YYNRULES -- Number of states. */ -#define YYNSTATES 107 +#define YYNSTATES 109 /* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */ #define YYUNDEFTOK 2 -#define YYMAXUTOK 290 +#define YYMAXUTOK 291 #define YYTRANSLATE(YYX) \ ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK) @@ -483,7 +481,7 @@ static const yytype_uint8 yytranslate[] = 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, - 35 + 35, 36 }; #if YYDEBUG @@ -495,50 +493,51 @@ static const yytype_uint8 yyprhs[] = 27, 31, 34, 38, 42, 47, 49, 53, 59, 63, 69, 73, 77, 81, 84, 86, 89, 91, 93, 97, 103, 105, 108, 110, 113, 116, 120, 122, 125, 127, - 130, 133, 135, 137, 140, 142, 144, 146, 148, 150, - 152, 156, 160, 164, 166, 168, 171, 173, 175, 177, - 179, 181, 184, 187, 190, 192, 195, 198, 200, 202, - 206, 208, 210, 212, 215, 217 + 130, 132, 135, 138, 140, 142, 145, 147, 149, 151, + 153, 155, 157, 161, 165, 169, 171, 173, 176, 178, + 180, 182, 184, 186, 189, 192, 195, 197, 200, 203, + 205, 207, 211, 213, 215, 217, 220, 222 }; /* YYRHS -- A `-1'-separated list of the rules' RHS. */ static const yytype_int8 yyrhs[] = { - 37, 0, -1, 38, -1, 37, 1, 35, -1, 37, - 35, -1, 1, 35, -1, 40, -1, 38, 40, -1, - 38, 46, 40, -1, 38, 50, -1, 38, 46, 50, - -1, 38, 39, -1, 38, 14, 38, -1, 12, 38, - 13, -1, 12, 46, 38, 13, -1, 45, -1, 24, - 21, 25, -1, 24, 21, 32, 51, 25, -1, 24, - 41, 25, -1, 24, 41, 32, 51, 25, -1, 41, - 27, 41, -1, 41, 28, 41, -1, 41, 29, 41, - -1, 41, 42, -1, 42, -1, 26, 42, -1, 43, - -1, 44, -1, 30, 38, 31, -1, 30, 38, 31, - 33, 52, -1, 45, -1, 51, 45, -1, 5, -1, - 51, 5, -1, 15, 51, -1, 51, 15, 51, -1, - 7, -1, 7, 51, -1, 8, -1, 8, 51, -1, - 21, 51, -1, 21, -1, 49, -1, 22, 22, -1, - 22, -1, 9, -1, 51, -1, 4, -1, 3, -1, - 6, -1, 46, 27, 46, -1, 46, 28, 46, -1, - 46, 29, 46, -1, 47, -1, 48, -1, 47, 48, - -1, 34, -1, 16, -1, 15, -1, 32, -1, 22, - -1, 26, 48, -1, 17, 17, -1, 17, 51, -1, - 17, -1, 16, 16, -1, 16, 51, -1, 16, -1, - 53, -1, 23, 11, 53, -1, 10, -1, 52, -1, - 11, -1, 52, 53, -1, 11, -1, 10, -1 + 38, 0, -1, 39, -1, 38, 1, 36, -1, 38, + 36, -1, 1, 36, -1, 41, -1, 39, 41, -1, + 39, 47, 41, -1, 39, 51, -1, 39, 47, 51, + -1, 39, 40, -1, 39, 15, 39, -1, 13, 39, + 14, -1, 13, 47, 39, 14, -1, 46, -1, 25, + 22, 26, -1, 25, 22, 33, 52, 26, -1, 25, + 42, 26, -1, 25, 42, 33, 52, 26, -1, 42, + 28, 42, -1, 42, 29, 42, -1, 42, 30, 42, + -1, 42, 43, -1, 43, -1, 27, 43, -1, 44, + -1, 45, -1, 31, 39, 32, -1, 31, 39, 32, + 34, 53, -1, 46, -1, 52, 46, -1, 5, -1, + 52, 5, -1, 16, 52, -1, 52, 16, 52, -1, + 7, -1, 7, 52, -1, 8, -1, 8, 52, -1, + 9, -1, 9, 52, -1, 22, 52, -1, 22, -1, + 50, -1, 23, 23, -1, 23, -1, 10, -1, 52, + -1, 4, -1, 3, -1, 6, -1, 47, 28, 47, + -1, 47, 29, 47, -1, 47, 30, 47, -1, 48, + -1, 49, -1, 48, 49, -1, 35, -1, 17, -1, + 16, -1, 33, -1, 23, -1, 27, 49, -1, 18, + 18, -1, 18, 52, -1, 18, -1, 17, 17, -1, + 17, 52, -1, 17, -1, 54, -1, 24, 12, 54, + -1, 11, -1, 53, -1, 12, -1, 53, 54, -1, + 12, -1, 11, -1 }; /* YYRLINE[YYN] -- source line where rule number YYN was defined. */ static const yytype_uint16 yyrline[] = { - 0, 88, 88, 89, 95, 98, 109, 118, 147, 168, - 201, 219, 231, 244, 245, 256, 257, 261, 266, 270, - 278, 283, 288, 293, 298, 301, 305, 306, 310, 327, - 351, 352, 356, 357, 361, 362, 366, 367, 370, 371, - 375, 380, 385, 390, 396, 402, 403, 411, 423, 428, - 433, 437, 441, 445, 448, 449, 456, 457, 463, 469, - 475, 480, 487, 488, 489, 490, 491, 492, 496, 497, - 502, 503, 507, 508, 511, 512 + 0, 87, 87, 88, 94, 97, 108, 117, 146, 167, + 200, 218, 230, 243, 244, 255, 256, 260, 265, 269, + 277, 282, 287, 292, 297, 300, 304, 305, 309, 326, + 350, 351, 355, 356, 360, 361, 365, 366, 369, 370, + 374, 375, 379, 384, 389, 394, 400, 406, 407, 415, + 427, 432, 437, 441, 445, 449, 452, 453, 460, 461, + 467, 473, 479, 484, 491, 492, 493, 494, 495, 496, + 500, 501, 506, 507, 511, 512, 515, 516 }; #endif @@ -549,17 +548,18 @@ static const char *const yytname[] = { "$end", "error", "$undefined", "AROMATIC_ATOM_TOKEN", "ORGANIC_ATOM_TOKEN", "ATOM_TOKEN", "SIMPLE_ATOM_QUERY_TOKEN", - "COMPLEX_ATOM_QUERY_TOKEN", "RINGSIZE_ATOM_QUERY_TOKEN", "HYB_TOKEN", - "ZERO_TOKEN", "NONZERO_DIGIT_TOKEN", "GROUP_OPEN_TOKEN", - "GROUP_CLOSE_TOKEN", "SEPARATOR_TOKEN", "HASH_TOKEN", "MINUS_TOKEN", - "PLUS_TOKEN", "CHIRAL_MARKER_TOKEN", "CHI_CLASS_TOKEN", - "CHI_CLASS_OH_TOKEN", "H_TOKEN", "AT_TOKEN", "PERCENT_TOKEN", - "ATOM_OPEN_TOKEN", "ATOM_CLOSE_TOKEN", "NOT_TOKEN", "AND_TOKEN", - "OR_TOKEN", "SEMI_TOKEN", "BEGIN_RECURSE", "END_RECURSE", "COLON_TOKEN", - "UNDERSCORE_TOKEN", "BOND_TOKEN", "EOS_TOKEN", "$accept", "cmpd", "mol", - "branch", "atomd", "atom_expr", "point_query", "recursive_query", - "atom_query", "simple_atom", "bond_expr", "bond_query", "bondd", - "charge_spec", "ring_number", "number", "nonzero_number", "digit", 0 + "COMPLEX_ATOM_QUERY_TOKEN", "RINGSIZE_ATOM_QUERY_TOKEN", + "IMPLICIT_H_ATOM_QUERY_TOKEN", "HYB_TOKEN", "ZERO_TOKEN", + "NONZERO_DIGIT_TOKEN", "GROUP_OPEN_TOKEN", "GROUP_CLOSE_TOKEN", + "SEPARATOR_TOKEN", "HASH_TOKEN", "MINUS_TOKEN", "PLUS_TOKEN", + "CHIRAL_MARKER_TOKEN", "CHI_CLASS_TOKEN", "CHI_CLASS_OH_TOKEN", + "H_TOKEN", "AT_TOKEN", "PERCENT_TOKEN", "ATOM_OPEN_TOKEN", + "ATOM_CLOSE_TOKEN", "NOT_TOKEN", "AND_TOKEN", "OR_TOKEN", "SEMI_TOKEN", + "BEGIN_RECURSE", "END_RECURSE", "COLON_TOKEN", "UNDERSCORE_TOKEN", + "BOND_TOKEN", "EOS_TOKEN", "$accept", "cmpd", "mol", "branch", "atomd", + "atom_expr", "point_query", "recursive_query", "atom_query", + "simple_atom", "bond_expr", "bond_query", "bondd", "charge_spec", + "ring_number", "number", "nonzero_number", "digit", 0 }; #endif @@ -571,21 +571,21 @@ static const yytype_uint16 yytoknum[] = 0, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, - 285, 286, 287, 288, 289, 290 + 285, 286, 287, 288, 289, 290, 291 }; # endif /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ static const yytype_uint8 yyr1[] = { - 0, 36, 37, 37, 37, 37, 38, 38, 38, 38, - 38, 38, 38, 39, 39, 40, 40, 40, 40, 40, - 41, 41, 41, 41, 41, 42, 42, 42, 43, 43, - 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, - 44, 44, 44, 44, 44, 44, 44, 45, 45, 45, - 46, 46, 46, 46, 47, 47, 48, 48, 48, 48, - 48, 48, 49, 49, 49, 49, 49, 49, 50, 50, - 51, 51, 52, 52, 53, 53 + 0, 37, 38, 38, 38, 38, 39, 39, 39, 39, + 39, 39, 39, 40, 40, 41, 41, 41, 41, 41, + 42, 42, 42, 42, 42, 43, 43, 43, 44, 44, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 46, + 46, 46, 47, 47, 47, 47, 48, 48, 49, 49, + 49, 49, 49, 49, 50, 50, 50, 50, 50, 50, + 51, 51, 52, 52, 53, 53, 54, 54 }; /* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */ @@ -595,173 +595,166 @@ static const yytype_uint8 yyr2[] = 3, 2, 3, 3, 4, 1, 3, 5, 3, 5, 3, 3, 3, 2, 1, 2, 1, 1, 3, 5, 1, 2, 1, 2, 2, 3, 1, 2, 1, 2, - 2, 1, 1, 2, 1, 1, 1, 1, 1, 1, - 3, 3, 3, 1, 1, 2, 1, 1, 1, 1, - 1, 2, 2, 2, 1, 2, 2, 1, 1, 3, - 1, 1, 1, 2, 1, 1 + 1, 2, 2, 1, 1, 2, 1, 1, 1, 1, + 1, 1, 3, 3, 3, 1, 1, 2, 1, 1, + 1, 1, 1, 2, 2, 2, 1, 2, 2, 1, + 1, 3, 1, 1, 1, 2, 1, 1 }; -/* YYDEFACT[STATE-NAME] -- Default reduction number in state STATE-NUM. - Performed when YYTABLE doesn't specify something else to do. Zero +/* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state + STATE-NUM when YYTABLE doesn't specify something else to do. Zero means the default is an error. */ static const yytype_uint8 yydefact[] = { - 0, 0, 48, 47, 49, 0, 0, 2, 6, 15, - 5, 32, 36, 38, 45, 70, 72, 0, 67, 64, - 41, 44, 0, 0, 0, 24, 26, 27, 30, 42, - 46, 71, 1, 0, 4, 75, 74, 0, 0, 58, - 57, 60, 0, 0, 59, 56, 11, 7, 0, 53, - 54, 9, 68, 37, 39, 34, 65, 66, 62, 63, - 16, 0, 40, 43, 41, 25, 0, 18, 0, 0, - 0, 0, 23, 33, 0, 31, 73, 3, 0, 0, - 12, 0, 61, 0, 0, 0, 8, 10, 55, 0, - 28, 20, 21, 22, 0, 35, 13, 0, 69, 50, - 51, 52, 17, 0, 19, 14, 29 + 0, 0, 50, 49, 51, 0, 0, 2, 6, 15, + 5, 32, 36, 38, 40, 47, 72, 74, 0, 69, + 66, 43, 46, 0, 0, 0, 24, 26, 27, 30, + 44, 48, 73, 1, 0, 4, 77, 76, 0, 0, + 60, 59, 62, 0, 0, 61, 58, 11, 7, 0, + 55, 56, 9, 70, 37, 39, 41, 34, 67, 68, + 64, 65, 16, 0, 42, 45, 43, 25, 0, 18, + 0, 0, 0, 0, 23, 33, 0, 31, 75, 3, + 0, 0, 12, 0, 63, 0, 0, 0, 8, 10, + 57, 0, 28, 20, 21, 22, 0, 35, 13, 0, + 71, 52, 53, 54, 17, 0, 19, 14, 29 }; /* YYDEFGOTO[NTERM-NUM]. */ static const yytype_int8 yydefgoto[] = { - -1, 6, 7, 46, 8, 24, 25, 26, 27, 9, - 48, 49, 50, 29, 51, 30, 31, 52 + -1, 6, 7, 47, 8, 25, 26, 27, 28, 9, + 49, 50, 51, 30, 52, 31, 32, 53 }; /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing STATE-NUM. */ -#define YYPACT_NINF -35 +#define YYPACT_NINF -54 static const yytype_int16 yypact[] = { - 11, -31, -35, -35, -35, 303, 8, 171, -35, -35, - -35, -35, 50, 50, -35, -35, -35, 50, 0, 19, - 47, -16, 331, 104, 217, -35, -35, -35, -35, -35, - 136, 52, -35, -12, -35, -35, -35, 185, 104, -35, - -35, -35, 23, 351, -35, -35, -35, -35, 352, 351, - -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, - -35, 50, -35, -35, 50, -35, 89, -35, 331, 331, - 331, 50, -35, -35, 50, -35, -35, -35, 121, 18, - 171, 52, -35, 351, 351, 351, -35, -35, -35, 6, - 15, 331, 275, 247, 31, -35, -35, 146, -35, -35, - 17, 40, -35, 59, -35, -35, 52 + 40, -26, -54, -54, -54, 294, 4, 157, -54, -54, + -54, -54, 60, 60, 60, -54, -54, -54, 60, 47, + 51, 24, -17, 323, 45, 205, -54, -54, -54, -54, + -54, 123, 71, -54, -20, -54, -54, -54, 172, 45, + -54, -54, -54, 8, 320, -54, -54, -54, -54, 345, + 320, -54, -54, -54, -54, -54, -54, -54, -54, -54, + -54, -54, -54, 60, -54, -54, 60, -54, 82, -54, + 323, 323, 323, 60, -54, -54, 60, -54, -54, -54, + 107, 9, 157, 71, -54, 320, 320, 320, -54, -54, + -54, 0, -12, 323, 265, 236, 2, -54, -54, 132, + -54, -54, 5, 75, -54, 33, -54, -54, 71 }; /* YYPGOTO[NTERM-NUM]. */ static const yytype_int8 yypgoto[] = { - -35, -35, -10, -35, -7, -15, -17, -35, -35, -4, - -34, -35, -24, -35, 30, 20, -23, -29 + -54, -54, -21, -54, -7, 30, -14, -54, -54, -4, + -31, -54, -36, -54, -2, 11, -53, -30 }; /* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If positive, shift that token. If negative, reduce the rule which - number is the opposite. If YYTABLE_NINF, syntax error. */ + number is the opposite. If zero, do what YYDEFACT says. + If YYTABLE_NINF, syntax error. */ #define YYTABLE_NINF -1 static const yytype_uint8 yytable[] = { - 47, 28, 76, 79, 10, 65, 63, 72, 32, 33, - 15, 16, 1, 66, 2, 3, 56, 4, 28, 82, - 28, 2, 3, 77, 4, 88, 75, 78, 80, 15, - 16, 102, 53, 54, 81, 5, 58, 55, 57, 59, - 62, 86, 5, 34, 83, 83, 84, 85, 103, 99, - 100, 101, 98, 91, 92, 93, 104, 15, 16, 47, - 15, 16, 35, 36, 28, 28, 28, 83, 84, 97, - 16, 47, 60, 47, 72, 72, 72, 76, 87, 61, - 106, 89, 0, 0, 62, 0, 0, 28, 28, 28, - 47, 94, 2, 3, 95, 4, 0, 0, 0, 35, - 36, 37, 0, 38, 39, 40, 0, 2, 3, 0, - 4, 41, 42, 5, 0, 43, 0, 0, 0, 0, - 90, 44, 0, 45, 2, 3, 0, 4, 5, 0, - 0, 35, 36, 37, 96, 38, 39, 40, 0, 2, - 3, 73, 4, 41, 42, 5, 0, 43, 0, 2, - 3, 74, 4, 44, 0, 45, 35, 36, 37, 105, - 38, 39, 40, 0, 0, 0, 0, 0, 41, 42, - 5, 0, 43, 0, 2, 3, 0, 4, 44, 0, - 45, 35, 36, 37, 0, 38, 39, 40, 2, 3, - 0, 4, 0, 41, 42, 5, 0, 43, 0, 0, - 39, 40, 0, 44, 0, 45, 0, 41, 0, 5, - 0, 43, 0, 0, 0, 0, 0, 44, 0, 45, - 2, 3, 11, 4, 12, 13, 14, 15, 16, 0, - 0, 0, 17, 18, 19, 0, 0, 0, 64, 21, - 0, 0, 67, 22, 68, 69, 70, 23, 0, 71, - 2, 3, 11, 4, 12, 13, 14, 15, 16, 0, - 0, 0, 17, 18, 19, 0, 0, 0, 64, 21, - 0, 0, 0, 22, 68, 69, 0, 23, 2, 3, - 11, 4, 12, 13, 14, 15, 16, 0, 0, 0, - 17, 18, 19, 0, 0, 0, 64, 21, 0, 0, - 0, 22, 68, 0, 0, 23, 2, 3, 11, 4, - 12, 13, 14, 15, 16, 0, 0, 0, 17, 18, - 19, 0, 0, 0, 20, 21, 0, 0, 0, 22, - 0, 0, 0, 23, 2, 3, 11, 4, 12, 13, - 14, 15, 16, 0, 0, 0, 17, 18, 19, 0, - 0, 0, 64, 21, 0, 2, 3, 22, 4, 0, - 0, 23, 35, 36, 0, 0, 39, 40, 0, 0, - 0, 0, 0, 41, 0, 42, 5, 43, 0, 83, - 84, 85, 0, 44, 0, 45 + 48, 29, 78, 68, 33, 34, 65, 81, 84, 67, + 10, 74, 2, 3, 90, 4, 79, 80, 82, 29, + 83, 29, 105, 54, 55, 56, 104, 77, 106, 57, + 59, 61, 64, 85, 5, 16, 17, 85, 86, 87, + 35, 1, 88, 2, 3, 17, 4, 89, 2, 3, + 62, 4, 108, 100, 101, 102, 103, 63, 16, 17, + 99, 48, 16, 17, 58, 5, 29, 29, 29, 60, + 5, 16, 17, 48, 91, 48, 0, 64, 78, 74, + 74, 74, 36, 37, 96, 2, 3, 97, 4, 29, + 29, 29, 48, 36, 37, 38, 0, 39, 40, 41, + 93, 94, 95, 85, 86, 42, 43, 5, 0, 44, + 2, 3, 0, 4, 92, 45, 0, 46, 36, 37, + 38, 98, 39, 40, 41, 0, 2, 3, 75, 4, + 42, 43, 5, 0, 44, 2, 3, 0, 4, 76, + 45, 0, 46, 36, 37, 38, 107, 39, 40, 41, + 0, 0, 0, 0, 0, 42, 43, 5, 0, 44, + 2, 3, 0, 4, 0, 45, 0, 46, 36, 37, + 38, 0, 39, 40, 41, 2, 3, 0, 4, 0, + 42, 43, 5, 0, 44, 0, 0, 0, 40, 41, + 45, 0, 46, 0, 0, 42, 0, 5, 0, 44, + 0, 0, 0, 0, 0, 45, 0, 46, 2, 3, + 11, 4, 12, 13, 14, 15, 16, 17, 0, 0, + 0, 18, 19, 20, 0, 0, 0, 66, 22, 0, + 0, 69, 23, 70, 71, 72, 24, 0, 73, 2, + 3, 11, 4, 12, 13, 14, 15, 16, 17, 0, + 0, 0, 18, 19, 20, 0, 0, 0, 66, 22, + 0, 0, 0, 23, 70, 71, 0, 24, 2, 3, + 11, 4, 12, 13, 14, 15, 16, 17, 0, 0, + 0, 18, 19, 20, 0, 0, 0, 66, 22, 0, + 0, 0, 23, 70, 0, 0, 24, 2, 3, 11, + 4, 12, 13, 14, 15, 16, 17, 0, 0, 0, + 18, 19, 20, 0, 0, 0, 21, 22, 0, 0, + 0, 23, 0, 0, 0, 24, 2, 3, 11, 4, + 12, 13, 14, 15, 16, 17, 40, 41, 0, 18, + 19, 20, 0, 42, 0, 66, 22, 44, 2, 3, + 23, 4, 0, 45, 24, 46, 36, 37, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 43, + 5, 0, 0, 85, 86, 87 }; -#define yypact_value_is_default(yystate) \ - ((yystate) == (-35)) - -#define yytable_value_is_error(yytable_value) \ - YYID (0) - static const yytype_int8 yycheck[] = { - 7, 5, 31, 37, 35, 22, 22, 24, 0, 1, - 10, 11, 1, 23, 3, 4, 16, 6, 22, 43, - 24, 3, 4, 35, 6, 49, 30, 37, 38, 10, - 11, 25, 12, 13, 11, 24, 17, 17, 18, 19, - 20, 48, 24, 35, 27, 27, 28, 29, 33, 83, - 84, 85, 81, 68, 69, 70, 25, 10, 11, 66, - 10, 11, 10, 11, 68, 69, 70, 27, 28, 79, - 11, 78, 25, 80, 91, 92, 93, 106, 48, 32, - 103, 61, -1, -1, 64, -1, -1, 91, 92, 93, - 97, 71, 3, 4, 74, 6, -1, -1, -1, 10, - 11, 12, -1, 14, 15, 16, -1, 3, 4, -1, - 6, 22, 23, 24, -1, 26, -1, -1, -1, -1, - 31, 32, -1, 34, 3, 4, -1, 6, 24, -1, - -1, 10, 11, 12, 13, 14, 15, 16, -1, 3, - 4, 5, 6, 22, 23, 24, -1, 26, -1, 3, - 4, 15, 6, 32, -1, 34, 10, 11, 12, 13, - 14, 15, 16, -1, -1, -1, -1, -1, 22, 23, - 24, -1, 26, -1, 3, 4, -1, 6, 32, -1, - 34, 10, 11, 12, -1, 14, 15, 16, 3, 4, - -1, 6, -1, 22, 23, 24, -1, 26, -1, -1, - 15, 16, -1, 32, -1, 34, -1, 22, -1, 24, - -1, 26, -1, -1, -1, -1, -1, 32, -1, 34, - 3, 4, 5, 6, 7, 8, 9, 10, 11, -1, - -1, -1, 15, 16, 17, -1, -1, -1, 21, 22, - -1, -1, 25, 26, 27, 28, 29, 30, -1, 32, - 3, 4, 5, 6, 7, 8, 9, 10, 11, -1, - -1, -1, 15, 16, 17, -1, -1, -1, 21, 22, - -1, -1, -1, 26, 27, 28, -1, 30, 3, 4, - 5, 6, 7, 8, 9, 10, 11, -1, -1, -1, - 15, 16, 17, -1, -1, -1, 21, 22, -1, -1, - -1, 26, 27, -1, -1, 30, 3, 4, 5, 6, - 7, 8, 9, 10, 11, -1, -1, -1, 15, 16, - 17, -1, -1, -1, 21, 22, -1, -1, -1, 26, - -1, -1, -1, 30, 3, 4, 5, 6, 7, 8, - 9, 10, 11, -1, -1, -1, 15, 16, 17, -1, - -1, -1, 21, 22, -1, 3, 4, 26, 6, -1, - -1, 30, 10, 11, -1, -1, 15, 16, -1, -1, - -1, -1, -1, 22, -1, 23, 24, 26, -1, 27, - 28, 29, -1, 32, -1, 34 + 7, 5, 32, 24, 0, 1, 23, 38, 44, 23, + 36, 25, 3, 4, 50, 6, 36, 38, 39, 23, + 12, 25, 34, 12, 13, 14, 26, 31, 26, 18, + 19, 20, 21, 28, 25, 11, 12, 28, 29, 30, + 36, 1, 49, 3, 4, 12, 6, 49, 3, 4, + 26, 6, 105, 83, 85, 86, 87, 33, 11, 12, + 81, 68, 11, 12, 17, 25, 70, 71, 72, 18, + 25, 11, 12, 80, 63, 82, -1, 66, 108, 93, + 94, 95, 11, 12, 73, 3, 4, 76, 6, 93, + 94, 95, 99, 11, 12, 13, -1, 15, 16, 17, + 70, 71, 72, 28, 29, 23, 24, 25, -1, 27, + 3, 4, -1, 6, 32, 33, -1, 35, 11, 12, + 13, 14, 15, 16, 17, -1, 3, 4, 5, 6, + 23, 24, 25, -1, 27, 3, 4, -1, 6, 16, + 33, -1, 35, 11, 12, 13, 14, 15, 16, 17, + -1, -1, -1, -1, -1, 23, 24, 25, -1, 27, + 3, 4, -1, 6, -1, 33, -1, 35, 11, 12, + 13, -1, 15, 16, 17, 3, 4, -1, 6, -1, + 23, 24, 25, -1, 27, -1, -1, -1, 16, 17, + 33, -1, 35, -1, -1, 23, -1, 25, -1, 27, + -1, -1, -1, -1, -1, 33, -1, 35, 3, 4, + 5, 6, 7, 8, 9, 10, 11, 12, -1, -1, + -1, 16, 17, 18, -1, -1, -1, 22, 23, -1, + -1, 26, 27, 28, 29, 30, 31, -1, 33, 3, + 4, 5, 6, 7, 8, 9, 10, 11, 12, -1, + -1, -1, 16, 17, 18, -1, -1, -1, 22, 23, + -1, -1, -1, 27, 28, 29, -1, 31, 3, 4, + 5, 6, 7, 8, 9, 10, 11, 12, -1, -1, + -1, 16, 17, 18, -1, -1, -1, 22, 23, -1, + -1, -1, 27, 28, -1, -1, 31, 3, 4, 5, + 6, 7, 8, 9, 10, 11, 12, -1, -1, -1, + 16, 17, 18, -1, -1, -1, 22, 23, -1, -1, + -1, 27, -1, -1, -1, 31, 3, 4, 5, 6, + 7, 8, 9, 10, 11, 12, 16, 17, -1, 16, + 17, 18, -1, 23, -1, 22, 23, 27, 3, 4, + 27, 6, -1, 33, 31, 35, 11, 12, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 24, + 25, -1, -1, 28, 29, 30 }; /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing symbol of state STATE-NUM. */ static const yytype_uint8 yystos[] = { - 0, 1, 3, 4, 6, 24, 37, 38, 40, 45, - 35, 5, 7, 8, 9, 10, 11, 15, 16, 17, - 21, 22, 26, 30, 41, 42, 43, 44, 45, 49, - 51, 52, 0, 1, 35, 10, 11, 12, 14, 15, - 16, 22, 23, 26, 32, 34, 39, 40, 46, 47, - 48, 50, 53, 51, 51, 51, 16, 51, 17, 51, - 25, 32, 51, 22, 21, 42, 38, 25, 27, 28, - 29, 32, 42, 5, 15, 45, 53, 35, 38, 46, - 38, 11, 48, 27, 28, 29, 40, 50, 48, 51, - 31, 41, 41, 41, 51, 51, 13, 38, 53, 46, - 46, 46, 25, 33, 25, 13, 52 + 0, 1, 3, 4, 6, 25, 38, 39, 41, 46, + 36, 5, 7, 8, 9, 10, 11, 12, 16, 17, + 18, 22, 23, 27, 31, 42, 43, 44, 45, 46, + 50, 52, 53, 0, 1, 36, 11, 12, 13, 15, + 16, 17, 23, 24, 27, 33, 35, 40, 41, 47, + 48, 49, 51, 54, 52, 52, 52, 52, 17, 52, + 18, 52, 26, 33, 52, 23, 22, 43, 39, 26, + 28, 29, 30, 33, 43, 5, 16, 46, 54, 36, + 39, 47, 39, 12, 49, 28, 29, 30, 41, 51, + 49, 52, 32, 42, 42, 42, 52, 52, 14, 39, + 54, 47, 47, 47, 26, 34, 26, 14, 53 }; #define yyerrok (yyerrstatus = 0) @@ -776,18 +769,9 @@ static const yytype_uint8 yystos[] = /* Like YYERROR except do call yyerror. This remains here temporarily to ease the transition to the new meaning of YYERROR, for GCC. - Once GCC version 2 has supplanted version 1, this can go. However, - YYFAIL appears to be in use. Nevertheless, it is formally deprecated - in Bison 2.4.2's NEWS entry, where a plan to phase it out is - discussed. */ + Once GCC version 2 has supplanted version 1, this can go. */ #define YYFAIL goto yyerrlab -#if defined YYFAIL - /* This is here to suppress warnings from the GCC cpp's - -Wunused-macros. Normally we don't worry about that warning, but - some users do, and we want to make it easy for users to remove - YYFAIL uses, which will produce warnings from Bison 2.5. */ -#endif #define YYRECOVERING() (!!yyerrstatus) @@ -797,6 +781,7 @@ do \ { \ yychar = (Token); \ yylval = (Value); \ + yytoken = YYTRANSLATE (yychar); \ YYPOPSTACK (1); \ goto yybackup; \ } \ @@ -838,10 +823,19 @@ while (YYID (0)) #endif -/* This macro is provided for backward compatibility. */ +/* YY_LOCATION_PRINT -- Print the location on the stream. + This macro was not mandated originally: define only if we know + we won't break user code: when these are the locations we know. */ #ifndef YY_LOCATION_PRINT -# define YY_LOCATION_PRINT(File, Loc) ((void) 0) +# if YYLTYPE_IS_TRIVIAL +# define YY_LOCATION_PRINT(File, Loc) \ + fprintf (File, "%d.%d-%d.%d", \ + (Loc).first_line, (Loc).first_column, \ + (Loc).last_line, (Loc).last_column) +# else +# define YY_LOCATION_PRINT(File, Loc) ((void) 0) +# endif #endif @@ -850,7 +844,7 @@ while (YYID (0)) #ifdef YYLEX_PARAM # define YYLEX yylex (&yylval, YYLEX_PARAM) #else -# define YYLEX yylex (&yylval) +# define YYLEX yylex (&yylval, scanner) #endif /* Enable debugging if requested. */ @@ -1045,6 +1039,7 @@ int yydebug; # define YYMAXDEPTH 10000 #endif + #if YYERROR_VERBOSE @@ -1147,142 +1142,115 @@ yytnamerr (char *yyres, const char *yystr) } # endif -/* Copy into *YYMSG, which is of size *YYMSG_ALLOC, an error message - about the unexpected token YYTOKEN for the state stack whose top is - YYSSP. - - Return 0 if *YYMSG was successfully written. Return 1 if *YYMSG is - not large enough to hold the message. In that case, also set - *YYMSG_ALLOC to the required number of bytes. Return 2 if the - required number of bytes is too large to store. */ -static int -yysyntax_error (YYSIZE_T *yymsg_alloc, char **yymsg, - yytype_int16 *yyssp, int yytoken) +/* Copy into YYRESULT an error message about the unexpected token + YYCHAR while in state YYSTATE. Return the number of bytes copied, + including the terminating null byte. If YYRESULT is null, do not + copy anything; just return the number of bytes that would be + copied. As a special case, return 0 if an ordinary "syntax error" + message will do. Return YYSIZE_MAXIMUM if overflow occurs during + size calculation. */ +static YYSIZE_T +yysyntax_error (char *yyresult, int yystate, int yychar) { - YYSIZE_T yysize0 = yytnamerr (0, yytname[yytoken]); - YYSIZE_T yysize = yysize0; - YYSIZE_T yysize1; - enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 }; - /* Internationalized format string. */ - const char *yyformat = 0; - /* Arguments of yyformat. */ - char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM]; - /* Number of reported tokens (one for the "unexpected", one per - "expected"). */ - int yycount = 0; + int yyn = yypact[yystate]; - /* There are many possibilities here to consider: - - Assume YYFAIL is not used. It's too flawed to consider. See - - for details. YYERROR is fine as it does not invoke this - function. - - If this state is a consistent state with a default action, then - the only way this function was invoked is if the default action - is an error action. In that case, don't check for expected - tokens because there are none. - - The only way there can be no lookahead present (in yychar) is if - this state is a consistent state with a default action. Thus, - detecting the absence of a lookahead is sufficient to determine - that there is no unexpected or expected token to report. In that - case, just report a simple "syntax error". - - Don't assume there isn't a lookahead just because this state is a - consistent state with a default action. There might have been a - previous inconsistent state, consistent state with a non-default - action, or user semantic action that manipulated yychar. - - Of course, the expected token list depends on states to have - correct lookahead information, and it depends on the parser not - to perform extra reductions after fetching a lookahead from the - scanner and before detecting a syntax error. Thus, state merging - (from LALR or IELR) and default reductions corrupt the expected - token list. However, the list is correct for canonical LR with - one exception: it will still contain any token that will not be - accepted due to an error action in a later state. - */ - if (yytoken != YYEMPTY) + if (! (YYPACT_NINF < yyn && yyn <= YYLAST)) + return 0; + else { - int yyn = yypact[*yyssp]; - yyarg[yycount++] = yytname[yytoken]; - if (!yypact_value_is_default (yyn)) - { - /* Start YYX at -YYN if negative to avoid negative indexes in - YYCHECK. In other words, skip the first -YYN actions for - this state because they are default actions. */ - int yyxbegin = yyn < 0 ? -yyn : 0; - /* Stay within bounds of both yycheck and yytname. */ - int yychecklim = YYLAST - yyn + 1; - int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS; - int yyx; + int yytype = YYTRANSLATE (yychar); + YYSIZE_T yysize0 = yytnamerr (0, yytname[yytype]); + YYSIZE_T yysize = yysize0; + YYSIZE_T yysize1; + int yysize_overflow = 0; + enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 }; + char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM]; + int yyx; - for (yyx = yyxbegin; yyx < yyxend; ++yyx) - if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR - && !yytable_value_is_error (yytable[yyx + yyn])) - { - if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM) - { - yycount = 1; - yysize = yysize0; - break; - } - yyarg[yycount++] = yytname[yyx]; - yysize1 = yysize + yytnamerr (0, yytname[yyx]); - if (! (yysize <= yysize1 - && yysize1 <= YYSTACK_ALLOC_MAXIMUM)) - return 2; - yysize = yysize1; - } - } +# if 0 + /* This is so xgettext sees the translatable formats that are + constructed on the fly. */ + YY_("syntax error, unexpected %s"); + YY_("syntax error, unexpected %s, expecting %s"); + YY_("syntax error, unexpected %s, expecting %s or %s"); + YY_("syntax error, unexpected %s, expecting %s or %s or %s"); + YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s"); +# endif + char *yyfmt; + char const *yyf; + static char const yyunexpected[] = "syntax error, unexpected %s"; + static char const yyexpecting[] = ", expecting %s"; + static char const yyor[] = " or %s"; + char yyformat[sizeof yyunexpected + + sizeof yyexpecting - 1 + + ((YYERROR_VERBOSE_ARGS_MAXIMUM - 2) + * (sizeof yyor - 1))]; + char const *yyprefix = yyexpecting; + + /* Start YYX at -YYN if negative to avoid negative indexes in + YYCHECK. */ + int yyxbegin = yyn < 0 ? -yyn : 0; + + /* Stay within bounds of both yycheck and yytname. */ + int yychecklim = YYLAST - yyn + 1; + int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS; + int yycount = 1; + + yyarg[0] = yytname[yytype]; + yyfmt = yystpcpy (yyformat, yyunexpected); + + for (yyx = yyxbegin; yyx < yyxend; ++yyx) + if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR) + { + if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM) + { + yycount = 1; + yysize = yysize0; + yyformat[sizeof yyunexpected - 1] = '\0'; + break; + } + yyarg[yycount++] = yytname[yyx]; + yysize1 = yysize + yytnamerr (0, yytname[yyx]); + yysize_overflow |= (yysize1 < yysize); + yysize = yysize1; + yyfmt = yystpcpy (yyfmt, yyprefix); + yyprefix = yyor; + } + + yyf = YY_(yyformat); + yysize1 = yysize + yystrlen (yyf); + yysize_overflow |= (yysize1 < yysize); + yysize = yysize1; + + if (yysize_overflow) + return YYSIZE_MAXIMUM; + + if (yyresult) + { + /* Avoid sprintf, as that infringes on the user's name space. + Don't have undefined behavior even if the translation + produced a string with the wrong number of "%s"s. */ + char *yyp = yyresult; + int yyi = 0; + while ((*yyp = *yyf) != '\0') + { + if (*yyp == '%' && yyf[1] == 's' && yyi < yycount) + { + yyp += yytnamerr (yyp, yyarg[yyi++]); + yyf += 2; + } + else + { + yyp++; + yyf++; + } + } + } + return yysize; } - - switch (yycount) - { -# define YYCASE_(N, S) \ - case N: \ - yyformat = S; \ - break - YYCASE_(0, YY_("syntax error")); - YYCASE_(1, YY_("syntax error, unexpected %s")); - YYCASE_(2, YY_("syntax error, unexpected %s, expecting %s")); - YYCASE_(3, YY_("syntax error, unexpected %s, expecting %s or %s")); - YYCASE_(4, YY_("syntax error, unexpected %s, expecting %s or %s or %s")); - YYCASE_(5, YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s")); -# undef YYCASE_ - } - - yysize1 = yysize + yystrlen (yyformat); - if (! (yysize <= yysize1 && yysize1 <= YYSTACK_ALLOC_MAXIMUM)) - return 2; - yysize = yysize1; - - if (*yymsg_alloc < yysize) - { - *yymsg_alloc = 2 * yysize; - if (! (yysize <= *yymsg_alloc - && *yymsg_alloc <= YYSTACK_ALLOC_MAXIMUM)) - *yymsg_alloc = YYSTACK_ALLOC_MAXIMUM; - return 1; - } - - /* Avoid sprintf, as that infringes on the user's name space. - Don't have undefined behavior even if the translation - produced a string with the wrong number of "%s"s. */ - { - char *yyp = *yymsg; - int yyi = 0; - while ((*yyp = *yyformat) != '\0') - if (*yyp == '%' && yyformat[1] == 's' && yyi < yycount) - { - yyp += yytnamerr (yyp, yyarg[yyi++]); - yyformat += 2; - } - else - { - yyp++; - yyformat++; - } - } - return 0; } #endif /* YYERROR_VERBOSE */ + /*-----------------------------------------------. | Release the memory associated to this symbol. | @@ -1321,7 +1289,6 @@ yydestruct (yymsg, yytype, yyvaluep, input, molList, scanner) } } - /* Prevent warnings from -Wmissing-prototypes. */ #ifdef YYPARSE_PARAM #if defined __STDC__ || defined __cplusplus @@ -1338,9 +1305,12 @@ int yyparse (); #endif /* ! YYPARSE_PARAM */ -/*----------. -| yyparse. | -`----------*/ + + + +/*-------------------------. +| yyparse or yypush_parse. | +`-------------------------*/ #ifdef YYPARSE_PARAM #if (defined __STDC__ || defined __C99__FUNC__ \ @@ -1529,7 +1499,7 @@ yybackup: /* First try to decide what to do without reference to lookahead token. */ yyn = yypact[yystate]; - if (yypact_value_is_default (yyn)) + if (yyn == YYPACT_NINF) goto yydefault; /* Not known => get a lookahead token if don't already have one. */ @@ -1560,8 +1530,8 @@ yybackup: yyn = yytable[yyn]; if (yyn <= 0) { - if (yytable_value_is_error (yyn)) - goto yyerrlab; + if (yyn == 0 || yyn == YYTABLE_NINF) + goto yyerrlab; yyn = -yyn; goto yyreduce; } @@ -1616,42 +1586,42 @@ yyreduce: { case 3: -/* Line 1806 of yacc.c */ -#line 89 "smarts.yy" +/* Line 1455 of yacc.c */ +#line 88 "smarts.yy" { yyclearin; yyerrok; yyErrorCleanup(molList); YYABORT; -} +;} break; case 4: -/* Line 1806 of yacc.c */ -#line 95 "smarts.yy" +/* Line 1455 of yacc.c */ +#line 94 "smarts.yy" { YYACCEPT; -} +;} break; case 5: -/* Line 1806 of yacc.c */ -#line 98 "smarts.yy" +/* Line 1455 of yacc.c */ +#line 97 "smarts.yy" { yyclearin; yyerrok; yyErrorCleanup(molList); YYABORT; -} +;} break; case 6: -/* Line 1806 of yacc.c */ -#line 109 "smarts.yy" +/* Line 1455 of yacc.c */ +#line 108 "smarts.yy" { int sz = molList->size(); molList->resize( sz + 1); @@ -1660,13 +1630,13 @@ yyreduce: (*molList)[ sz ]->addAtom((yyvsp[(1) - (1)].atom),true,true); //delete $1; (yyval.moli) = sz; -} +;} break; case 7: -/* Line 1806 of yacc.c */ -#line 118 "smarts.yy" +/* Line 1455 of yacc.c */ +#line 117 "smarts.yy" { RWMol *mp = (*molList)[(yyval.moli)]; Atom *a1 = mp->getActiveAtom(); @@ -1694,13 +1664,13 @@ yyreduce: mp->addBond(newB); delete newB; //delete $2; -} +;} break; case 8: -/* Line 1806 of yacc.c */ -#line 147 "smarts.yy" +/* Line 1455 of yacc.c */ +#line 146 "smarts.yy" { RWMol *mp = (*molList)[(yyval.moli)]; int atomIdx1 = mp->getActiveAtom()->getIdx(); @@ -1720,13 +1690,13 @@ yyreduce: mp->addBond((yyvsp[(2) - (3)].bond)); delete (yyvsp[(2) - (3)].bond); -} +;} break; case 9: -/* Line 1806 of yacc.c */ -#line 168 "smarts.yy" +/* Line 1455 of yacc.c */ +#line 167 "smarts.yy" { RWMol * mp = (*molList)[(yyval.moli)]; Atom *atom=mp->getActiveAtom(); @@ -1758,13 +1728,13 @@ yyreduce: tmp.push_back(-((yyvsp[(2) - (2)].ival)+1)); atom->setProp("_RingClosures",tmp); -} +;} break; case 10: -/* Line 1806 of yacc.c */ -#line 201 "smarts.yy" +/* Line 1455 of yacc.c */ +#line 200 "smarts.yy" { RWMol * mp = (*molList)[(yyval.moli)]; Atom *atom=mp->getActiveAtom(); @@ -1781,13 +1751,13 @@ yyreduce: tmp.push_back(-((yyvsp[(3) - (3)].ival)+1)); atom->setProp("_RingClosures",tmp); -} +;} break; case 11: -/* Line 1806 of yacc.c */ -#line 219 "smarts.yy" +/* Line 1455 of yacc.c */ +#line 218 "smarts.yy" { RWMol *m1_p = (*molList)[(yyval.moli)],*m2_p=(*molList)[(yyvsp[(2) - (2)].moli)]; m2_p->getAtomWithIdx(0)->setProp("_SmilesStart",1); @@ -1798,13 +1768,13 @@ yyreduce: if ( sz==(yyvsp[(2) - (2)].moli)+1) { molList->resize( sz-1 ); } -} +;} break; case 12: -/* Line 1806 of yacc.c */ -#line 231 "smarts.yy" +/* Line 1455 of yacc.c */ +#line 230 "smarts.yy" { RWMol *m1_p = (*molList)[(yyvsp[(1) - (3)].moli)],*m2_p=(*molList)[(yyvsp[(3) - (3)].moli)]; SmilesParseOps::AddFragToMol(m1_p,m2_p,Bond::IONIC,Bond::NONE,true); @@ -1813,20 +1783,20 @@ yyreduce: if ( sz==(yyvsp[(3) - (3)].moli)+1) { molList->resize( sz-1 ); } -} +;} break; case 13: -/* Line 1806 of yacc.c */ -#line 244 "smarts.yy" - { (yyval.moli) = (yyvsp[(2) - (3)].moli); } +/* Line 1455 of yacc.c */ +#line 243 "smarts.yy" + { (yyval.moli) = (yyvsp[(2) - (3)].moli); ;} break; case 14: -/* Line 1806 of yacc.c */ -#line 245 "smarts.yy" +/* Line 1455 of yacc.c */ +#line 244 "smarts.yy" { // FIX: this needs to handle arbitrary bond_exprs (yyval.moli) = (yyvsp[(3) - (4)].moli); @@ -1834,105 +1804,105 @@ yyreduce: (yyvsp[(2) - (4)].bond)->setOwningMol((*molList)[ sz-1 ]); (yyvsp[(2) - (4)].bond)->setBeginAtomIdx(0); (*molList)[ sz-1 ]->setBondBookmark((yyvsp[(2) - (4)].bond),ci_LEADING_BOND); -} +;} break; case 16: -/* Line 1806 of yacc.c */ -#line 258 "smarts.yy" +/* Line 1455 of yacc.c */ +#line 257 "smarts.yy" { (yyval.atom) = new QueryAtom(1); -} +;} break; case 17: -/* Line 1806 of yacc.c */ -#line 262 "smarts.yy" +/* Line 1455 of yacc.c */ +#line 261 "smarts.yy" { (yyval.atom) = new QueryAtom(1); (yyval.atom)->setProp("molAtomMapNumber",(yyvsp[(4) - (5)].ival)); -} +;} break; case 18: -/* Line 1806 of yacc.c */ -#line 267 "smarts.yy" +/* Line 1455 of yacc.c */ +#line 266 "smarts.yy" { (yyval.atom) = (yyvsp[(2) - (3)].atom); -} +;} break; case 19: -/* Line 1806 of yacc.c */ -#line 271 "smarts.yy" +/* Line 1455 of yacc.c */ +#line 270 "smarts.yy" { (yyval.atom) = (yyvsp[(2) - (5)].atom); (yyval.atom)->setProp("molAtomMapNumber",(yyvsp[(4) - (5)].ival)); -} +;} break; case 20: -/* Line 1806 of yacc.c */ -#line 278 "smarts.yy" +/* Line 1455 of yacc.c */ +#line 277 "smarts.yy" { (yyvsp[(1) - (3)].atom)->expandQuery((yyvsp[(3) - (3)].atom)->getQuery()->copy(),Queries::COMPOSITE_AND,true); if((yyvsp[(1) - (3)].atom)->getChiralTag()==Atom::CHI_UNSPECIFIED) (yyvsp[(1) - (3)].atom)->setChiralTag((yyvsp[(3) - (3)].atom)->getChiralTag()); delete (yyvsp[(3) - (3)].atom); -} +;} break; case 21: -/* Line 1806 of yacc.c */ -#line 283 "smarts.yy" +/* Line 1455 of yacc.c */ +#line 282 "smarts.yy" { (yyvsp[(1) - (3)].atom)->expandQuery((yyvsp[(3) - (3)].atom)->getQuery()->copy(),Queries::COMPOSITE_OR,true); if((yyvsp[(1) - (3)].atom)->getChiralTag()==Atom::CHI_UNSPECIFIED) (yyvsp[(1) - (3)].atom)->setChiralTag((yyvsp[(3) - (3)].atom)->getChiralTag()); delete (yyvsp[(3) - (3)].atom); -} +;} break; case 22: -/* Line 1806 of yacc.c */ -#line 288 "smarts.yy" +/* Line 1455 of yacc.c */ +#line 287 "smarts.yy" { (yyvsp[(1) - (3)].atom)->expandQuery((yyvsp[(3) - (3)].atom)->getQuery()->copy(),Queries::COMPOSITE_AND,true); if((yyvsp[(1) - (3)].atom)->getChiralTag()==Atom::CHI_UNSPECIFIED) (yyvsp[(1) - (3)].atom)->setChiralTag((yyvsp[(3) - (3)].atom)->getChiralTag()); delete (yyvsp[(3) - (3)].atom); -} +;} break; case 23: -/* Line 1806 of yacc.c */ -#line 293 "smarts.yy" +/* Line 1455 of yacc.c */ +#line 292 "smarts.yy" { (yyvsp[(1) - (2)].atom)->expandQuery((yyvsp[(2) - (2)].atom)->getQuery()->copy(),Queries::COMPOSITE_AND,true); if((yyvsp[(1) - (2)].atom)->getChiralTag()==Atom::CHI_UNSPECIFIED) (yyvsp[(1) - (2)].atom)->setChiralTag((yyvsp[(2) - (2)].atom)->getChiralTag()); delete (yyvsp[(2) - (2)].atom); -} +;} break; case 25: -/* Line 1806 of yacc.c */ -#line 301 "smarts.yy" +/* Line 1455 of yacc.c */ +#line 300 "smarts.yy" { (yyvsp[(2) - (2)].atom)->getQuery()->setNegation(!((yyvsp[(2) - (2)].atom)->getQuery()->getNegation())); (yyval.atom) = (yyvsp[(2) - (2)].atom); -} +;} break; case 28: -/* Line 1806 of yacc.c */ -#line 310 "smarts.yy" +/* Line 1455 of yacc.c */ +#line 309 "smarts.yy" { // this is a recursive SMARTS expression QueryAtom *qA = new QueryAtom(); @@ -1949,13 +1919,13 @@ yyreduce: molList->resize( sz-1 ); } (yyval.atom) = qA; -} +;} break; case 29: -/* Line 1806 of yacc.c */ -#line 327 "smarts.yy" +/* Line 1455 of yacc.c */ +#line 326 "smarts.yy" { // UNDOCUMENTED EXTENSION: // this is a recursive SMARTS expression with a serial number @@ -1976,137 +1946,147 @@ yyreduce: molList->resize( sz-1 ); } (yyval.atom) = qA; -} +;} break; case 31: -/* Line 1806 of yacc.c */ -#line 352 "smarts.yy" +/* Line 1455 of yacc.c */ +#line 351 "smarts.yy" { (yyvsp[(2) - (2)].atom)->expandQuery(makeAtomIsotopeQuery((yyvsp[(1) - (2)].ival)),Queries::COMPOSITE_AND,true); (yyval.atom)=(yyvsp[(2) - (2)].atom); -} +;} break; case 33: -/* Line 1806 of yacc.c */ -#line 357 "smarts.yy" +/* Line 1455 of yacc.c */ +#line 356 "smarts.yy" { (yyvsp[(2) - (2)].atom)->expandQuery(makeAtomIsotopeQuery((yyvsp[(1) - (2)].ival)),Queries::COMPOSITE_AND,true); (yyval.atom)=(yyvsp[(2) - (2)].atom); -} +;} break; case 34: -/* Line 1806 of yacc.c */ -#line 361 "smarts.yy" - { (yyval.atom) = new QueryAtom((yyvsp[(2) - (2)].ival)); } +/* Line 1455 of yacc.c */ +#line 360 "smarts.yy" + { (yyval.atom) = new QueryAtom((yyvsp[(2) - (2)].ival)); ;} break; case 35: -/* Line 1806 of yacc.c */ -#line 362 "smarts.yy" +/* Line 1455 of yacc.c */ +#line 361 "smarts.yy" { (yyval.atom) = new QueryAtom((yyvsp[(3) - (3)].ival)); (yyval.atom)->expandQuery(makeAtomIsotopeQuery((yyvsp[(1) - (3)].ival)),Queries::COMPOSITE_AND,true); -} +;} break; case 37: -/* Line 1806 of yacc.c */ -#line 367 "smarts.yy" +/* Line 1455 of yacc.c */ +#line 366 "smarts.yy" { static_cast((yyvsp[(1) - (2)].atom)->getQuery())->setVal((yyvsp[(2) - (2)].ival)); -} +;} break; case 39: -/* Line 1806 of yacc.c */ -#line 371 "smarts.yy" +/* Line 1455 of yacc.c */ +#line 370 "smarts.yy" { delete (yyvsp[(1) - (2)].atom)->getQuery(); (yyvsp[(1) - (2)].atom)->setQuery(makeAtomMinRingSizeQuery((yyvsp[(2) - (2)].ival))); -} - break; - - case 40: - -/* Line 1806 of yacc.c */ -#line 375 "smarts.yy" - { - QueryAtom *newQ = new QueryAtom(); - newQ->setQuery(makeAtomHCountQuery((yyvsp[(2) - (2)].ival))); - (yyval.atom)=newQ; -} +;} break; case 41: -/* Line 1806 of yacc.c */ -#line 380 "smarts.yy" +/* Line 1455 of yacc.c */ +#line 375 "smarts.yy" { - QueryAtom *newQ = new QueryAtom(); - newQ->setQuery(makeAtomHCountQuery(1)); - (yyval.atom)=newQ; -} + delete (yyvsp[(1) - (2)].atom)->getQuery(); + (yyvsp[(1) - (2)].atom)->setQuery(makeAtomImplicitHCountQuery((yyvsp[(2) - (2)].ival))); +;} break; case 42: -/* Line 1806 of yacc.c */ -#line 385 "smarts.yy" +/* Line 1455 of yacc.c */ +#line 379 "smarts.yy" { QueryAtom *newQ = new QueryAtom(); - newQ->setQuery(makeAtomFormalChargeQuery((yyvsp[(1) - (1)].ival))); + newQ->setQuery(makeAtomHCountQuery((yyvsp[(2) - (2)].ival))); (yyval.atom)=newQ; -} +;} break; case 43: -/* Line 1806 of yacc.c */ -#line 390 "smarts.yy" +/* Line 1455 of yacc.c */ +#line 384 "smarts.yy" + { + QueryAtom *newQ = new QueryAtom(); + newQ->setQuery(makeAtomHCountQuery(1)); + (yyval.atom)=newQ; +;} + break; + + case 44: + +/* Line 1455 of yacc.c */ +#line 389 "smarts.yy" + { + QueryAtom *newQ = new QueryAtom(); + newQ->setQuery(makeAtomFormalChargeQuery((yyvsp[(1) - (1)].ival))); + (yyval.atom)=newQ; +;} + break; + + case 45: + +/* Line 1455 of yacc.c */ +#line 394 "smarts.yy" { QueryAtom *newQ = new QueryAtom(); newQ->setQuery(makeAtomNullQuery()); newQ->setChiralTag(Atom::CHI_TETRAHEDRAL_CW); (yyval.atom)=newQ; -} +;} break; - case 44: + case 46: -/* Line 1806 of yacc.c */ -#line 396 "smarts.yy" +/* Line 1455 of yacc.c */ +#line 400 "smarts.yy" { QueryAtom *newQ = new QueryAtom(); newQ->setQuery(makeAtomNullQuery()); newQ->setChiralTag(Atom::CHI_TETRAHEDRAL_CCW); (yyval.atom)=newQ; -} +;} break; - case 46: + case 48: -/* Line 1806 of yacc.c */ -#line 403 "smarts.yy" +/* Line 1455 of yacc.c */ +#line 407 "smarts.yy" { QueryAtom *newQ = new QueryAtom(); newQ->setQuery(makeAtomIsotopeQuery((yyvsp[(1) - (1)].ival))); (yyval.atom)=newQ; -} +;} break; - case 47: + case 49: -/* Line 1806 of yacc.c */ -#line 411 "smarts.yy" +/* Line 1455 of yacc.c */ +#line 415 "smarts.yy" { // // This construction (and some others) may seem odd, but the @@ -2118,190 +2098,179 @@ yyreduce: // (yyval.atom) = new QueryAtom((yyvsp[(1) - (1)].ival)); (yyval.atom)->expandQuery(makeAtomAliphaticQuery(),Queries::COMPOSITE_AND); -} - break; - - case 48: - -/* Line 1806 of yacc.c */ -#line 423 "smarts.yy" - { - (yyval.atom) = new QueryAtom((yyvsp[(1) - (1)].ival)); - (yyval.atom)->setIsAromatic(true); - (yyval.atom)->expandQuery(makeAtomAromaticQuery(),Queries::COMPOSITE_AND); -} +;} break; case 50: -/* Line 1806 of yacc.c */ -#line 433 "smarts.yy" +/* Line 1455 of yacc.c */ +#line 427 "smarts.yy" { - (yyvsp[(1) - (3)].bond)->expandQuery((yyvsp[(3) - (3)].bond)->getQuery()->copy(),Queries::COMPOSITE_AND,true); - delete (yyvsp[(3) - (3)].bond); -} - break; - - case 51: - -/* Line 1806 of yacc.c */ -#line 437 "smarts.yy" - { - (yyvsp[(1) - (3)].bond)->expandQuery((yyvsp[(3) - (3)].bond)->getQuery()->copy(),Queries::COMPOSITE_OR,true); - delete (yyvsp[(3) - (3)].bond); -} + (yyval.atom) = new QueryAtom((yyvsp[(1) - (1)].ival)); + (yyval.atom)->setIsAromatic(true); + (yyval.atom)->expandQuery(makeAtomAromaticQuery(),Queries::COMPOSITE_AND); +;} break; case 52: -/* Line 1806 of yacc.c */ -#line 441 "smarts.yy" +/* Line 1455 of yacc.c */ +#line 437 "smarts.yy" { (yyvsp[(1) - (3)].bond)->expandQuery((yyvsp[(3) - (3)].bond)->getQuery()->copy(),Queries::COMPOSITE_AND,true); delete (yyvsp[(3) - (3)].bond); -} +;} break; - case 55: + case 53: -/* Line 1806 of yacc.c */ -#line 449 "smarts.yy" +/* Line 1455 of yacc.c */ +#line 441 "smarts.yy" { - (yyvsp[(1) - (2)].bond)->expandQuery((yyvsp[(2) - (2)].bond)->getQuery()->copy(),Queries::COMPOSITE_AND,true); - delete (yyvsp[(2) - (2)].bond); -} + (yyvsp[(1) - (3)].bond)->expandQuery((yyvsp[(3) - (3)].bond)->getQuery()->copy(),Queries::COMPOSITE_OR,true); + delete (yyvsp[(3) - (3)].bond); +;} + break; + + case 54: + +/* Line 1455 of yacc.c */ +#line 445 "smarts.yy" + { + (yyvsp[(1) - (3)].bond)->expandQuery((yyvsp[(3) - (3)].bond)->getQuery()->copy(),Queries::COMPOSITE_AND,true); + delete (yyvsp[(3) - (3)].bond); +;} break; case 57: -/* Line 1806 of yacc.c */ -#line 457 "smarts.yy" +/* Line 1455 of yacc.c */ +#line 453 "smarts.yy" + { + (yyvsp[(1) - (2)].bond)->expandQuery((yyvsp[(2) - (2)].bond)->getQuery()->copy(),Queries::COMPOSITE_AND,true); + delete (yyvsp[(2) - (2)].bond); +;} + break; + + case 59: + +/* Line 1455 of yacc.c */ +#line 461 "smarts.yy" { QueryBond *newB= new QueryBond(); newB->setBondType(Bond::SINGLE); newB->setQuery(makeBondOrderEqualsQuery(Bond::SINGLE)); (yyval.bond) = newB; -} +;} break; - case 58: + case 60: -/* Line 1806 of yacc.c */ -#line 463 "smarts.yy" +/* Line 1455 of yacc.c */ +#line 467 "smarts.yy" { QueryBond *newB= new QueryBond(); newB->setBondType(Bond::TRIPLE); newB->setQuery(makeBondOrderEqualsQuery(Bond::TRIPLE)); (yyval.bond) = newB; -} +;} break; - case 59: + case 61: -/* Line 1806 of yacc.c */ -#line 469 "smarts.yy" +/* Line 1455 of yacc.c */ +#line 473 "smarts.yy" { QueryBond *newB= new QueryBond(); newB->setBondType(Bond::AROMATIC); newB->setQuery(makeBondOrderEqualsQuery(Bond::AROMATIC)); (yyval.bond) = newB; -} - break; - - case 60: - -/* Line 1806 of yacc.c */ -#line 475 "smarts.yy" - { - QueryBond *newB= new QueryBond(); - newB->setQuery(makeBondIsInRingQuery()); - (yyval.bond) = newB; -} - break; - - case 61: - -/* Line 1806 of yacc.c */ -#line 480 "smarts.yy" - { - (yyvsp[(2) - (2)].bond)->getQuery()->setNegation(!((yyvsp[(2) - (2)].bond)->getQuery()->getNegation())); - (yyval.bond) = (yyvsp[(2) - (2)].bond); -} +;} break; case 62: -/* Line 1806 of yacc.c */ -#line 487 "smarts.yy" - { (yyval.ival)=2; } +/* Line 1455 of yacc.c */ +#line 479 "smarts.yy" + { + QueryBond *newB= new QueryBond(); + newB->setQuery(makeBondIsInRingQuery()); + (yyval.bond) = newB; +;} break; case 63: -/* Line 1806 of yacc.c */ -#line 488 "smarts.yy" - { (yyval.ival)=(yyvsp[(2) - (2)].ival); } +/* Line 1455 of yacc.c */ +#line 484 "smarts.yy" + { + (yyvsp[(2) - (2)].bond)->getQuery()->setNegation(!((yyvsp[(2) - (2)].bond)->getQuery()->getNegation())); + (yyval.bond) = (yyvsp[(2) - (2)].bond); +;} break; case 64: -/* Line 1806 of yacc.c */ -#line 489 "smarts.yy" - { (yyval.ival)=1; } +/* Line 1455 of yacc.c */ +#line 491 "smarts.yy" + { (yyval.ival)=2; ;} break; case 65: -/* Line 1806 of yacc.c */ -#line 490 "smarts.yy" - { (yyval.ival)=-2; } +/* Line 1455 of yacc.c */ +#line 492 "smarts.yy" + { (yyval.ival)=(yyvsp[(2) - (2)].ival); ;} break; case 66: -/* Line 1806 of yacc.c */ -#line 491 "smarts.yy" - { (yyval.ival)=-(yyvsp[(2) - (2)].ival); } +/* Line 1455 of yacc.c */ +#line 493 "smarts.yy" + { (yyval.ival)=1; ;} break; case 67: -/* Line 1806 of yacc.c */ -#line 492 "smarts.yy" - { (yyval.ival)=-1; } +/* Line 1455 of yacc.c */ +#line 494 "smarts.yy" + { (yyval.ival)=-2; ;} + break; + + case 68: + +/* Line 1455 of yacc.c */ +#line 495 "smarts.yy" + { (yyval.ival)=-(yyvsp[(2) - (2)].ival); ;} break; case 69: -/* Line 1806 of yacc.c */ -#line 497 "smarts.yy" - { (yyval.ival) = (yyvsp[(2) - (3)].ival)*10+(yyvsp[(3) - (3)].ival); } +/* Line 1455 of yacc.c */ +#line 496 "smarts.yy" + { (yyval.ival)=-1; ;} break; - case 73: + case 71: -/* Line 1806 of yacc.c */ -#line 508 "smarts.yy" - { (yyval.ival) = (yyvsp[(1) - (2)].ival)*10 + (yyvsp[(2) - (2)].ival); } +/* Line 1455 of yacc.c */ +#line 501 "smarts.yy" + { (yyval.ival) = (yyvsp[(2) - (3)].ival)*10+(yyvsp[(3) - (3)].ival); ;} + break; + + case 75: + +/* Line 1455 of yacc.c */ +#line 512 "smarts.yy" + { (yyval.ival) = (yyvsp[(1) - (2)].ival)*10 + (yyvsp[(2) - (2)].ival); ;} break; -/* Line 1806 of yacc.c */ -#line 2292 "/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp" +/* Line 1455 of yacc.c */ +#line 2272 "/home/glandrum/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp" default: break; } - /* User semantic actions sometimes alter yychar, and that requires - that yytoken be updated with the new translation. We take the - approach of translating immediately before every use of yytoken. - One alternative is translating here after every semantic action, - but that translation would be missed if the semantic action invokes - YYABORT, YYACCEPT, or YYERROR immediately after altering yychar or - if it invokes YYBACKUP. In the case of YYABORT or YYACCEPT, an - incorrect destructor might then be invoked immediately. In the - case of YYERROR or YYBACKUP, subsequent parser actions might lead - to an incorrect destructor call or verbose syntax error message - before the lookahead is translated. */ YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc); YYPOPSTACK (yylen); @@ -2329,10 +2298,6 @@ yyreduce: | yyerrlab -- here on detecting error | `------------------------------------*/ yyerrlab: - /* Make sure we have latest lookahead translation. See comments at - user semantic actions for why this is necessary. */ - yytoken = yychar == YYEMPTY ? YYEMPTY : YYTRANSLATE (yychar); - /* If not already recovering from an error, report this error. */ if (!yyerrstatus) { @@ -2340,36 +2305,37 @@ yyerrlab: #if ! YYERROR_VERBOSE yyerror (input, molList, scanner, YY_("syntax error")); #else -# define YYSYNTAX_ERROR yysyntax_error (&yymsg_alloc, &yymsg, \ - yyssp, yytoken) { - char const *yymsgp = YY_("syntax error"); - int yysyntax_error_status; - yysyntax_error_status = YYSYNTAX_ERROR; - if (yysyntax_error_status == 0) - yymsgp = yymsg; - else if (yysyntax_error_status == 1) - { - if (yymsg != yymsgbuf) - YYSTACK_FREE (yymsg); - yymsg = (char *) YYSTACK_ALLOC (yymsg_alloc); - if (!yymsg) - { - yymsg = yymsgbuf; - yymsg_alloc = sizeof yymsgbuf; - yysyntax_error_status = 2; - } - else - { - yysyntax_error_status = YYSYNTAX_ERROR; - yymsgp = yymsg; - } - } - yyerror (input, molList, scanner, yymsgp); - if (yysyntax_error_status == 2) - goto yyexhaustedlab; + YYSIZE_T yysize = yysyntax_error (0, yystate, yychar); + if (yymsg_alloc < yysize && yymsg_alloc < YYSTACK_ALLOC_MAXIMUM) + { + YYSIZE_T yyalloc = 2 * yysize; + if (! (yysize <= yyalloc && yyalloc <= YYSTACK_ALLOC_MAXIMUM)) + yyalloc = YYSTACK_ALLOC_MAXIMUM; + if (yymsg != yymsgbuf) + YYSTACK_FREE (yymsg); + yymsg = (char *) YYSTACK_ALLOC (yyalloc); + if (yymsg) + yymsg_alloc = yyalloc; + else + { + yymsg = yymsgbuf; + yymsg_alloc = sizeof yymsgbuf; + } + } + + if (0 < yysize && yysize <= yymsg_alloc) + { + (void) yysyntax_error (yymsg, yystate, yychar); + yyerror (input, molList, scanner, yymsg); + } + else + { + yyerror (input, molList, scanner, YY_("syntax error")); + if (yysize != 0) + goto yyexhaustedlab; + } } -# undef YYSYNTAX_ERROR #endif } @@ -2428,7 +2394,7 @@ yyerrlab1: for (;;) { yyn = yypact[yystate]; - if (!yypact_value_is_default (yyn)) + if (yyn != YYPACT_NINF) { yyn += YYTERROR; if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR) @@ -2487,13 +2453,8 @@ yyexhaustedlab: yyreturn: if (yychar != YYEMPTY) - { - /* Make sure we have latest lookahead translation. See comments at - user semantic actions for why this is necessary. */ - yytoken = YYTRANSLATE (yychar); - yydestruct ("Cleanup: discarding lookahead", - yytoken, &yylval, input, molList, scanner); - } + yydestruct ("Cleanup: discarding lookahead", + yytoken, &yylval, input, molList, scanner); /* Do not reclaim the symbols of the rule which action triggered this YYABORT or YYACCEPT. */ YYPOPSTACK (yylen); @@ -2518,8 +2479,8 @@ yyreturn: -/* Line 2067 of yacc.c */ -#line 515 "smarts.yy" +/* Line 1675 of yacc.c */ +#line 519 "smarts.yy" diff --git a/Code/GraphMol/SmilesParse/smarts.tab.hpp.cmake b/Code/GraphMol/SmilesParse/smarts.tab.hpp.cmake index ab0631ac3..22d377c71 100644 --- a/Code/GraphMol/SmilesParse/smarts.tab.hpp.cmake +++ b/Code/GraphMol/SmilesParse/smarts.tab.hpp.cmake @@ -1,8 +1,10 @@ -/* A Bison parser, made by GNU Bison 2.5. */ -/* Bison interface for Yacc-like parsers in C +/* A Bison parser, made by GNU Bison 2.4.1. */ + +/* Skeleton interface for Bison's Yacc-like parsers in C - Copyright (C) 1984, 1989-1990, 2000-2011 Free Software Foundation, Inc. + Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006 + Free Software Foundation, Inc. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -43,33 +45,34 @@ SIMPLE_ATOM_QUERY_TOKEN = 261, COMPLEX_ATOM_QUERY_TOKEN = 262, RINGSIZE_ATOM_QUERY_TOKEN = 263, - HYB_TOKEN = 264, - ZERO_TOKEN = 265, - NONZERO_DIGIT_TOKEN = 266, - GROUP_OPEN_TOKEN = 267, - GROUP_CLOSE_TOKEN = 268, - SEPARATOR_TOKEN = 269, - HASH_TOKEN = 270, - MINUS_TOKEN = 271, - PLUS_TOKEN = 272, - CHIRAL_MARKER_TOKEN = 273, - CHI_CLASS_TOKEN = 274, - CHI_CLASS_OH_TOKEN = 275, - H_TOKEN = 276, - AT_TOKEN = 277, - PERCENT_TOKEN = 278, - ATOM_OPEN_TOKEN = 279, - ATOM_CLOSE_TOKEN = 280, - NOT_TOKEN = 281, - AND_TOKEN = 282, - OR_TOKEN = 283, - SEMI_TOKEN = 284, - BEGIN_RECURSE = 285, - END_RECURSE = 286, - COLON_TOKEN = 287, - UNDERSCORE_TOKEN = 288, - BOND_TOKEN = 289, - EOS_TOKEN = 290 + IMPLICIT_H_ATOM_QUERY_TOKEN = 264, + HYB_TOKEN = 265, + ZERO_TOKEN = 266, + NONZERO_DIGIT_TOKEN = 267, + GROUP_OPEN_TOKEN = 268, + GROUP_CLOSE_TOKEN = 269, + SEPARATOR_TOKEN = 270, + HASH_TOKEN = 271, + MINUS_TOKEN = 272, + PLUS_TOKEN = 273, + CHIRAL_MARKER_TOKEN = 274, + CHI_CLASS_TOKEN = 275, + CHI_CLASS_OH_TOKEN = 276, + H_TOKEN = 277, + AT_TOKEN = 278, + PERCENT_TOKEN = 279, + ATOM_OPEN_TOKEN = 280, + ATOM_CLOSE_TOKEN = 281, + NOT_TOKEN = 282, + AND_TOKEN = 283, + OR_TOKEN = 284, + SEMI_TOKEN = 285, + BEGIN_RECURSE = 286, + END_RECURSE = 287, + COLON_TOKEN = 288, + UNDERSCORE_TOKEN = 289, + BOND_TOKEN = 290, + EOS_TOKEN = 291 }; #endif @@ -79,8 +82,8 @@ typedef union YYSTYPE { -/* Line 2068 of yacc.c */ -#line 53 "smarts.yy" +/* Line 1676 of yacc.c */ +#line 52 "smarts.yy" int moli; RDKit::QueryAtom * atom; @@ -89,8 +92,8 @@ typedef union YYSTYPE -/* Line 2068 of yacc.c */ -#line 94 "/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.hpp" +/* Line 1676 of yacc.c */ +#line 97 "/home/glandrum/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.hpp" } YYSTYPE; # define YYSTYPE_IS_TRIVIAL 1 # define yystype YYSTYPE /* obsolescent; will be withdrawn */ diff --git a/Code/GraphMol/SmilesParse/smarts.yy b/Code/GraphMol/SmilesParse/smarts.yy index 471e2d497..a84172964 100644 --- a/Code/GraphMol/SmilesParse/smarts.yy +++ b/Code/GraphMol/SmilesParse/smarts.yy @@ -59,7 +59,7 @@ namespace { %token AROMATIC_ATOM_TOKEN ORGANIC_ATOM_TOKEN %token ATOM_TOKEN %token SIMPLE_ATOM_QUERY_TOKEN COMPLEX_ATOM_QUERY_TOKEN -%token RINGSIZE_ATOM_QUERY_TOKEN HYB_TOKEN +%token RINGSIZE_ATOM_QUERY_TOKEN IMPLICIT_H_ATOM_QUERY_TOKEN HYB_TOKEN %token ZERO_TOKEN NONZERO_DIGIT_TOKEN %token GROUP_OPEN_TOKEN GROUP_CLOSE_TOKEN SEPARATOR_TOKEN %token HASH_TOKEN MINUS_TOKEN PLUS_TOKEN @@ -371,6 +371,11 @@ atom_query: simple_atom delete $1->getQuery(); $1->setQuery(makeAtomMinRingSizeQuery($2)); } +| IMPLICIT_H_ATOM_QUERY_TOKEN +| IMPLICIT_H_ATOM_QUERY_TOKEN number { + delete $1->getQuery(); + $1->setQuery(makeAtomImplicitHCountQuery($2)); +} | H_TOKEN number { QueryAtom *newQ = new QueryAtom(); newQ->setQuery(makeAtomHCountQuery($2)); diff --git a/Code/GraphMol/SmilesParse/smatest.cpp b/Code/GraphMol/SmilesParse/smatest.cpp index 0c732d244..6dfed7b2f 100644 --- a/Code/GraphMol/SmilesParse/smatest.cpp +++ b/Code/GraphMol/SmilesParse/smatest.cpp @@ -369,12 +369,9 @@ void testMatches3(){ // ----- // This block is connected to GitHub #60 // - std::cerr<<"1"< %} // The actual definition isn't in the top level hpp file! +// The next two lines are to work around a problem caused by the fact that older versions of +// SWIG don't work with newer versions of boost. +#define BOOST_NOEXCEPT +#define BOOST_NO_CXX11_RVALUE_REFERENCES %include /* Include the base types before anything that will utilize them */ diff --git a/Code/JavaWrappers/gmwrapper/src-test/org/RDKit/ChemReactionTests.java b/Code/JavaWrappers/gmwrapper/src-test/org/RDKit/ChemReactionTests.java index 742a21f2a..81ebb092f 100644 --- a/Code/JavaWrappers/gmwrapper/src-test/org/RDKit/ChemReactionTests.java +++ b/Code/JavaWrappers/gmwrapper/src-test/org/RDKit/ChemReactionTests.java @@ -368,7 +368,7 @@ public class ChemReactionTests extends GraphMolTest { public void test10DotSeparation() { ROMol mol = RWMol.MolFromSmiles("C1ON1"); ChemicalReaction rxn = - ChemicalReaction.ReactionFromSmarts("[C:1]1[O:2][N:3]1>>[C:1]1[O:2].[N:3]1"); + ChemicalReaction.ReactionFromSmarts("[C:1]1[O:2][N:3]1>>([C:1]1[O:2].[N:3]1)"); ROMol_Vect reactants = new ROMol_Vect(); reactants.add(mol); ROMol_Vect_Vect products = rxn.runReactants(reactants); diff --git a/Code/PgSQL/rdkit/Makefile b/Code/PgSQL/rdkit/Makefile index f02e88d18..393a10133 100644 --- a/Code/PgSQL/rdkit/Makefile +++ b/Code/PgSQL/rdkit/Makefile @@ -1,27 +1,52 @@ +# ------------------------- +# Variables used and default values: +# USE_INCHI=0 # enables InChI functions; requires rdkit built with inchi support +# USE_AVALON=0 # enables avalon fingerprint; requires rdkit built with avalon support +# USE_POPCOUNT=0 # enables use of the CPU's popcount instruction +# USE_THREADS=0 # links against boost.system; required with non-ancient boost versions if inchi is enabled or the rdkit is built with threadsafe SSS +# STATIC_LINK=1 # link against the static RDKit libraries +# ------------------------- + + RDKIT=$(RDBASE) -USE_INCHI=0 -STATIC_LINK=1 + ifeq ($(USE_INCHI),1) INCHILIBS=-lRDInchiLib -lInchi INCHIFLAGS=-I${RDKIT}/External -DBUILD_INCHI_SUPPORT INCHIREGRESS=inchi + USE_THREADS=1 +endif +ifeq ($(USE_AVALON),1) + AVALONLIBS=-lAvalonLib -lavalon_clib + AVALONFLAGS=-I${RDKIT}/External -DBUILD_AVALON_SUPPORT + AVALONREGRESS=avalon endif -RDKLIBS = ${INCHILIBS} -lChemTransforms -lFileParsers -lSmilesParse -lFingerprints -lSubgraphs -lDescriptors -lPartialCharges -lSubstructMatch -lGraphMol -lDataStructs -lDepictor -lRDGeometryLib -lRDGeneral +ifeq ($(USE_POPCOUNT),1) + POPCOUNTFLAGS=-DUSE_BUILTIN_POPCOUNT -msse4.2 +endif -ifeq ($(STATIC_LINK),1) - SHLIB_LINK += -L${RDKIT}/lib $(addsuffix _static,${RDKLIBS}) -else +ifeq ($(USE_THREADS),1) + THREADLIBS=-L${BOOSTHOME}/lib -lboost_system +endif + +RDKLIBS = ${AVALONLIBS} ${INCHILIBS} -lChemReactions -lChemTransforms -lFileParsers -lSmilesParse -lFingerprints -lSubgraphs -lDescriptors -lPartialCharges -lSubstructMatch -lGraphMol -lDataStructs -lDepictor -lRDGeometryLib -lRDGeneral + +ifeq ($(STATIC_LINK),0) SHLIB_LINK += -L${RDKIT}/lib -Wl,-rpath,'${RDKIT}/lib' ${RDKLIBS} +else + SHLIB_LINK += -L${RDKIT}/lib $(addsuffix _static,${RDKLIBS}) endif -SHLIB_LINK += -pthread ifndef BOOSTHOME - BOOSTHOME=/usr/local/include + BOOSTHOME=/usr/local endif +SHLIB_LINK += -pthread -PG_CPPFLAGS = -I${BOOSTHOME} -I${RDKIT}/Code -DRDKITVER='"007200"' ${INCHIFLAGS} #-DUSE_BUILTIN_POPCOUNT -msse4.2 +SHLIB_LINK += ${THREADLIBS} + +PG_CPPFLAGS = -I${BOOSTHOME}/include -I${RDKIT}/Code -DRDKITVER='"007300"' ${AVALONFLAGS} ${INCHIFLAGS} ${POPCOUNTFLAGS} CPLUSPLUSFLAGS = $(filter-out -fexcess-precision=standard -Wmissing-prototypes -Wdeclaration-after-statement, $(CFLAGS)) CPLUSPLUSFLAGS += -Wno-unused-function @@ -33,7 +58,7 @@ EXTENSION = rdkit EXTVERSION = $(shell grep default_version $(EXTENSION).control | sed -e "s/default_version[[:space:]]*=[[:space:]]*'\([^']*\)'/\1/") PG_CONFIG = pg_config MODULE_big = rdkit -OBJS = rdkit_io.o mol_op.o bfp_op.o sfp_op.o rdkit_gist.o low_gist.o guc.o cache.o adapter.o +OBJS = rdkit_io.o mol_op.o bfp_op.o sfp_op.o rxn_op.o rdkit_gist.o low_gist.o guc.o cache.o adapter.o PGXS := $(shell $(PG_CONFIG) --pgxs) PG91 = $(shell $(PG_CONFIG) --version | grep -qE " 8\.| 9\.0" && echo no || echo yes) @@ -43,13 +68,13 @@ all: $(EXTENSION)--$(EXTVERSION).sql $(EXTENSION)--$(EXTVERSION).sql: $(EXTENSION).sql91.in cp $< $@ -REGRESS = rdkit-91 props btree molgist bfpgist-91 sfpgist slfpgist fps ${INCHIREGRESS} +REGRESS = rdkit-91 props btree molgist bfpgist-91 sfpgist slfpgist fps reaction ${INCHIREGRESS} ${AVALONREGRESS} DATA = $(EXTENSION)--$(EXTVERSION).sql EXTRA_CLEAN = $(EXTENSION)--$(EXTVERSION).sql else DATA_built = rdkit.sql DATA = uninstall_rdkit.sql -REGRESS = rdkit-pre91 props btree molgist bfpgist-pre91 sfpgist slfpgist fps ${INCHIREGRESS} +REGRESS = rdkit-pre91 props btree molgist bfpgist-pre91 sfpgist slfpgist fps reaction ${INCHIREGRESS} endif include $(PGXS) diff --git a/Code/PgSQL/rdkit/adapter.cpp b/Code/PgSQL/rdkit/adapter.cpp index 9dfe89e60..589bc3346 100644 --- a/Code/PgSQL/rdkit/adapter.cpp +++ b/Code/PgSQL/rdkit/adapter.cpp @@ -31,6 +31,9 @@ // #include #include +#include +#include +#include #include #include #include @@ -49,7 +52,12 @@ #ifdef BUILD_INCHI_SUPPORT #include #endif +#ifdef BUILD_AVALON_SUPPORT +#include +#endif #include "rdkit.h" +#include +#include using namespace std; using namespace RDKit; @@ -1399,3 +1407,410 @@ makeMACCSBFP(CROMol data){ return NULL; } } + +extern "C" MolBitmapFingerPrint +makeAvalonBFP(CROMol data,bool isQuery,unsigned int bitFlags) { +#ifdef BUILD_AVALON_SUPPORT + ROMol *mol = (ROMol*)data; + ExplicitBitVect *res=NULL; + try { + res = new ExplicitBitVect(getAvalonFpSize()); + AvalonTools::getAvalonFP(*mol, *res, getAvalonFpSize(),isQuery,true,bitFlags); + } catch (...) { + elog(ERROR, "makeAvalonBFP: Unknown exception"); + } + + if(res){ + std::string *sres=new std::string(BitVectToBinaryText(*res)); + delete res; + return (MolBitmapFingerPrint)sres; + } else { + return NULL; + } +#else + elog(ERROR, "Avalon support not enabled"); + return NULL; +#endif +} + + +/* chemical reactions */ + +extern "C" void +freeChemReaction(CChemicalReaction data) { + ChemicalReaction *rxn = (ChemicalReaction*)data; + delete rxn; +} + +extern "C" CChemicalReaction +constructChemReact(ChemReactionBA *data) { + ChemicalReaction *rxn = new ChemicalReaction(); + + try { + ByteA b(data); + ReactionPickler::reactionFromPickle(b, rxn); + } catch (ReactionPicklerException& e) { + elog(ERROR, "reactionFromPickle: %s", e.message()); + } catch (...) { + elog(ERROR, "constructChemReact: Unknown exception"); + } + + return (CChemicalReaction)rxn; +} + +extern "C" ChemReactionBA* +deconstructChemReact(CChemicalReaction data) { + ChemicalReaction *rxn = (ChemicalReaction*)data; + ByteA b; + + try { + ReactionPickler::pickleReaction(rxn, b); + } catch (ReactionPicklerException& e) { + elog(ERROR, "pickleReaction: %s", e.message()); + } catch (...) { + elog(ERROR, "deconstructChemReact: Unknown exception"); + } + + return (ChemReactionBA*)b.toByteA(); +} + +extern "C" CChemicalReaction +parseChemReactText(char *data,bool asSmarts,bool warnOnFail) { + ChemicalReaction *rxn = NULL; + + try { + StringData.assign(data); + if(asSmarts){ + rxn = RxnSmartsToChemicalReaction(StringData); + } else { + rxn = RxnSmartsToChemicalReaction(StringData,0,true); + } + if(getInitReaction()){ + rxn->initReactantMatchers(); + } + if(getMoveUnmappedReactantsToAgents() && hasReactionAtomMapping(*rxn)){ + rxn->removeUnmappedReactantTemplates(getThresholdUnmappedReactantAtoms()); + } + } catch (...) { + rxn=NULL; + } + if(rxn==NULL){ + if(warnOnFail){ + ereport(WARNING, + (errcode(ERRCODE_WARNING), + errmsg("could not create chemical reaction from SMILES '%s'",data))); + } else { + ereport(ERROR, + (errcode(ERRCODE_DATA_EXCEPTION), + errmsg("could not create chemical reaction from SMILES '%s'",data))); + } + } + + return (CChemicalReaction)rxn; +} + +extern "C" CChemicalReaction +parseChemReactBlob(char *data,int len) { + ChemicalReaction *rxn = NULL; + + try { + StringData.assign(data,len); + rxn = new ChemicalReaction(StringData); + if(getInitReaction()){ + rxn->initReactantMatchers(); + } + if(getMoveUnmappedReactantsToAgents() && hasReactionAtomMapping(*rxn)){ + rxn->removeUnmappedReactantTemplates(getThresholdUnmappedReactantAtoms()); + } + } catch (...) { + ereport(ERROR, + (errcode(ERRCODE_DATA_EXCEPTION), + errmsg("problem generating chemical reaction from blob data"))); + } + if(rxn==NULL){ + ereport(ERROR, + (errcode(ERRCODE_DATA_EXCEPTION), + errmsg("blob data could not be parsed"))); + } + + return (CChemicalReaction)rxn; +} + + +extern "C" char * +makeChemReactText(CChemicalReaction data, int *len,bool asSmarts) { + ChemicalReaction *rxn = (ChemicalReaction*)data; + + try { + if(!asSmarts){ + StringData = ChemicalReactionToRxnSmiles(*rxn); + } else { + StringData = ChemicalReactionToRxnSmarts(*rxn); + } + } catch (...) { + ereport(WARNING, + (errcode(ERRCODE_WARNING), + errmsg("makeChemReactText: problems converting chemical reaction to SMILES/SMARTS"))); + StringData=""; + } + + *len = StringData.size(); + return (char*)StringData.c_str(); +} + +extern "C" char * +makeChemReactBlob(CChemicalReaction data, int *len){ + ChemicalReaction *rxn = (ChemicalReaction*)data; + StringData.clear(); + try { + ReactionPickler::pickleReaction(*rxn,StringData); + } catch (...) { + elog(ERROR, "makeChemReactBlob: Unknown exception"); + } + + *len = StringData.size(); + return (char*)StringData.data(); +} + + +extern "C" CChemicalReaction +parseChemReactCTAB(char *data,bool warnOnFail) { + ChemicalReaction *rxn = NULL; + + try { + StringData.assign(data); + rxn = RxnBlockToChemicalReaction(StringData); + if(getInitReaction()){ + rxn->initReactantMatchers(); + } + if(getMoveUnmappedReactantsToAgents() && hasReactionAtomMapping(*rxn)){ + rxn->removeUnmappedReactantTemplates(getThresholdUnmappedReactantAtoms()); + } + } catch (...) { + rxn=NULL; + } + if(rxn==NULL){ + if(warnOnFail){ + ereport(WARNING, + (errcode(ERRCODE_WARNING), + errmsg("could not create reaction from CTAB '%s'",data))); + + } else { + ereport(ERROR, + (errcode(ERRCODE_DATA_EXCEPTION), + errmsg("could not create reaction from CTAB '%s'",data))); + } + } + + return (CChemicalReaction)rxn; +} + +extern "C" char * +makeCTABChemReact(CChemicalReaction data, int *len) { + ChemicalReaction *rxn = (ChemicalReaction*)data; + + try { + StringData = ChemicalReactionToRxnBlock(*rxn); + } catch (...) { + ereport(WARNING, + (errcode(ERRCODE_WARNING), + errmsg("makeCTABChemReact: problems converting reaction to CTAB"))); + StringData=""; + } + + *len = StringData.size(); + return (char*)StringData.c_str(); +} + + +extern "C" int +ChemReactNumReactants(CChemicalReaction crxn){ + const ChemicalReaction *rxn = (ChemicalReaction*)crxn; + return rxn->getNumReactantTemplates(); +} + +extern "C" int +ChemReactNumProducts(CChemicalReaction crxn){ + const ChemicalReaction *rxn = (ChemicalReaction*)crxn; + return rxn->getNumProductTemplates(); +} + +extern "C" int +ChemReactNumAgents(CChemicalReaction crxn){ + const ChemicalReaction *rxn = (ChemicalReaction*)crxn; + return rxn->getNumAgentTemplates(); +} + +extern "C" bytea* +makeReactionSign(CChemicalReaction data) { + ChemicalReaction *rxn = (ChemicalReaction*)data; + ExplicitBitVect *res = NULL; + bytea *ret = NULL; + + try { + RDKit::ReactionFingerprintParams params; + params.fpType = static_cast(getReactionSubstructFpType()); + params.fpSize = getReactionSubstructFpSize(); + params.includeAgents = (!getIgnoreReactionAgents()); + params.bitRatioAgents = getReactionStructuralFPAgentBitRatio(); + res = RDKit::StructuralFingerprintChemReaction(*rxn, params); + + if(res){ + std::string sres=BitVectToBinaryText(*res); + ret = makeSignatureBitmapFingerPrint((MolBitmapFingerPrint)&sres); + delete res; + res=0; + } + } catch (...) { + elog(ERROR, "makeReactionSign: Unknown exception"); + if(res) delete res; + } + return ret; +} + + +extern "C" int +ReactionSubstruct(CChemicalReaction rxn, CChemicalReaction rxn2) { + ChemicalReaction *rxnm = (ChemicalReaction*)rxn; + ChemicalReaction *rxn2m = (ChemicalReaction*)rxn2; + + /* Reaction search */ + if(rxn2m->getNumReactantTemplates() != 0 && rxn2m->getNumProductTemplates() != 0){ + return hasReactionSubstructMatch(*rxnm, *rxn2m, (!getIgnoreReactionAgents())); + } + /* Product search */ + if(rxn2m->getNumReactantTemplates() == 0 && rxn2m->getNumProductTemplates() != 0){ + if(rxn2m->getNumAgentTemplates() != 0 && !getIgnoreReactionAgents()){ + return (hasProductTemplateSubstructMatch(*rxnm, *rxn2m) && + hasAgentTemplateSubstructMatch(*rxnm, *rxn2m)); + } + return hasProductTemplateSubstructMatch(*rxnm, *rxn2m); + } + /* Reactant search */ + if(rxn2m->getNumReactantTemplates() != 0 && rxn2m->getNumProductTemplates() == 0){ + if(rxn2m->getNumAgentTemplates() != 0 && !getIgnoreReactionAgents()){ + return (hasReactantTemplateSubstructMatch(*rxnm, *rxn2m) && + hasAgentTemplateSubstructMatch(*rxnm, *rxn2m)); + } + return hasReactantTemplateSubstructMatch(*rxnm, *rxn2m); + } + /* Agent search */ + if(rxn2m->getNumReactantTemplates() == 0 && rxn2m->getNumProductTemplates() == 0 + && rxn2m->getNumAgentTemplates() != 0){ + return hasAgentTemplateSubstructMatch(*rxnm, *rxn2m); + } + + return false; +} + +extern "C" int +ReactionSubstructFP(CChemicalReaction rxn, CChemicalReaction rxnquery) { + ChemicalReaction *rxnm = (ChemicalReaction*)rxn; + ChemicalReaction *rxnqm = (ChemicalReaction*)rxnquery; + + RDKit::ReactionFingerprintParams params; + params.fpType = static_cast(getReactionSubstructFpType()); + params.fpSize = getReactionSubstructFpSize(); + params.includeAgents = (!getIgnoreReactionAgents()); + params.bitRatioAgents = getReactionStructuralFPAgentBitRatio(); + + ExplicitBitVect *fp1 = StructuralFingerprintChemReaction(*rxnm, params); + ExplicitBitVect *fp2 = StructuralFingerprintChemReaction(*rxnqm, params); + + if(fp1->getNumOnBits() < fp2->getNumOnBits()){ + return false; + } + for(unsigned i=0; igetNumBits(); i++){ + if((fp1->getBit(i) & fp2->getBit(i)) != fp2->getBit(i)){ + return false; + } + } + return true; +} + +extern "C" int +reactioncmp(CChemicalReaction rxn, CChemicalReaction rxn2) { + ChemicalReaction *rxnm = (ChemicalReaction*)rxn; + ChemicalReaction *rxn2m = (ChemicalReaction*)rxn2; + + if(!rxnm){ + if(!rxn2m) return 0; + return -1; + } if(!rxn2m) return 1; + + int res = getReactionNumAtoms(*rxnm, true, (!getIgnoreReactionAgents())) - + getReactionNumAtoms(*rxn2m, true, (!getIgnoreReactionAgents())); + if(res) return res; + + res = getReactionNumBonds(*rxnm, true, (!getIgnoreReactionAgents())) - + getReactionNumBonds(*rxn2m, true, (!getIgnoreReactionAgents())); + if(res) return res; + + res = int(calcReactionMW(*rxnm, true, (!getIgnoreReactionAgents())))- + int(calcReactionMW(*rxn2m, true, (!getIgnoreReactionAgents()))); + if(res) return res; + + res = getReactionNumRings(*rxnm, (!getIgnoreReactionAgents())) - + getReactionNumRings(*rxn2m, (!getIgnoreReactionAgents())); + if(res) return res; + + RDKit::MatchVectType matchVect; + if(hasReactionSubstructMatch(*rxnm, *rxn2m, (!getIgnoreReactionAgents()))){ + return 0; + } + return -1; +} + +extern "C" MolSparseFingerPrint +makeReactionDifferenceSFP(CChemicalReaction data, int size, int fpType){ + ChemicalReaction *rxn = (ChemicalReaction*)data; + SparseFP *res=NULL; + + try { + if(fpType > 3 || fpType < 1){ + elog(ERROR, "makeReactionDifferenceSFP: Unknown Fingerprint type"); + } + FingerprintType fp = static_cast(fpType); + RDKit::ReactionFingerprintParams params; + params.fpType = static_cast(fpType); + params.fpSize = size; + params.includeAgents = (!getIgnoreReactionAgents()); + params.agentWeight = getReactionDifferenceFPWeightAgents(); + params.nonAgentWeight = getReactionDifferenceFPWeightNonagents(); + res = (SparseFP*)RDKit::DifferenceFingerprintChemReaction(*rxn, params); + } catch (...) { + elog(ERROR, "makeReactionDifferenceSFP: Unknown exception"); + } + return (MolSparseFingerPrint)res; +} + +extern "C" MolBitmapFingerPrint +makeReactionBFP(CChemicalReaction data, int size, int fpType) { + ChemicalReaction *rxn = (ChemicalReaction*)data; + ExplicitBitVect *res=NULL; + + try { + if(fpType > 5 || fpType < 1){ + elog(ERROR, "makeReactionBFP: Unknown Fingerprint type"); + } + FingerprintType fp = static_cast(fpType); + RDKit::ReactionFingerprintParams params; + params.fpType = static_cast(fpType); + params.fpSize = size; + params.includeAgents = (!getIgnoreReactionAgents()); + params.bitRatioAgents = getReactionStructuralFPAgentBitRatio(); + res = (ExplicitBitVect*)RDKit::StructuralFingerprintChemReaction(*rxn, params); + } catch (...) { + elog(ERROR, "makeReactionBFP: Unknown exception"); + } + + if(res){ + std::string *sres=new std::string(BitVectToBinaryText(*res)); + delete res; + return (MolBitmapFingerPrint)sres; + } + else { + return NULL; + } +} + diff --git a/Code/PgSQL/rdkit/bfp_op.c b/Code/PgSQL/rdkit/bfp_op.c index 9113eefa1..c0d956f5f 100644 --- a/Code/PgSQL/rdkit/bfp_op.c +++ b/Code/PgSQL/rdkit/bfp_op.c @@ -406,3 +406,47 @@ maccs_fp(PG_FUNCTION_ARGS) { PG_RETURN_BITMAPFINGERPRINT_P(sfp); } +PG_FUNCTION_INFO_V1(avalon_fp); +Datum avalon_fp(PG_FUNCTION_ARGS); +Datum +avalon_fp(PG_FUNCTION_ARGS) { + CROMol mol; + MolBitmapFingerPrint fp; + BitmapFingerPrint *sfp; + + fcinfo->flinfo->fn_extra = SearchMolCache( + fcinfo->flinfo->fn_extra, + fcinfo->flinfo->fn_mcxt, + PG_GETARG_DATUM(0), + NULL, &mol, NULL); + + fp = makeAvalonBFP(mol, + PG_GETARG_BOOL(1), /* isQuery */ + PG_GETARG_UINT32(2) /* flags */ + ); + sfp = deconstructMolBitmapFingerPrint(fp); + freeMolBitmapFingerPrint(fp); + + PG_RETURN_BITMAPFINGERPRINT_P(sfp); +} + +PG_FUNCTION_INFO_V1(reaction_structural_bfp); +Datum reaction_structural_bfp(PG_FUNCTION_ARGS); +Datum +reaction_structural_bfp(PG_FUNCTION_ARGS) { + CChemicalReaction rxn; + MolBitmapFingerPrint fp; + BitmapFingerPrint *sfp; + + fcinfo->flinfo->fn_extra = SearchChemReactionCache( + fcinfo->flinfo->fn_extra, + fcinfo->flinfo->fn_mcxt, + PG_GETARG_DATUM(0), + NULL, &rxn, NULL); + + fp = makeReactionBFP(rxn, getReactionSubstructFpSize(), PG_GETARG_INT32(1) /* fpType */); + sfp = deconstructMolBitmapFingerPrint(fp); + freeMolBitmapFingerPrint(fp); + + PG_RETURN_BITMAPFINGERPRINT_P(sfp); +} diff --git a/Code/PgSQL/rdkit/cache.c b/Code/PgSQL/rdkit/cache.c index e19954e2b..ad1d7c5b1 100644 --- a/Code/PgSQL/rdkit/cache.c +++ b/Code/PgSQL/rdkit/cache.c @@ -42,7 +42,8 @@ typedef enum EntryKind { MolKind, BitmapFpKind, - SparseFpKind + SparseFpKind, + ChemReactionKind } EntryKind; typedef struct ValueCacheEntry { @@ -62,6 +63,10 @@ typedef struct ValueCacheEntry { SparseFingerPrint *value; MolSparseFingerPrint fp; } sparse; + struct { + ChemReactionBA *value; + CChemicalReaction rxn; + } chemreact; } detoasted; bytea *sign; @@ -150,6 +155,10 @@ cleanupData(ValueCacheEntry *entry) if (entry->detoasted.sparse.value) pfree( entry->detoasted.sparse.value ); if (entry->detoasted.sparse.fp) freeMolSparseFingerPrint( entry->detoasted.sparse.fp ); break; + case ChemReactionKind: + if (entry->detoasted.chemreact.value) pfree( entry->detoasted.chemreact.value ); + if (entry->detoasted.chemreact.rxn) freeChemReaction( entry->detoasted.chemreact.rxn ); + break; default: elog(ERROR, "Unknown kind: %d", entry->kind); } @@ -454,6 +463,42 @@ fetchData(ValueCache *ac, ValueCacheEntry *entry, } break; break; + case ChemReactionKind: + if (detoasted) + { + if (entry->detoasted.chemreact.value == NULL) + { + ChemReactionBA *detoastedRxn; + + detoastedRxn = DatumGetChemReactionP(entry->toastedValue); + entry->detoasted.chemreact.value = MemoryContextAlloc( ac->ctx, VARSIZE(detoastedRxn)); + memcpy( entry->detoasted.chemreact.value, detoastedRxn, VARSIZE(detoastedRxn)); + } + *detoasted = entry->detoasted.chemreact.value; + } + + if (internal) + { + if (entry->detoasted.chemreact.rxn == NULL) + { + fetchData(ac, entry, &_tmp, NULL, NULL); + entry->detoasted.chemreact.rxn = constructChemReact(entry->detoasted.chemreact.value); + } + *internal = entry->detoasted.chemreact.rxn; + } + + if (sign) + { + if (entry->sign == NULL) + { + fetchData(ac, entry, NULL, &_tmp, NULL); + old = MemoryContextSwitchTo( ac->ctx ); + entry->sign = makeReactionSign(entry->detoasted.chemreact.rxn); + MemoryContextSwitchTo(old); + } + *sign = entry->sign; + } + break; default: elog(ERROR, "Unknown kind: %d", entry->kind); } @@ -571,3 +616,13 @@ SearchSparseFPCache(void *cache, struct MemoryContextData * ctx, Datum a, /* input: */ a, SparseFpKind, /* output: */ (void**)f, (void**)fp, (void**)val); } + +void* +SearchChemReactionCache(void *cache, struct MemoryContextData * ctx, Datum a, + ChemReactionBA **rxnBA, CChemicalReaction *rxn, bytea ** val) +{ + return SearchValueCache( + cache, ctx, + /* input: */ a, ChemReactionKind, + /* output: */ (void**)rxnBA, (void**)rxn, (void**)val); +} diff --git a/Code/PgSQL/rdkit/data/reaction_test_data.out.rsmi b/Code/PgSQL/rdkit/data/reaction_test_data.out.rsmi new file mode 100644 index 000000000..4905ad17a --- /dev/null +++ b/Code/PgSQL/rdkit/data/reaction_test_data.out.rsmi @@ -0,0 +1,1000 @@ +03930834 [Cu].[Cu+2:5].O=C=O.O=C([O-])[O-].[OH:15][CH2:14][CH2:13][N:12]([CH2:16][CH2:17][OH:18])[CH2:11][CH2:10][OH:9]>O.CC(=O)O>[Cu:5].[OH:9][CH2:10][CH2:11][N:12]([CH2:13][CH2:14][OH:15])[CH2:16][CH2:17][OH:18] +03931143 [Br].[CH3:14][CH:12]1[CH2:11][C:10]([CH3:15])([CH3:16])[CH2:9][C:8]([C:17]#[N:18])([NH:7][NH:6][C:2]([CH3:3])([CH3:4])[CH3:5])[CH2:13]1>>[CH3:14][CH:12]1[CH2:11][C:10]([CH3:15])([CH3:16])[CH2:9][C:8]([C:17]#[N:18])([N:7]=[N:6][C:2]([CH3:5])([CH3:3])[CH3:4])[CH2:13]1 +03931153 [Cl-].[NH2:1][c:2]1[cH:3][cH:4][c:5]([C:6](=[O:7])[OH:8])[cH:9][cH:10]1.[O:17]=[C:16](O)[CH:12]1[CH2:13][CH2:14][CH2:15]1>>[O:7]=[C:6]([OH:8])[c:5]1[cH:4][cH:3][c:2]([NH:1][C:16](=[O:17])[CH:12]2[CH2:13][CH2:14][CH2:15]2)[cH:10][cH:9]1 +03931153 [Cl-].[NH2:1][c:2]1[cH:3][cH:4][c:5]([CH2:8][C:9](=[O:10])[OH:11])[cH:6][cH:7]1.[O:18]=[C:17](O)[CH:13]1[CH2:14][CH2:15][CH2:16]1>>[O:10]=[C:9]([OH:11])[CH2:8][c:5]1[cH:6][cH:7][c:2]([NH:1][C:17](=[O:18])[CH:13]2[CH2:14][CH2:15][CH2:16]2)[cH:3][cH:4]1 +03931153 [Cl-].[NH2:1][c:2]1[cH:10][cH:9][c:5]([C:6](=[O:7])[OH:8])[c:4]([N+:11](=[O:12])[O-:13])[cH:3]1.[O:20]=[C:19](O)[CH:15]1[CH2:16][CH2:17][CH2:18]1>>[O:7]=[C:6]([OH:8])[c:5]1[cH:9][cH:10][c:2]([NH:1][C:19](=[O:20])[CH:15]2[CH2:16][CH2:17][CH2:18]2)[cH:3][c:4]1[N+:11](=[O:12])[O-:13] +03931153 [Cl-].CCN(CC)CC.[NH2:1][c:2]1[cH:3][cH:4][c:5]([C:6](=[O:7])[OH:8])[cH:9][cH:10]1.[O:19]=[C:18](O)[C:12]1=[CH:13][CH2:14][CH2:15][CH2:16][CH2:17]1>>[O:7]=[C:6]([OH:8])[c:5]1[cH:4][cH:3][c:2]([NH:1][C:18](=[O:19])[C:12]2=[CH:13][CH2:14][CH2:15][CH2:16][CH2:17]2)[cH:10][cH:9]1 +03931162 [CH3:20]O.[CH3:13][CH:2]([CH3:1])[CH:3]([C:4]([NH2:6])=[S:5])[c:7]1[cH:12][cH:11][cH:10][cH:9][n:8]1.[CH2:18]1[CH2:17][O:16][CH2:15][CH2:14][NH:19]1>>[CH3:13][CH:2]([CH3:1])[CH:3]([C:4](=[S:5])[NH:6][CH2:20][N:19]1[CH2:14][CH2:15][O:16][CH2:17][CH2:18]1)[c:7]1[cH:12][cH:11][cH:10][cH:9][n:8]1 +03931162 [CH2:20]=O.[CH3:13][CH:2]([CH3:1])[CH:3]([C:4]([NH2:6])=[S:5])[c:7]1[cH:12][cH:11][cH:10][cH:9][n:8]1.[CH2:14]1[CH2:15][CH2:16][NH:17][CH2:18][CH2:19]1>CO>[CH3:13][CH:2]([CH3:1])[CH:3]([C:4](=[S:5])[NH:6][CH2:20][N:17]1[CH2:16][CH2:15][CH2:14][CH2:19][CH2:18]1)[c:7]1[cH:12][cH:11][cH:10][cH:9][n:8]1 +03931166 [CH3:14]c1ccc(CBr)o1.BrCc1ccco1.[cH:4]1[cH:5][o:6][c:2]([CH2:1][O:7][CH2:8][c:9]2[cH:10][cH:11][cH:12][o:13]2)[cH:3]1>>[CH3:14][c:5]1[cH:4][cH:3][c:2]([CH2:1][O:7][CH2:8][c:9]2[cH:10][cH:11][cH:12][o:13]2)[o:6]1 +03931166 [CH3:12][C:13](=[O:15])Cl.[cH:9]1[cH:10][cH:11][n:7]([CH2:1][c:2]2[cH:3][cH:4][cH:5][o:6]2)[cH:8]1>>[CH3:12][C:13](=[O:15])[c:8]1[cH:9][cH:10][cH:11][n:7]1[CH2:1][c:2]1[cH:3][cH:4][cH:5][o:6]1 +03931167 [Na+].[CH3:31][C:30](=[O:32])[O:29][C@:12]1([C:13]([CH3:14])=[O:15])[CH2:11][CH2:10][C@H:9]2[C@@H:8]3[C@@H:7](OS(C)(=O)=O)[C@@H:6](OS(C)(=O)=O)[C:25]4=[CH:24][C:23](=[O:26])[CH:22]=[CH:21][C@:20]4([CH3:27])[C@H:19]3[CH2:18][CH2:17][C@@:16]21[CH3:28].[N-:41]=[N+:40]=[N-:39]>CN(C)C=O>[CH3:31][C:30](=[O:32])[O:29][C@:12]1([C:13]([CH3:14])=[O:15])[CH2:11][CH2:10][C@H:9]2[C@@H:8]3[CH:7]=[C:6]([N:39]=[N+:40]=[N-:41])[C:25]4=[CH:24][C:23](=[O:26])[CH:22]=[CH:21][C@:20]4([CH3:27])[C@H:19]3[CH2:18][CH2:17][C@@:16]21[CH3:28] +03931167 [Na+].[CH3:14][C@:13]12[CH2:15][CH2:16][C@H:17]3[C@H:8]([C@@H:9]1[CH2:10][CH2:11][C:12]2=[O:26])[C@@H:7](OS(C)(=O)=O)[C@@H:6](OS(C)(=O)=O)[C:23]1=[CH:22][C:21](=[O:24])[CH:20]=[CH:19][C@@:18]13[CH3:25].[N-:35]=[N+:34]=[N-:33]>CN(C)C=O>[CH3:14][C@:13]12[CH2:15][CH2:16][C@H:17]3[C@@H:8]([CH:7]=[C:6]([N:33]=[N+:34]=[N-:35])[C:23]4=[CH:22][C:21](=[O:24])[CH:20]=[CH:19][C@@:18]43[CH3:25])[C@@H:9]1[CH2:10][CH2:11][C:12]2=[O:26] +03931168 Cl.[NH2:8][N:9]1[CH2:15][C:13](=[O:14])[NH:12][C:10]1=[O:11].[O:25]=[C:16](Cl)[CH:17]=[CH:18][c:19]1[cH:20][cH:21][cH:22][cH:23][cH:24]1.c1ccncc1>O>[O:25]=[C:16]([CH:17]=[CH:18][c:19]1[cH:20][cH:21][cH:22][cH:23][cH:24]1)[NH:8][N:9]1[CH2:15][C:13](=[O:14])[NH:12][C:10]1=[O:11] +03931168 [Cl-].Cl.[CH3:14][CH2:13][c:12]1[cH:11][cH:10][c:4]([CH:5]=[CH:6][C:7](=O)[OH:9])[cH:3][c:2]1[Cl:1].[NH2:17][N:18]1[CH2:24][C:22](=[O:23])[NH:21][C:19]1=[O:20].c1ccncc1>O=S(Cl)Cl>[CH3:14][CH2:13][c:12]1[cH:11][cH:10][c:4]([CH:5]=[CH:6][C:7](=[O:9])[NH:17][N:18]2[CH2:24][C:22](=[O:23])[NH:21][C:19]2=[O:20])[cH:3][c:2]1[Cl:1] +03931172 [CH3:7][C:6]([CH3:8])([CH3:9])[n+:10]1[o:11][c:12](-[c:20]2[cH:21][cH:22][cH:23][cH:24][cH:25]2)[c:13]2[cH:18][c:17]([Cl:19])[cH:16][cH:15][c:14]21.F[B-](F)(F)F.[CH2:30]1[CH2:29][O:28][CH2:27][CH2:26][NH:31]1>>[CH3:8][C:6]([CH3:7])([CH3:9])[N:10]1[O:11][C:12]([c:20]2[cH:21][cH:22][cH:23][cH:24][cH:25]2)([N:31]2[CH2:30][CH2:29][O:28][CH2:27][CH2:26]2)[c:13]2[cH:18][c:17]([Cl:19])[cH:16][cH:15][c:14]21 +03931173 [CH3:27]O.[CH3:16][c:13]1[cH:14][cH:15][c:9]2[c:10]([cH:12]1)[CH2:11][c:4]1[cH:3][c:2]([CH3:1])[cH:21][cH:20][c:5]1[O:6][CH:7]([C:17](=[O:18])[OH:19])[O:8]2.O=S(=O)(O)O>>[CH3:27][O:19][C:17](=[O:18])[CH:7]1[O:8][c:9]2[cH:15][cH:14][c:13]([CH3:16])[cH:12][c:10]2[CH2:11][c:4]2[cH:3][c:2]([CH3:1])[cH:21][cH:20][c:5]2[O:6]1 +03931176 [CH3:43][CH2:42][CH2:41][CH2:40][CH:39]([OH:44])[CH2:38][NH:36][NH2:37].CCC(O)CNN.CC(O)CNN.O=C(O)CCC(=O)c1ccc(F)cc1.O=[C:29](O)[CH2:28][CH2:27][C:25](=O)[c:24]1[cH:32][cH:33][c:34]([Cl:35])[c:22]([Cl:21])[cH:23]1>>[CH3:43][CH2:42][CH2:41][CH2:40][CH:39]([OH:44])[CH2:38][N:36]1[N:37]=[CH:29][CH2:28][CH2:27][CH:25]1[c:24]1[cH:32][cH:33][c:34]([Cl:35])[c:22]([Cl:21])[cH:23]1 +03931177 [K+].[K+].[CH2:17]=[CH:16][CH2:15]Br.O=C([O-])[O-].[O:14]=[C:11]1[CH2:10][CH2:9][C:8]([c:5]2[cH:4][cH:3][c:2]([OH:1])[cH:7][cH:6]2)=[N:13][NH:12]1>CC(C)=O>[CH2:15]=[CH:16][CH2:17][O:1][c:2]1[cH:3][cH:4][c:5]([C:8]2=[N:13][NH:12][C:11](=[O:14])[CH2:10][CH2:9]2)[cH:6][cH:7]1 +03931177 [OH-].[Na+].[O:14]=[C:11]1[CH2:10][CH2:9][C:8]([c:4]2[cH:5][cH:6][cH:7][c:2]([OH:1])[cH:3]2)=[N:13][NH:12]1.Cl[CH2:16][CH:17]1[CH2:18][O:19]1.C1CCNCC1>ClCCl>[O:14]=[C:11]1[CH2:10][CH2:9][C:8]([c:4]2[cH:5][cH:6][cH:7][c:2]([O:1][CH2:16][CH:17]3[CH2:18][O:19]3)[cH:3]2)=[N:13][NH:12]1 +03931177 [OH-].[Na+].[CH3:8][c:7]1[cH:6][cH:5][c:4]([C:9]2=[N:14][NH:13][C:12](=[O:15])[CH2:11][CH2:10]2)[cH:3][c:2]1[OH:1].Cl[CH2:17][CH:18]1[CH2:19][O:20]1.C1CCNCC1>ClCCl>[CH3:8][c:7]1[cH:6][cH:5][c:4]([C:9]2=[N:14][NH:13][C:12](=[O:15])[CH2:11][CH2:10]2)[cH:3][c:2]1[O:1][CH2:17][CH:18]1[CH2:19][O:20]1 +03931177 [Na+].[Na+].O=C([O-])[O-].O[CH2:11][CH2:10][N:9]([CH2:13][CH2:14][OH:15])[c:4]1[cH:3][c:2]([Br:1])[cH:7][cH:6][c:5]1[OH:8]>O=S(=O)(O)O>[OH:8][c:5]1[cH:6][cH:7][c:2]([Br:1])[cH:3][c:4]1[N:9]1[CH2:13][CH2:14][O:15][CH2:11][CH2:10]1 +03931177 Cl.[CH3:3][C:2](=[O:4])[NH:5][c:6]1[cH:7][cH:8][c:9]([OH:19])[c:10]([C:11](=[O:12])[CH2:13][CH2:14][C:15](=[O:16])[OH:17])[cH:18]1.Cl[CH:20](Cl)Cl>CO>[CH3:20][O:17][C:15](=[O:16])[CH2:14][CH2:13][C:11](=[O:12])[c:10]1[cH:18][c:6]([NH:5][C:2]([CH3:3])=[O:4])[cH:7][cH:8][c:9]1[OH:19] +03931177 [Na+].N[c:2]1[cH:3][c:4]([C:5](=[O:6])[CH2:7][CH2:8][C:9](=[O:10])[OH:11])[cH:12][cH:13][c:14]1[F:15].[O:17]=N[O-]>O=S(=O)(O)O>[O:10]=[C:9]([OH:11])[CH2:8][CH2:7][C:5](=[O:6])[c:4]1[cH:12][cH:13][c:14]([F:15])[c:2]([OH:17])[cH:3]1 +03931177 [O:11]=[C:10]([OH:12])[CH2:9][CH2:8][C:6](=[O:7])[c:5]1[cH:4][cH:3][c:2]([F:1])[cH:14][cH:13]1.O=[N+:16]([O-:17])[OH:15]>>[O:11]=[C:10]([OH:12])[CH2:9][CH2:8][C:6](=[O:7])[c:5]1[cH:4][cH:3][c:2]([F:1])[c:14]([N+:16](=[O:15])[O-:17])[cH:13]1 +03931177 [O:17]=[C:16]([OH:18])[CH2:15][CH2:14][C:12](=[O:13])[c:11]1[cH:19][cH:20][c:21]([N+:22](=O)[O-])[c:9]([O:8][CH2:1][c:2]2[cH:3][cH:4][cH:5][cH:6][cH:7]2)[cH:10]1.O=S(=O)([O-])[O-]>[NH4+].[OH-]>[NH2:22][c:21]1[cH:20][cH:19][c:11]([C:12](=[O:13])[CH2:14][CH2:15][C:16](=[O:17])[OH:18])[cH:10][c:9]1[O:8][CH2:1][c:2]1[cH:3][cH:4][cH:5][cH:6][cH:7]1 +03931177 O.CO[C:14](=[O:15])[CH2:13][CH2:12][C:10](=O)[c:9]1[cH:18][c:5]([NH:4]C(C)=O)[cH:6][cH:7][c:8]1[O:19][CH2:20][CH:21]([OH:28])[CH2:22][NH:23][C:24]([CH3:25])([CH3:26])[CH3:27].[NH2:31][NH2:30]>>[CH3:25][C:24]([CH3:26])([CH3:27])[NH:23][CH2:22][CH:21]([OH:28])[CH2:20][O:19][c:8]1[cH:7][cH:6][c:5]([NH2:4])[cH:18][c:9]1[C:10]1=[N:31][NH:30][C:14](=[O:15])[CH2:13][CH2:12]1 +03931177 [CH3:14][O:13][C:11](=[O:12])[CH2:10][CH2:9][C:7](=[O:8])[c:6]1[cH:15][cH:16][cH:17][cH:18][c:5]1[O:4][CH2:3][CH:2]1[CH2:19][O:1]1.[CH3:22][CH:21]([CH3:20])[NH2:23]>CO>[CH3:14][O:13][C:11](=[O:12])[CH2:10][CH2:9][C:7](=[O:8])[c:6]1[cH:15][cH:16][cH:17][cH:18][c:5]1[O:4][CH2:3][CH:2]([OH:1])[CH2:19][NH:23][CH:21]([CH3:20])[CH3:22] +03931179 [Na+].[Na+].[NH2:23][CH2:22][CH2:21][CH2:20][CH2:19][CH2:18][CH2:17][CH2:16][CH2:15][CH2:14][NH2:13].O=C([O-])[O-].[Cl:12][c:8]1[cH:9][cH:10][c:11]2[c:2](Cl)[n:3][cH:4][n:5][c:6]2[cH:7]1>CC(C)O>[Cl:12][c:8]1[cH:9][cH:10][c:11]2[c:6]([cH:7]1)[n:5][cH:4][n:3][c:2]2[NH:23][CH2:22][CH2:21][CH2:20][CH2:19][CH2:18][CH2:17][CH2:16][CH2:15][CH2:14][NH:13][c:2]1[n:3][cH:4][n:5][c:6]2[cH:7][c:8]([Cl:12])[cH:9][cH:10][c:11]21 +03931179 C[O:2][C:3](=O)[c:4]1[cH:5][c:6]2[c:7]([cH:8][c:9]1[NH2:10])[O:11][CH2:12][CH2:13][O:14]2.[NH2:18][CH:16]=O>>[O:2]=[c:3]1[nH:18][cH:16][n:10][c:9]2[cH:8][c:7]3[c:6]([cH:5][c:4]21)[O:14][CH2:13][CH2:12][O:11]3 +03931180 [OH-].[Na+].[CH3:18][CH2:17]OS(=O)(=O)OCC.[CH3:1][O:2][c:3]1[n:4][c:5]([OH:10])[cH:6][c:7]([OH:9])[n:8]1>>[CH3:18][CH2:17][O:9][c:7]1[cH:6][c:5]([OH:10])[n:4][c:3]([O:2][CH3:1])[n:8]1 +03931180 [OH-].[Na+].[CH3:16][CH2:15][CH2:14]OS(=O)(=O)c1ccc(C)cc1.[CH3:11][N:2]([CH3:1])[c:3]1[n:4][c:5]([OH:10])[cH:6][c:7]([OH:9])[n:8]1>CC(=O)O>[CH3:16][CH2:15][CH2:14][O:10][c:5]1[cH:6][c:7]([OH:9])[n:8][c:3]([N:2]([CH3:11])[CH3:1])[n:4]1 +03931181 [CH3:10][O:11][C:12](=[O:13])[c:14]1[cH:15][c:16]([O:32][CH3:33])[c:17]([CH2:22][c:23]2[c:24]([NH2:31])[n:25][c:26]([NH2:30])[n:27][c:28]2O)[c:18]([O:20][CH3:21])[cH:19]1.CN(C)c1ccccc1.O=P([Cl:36])(Cl)Cl>>[CH3:10][O:11][C:12](=[O:13])[c:14]1[cH:15][c:16]([O:32][CH3:33])[c:17]([CH2:22][c:23]2[c:24]([NH2:31])[n:25][c:26]([NH2:30])[n:27][c:28]2[Cl:36])[c:18]([O:20][CH3:21])[cH:19]1 +03931181 [S].[H][H].[CH3:2][CH2:1][O:3][C:4](=[O:20])[c:5]1[c:6]([O:17][CH2:18][CH3:19])[cH:7][c:8]([C:14](=[O:15])Cl)[cH:9][c:10]1[O:11][CH2:12][CH3:13].c1ccc2ncccc2c1>[Pd+2].[Ba+2].O=S(=O)([O-])[O-].O=S(=O)([O-])[O-]>[CH3:2][CH2:1][O:3][C:4](=[O:20])[c:5]1[c:6]([O:17][CH2:18][CH3:19])[cH:7][c:8]([CH:14]=[O:15])[cH:9][c:10]1[O:11][CH2:12][CH3:13] +03931181 [OH-].[K+].[CH3:26][O:25][c:15]1[cH:14][c:13]([CH2:12][c:5]2[cH:4][n:3][c:2]([NH2:1])[n:7][c:6]2[NH:8]C(C)=O)[cH:18][c:17]([O:19][CH3:20])[c:16]1[C:21]([CH3:22])([CH3:23])[OH:24]>>[CH3:20][O:19][c:17]1[cH:18][c:13]([CH2:12][c:5]2[cH:4][n:3][c:2]([NH2:1])[n:7][c:6]2[NH2:8])[cH:14][c:15]([O:25][CH3:26])[c:16]1[C:21]([CH3:22])([CH3:23])[OH:24] +03931191 [NH4+].[Cl-].[CH3:2][CH2:1][CH:3]1N=[CH:5][CH:6]([CH3:11])[CH:7]([CH2:9][CH3:10])[NH:8]1>>[CH3:10][CH2:9][c:7]1[n:8][cH:3][c:1]([CH3:2])[cH:5][c:6]1[CH3:11] +03931192 [Li]CCCC.[CH2:27]=[CH:26][C@H:19]1[CH2:18][N:17](C(=O)c2ccccc2)[CH2:22][CH2:21][C@H:20]1[CH2:23][CH:24]=[O:25].[Cl:2][CH2:1][Cl:3]>CCCCCC.C1CCOC1>[ClH:2].[CH2:27]=[CH:26][C@H:19]1[CH2:18][NH:17][CH2:22][CH2:21][C@H:20]1[CH2:23][C@H:24]([OH:25])[CH:1]([Cl:3])[Cl:2] +03931193 [CH3:12][CH2:11][c:6]1[cH:7][n:8][cH:9][cH:10][c:5]1[CH2:4][CH:3]([OH:13])[C:2]([Cl:14])([Cl:15])[Cl:1].[O:22]=[C:20]([OH:21])[C@@H:18]([OH:19])[C@H:17]([OH:16])[C:23](=[O:25])[OH:24]>CC(C)=O>[CH3:12][CH2:11][c:6]1[cH:7][n:8][cH:9][cH:10][c:5]1[CH2:4][C@@H:3]([OH:13])[C:2]([Cl:14])([Cl:1])[Cl:15].[O:21]=[C:20]([OH:22])[C@@H:18]([OH:19])[C@H:17]([OH:16])[C:23](=[O:24])[OH:25] +03931195 [I-].[CH3:15][n+:10]1[cH:11][cH:12][cH:13][cH:14][c:9]1[CH:8]=[CH:7][c:6]1[cH:16][cH:17][cH:18][cH:19][c:5]1[N+:2](=O)[O-]>CCO.O=[Pt]>[CH3:15][N:10]1[CH2:11][CH2:12][CH2:13][CH2:14][CH:9]1[CH2:8][CH2:7][c:6]1[cH:16][cH:17][cH:18][cH:19][c:5]1[NH2:2] +03931195 [CH3:21][CH2:20][CH:17]1[CH2:18][CH2:19][CH:14]([CH2:13][CH2:12][c:11]2[cH:23][cH:24][cH:25][cH:26][c:10]2[NH:9]C=O)[N:15]([CH3:22])[CH2:16]1.O=C(O)C(=O)O>CCO>[CH3:21][CH2:20][CH:17]1[CH2:18][CH2:19][CH:14]([CH2:13][CH2:12][c:11]2[cH:23][cH:24][cH:25][cH:26][c:10]2[NH2:9])[N:15]([CH3:22])[CH2:16]1 +03931195 CO[c:14]1[cH:15][cH:16][c:2](N)[c:3]([CH2:4][CH2:5]C2CCCCN2C)[cH:13]1.C[N:25]1[CH2:26][CH2:27][CH2:28][CH2:29][CH:24]1CCc1ccccc1N>>[cH:15]1[cH:14][cH:13][c:3]([CH2:4][CH2:5][N:25]2[CH2:24][CH2:29][CH2:28][CH2:27][CH2:26]2)[cH:2][cH:16]1 +03931195 [CH3:1][N:2]1[CH2:7][CH2:6][CH2:5][CH2:4][CH:3]1[CH2:8][CH2:9][c:10]1[cH:27][cH:26][cH:25][cH:24][c:11]1[NH:12][C:13](=[O:23])[c:14]1[cH:15][cH:16][c:17]([N+:20](=O)[O-])[cH:18][cH:19]1>CCO>[CH3:1][N:2]1[CH2:7][CH2:6][CH2:5][CH2:4][CH:3]1[CH2:8][CH2:9][c:10]1[cH:27][cH:26][cH:25][cH:24][c:11]1[NH:12][C:13](=[O:23])[c:14]1[cH:19][cH:18][c:17]([NH2:20])[cH:16][cH:15]1 +03931195 [CH3:19]CO.C[C:2](=[CH:3][c:4]1[cH:9][cH:8][cH:7][cH:6][n:5]1)[c:10]1[cH:15][cH:14][cH:13][cH:12][c:11]1[N+:16](=O)[O-]>>[CH3:19][CH:3]([CH2:2][c:10]1[cH:15][cH:14][cH:13][cH:12][c:11]1[NH2:16])[c:4]1[cH:9][cH:8][cH:7][cH:6][n:5]1 +03931195 Cl.[CH3:2][CH2:1][N:3]1[CH2:8][CH2:7][CH2:6][CH2:5][CH:4]1[CH2:9][CH2:10][c:11]1[cH:16][cH:15][cH:14][cH:13][c:12]1[NH:17]C=O>CO>[CH3:2][CH2:1][N:3]1[CH2:8][CH2:7][CH2:6][CH2:5][CH:4]1[CH2:9][CH2:10][c:11]1[cH:16][cH:15][cH:14][cH:13][c:12]1[NH2:17] +03931195 [CH3:13][CH2:12][N:7]1[CH2:8][CH2:9][CH2:10][CH2:11][CH:6]1[CH2:5][CH2:4][c:3]1[cH:14][cH:15][cH:16][cH:17][c:2]1[NH2:1].[O:27]=[C:18](Cl)[CH:19]=[CH:20][c:21]1[cH:22][cH:23][cH:24][cH:25][cH:26]1>>[CH3:13][CH2:12][N:7]1[CH2:8][CH2:9][CH2:10][CH2:11][CH:6]1[CH2:5][CH2:4][c:3]1[cH:14][cH:15][cH:16][cH:17][c:2]1[NH:1][C:18](=[O:27])[CH:19]=[CH:20][c:21]1[cH:22][cH:23][cH:24][cH:25][cH:26]1 +03931195 [Li]CCCC.[Li][c:2]1[cH:3][cH:4][cH:5][cH:6][n:1]1.[CH3:20][O:21][c:22]1[cH:23][cH:24][c:25]([C:26](=[O:27])[NH:28][c:29]2[cH:36][cH:35][cH:34][cH:33][c:30]2[CH:31]=[O:32])[cH:37][cH:38]1.Brc1ccccn1>CCCCCC.C1CCOC1>[CH3:20][O:21][c:22]1[cH:38][cH:37][c:25]([C:26](=[O:27])[NH:28][c:29]2[cH:36][cH:35][cH:34][cH:33][c:30]2[CH:31]([OH:32])[c:2]2[cH:3][cH:4][cH:5][cH:6][n:1]2)[cH:24][cH:23]1 +03931195 [NH4+].[OH-].O.[CH3:20][O:19][c:16]1[cH:15][cH:14][c:13]([C:12](=[O:21])[NH:11][CH:10]2[CH:22]=[CH:23][CH:24]=[CH:25][C:9]2=[C:7]([CH3:8])[c:2]2[cH:3][cH:4][cH:5][cH:6][n:1]2)[cH:18][cH:17]1.CC(=O)O>CCOC(C)=O>[CH3:20][O:19][c:16]1[cH:17][cH:18][c:13]([C:12](=[O:21])[NH:11][c:10]2[cH:22][cH:23][cH:24][cH:25][c:9]2[CH:7]([CH3:8])[c:2]2[cH:3][cH:4][cH:5][cH:6][n:1]2)[cH:14][cH:15]1 +03931195 [I-].[I-].C[n+]1ccccc1C=Cc1ccccc1[N+](=O)[O-].[CH3:15][n+:10]1[cH:11][cH:12][cH:13][cH:14][c:9]1[CH2:8][CH2:7][c:6]1[cH:16][cH:17][cH:18][cH:19][c:5]1[NH:4][CH:2]=[O:3]>>[CH3:15][N:10]1[CH2:11][CH2:12][CH2:13][CH2:14][CH:9]1[CH2:8][CH2:7][c:6]1[cH:16][cH:17][cH:18][cH:19][c:5]1[NH:4][CH:2]=[O:3] +03931195 CC[N:14](CC)[C:15](=[O:23])[c:16]1[cH:21][cH:20][c:19](C)[n:18][cH:17]1.CCN(CC)C(=O)c1ccc(C=Cc2ccccc2[N+](=O)[O-])nc1.CC(=O)OC(C)=O.O=Cc1ccccc1[N+](=O)[O-]>CC#N>[NH2:14][C:15](=[O:23])[c:16]1[cH:21][cH:20][cH:19][n:18][cH:17]1 +03931196 [Cl:20][P:19]([Cl:21])CCCc1ccccc1.Br[CH2:8][CH2:7][c:1]1[cH:2][cH:3][cH:4][cH:5][cH:6]1>>[Cl:20][P:19]([Cl:21])[CH2:8][CH2:7][c:1]1[cH:2][cH:3][cH:4][cH:5][cH:6]1 +03931197 [K+].[K+].[I-].[CH3:23][C:22]([CH3:24])([CH3:25])[c:26]1[cH:27][cH:28][c:29]([C:32](=[O:37])[CH2:33][CH2:34][CH2:35]Cl)[cH:30][cH:31]1.O=C([O-])O.[OH:8][C:7]([c:1]1[cH:2][cH:3][cH:4][cH:5][cH:6]1)([c:15]1[cH:16][cH:17][c:18]([Cl:21])[cH:19][cH:20]1)[CH:9]1[CH2:10][CH2:11][NH:12][CH2:13][CH2:14]1>O.Cc1ccccc1>[ClH:21].[CH3:23][C:22]([CH3:24])([CH3:25])[c:26]1[cH:31][cH:30][c:29]([C:32](=[O:37])[CH2:33][CH2:34][CH2:35][N:12]2[CH2:11][CH2:10][CH:9]([C:7]([OH:8])([c:1]3[cH:6][cH:5][cH:4][cH:3][cH:2]3)[c:15]3[cH:20][cH:19][c:18]([Cl:21])[cH:17][cH:16]3)[CH2:14][CH2:13]2)[cH:28][cH:27]1 +03931197 Cl.[ClH:1].[O:26]=[C:25]([CH2:24][CH2:23][CH2:22][N:19]1[CH2:18][CH2:17][CH:16]([C:3](O)([c:4]2[cH:5][cH:6][cH:7][cH:8][cH:9]2)[c:10]2[cH:11][cH:12][cH:13][cH:14][cH:15]2)[CH2:21][CH2:20]1)[c:27]1[cH:36][cH:35][c:34]2[cH:33][cH:32][cH:31][cH:30][c:29]2[cH:28]1>CC(C)O>[ClH:1].[O:26]=[C:25]([CH2:24][CH2:23][CH2:22][N:19]1[CH2:20][CH2:21][C:16](=[C:3]([c:10]2[cH:15][cH:14][cH:13][cH:12][cH:11]2)[c:4]2[cH:5][cH:6][cH:7][cH:8][cH:9]2)[CH2:17][CH2:18]1)[c:27]1[cH:36][cH:35][c:34]2[cH:33][cH:32][cH:31][cH:30][c:29]2[cH:28]1 +03931199 [Na+].[O:21]=[C:20]([O-:22])[c:18]1[cH:17][cH:16][c:8]2[o:9][c:10]3[n:11][cH:12][cH:13][cH:14][c:15]3[c:6](=[O:5])[c:7]2[cH:19]1.O=S([Cl:3])Cl>ClC(Cl)(Cl)Cl>[Cl-:3].[O:21]=[C:20]([OH:22])[c:18]1[cH:17][cH:16][c:8]2[o:9][c:10]3[n:11][cH:12][cH:13][cH:14][c:15]3[c:6](=[O:5])[c:7]2[cH:19]1 +03931199 [Al+3].[Cl-].[Cl-].[Cl-].Cl.[CH3:1][C:2](=[O:4])Cl.[cH:21]1[cH:20][cH:19][c:17]2[c:16]([cH:22]1)[CH2:15][c:11]1[cH:12][cH:13][cH:14][n:9][c:10]1[O:18]2>O>[CH3:1][C:2](=[O:4])[c:21]1[cH:20][cH:19][c:17]2[c:16]([cH:22]1)[CH2:15][c:11]1[cH:12][cH:13][cH:14][n:9][c:10]1[O:18]2 +03931199 [K+].[CH3:23][CH:22]([CH3:24])[CH:21]([OH:25])[c:19]1[cH:18][cH:17][c:15]2[c:14]([cH:20]1)[CH2:13][c:9]1[cH:10][cH:11][cH:12][n:7][c:8]1[O:16]2.[O:2]=[Mn](=O)(=O)[O-]>CC(C)=O>[CH3:24][CH:22]([CH3:23])[C:21](=[O:25])[c:19]1[cH:18][cH:17][c:15]2[o:16][c:8]3[n:7][cH:12][cH:11][cH:10][c:9]3[c:13](=[O:2])[c:14]2[cH:20]1 +03931199 [OH-:2].[Na+].[Br].C[C:4](=[O:6])[c:7]1[cH:8][cH:9][c:10]2[c:11]([cH:22]1)[C:12]([CH3:20])([CH3:21])[c:13]1[cH:18][cH:17][cH:16][n:15][c:14]1[O:19]2>O.C1COCCO1>[CH3:21][C:12]1([CH3:20])[c:13]2[cH:18][cH:17][cH:16][n:15][c:14]2[O:19][c:10]2[cH:9][cH:8][c:7]([C:4](=[O:2])[OH:6])[cH:22][c:11]21 +03931199 [K+].[CH3:12][CH2:11][c:13]1[cH:14][cH:15][c:16]2[o:25][c:20]3[n:21][cH:22][cH:23][cH:24][c:19]3[c:18](=[O:26])[c:17]2[cH:27]1.O=[N+]([O-])O.[O:6]=[Mn](=O)(=O)[O-]>O>[CH3:12][C:11](=[O:6])[c:13]1[cH:14][cH:15][c:16]2[o:25][c:20]3[n:21][cH:22][cH:23][cH:24][c:19]3[c:18](=[O:26])[c:17]2[cH:27]1 +03931199 [NH4+].[Mg].[Cl-].[CH3:3][CH:2]([CH3:4])I.[O:21]=[CH:20][c:18]1[cH:17][cH:16][c:14]2[c:13]([cH:19]1)[CH2:12][c:8]1[cH:9][cH:10][cH:11][n:6][c:7]1[O:15]2>>[CH3:3][CH:2]([CH3:4])[CH:20]([OH:21])[c:18]1[cH:17][cH:16][c:14]2[c:13]([cH:19]1)[CH2:12][c:8]1[cH:9][cH:10][cH:11][n:6][c:7]1[O:15]2 +03931200 [NH4+:27].[OH-].CO.CC(=O)N[c:14]1[cH:13][cH:12][c:11]([O:10][CH2:9][c:3]2[n:4][c:5]([Cl:8])[cH:6][cH:7][c:2]2[Cl:1])[cH:16][cH:15]1.FB(F)F>O>[NH2:27][c:12]1[cH:13][cH:14][cH:15][cH:16][c:11]1[O:10][CH2:9][c:3]1[n:4][c:5]([Cl:8])[cH:6][cH:7][c:2]1[Cl:1] +03931200 [BH4-].[Na+].Cl.O=[C:9](O)[c:3]1[n:4][c:5]([Cl:8])[cH:6][cH:7][c:2]1[Cl:1].O=S(Cl)Cl.OCc1nc(Cl)ccc1[Cl:14].c1ccncc1>O.CO>[Cl:14][CH2:9][c:3]1[n:4][c:5]([Cl:8])[cH:6][cH:7][c:2]1[Cl:1] +03931201 [NH2:19][c:16]1[cH:15][cH:14][c:13]([O:12][c:10]2[cH:9][cH:8][cH:7][c:6]([Cl:5])[n:11]2)[cH:18][cH:17]1.[O:4]=[C:2](Cl)Cl>Cc1ccccc1>[O:4]=[C:2]=[N:19][c:16]1[cH:15][cH:14][c:13]([O:12][c:10]2[cH:9][cH:8][cH:7][c:6]([Cl:5])[n:11]2)[cH:18][cH:17]1 +03931202 [O:12]=[C:11]=[N:10][c:7]1[cH:6][cH:5][c:4]([N+:1](=[O:2])[O-:3])[cH:9][cH:8]1.[OH:20][CH2:19][c:15]1[cH:16][cH:17][cH:18][n:13][cH:14]1>c1ccccc1>[O:12]=[C:11]([NH:10][c:7]1[cH:8][cH:9][c:4]([N+:1](=[O:2])[O-:3])[cH:5][cH:6]1)[O:20][CH2:19][c:15]1[cH:16][cH:17][cH:18][n:13][cH:14]1 +03931203 [NH2:13][CH2:14][c:15]1[cH:20][cH:19][cH:18][n:17][cH:16]1.[O:12]=[C:11]=[N:10][c:7]1[cH:6][cH:5][c:4]([N+:1](=[O:2])[O-:3])[cH:9][cH:8]1>Cc1ccccc1>[O:12]=[C:11]([NH:13][CH2:14][c:15]1[cH:20][cH:19][cH:18][n:17][cH:16]1)[NH:10][c:7]1[cH:8][cH:9][c:4]([N+:1](=[O:2])[O-:3])[cH:5][cH:6]1 +03931204 O.[CH3:14][CH2:13][OH:15].[Cl:1][c:2]1[n:7][c:6]2[cH:8][s:9][cH:10][c:5]2[c:4](Cl)[n:3]1>>[CH3:14][CH2:13][O:15][c:4]1[n:3][c:2]([Cl:1])[n:7][c:6]2[cH:8][s:9][cH:10][c:5]21 +03931204 [CH3:18][CH2:17][CH2:16][NH2:19].[CH3:2][CH2:1][O:3][c:4]1[n:9][c:8]2[cH:10][s:11][cH:12][c:7]2[c:6](OCC)[n:5]1>CCO>[CH3:18][CH2:17][CH2:16][NH:19][c:6]1[n:5][c:4]([O:3][CH2:1][CH3:2])[n:9][c:8]2[cH:10][s:11][cH:12][c:7]21 +03931205 [BH4-].[Na+].Cl.Cc1ccccc1.[CH3:20][CH:16]([C:17](=[O:18])[OH:19])[c:14]1[cH:13][cH:12][c:4]2[o:5][c:6]3[n:7][cH:8][cH:9][cH:10][c:11]3[c:2](=O)[c:3]2[cH:15]1>[OH-].O.[Na+]>[CH3:20][CH:16]([C:17](=[O:18])[OH:19])[c:14]1[cH:13][cH:12][c:4]2[c:3]([cH:15]1)[CH2:2][c:11]1[cH:10][cH:9][cH:8][n:7][c:6]1[O:5]2 +03931205 [OH-].[Na+].[CH3:17][CH:13]([C:14](=[O:15])[OH:16])[c:8]1[cH:9][cH:10][c:11]([OH:12])[c:6]([C:4](=[O:5])[c:3]2[cH:18][cH:19][cH:20][n:21][c:2]2Cl)[cH:7]1>O.[Cu].I[Cu]I>[CH3:17][CH:13]([C:14](=[O:15])[OH:16])[c:8]1[cH:9][cH:10][c:11]2[o:12][c:2]3[n:21][cH:20][cH:19][cH:18][c:3]3[c:4](=[O:5])[c:6]2[cH:7]1 +03931205 Cl.O[CH:2]1[c:3]2[cH:15][cH:14][cH:13][cH:12][c:4]2[O:5][c:6]2[n:7][cH:8][cH:9][cH:10][c:11]21>CC(C)O>[cH:14]1[cH:13][cH:12][c:4]2[c:3]([cH:15]1)[CH2:2][c:11]1[cH:10][cH:9][cH:8][n:7][c:6]1[O:5]2 +03931205 [CH3:19][C:20](=[O:22])[OH:21].N#CC[c:4]1[cH:5][cH:6][c:7]2[o:16][c:11]3[n:12][cH:13][cH:14][cH:15][c:10]3[c:9](=[O:17])[c:8]2[cH:18]1>Cl>[O:22]=[C:20]([OH:21])[CH2:19][c:4]1[cH:5][cH:6][c:7]2[o:16][c:11]3[n:12][cH:13][cH:14][cH:15][c:10]3[c:9](=[O:17])[c:8]2[cH:18]1 +03931205 [Na].[CH3:27]I.[CH3:22][CH2:21][O:20][C:19](=O)[O:23]CC.[N:3]#[C:2][CH2:4][c:5]1[cH:6][cH:7][c:8]2[c:9]([cH:18]1)[CH2:10][c:11]1[cH:16][cH:15][cH:14][n:13][c:12]1[O:17]2>CCO>[CH3:22][CH2:21][O:20][C:19](=[O:23])[C:4]([CH3:27])([C:2]#[N:3])[c:5]1[cH:6][cH:7][c:8]2[c:9]([cH:18]1)[CH2:10][c:11]1[cH:16][cH:15][cH:14][n:13][c:12]1[O:17]2 +03931206 O=P([Cl:12])(Cl)Cl.[OH:9][c:4]1[cH:3][c:2]([Cl:1])[cH:7][n:6][c:5]1O>>[OH:9][c:4]1[cH:3][c:2]([Cl:1])[cH:7][n:6][c:5]1[Cl:12] +03931209 [NH2:12][c:10]1[n:9][n:8][c:7]([C:6]([F:13])([F:14])[F:5])[s:11]1.[O:4]=[C:2](Cl)Cl>CCOC(C)=O>[O:4]=[C:2]=[N:12][c:10]1[n:9][n:8][c:7]([C:6]([F:13])([F:14])[F:5])[s:11]1 +03931209 [CH3:5][S:6][c:7]1[n:8][n:9][c:10]([NH2:12])[s:11]1.[O:4]=[C:2](Cl)Cl>CCOC(C)=O>[CH3:5][S:6][c:7]1[n:8][n:9][c:10]([N:12]=[C:2]=[O:4])[s:11]1 +03931209 [CH3:4][CH2:3][CH2:2][CH2:1][NH:5][NH2:6].[CH3:7][S:8](=[O:9])(=[O:10])[c:11]1[n:12][n:13][c:14]([N:16]=[C:17]=[O:18])[s:15]1.NN>ClCCl>[CH3:4][CH2:3][CH2:2][CH2:1][N:5]([NH2:6])[C:17](=[O:18])[NH:16][c:14]1[n:13][n:12][c:11]([S:8]([CH3:7])(=[O:9])=[O:10])[s:15]1 +03931209 [CH3:6][CH2:5][CH2:4][CH2:3][CH2:2][CH2:1][NH:7][NH2:8].[CH3:9][S:10](=[O:11])[c:12]1[n:13][n:14][c:15]([N:17]=[C:18]=[O:19])[s:16]1.NN>ClCCl>[CH3:6][CH2:5][CH2:4][CH2:3][CH2:2][CH2:1][N:7]([NH2:8])[C:18](=[O:19])[NH:17][c:15]1[n:14][n:13][c:12]([S:10]([CH3:9])=[O:11])[s:16]1 +03931209 [OH-].[K+].[CH2:16]=O.[CH3:1][N:2]([NH2:3])[C:4](=[O:5])[NH:6][c:7]1[n:11][n:10][c:9]([CH:12]2[CH2:13][CH2:14][CH2:15]2)[s:8]1>CO>[CH3:1][N:2]1[NH:3][CH2:16][N:6]([c:7]2[n:11][n:10][c:9]([CH:12]3[CH2:13][CH2:14][CH2:15]3)[s:8]2)[C:4]1=[O:5] +03931209 [OH-].[K+].[CH2:16]=O.[CH3:1][N:2]([NH2:3])[C:4](=[O:5])[NH:6][c:7]1[n:11][n:10][c:9]([C:12]([F:13])([F:14])[F:15])[s:8]1>CO>[CH3:1][N:2]1[NH:3][CH2:16][N:6]([c:7]2[n:11][n:10][c:9]([C:12]([F:14])([F:13])[F:15])[s:8]2)[C:4]1=[O:5] +03931209 [CH3:5][c:6]1[n:7][n:8][c:9]([NH2:11])[s:10]1.[O:4]=[C:2](Cl)Cl>CCOC(C)=O>[CH3:5][c:6]1[n:7][n:8][c:9]([N:11]=[C:2]=[O:4])[s:10]1 +03931210 [NH3:15].[Mg+].C[O:2][C:3](=[O:13])[c:4]1[cH:5][cH:6][c:7]([C:8](=[O:9])[O-])[cH:11][cH:12]1>>[NH2:15][C:8](=[O:9])[c:7]1[cH:6][cH:5][c:4]([C:3](=[O:13])[OH:2])[cH:12][cH:11]1 +03931214 [CH2:8]=[CH:7][CH:5]1[CH2:4][O:3][C:2]([NH2:1])=[N:6]1.[O:11]=[C:10]([OH:9])/[CH:12]=[CH:13]/[C:14](=[O:16])[OH:15]>CCO>[CH2:8]=[CH:7][CH:5]1[CH2:4][O:3][C:2]([NH2:1])=[N:6]1.[O:9]=[C:10]([OH:11])/[CH:12]=[CH:13]/[C:14](=[O:15])[OH:16] +03931217 [ClH:19].CCO.[NH2:18][CH2:17][CH2:16][NH2:15].O=[CH:4][c:3]1[cH:6][cH:7][cH:8][cH:9][c:2]1[C:1](=O)[OH:11]>CO>[ClH:19].[O:11]=[C:1]1[c:2]2[cH:9][cH:8][cH:7][cH:6][c:3]2[CH:4]2[NH:15][CH2:16][CH2:17][N:18]12 +03931217 [H-].[H-].[H-].[H-].[Li+].[Na+].[Na+].[Al+3].[O:17]=[C:16](O)[c:15]1[cH:19][cH:20][cH:21][cH:22][c:14]1[C:12](=[O:13])[c:11]1[cH:10][cH:9][c:8]([Br:7])[cH:24][cH:23]1.O=S(=O)([O-])[O-]>C1CCOC1>[O:17]=[CH:16][c:15]1[cH:19][cH:20][cH:21][cH:22][c:14]1[C:12](=[O:13])[c:11]1[cH:10][cH:9][c:8]([Br:7])[cH:24][cH:23]1 +03931217 [H-].[H-].[H-].[H-].[Li+].[Al+3].[O:20]=[C:19](O)[c:18]1[cH:22][cH:23][cH:24][cH:25][c:17]1[C:15](=[O:16])[c:14]1[cH:26][cH:27][cH:28][cH:29][c:13]1[Cl:12].[CH2:9]1[CH2:10]CO[CH2:8]1>O>[CH3:8][CH:9]([CH3:10])[O:16][CH:15]([CH3:17])[CH3:14].[OH:20][CH2:19][c:18]1[cH:22][cH:23][cH:24][cH:25][c:17]1[CH:15]([OH:16])[c:14]1[cH:26][cH:27][cH:28][cH:29][c:13]1[Cl:12] +03931218 [CH3:14][CH2:13][N:12]([CH2:15][CH:16]([CH3:28])[NH:17]S(=O)(=O)c1ccc(C)cc1)[C:10](=O)[c:9]1[cH:29][cH:30][cH:31][cH:32][c:8]1[C:6](=[O:7])[c:5]1[cH:4][cH:3][c:2]([Cl:1])[cH:34][cH:33]1.O=S(=O)(O)O>>[ClH:1].[CH3:14][CH2:13][N:12]1[CH2:15][CH:16]([CH3:28])[N:17]=[C:10]1[c:9]1[cH:29][cH:30][cH:31][cH:32][c:8]1[C:6](=[O:7])[c:5]1[cH:4][cH:3][c:2]([Cl:1])[cH:34][cH:33]1 +03931225 [CH3:15][C:16](=[O:18])Cl.[CH3:14][N:2]([CH3:1])[CH:3]=[CH:4][c:5]1[cH:10][cH:9][cH:8][cH:7][c:6]1[N+:11](=[O:12])[O-:13]>c1ccncc1>[CH3:15][C:16](=[O:18])[C:4](=[CH:3][N:2]([CH3:14])[CH3:1])[c:5]1[cH:10][cH:9][cH:8][cH:7][c:6]1[N+:11](=[O:12])[O-:13] +03931226 [NH2:1][C:2]1=[N:3][c:4]2[cH:5][cH:6][c:7]([Cl:18])[cH:8][c:9]2[C:10]1([OH:11])[c:12]1[cH:13][cH:14][cH:15][cH:16][cH:17]1.Br[CH2:23][CH2:22][CH2:21][CH2:20]Br>>[OH:11][C:10]1([c:12]2[cH:13][cH:14][cH:15][cH:16][cH:17]2)[c:9]2[cH:8][c:7]([Cl:18])[cH:6][cH:5][c:4]2[N:3]2[CH2:20][CH2:21][CH2:22][CH2:23][N:1]=[C:2]21 +03931226 O.[NH2:1][c:2]1[cH:16][cH:15][cH:14][cH:13][c:3]1[C:4](=[O:5])[c:6]1[cH:11][cH:10][cH:9][c:8]([Cl:12])[cH:7]1.[O:22]=[C:20](Cl)[CH:18]([Cl:19])[Cl:17]>CC(C)=O>[O:22]=[C:20]([NH:1][c:2]1[cH:16][cH:15][cH:14][cH:13][c:3]1[C:4](=[O:5])[c:6]1[cH:11][cH:10][cH:9][c:8]([Cl:12])[cH:7]1)[CH:18]([Cl:17])[Cl:19] +03931228 C[c:20]1[cH:21][cH:22][c:18](C)[nH:19]1.O=[CH:4][c:3]1[cH:6][cH:7][cH:8][cH:9][c:2]1[C:1](=[O:10])[OH:11].[cH:14]1[cH:15][cH:16][nH:12][cH:13]1>c1ccccc1>[O:10]=[C:1]1[O:11][CH:4]([c:22]2[cH:21][cH:20][nH:19][cH:18]2)[c:3]2[cH:6][cH:7][cH:8][cH:9][c:2]21.[O:10]=[C:1]1[O:11][CH:4]([c:13]2[cH:14][cH:15][cH:16][nH:12]2)[c:3]2[cH:6][cH:7][cH:8][cH:9][c:2]21 +03931232 [CH3:9][CH2:8][CH2:7][CH2:6][CH2:5][CH:4]([CH2:10][CH3:11])[CH:3]([CH2:1][CH3:2])[c:12]1[cH:18][c:16]([OH:17])[cH:15][c:14]([OH:19])[cH:13]1.[CH3:21][C:20](=O)[CH:23]1[CH2:28][CH2:27][CH:26]([CH3:29])[CH2:25][C:24]1=O>>[CH3:9][CH2:8][CH2:7][CH2:6][CH2:5][CH:4]([CH2:10][CH3:11])[CH:3]([CH2:1][CH3:2])[c:12]1[cH:18][c:16]([OH:17])[c:15]2[c:14]([cH:13]1)[O:19][C:24]1=[C:23]([CH2:28][CH2:27][CH:26]([CH3:29])[CH2:25]1)[CH:20]2[CH3:21] +03931232 [CH3:8][CH2:7][CH2:6][CH2:5][CH2:4][CH:3]([CH3:9])[CH:2]([CH3:1])[c:10]1[cH:11][c:12]([OH:24])[c:13]2[c:22]([cH:23]1)[O:21][C:20]1=[C:15]([CH2:16][CH2:17][CH2:18][CH2:19]1)[CH2:14]2.CCCCCC(C)C(C)c1cc(O)c2c(c1)[O:45][C:44]1=[C:39](CCC(C)C1)C2C>>[CH3:8][CH2:7][CH2:6][CH2:5][CH2:4][CH:3]([CH3:9])[CH:2]([CH3:1])[c:10]1[cH:11][c:12]([O:24][C:44]([CH3:39])=[O:45])[c:13]2[c:22]([cH:23]1)[O:21][C:20]1=[C:15]([CH2:16][CH2:17][CH2:18][CH2:19]1)[CH2:14]2 +03931232 [CH3:14][CH2:13][CH2:12][CH2:11][CH2:10][CH2:9][CH2:8][CH2:7][C:6]([CH3:15])=[C:5]([CH3:4])[c:16]1[cH:22][c:20]([OH:21])[cH:19][c:18]([OH:23])[cH:17]1.[CH3:3][O:2][CH3:1]>CCO>[CH3:14][CH2:13][CH2:12][CH2:11][CH2:10][CH2:9][CH2:8][CH2:7][CH:6]([CH3:15])[CH:5]([CH3:4])[c:16]1[cH:17][c:18]([OH:23])[cH:19][c:20]([OH:21])[cH:22]1.[CH3:3][O:2][CH3:1] +03931232 CCCCCCCC[CH:24]([CH3:25])Br.CC[CH2:20][CH2:19][CH:16](Br)[CH2:17][CH3:18].[CH3:2][CH2:1][C:3](=O)[c:5]1[cH:6][c:7]([O:13]C)[cH:8][c:9]([O:11]C)[cH:10]1>>[CH3:20][CH2:19][CH2:16][CH2:17][CH2:18][CH:1]([CH3:2])[CH:3]([CH2:24][CH3:25])[c:5]1[cH:10][c:9]([OH:11])[cH:8][c:7]([OH:13])[cH:6]1 +03931235 CC(=O)[OH:22].[CH3:16][c:12]1[cH:13][c:14]([OH:15])[c:9]([S:8][CH2:1][c:2]2[cH:3][cH:4][cH:5][cH:6][cH:7]2)[c:10](=[O:17])[o:11]1.OO>CCO.Cc1ccccc1>[CH3:16][c:12]1[cH:13][c:14]([OH:15])[c:9]([S:8](=[O:22])[CH2:1][c:2]2[cH:7][cH:6][cH:5][cH:4][cH:3]2)[c:10](=[O:17])[o:11]1 +03931235 [OH2:22].CC(=O)[OH:20].[CH3:14][c:10]1[cH:11][c:12]([OH:13])[c:7]([S:6][CH2:1][CH2:2][CH:3]([CH3:4])[CH3:5])[c:8](=[O:15])[o:9]1.OO>>[CH3:14][c:10]1[cH:11][c:12]([OH:13])[c:7]([S:6](=[O:22])(=[O:20])[CH2:1][CH2:2][CH:3]([CH3:4])[CH3:5])[c:8](=[O:15])[o:9]1 +03931235 Cl.[CH3:16][c:14]1[cH:15][c:10]([OH:9])[cH:11][c:12](=[O:17])[o:13]1.Cl[S:7][c:1]1[cH:2][cH:3][cH:4][cH:5][cH:6]1>c1ccccc1>[CH3:16][c:14]1[cH:15][c:10]([OH:9])[c:11]([S:7][c:1]2[cH:2][cH:3][cH:4][cH:5][cH:6]2)[c:12](=[O:17])[o:13]1 +03931235 [CH3:15][c:11]1[cH:12][c:13]([OH:14])[c:8]([S:7][CH2:6][c:5]2[cH:4][cH:3][c:2]([F:1])[cH:18][cH:17]2)[c:9](=[O:16])[o:10]1.O[OH:19]>O.CC(=O)O>[CH3:15][c:11]1[cH:12][c:13]([OH:14])[c:8]([S:7](=[O:19])[CH2:6][c:5]2[cH:4][cH:3][c:2]([F:1])[cH:18][cH:17]2)[c:9](=[O:16])[o:10]1 +03931235 CC(=[O:22])OO.[CH3:13][c:9]1[cH:10][c:11]([OH:12])[c:6]([S:5][CH2:4][c:3]2[cH:15][cH:16][c:17]([Cl:19])[cH:18][c:2]2[Cl:1])[c:7](=[O:14])[o:8]1>O.CC(=O)O>[CH3:13][c:9]1[cH:10][c:11]([OH:12])[c:6]([S:5](=[O:22])[CH2:4][c:3]2[cH:15][cH:16][c:17]([Cl:19])[cH:18][c:2]2[Cl:1])[c:7](=[O:14])[o:8]1 +03931235 [CH3:24][c:22]1[cH:23][c:18]([OH:17])[c:19]([SH:26])[c:20](=[O:25])[o:21]1.O=S(=O)(O)O.O[C:6]12[CH2:7][CH:8]3[CH2:9][CH:10]([CH2:11][CH:12]([CH2:14]3)[CH2:13]1)[CH2:15]2>>[CH3:24][c:22]1[cH:23][c:18]([OH:17])[c:19]([S:26][C:6]23[CH2:7][CH:8]4[CH2:9][CH:10]([CH2:11][CH:12]([CH2:14]4)[CH2:13]2)[CH2:15]3)[c:20](=[O:25])[o:21]1 +03931235 [Br-].[CH:13]#[C:12][CH2:11]Br.[CH3:8][c:6]1[cH:7][c:2]([OH:1])[c:3]([SH:10])[c:4](=[O:9])[o:5]1.c1cc[nH+]cc1>c1ccncc1>[CH:11]#[C:12][CH2:13][S:10][c:3]1[c:2]([OH:1])[cH:7][c:6]([CH3:8])[o:5][c:4]1=[O:9] +03931237 C=O.[CH3:5][CH:4]([CH3:6])[C:3](=[O:7])[O:8][CH2:9][C:10]([CH3:26])([CH3:27])[C:11](=[O:12])[O:13][C:14](=[O:25])[C:15]([CH3:23])([CH3:24])[CH2:16][O:17][C:18](=[O:22])[CH:19]([CH3:20])[CH3:21]>>[CH3:21][CH:19]([CH3:20])[C:18](=[O:22])[O:17][CH2:16][C:15]([CH3:23])([CH3:24])[C:14](=[O:25])[O:13][C:11](=[O:12])[C:10]([CH3:27])([CH3:26])[CH2:9][O:8][C:3](=[O:7])[CH:4]([CH3:6])[CH3:5].[CH3:9][CH:10]([CH3:26])[C:11](=[O:12])[O:13][C:14](=[O:25])[CH:15]([CH3:16])[CH3:23] +03931239 Cl.Cl.CN[CH3:22].CC(=O)O.[CH3:19][c:9]1[c:10]2[c:11]([cH:18][c:7]([C:1](=[O:6])[CH2:2][CH:3]([CH3:4])[CH3:5])[c:8]1[CH3:20])[CH2:12][CH:13]([C:15](=[O:16])[OH:17])[O:14]2>O.CN(C)C=O>[CH2:22]=[C:2]([C:1](=[O:6])[c:7]1[cH:18][c:11]2[c:10]([c:9]([CH3:19])[c:8]1[CH3:20])[O:14][CH:13]([C:15](=[O:16])[OH:17])[CH2:12]2)[CH:3]([CH3:4])[CH3:5] +03931239 [CH3:12][CH2:11][C:10](=[CH:13][c:14]1[cH:15][cH:16][cH:17][cH:18][cH:19]1)[C:9](=[O:20])[c:6]1[cH:5][cH:4][c:3]([O:21][CH3:22])[c:2]([Cl:1])[c:7]1[Cl:8]>O>[CH3:12][CH2:11][CH:10]1[C:9](=[O:20])[c:6]2[c:5]([cH:4][c:3]([O:21][CH3:22])[c:2]([Cl:1])[c:7]2[Cl:8])[CH:13]1[c:14]1[cH:19][cH:18][cH:17][cH:16][cH:15]1 +03931239 [CH3:19][CH2:18][CH2:17][CH:6]1[CH2:7][c:8]2[c:9]3[c:10]([c:2]([CH3:1])[c:3]([CH3:21])[c:4]2[CH:5]1[OH:20])[O:11][CH:12]([C:14](=[O:15])[OH:16])[CH2:13]3.O=[Cr](=O)=O.O=S(=O)(O)O>O.CC(C)=O>[CH3:19][CH2:18][CH2:17][CH:6]1[CH2:7][c:8]2[c:9]3[c:10]([c:2]([CH3:1])[c:3]([CH3:21])[c:4]2[C:5]1=[O:20])[O:11][CH:12]([C:14](=[O:15])[OH:16])[CH2:13]3 +03931239 [Al+3].[Cl-].[Cl-].[Cl-].Cl.[CH3:1][c:2]1[cH:13][cH:12][c:5]2[cH:6][c:7]([C:9](=[O:10])[OH:11])[o:8][c:4]2[c:3]1[CH3:14].[CH3:18][CH:17]([CH3:19])[CH2:16][C:15](=[O:20])Cl>ClCCl>[CH3:14][c:3]1[c:4]2[o:8][c:7]([C:9](=[O:10])[OH:11])[cH:6][c:5]2[cH:12][c:13]([C:15](=[O:20])[CH2:16][CH:17]([CH3:18])[CH3:19])[c:2]1[CH3:1] +03931239 Cl.[CH3:1][c:2]1[c:10]2[o:11][c:12]([C:14](=[O:15])[OH:16])[cH:13][c:9]2[c:8]2[c:4]([c:3]1[CH3:22])[C:5](=[O:21])[C:6](Br)([CH:17]([CH3:18])[CH3:19])[CH2:7]2>CS(C)=O>[CH3:1][c:2]1[c:10]2[o:11][c:12]([C:14](=[O:15])[OH:16])[cH:13][c:9]2[c:8]2[c:4]([c:3]1[CH3:22])[C:5](=[O:21])[C:6]([CH:17]([CH3:19])[CH3:18])=[CH:7]2 +03931241 [O].[Cl-].[Cl-:1].[K+].[CH3:7][C:6]1=[CH:8][C:9](=[O:10])[O:11][C:5]1=[O:12].CC1CC(=O)OC1=O>O>[O:10]=[C:9]1[CH2:8][CH:6]([CH2:7][Cl:1])[C:5](=[O:12])[O:11]1 +03931245 [CH2:2]=[CH:1][c:3]1[cH:8][n:7][cH:6][cH:5][n:4]1.[CH3:9][SH:10].O=C(OOC(=O)c1ccccc1)c1ccccc1>>[CH3:9][S:10][CH2:2][CH2:1][c:3]1[cH:8][n:7][cH:6][cH:5][n:4]1 +03931245 [CH2:8]=[O:9].[CH3:2][CH2:1][n:3]1[cH:4][cH:5][cH:6][cH:7]1>>[CH3:2][CH2:1][n:3]1[cH:7][cH:6][cH:5][c:4]1[CH:8]=[O:9] +03931246 [CH3:17][CH2:16][CH2:15][CH2:14][CH2:13][C:12]([CH3:11])=O.[CH3:10][CH2:9][CH2:8][CH2:7][C:3](=[N:1]O)[C:4]([CH3:5])=O.N=C=O.O=[N:19]Cl>[Zn].CC(=O)O>[CH3:10][CH2:9][CH2:8][CH2:7][c:3]1[n:1][c:12]([CH3:11])[c:13]([CH2:14][CH2:15][CH2:16][CH3:17])[n:19][c:4]1[CH3:5] +03931246 [CH3:12][C:13](=[O:15])Cl.[cH:9]1[cH:10][cH:11][n:7]([CH2:1][c:2]2[cH:3][cH:4][cH:5][o:6]2)[cH:8]1>>[CH3:12][C:13](=[O:15])[c:8]1[cH:9][cH:10][cH:11][n:7]1[CH2:1][c:2]1[cH:3][cH:4][cH:5][o:6]1 +03931247 [BH4-].[Na+].[CH3:2][C:1](=[O:3])[c:4]1[cH:5][cH:6][c:7](-[c:9]2[cH:10][cH:11][c:12]([C:13]#[N:14])[cH:15][cH:16]2)[o:8]1>O.C1COCCO1>[CH3:2][CH:1]([OH:3])[c:4]1[cH:5][cH:6][c:7](-[c:9]2[cH:10][cH:11][c:12]([C:13]#[N:14])[cH:15][cH:16]2)[o:8]1 +03931247 O.O.[Na+].[Cl-].Cl.[CH3:22][C:20](=[O:21])[c:16]1[cH:17][cH:18][cH:19][o:15]1.N[c:2]1[cH:3][cH:4][c:5]([Cl:6])[c:7]([Cl:8])[cH:9]1.O=N[O-]>O.CC(C)=O>[CH3:22][C:20](=[O:21])[c:16]1[cH:17][cH:18][c:19](-[c:2]2[cH:3][cH:4][c:5]([Cl:6])[c:7]([Cl:8])[cH:9]2)[o:15]1 +03931247 [BH4-].[Na+].[CH3:2][C:1](=[O:3])[NH:4][c:5]1[cH:6][cH:7][c:8](-[c:11]2[cH:12][cH:13][c:14]([C:16]([CH3:18])=[O:17])[o:15]2)[cH:9][cH:10]1>O.C1COCCO1>[CH3:2][C:1](=[O:3])[NH:4][c:5]1[cH:10][cH:9][c:8](-[c:11]2[cH:12][cH:13][c:14]([CH:16]([CH3:18])[OH:17])[o:15]2)[cH:7][cH:6]1 +03931251 [O:19]=[C:9]1[c:10]2[cH:11][cH:12][cH:13][cH:14][c:15]2[C:16](=[O:18])[c:17]2[c:8]1[cH:7][cH:6][cH:5][c:4]2[N+](=O)[O-].O=C1c2ccccc2C(=O)c2c1ccc([N+](=O)[O-])c2[N+](=O)[O-]>>[O:18]=[C:16]1[c:15]2[cH:14][cH:13][cH:12][cH:11][c:10]2[C:9](=[O:19])[c:8]2[cH:7][cH:6][cH:5][cH:4][c:17]21 +03931252 [O:16]=[C:6]1[c:5]2[cH:4][cH:3][cH:2][cH:1][c:14]2[C:13](=[O:15])[c:12]2[cH:11][cH:10][cH:9][cH:8][c:7]21.O=[N+:18]([O-:19])[OH:17]>O>[O:15]=[C:13]1[c:14]2[cH:1][cH:2][cH:3][cH:4][c:5]2[C:6](=[O:16])[c:7]2[c:12]1[cH:11][cH:10][cH:9][c:8]2[N+:18](=[O:17])[O-:19] +03931255 [OH2:18].Cl.[O:17]=[C:7]1[CH:8]=[CH:9][C:10](=NO)[c:11]2[cH:12][cH:13][cH:14][c:5]([N+:2](=[O:3])[O-:4])[c:6]21>O.O.O.O.[Cl-].[Cl-].[Fe+2]>[O:18]=[C:10]1[CH:9]=[CH:8][C:7](=[O:17])[c:6]2[c:11]1[cH:12][cH:13][cH:14][c:5]2[N+:2](=[O:3])[O-:4] +03931268 [CH3:11][OH:12].[CH3:1][c:2]1[cH:3][cH:4][c:5]([C:6](=[O:7])Cl)[cH:9][cH:10]1>c1ccccc1>[CH3:11][O:12][C:6](=[O:7])[c:5]1[cH:4][cH:3][c:2]([CH3:1])[cH:10][cH:9]1 +03931269 [Na+].[SH-:18].Cl.[CH3:17][O:16][c:11]1[cH:10][cH:9][c:8]2[cH:7][c:6]([CH:2](Cl)[C:3](=[O:4])[OH:5])[cH:15][cH:14][c:13]2[cH:12]1>>[CH3:17][O:16][c:11]1[cH:10][cH:9][c:8]2[cH:7][c:6]([CH:2]([SH:18])[C:3](=[O:4])[OH:5])[cH:15][cH:14][c:13]2[cH:12]1 +03931269 [Na+].[CH3:21][O:20][c:15]1[cH:14][cH:13][c:12]2[cH:11][c:10]([CH:6](Cl)[C:7](=[O:8])[OH:9])[cH:19][cH:18][c:17]2[cH:16]1.[N:4]#[C:3][S-:2]>CCO>[CH3:21][O:20][c:15]1[cH:14][cH:13][c:12]2[cH:11][c:10]([CH:6]([S:2][C:3]#[N:4])[C:7](=[O:8])[OH:9])[cH:19][cH:18][c:17]2[cH:16]1 +03931269 [OH-].[K+].CC[O:16][C:14](=[O:15])[CH:13]([OH:19])[c:8]1[cH:7][cH:6][c:5]2[cH:4][c:3]([O:2][CH3:1])[cH:12][cH:11][c:10]2[cH:9]1>CC(C)O>[CH3:1][O:2][c:3]1[cH:12][cH:11][c:10]2[cH:9][c:8]([CH:13]([OH:19])[C:14](=[O:15])[OH:16])[cH:7][cH:6][c:5]2[cH:4]1 +03931269 Cl.CC[O:5][C:3](=[O:4])[CH:2]([Cl:1])[c:8]1[cH:17][cH:16][c:15]2[cH:14][c:13]([O:18][CH3:19])[cH:12][cH:11][c:10]2[cH:9]1>CC(=O)O>[CH3:19][O:18][c:13]1[cH:12][cH:11][c:10]2[cH:9][c:8]([CH:2]([Cl:1])[C:3](=[O:4])[OH:5])[cH:17][cH:16][c:15]2[cH:14]1 +03931270 [CH3:17][CH2:16][CH2:15][SH:18].[CH3:6][C:5](=[O:7])/[CH:4]=[CH:3]\[C:2]([CH3:1])=[O:8].C1CCNCC1>>[CH3:17][CH2:16][CH2:15][S:18][CH:4]([CH2:3][C:2]([CH3:1])=[O:8])[C:5]([CH3:6])=[O:7] +03931277 [CH3:9][CH2:8][NH:10][S:11]([CH3:14])(=[O:12])=[O:13].[O:7]=[C:6]=[N:5][S:2](=[O:3])(=[O:4])Cl>Clc1ccccc1>[CH3:9][CH2:8][N:10]([S:11]([CH3:14])(=[O:12])=[O:13])[S:2](=[O:3])(=[O:4])[N:5]=[C:6]=[O:7] +03931281 [CH3:2][C:1](=[O:3])[NH:4][c:5]1[cH:6][cH:7][c:8]([C:9](=O)[OH:11])[cH:12][cH:13]1.CC(C)COC(=O)Cl.[NH2:27][c:28]1[cH:29][cH:30][c:31]([OH:34])[cH:32][cH:33]1.C1CCOC1>O.CCN(CC)CC.c1ccncc1>[CH3:2][C:1](=[O:3])[NH:4][c:5]1[cH:13][cH:12][c:8]([C:9](=[O:11])[NH:27][c:28]2[cH:29][cH:30][c:31]([OH:34])[cH:32][cH:33]2)[cH:7][cH:6]1 +03931286 [Cl-].CCN(CC)CC.[CH3:24][C:23]([CH3:22])=[CH:25][CH2:26][CH2:27]/[C:28]([CH3:29])=[CH:30]/[CH2:31]O.[CH3:2][c:3]1[c:4]([CH2:18][C:19](=[O:20])[OH:21])[cH:5][cH:6][cH:7][c:8]1[C:9](=[O:17])[c:10]1[cH:11][cH:12][c:13]([Cl:16])[cH:14][cH:15]1>c1ccccc1>[CH3:22][C:23]([CH3:24])=[CH:25][CH2:26][CH2:27]/[C:28]([CH3:29])=[CH:30]/[CH2:31][O:21][C:19](=[O:20])[CH2:18][c:4]1[cH:5][cH:6][cH:7][c:8]([C:9](=[O:17])[c:10]2[cH:11][cH:12][c:13]([Cl:16])[cH:14][cH:15]2)[c:3]1[CH3:2] +03931295 [OH-:18].[Na+].N#Cc1ccccc1.[O:3]=[C:2]([OH:1])[c:4]1[cH:5][cH:6][cH:7][cH:8][cH:9]1.OO>O>[O:1]=[C:2]([OH:3])[c:4]1[cH:5][cH:6][c:7]([OH:18])[cH:8][cH:9]1.[O:1]=[C:2]([OH:3])[c:4]1[cH:5][cH:6][cH:7][c:8]([OH:18])[cH:9]1.[O:1]=[C:2]([OH:3])[c:4]1[cH:5][cH:6][cH:7][cH:8][c:9]1[OH:18] +03931298 [NH3:13].[NH4+].[OH-].[H][H].[CH3:1][c:2]1[cH:7][cH:6][cH:5][c:4]([C:8]([CH3:9])([CH3:10])[CH3:11])[c:3]1O>[Pd]>[CH3:1][c:2]1[cH:7][cH:6][cH:5][c:4]([C:8]([CH3:9])([CH3:10])[CH3:11])[c:3]1[NH2:13] +03931301 [Na+].[CH2:6]=O.[CH3:8][NH:9][CH2:10][C:11](=[O:12])[NH:13][c:14]1[cH:27][cH:26][c:25]([Cl:28])[cH:24][c:15]1[C:16](=[O:17])[c:18]1[cH:19][cH:20][cH:21][cH:22][cH:23]1.[N:31]#[C:30][K].O=S([O-])O>O>[ClH:28].[CH3:6][N:9]([CH2:8][C:30]#[N:31])[CH2:10][C:11](=[O:12])[NH:13][c:14]1[cH:27][cH:26][c:25]([Cl:28])[cH:24][c:15]1[C:16](=[O:17])[c:18]1[cH:19][cH:20][cH:21][cH:22][cH:23]1 +03931302 [CH3:23][OH:24].[CH3:20][c:9]1[c:10]([CH2:14][CH2:15][CH2:16][C:17](=[O:18])[OH:19])[cH:11][cH:12][cH:13][c:8]1[C:6](=[O:7])[c:5]1[cH:4][cH:3][c:2](Cl)[cH:22][cH:21]1>>[CH3:23][O:24][c:2]1[cH:3][cH:4][c:5]([C:6](=[O:7])[c:8]2[cH:13][cH:12][cH:11][c:10]([CH2:14][CH2:15][CH2:16][C:17](=[O:18])[OH:19])[c:9]2[CH3:20])[cH:21][cH:22]1 +03931302 [OH-].[K+].CCO.C[O:20][C:18](=[O:19])[C:17]([CH3:22])=[CH:16][CH2:15][c:11]1[cH:12][cH:13][cH:14][c:9]([C:1](=[O:8])[c:2]2[cH:3][cH:4][cH:5][cH:6][cH:7]2)[cH:10]1>O>[CH3:22][C:17](=[CH:16][CH2:15][c:11]1[cH:12][cH:13][cH:14][c:9]([C:1](=[O:8])[c:2]2[cH:7][cH:6][cH:5][cH:4][cH:3]2)[cH:10]1)[C:18](=[O:19])[OH:20] +03931302 O=[CH:15][CH2:14][c:10]1[cH:11][cH:12][cH:13][c:8]([C:6](=[O:7])[c:5]2[cH:4][cH:3][c:2]([Cl:1])[cH:19][cH:18]2)[c:9]1[OH:17].[O:22]=[C:21]([OH:20])[CH2:23]C(=O)O>>[O:20]=[C:21]([OH:22])[CH:23]=[CH:15][CH2:14][c:10]1[cH:11][cH:12][cH:13][c:8]([C:6](=[O:7])[c:5]2[cH:4][cH:3][c:2]([Cl:1])[cH:19][cH:18]2)[c:9]1[OH:17] +03931302 O.[N:7]#[C:6][CH2:8][CH:9]([OH:25])[CH2:10][c:11]1[cH:24][cH:23][cH:22][c:13]([CH:14]([OH:21])[c:15]2[cH:16][cH:17][cH:18][cH:19][cH:20]2)[cH:12]1.O=[Cr](=O)(O)O>CC(C)=O>[N:7]#[C:6][CH2:8][CH:9]([OH:25])[CH2:10][c:11]1[cH:24][cH:23][cH:22][c:13]([C:14](=[O:21])[c:15]2[cH:20][cH:19][cH:18][cH:17][cH:16]2)[cH:12]1 +03931302 [OH-].[K+].CCO.CC[O:20][C:18](=[O:19])[CH2:17][CH:16]([OH:23])[CH:15]([CH3:24])[c:11]1[cH:12][cH:13][cH:14][c:9]([C:1](=[O:8])[c:2]2[cH:3][cH:4][cH:5][cH:6][cH:7]2)[cH:10]1>O>[CH3:24][CH:15]([c:11]1[cH:12][cH:13][cH:14][c:9]([C:1](=[O:8])[c:2]2[cH:3][cH:4][cH:5][cH:6][cH:7]2)[cH:10]1)[CH:16]([OH:23])[CH2:17][C:18](=[O:19])[OH:20] +03931302 O.[Al+3].[Cl-].[Cl-].[Cl-].Cl.[CH3:5][c:6]1[c:7]([C:8](=[O:9])Cl)[cH:11][cH:12][cH:13][c:14]1[N+:15](=[O:16])[O-:17].[F:20][c:21]1[cH:22][cH:23][cH:24][cH:25][cH:26]1>>[CH3:5][c:6]1[c:7]([C:8](=[O:9])[c:24]2[cH:23][cH:22][c:21]([F:20])[cH:26][cH:25]2)[cH:11][cH:12][cH:13][c:14]1[N+:15](=[O:16])[O-:17] +03931302 [CH3:27][O:28][c:29]1[c:43]([CH3:44])[cH:42][cH:41][cH:40][c:30]1[C:31](=[O:32])[c:33]1[cH:34][cH:35][c:36]([Cl:39])[cH:37][cH:38]1.O=C(OOC(=O)c1ccccc1)c1ccccc1.O=C1CCC(=O)N1[Br:1]>ClC(Cl)(Cl)Cl>[CH3:27][O:28][c:29]1[c:43]([CH2:44][Br:1])[cH:42][cH:41][cH:40][c:30]1[C:31](=[O:32])[c:33]1[cH:34][cH:35][c:36]([Cl:39])[cH:37][cH:38]1 +03931302 O=[C:17]([OH:19])[CH2:16][CH2:15][c:11]1[cH:12][cH:13][cH:14][c:9]([C:1](=[O:8])[c:2]2[cH:3][cH:4][cH:5][cH:6][cH:7]2)[cH:10]1.O=S([Cl:22])Cl>>[O:19]=[C:17]([Cl:22])[CH2:16][CH2:15][c:11]1[cH:12][cH:13][cH:14][c:9]([C:1](=[O:8])[c:2]2[cH:3][cH:4][cH:5][cH:6][cH:7]2)[cH:10]1 +03931302 [ClH:14].[CH3:1][c:2]1[c:3]([C:4](=[O:5])Cl)[cH:7][cH:8][cH:9][c:10]1[N+:11](=[O:12])[O-:13]>[Cl-].[Cl-].[Cd+2].c1ccccc1>[CH3:1][c:2]1[c:3]([C:4](=[O:5])[c:2]2[cH:3][cH:7][c:8]([Cl:14])[cH:9][cH:10]2)[cH:7][cH:8][cH:9][c:10]1[N+:11](=[O:12])[O-:13] +03931314 [Na+].[CH2:6]=O.[CH3:8][NH:9][CH2:10][C:11](=[O:12])[NH:13][c:14]1[cH:27][cH:26][c:25]([Cl:28])[cH:24][c:15]1[C:16](=[O:17])[c:18]1[cH:19][cH:20][cH:21][cH:22][cH:23]1.[N:31]#[C:30][K].O=S([O-])O>O>[ClH:28].[CH3:6][N:9]([CH2:8][C:30]#[N:31])[CH2:10][C:11](=[O:12])[NH:13][c:14]1[cH:27][cH:26][c:25]([Cl:28])[cH:24][c:15]1[C:16](=[O:17])[c:18]1[cH:19][cH:20][cH:21][cH:22][cH:23]1 +03931318 [CH3:23][S:22][c:19]1[cH:18][cH:17][c:16]([C:15](=O)[NH:14][NH:13][c:7]2[cH:8][cH:9][cH:10][cH:11][cH:12]2)[cH:21][cH:20]1.Oc1ccccc1.ClP(Cl)(Cl)(Cl)[Cl:1]>ClC(Cl)(Cl)Cl>[CH3:23][S:22][c:19]1[cH:18][cH:17][c:16]([C:15]([Cl:1])=[N:14][NH:13][c:7]2[cH:8][cH:9][cH:10][cH:11][cH:12]2)[cH:21][cH:20]1 +03931318 [ClH:25].[CH3:23][S:22][c:17]1[cH:18][cH:19][cH:20][cH:21][c:16]1[C:15](=O)[NH:14][NH:13][c:7]1[cH:8][cH:9][cH:10][cH:11][cH:12]1.Oc1ccccc1.ClP(Cl)(Cl)(Cl)[Cl:1]>ClC(Cl)(Cl)Cl>[CH3:23][S:22][c:17]1[c:18]([Cl:25])[cH:19][cH:20][cH:21][c:16]1[C:15]([Cl:1])=[N:14][NH:13][c:7]1[cH:8][cH:9][cH:10][cH:11][cH:12]1 +03931322 [Na+].C[O-].CO.[CH3:15][CH2:14][CH2:13][C:12](=[O:16])[CH2:11][CH2:10][C:9](=[O:17])OCC>Cc1ccccc1C>[CH3:15][CH2:14][CH:13]1[C:12](=[O:16])[CH2:11][CH2:10][C:9]1=[O:17] +03931323 N.[NH4+].[Na].[Cl-].[CH3:2][c:3]1[cH:7][c:6]([C:8]2=[C:9]([CH3:16])[CH2:10][CH2:11][CH2:12][C:13]2([CH3:14])[CH3:15])[o:5]n1>CC(C)(C)O.C1CCOC1>[CH3:2][CH:3]=[CH:7][C:6](=[O:5])[C:8]1=[C:9]([CH3:16])[CH2:10][CH2:11][CH2:12][C:13]1([CH3:15])[CH3:14] +03931326 [NH4+].[Mg].[Cl-].[CH3:5][CH:4]=[CH:3]Br.[CH3:8][C:7]([CH3:6])=[CH:9][CH2:10][CH2:11][C:12]([CH3:13])=[CH:14][CH:15]=[O:16]>C1CCOC1>[CH3:5][CH:4]=[CH:3][CH:15]([OH:16])[CH:14]=[C:12]([CH3:13])[CH2:11][CH2:10][CH:9]=[C:7]([CH3:8])[CH3:6] +03931326 [CH3:14]/[CH:13]=[C:12](\[CH3:15])[C:11](=[O:16])[C:3]1=[C:2]([CH3:1])[CH2:7][CH:6](C)[CH2:5][C:4]1([CH3:9])[CH3:10].[CH2:18]1COCCO1>>[CH3:15][C:12]1=[C:13]([CH3:14])[C:2]2([CH3:1])[CH2:7][CH2:6][CH:5]([CH3:18])[C:4]([CH3:9])([CH3:10])[CH:3]2[C:11]1=[O:16] +03931326 C=CCC(O)C1=C(C)CCCC1(C)C.[CH2:27]=[C:26]([CH3:28])[CH2:25][CH:24]([OH:29])[C:17]1=[C:16]([CH3:15])[CH2:21][CH2:20][CH2:19][C:18]1([CH3:22])[CH3:23]>>[CH2:27]=[C:26]([CH3:28])[CH2:25][C:24](=[O:29])[C:17]1=[C:16]([CH3:15])[CH2:21][CH2:20][CH2:19][C:18]1([CH3:23])[CH3:22] +03931326 [CH3:13]/[CH:12]=[CH:11]\[C:10](=[O:14])[C:3]1=[C:2]([CH3:1])[CH2:7][CH2:6][CH2:5][C:4]1([CH3:8])[CH3:9].Cc1ccc(S(=O)(=O)O)cc1>c1ccccc1>[CH3:13]/[CH:12]=[CH:11]/[C:10](=[O:14])[C:3]1=[C:2]([CH3:1])[CH2:7][CH2:6][CH2:5][C:4]1([CH3:9])[CH3:8] +03931328 [OH-:24].[Na+].[CH3:6][CH2:7]O.CCO[CH:12]1[c:20]2[cH:19][cH:18][cH:17][cH:16][c:15]2[C:14](=[C:21]=[O:22])[C:13]1=[O:23].Br[CH2:4][CH2:3][CH2:2][Br:1]>O>[CH3:7][CH2:6][O:22][C:21](=[O:24])[C:14]1([CH2:4][CH2:3][CH2:2][Br:1])[C:13](=[O:23])[CH2:12][c:20]2[cH:19][cH:18][cH:17][cH:16][c:15]21 +03931348 [Li][CH2:9][CH2:10][CH2:11][CH3:12].C=CCC.[CH3:6][c:5]1[cH:4][cH:3][c:2]([CH3:1])[cH:8][cH:7]1.CN(C)CCN(C)C>>[CH3:12][CH2:11][CH:10]([CH3:9])[CH2:1][c:2]1[cH:3][cH:4][c:5]([CH3:6])[cH:7][cH:8]1 +03931406 [BH4-].[Na+].COS(=O)(=O)[O-].CC(C)O.[CH3:31][n:15]1[c:16](-[c:25]2[cH:26][cH:27][cH:28][cH:29][cH:30]2)[cH:17][c:18](-[c:19]2[cH:20][cH:21][cH:22][cH:23][cH:24]2)[n+:14]1[CH3:13]>O>[CH3:13][N:14]1[CH:18]([c:19]2[cH:20][cH:21][cH:22][cH:23][cH:24]2)[CH2:17][CH:16]([c:25]2[cH:26][cH:27][cH:28][cH:29][cH:30]2)[N:15]1[CH3:31] +03931411 [OH-].[Na+].CC[O:18][C:16](=[O:17])[CH2:15][CH2:14][CH2:13][CH2:12][CH2:11][CH2:10][C:5]1=[C:4]([O:3][CH2:1][CH3:2])[CH2:8][CH2:7][C:6]1=[O:9]>CCO>[CH3:2][CH2:1][O:3][C:4]1=[C:5]([CH2:10][CH2:11][CH2:12][CH2:13][CH2:14][CH2:15][C:16](=[O:17])[OH:18])[C:6](=[O:9])[CH2:7][CH2:8]1 +03931412 [Na+].[CH3:2][CH:1]=[O:3].[CH3:6][CH2:5][C:4](=[O:7])[O:8][C:9](=[O:12])[CH2:10]C.O=[C:13]([O-])O>>[CH3:13][CH2:2][C:1](=[O:3])[O:12][CH:9]([CH3:10])[O:8][C:4](=[O:7])[CH2:5][CH3:6] +03932375 [ClH:12].[CH3:10][C:9](=O)[CH2:8][C:6]([CH3:5])=O.[NH2:3][C:2]([NH2:1])=[S:4]>CCO>[ClH:12].[CH3:5][c:6]1[cH:8][c:9]([CH3:10])[n:3][c:2]([SH:4])[n:1]1 +03932384 [CH3:41][O:40][c:37]1[cH:38][cH:39][c:29]2[c:30]([c:36]1[O:42][CH3:43])[CH2:31][N:32]([CH3:35])[CH2:33][CH2:34][c:25]1[cH:24][c:23]([O:22][CH2:15][c:16]3[cH:17][cH:18][cH:19][cH:20][cH:21]3)[cH:45][cH:44][c:26]1[CH2:27][CH2:28]2.O=[Cr](=O)=[O:11].O=[Cr](=O)=O.c1ccncc1>CCOC(C)=O.c1ccncc1>[CH3:41][O:40][c:37]1[cH:38][cH:39][c:29]2[c:30]([c:36]1[O:42][CH3:43])[CH2:31][N:32]([CH:35]=[O:11])[CH2:33][CH2:34][c:25]1[cH:24][c:23]([O:22][CH2:15][c:16]3[cH:17][cH:18][cH:19][cH:20][cH:21]3)[cH:45][cH:44][c:26]1[CH2:27][CH2:28]2 +03932385 [K+].[K+].O=C([O-])[O-].[O:12]=[C:3]1[c:4]2[cH:11][cH:10][cH:9][cH:8][c:5]2[C:6](=[O:7])[N:2]1[OH:1].OCc1ccco1.Cl[CH2:20][c:21]1[cH:25][cH:24][cH:23][o:22]1>O.CS(C)=O>[O:7]=[C:6]1[c:5]2[cH:8][cH:9][cH:10][cH:11][c:4]2[C:3](=[O:12])[N:2]1[O:1][CH2:20][c:21]1[cH:25][cH:24][cH:23][o:22]1 +03932389 [CH3].[Li][CH2:12][CH2:13][CH2:14][CH3:15].[CH3:4][O:3][P:2]([CH3:1])(=[O:7])[O:5][CH3:6].O=P([O-])[O-].[CH2:20]1[CH2:21][CH2:22][O:18][CH2:19]1>CCCCCC.CC(=O)O>[CH3:4][O:3][P:2](=[O:7])([CH2:1][C:22](=[O:18])[CH2:21][c:20]1[cH:19][cH:12][cH:13][cH:14][cH:15]1)[O:5][CH3:6] +03932391 CCN(CC)CC.[CH3:1][S:2][CH2:3][CH2:4][C@H:5]([NH2:6])[C:7](=[O:9])[OH:8].[CH3:19][Si:18]([CH3:20])([CH3:17])Cl>CCCCCC>[CH3:1][S:2][CH2:3][CH2:4][C@H:5]([NH:6][Si:18]([CH3:17])([CH3:19])[CH3:20])[C:7](=[O:8])[O:9][Si:18]([CH3:19])([CH3:20])[CH3:17] +03932397 [OH-].[K:12].[K+].C[O:2][C:3](=[O:9])[CH2:4][S:5][CH2:6][C:7]#[N:8].O=S(=O)(O)O>O.CCO>[K:12].[N:8]#[C:7][CH2:6][S:5][CH2:4][C:3](=[O:2])[OH:9] +03932402 [N:1]#[C:2][c:3]1[cH:4][cH:5][cH:6][cH:7][cH:8]1.O=S(=O)(O)C(F)(F)F>CCO>[cH:6]1[cH:5][cH:4][c:3](-[c:2]2[n:1][c:2](-[c:3]3[cH:4][cH:5][cH:6][cH:7][cH:8]3)[n:1][c:2](-[c:3]3[cH:4][cH:5][cH:6][cH:7][cH:8]3)[n:1]2)[cH:8][cH:7]1 +03932404 CCOC(=O)C(C#N)=NC=C(c1ccccc1)N1CCOCC1.[CH3:46][O:45][C:43](=[O:44])[C:26]([C:24]#[N:25])=[N:27][C:28]([CH3:42])=[C:29]([c:30]1[cH:31][cH:32][cH:33][cH:34][cH:35]1)[N:36]1CCOCC1>>[CH3:46][O:45][C:43](=[O:44])[C:26]([C:24]#[N:25])=[N:27][C:28]([CH3:42])=[C:29]([NH2:36])[c:30]1[cH:35][cH:34][cH:33][cH:32][cH:31]1 +03932404 N.[Br].[CH3:20][C:6]([N:5]=[C:4]([C:2]#[N:3])[C:21]#[N:22])=[C:7]([c:8]1[cH:9][cH:10][cH:11][cH:12][cH:13]1)[N:14]1CCOCC1>ClCCl>[CH3:20][c:6]1[n:5][c:4]([C:2]#[N:3])[c:21]([NH2:22])[n:14][c:7]1-[c:8]1[cH:13][cH:12][cH:11][cH:10][cH:9]1 +03932407 [CH3:11][c:3]1[c:2]([Br:1])[cH:7][cH:6][cH:5][c:4]1[N+:8](=[O:9])[O-:10].O=C(OOC(=O)c1ccccc1)c1ccccc1.O=C1CCC(=O)N1[Br:12]>ClC(Cl)(Cl)Cl>[O:9]=[N+:8]([O-:10])[c:4]1[cH:5][cH:6][cH:7][c:2]([Br:1])[c:3]1[CH2:11][Br:12] +03932410 [CH3:5][c:6]1[n:7][n:8][c:9]([NH2:11])[s:10]1.[O:4]=[C:2](Cl)Cl>CCOC(C)=O>[CH3:5][c:6]1[n:7][n:8][c:9]([N:11]=[C:2]=[O:4])[s:10]1 +03932410 [CH3:5][S:6](=[O:7])(=[O:8])[c:9]1[n:10][n:11][c:12]([NH2:14])[s:13]1.[O:4]=[C:2](Cl)Cl>CCOC(C)=O>[CH3:5][S:6](=[O:7])(=[O:8])[c:9]1[n:10][n:11][c:12]([N:14]=[C:2]=[O:4])[s:13]1 +03932410 [CH:14]#[C:13][CH2:12][NH:15][CH2:16][CH2:17][CH:18]=[O:19].[CH3:1][S:2](=[O:3])[c:4]1[n:5][n:6][c:7]([N:9]=[C:10]=[O:11])[s:8]1>c1ccccc1>[CH:14]#[C:13][CH2:12][N:15]([CH2:16][CH2:17][CH:18]=[O:19])[C:10](=[O:11])[NH:9][c:7]1[n:6][n:5][c:4]([S:2]([CH3:1])=[O:3])[s:8]1 +03932410 [CH3:13][NH:14][CH2:15][CH2:16][CH:17]=[O:18].[O:10]=[C:9]=[N:8][c:6]1[n:5][n:4][c:3]([C:2]([F:11])([F:12])[F:1])[s:7]1>c1ccccc1>[CH3:13][N:14]([CH2:15][CH2:16][CH:17]=[O:18])[C:9](=[O:10])[NH:8][c:6]1[n:5][n:4][c:3]([C:2]([F:12])([F:11])[F:1])[s:7]1 +03932410 [CH3:13][NH:14][CH2:15][CH2:16][CH:17]=[O:18].[CH3:2][C:1]([CH3:3])([CH3:4])[c:5]1[n:6][n:7][c:8]([N:10]=[C:11]=[O:12])[s:9]1>c1ccccc1>[CH3:13][N:14]([CH2:15][CH2:16][CH:17]=[O:18])[C:11](=[O:12])[NH:10][c:8]1[n:7][n:6][c:5]([C:1]([CH3:3])([CH3:2])[CH3:4])[s:9]1 +03932410 [OH-].[Na+].[CH2:4]=[CH:3][CH2:2][CH2:1][NH2:5].[O:10]=[CH:9][CH2:8][CH2:7]Br>CO>[CH2:4]=[CH:3][CH2:2][CH2:1][NH:5][CH2:7][CH2:8][CH:9]=[O:10] +03932410 [OH-].[Na+].[CH:4]#[C:3][C:2]([CH3:5])([CH3:1])[NH2:6].[O:11]=[CH:10][CH2:9][CH2:8]Br>CO>[CH:4]#[C:3][C:2]([CH3:5])([CH3:1])[NH:6][CH2:8][CH2:9][CH:10]=[O:11] +03932410 [CH2:7]=[CH:6][CH2:5][c:8]1[n:9][n:10][c:11]([NH2:13])[s:12]1.[O:4]=[C:2](Cl)Cl>CCOC(C)=O>[CH2:7]=[CH:6][CH2:5][c:8]1[n:9][n:10][c:11]([N:13]=[C:2]=[O:4])[s:12]1 +03932410 [CH2:3]=[CH:2][CH2:1][c:4]1[n:5][n:6][c:7]([N:9]2[C:10](=[O:18])[N:11]([CH2:16][Cl:17])[CH2:12][CH2:13][CH:14]2[OH:15])[s:8]1.C[c:19]1ccccc1S(=O)(=O)O>CO>[CH2:3]=[CH:2][CH2:1][c:4]1[n:5][n:6][c:7]([N:9]2[C:10](=[O:18])[N:11]([CH2:16][Cl:17])[CH2:12][CH2:13][CH:14]2[O:15][CH3:19])[s:8]1 +03932410 Cl.[CH3:2][CH2:1][N:3]([CH2:14][CH2:15][CH:16]=[O:17])[C:4](=[O:5])[NH:6][c:7]1[n:11][n:10][c:9]([O:12][CH3:13])[s:8]1>O>[CH3:2][CH2:1][N:3]1[CH2:14][CH2:15][CH:16]([OH:17])[N:6]([c:7]2[n:11][n:10][c:9]([O:12][CH3:13])[s:8]2)[C:4]1=[O:5] +03932411 O.[CH3:31][CH2:30][O:29][c:24]1[cH:25][cH:26][cH:27][cH:28][c:23]1[N:20]1[CH2:19][CH2:18][N:17]([CH2:16][CH2:15][CH2:14]Cl)[CH2:22][CH2:21]1.[O:12]=[C:7]1[CH2:6][CH2:5][CH2:4][c:3]2[c:2]([OH:1])[cH:11][cH:10][cH:9][c:8]21>>[CH3:31][CH2:30][O:29][c:24]1[cH:25][cH:26][cH:27][cH:28][c:23]1[N:20]1[CH2:19][CH2:18][N:17]([CH2:16][CH2:15][CH2:14][O:1][c:2]2[cH:11][cH:10][cH:9][c:8]3[c:3]2[CH2:4][CH2:5][CH2:6][C:7]3=[O:12])[CH2:22][CH2:21]1 +03932411 [OH-].[K+].[CH3:31][c:28]1[cH:27][cH:26][c:25]([N:22]2[CH2:21][CH2:20][N:19]([CH2:18][CH2:17][CH2:16][Cl:15])[CH2:24][CH2:23]2)[cH:30][cH:29]1.[O:12]=[C:7]1[CH2:6][CH2:5][CH2:4][c:3]2[c:2]([OH:1])[cH:11][cH:10][cH:9][c:8]21>CC(C)O>[ClH:15].[CH3:31][c:28]1[cH:29][cH:30][c:25]([N:22]2[CH2:23][CH2:24][N:19]([CH2:18][CH2:17][CH2:16][O:1][c:2]3[cH:11][cH:10][cH:9][c:8]4[c:3]3[CH2:4][CH2:5][CH2:6][C:7]4=[O:12])[CH2:20][CH2:21]2)[cH:26][cH:27]1 +03932411 Cl.[CH3:30][O:29][c:26]1[cH:25][cH:24][c:23]([N:20]2[CH2:19][CH2:18][N:17]([CH2:16][CH2:15][CH2:14]Cl)[CH2:22][CH2:21]2)[cH:28][cH:27]1.[O:12]=[C:7]1[CH2:6][CH2:5][CH2:4][c:3]2[c:2]([OH:1])[cH:11][cH:10][cH:9][c:8]21>>[CH3:30][O:29][c:26]1[cH:27][cH:28][c:23]([N:20]2[CH2:21][CH2:22][N:17]([CH2:16][CH2:15][CH2:14][O:1][c:2]3[cH:11][cH:10][cH:9][c:8]4[c:3]3[CH2:4][CH2:5][CH2:6][C:7]4=[O:12])[CH2:18][CH2:19]2)[cH:24][cH:25]1 +03932412 [Na+].[Na+].[NH2:21][CH2:20][CH2:19][CH2:18][CH2:17][CH2:16][OH:15].O=C([O-])[O-].Cl[c:2]1[n:3][cH:4][cH:5][c:6]2[cH:7][c:8]3[c:9]([cH:10][c:11]21)[O:12][CH2:13][O:14]3>CO>[OH:15][CH2:16][CH2:17][CH2:18][CH2:19][CH2:20][NH:21][c:2]1[n:3][cH:4][cH:5][c:6]2[cH:7][c:8]3[c:9]([cH:10][c:11]21)[O:12][CH2:13][O:14]3 +03932425 [H-].[H-].[H-].[H-].[Li+].[Al+3].N#[C:1][C:3]1([c:10]2[cH:11][cH:12][cH:13][cH:14][cH:15]2)[CH2:4][CH2:5][CH:6]([OH:9])[CH2:7][CH2:8]1.C1CC[O:22]C1>>[O:22]=[CH:1][C:3]1([c:10]2[cH:11][cH:12][cH:13][cH:14][cH:15]2)[CH2:4][CH2:5][CH:6]([OH:9])[CH2:7][CH2:8]1 +03932425 [CH3:22][C:21]([CH3:20])=[O:23].C[c:14]1[cH:13][cH:12][c:11]2[c:16]([cH:15]1)[CH2:17][C:7]1([CH2:10]2)[CH2:6]CC2([CH2:9][CH2:8]1)OCCO2>>[OH:23][CH:21]1[CH2:20][CH2:10][C:7]2([CH2:8][CH2:9][c:15]3[cH:14][cH:13][cH:12][cH:11][c:16]3[CH2:17]2)[CH2:6][CH2:22]1 +03932425 CS(=O)(=O)O.[N:27]#C[K].O[CH2:15][C:12]1([CH2:17][c:18]2[cH:19][cH:20][cH:21][cH:22][cH:23]2)[CH2:11][CH2:10][C:9]2([CH2:14][CH2:13]1)[O:8][CH2:7][CH2:6][O:24]2>CN(C)P(=O)(N(C)C)N(C)C>[N:27]#[C:15][C:12]1([CH2:17][c:18]2[cH:19][cH:20][cH:21][cH:22][cH:23]2)[CH2:11][CH2:10][C:9]2([CH2:14][CH2:13]1)[O:8][CH2:7][CH2:6][O:24]2 +03932425 Cl.[K+].[K+].CCO.[NH2:17][CH:14]1[CH2:13][CH2:12][C:11]2([CH2:10][CH2:9][c:8]3[cH:7][cH:6][cH:5][cH:4][c:3]3[CH2:2]2)[CH2:16][CH2:15]1.O=C([O-])[O-].I[CH2:23][CH2:22][CH2:21][CH2:20][CH2:19]I>O>[cH:6]1[cH:5][cH:4][c:3]2[c:8]([cH:7]1)[CH2:9][CH2:10][C:11]1([CH2:16][CH2:15][CH:14]([N:17]3[CH2:19][CH2:20][CH2:21][CH2:22][CH2:23]3)[CH2:13][CH2:12]1)[CH2:2]2 +03932425 [BH4-].[Na+].[O:15]=[C:12]1[CH2:11][CH2:10][C:9]2([CH2:8][c:7]3[cH:6][cH:5][cH:4][cH:3][c:2]3[CH2:1]2)[CH2:14][CH2:13]1>CCO>[OH:15][CH:12]1[CH2:13][CH2:14][C:9]2([CH2:1][c:2]3[cH:3][cH:4][cH:5][cH:6][c:7]3[CH2:8]2)[CH2:10][CH2:11]1 +03932425 [H-].[Na+].O=[CH:23][C:20]1([c:25]2[cH:26][cH:27][cH:28][cH:29][cH:30]2)[CH2:19][CH2:18][CH:17]([OH:16])[CH2:22][CH2:21]1.[CH:13]1=[CH:12][O:11][CH:10]([O:9][CH:4]2[CH:5]=[CH:6][CH:7]=[CH:8][O:3]2)[CH:15]=[CH:14]1>C1CCOC1>[CH3:8][O:3][C:4](=[O:9])[CH:5]=[CH:23][C:20]1([c:25]2[cH:26][cH:27][cH:28][cH:29][cH:30]2)[CH2:19][CH2:18][CH:17]([OH:16])[CH2:22][CH2:21]1.[CH2:13]1[CH2:14][CH2:15][CH:10]([O:9][CH:4]2[CH2:5][CH2:6][CH2:7][CH2:8][O:3]2)[O:11][CH2:12]1 +03932426 [OH:15][CH:16]1[CH2:21][CH2:20][CH2:19][NH:18][CH2:17]1.[cH:8]1[c:4]([CH:2]2[CH2:3][O:1]2)[n:5][o:6][c:7]1-[c:9]1[cH:10][cH:11][cH:12][cH:13][cH:14]1>>[OH:1][CH:2]([CH2:3][N:18]1[CH2:19][CH2:20][CH2:21][CH:16]([OH:15])[CH2:17]1)[c:4]1[cH:8][c:7](-[c:9]2[cH:10][cH:11][cH:12][cH:13][cH:14]2)[o:6][n:5]1 +03932427 [NH2:1][CH2:2][CH2:3][CH2:4][NH:5][c:6]1[cH:11][cH:10][cH:9][cH:8][n:7]1.[O:19]=[C:12]([N:20]=[C:21]=[S:22])[c:13]1[cH:14][cH:15][cH:16][cH:17][cH:18]1>ClC(Cl)Cl>[O:19]=[C:12]([NH:20][C:21](=[S:22])[NH:1][CH2:2][CH2:3][CH2:4][NH:5][c:6]1[cH:11][cH:10][cH:9][cH:8][n:7]1)[c:13]1[cH:14][cH:15][cH:16][cH:17][cH:18]1 +03932428 Cl.[CH3:23][CH2:22][CH2:21][CH2:20][CH2:19][CH2:18][CH2:17][C:16](=[O:24])Cl.[OH:1][n:2]1[c:10]2[cH:9][c:8]([Cl:11])[cH:7][n:6][c:5]2[n:4][c:3]1[C:12]([F:13])([F:14])[F:15]>c1ccncc1>[CH3:23][CH2:22][CH2:21][CH2:20][CH2:19][CH2:18][CH2:17][C:16](=[O:24])[O:1][n:2]1[c:10]2[cH:9][c:8]([Cl:11])[cH:7][n:6][c:5]2[n:4][c:3]1[C:12]([F:13])([F:14])[F:15] +03932429 [CH3:1][O:2][c:3]1[cH:8][cH:7][cH:6][c:5]([C:9]23[CH2:18][CH:13]([CH2:12][CH2:11][CH2:10]2)[N:14]([CH3:17])[CH:15]3[CH3:16])[cH:4]1.[O:25]=[C:23]([OH:24])[C@@H:21]([OH:22])[C@H:20]([OH:19])[C:26](=[O:28])[OH:27]>CCO>[CH3:1][O:2][c:3]1[cH:8][cH:7][cH:6][c:5]([C:9]23[CH2:18][CH:13]([CH2:12][CH2:11][CH2:10]2)[N:14]([CH3:17])[CH:15]3[CH3:16])[cH:4]1.[O:24]=[C:23]([OH:25])[C@@H:21]([OH:22])[C@H:20]([OH:19])[C:26](=[O:27])[OH:28] +03932429 [BrH:23].C[O:8][c:9]1[cH:14][cH:13][cH:12][c:11]([C:15]23[CH2:21][NH:20][CH:19]([CH2:22]2)[CH2:18][CH2:17][CH2:16]3)[cH:10]1.O=C(O)C(=O)O>>[BrH:23].[OH:8][c:9]1[cH:14][cH:13][cH:12][c:11]([C:15]23[CH2:21][NH:20][CH:19]([CH2:22]2)[CH2:18][CH2:17][CH2:16]3)[cH:10]1 +03932429 Br.Br.C[O:3][c:4]1[cH:9][cH:8][cH:7][c:6]([C:10]23[CH2:18][CH:14]([CH2:13][CH2:12][CH2:11]2)[N:15]([CH3:17])[CH2:16]3)[cH:5]1>>[CH3:17][N:15]1[CH2:16][C:10]2([c:6]3[cH:7][cH:8][cH:9][c:4]([OH:3])[cH:5]3)[CH2:18][CH:14]1[CH2:13][CH2:12][CH2:11]2 +03932429 [H-].[H-].[H-].[H-].[Li+].N.[Al+3].Cl.O=[C:5](Cl)[CH:1]1[CH2:2][CH2:3][CH2:4]1.[OH:8][c:9]1[cH:14][cH:13][cH:12][c:11]([C:15]23[CH2:21][NH:20][CH:19]([CH2:22]2)[CH2:18][CH2:17][CH2:16]3)[cH:10]1>O.CCN(CC)CC.CN(C)C=O.C1CCOC1>[OH:8][c:9]1[cH:14][cH:13][cH:12][c:11]([C:15]23[CH2:22][CH:19]([CH2:18][CH2:17][CH2:16]2)[N:20]([CH2:5][CH:1]2[CH2:4][CH2:3][CH2:2]2)[CH2:21]3)[cH:10]1 +03932429 [BrH:1].[CH3:24][CH2:23][CH2:22][CH2:21][CH2:20][C:19](=[O:25])O[C:19](=[O:25])[CH2:20][CH2:21][CH2:22][CH2:23][CH3:24].[CH3:16][CH:15]1[N:14]([CH3:17])[CH:13]2[CH2:18][C:9]1([c:5]1[cH:6][cH:7][cH:8][c:3]([OH:2])[cH:4]1)[CH2:10][CH2:11][CH2:12]2>c1ccncc1>[BrH:1].[CH3:24][CH2:23][CH2:22][CH2:21][CH2:20][C:19](=[O:25])[O:2][c:3]1[cH:8][cH:7][cH:6][c:5]([C:9]23[CH2:18][CH:13]([CH2:12][CH2:11][CH2:10]2)[N:14]([CH3:17])[CH:15]3[CH3:16])[cH:4]1 +03932429 [H-].[Na+].[CH3:20]I.[CH3:3][O:4][c:5]1[cH:10][cH:9][cH:8][c:7]([C:11]23[CH2:19][CH:15]([CH2:14][CH2:13][CH2:12]2)[NH:16][C:17]3=[O:18])[cH:6]1>CS(C)=O>[CH3:3][O:4][c:5]1[cH:10][cH:9][cH:8][c:7]([C:11]23[CH2:19][CH:15]([CH2:14][CH2:13][CH2:12]2)[N:16]([CH3:20])[C:17]3=[O:18])[cH:6]1 +03932429 [Li].O.[CH3:3][CH2:2]I.[CH3:5][O:6][c:7]1[cH:12][cH:11][cH:10][c:9]([C:13]23[CH2:22][CH:17]([CH2:16][CH2:15][CH2:14]2)[N:18]([CH3:21])[C:19]3=O)[cH:8]1>c1ccccc1>[CH3:3][CH:2]=[C:19]1[N:18]([CH3:21])[CH:17]2[CH2:22][C:13]1([c:9]1[cH:10][cH:11][cH:12][c:7]([O:6][CH3:5])[cH:8]1)[CH2:14][CH2:15][CH2:16]2 +03932430 [cH:18]1[cH:19][cH:20][c:12]2[c:13]([cH:17]1)[CH2:14][CH2:15][CH2:16][CH:8]1[C:9]2=[N:10][NH:11][CH:7]1[c:4]1[cH:3][cH:2][n:1][cH:6][cH:5]1>c1ccccc1>[cH:18]1[cH:19][cH:20][c:12]2[c:13]([cH:17]1)[CH2:14][CH2:15][CH2:16][c:8]1[c:9]-2[n:10][nH:11][c:7]1-[c:4]1[cH:5][cH:6][n:1][cH:2][cH:3]1 +03932431 CC(=O)O[C:21]([CH3:20])=[O:22].[OH:19][C:7]([C:14]1=[N:18][CH2:17][CH2:16][NH:15]1)([c:8]1[cH:9][cH:10][cH:11][cH:12][cH:13]1)[c:2]1[cH:3][cH:4][cH:5][cH:6][n:1]1>C1COCCO1>[CH3:20][C:21](=[O:22])[N:18]1[CH2:17][CH2:16][N:15]=[C:14]1[C:7]([OH:19])([c:8]1[cH:9][cH:10][cH:11][cH:12][cH:13]1)[c:2]1[cH:3][cH:4][cH:5][cH:6][n:1]1 +03932432 [NH4+].[Cl-].[Br-].C[Mg+].COc1cc(OC)cc(C(=O)C(C)CCc2ccc(F)cc2)c1.[CH3:38][O:37][c:35]1[cH:36][c:31]([O:30][CH3:29])[cH:32][c:33]([C:39]([CH3:40])(O)[CH:41]([CH3:51])[CH2:42][CH2:43][c:44]2[cH:45][cH:46][c:47]([F:50])[cH:48][cH:49]2)[cH:34]1.O=S(=O)(O)O>[Pd].CC(=O)O>[CH3:38][O:37][c:35]1[cH:36][c:31]([O:30][CH3:29])[cH:32][c:33]([CH:39]([CH3:40])[CH:41]([CH3:51])[CH2:42][CH2:43][c:44]2[cH:49][cH:48][c:47]([F:50])[cH:46][cH:45]2)[cH:34]1 +03932443 Cl.[ClH:1].[CH3:9][c:8]1[nH:7][cH:6][n:5][c:4]1[CH2:3]O.[NH2:11][CH2:12][CH2:13][SH:14]>CC(=O)O>[ClH:1].[ClH:1].[CH3:9][c:8]1[nH:7][cH:6][n:5][c:4]1[CH2:3][S:14][CH2:13][CH2:12][NH2:11] +03932444 [CH3:10][c:11]1[n:15][cH:14][cH:13][nH:12]1.[O:7]=[S:6](=[O:8])(Cl)[c:4]1[cH:5][nH:1][cH:2][n:3]1>C1CCOC1>[CH3:10][c:11]1[n:15][cH:14][cH:13][n:12]1[S:6](=[O:7])(=[O:8])[c:4]1[cH:5][nH:1][cH:2][n:3]1 +03932445 N.[CH3:1][c:2]1[nH:6][c:5](-[c:7]2[cH:8][cH:9][cH:10][cH:11][cH:12]2)[n:4][c:3]1[CH2:13][C:14]#[N:15].O=S(=O)([OH:17])O>>[OH2:17].[CH3:1][c:2]1[nH:6][c:5](-[c:7]2[cH:8][cH:9][cH:10][cH:11][cH:12]2)[n:4][c:3]1[CH2:13][C:14]([NH2:15])=[O:17] +03932446 [OH-].[K+].[K+].[K+].[CH3:2][CH2:1][N:3]([CH2:13][CH3:14])[c:4]1[cH:11][cH:10][c:7]([CH:8]=O)[c:6]([OH:12])[cH:5]1.[NH2:19][C:17](=[O:18])[CH2:16]Cl.O=C([O-])[O-]>CN(C)C=O>[CH3:2][CH2:1][N:3]([CH2:13][CH3:14])[c:4]1[cH:11][cH:10][c:7]2[cH:8][c:16]([C:17]([NH2:19])=[O:18])[o:12][c:6]2[cH:5]1 +03932448 [CH3:1][O:2][C:3](=[O:4])[NH:5][c:6]1[n:7][c:8]2[cH:17][cH:16][cH:15][cH:14][c:9]2[n:10]1[C:11](=[O:12])[OH:13].Cc1ccc(S(=O)(=O)O)cc1.CC(C)(C)[O:22][C:18](=[O:21])[CH2:19][OH:20]>c1ccccc1>[CH3:1][O:2][C:3](=[O:4])[NH:5][c:6]1[n:7][c:8]2[cH:17][cH:16][cH:15][cH:14][c:9]2[n:10]1[C:11](=[O:12])[OH:13].[O:21]=[C:18]([OH:22])[CH2:19][OH:20] +03932452 O.[K+].[K+].O=C([O-])[O-].[O:6]=[C:2]1[NH:3][CH2:4][CH2:5][NH:1]1.Cl[CH2:14][c:15]1[cH:24][cH:23][c:22]2[cH:21][cH:20][cH:19][cH:18][c:17]2[cH:16]1>CS(C)=O>[O:6]=[C:2]1[NH:3][CH2:4][CH2:5][N:1]1[CH2:14][c:15]1[cH:24][cH:23][c:22]2[cH:21][cH:20][cH:19][cH:18][c:17]2[cH:16]1 +03932452 Cl.[K+].[K+].[K+].[I-].O=C([O-])[O-].[O:6]=[C:2]1[NH:3][CH2:4][CH2:5][NH:1]1.[O:25]=[N+:24]([O-:26])[c:21]1[cH:22][cH:23][c:16]([OH:15])[c:17]([CH2:18]Br)[cH:20]1>O.CS(C)=O.c1ccccc1>[O:6]=[C:2]1[NH:3][CH2:4][CH2:5][N:1]1[CH2:18][c:17]1[cH:20][c:21]([N+:24](=[O:25])[O-:26])[cH:22][cH:23][c:16]1[OH:15] +03932453 [CH3:8][c:7]1[c:6]([N+:9](=[O:10])[O-:11])[c:5]([Cl:12])[n:4][n:3]1[CH2:2]O.O=S([Cl:15])Cl>>[CH3:8][c:7]1[c:6]([N+:9](=[O:10])[O-:11])[c:5]([Cl:12])[n:4][n:3]1[CH2:2][Cl:15] +03932456 [CH3:23][CH2:22][N:24]([CH2:29][CH3:30])[CH2:25][CH2:26][CH2:27][Cl:28].[CH3:2][CH2:1][n:3]1[c:4]2[cH:5][cH:6][c:7]([C:19](=[O:20])[OH:21])[cH:8][c:9]2[c:10]2[cH:11][c:12]([C:16](=[O:17])[OH:18])[cH:13][cH:14][c:15]21>[Cl-].CC(C)O.C[N+](C)(C)Cc1ccccc1>[ClH:28].[ClH:28].[CH3:2][CH2:1][N:3]([CH2:15][CH3:10])[CH2:4][CH2:5][CH2:6][O:21][C:19](=[O:20])[c:7]1[cH:6][cH:5][c:4]2[c:9]([cH:8]1)[c:10]1[cH:11][c:12]([C:16](=[O:17])[O:18][CH2:27][CH2:26][CH2:25][N:24]([CH2:22][CH3:23])[CH2:29][CH3:30])[cH:13][cH:14][c:15]1[n:3]2[CH2:1][CH3:2] +03932461 [Na+].[ClH:6].[CH3:30][C:29](=O)[CH2:28][CH2:27][c:22]1[cH:23][cH:24][c:25]2[c:20]([cH:21]1)[O:19][CH2:18][O:26]2.[NH2:7][CH2:8][CH2:9][c:10]1[cH:17][cH:16][c:14]([OH:15])[c:12]([OH:13])[cH:11]1.O=C([O-])O>CCO.O=[Pt]>[ClH:6].[CH3:30][CH:29]([CH2:28][CH2:27][c:22]1[cH:23][cH:24][c:25]2[c:20]([cH:21]1)[O:19][CH2:18][O:26]2)[NH:7][CH2:8][CH2:9][c:10]1[cH:17][cH:16][c:14]([OH:15])[c:12]([OH:13])[cH:11]1 +03932462 [CH2:14]=[C:2]([CH3:1])[CH2:3][C:4]([CH3:5])(OCCC)[O:10]CCC.[CH3:17][C:16]([CH3:15])=[CH:18][CH2:19]O.C1CCCCC1>O=CO>[CH3:1][C:2](=[O:14])[CH:3]=[C:4]([CH3:5])[CH2:10][CH2:19][CH:18]=[C:16]([CH3:15])[CH3:17] +03932463 [NH4+].[OH].[Mg].[Cl-].[CH3:2]I.[CH3:31][CH2:30][CH2:29][CH2:28][CH2:27][C:26](=[O:32])[CH2:25][CH2:24][C@H:19]1[CH2:20][CH:21]2[O:22][CH2:23][CH2:4][O:5][CH:6]2[C@@H:7]1[CH2:8][CH2:9][CH2:10][CH2:11][CH2:12][CH2:13][C:14](=[O:15])[O:16][CH2:17][CH3:18]>O>[CH3:31][CH2:30][CH2:29][CH2:28][CH2:27][C:26]([CH3:2])([OH:32])[CH2:25][CH2:24][C@H:19]1[CH2:20][CH:21]2[O:22][CH2:23][CH2:4][O:5][CH:6]2[C@@H:7]1[CH2:8][CH2:9][CH2:10][CH2:11][CH2:12][CH2:13][C:14](=[O:15])[O:16][CH2:17][CH3:18] +03932463 [CH3:28][CH2:27][CH2:26][CH2:25][CH2:24][C@@H:5]([CH2:6][CH2:7][C@H:8]1[CH2:9][CH2:10][C:11](=[O:23])[C@@H:12]1[CH2:13][CH2:14][CH2:15][CH2:16][CH2:17][CH2:18][C:19](=[O:20])[O:21][CH3:22])[O:4][C:1]([CH3:2])=[O:3].[CH3:39][c:29]1[cH:34][cH:33][cH:32][cH:31][c:30]1S(=O)(=O)O.[OH:47][CH2:40][c:41]1[cH:42][cH:43][cH:44][cH:45][cH:46]1>>[CH3:28][CH2:27][CH2:26][CH2:25][CH2:24][C@@H:5]([CH2:6][CH2:7][C@H:8]1[CH2:9][CH2:10][C:11]([O:23][CH2:39][c:29]2[cH:34][cH:33][cH:32][cH:31][cH:30]2)([O:47][CH2:40][c:41]2[cH:42][cH:43][cH:44][cH:45][cH:46]2)[C@@H:12]1[CH2:13][CH2:14][CH2:15][CH2:16][CH2:17][CH2:18][C:19](=[O:20])[O:21][CH3:22])[O:4][C:1]([CH3:2])=[O:3] +03932463 O.[CH3:5][CH2:4][O:3][C:1](=[O:2])[CH2:6][CH2:7][CH2:8][CH2:9][CH:10]1[CH2:14][CH2:13][CH2:12][C:11]1=[O:15].CC(=O)O[C:17]([CH3:16])=[O:18].Cc1ccc(S(=O)(=O)O)cc1>>[CH3:5][CH2:4][O:3][C:1](=[O:2])[CH2:6][CH2:7][CH2:8][CH2:9][C:10]1=[C:11]([O:15][C:17]([CH3:16])=[O:18])[CH2:12][CH2:13][CH2:14]1 +03932463 [OH].[K+].[K+].[CH3:28][CH2:27][CH2:26][CH2:25][CH2:24][C@@H:5]([CH2:6][CH2:7][C@H:8]1[CH2:9][CH2:10][C:11](=[O:23])[C@@H:12]1[CH2:13][CH2:14][CH2:15][CH2:16][CH2:17][CH2:18][C:19](=[O:20])[O:21][CH3:22])[O:4]C(C)=O.O=C([O-])[O-]>ClC(Cl)Cl>[CH3:28][CH2:27][CH2:26][CH2:25][CH2:24][C@H:5]([OH:4])[CH2:6][CH2:7][C@H:8]1[CH2:9][CH2:10][C:11](=[O:23])[C@@H:12]1[CH2:13][CH2:14][CH2:15][CH2:16][CH2:17][CH2:18][C:19](=[O:20])[O:21][CH3:22] +03932471 [CH3:10][NH:9][C:8](=[O:11])[CH:3]([C:2](Br)=[N:12][OH:13])[C:4]([CH3:5])([CH3:6])[CH3:7].[CH2:15]1[CH2:14][CH2:18][NH:17][CH2:16]1>>[CH3:10][NH:9][C:8](=[O:11])[CH:3]([C:2](=[N:12][OH:13])[N:17]1[CH2:16][CH2:15][CH2:14][CH2:18]1)[C:4]([CH3:6])([CH3:7])[CH3:5] +03932472 O.C[c:15]1[cH:16]cc(S(=O)(=O)O)cc1.[O:2]=[C:1]([OH:3])[CH2:4][CH2:5][CH2:6][CH2:7][CH:8]1[CH2:12][CH2:11][CH2:10][C:9]1=[O:13]>CCO>[CH3:16][CH2:15][O:3][C:1](=[O:2])[CH2:4][CH2:5][CH2:6][CH2:7][CH:8]1[CH2:12][CH2:11][CH2:10][C:9]1=[O:13] +03932472 [K+].[CH3:30][CH2:29][CH2:28][CH2:27][CH2:26][CH:6]([CH2:7][CH2:8][C@H:9]1[CH2:10][CH2:11][C:12](=[O:25])[C@@H:13]1[CH2:14][CH2:15][CH2:16][CH2:17][CH2:18][CH2:19][C:20](=[O:21])[O:22][CH2:23][CH3:24])OS(C)(=O)=O.N#C[S-].[N:34]#[C:33][S-:32]>CN(C)C=O>[CH3:30][CH2:29][CH2:28][CH2:27][CH2:26][CH:6]([CH2:7][CH2:8][C@H:9]1[CH2:10][CH2:11][C:12](=[O:25])[C@@H:13]1[CH2:14][CH2:15][CH2:16][CH2:17][CH2:18][CH2:19][C:20](=[O:21])[O:22][CH2:23][CH3:24])[S:32][C:33]#[N:34] +03932472 [Li].[CH3].[OH].[OH-].[Na+].Cl.[CH3:24][CH2:23][CH2:22][CH2:21][CH2:20][CH:2]([OH:1])[CH2:3][CH2:4][C@H:5]1[CH2:6][CH2:7][C:8](=[O:19])[C@@H:9]1[CH2:10][CH2:11][CH2:12][CH2:13][CH2:14][CH2:15][C:16](=[O:17])[OH:18].OO.C1CC2CCCC3CCCC(C1)B23>C1CCOC1>[CH3:24][CH2:23][CH2:22][CH2:21][CH2:20][CH:2]([OH:1])[CH2:3][CH2:4][C@H:5]1[CH2:6][CH2:7][C@H:8]([OH:19])[C@@H:9]1[CH2:10][CH2:11][CH2:12][CH2:13][CH2:14][CH2:15][C:16](=[O:17])[OH:18] +03932472 [OH].[K+].[K+].[CH3:28][CH2:27][CH2:26][CH2:25][CH2:24][C@@H:5]([CH2:6][CH2:7][C@H:8]1[CH2:9][CH2:10][C:11](=[O:23])[C@@H:12]1[CH2:13][CH2:14][CH2:15][CH2:16][CH2:17][CH2:18][C:19](=[O:20])[O:21][CH3:22])[O:4]C(C)=O.O=C([O-])[O-]>ClC(Cl)Cl>[CH3:28][CH2:27][CH2:26][CH2:25][CH2:24][C@H:5]([OH:4])[CH2:6][CH2:7][C@H:8]1[CH2:9][CH2:10][C:11](=[O:23])[C@@H:12]1[CH2:13][CH2:14][CH2:15][CH2:16][CH2:17][CH2:18][C:19](=[O:20])[O:21][CH3:22] +03932472 C[c:15]1[cH:16]cc(S(=O)(=O)O)cc1.[O:2]=[C:1]([OH:3])[CH2:4][CH2:5][CH2:6][CH2:7][CH2:8][C:9]1=[CH:13][CH2:12][CH2:11][C:10]1=[O:14]>CCO>[CH3:16][CH2:15][O:3][C:1](=[O:2])[CH2:4][CH2:5][CH2:6][CH2:7][CH2:8][C:9]1=[CH:13][CH2:12][CH2:11][C:10]1=[O:14] +03932473 [O:16]=[C:6]1[c:5]2[cH:4][cH:3][cH:2][cH:1][c:14]2[C:13](=[O:15])[c:12]2[cH:11][cH:10][cH:9][cH:8][c:7]21.O=[N+:18]([O-:19])[OH:17]>O.F>[O:15]=[C:13]1[c:14]2[cH:1][cH:2][cH:3][cH:4][c:5]2[C:6](=[O:16])[c:7]2[c:12]1[cH:11][cH:10][cH:9][c:8]2[N+:18](=[O:17])[O-:19] +03932475 [CH3:10][c:4]1[cH:5][c:6](Cl)[c:7]([CH3:8])[c:2]([CH3:1])[c:3]1[OH:11].O=[N+]([O-])[OH:12]>CC(=O)O>[CH3:10][C:4]1=[CH:5][C:6](=[O:12])[C:7]([CH3:8])=[C:2]([CH3:1])[C:3]1=[O:11] +03932475 [OH2:11].[CH3:8][c:7]1[cH:6][cH:5][c:4]([CH3:9])[c:3]([OH:10])[c:2]1[CH3:1]>>[CH3:9][C:4]1=[CH:5][C:6](=[O:11])[C:7]([CH3:8])=[C:2]([CH3:1])[C:3]1=[O:10] +03932479 O.[CH3:14][C:13](=[O:15])[O:16][CH2:17][CH2:18][CH2:19][CH2:20][CH2:21][CH:22]1[CH2:26][CH2:25][CH2:24][C:23]1=[O:27].CC(=O)OC(C)=O.Cc1ccc(S(=O)(=O)O)cc1.O=C1CCCC1CCCCCO.O=C1CCCC1CCC[CH2:3][CH2:2][OH:1]>>[CH3:14][C:13](=[O:15])[O:16][CH2:17][CH2:18][CH2:19][CH2:20][CH2:21][C:22]1=[C:23]([O:27][C:2]([CH3:3])=[O:1])[CH2:24][CH2:25][CH2:26]1 +03932479 [O:2]=[C:1]([OH:3])[CH2:4][CH2:5][CH2:6][CH2:7][CH2:8][CH2:9][C:10]1=[CH:14][CH2:13][CH2:12][C:11]1=[O:15].O=C1CCC(=O)N1[Br:16]>ClC(Cl)(Cl)Cl>[O:2]=[C:1]([OH:3])[CH2:4][CH2:5][CH2:6][CH2:7][CH2:8][CH2:9][C:10]1=[CH:14][CH:13]([Br:16])[CH2:12][C:11]1=[O:15] +03932479 O.C[c:14]1[cH:15]cc(S(=O)(=O)O)cc1.[O:2]=[C:1]([OH:3])[CH2:4][CH2:5][CH2:6][CH:7]1[CH2:11][CH2:10][CH2:9][C:8]1=[O:12]>CCO>[CH3:15][CH2:14][O:3][C:1](=[O:2])[CH2:4][CH2:5][CH2:6][CH:7]1[CH2:11][CH2:10][CH2:9][C:8]1=[O:12] +03932479 [CH3:5][CH2:4][O:3][C:1](=[O:2])[CH2:6][CH2:7][CH2:8][CH2:9][CH2:10][CH2:11][CH2:12][CH:13]1[CH2:18][CH2:17][CH2:16][CH2:15][C:14]1=[O:19].CC(=O)O[C:21]([CH3:20])=[O:22]>>[CH3:5][CH2:4][O:3][C:1](=[O:2])[CH2:6][CH2:7][CH2:8][CH2:9][CH2:10][CH2:11][CH2:12][C:13]1=[C:14]([O:19][C:21]([CH3:20])=[O:22])[CH2:15][CH2:16][CH2:17][CH2:18]1 +03932479 [CH2:14]=[C:12]([CH3:13])[CH3:11].[CH3:10][CH2:9][CH2:8][C:7]#[C:6][CH:2]([OH:1])[CH2:3][CH2:4][I:5]>>[CH3:10][CH2:9][CH2:8][C:7]#[C:6][CH:2]([CH2:3][CH2:4][I:5])[O:1][C:12]([CH3:11])([CH3:13])[CH3:14] +03932479 [Na+].[I-:2].[CH3:11][CH2:10][CH2:9][CH2:8][CH2:7][C:6](=[O:12])/[CH:5]=[CH:4]/Cl>CC(C)=O>[CH3:11][CH2:10][CH2:9][CH2:8][CH2:7][C:6](=[O:12])/[CH:5]=[CH:4]/[I:2] +03932479 [CH3:9][CH2:8][CH2:7][CH2:6][CH2:5][CH:4]([OH:10])/[CH:3]=[CH:2]/[I:1].Br[C:17]([c:11]1[cH:12][cH:13][cH:14][cH:15][cH:16]1)([c:18]1[cH:19][cH:20][cH:21][cH:22][cH:23]1)[c:24]1[cH:25][cH:26][cH:27][cH:28][cH:29]1>c1ccncc1>[CH3:9][CH2:8][CH2:7][CH2:6][CH2:5][CH:4](/[CH:3]=[CH:2]/[I:1])[O:10][C:17]([c:18]1[cH:23][cH:22][cH:21][cH:20][cH:19]1)([c:24]1[cH:29][cH:28][cH:27][cH:26][cH:25]1)[c:11]1[cH:12][cH:13][cH:14][cH:15][cH:16]1 +03932479 [CH3:9][CH2:8][CH2:7][CH2:6][CH2:5][CH:4]([OH:10])/[CH:3]=[CH:2]/[I:1].[CH3:19][O:18][c:15]1[cH:14][cH:13][c:12]([CH2:11][C:20](Cl)([c:21]2[cH:22][cH:23][cH:24][cH:25][cH:26]2)[c:27]2[cH:28][cH:29][cH:30][cH:31][cH:32]2)[cH:17][cH:16]1>>[CH3:9][CH2:8][CH2:7][CH2:6][CH2:5][CH:4](/[CH:3]=[CH:2]/[I:1])[O:10][C:20]([CH2:11][c:12]1[cH:17][cH:16][c:15]([O:18][CH3:19])[cH:14][cH:13]1)([c:27]1[cH:32][cH:31][cH:30][cH:29][cH:28]1)[c:21]1[cH:22][cH:23][cH:24][cH:25][cH:26]1 +03932479 [Al+3].[Br-].[Br-].[Br-].C#C.[CH3:16][CH2:15][CH2:14][CH2:13][CH2:12][C:11](=[O:17])Br.Br[CH2:7][CH2:6][Br:5]>>[CH3:16][CH2:15][CH2:14][CH2:13][CH2:12][C:11](=[O:17])/[CH:7]=[CH:6]/[Br:5] +03932479 [CH3:11][CH2:10][CH2:9][CH2:8][C:2]([CH3:12])([CH3:1])[CH:3]([OH:7])/[CH:4]=[CH:5]/[I:6].Br[C:19]([c:13]1[cH:14][cH:15][cH:16][cH:17][cH:18]1)([c:20]1[cH:21][cH:22][cH:23][cH:24][cH:25]1)[c:26]1[cH:27][cH:28][cH:29][cH:30][cH:31]1>>[CH3:11][CH2:10][CH2:9][CH2:8][C:2]([CH3:12])([CH3:1])[CH:3](/[CH:4]=[CH:5]/[I:6])[O:7][C:19]([c:20]1[cH:25][cH:24][cH:23][cH:22][cH:21]1)([c:26]1[cH:31][cH:30][cH:29][cH:28][cH:27]1)[c:13]1[cH:14][cH:15][cH:16][cH:17][cH:18]1 +03932479 O.[CH3:5][CH2:4][O:3][C:1](=[O:2])[CH2:6][CH2:7][CH2:8][CH2:9][CH:10]1[CH2:14][CH2:13][CH2:12][C:11]1=[O:15].CC(=O)O[C:17]([CH3:16])=[O:18].Cc1ccc(S(=O)(=O)O)cc1>>[CH3:5][CH2:4][O:3][C:1](=[O:2])[CH2:6][CH2:7][CH2:8][CH2:9][C:10]1=[C:11]([O:15][C:17]([CH3:16])=[O:18])[CH2:12][CH2:13][CH2:14]1 +03932479 [CH3:9][CH2:8][CH2:7][C:6]([CH3:10])([CH3:11])[CH2:5][CH:4]([OH:12])/[CH:3]=[CH:2]/[Br:1].Br[C:19]([c:13]1[cH:14][cH:15][cH:16][cH:17][cH:18]1)([c:20]1[cH:21][cH:22][cH:23][cH:24][cH:25]1)[c:26]1[cH:27][cH:28][cH:29][cH:30][cH:31]1>>[CH3:9][CH2:8][CH2:7][C:6]([CH3:10])([CH3:11])[CH2:5][CH:4](/[CH:3]=[CH:2]/[Br:1])[O:12][C:19]([c:20]1[cH:25][cH:24][cH:23][cH:22][cH:21]1)([c:26]1[cH:31][cH:30][cH:29][cH:28][cH:27]1)[c:13]1[cH:14][cH:15][cH:16][cH:17][cH:18]1 +03932479 [CH3:18][CH2:17][O:16][C:14](=[O:15])[CH2:13][CH2:12][CH2:11][CH2:10][CH2:9][CH2:8][C:4]1=[CH:3][CH:2](Br)[CH2:6][C:5]1=[O:7]>[Ag+].CC(=O)[O-].CC(=O)O>[CH3:18][CH2:17][O:16][C:14](=[O:15])[CH2:13][CH2:12][CH2:11][CH2:10][CH2:9][CH2:8][C:4]1=[CH:3][CH:2]([O:16][C:14]([CH3:13])=[O:15])[CH2:6][C:5]1=[O:7] +03932479 [Na+].[I-:16].[CH3:8][CH2:7][O:6][C:4](=[O:5])[CH2:3][C:2]([CH3:14])([CH3:1])[CH2:9][CH2:10][CH2:11][CH2:12]Cl>CCC(C)=O>[CH3:8][CH2:7][O:6][C:4](=[O:5])[CH2:3][C:2]([CH3:14])([CH3:1])[CH2:9][CH2:10][CH2:11][CH2:12][I:16] +03932483 [K+].[K+].[CH2:13]=[CH:12][O:14]CC.[CH2:9]=[CH:8][C:7]([CH3:11])(O)[CH2:6][CH2:5][O:4][CH:1]([CH3:2])[CH3:3].O=C([O-])[O-]>CC(=O)O>[CH3:11][C:7](=[CH:8][CH2:9][CH2:13][CH:12]=[O:14])[CH2:6][CH2:5][O:4][CH:1]([CH3:2])[CH3:3] +03932484 [CH3:17][CH2:16][O:15][C:13](=[O:14])[C:1]1=[CH:2][CH2:3][CH2:4][CH2:5][CH2:6][CH2:7][CH2:8][CH2:9][CH2:10][CH2:11][CH2:12]1.CCOC(=O)C1CCCCCCCCCCC1>>[CH3:17][CH2:16][O:15][C:13](=[O:14])[C:1]1=[CH:2][CH:3]=[CH:4][CH2:5][CH2:6][CH2:7][CH2:8][CH2:9][CH2:10][CH2:11][CH2:12]1 +03932487 [CH3:20][CH2:19][CH2:18][SH:21].[CH3:5][CH2:4][O:3][C:1](=[O:2])[CH2:6][CH2:7][CH2:8][CH2:9][CH2:10][CH2:11][C:12]1=[CH:16][CH2:15][CH2:14][C:13]1=[O:17].C1CCNCC1>>[CH3:20][CH2:19][CH2:18][S:21][CH:16]1[CH2:15][CH2:14][C:13](=[O:17])[CH:12]1[CH2:11][CH2:10][CH2:9][CH2:8][CH2:7][CH2:6][C:1](=[O:2])[O:3][CH2:4][CH3:5] +03932487 [CH3:24][CH2:23][O:22][C:20](=[O:21])[CH2:19][CH2:18][CH2:17][CH2:16][CH2:15][CH2:14][C:8]1(C(=O)OCC)[CH2:12][CH2:11][CH2:10][C:9]1=[O:13].BrBr>ClC(Cl)Cl>[CH3:24][CH2:23][O:22][C:20](=[O:21])[CH2:19][CH2:18][CH2:17][CH2:16][CH2:15][CH2:14][C:8]1=[CH:12][CH2:11][CH2:10][C:9]1=[O:13] +03932496 CCO.[CH3:10][C:9](=[O:11])[CH2:8][CH2:7][C:6]#[C:5][CH2:4][CH2:3][CH2:2]Cl.[N:17]#[C:16][Na]>[OH-].O.[Na+]>[CH3:10][C:9](=[O:11])[CH2:8][CH2:7][C:6]#[C:5][CH2:4][CH2:3][CH2:2][C:16]#[N:17] +03932498 [Na+].[CH3:11][CH2:12][O-:13].[CH3:9][S:8][c:3]1[cH:4][cH:5][cH:6][cH:7][c:2]1[OH:1].OCCCl>CCO>[CH3:9][S:8][c:3]1[cH:4][cH:5][cH:6][cH:7][c:2]1[O:1][CH2:11][CH2:12][OH:13] +03932499 CCCCON=O.N[c:3]1[cH:5][cH:6][c:7]([F:9])[cH:8][c:2]1[F:1].[cH:18]1[cH:19][cH:20][cH:21][cH:22][cH:17]1>>[F:9][c:7]1[cH:6][cH:5][c:3](-[c:17]2[cH:18][cH:19][cH:20][cH:21][cH:22]2)[c:2]([F:1])[cH:8]1 +03932499 [CH3:25][CH2:26]O.[CH3:12][CH:8]([C:9](=[O:10])[OH:11])[c:6]1[cH:5][cH:4][c:3](-[c:13]2[cH:14][cH:15][c:16]([F:19])[cH:17][cH:18]2)[c:2]([F:1])[cH:7]1.O=S(=O)(O)O>>[CH3:26][CH2:25][O:11][C:9](=[O:10])[CH:8]([CH3:12])[c:6]1[cH:5][cH:4][c:3](-[c:13]2[cH:18][cH:17][c:16]([F:19])[cH:15][cH:14]2)[c:2]([F:1])[cH:7]1 +03932504 [NH3:5].[NH2:3][C:2]([NH2:1])=[O:4].[O:8]=[C:7]=[O:6]>O>[NH4+:1].[NH2:3][C:2]([NH2:1])=[O:4].[NH2:5][C:7](=[O:6])[O-:8] +03932505 [K+].[K+].[CH3:23][CH2:22][CH2:21][CH2:20][CH2:19][CH2:18][CH2:17][CH2:16][CH2:15][CH2:14][CH:13]=CCl.[CH3:32][CH2:31][C:33]([CH3:35])=O.[CH3:11][O:10][C:1](=[O:9])[c:2]1[cH:8][cH:7][cH:6][cH:5][c:3]1[OH:4].O=[C:25]([O-])[O-]>O>[CH3:13][CH2:14][CH2:15][CH2:16][CH2:17][CH2:18][CH2:19][CH2:20][CH2:21][CH2:22][CH:23]=[CH:11][O:10][CH:1]=[CH:2][CH2:3][CH2:5][CH2:6][CH2:7][CH2:8][CH2:32][CH2:31][CH2:33][CH2:35][CH3:25].[CH3:11][O:10][C:1](=[O:9])[c:2]1[cH:8][cH:7][cH:6][cH:5][c:3]1[OH:4] +03932518 [CH3:14][OH:15].[O:13]=[C:1]1[CH2:2][CH2:3][CH2:4][CH2:5][CH2:6][CH2:7][CH2:8][CH2:9][CH2:10][CH2:11][CH2:12]1>>[CH3:11][CH:12]1[CH2:1][CH2:2][CH2:3][CH2:4][CH2:5][CH2:6][CH2:7][CH2:8][CH2:9][CH2:10][C:14]1=[O:15].[O:13]=[C:1]1[CH2:2][CH2:3][CH2:4][CH2:5][CH2:6][CH2:7][CH2:8][CH2:9][CH2:10][CH2:11][CH2:12]1 +03932537 [CH3:12][C:11]([CH3:13])([CH3:14])[c:9]1[cH:8][cH:7][c:6]([OH:15])[c:5](C(C)(C)C)[cH:10]1.Oc1ccccc1>>[CH3:13][C:11]([CH3:12])([CH3:14])[c:9]1[cH:8][cH:7][c:6]([OH:15])[cH:5][cH:10]1 +03932549 [O].C[C:1](C)([CH3:4])[c:5]1[cH:6][cH:7][cH:8][cH:9][cH:10]1>[Mn+2].CC(=O)O.O=[N+]([O-])[O-].O=[N+]([O-])[O-]>[CH3:1][C:5]([CH3:6])([CH3:10])[CH:4]=[CH:1][c:5]1[cH:10][cH:9][cH:8][cH:7][cH:6]1 +03932636 CCN(CC)CC.[CH3:8][O:9][CH:10]1[CH2:11][CH2:12][NH:13][CH2:14][CH2:15]1.[NH2:29][S:28](=[O:30])(=[O:31])[c:27]1[cH:26][cH:25][cH:24][cH:23][c:22]1[Cl:21].[O:17]=[S:16](=[O:18])(Cl)Cl>CC(C)=O>[CH3:8][O:9][CH:10]1[CH2:11][CH2:12][N:13]([S:16](=[O:17])(=[O:18])[c:24]2[cH:25][cH:26][c:27]([S:28]([NH2:29])(=[O:30])=[O:31])[c:22]([Cl:21])[cH:23]2)[CH2:14][CH2:15]1 +03932641 [CH3:20]O.[CH3:13][CH:2]([CH3:1])[CH:3]([C:4]([NH2:6])=[S:5])[c:7]1[cH:12][cH:11][cH:10][cH:9][n:8]1.[CH2:18]1[CH2:17][O:16][CH2:15][CH2:14][NH:19]1>>[CH3:13][CH:2]([CH3:1])[CH:3]([C:4](=[S:5])[NH:6][CH2:20][N:19]1[CH2:14][CH2:15][O:16][CH2:17][CH2:18]1)[c:7]1[cH:12][cH:11][cH:10][cH:9][n:8]1 +03932641 [Na+].[Na+].[Cl-].[CH3:2][Mg+].N#C[c:7]1[cH:8][cH:9][n:4][cH:5][n:6]1.[O:22]=[C:20]([O-])[O-].O=S(=O)(O)O>C1CCOC1>[CH3:2][C:20](=[O:22])[c:7]1[cH:8][cH:9][n:4][cH:5][n:6]1 +03932644 [CH3:9][I:10].[CH3:1][CH:2]1[NH:6][C:5](=[S:7])[NH:4][C:3]1=[O:8]>CCO>[IH:10].[CH3:9][S:7][C:5]1=[N:4][C:3](=[O:8])[CH:2]([CH3:1])[NH:6]1 +03932644 [CH3:14][CH2:13][O:12][c:10]1[cH:11][c:2](Cl)[n:3][c:4]2[cH:5][cH:6][cH:7][cH:8][c:9]21.[CH3:25][c:21]1[n:22][cH:23][nH:24][c:20]1[CH2:19][S:18][CH2:17][CH2:16][NH2:15]>>[CH3:14][CH2:13][O:12][c:10]1[cH:11][c:2]([NH:15][CH2:16][CH2:17][S:18][CH2:19][c:20]2[nH:24][cH:23][n:22][c:21]2[CH3:25])[n:3][c:4]2[cH:5][cH:6][cH:7][cH:8][c:9]21 +03932650 B.[CH3:1][CH:2]1[CH2:3][CH2:4][C:5]2=[C:6]([CH:7]=[CH:8][C:9]3=[CH:17][CH2:16][CH2:15][c:14]4[c:13]5[cH:18][n:19][cH:20][cH:21][c:12]5[n:11]2[c:10]43)[CH2:22]1>C1CCOC1>[CH3:1][CH:2]1[CH2:3][CH2:4][CH:5]2[CH:6]([CH:7]=[CH:8][C:9]3=[CH:17][CH2:16][CH2:15][c:14]4[c:13]5[cH:18][n:19][cH:20][cH:21][c:12]5[n:11]2[c:10]43)[CH2:22]1 +03932661 [Na+].C[O-].CO.CC[O:8][C:6](=O)[c:5]1[cH:4][cH:3][c:2]([F:1])[cH:12][cH:11]1.[NH2:15][NH:16][c:17]1[cH:18][cH:19][cH:20][cH:21][cH:22]1>O>[NH2:15][N:16]([C:6](=[O:8])[c:5]1[cH:11][cH:12][c:2]([F:1])[cH:3][cH:4]1)[c:17]1[cH:18][cH:19][cH:20][cH:21][cH:22]1 +03932661 Cl.[NH2:10][N:9](C(=O)c1ccccc1)[c:3]1[cH:4][c:5]([Cl:8])[cH:6][cH:7][c:2]1[Cl:1].O[c:21]1[cH:22][cH:23][cH:24][cH:25][cH:26]1.[Cl:28][C:27](Cl)(Cl)Cl>>[Cl:28][C:27](=[N:10][NH:9][c:3]1[cH:4][c:5]([Cl:8])[cH:6][cH:7][c:2]1[Cl:1])[c:21]1[cH:22][cH:23][cH:24][cH:25][cH:26]1 +03932662 [OH-].[Na+].[Na+].Cl.[CH3:21][C:20](=[O:22])[CH2:19][C:18]([CH3:17])=[O:23].[NH2:7][c:6]1[cH:8][cH:9][cH:10][c:4]([C:3]([F:11])([F:12])[F:2])[cH:5]1.O=[N:13][O-]>O>[CH3:21][C:20](=[O:22])[C:19](=[N:13][NH:7][c:6]1[cH:8][cH:9][cH:10][c:4]([C:3]([F:12])([F:11])[F:2])[cH:5]1)[C:18]([CH3:17])=[O:23] +03933469 [CH3:8][O:7][C:6](=[O:9])[N:5]=[C:2]([NH2:1])[O:3][CH3:4].COC(=O)N=C(N)SC.[O:28]=[C:27]=[N:26][c:23]1[cH:22][cH:21][c:20]([Cl:19])[cH:25][cH:24]1>ClCCl>[CH3:8][O:7][C:6](=[O:9])[N:5]=[C:2]([NH:1][C:27](=[O:28])[NH:26][c:23]1[cH:22][cH:21][c:20]([Cl:19])[cH:25][cH:24]1)[O:3][CH3:4] +03933472 Cl.CCN(CC)c1ccccc1.[CH3:15][C:14](=[O:16])[c:6]1[cH:5][c:4]([N+:1](=[O:2])[O-:3])[c:9](O)[c:8]([N+:11](=[O:12])[O-:13])[cH:7]1.Cc1ccc(S(=O)(=O)[Cl:26])cc1.O=[N+]([O-])c1ccccc1>>[CH3:15][C:14](=[O:16])[c:6]1[cH:7][c:8]([N+:11](=[O:12])[O-:13])[c:9]([Cl:26])[c:4]([N+:1](=[O:2])[O-:3])[cH:5]1 +03933681 [O:10]=[C:9](O)[C:11](F)(F)F.[OH:1][c:2]1[cH:3][cH:4][cH:5][cH:6][cH:7]1>[Cu].CO>[O:10]=[C:9]1[CH:4]=[CH:3][C:2](=[O:1])[CH:7]=[CH:11]1.[OH:1][c:2]1[cH:3][cH:4][cH:5][cH:6][cH:7]1 +03933781 [NH2:11][C@@H:12]([CH2:13][c:14]1[cH:15][cH:16][cH:17][cH:18][cH:19]1)[C:20](=[O:22])[OH:21].[O:2]=[CH:1][NH:3][C@H:4]1[CH2:5][C:6](=[O:7])[O:8][C:9]1=[O:10]>CC(=O)O>[O:2]=[CH:1][NH:3][C@@H:4]([CH2:5][C:6](=[O:7])[OH:8])[C:9](=[O:10])[NH:11][C@@H:12]([CH2:13][c:14]1[cH:15][cH:16][cH:17][cH:18][cH:19]1)[C:20](=[O:21])[OH:22] +03933794 O=C[c:12]1[cH:13][n:14][c:10]2[n:11]1-[c:5]1[cH:4][cH:3][c:2]([Cl:1])[cH:23][c:6]1[C:7]([c:17]1[cH:18][cH:19][cH:20][cH:21][cH:22]1)=[N:8][CH2:9]2>c1ccccc1>[Cl:1][c:2]1[cH:3][cH:4][c:5]2[c:6]([cH:23]1)[C:7]([c:17]1[cH:18][cH:19][cH:20][cH:21][cH:22]1)=[N:8][CH2:9][c:10]1[n:14][cH:13][cH:12][n:11]1-2 +03933794 [K+].[K+].[CH3:15][c:12]1[cH:13][n:14][c:10]2[n:11]1-[c:5]1[cH:4][cH:3][c:2]([Cl:1])[cH:22][c:6]1[C:7]([c:16]1[cH:17][cH:18][cH:19][cH:20][cH:21]1)=[N:8][CH2:9]2.O=C([O-])[O-].[O:31]=C(OO)c1cccc(Cl)c1>CCO>[CH3:15][c:12]1[cH:13][n:14][c:10]2[n:11]1-[c:5]1[cH:4][cH:3][c:2]([Cl:1])[cH:22][c:6]1[C:7]([c:16]1[cH:17][cH:18][cH:19][cH:20][cH:21]1)=[N+:8]([O-:31])[CH2:9]2 +03933794 [OH-].[Na+].CCO.CC(=O)O.[CH3:19][c:16]1[cH:17][n:18][c:14]2[n:15]1-[c:9]1[cH:8][cH:7][c:6]([Cl:5])[cH:28][c:10]1[C:11]([c:21]1[cH:26][cH:25][cH:24][cH:23][c:22]1Cl)=[N:12][CH:13]2[OH:20]>O>[CH3:19][c:16]1[cH:17][n:18][c:14]2[n:15]1-[c:9]1[cH:8][cH:7][c:6]([Cl:5])[cH:28][c:10]1[C:11]([c:21]1[cH:22][cH:23][cH:24][cH:25][cH:26]1)=[N:12][CH:13]2[OH:20] +03933794 O=[C:10]1[CH2:9][N:8]=[C:7]([c:13]2[cH:18][cH:17][cH:16][cH:15][n:14]2)[c:6]2[cH:19][c:2]([Br:1])[cH:3][cH:4][c:5]2[NH:11]1.[S:27]=P12SP3(=S)SP(=S)(S1)SP(=S)(S2)S3.c1ccncc1>CCO>[S:27]=[C:10]1[CH2:9][N:8]=[C:7]([c:13]2[cH:18][cH:17][cH:16][cH:15][n:14]2)[c:6]2[cH:19][c:2]([Br:1])[cH:3][cH:4][c:5]2[NH:11]1 +03933794 O.CC#[C:14][CH2:13][NH:12][C:10]1=[N:11][c:5]2[cH:4][cH:3][c:2]([Cl:1])[cH:25][c:6]2[C:7]([c:17]2[c:18](F)[cH:19][cH:20][cH:21][c:22]2F)=[N:8][CH2:9]1.[CH3:26][C:27](=[O:29])O.O=[CH:30]O>CCOC(C)=O>[CH3:14][c:13]1[n:12][c:10]2[n:11]([c:26]1[CH:27]=[O:29])-[c:5]1[cH:4][cH:3][c:2]([Cl:1])[cH:25][c:6]1[C:7]([c:17]1[cH:22][cH:21][cH:20][cH:19][cH:18]1)=[N:8][CH:9]2[CH3:30] +03933797 Cl.[CH3:18][CH:14]([NH:10][C:11](=[NH:12])[NH2:13])[C:15](=[O:16])[OH:17].N=C(N)NCC(=O)[Cl:9]>>[ClH:9].[CH3:18][CH:14]([NH:10][C:11](=[NH:12])[NH2:13])[C:15](=[O:16])[OH:17] +03933797 [ClH:13].[NH:16]=[C:15](N)[NH:14]c1cccc(C(=O)[Cl:23])c1.[NH2:1][c:2]1[cH:3][cH:4][c:5]([CH:6]=[CH:7][C:8](=[O:9])O)[cH:11][cH:12]1>>[ClH:23].[NH:14]=[C:15]([NH2:16])[NH:1][c:2]1[cH:3][cH:4][c:5]([CH:6]=[CH:7][C:8](=[O:9])[Cl:13])[cH:11][cH:12]1 +03933799 O.Cl.[CH3:35][CH2:34][CH2:33][C:32](=[O:36])O[C:32](=[O:36])[CH2:33][CH2:34][CH3:35].[CH3:27][CH2:26][C:25](=[O:28])[O:24][C@:16]1([C:17](=[O:20])[CH2:18][OH:19])[C@@H:15]([CH3:29])[CH2:14][C@H:13]2[C@@H:12]3[CH2:11][CH2:10][C:9]4=[CH:8][C:7](=[O:30])[CH:6]=[CH:5][C@:4]4([CH3:31])[C@H:3]3[C@@H:2]([Cl:1])[CH2:22][C@@:21]21[CH3:23]>c1ccncc1>[CH3:35][CH2:34][CH2:33][C:32](=[O:36])[O:19][CH2:18][C:17](=[O:20])[C@@:16]1([O:24][C:25](=[O:28])[CH2:26][CH3:27])[C@@H:15]([CH3:29])[CH2:14][C@H:13]2[C@@H:12]3[CH2:11][CH2:10][C:9]4=[CH:8][C:7](=[O:30])[CH:6]=[CH:5][C@:4]4([CH3:31])[C@H:3]3[C@@H:2]([Cl:1])[CH2:22][C@@:21]21[CH3:23] +03933799 O.[CH3:2][C:1](=[O:3])[O:4][C@:5]1([C:6](=[O:9])[CH2:7][OH:8])[C@@H:10]([CH3:30])[CH2:11][C@H:12]2[C@@H:13]3[CH2:14][CH2:15][C:16]4=[CH:17][C:18](=[O:29])[CH:19]=[CH:20][C@:21]4([CH3:22])[C@H:23]3[C@@H:24]([Cl:28])[CH2:25][C@@:26]21[CH3:27].[CH3:33][CH:32]([CH3:34])[C:31](=[O:35])O[C:31](=[O:35])[CH:32]([CH3:33])[CH3:34]>Cl.c1ccncc1>[CH3:2][C:1](=[O:3])[O:4][C@:5]1([C:6](=[O:9])[CH2:7][O:8][C:31](=[O:35])[CH:32]([CH3:33])[CH3:34])[C@@H:10]([CH3:30])[CH2:11][C@H:12]2[C@@H:13]3[CH2:14][CH2:15][C:16]4=[CH:17][C:18](=[O:29])[CH:19]=[CH:20][C@:21]4([CH3:22])[C@H:23]3[C@@H:24]([Cl:28])[CH2:25][C@@:26]21[CH3:27] +03933804 [CH3:2][CH:1]([CH3:3])[O:4][CH2:5][CH2:6][CH:7]=[CH:8][CH2:9][OH:10].O[c:15]1[cH:16][cH:17][c:18]2[c:13]([cH:14]1)[O:12][CH2:11][O:19]2.C(=NC1CCCCC1)=NC1CCCCC1>>[CH3:2][CH:1]([CH3:3])[O:4][CH2:5][CH2:6][CH:7]=[CH:8][CH2:9][O:10][c:16]1[cH:15][cH:14][c:13]2[c:18]([cH:17]1)[O:19][CH2:11][O:12]2 +03933804 [Na].[CH3:19][C:15](=[CH:16][CH2:17]Br)[CH2:14][Br:13].[OH:8][CH2:7][c:6]1[cH:9][cH:10][c:11]2[c:4]([cH:5]1)[O:3][CH2:2][O:12]2>COCCOC>[CH3:19][C:15](=[CH:16][CH2:17][O:8][CH2:7][c:6]1[cH:9][cH:10][c:11]2[c:4]([cH:5]1)[O:3][CH2:2][O:12]2)[CH2:14][Br:13] +03933804 [CH3:17][CH2:16][CH:15]=[CH:14][CH:13](C)[O:18][c:19]1[cH:20][cH:21][c:22](SC)[cH:23][cH:24]1.C[O:2][C:3](=[O:11])c1ccccc1S.Oc1ccccc1.[OH:27][c:28]1[cH:29]ccc[cH:33]1.c1cccc[cH:34]1>>[CH3:34][C:15](=[CH:14][CH2:13][O:18][c:19]1[cH:20][cH:21][c:22]2[c:23]([cH:24]1)[O:11][CH2:3][O:2]2)[CH2:16][CH2:17][O:27][CH:28]([CH3:29])[CH3:33] +03933804 [K+].[K+].[K+].[I-].[CH3:20][C:13](=[CH:12][CH2:11][CH2:10]Br)[CH2:14][CH2:15][O:16][CH:17]([CH3:18])[CH3:19].O=C([O-])[O-].[OH:30][c:25]1[cH:26][cH:27][c:28]2[c:23]([cH:24]1)[O:22][CH2:21][O:29]2>CC(C)=O>[CH3:20][C:13](=[CH:12][CH2:11][CH2:10][O:30][c:25]1[cH:26][cH:27][c:28]2[c:23]([cH:24]1)[O:22][CH2:21][O:29]2)[CH2:14][CH2:15][O:16][CH:17]([CH3:18])[CH3:19] +03933804 [CH3:16][C:3](=[CH:4][CH2:5][O:6][c:7]1[cH:15][cH:14][c:10]2[c:9]([cH:8]1)[O:13][CH2:12][O:11]2)[CH2:2]Br.[CH3:19][CH:18]([CH3:17])[CH2:20][OH:21]>>[CH3:16][C:3](=[CH:4][CH2:5][O:6][c:7]1[cH:15][cH:14][c:10]2[c:9]([cH:8]1)[O:13][CH2:12][O:11]2)[CH2:2][O:21][CH2:20][CH:18]([CH3:17])[CH3:19] +03933807 [OH2:20].[N:19]#[C:18][K].[O:9]=[C:8]([c:10]1[cH:14][cH:13][cH:12][s:11]1)[c:7]1[cH:6][cH:5][c:4]([N+](=O)[O-])[cH:16][cH:15]1>CS(C)=O>[N:19]#[C:18][c:5]1[cH:6][c:7]([C:8](=[O:9])[c:10]2[cH:14][cH:13][cH:12][s:11]2)[cH:15][cH:16][c:4]1[OH:20] +03933809 O=C1CCC(=O)N1[Cl:12].[O:10]=[N+:9]([O-:11])[C:2]([Br:1])=[C:3]1[NH:8][CH2:7][CH2:6][CH2:5][S:4]1>ClC(Cl)(Cl)Cl>[O:10]=[N+:9]([O-:11])[C:2]([Cl:12])([Br:1])[C:3]1=[N:8][CH2:7][CH2:6][CH2:5][S:4]1 +03933811 [CH3:11][NH:10][CH3:9].[N:14]#[C:13][K].O=[CH:7][c:2]1[n:3][cH:4][cH:5][cH:6][n:1]1>O>[CH3:11][N:10]([CH3:9])[CH:7]([C:13]#[N:14])[c:2]1[n:1][cH:6][cH:5][cH:4][n:3]1 +03933815 [NH2:13][CH:9]1[CH2:10][CH2:11][CH2:12][CH:7]([C:6]([F:14])([F:15])[F:5])[CH2:8]1.[O:4]=[C:2](Cl)Cl>Cc1ccccc1C>[O:4]=[C:2]=[N:13][CH:9]1[CH2:10][CH2:11][CH2:12][CH:7]([C:6]([F:15])([F:14])[F:5])[CH2:8]1 +03933816 [CH3:3][CH2:2][CH2:1][O:4][C:5](=[O:29])[CH2:6][N:7]1[c:13]2[cH:14][cH:15][c:16]([N+:18](=[O:19])[O-:20])[cH:17][c:12]2[C:11]([c:21]2[cH:26][cH:25][cH:24][cH:23][c:22]2[Cl:27])=[N:10][CH2:9][C:8]1=O.[S:31]=P12SP3(=S)SP(=S)(S1)SP(=S)(S2)S3.c1ccncc1>O.ClCCl>[CH3:3][CH2:2][CH2:1][O:4][C:5](=[O:29])[CH2:6][N:7]1[c:13]2[cH:14][cH:15][c:16]([N+:18](=[O:19])[O-:20])[cH:17][c:12]2[C:11]([c:21]2[cH:26][cH:25][cH:24][cH:23][c:22]2[Cl:27])=[N:10][CH2:9][C:8]1=[S:31] +03933816 [CH3:26][CH2:25][CH2:24][CH:4]([C:3](=[O:27])[O:2][CH3:1])[N:5]1[c:11]2[cH:12][cH:13][c:14]([Br:16])[cH:15][c:10]2[C:9]([c:17]2[cH:22][cH:21][cH:20][cH:19][n:18]2)=[N:8][CH2:7][C:6]1=O.[S:29]=P12SP3(=S)SP(=S)(S1)SP(=S)(S2)S3.c1ccncc1>O.ClCCl>[CH3:26][CH2:25][CH2:24][CH:4]([C:3](=[O:27])[O:2][CH3:1])[N:5]1[c:11]2[cH:12][cH:13][c:14]([Br:16])[cH:15][c:10]2[C:9]([c:17]2[cH:22][cH:21][cH:20][cH:19][n:18]2)=[N:8][CH2:7][C:6]1=[S:29] +03933816 [Na+].C[O-].[CH3:38][CH2:37][CH2:36][O:35][C:33](=[O:34])[CH2:32]Br.CN(C)C=O.[O:14]=[C:12]1[CH2:11][N:10]=[C:9]([c:15]2[cH:20][cH:19][cH:18][cH:17][c:16]2[Cl:21])[c:8]2[cH:22][c:4]([N+:1](=[O:2])[O-:3])[cH:5][cH:6][c:7]2[NH:13]1>O.CO.CO.Cc1ccccc1.ClCCl.ClCCl>[CH3:38][CH2:37][CH2:36][O:35][C:33](=[O:34])[CH2:32][N:13]1[c:7]2[cH:6][cH:5][c:4]([N+:1](=[O:2])[O-:3])[cH:22][c:8]2[C:9]([c:15]2[cH:20][cH:19][cH:18][cH:17][c:16]2[Cl:21])=[N:10][CH2:11][C:12]1=[O:14] +03933816 [CH3:1][O:2][C:3](=[O:24])[CH2:4][N:5]1[c:11]2[cH:12][cH:13][c:14]([Cl:16])[cH:15][c:10]2[C:9]([c:17]2[cH:18][cH:19][cH:20][cH:21][cH:22]2)=[N:8][CH2:7][C:6]1=O.[S:26]=P12SP3(=S)SP(=S)(S1)SP(=S)(S2)S3>c1ccncc1>[CH3:1][O:2][C:3](=[O:24])[CH2:4][N:5]1[c:11]2[cH:12][cH:13][c:14]([Cl:16])[cH:15][c:10]2[C:9]([c:17]2[cH:18][cH:19][cH:20][cH:21][cH:22]2)=[N:8][CH2:7][C:6]1=[S:26] +03933820 [ClH:1].CCCCC[O:16][N:14]=O.[CH3:12][C:11]([CH3:13])=[CH:10][CH2:9][O:2][c:3]1[cH:4][cH:5][cH:6][cH:7][cH:8]1>CC(=O)O>[CH3:12][C:11]([CH3:13])([Cl:1])[CH:10]([CH2:9][O:2][c:3]1[cH:4][cH:5][cH:6][cH:7][cH:8]1)[N:14]=[O:16] +03933820 [NH3:16].[CH3:3][C:2]([CH3:15])([Cl:1])[CH:4]([CH2:5][O:6][c:7]1[cH:8][cH:9][cH:10][cH:11][cH:12]1)[N:13]=[O:14]>CO>[ClH:1].[CH3:3][C:2]([CH3:15])([NH2:16])[C:4]([CH2:5][O:6][c:7]1[cH:8][cH:9][cH:10][cH:11][cH:12]1)=[N:13][OH:14] +03933820 Cl.CCN(CC)CC.[CH3:15][C:3]([CH3:16])([NH2:2])[C:4]([CH2:5][O:6][c:7]1[cH:8][cH:9][cH:10][cH:11][cH:12]1)=[N:13][OH:14].[NH2:17][c:18]1[n:19][c:20]([OH:28])[c:21]([N+:25](=[O:26])[O-:27])[c:22](Cl)[n:23]1>CCO>[CH3:15][C:3]([CH3:16])([NH:2][c:22]1[n:23][c:18]([NH2:17])[n:19][c:20]([OH:28])[c:21]1[N+:25](=[O:26])[O-:27])[C:4]([CH2:5][O:6][c:7]1[cH:12][cH:11][cH:10][cH:9][cH:8]1)=[N:13][OH:14] +03933824 [H-].[H-].[H-].[H-].[Li+].O.[Al+3].[CH3:7][c:8]1[nH:9][c:10]2[cH:11][cH:12][c:13]([F:33])[cH:14][c:15]2[c:16]1[CH2:17][CH2:18][C:19](=O)[N:21]1[CH2:22][CH2:23][N:24]([c:27]2[cH:28][cH:29][cH:30][cH:31][cH:32]2)[CH2:25][CH2:26]1>C1CCOC1>[CH3:7][c:8]1[nH:9][c:10]2[cH:11][cH:12][c:13]([F:33])[cH:14][c:15]2[c:16]1[CH2:17][CH2:18][CH2:19][N:21]1[CH2:22][CH2:23][N:24]([c:27]2[cH:32][cH:31][cH:30][cH:29][cH:28]2)[CH2:25][CH2:26]1 +03933826 Cl.[CH3:26][O:25][c:4]1[cH:5][c:6]2[c:7]([cH:24][c:3]1[OH:2])[CH2:8][N:9]1[CH2:10][CH2:11][c:12]3[cH:19][c:18]([O:20][CH3:21])[c:17]([O:22][CH3:23])[cH:16][c:13]3[CH:14]1[CH2:15]2.[CH3:41][O:40][c:36]1[cH:35][c:31]([C:32](=O)Cl)[cH:30][c:29]([O:28][CH3:27])[c:37]1[O:38][CH3:39]>c1ccncc1>[CH3:21][O:20][c:18]1[cH:19][c:12]2[c:13]([cH:16][c:17]1[O:22][CH3:23])[CH:14]1[CH2:15][c:6]3[cH:5][c:4]([O:25][CH3:26])[c:3]([O:2][CH2:32][c:31]4[cH:30][c:29]([O:28][CH3:27])[c:37]([O:38][CH3:39])[c:36]([O:40][CH3:41])[cH:35]4)[cH:24][c:7]3[CH2:8][N:9]1[CH2:10][CH2:11]2 +03933828 [O:20]=[C:19]1[c:10]2[o:9][n:8][c:7](-[c:1]3[cH:2][cH:3][cH:4][cH:5][cH:6]3)[c:11]2[C:12](=[O:21])[c:13]2[cH:14][cH:15][cH:16][cH:17][c:18]21>[Hg].CO>[NH:8]=[C:7]([c:1]1[cH:6][cH:5][cH:4][cH:3][cH:2]1)[C:11]1=[C:10]([OH:9])[C:19](=[O:20])[c:18]2[cH:17][cH:16][cH:15][cH:14][c:13]2[C:12]1=[O:21] +03933828 CNC.[O:21]=[C:12]1[c:11]2[c:7](-[c:1]3[cH:2][cH:3][cH:4][cH:5][cH:6]3)[n:8][o:9][c:10]2-[c:19]2[cH:18][cH:17][cH:16][cH:15][c:14]2[C:13]1=[O:20].[CH2:23]1COCCO1>[Hg]>[CH3:23][N:8]=[C:7]([c:1]1[cH:2][cH:3][cH:4][cH:5][cH:6]1)[C:11]1=[C:12]([OH:21])[C:13](=[O:20])[c:14]2[cH:15][cH:16][cH:17][cH:18][c:19]2[C:10]1=[O:9] +03933829 [Na+].[Na+].Cl.[CH3:34][CH2:33][CH2:32][CH2:31][N:28]1[CH2:27][CH2:26][CH:25]([NH2:24])[CH2:30][CH2:29]1.O=C([O-])[O-].[O:21]=[S:20](=[O:22])(Cl)[c:17]1[cH:16][cH:15][c:14]([NH:13][c:7]2[cH:8][cH:9][n:10][c:11]3[cH:12][c:3]([Cl:2])[cH:4][cH:5][c:6]32)[cH:19][cH:18]1>O.ClC(Cl)Cl>[CH3:34][CH2:33][CH2:32][CH2:31][N:28]1[CH2:27][CH2:26][CH:25]([NH:24][S:20](=[O:21])(=[O:22])[c:17]2[cH:16][cH:15][c:14]([NH:13][c:7]3[cH:8][cH:9][n:10][c:11]4[cH:12][c:3]([Cl:2])[cH:4][cH:5][c:6]43)[cH:19][cH:18]2)[CH2:30][CH2:29]1 +03933829 Cl.[CH3:37][CH2:36][N:32]1[CH2:33][CH2:34][CH2:35][CH:30]([NH2:29])[CH2:31]1.O=S(=O)(Cl)Cl.[O:20]=[S:19](=O)([OH:22])[c:15]1[cH:16][cH:17][cH:18][c:13]([NH:12][c:6]2[cH:7][cH:8][n:9][c:10]3[cH:11][c:2]([Cl:1])[cH:3][cH:4][c:5]32)[cH:14]1>>[CH3:37][CH2:36][N:32]1[CH2:33][CH2:34][CH2:35][CH:30]([NH:29][S:19](=[O:22])(=[O:20])[c:15]2[cH:16][cH:17][cH:18][c:13]([NH:12][c:6]3[cH:7][cH:8][n:9][c:10]4[cH:11][c:2]([Cl:1])[cH:3][cH:4][c:5]43)[cH:14]2)[CH2:31]1 +03933830 Cl.[H][H].CCO.[CH3:1][O:2][c:3]1[n:19][cH:18][cH:17][cH:16][c:4]1[C:5](=[O:6])[NH:7][CH2:8][CH2:9][c:10]1[cH:11][cH:12][n:13][cH:14][cH:15]1.[O:30]=[N+:29]([O-:31])[c:28]1[cH:27][c:23]([N+:24](=[O:25])[O-:26])[c:37]([OH:38])[c:33]([N+:34](=[O:35])[O-:36])[cH:32]1>CO.CCO.O=[Pt]>[CH3:1][O:2][c:3]1[n:19][cH:18][cH:17][cH:16][c:4]1[C:5](=[O:6])[NH:7][CH2:8][CH2:9][CH:10]1[CH2:11][CH2:12][NH:13][CH2:14][CH2:15]1.[O:30]=[N+:29]([O-:31])[c:28]1[cH:32][c:33]([N+:34](=[O:35])[O-:36])[c:37]([O-:38])[c:23]([N+:24](=[O:25])[O-:26])[cH:27]1.[O:30]=[N+:29]([O-:31])[c:28]1[cH:32][c:33]([N+:34](=[O:35])[O-:36])[c:37]([OH:38])[c:23]([N+:24](=[O:25])[O-:26])[cH:27]1 +03933835 [H][H].[CH3:52][C:53](=[O:55])O.O[C:2]1([c:12]2[cH:13][cH:14]c(C(OC(c3ccccc3)c3[cH:14][cH:13][c:12]([C:2]4(O)[CH:9]5[CH2:8][CH:7]6[CH2:6][CH:5]([CH2:10]5)[CH2:4][CH:3]4[CH2:11]6)[cH:17]c3)c3ccccc3)c[cH:17]2)[CH:3]2[CH2:4][CH:5]3[CH2:6][CH:7]([CH2:11]2)[CH2:8][CH:9]1[CH2:10]3>>[OH:55][c:53]1[cH:14][cH:13][c:12]([CH:2]2[CH:3]3[CH2:4][CH:5]4[CH2:6][CH:7]([CH2:11]3)[CH2:8][CH:9]2[CH2:10]4)[cH:17][cH:52]1 +03933835 CC[O:3][C:4](=[O:25])/[CH:5]=[C:6](/[CH3:7])[O:8][c:9]1[cH:10][cH:11][c:12]([C:15]23[CH2:16][CH:17]4[CH2:18][CH:19]([CH2:20][CH:21]([CH2:23]4)[CH2:22]2)[CH2:24]3)[cH:13][cH:14]1>[OH-].[Na+].CCO>[CH3:7]/[C:6](=[CH:5]/[C:4](=[O:3])[OH:25])[O:8][c:9]1[cH:14][cH:13][c:12]([C:15]23[CH2:24][CH:19]4[CH2:20][CH:21]([CH2:23][CH:17]([CH2:18]4)[CH2:16]2)[CH2:22]3)[cH:11][cH:10]1 +03933835 [O:24]=[C:23]([OH:25])[CH2:22][CH2:21][CH2:20][O:19][c:18]1[cH:17][cH:16][c:15]([C:5]23[CH2:6][CH:7]4[CH2:8][CH:9]([CH2:10][CH:11]([CH2:13]4)[CH2:12]2)[CH2:14]3)[cH:27][cH:26]1.[O:4]=[N+:2]([O-])[OH:1]>CC(=O)O.ClCCl>[O:24]=[C:23]([OH:25])[CH2:22][CH2:21][CH2:20][O:19][c:18]1[cH:17][cH:16][c:15]([C:5]23[CH2:12][CH:11]4[CH2:13][CH:7]([CH2:8][CH:9]([CH2:10]4)[CH2:14]2)[CH2:6]3)[cH:27][c:26]1[N+:2](=[O:4])[O-:1] +03933836 [NH:15]=[c:10]1[cH:11][cH:12][cH:13][cH:14][n:9]1[CH2:8][CH2:7][c:1]1[cH:2][cH:3][cH:4][cH:5][cH:6]1.[C:23](=[N:22][CH:16]1[CH2:17][CH2:18][CH2:19][CH2:20][CH2:21]1)=[N:24][CH:25]1[CH2:26][CH2:27][CH2:28][CH2:29][CH2:30]1>CC(C)(C)O>[cH:4]1[cH:5][cH:6][c:1]([CH2:7][CH2:8][n:9]2[cH:14][cH:13][cH:12][cH:11][c:10]2=[N:15][C:23](=[N:22][CH:16]2[CH2:17][CH2:18][CH2:19][CH2:20][CH2:21]2)[NH:24][CH:25]2[CH2:30][CH2:29][CH2:28][CH2:27][CH2:26]2)[cH:2][cH:3]1 +03933838 [NH2:19][C:17]([NH2:16])=[S:18].[O:5]=[C:4]([OH:6])[CH2:3][CH:2](Br)[C:7](=O)[c:8]1[cH:9][cH:10][c:11]([F:14])[cH:12][cH:13]1>CC(C)O>[NH2:19][c:17]1[n:16][c:7](-[c:8]2[cH:9][cH:10][c:11]([F:14])[cH:12][cH:13]2)[c:2]([CH2:3][C:4](=[O:5])[OH:6])[s:18]1 +03933839 [CH3:13][CH2:12][CH2:11][NH:14][CH2:15][CH:16]=[O:17].[CH3:1][S:2][c:3]1[n:4][n:5][c:6]([N:8]=[C:9]=[O:10])[s:7]1>c1ccccc1>[CH3:13][CH2:12][CH2:11][N:14]([CH2:15][CH:16]=[O:17])[C:9](=[O:10])[NH:8][c:6]1[n:5][n:4][c:3]([S:2][CH3:1])[s:7]1 +03933839 [CH3:12][NH:13][CH2:14][CH:15]=[O:16].[CH3:1][S:2](=[O:3])[c:4]1[n:5][n:6][c:7]([N:9]=[C:10]=[O:11])[s:8]1>c1ccccc1>[CH3:12][N:13]([CH2:14][CH:15]=[O:16])[C:10](=[O:11])[NH:9][c:7]1[n:6][n:5][c:4]([S:2]([CH3:1])=[O:3])[s:8]1 +03933839 [CH3:13][NH:14][CH2:15][CH:16]=[O:17].[O:10]=[C:9]=[N:8][c:6]1[n:5][n:4][c:3]([C:2]([F:11])([F:12])[F:1])[s:7]1>c1ccccc1>[CH3:13][N:14]([CH2:15][CH:16]=[O:17])[C:9](=[O:10])[NH:8][c:6]1[n:5][n:4][c:3]([C:2]([F:12])([F:11])[F:1])[s:7]1 +03933839 [CH3:10][NH:11][CH2:12][CH:13]=[O:14].[CH3:1][c:2]1[n:3][n:4][c:5]([N:7]=[C:8]=[O:9])[s:6]1>c1ccccc1>[CH3:1][c:2]1[n:3][n:4][c:5]([NH:7][C:8](=[O:9])[N:11]([CH3:10])[CH2:12][CH:13]=[O:14])[s:6]1 +03933840 [H-].[Na+].[O:72]=[C:71]([OH:73])[CH2:70]Br.O=C(c1ccccc1)C(O)c1ccccc1.O=c1[nH]c(-c2ccccc2)c(-c2ccccc2)o1.[S:38]=P12SP3(=S)SP(=S)(S1)SP(=S)(S2)S3.S[c:2]1[n:6][c:5](-[c:7]2[cH:8][cH:9][cH:10][cH:11][cH:12]2)[c:4](-[c:13]2[cH:14][cH:15][cH:16][cH:17][cH:18]2)[o:3]1>O.CO.Cc1ccccc1C.CN(C)C=O>[O:72]=[C:71]([OH:73])[CH:70]([SH:38])[c:2]1[n:6][c:5](-[c:7]2[cH:8][cH:9][cH:10][cH:11][cH:12]2)[c:4](-[c:13]2[cH:14][cH:15][cH:16][cH:17][cH:18]2)[o:3]1 +03933841 O.[NH2:6][c:7]1[cH:22][cH:21][c:10]2[n:11][c:12]([O:14][c:15]3[cH:16][cH:17][cH:18][cH:19][cH:20]3)[s:13][c:9]2[cH:8]1.[S:4]=[C:2](Cl)Cl>C1COCCO1>[S:4]=[C:2]=[N:6][c:7]1[cH:22][cH:21][c:10]2[n:11][c:12]([O:14][c:15]3[cH:16][cH:17][cH:18][cH:19][cH:20]3)[s:13][c:9]2[cH:8]1 +03933844 [NH3:20].CC[O:3][C:4](=O)[c:6]1[cH:11][c:10](=[O:12])[c:9]2[c:13]([CH3:19])[c:14]([Cl:18])[c:15]([CH3:17])[cH:16][c:8]2[o:7]1>CCO>[CH3:17][c:15]1[cH:16][c:8]2[o:7][c:6]([C:4]([NH2:20])=[O:3])[cH:11][c:10](=[O:12])[c:9]2[c:13]([CH3:19])[c:14]1[Cl:18] +03933844 [CH2:3]=[CH:2][CH2:1][c:4]1[cH:5][cH:6][c:7]([O:20][CH2:21][CH2:22][CH:23]([CH3:24])[CH3:25])[c:8]2[c:9](=[O:19])[cH:10][c:11](-[c:14]3[n:15][n:16][n:17][nH:18]3)[o:12][c:13]12.CCN>O>[CH2:3]=[CH:2][CH2:1][c:4]1[cH:5][cH:6][c:7]([O:20][CH2:21][CH2:22][CH:23]([CH3:24])[CH3:25])[c:8]2[c:9](=[O:19])[cH:10][c:11](-[c:14]3[n:18][n:17][n:16][nH:15]3)[o:12][c:13]12.[CH3:11][CH2:14][NH2:15] +03933845 [Na+].Cl.Br.[CH3:24][CH2:23][CH2:22][c:9]1[cH:8][cH:7][c:6]([O:5]CCC(C)C)[c:11]2[c:10]1[o:15][c:14](-[c:16]1[n:17][n:18][n:19][nH:20]1)[cH:13][c:12]2=[O:21].O=C([O-])O>O>[CH3:24][CH2:23][CH2:22][c:9]1[cH:8][cH:7][c:6]([OH:5])[c:11]2[c:12](=[O:21])[cH:13][c:14](-[c:16]3[n:17][n:18][n:19][nH:20]3)[o:15][c:10]12 +03933845 [NH4+].[Na+].[Cl-].[CH3:20][CH:4]([CH2:5][O:6][c:7]1[cH:8][cH:9][cH:10][c:11]2[o:16][c:15]([C:17]#[N:18])[cH:14][c:13](=[O:19])[c:12]12)[O:3]C=O.[N-:24]=[N+:23]=[N-:22]>>[CH3:20][CH:4]([OH:3])[CH2:5][O:6][c:7]1[cH:8][cH:9][cH:10][c:11]2[o:16][c:15](-[c:17]3[n:22][n:23][n:24][nH:18]3)[cH:14][c:13](=[O:19])[c:12]12 +03933845 [CH2:3]=[CH:2][CH2:1][c:4]1[cH:5][cH:6][c:7]([O:27][CH2:28][CH2:29][CH:30]([CH3:31])[CH3:32])[c:8]2[c:9](=[O:26])[cH:10][c:11](-[c:14]3[n:15][n:16][n:17][n:18]3[CH2:19][c:20]3[cH:21][cH:22][cH:23][cH:24][cH:25]3)[o:12][c:13]12>CCO>[CH3:3][CH2:2][CH2:1][c:4]1[cH:5][cH:6][c:7]([O:27][CH2:28][CH2:29][CH:30]([CH3:32])[CH3:31])[c:8]2[c:9](=[O:26])[cH:10][c:11](-[c:14]3[n:15][n:16][n:17][n:18]3[CH2:19][c:20]3[cH:21][cH:22][cH:23][cH:24][cH:25]3)[o:12][c:13]12 +03933853 [Na+].Cl.CC(=O)[O-].[CH3:27][C:26](=O)[CH2:25][c:18]1[cH:17][n:16](-[c:11]2[cH:12][cH:13][cH:14][cH:15][c:10]2[Cl:9])[c:24]2[cH:23][cH:22][cH:21][cH:20][c:19]12.[NH2:2][OH:3].Clc1ccccc1I>CCO>[CH3:27][C:26]([CH2:25][c:18]1[cH:17][n:16](-[c:11]2[cH:12][cH:13][cH:14][cH:15][c:10]2[Cl:9])[c:24]2[cH:23][cH:22][cH:21][cH:20][c:19]12)=[N:2][OH:3] +03933859 [OH].[OH-].O.O.O.O.O.O.O.O.[Na+].[Na+].[Na+].CC(=O)OC(C)=O.C[CH:46](N)[C:48](=O)[OH:49].[NH2:11][C@@H:10]([CH2:9][c:4]1[cH:5][cH:6][c:7]([OH:8])[c:2]([OH:1])[cH:3]1)[C:12](=[O:13])[OH:14].OB(O)O.OB1O[B-]2(O)OB(O)O[B-](O)(O1)O2>O>[CH3:46][C:48](=[O:49])[NH:11][C@@H:10]([CH2:9][c:4]1[cH:5][cH:6][c:7]([OH:8])[c:2]([OH:1])[cH:3]1)[C:12](=[O:13])[OH:14] +03933865 [Na+].[Na+].Cl.[CH3:10][C:9]([CH3:11])=[CH:8][CH2:7][CH2:6][CH:2]([CH3:1])[CH2:3][CH:4]=O.[NH2:13][OH:14].O=C([O-])[O-]>O.CCO>[CH3:10][C:9]([CH3:11])=[CH:8][CH2:7][CH2:6][CH:2]([CH3:1])[CH2:3][CH:4]=[N:13][OH:14] +03933886 [N:13]#[C:12][CH2:14][C:15](=[O:16])Cl.[NH2:1][c:2]1[cH:7][cH:6][c:5]([N+:8](=[O:9])[O-:10])[c:4]([NH2:11])[cH:3]1>c1ccccc1>[N:13]#[C:12][CH2:14][C:15](=[O:16])[NH:11][c:4]1[cH:3][c:2]([NH2:1])[cH:7][cH:6][c:5]1[N+:8](=[O:9])[O-:10] +03933886 [Cl-].[CH3:14][CH2:13][O:15][C:16](=[O:21])[CH2:17][C:18](=[O:19])O.[NH2:8][c:5]1[cH:6][cH:7][c:2]([NH2:1])[c:3]([N+:9](=[O:10])[O-:11])[cH:4]1>c1ccccc1>[CH3:14][CH2:13][O:15][C:16](=[O:21])[CH2:17][C:18](=[O:19])[NH:8][c:5]1[cH:6][cH:7][c:2]([NH:1][C:18](=[O:19])[CH2:17][C:16](=[O:21])[O:15][CH2:13][CH3:14])[c:3]([N+:9](=[O:10])[O-:11])[cH:4]1 +03933890 Cl.[CH3:38][CH2:37][CH2:36][CH2:35][CH2:34][CH:33]([CH2:32][CH2:31][CH:9]1[CH:10]([CH2:20][CH2:21][CH2:22][CH2:23][CH2:24][CH2:25][C:26](=[O:27])[O:28][CH2:29][CH3:30])[CH2:11][CH:12]([O:13]C2CCCCO2)[CH:8]1[O:7]C1CCCCO1)[O:39]C1CCCCO1>CCO>[CH3:38][CH2:37][CH2:36][CH2:35][CH2:34][CH:33]([OH:39])[CH2:32][CH2:31][CH:9]1[CH:10]([CH2:20][CH2:21][CH2:22][CH2:23][CH2:24][CH2:25][C:26](=[O:27])[O:28][CH2:29][CH3:30])[CH2:11][CH:12]([OH:13])[CH:8]1[OH:7] +03933890 [CH3:29][CH2:28][CH2:27][CH2:26][CH2:25][C:24](=[O:30])[CH:31]=P(c1ccccc1)(c1ccccc1)c1ccccc1.O=[CH:1][CH:3]1[CH2:7][CH:6]([O:8][CH:9]2[CH2:14][CH2:13][CH2:12][CH2:11][O:10]2)[CH:5]([OH:15])[CH:4]1[CH2:16][CH2:17][CH2:18][CH2:19][CH2:20][CH2:21][CH2:22][OH:23]>C1CCOC1>[CH3:29][CH2:28][CH2:27][CH2:26][CH2:25][C:24](=[O:30])[CH:31]=[CH:1][CH:3]1[CH2:7][CH:6]([O:8][CH:9]2[CH2:14][CH2:13][CH2:12][CH2:11][O:10]2)[CH:5]([OH:15])[CH:4]1[CH2:16][CH2:17][CH2:18][CH2:19][CH2:20][CH2:21][CH2:22][OH:23] +03933890 Cl.[CH3:21][CH2:20][CH2:19][CH2:18][CH2:17][CH:16]([OH:22])[CH:15]=[CH:14][CH:4]1[CH2:5][CH:6]([O:7]C2CCCCO2)[CH:2]([OH:1])[CH:3]1[CH2:23][CH2:24][CH2:25][CH2:26][CH2:27][CH2:28][C:29](=[O:30])[OH:31]>CCO>[CH3:21][CH2:20][CH2:19][CH2:18][CH2:17][CH:16]([OH:22])[CH:15]=[CH:14][CH:4]1[CH2:5][CH:6]([OH:7])[CH:2]([OH:1])[CH:3]1[CH2:23][CH2:24][CH2:25][CH2:26][CH2:27][CH2:28][C:29](=[O:30])[OH:31] +03933890 [CH3:19][CH2:18][CH2:17][CH2:16][CH2:15][CH:5]([CH2:6][CH2:7][C:8]12O[CH:12]1[CH2:11][CH2:10][C:9]2=[O:14])[O:4][C:1]([CH3:2])=[O:3]>CC(=O)O>[CH3:19][CH2:18][CH2:17][CH2:16][CH2:15][CH:5]([CH2:6][CH2:7][C:8]1=[CH:12][CH2:11][CH:10]([O:4][C:1]([CH3:2])=[O:3])[C:9]1=[O:14])[O:4][C:1]([CH3:2])=[O:3] +03933890 [CH3:30][CH2:29][O:28][C:26](=[O:27])[CH:25]=[CH:24][CH:23]=[CH:22][CH2:21][Br:20].[cH:4]1[cH:3][cH:2][c:1]([P:7]([c:8]2[cH:9][cH:10][cH:11][cH:12][cH:13]2)[c:14]2[cH:15][cH:16][cH:17][cH:18][cH:19]2)[cH:6][cH:5]1>c1ccccc1>[Br-:20].[CH3:30][CH2:29][O:28][C:26](=[O:27])[CH:25]=[CH:24][CH:23]=[CH:22][CH2:21][P+:7]([c:14]1[cH:19][cH:18][cH:17][cH:16][cH:15]1)([c:8]1[cH:9][cH:10][cH:11][cH:12][cH:13]1)[c:1]1[cH:6][cH:5][cH:4][cH:3][cH:2]1 +03933892 [OH-].[Na+:22].C[O:14][C:12](=[O:13])[CH2:11][C@@H:7]1[CH:8]=[CH:9][CH2:10][C@H:6]1[O:5]S(C)(=O)=O.C1CCOC1>O>[Na+:22].[O:13]=[C:12]([O-:14])[CH2:11][C@@H:7]1[CH:8]=[CH:9][CH2:10][C@@H:6]1[OH:5] +03933893 [CH3:23][CH2:22][N:24]([CH2:29][CH3:30])[CH2:25][CH2:26][CH2:27][Cl:28].[O:13]=[C:12]([OH:14])[c:9]1[cH:10][cH:11][c:5]2[c:6]([cH:8]1)[o:7][c:2](=[O:1])[c:3]1[cH:18][c:17]([C:19](=[O:20])[OH:21])[cH:16][cH:15][c:4]21>[Cl-].CC(C)O.C[N+](C)(C)Cc1ccccc1>[ClH:28].[ClH:28].[CH3:23][CH2:22][N:24]([CH2:29][CH3:30])[CH2:25][CH2:26][CH2:27][O:14][C:12](=[O:13])[c:9]1[cH:10][cH:11][c:5]2[c:6]([cH:8]1)[o:7][c:2](=[O:1])[c:3]1[cH:18][c:17]([C:19](=[O:20])[O:21][CH2:27][CH2:26][CH2:25][N:24]([CH2:22][CH3:23])[CH2:29][CH3:30])[cH:16][cH:15][c:4]21 +03933905 [CH3:17][CH:13]([C:14](N)=[O:15])[c:11]1[cH:10][cH:9][c:8]2[c:7]([cH:12]1)[CH2:6][CH2:5][c:4]1[cH:18][cH:19][cH:20][cH:21][c:3]1[C:2]2=[O:1].O=S(=O)([OH:23])O>O>[CH3:17][CH:13]([C:14](=[O:15])[OH:23])[c:11]1[cH:10][cH:9][c:8]2[c:7]([cH:12]1)[CH2:6][CH2:5][c:4]1[cH:18][cH:19][cH:20][cH:21][c:3]1[C:2]2=[O:1] +03933905 [CH3:24][NH:23][CH3:22].[CH3:17][CH:13]([C:14](=[O:15])Cl)[c:11]1[cH:10][cH:9][c:8]2[c:7]([cH:12]1)[CH2:6][CH2:5][c:4]1[cH:18][cH:19][cH:20][cH:21][c:3]1[C:2]2=[O:1]>>[CH3:17][CH:13]([C:14](=[O:15])[N:23]([CH3:22])[CH3:24])[c:11]1[cH:10][cH:9][c:8]2[c:7]([cH:12]1)[CH2:6][CH2:5][c:4]1[cH:18][cH:19][cH:20][cH:21][c:3]1[C:2]2=[O:1] +03933906 CC(=O)[NH:4][c:5]1[cH:6][cH:7][c:8]([NH:11][c:12]2[c:13]([NH:35][CH2:36][c:37]3[cH:38][cH:39][cH:40][cH:41][cH:42]3)[cH:14][c:15]([C:16](=[O:17])[OH:18])[cH:19][c:20]2[S:21](=[O:33])(=[O:34])[NH:22][c:23]2[cH:24][cH:25][c:26]([NH:29]C(C)=O)[cH:27][cH:28]2)[cH:9][cH:10]1>[OH-].[Na+]>[NH2:4][c:5]1[cH:6][cH:7][c:8]([NH:11][c:12]2[c:13]([NH:35][CH2:36][c:37]3[cH:42][cH:41][cH:40][cH:39][cH:38]3)[cH:14][c:15]([C:16](=[O:17])[OH:18])[cH:19][c:20]2[S:21](=[O:33])(=[O:34])[NH:22][c:23]2[cH:24][cH:25][c:26]([NH2:29])[cH:27][cH:28]2)[cH:9][cH:10]1 +03933906 [OH-].[Na+].CC(=O)[NH:4][c:5]1[cH:6][cH:7][c:8]([NH:11][c:12]2[c:13]([NH:25][CH2:26][c:27]3[cH:28][cH:29][cH:30][cH:31][cH:32]3)[cH:14][c:15]([C:16](=[O:17])[OH:18])[cH:19][c:20]2[S:21]([NH2:22])(=[O:23])=[O:24])[cH:9][cH:10]1>>[NH2:4][c:5]1[cH:6][cH:7][c:8]([NH:11][c:12]2[c:13]([NH:25][CH2:26][c:27]3[cH:32][cH:31][cH:30][cH:29][cH:28]3)[cH:14][c:15]([C:16](=[O:17])[OH:18])[cH:19][c:20]2[S:21]([NH2:22])(=[O:24])=[O:23])[cH:9][cH:10]1 +03933906 CC(=O)[NH:4][c:5]1[cH:6][cH:7][c:8]([NH:11][c:12]2[c:13]([CH2:28][CH:29]3[CH2:34][CH:33]4[CH:32]=[CH:31][CH:30]3[CH2:35]4)[cH:14][c:15]([C:16](=[O:17])[OH:18])[cH:19][c:20]2[S:21](=[O:26])(=[O:27])[NH:22]C(C)=O)[cH:9][cH:10]1>[OH-].[Na+]>[NH2:4][c:5]1[cH:6][cH:7][c:8]([NH:11][c:12]2[c:13]([CH2:28][CH:29]3[CH2:34][CH:33]4[CH:32]=[CH:31][CH:30]3[CH2:35]4)[cH:14][c:15]([C:16](=[O:17])[OH:18])[cH:19][c:20]2[S:21]([NH2:22])(=[O:26])=[O:27])[cH:9][cH:10]1 +03933908 [OH-].[K+].CI.[CH3:26][O:27][CH2:28]Cl.[O:8]=[C:7]([NH:6][C:4](=[O:5])[c:3]1[c:17]([Cl:21])[cH:18][cH:19][cH:20][c:2]1[Cl:1])[NH:9][c:10]1[cH:11][cH:12][c:13]([Cl:16])[cH:14][cH:15]1>O.CN(C)C=O>[CH3:28][O:27][CH2:26][N:6]([C:7](=[O:8])[NH:9][c:10]1[cH:15][cH:14][c:13]([Cl:16])[cH:12][cH:11]1)[C:4](=[O:5])[c:3]1[c:17]([Cl:21])[cH:18][cH:19][cH:20][c:2]1[Cl:1] +03933913 [O:36]=[N+:35]([O-:37])[c:23]1[cH:22][c:21]([CH2:20][CH2:19][NH:18][CH2:11][c:12]2[cH:13][cH:14][cH:15][cH:16][cH:17]2)[cH:26][cH:25][c:24]1[O:27][CH2:28][c:29]1[cH:30][cH:31][cH:32][cH:33][cH:34]1.Br[CH2:9][CH2:8][CH2:7][CH2:6][CH2:5][CH2:4][CH2:3][CH2:2]Br>>[O:36]=[N+:35]([O-:37])[c:23]1[cH:22][c:21]([CH2:20][CH2:19][N:18]([CH2:9][CH2:8][CH2:7][CH2:6][CH2:5][CH2:4][CH2:3][CH2:2][N:18]([CH2:19][CH2:20][c:21]2[cH:26][cH:25][c:24]([O:27][CH2:28][c:29]3[cH:30][cH:31][cH:32][cH:33][cH:34]3)[c:23]([N+:35](=[O:36])[O-:37])[cH:22]2)[CH2:11][c:12]2[cH:17][cH:16][cH:15][cH:14][cH:13]2)[CH2:11][c:12]2[cH:17][cH:16][cH:15][cH:14][cH:13]2)[cH:26][cH:25][c:24]1[O:27][CH2:28][c:29]1[cH:30][cH:31][cH:32][cH:33][cH:34]1 +03933913 [ClH:1].[NH2:27][CH2:26][c:21]1[cH:20][c:19]([CH:18]([OH:28])[CH2:17][N:16]([CH2:15][CH2:14][CH2:13][CH2:12][CH2:11][CH2:10][N:9](Cc2ccccc2)[CH2:36][CH:37]([OH:38])[c:39]2[cH:44][cH:43][c:42]([OH:45])[c:41]([CH2:46][NH2:47])[cH:40]2)Cc2ccccc2)[cH:24][cH:23][c:22]1[OH:25]>>[ClH:1].[ClH:1].[ClH:1].[ClH:1].[NH2:47][CH2:46][c:41]1[cH:40][c:39]([CH:37]([OH:38])[CH2:36][NH:9][CH2:10][CH2:11][CH2:12][CH2:13][CH2:14][CH2:15][NH:16][CH2:17][CH:18]([OH:28])[c:19]2[cH:24][cH:23][c:22]([OH:25])[c:21]([CH2:26][NH2:27])[cH:20]2)[cH:44][cH:43][c:42]1[OH:45] +03933922 [CH3:15][CH2:14]OP(OCC)OCC.CCOP(=O)([O-])Cl.[Cl:9][C:4]1=[C:3]([Cl:10])[C:2]([Cl:11])(Cl)[C:6]([Cl:7])=[C:5]1[Cl:8]>>[CH3:15][CH2:14][C:2]1([Cl:11])[C:3]([Cl:10])=[C:4]([Cl:9])[C:5]([Cl:8])=[C:6]1[Cl:7] +03933926 [O:18]=Nc1ccccc1O.[O:13]=[N+:11]([O-:12])[c:5]1[cH:4][c:3]([N+:14](=[O:16])[O-:15])[c:2]([OH:1])[c:7]([N+:8](=[O:10])[O-:9])[cH:6]1>>[O:16]=[N+:14]([O-:18])[OH:15].[O:12]=[N+:11]([O-:13])[c:5]1[cH:4][c:3]([N+:14](=[O:15])[O-:16])[c:2]([OH:1])[c:7]([N+:8](=[O:9])[O-:10])[cH:6]1 +03934008 [CH3:1][C:2](=[O:4])[O-:3].O=C([O-])C[c:11]1[cH:10][cH:9][c:8]([N+:5](=[O:6])[O-:7])[cH:13][cH:12]1>CN(C)C=O>[CH3:1][C:2](=[O:4])[O:3][c:11]1[cH:10][cH:9][c:8]([N+:5](=[O:6])[O-:7])[cH:13][cH:12]1.[O:6]=[N+:5]([O-:7])[c:8]1[cH:9][cH:10][c:2]([OH:4])[cH:1][cH:13]1 +03934033 [Na].CCc1ccc(O)cc1.[CH3:2][CH2:1][c:3]1[cH:4][cH:5][c:6]([O:7][CH2:8][CH:9]=[C:10]([CH3:17])[CH2:11][CH2:12][CH:13]=[C:14]([CH3:15])[CH3:16])[cH:18][cH:19]1.CC(C)=CCC/C(C)=C/CBr>CCO>[CH3:2][CH2:1][c:3]1[cH:4][cH:5][c:6]([O:7][CH2:8]/[CH:9]=[C:10](\[CH3:17])[CH2:11][CH2:12][CH:13]=[C:14]([CH3:15])[CH3:16])[cH:18][cH:19]1 +03935197 [Na+].C[O-].[CH3:4][c:5]1[cH:10][c:9](=[O:11])[n:8]2[cH:12][cH:13][cH:14][c:15]([CH3:16])[c:7]2[n:6]1.O=[CH:17][c:19]1[cH:20][cH:21][cH:22][cH:23][cH:24]1>CO>[CH3:16][c:15]1[cH:14][cH:13][cH:12][n:8]2[c:9](=[O:11])[cH:10][c:5](/[CH:4]=[CH:17]/[c:19]3[cH:20][cH:21][cH:22][cH:23][cH:24]3)[n:6][c:7]12 +03935197 [CH3:12][CH2:11][CH2:10][C:9](=O)[CH2:14][C:15](=[O:16])OC.Cc1ccc(S(=O)(=O)O)cc1.[CH3:8][c:7]1[cH:6][cH:5][cH:4][n:3][c:2]1[NH2:1]>COCCO>[CH3:12][CH2:11][CH2:10][c:9]1[cH:14][c:15](=[O:16])[n:3]2[cH:4][cH:5][cH:6][c:7]([CH3:8])[c:2]2[n:1]1 +03935209 [CH3:2][C:1](=[O:3])[NH:4][c:5]1[cH:10][cH:9][c:8]([S:11][C:12]#[N:13])[cH:7][c:6]1[N+:14](=[O:15])[O-:16].CN(C)C=O.Brc1n[cH:26][cH:25][s:24]1>O>[CH3:2][C:1](=[O:3])[NH:4][c:5]1[cH:10][cH:9][c:8]([S:11][c:12]2[n:13][cH:26][cH:25][s:24]2)[cH:7][c:6]1[N+:14](=[O:15])[O-:16] +03935209 [H-].[Na+].CN(C)C=O.[NH2:1][c:2]1[cH:7][c:6]([SH:8])[cH:5][cH:4][c:3]1[N+:9](=[O:10])[O-:11].Br[c:20]1[cH:24][cH:23][s:22][cH:21]1>O>[NH2:1][c:2]1[cH:7][c:6]([S:8][c:20]2[cH:24][cH:23][s:22][cH:21]2)[cH:5][cH:4][c:3]1[N+:9](=[O:10])[O-:11] +03935209 [H-].[BH4-].[Na+].[Na+].Cl.[CH3:2][C:1](=[O:3])[NH:4][c:5]1[cH:10][cH:9][c:8]([S:11][C:12]#N)[cH:7][c:6]1[N+:14](=[O:15])[O-:16].Brc1[cH:24][cH:25][n:26][cH:27][cH:28]1>O.CC(C)=O.CN(C)C=O>[CH3:2][C:1](=[O:3])[NH:4][c:5]1[cH:10][cH:9][c:8]([S:11][c:12]2[cH:24][cH:25][n:26][cH:27][cH:28]2)[cH:7][c:6]1[N+:14](=[O:15])[O-:16] +03935209 [K+].[K+].CN(C)C=O.[CH3:12][n:13]1[cH:17][cH:16][n:15][c:14]1[SH:18].[NH2:1][c:2]1[cH:7][c:6](Cl)[cH:5][cH:4][c:3]1[N+:9](=[O:10])[O-:11].O=C([O-])[O-]>O>[CH3:12][n:13]1[cH:17][cH:16][n:15][c:14]1[S:18][c:6]1[cH:5][cH:4][c:3]([N+:9](=[O:10])[O-:11])[c:2]([NH2:1])[cH:7]1 +03935211 [CH3:13][CH2:12][C:11](=O)OC(=O)CC.[NH2:8][C:7](=[N:9][OH:10])[c:2]1[cH:3][n:4][cH:5][cH:6][n:1]1>Cc1ccccc1C>[CH3:11][CH2:12][c:13]1[n:8][c:7](-[c:2]2[cH:3][n:4][cH:5][cH:6][n:1]2)[n:9][o:10]1 +03935211 [NH2:14][C:13](=[N:15]O)[CH:10]1[CH2:11][CH2:12]1.[O:8]=[C:7](Cl)[c:2]1[cH:3][n:4][cH:5][cH:6][n:1]1>Cc1ccccc1C>[cH:5]1[cH:6][n:1][c:2](-[c:7]2[n:15][c:13]([CH:10]3[CH2:11][CH2:12]3)[n:14][o:8]2)[cH:3][n:4]1 +03935214 CCN(CC)C(C)N1CCNC(=O)C1c1ccccc1.O=[C:13]1[NH:14][CH2:15][CH2:16][N:11]([CH2:10][C:9]2([O:8][CH2:1][c:2]3[cH:3][cH:4][cH:5][cH:6][cH:7]3)[CH:28]=[CH:27][CH:26]=[CH:25][CH2:24]2)[CH:12]1[c:18]1[cH:19][cH:20][cH:21][cH:22][cH:23]1>>[cH:5]1[cH:6][cH:7][c:2]([CH2:1][O:8][C:9]2([CH2:10][N:11]3[CH2:16][CH2:15][NH:14][CH2:13][CH:12]3[c:18]3[cH:19][cH:20][cH:21][cH:22][cH:23]3)[CH:24]=[CH:25][CH:26]=[CH:27][CH2:28]2)[cH:3][cH:4]1 +03935214 [Cl-].CCN(CC)[CH:4]([CH3:5])[N:6]1[CH2:11][CH2:10][NH:9][CH2:8][CH:7]1[c:12]1[cH:13][cH:14][cH:15][cH:16][cH:17]1.[CH3:22][C:21](=[O:23])[O:24][c:25]1[cH:33][cH:32][cH:31][cH:30][c:26]1[C:27](=O)[OH:29]>CCC(C)=O>[CH3:5][CH2:4][N:6]([CH2:7][CH3:8])[CH2:5][CH2:4][N:6]1[CH2:11][CH2:10][N:9]([C:27](=[O:29])[c:26]2[cH:30][cH:31][cH:32][cH:33][c:25]2[O:24][C:21]([CH3:22])=[O:23])[CH2:8][CH:7]1[c:12]1[cH:17][cH:16][cH:15][cH:14][cH:13]1.[CH2:7]1[CH2:8][NH:9][CH2:10][CH2:11][NH:6]1 +03935214 [CH3:2][CH2:1][N:3]([CH2:4][CH3:5])[CH2:6][CH2:7][NH:8][CH2:9][CH2:10][NH2:11].[O:15]=[C:14](Cl)[CH:13](Cl)[c:17]1[cH:18][cH:19][cH:20][cH:21][cH:22]1>>[CH3:5][CH2:4][N:3]([CH2:1][CH3:2])[CH2:6][CH2:7][N:8]1[CH2:9][CH2:10][NH:11][C:14](=[O:15])[CH:13]1[c:17]1[cH:18][cH:19][cH:20][cH:21][cH:22]1 +03935216 Cc1ccc(C(=O)[O:9][C:7](=[O:8])[c:4]2[cH:3][cH:2][c:1]([CH3:19])[cH:6][cH:5]2)cc1.CS(=O)(=O)O>C[N+](=O)[O-]>[CH3:19][c:1]1[cH:2][cH:3][c:4]([C:7](=[O:8])[OH:9])[cH:5][cH:6]1 +03935218 [CH3:6][CH2:5][CH2:4][CH2:3][CH2:2][CH2:1][c:7]1[cH:8][cH:9][c:10]([C:13](=[O:25])[c:14]2[cH:19][cH:18][cH:17][cH:16][c:15]2[C:20]2=[N:24][CH2:23][CH2:22][NH:21]2)[cH:11][cH:12]1.Nc1ccc(C=O)c(C2=NCCN2)c1.O=C(Cc1ccccc1)c1ccc(Cl)cc1C1=NCCN1.O=C(c1sccc1-c1ccccc1C1=NCCN1)c1sccc1-c1ccccc1C1=NCCN1>>[CH3:6][CH2:5][CH2:4][CH2:3][CH2:2][CH2:1][c:7]1[cH:12][cH:11][c:10]([C:13]2([OH:25])[c:14]3[cH:19][cH:18][cH:17][cH:16][c:15]3[C:20]3=[N:21][CH2:22][CH2:23][N:24]32)[cH:9][cH:8]1 +03935218 Cl.Cl.[K+].[O:23]=[Mn](=O)(=O)[O-].[Cl:3][c:4]1[cH:5][cH:6][c:7]([CH:10]2[NH:11][CH2:12][CH2:13][NH:14][CH2:15][c:16]3[cH:21][cH:20][cH:19][cH:18][c:17]32)[cH:8][cH:9]1>O>[OH:23][C:10]1([c:7]2[cH:8][cH:9][c:4]([Cl:3])[cH:5][cH:6]2)[c:17]2[cH:18][cH:19][cH:20][cH:21][c:16]2[C:15]2=[N:14][CH2:13][CH2:12][N:11]21 +03935221 [NH3:20].[O:12]=[C:11](O)[c:8]1[cH:7][cH:6][c:5]([CH2:4][CH2:3][CH:2]([Br:1])[CH2:14][Br:15])[cH:10][n:9]1.O=S(Cl)Cl.c1ccccc1>ClC(Cl)Cl>[NH2:20][C:11](=[O:12])[c:8]1[cH:7][cH:6][c:5]([CH2:4][CH2:3][CH:2]([Br:1])[CH2:14][Br:15])[cH:10][n:9]1 +03935222 [H][H].[CH3:2][CH2:1][n:3]1[n:4][cH:5][c:6]2[c:7]1[nH:8][c:9](=[O:16])[cH:10][c:11]2[C:12]([F:13])([F:14])[F:15]>[Rh].CCO>[CH3:2][CH2:1][n:3]1[n:4][cH:5][c:6]2[c:7]1[NH:8][C:9](=[O:16])[CH2:10][CH:11]2[C:12]([F:14])([F:15])[F:13] +03935232 [O:2]=[CH:1][NH:3][c:4]1[s:5][cH:6][cH:7][c:8]1[C:9](=[O:10])[OH:11].O=[N+:18]([O-:19])[OH:17].O=S(=O)(O)O>>[O:2]=[CH:1][NH:3][c:4]1[s:5][c:6]([N+:18](=[O:17])[O-:19])[cH:7][c:8]1[C:9](=[O:10])[OH:11] +03935236 [K+].[K+].[CH2:16]=[CH:15][CH2:14]Br.[CH3:1][O:2][C:3](=[O:13])[c:4]1[cH:5][c:6]([OH:12])[cH:7][c:8]([O:10][CH3:11])[cH:9]1.O=C([O-])[O-]>>[CH2:14]=[CH:15][CH2:16][O:12][c:6]1[cH:7][c:8]([O:10][CH3:11])[cH:9][c:4]([C:3](=[O:13])[O:2][CH3:1])[cH:5]1 +03935245 [Mg+2].[Cl-].[K+].[K+].[K+].[K+].O=[CH:7][C@H:9]([OH:10])[C@@H:11]([OH:12])[C@H:7](O)[C@H:9]([OH:10])[CH2:11][OH:12].O=P([O-])([O-])O.O=P([O-])(O)O.O=S(=O)([O-])[O-]>CN(C)C=O>[CH3:9][CH2:11][O:12][C:9]([CH3:7])=[O:10].[CH3:11][CH:7]([CH3:9])[O:10][CH:9]([CH3:11])[CH3:7] +03935253 [CH2:13]=[C:4]1[CH2:3][CH:2]([OH:1])[CH2:11][CH2:10][C:9]2=[C:8]([CH3:12])[CH2:7][CH2:6][CH:5]21.CCCCC.CC(=O)O[C:15]([CH3:14])=[O:16]>c1ccncc1>[CH2:13]=[C:4]1[CH2:3][CH:2]([O:1][C:15]([CH3:14])=[O:16])[CH2:11][CH2:10][C:9]2=[C:8]([CH3:12])[CH2:7][CH2:6][CH:5]21 +03935253 [CH3:12][C:8]1=[C:9]2[CH2:10][CH2:11][CH:2]([OH:1])[CH2:3][CH:4]([CH3:13])[CH:5]2[CH2:6][CH2:7]1>CCO>[CH3:12][CH:8]1[CH2:7][CH2:6][CH:5]2[CH:9]1[CH2:10][CH2:11][CH:2]([OH:1])[CH2:3][CH:4]2[CH3:13] +03935253 [CH2:16]=[C:4]1[CH2:3][CH:2]([OH:1])[CH:11]([CH:12]([CH3:13])[CH3:14])[CH2:10][C:9]2=[C:8]([CH3:15])[CH2:7][CH2:6][CH:5]21.O=C([O-])O>CC(C)=O>[CH2:16]=[C:4]1[CH2:3][C:2](=[O:1])[CH:11]([CH:12]([CH3:13])[CH3:14])[CH2:10][C:9]2=[C:8]([CH3:15])[CH2:7][CH2:6][CH:5]21 +03935261 CCOCC.[O:15]=[CH:14][CH2:13][CH2:12][CH2:11][CH2:10][CH2:9][CH2:8]OC1CCCCO1.[O:27]=[C:28]1[CH2:29][CH2:30][CH2:31][CH2:32]1.C1=C(N2CCOCC2)CCC1>c1ccccc1>[O:15]=[C:14]1[CH2:13][CH2:12][CH:11]=[C:10]1[CH2:9][CH2:8][CH2:32][CH2:31][CH2:30][CH2:29][CH2:28][OH:27] +03935261 [H-].CC(=O)[OH:28].CC(C)C[Al+]CC(C)C.N#[C:24][CH:19]1[CH2:20][CH2:21][C:22](=[O:23])[CH:18]1[CH2:17][CH2:16][CH2:15][CH2:14][CH2:13][CH2:12][OH:11]>CCOCC.c1ccccc1>[O:28]=[CH:24][CH:19]1[CH2:20][CH2:21][CH:22]([OH:23])[CH:18]1[CH2:17][CH2:16][CH2:15][CH2:14][CH2:13][CH2:12][OH:11] +03935261 CCN(CC)CC.CC(=O)O.O=S(=O)=O.[OH:24][CH2:23][CH2:22][CH2:21][CH2:20][CH2:19][CH2:18][O:17][CH:12]1[CH2:13][CH2:14][CH2:15][CH2:16][O:11]1.c1ccncc1>O.CCOCC.CS(C)=O>[O:24]=[CH:23][CH2:22][CH2:21][CH2:20][CH2:19][CH2:18][O:17][CH:12]1[CH2:13][CH2:14][CH2:15][CH2:16][O:11]1 +03935261 [BH4-].[Na+].[CH3:16][CH2:15][CH2:14][CH2:13][CH:12]([CH2:17][CH3:18])[C:11](=[O:19])[CH:10]=[CH:9][CH:6]1[CH2:7][CH2:8][C:4](=[O:3])[CH:5]1[CH2:20][CH2:21][CH2:22][CH2:23][CH2:24][CH2:25][C:26](=[O:27])[OH:28]>[OH-].[Na+].CCO>[CH3:16][CH2:15][CH2:14][CH2:13][CH:12]([CH2:17][CH3:18])[CH:11]([OH:19])[CH:10]=[CH:9][CH:6]1[CH2:7][CH2:8][CH:4]([OH:3])[CH:5]1[CH2:20][CH2:21][CH2:22][CH2:23][CH2:24][CH2:25][C:26](=[O:27])[OH:28] +03935261 [CH2:28]=[N+]=[N-].[CH3:14][CH2:13][CH2:12][CH2:11][CH2:10][CH:9]([OH:15])[CH:8]=[CH:7][CH:4]1[CH2:5]CC(O)[CH:3]1[CH2:16][CH2:17][CH2:18][CH2:19][CH2:20][CH2:21][C:22](=[O:23])[O:24][CH3:25].[CH3:33][CH2:32][O:31][CH2:30]C>>[CH3:14][CH2:13][CH2:12][CH2:11][CH2:10][CH:9]([CH:8]=[CH:7][CH:4]1[CH2:5][CH2:33][CH:32]([O:31][CH3:30])[CH:3]1[CH2:16][CH2:17][CH2:18][CH2:19][CH2:20][CH2:21][C:22](=[O:23])[O:24][CH3:25])[O:15][CH3:28] +03935261 [H][H].[CH3:14][CH2:13][CH2:12][CH2:11][CH:10]([CH2:15][CH3:16])[CH:9]([OH:17])[CH:8]=[CH:7][CH:4]1[CH2:5][CH2:6][CH:2]([OH:1])[CH:3]1[CH2:18][CH2:19][CH2:20][CH2:21][CH2:22][CH2:23][C:24](=[O:25])[OH:26]>CCO>[CH3:14][CH2:13][CH2:12][CH2:11][CH:10]([CH2:15][CH3:16])[CH:9]([OH:17])[CH2:8][CH2:7][CH:4]1[CH2:5][CH2:6][CH:2]([OH:1])[CH:3]1[CH2:18][CH2:19][CH2:20][CH2:21][CH2:22][CH2:23][C:24](=[O:25])[OH:26] +03935261 [BH4-].[Na+].[CH3:16][CH2:15][CH2:14][CH2:13][CH2:12][C:11](=[O:17])[CH:10]=[CH:9][CH:6]1[CH2:7][CH2:8][C:4](=[O:3])[CH:5]1[CH2:18][CH2:19][CH2:20][CH2:21][CH2:22][CH2:23][C:24](=[O:25])[OH:26]>[OH-].[Na+].CCO>[CH3:16][CH2:15][CH2:14][CH2:13][CH2:12][CH:11]([OH:17])[CH:10]=[CH:9][CH:6]1[CH2:7][CH2:8][CH:4]([OH:3])[CH:5]1[CH2:18][CH2:19][CH2:20][CH2:21][CH2:22][CH2:23][C:24](=[O:25])[OH:26] +03935267 [O:24]=C(OO)c1cccc(Cl)c1.[cH:7]1[cH:8][c:9]2[c:14]([c:5]([O:4][CH2:3][CH:2]3[CH2:15][O:1]3)[cH:6]1)[CH2:13][CH:12]=[CH:11][CH2:10]2>ClCCl>[cH:7]1[cH:8][c:9]2[c:14]([c:5]([O:4][CH2:3][CH:2]3[CH2:15][O:1]3)[cH:6]1)[CH2:13][CH:12]1[O:24][CH:11]1[CH2:10]2 +03935267 [Na+].O=C([O-])O.[O-][Cl+3]([O-])([O-])O.[OH:12][c:8]1[cH:7][cH:6][cH:5][c:4]2[c:9]1[CH2:10][CH:11]1[O:1][CH:2]1[CH2:3]2.C1CC[O:13]C1>O>[OH:12][c:8]1[cH:7][cH:6][cH:5][c:4]2[c:9]1[CH2:10][C@@H:11]([OH:1])[C@H:2]([OH:13])[CH2:3]2 +03935268 [OH:36][CH2:35][CH2:34][CH2:33][Cl:32].[cH:4]1[cH:3][cH:2][c:1]([CH:7]([CH2:8][CH2:9][NH:10][CH2:11][CH2:12][CH:13]([c:14]2[cH:15][cH:16][cH:17][cH:18][cH:19]2)[c:20]2[cH:21][cH:22][cH:23][cH:24][cH:25]2)[c:26]2[cH:27][cH:28][cH:29][cH:30][cH:31]2)[cH:6][cH:5]1>>[ClH:32].[OH:36][CH2:35][CH2:34][CH2:33][N:10]([CH2:9][CH2:8][CH:7]([c:26]1[cH:31][cH:30][cH:29][cH:28][cH:27]1)[c:1]1[cH:6][cH:5][cH:4][cH:3][cH:2]1)[CH2:11][CH2:12][CH:13]([c:20]1[cH:25][cH:24][cH:23][cH:22][cH:21]1)[c:14]1[cH:19][cH:18][cH:17][cH:16][cH:15]1 +03935271 [Na].[CH3:3][CH:2]([CH3:4])[OH:5].Br[CH2:12][CH2:11][CH2:10][CH2:9][CH2:8][CH2:7][Br:6]>>[CH3:3][CH:2]([CH3:4])[O:5][CH2:12][CH2:11][CH2:10][CH2:9][CH2:8][CH2:7][Br:6] +03935273 [Al+3].[Cl-].[Cl-].[Cl-].[CH3:13][O:12][c:3]1[cH:4][cH:5][c:6]2[cH:7][cH:8][cH:9][cH:10][c:11]2[c:2]1[Cl:1].[CH3:14][C:15](=[O:17])Cl>O=[N+]([O-])c1ccccc1>[CH3:13][O:12][c:3]1[cH:4][cH:5][c:6]2[cH:7][c:8]([C:15]([CH3:14])=[O:17])[cH:9][cH:10][c:11]2[c:2]1[Cl:1] +03935311 [ClH:1].CCN([CH2:17][CH3:18])CC.[CH3:10][c:7]1[n:8][cH:9][c:4]([CH2:3][OH:2])[cH:5][c:6]1[OH:11]>O>[ClH:1].[CH3:18][CH2:17][CH2:6][CH2:5][CH2:4][C:3](=[O:2])[O:11][c:6]1[cH:5][c:4]([CH2:3][OH:2])[cH:9][n:8][c:7]1[CH3:10] +03935311 [Na+].Br.[CH3:17][O:16][C:14](=[O:15])[O:13][CH2:12][c:10]1[cH:9][n:8][c:7]([CH3:18])[c:6]([O:5]C(=O)OC)[cH:11]1.O=C([O-])O>CCO>[CH3:17][O:16][C:14](=[O:15])[O:13][CH2:12][c:10]1[cH:9][n:8][c:7]([CH3:18])[c:6]([OH:5])[cH:11]1 +03935314 N#[C:10][NH:12][C:13](=[NH:14])[NH2:15].[NH2:8][c:5]1[cH:6][cH:7][c:2]([F:1])[cH:3][c:4]1[NH2:9]>O>[NH:14]=[C:13]([NH2:15])[NH:12][c:10]1[n:8][c:5]2[cH:6][cH:7][c:2]([F:1])[cH:3][c:4]2[nH:9]1 +03935314 [Na+].Cl.N[CH2:28][CH2:27]N.[NH2:19][C:18]([NH2:20])=[N:17][c:9]1[n:10][c:11]2[cH:16][cH:15][cH:14][cH:13][c:12]2[n:8]1[CH2:1][c:2]1[cH:3][cH:4][cH:5][cH:6][cH:7]1.O=N[O-]>O.CCCCCO>[cH:5]1[cH:6][cH:7][c:2]([CH2:1][n:8]2[c:12]3[cH:13][cH:14][cH:15][cH:16][c:11]3[n:10][c:9]2[NH:17][C:18]2=[N:19][CH2:28][CH2:27][NH:20]2)[cH:3][cH:4]1 +03935314 CC(=O)O[C:18]([CH3:17])=[O:19].[NH2:1][c:2]1[cH:16][cH:15][c:5]2[n:6][c:7]([C:9]3=[N:13][CH2:12][CH2:11][N:10]3[NH2:14])[nH:8][c:4]2[cH:3]1>CCO>[CH3:17][C:18](=[O:19])[NH:1][c:2]1[cH:16][cH:15][c:5]2[n:6][c:7]([C:9]3=[N:13][CH2:12][CH2:11][N:10]3[NH2:14])[nH:8][c:4]2[cH:3]1 +03936398 [CH3:6][C:5](=[O:7])[CH2:4][CH2:3][CH:2]([CH3:8])[CH3:1].O=C(O)CC(O)(CC(=O)O)C(=O)O.[OH:13][CH2:12][CH:11]=[CH:10][CH2:9]O.Oc1ccc(O)cc1>O.C1CCCCC1>[CH3:1][CH:2]([CH3:8])[CH2:3][CH2:4][C:5]1([CH3:6])[O:7][CH2:9][CH:10]=[CH:11][CH2:12][O:13]1 +03936439 [CH3:32][C:31](=[O:33])OC(C)=O.[OH:22][CH2:21][C@H:20]1[O:23][C@@H:15]([n:14]2[cH:13][n:12][c:11]3[c:24]2[n:25][c:8]([NH:7][CH:1]2[CH2:2][CH2:3][CH2:4][CH2:5][CH2:6]2)[n:9][c:10]3[OH:26])[C@H:16]([OH:17])[C@@H:18]1[OH:19]>>[CH3:32][C:31](=[O:33])[O:22][CH2:21][C@H:20]1[O:23][C@@H:15]([n:14]2[cH:13][n:12][c:11]3[c:24]2[n:25][c:8]([NH:7][CH:1]2[CH2:6][CH2:5][CH2:4][CH2:3][CH2:2]2)[n:9][c:10]3[OH:26])[C@H:16]([O:17][C:16]([CH3:15])=[O:17])[C@@H:18]1[O:19][C:18]([CH3:20])=[O:19] +03936444 COC.[NH2:20][NH:19][c:15]1[cH:16][cH:17][cH:18][c:13]([Cl:12])[cH:14]1.O[C:4]1=[N:10][CH2:9][CH2:8][CH2:7][CH2:6][CH2:5]1>CC(=O)O>[Cl:12][c:13]1[cH:18][cH:17][cH:16][c:15]([NH:19][N:20]=[C:4]2[CH2:5][CH2:6][CH2:7][CH2:8][CH2:9][NH:10]2)[cH:14]1 +03936452 [ClH:12].[CH3:10][C:9](=O)[CH2:8][C:6]([CH3:5])=O.[NH2:3][C:2]([NH2:1])=[S:4]>CCO>[ClH:12].[CH3:5][c:6]1[cH:8][c:9]([CH3:10])[n:3][c:2]([SH:4])[n:1]1 +03936454 CCCCO.CCN(CC)CC.[CH3:21][O:20][c:19]1[cH:18][cH:17][c:14]([CH2:15][NH2:16])[cH:13][c:12]1[O:11][CH3:10].[NH2:8][c:7]1[c:6]([Cl:9])[n:5][cH:4][n:3][c:2]1Cl>O.O.CO>[CH3:21][O:20][c:19]1[cH:18][cH:17][c:14]([CH2:15][NH:16][c:2]2[n:3][cH:4][n:5][c:6]([Cl:9])[c:7]2[NH2:8])[cH:13][c:12]1[O:11][CH3:10] +03936461 [NH2-].N.[Na].[CH3:13][O:12][c:11]1[cH:10][cH:9][c:8]([CH2:14][C:15]#N)[cH:7][c:6]1[O:5][CH3:4].[CH3:41][O:40][c:39]1[cH:38][c:37]2[n:36][cH:35][cH:34][c:33](Cl)[c:32]2[cH:31][c:30]1[O:29][CH3:28].Clc1[cH:19][cH:20][n:21][c:22]2[cH:23][cH:24][cH:25][cH:26][c:27]12>>[CH3:13][O:12][c:11]1[cH:10][cH:9][c:8]([CH2:14][c:15]2[cH:19][cH:20][n:21][c:22]3[cH:23][cH:24][cH:25][cH:26][c:27]23)[cH:7][c:6]1[O:5][CH3:4].[CH3:13][O:12][c:11]1[cH:10][cH:9][c:8]([CH2:14][c:33]2[cH:34][cH:35][n:36][c:37]3[cH:38][c:39]([O:40][CH3:41])[c:30]([O:29][CH3:28])[cH:31][c:32]23)[cH:7][c:6]1[O:5][CH3:4] +03936464 [CH3:2][C:1](=[O:3])[N:4]1[CH2:5][CH:6]([CH2:13][CH2:14]Br)[c:7]2[cH:8][cH:9][cH:10][cH:11][c:12]21.[OH:16][C:17]1([c:23]2[cH:24][cH:25][c:26]([C:29]([F:30])([F:31])[F:32])[cH:27][cH:28]2)[CH2:18][CH2:19][NH:20][CH2:21][CH2:22]1>>[CH3:2][C:1](=[O:3])[N:4]1[CH2:5][CH:6]([CH2:13][CH2:14][N:20]2[CH2:19][CH2:18][C:17]([OH:16])([c:23]3[cH:28][cH:27][c:26]([C:29]([F:30])([F:32])[F:31])[cH:25][cH:24]3)[CH2:22][CH2:21]2)[c:7]2[cH:8][cH:9][cH:10][cH:11][c:12]21 +03936464 [OH-].[Na+].CCO.CC(=O)O.[OH:24][C:11]1([c:14]2[cH:15][cH:16][c:17]([C:20]([F:21])([F:22])[F:23])[cH:18][cH:19]2)[CH2:10][CH2:9][N:8](Cc2ccccc2)[CH2:13][CH2:12]1>O>[OH:24][C:11]1([c:14]2[cH:19][cH:18][c:17]([C:20]([F:22])([F:21])[F:23])[cH:16][cH:15]2)[CH2:10][CH2:9][NH:8][CH2:13][CH2:12]1 +03936464 [CH3:2][C:1](=[O:3])[N:4]1[CH2:5][CH:6]([CH2:13][CH2:14]Br)[c:7]2[cH:8][cH:9][cH:10][cH:11][c:12]21.[Cl:16][c:17]1[cH:18][cH:19][c:20]([C:23]2=[CH:28][CH2:27][NH:26][CH2:25][CH2:24]2)[cH:21][cH:22]1>>[CH3:2][C:1](=[O:3])[N:4]1[CH2:5][CH:6]([CH2:13][CH2:14][N:26]2[CH2:25][CH:24]=[C:23]([c:20]3[cH:19][cH:18][c:17]([Cl:16])[cH:22][cH:21]3)[CH2:28][CH2:27]2)[c:7]2[cH:8][cH:9][cH:10][cH:11][c:12]21 +03936466 [CH3:5][C:2]([CH3:6])([NH2:1])[CH2:3][OH:4].[cH:8]1ccc[cH:12][cH:7]1>CC(C)=O>[CH3:5][C:2]1([CH3:6])[CH2:3][O:4][C:7]([CH3:12])([CH3:8])[NH:1]1 +03936467 [K+].[K+].[CH3:12][CH:8]([C:9](=[O:10])[OH:11])[c:5]1[cH:6][cH:7][c:2]([NH2:1])[c:3]([Cl:13])[cH:4]1.O=C([O-])[O-].[OH:20][CH:16]([CH2:15]Cl)[CH2:17][CH2:18]Cl>CCO>[CH3:12][CH:8]([C:9](=[O:10])[OH:11])[c:5]1[cH:6][cH:7][c:2]([N:1]2[CH2:18][CH2:17][CH:16]([OH:20])[CH2:15]2)[c:3]([Cl:13])[cH:4]1 +03936468 [OH:26][CH:8]([CH2:9][CH2:10][CH2:11][N:12]1[CH2:13][CH2:14][C:15]([OH:18])([c:19]2[cH:20][cH:21][c:22]([Cl:25])[cH:23][cH:24]2)[CH2:16][CH2:17]1)[c:5]1[cH:4][cH:3][c:2]([F:1])[cH:7][cH:6]1>ClC(Cl)Cl>[O:26]=[C:8]([CH2:9][CH2:10][CH2:11][N:12]1[CH2:17][CH2:16][C:15]([OH:18])([c:19]2[cH:24][cH:23][c:22]([Cl:25])[cH:21][cH:20]2)[CH2:14][CH2:13]1)[c:5]1[cH:6][cH:7][c:2]([F:1])[cH:3][cH:4]1 +03936468 [O:27]=[c:19]1[nH:20][c:21]2[cH:26][cH:25][cH:24][cH:23][c:22]2[n:18]1[C:15]1=[CH:16][CH2:17][N:12]([CH2:11][CH2:10][CH2:9][CH:8]([OH:28])[c:5]2[cH:4][cH:3][c:2]([F:1])[cH:7][cH:6]2)[CH2:13][CH2:14]1>ClC(Cl)Cl>[O:28]=[C:8]([CH2:9][CH2:10][CH2:11][N:12]1[CH2:13][CH:14]=[C:15]([n:18]2[c:19](=[O:27])[nH:20][c:21]3[cH:26][cH:25][cH:24][cH:23][c:22]32)[CH2:16][CH2:17]1)[c:5]1[cH:6][cH:7][c:2]([F:1])[cH:3][cH:4]1 +03936470 CCCCO.Cc1ccc(S(=O)(=O)O)cc1.[CH3:20][c:17]1[cH:18][cH:19][c:14]([Cl:13])[cH:15][c:16]1[O:21][CH2:22][CH:23]([OH:26])[CH2:24]O.[O:4]=[C:3]([CH2:2][Br:1])[c:5]1[cH:10][cH:9][c:8]([Cl:11])[cH:7][c:6]1[Cl:12]>c1ccccc1>[CH3:20][c:17]1[cH:18][cH:19][c:14]([Cl:13])[cH:15][c:16]1[O:21][CH2:22][CH:23]1[CH2:24][O:4][C:3]([CH2:2][Br:1])([c:5]2[cH:10][cH:9][c:8]([Cl:11])[cH:7][c:6]2[Cl:12])[O:26]1 +03936470 [Na+].[CH3:1][O:2][c:3]1[cH:4][cH:5][c:6]([CH2:9][CH2:10][CH:11]2[CH2:13][O:12]2)[cH:7][cH:8]1.CC(C)=O.O=C([O-])O.O=S(=O)([OH:15])O>O>[CH3:1][O:2][c:3]1[cH:8][cH:7][c:6]([CH2:9][CH2:10][CH:11]([OH:15])[CH2:13][OH:12])[cH:5][cH:4]1 +03936491 [OH-].[Na+].[O:20]=[CH:19][OH:21].O=S(=O)(O)O.O[CH:2]1[CH:9]2[CH2:8][CH:7]3[CH2:6][CH:5]([CH2:10]2)[CH2:4][CH:3]1[CH2:11]3>>[O:20]=[C:19]([OH:21])[CH:2]1[CH:3]2[CH2:4][CH:5]3[CH2:6][CH:7]([CH2:11]2)[CH2:8][CH:9]1[CH2:10]3 +03936493 [BH4-].[Na+].CO.[CH3:15][CH2:14][O:13][C:11](=[O:12])[CH:3]1[CH2:4][CH2:5][C:6](=[O:10])[CH:7]([CH2:8][CH3:9])[CH:2]1[CH3:1]>CC(=O)O>[CH3:15][CH2:14][O:13][C:11](=[O:12])[CH:3]1[CH2:4][CH2:5][CH:6]([OH:10])[CH:7]([CH2:8][CH3:9])[CH:2]1[CH3:1] +03936503 [BrH:26].O[CH2:24][CH2:23][CH2:22][CH2:21][CH2:20][CH2:19][CH2:18][CH2:17][CH2:16][CH2:15][CH2:14][CH2:13][CH2:12][CH2:11][CH2:10][CH2:9][CH2:8][CH2:7][c:1]1[cH:2][cH:3][cH:4][cH:5][cH:6]1>>[Br:26][CH2:24][CH2:23][CH2:22][CH2:21][CH2:20][CH2:19][CH2:18][CH2:17][CH2:16][CH2:15][CH2:14][CH2:13][CH2:12][CH2:11][CH2:10][CH2:9][CH2:8][CH2:7][c:1]1[cH:2][cH:3][cH:4][cH:5][cH:6]1 +03936504 [CH3:11][c:10]1[cH:9][c:8]2[c:4]([cH:3][c:2]1[CH3:1])[C:5](=[O:13])[CH2:6][C:7]2=[O:12].O=[N+:15]([O-:16])[OH:14]>>[CH3:1][c:2]1[cH:3][c:4]2[c:8]([cH:9][c:10]1[CH3:11])[C:7](=[O:12])[CH:6]([N+:15](=[O:14])[O-:16])[C:5]2=[O:13] +03936506 [OH-:6].[Na].[Na+].CCCCCCCCCCCC(=O)Cl.[CH3:22][CH2:21][CH2:20][CH2:19][CH2:18][CH2:17][CH2:16][CH2:15][CH2:14][CH2:13][CH:9]([Br:8])[C:10](=[O:11])Cl.[CH3:37][CH2:36][CH2:35][CH2:34][CH2:33][CH2:32][CH2:31][CH2:30][CH2:29][CH2:28][CH:24](Br)[C:25](=O)Br.O=S(=O)(O)O.[O-:3][O-:2].OO>O.Cc1ccccc1>[CH3:25][CH2:24][CH2:28][CH2:29][CH2:30][CH2:31][CH2:32][CH2:33][CH2:34][CH2:35][CH2:36][C:37](=[O:6])[O:2][O:3][C:10](=[O:11])[CH:9]([Br:8])[CH2:13][CH2:14][CH2:15][CH2:16][CH2:17][CH2:18][CH2:19][CH2:20][CH2:21][CH3:22] +03937701 [Li].[OH-].[Na+].[AlH4-].O=[N:19][N:16]1[CH2:15][CH2:14][N:13]([CH:6]2[c:5]3[cH:21][cH:22][cH:23][cH:24][c:4]3[CH:3]=[C:2]([Br:1])[c:8]3[cH:9][cH:10][cH:11][cH:12][c:7]32)[CH2:18][CH2:17]1>O.C1CCOC1>[NH2:19][N:16]1[CH2:17][CH2:18][N:13]([CH:6]2[c:5]3[cH:21][cH:22][cH:23][cH:24][c:4]3[CH:3]=[C:2]([Br:1])[c:8]3[cH:9][cH:10][cH:11][cH:12][c:7]32)[CH2:14][CH2:15]1 +03937702 O.[CH3:18][C:2]1([CH3:1])[c:6]2[cH:7][c:8]([OH:11])[cH:9][cH:10][c:5]2[O:4][CH:3]1[N:12]1[CH2:13][CH2:14][CH2:15][CH2:16][CH2:17]1.[CH3:19][S:20](=[O:22])(=[O:23])Cl>c1ccncc1>[CH3:1][C:2]1([CH3:18])[c:6]2[cH:7][c:8]([O:11][S:20]([CH3:19])(=[O:22])=[O:23])[cH:9][cH:10][c:5]2[O:4][CH:3]1[N:12]1[CH2:13][CH2:14][CH2:15][CH2:16][CH2:17]1 +03937702 [OH-].[Na+].CC(=O)O[C:21]([CH3:20])=[O:22].[CH3:15][C:11]1([CH3:16])[c:10]2[cH:17][c:6]([O:5][S:2]([CH3:1])(=[O:3])=[O:4])[cH:7][cH:8][c:9]2[O:13][CH:12]1[OH:14]>O>[CH3:20][C:21](=[O:22])[O:14][CH:12]1[O:13][c:9]2[cH:8][cH:7][c:6]([O:5][S:2]([CH3:1])(=[O:4])=[O:3])[cH:17][c:10]2[C:11]1([CH3:16])[CH3:15] +03937704 [H-].[Na+].CO[c:12]1[cH:13][c:8]([NH2:7])[c:9]([C:18](=[O:23])[CH2:19][S:20]([CH3:22])=[O:21])[cH:10][c:11]1OC.CS([CH3:3])=O>c1ccccc1>[CH3:3][c:11]1[cH:12][cH:13][c:8]([NH2:7])[c:9]([C:18](=[O:23])[CH2:19][S:20]([CH3:22])=[O:21])[cH:10]1 +03937704 [Na+].Cl.[CH3:12][S:10](=[O:11])[CH2:9][C:8](=[O:13])[c:3]1[cH:4][cH:5][cH:6][cH:7][c:2]1[NH2:1].O=[N:15][O-]>O>[CH3:12][S:10](=[O:11])[c:9]1[n:15][nH:1][c:2]2[cH:7][cH:6][cH:5][cH:4][c:3]2[c:8]1=[O:13] +03937704 CC(=O)[O:20][C:18]([CH3:17])=[O:19].[CH3:12][n:8]1[n:7][c:6]([S:13]([CH3:15])=O)[c:5](=[O:16])[c:4]2[cH:3][c:2]([Cl:1])[cH:11][cH:10][c:9]21>>[CH3:17][C:18](=[O:19])[OH:20].[CH3:12][n:8]1[n:7][c:6]([S:13][CH2:15][OH:19])[c:5](=[O:16])[c:4]2[cH:3][c:2]([Cl:1])[cH:11][cH:10][c:9]21 +03937707 [CH3:25][NH:24][CH3:23].[O-:20][n+:15]1[c:16]2[cH:17][cH:18][cH:19][c:6]([O:5][CH2:4][CH2:3][CH2:2]Cl)[c:7]2[n+:8]([O-:22])[c:9]2[cH:10][cH:11][cH:12][c:13]([OH:21])[c:14]21>>[CH3:25][N:24]([CH3:23])[CH2:2][CH2:3][CH2:4][O:5][c:6]1[cH:19][cH:18][cH:17][c:16]2[c:7]1[n+:8]([O-:22])[c:9]1[cH:10][cH:11][cH:12][c:13]([OH:21])[c:14]1[n+:15]2[O-:20] +03937708 [O:2]=[N+:1]([O-:3])[c:4]1[cH:5][cH:6][c:7]([CH2:8]Br)[cH:10][cH:11]1.[cH:15]1[cH:14][cH:13][c:12]([N:18]2[CH2:19][CH2:20][NH:21][CH2:22][CH2:23]2)[cH:17][cH:16]1>CO.CC#N>[NH2:1][c:4]1[cH:5][cH:6][c:7]([CH2:8][N:21]2[CH2:20][CH2:19][N:18]([c:12]3[cH:13][cH:14][cH:15][cH:16][cH:17]3)[CH2:23][CH2:22]2)[cH:10][cH:11]1.[O:2]=[N+:1]([O-:3])[c:4]1[cH:5][cH:6][c:7]([CH2:8][N:21]2[CH2:20][CH2:19][N:18]([c:12]3[cH:13][cH:14][cH:15][cH:16][cH:17]3)[CH2:23][CH2:22]2)[cH:10][cH:11]1 +03937713 [CH3:13][C:12](=[O:14])[NH:15][NH2:16].[CH3:8][c:5]1[cH:6][cH:7][c:2]([Cl:1])[c:3]([N:9]=[C:10]=[S:11])[cH:4]1>C1CCOC1>[CH3:13][C:12](=[O:14])[NH:15][NH:16][C:10](=[S:11])[NH:9][c:3]1[cH:4][c:5]([CH3:8])[cH:6][cH:7][c:2]1[Cl:1] +03937714 O.Cl.[CH3:1][c:2]1[cH:11][c:6]2[n:7][c:8]([NH2:10])[s:9][c:5]2[cH:4][c:3]1[CH3:12].NN.N[NH2:14]>>[CH3:1][c:2]1[cH:11][c:6]2[n:7][c:8]([NH:10][NH2:14])[s:9][c:5]2[cH:4][c:3]1[CH3:12] +03937714 O.Br.C[NH:12][c:10]1[n:9][c:8]2[c:7]([cH:6][cH:5][cH:4][c:3]2[CH3:2])[s:11]1.N[NH2:19].OCCO>O>[CH3:2][c:3]1[cH:4][cH:5][cH:6][c:7]2[s:11][c:10]([NH:12][NH2:19])[n:9][c:8]21 +03937716 [Na+].[CH3:11][CH:10]([CH3:12])[CH:6]1[O:7][CH2:8][CH2:9][N:5]1[CH2:1][CH:2]1[CH2:3][O:4]1.[N-:16]=[N+:15]=[N-:14]>C1COCCO1>[CH3:11][CH:10]([CH3:12])[CH:6]1[O:7][CH2:8][CH2:9][N:5]1[CH2:1][CH:2]([OH:4])[CH2:3][N:14]=[N+:15]=[N-:16] +03937718 COSc1ccccc1.[CH3:14][CH:13]([CH3:15])[C@H:12]([NH:11][C:9](=[O:10])[O:8][CH2:1][c:2]1[cH:3][cH:4][cH:5][cH:6][cH:7]1)[C:16](=[O:17])[OH:18].c1cc[c:19](P(c2ccccc2)c2ccccc2)cc1>ClCCl>[CH3:19][O:17][C:16](=[O:18])[C@@H:12]([NH:11][C:9](=[O:10])[O:8][CH2:1][c:2]1[cH:7][cH:6][cH:5][cH:4][cH:3]1)[CH:13]([CH3:14])[CH3:15] +03937719 [OH-].[Na+].[CH3:1][O:2][c:3]1[cH:4][cH:5][c:6]([OH:12])[c:7]([C:8](=[O:9])[OH:10])[cH:11]1.Br[CH2:16][c:17]1[cH:18][cH:19][cH:20][cH:21][cH:22]1>O>[CH3:1][O:2][c:3]1[cH:4][cH:5][c:6]([O:12][CH2:8][c:7]2[cH:6][cH:5][cH:4][cH:3][cH:11]2)[c:7]([C:8](=[O:10])[O:9][CH2:16][c:17]2[cH:18][cH:19][cH:20][cH:21][cH:22]2)[cH:11]1 +03937722 [OH-].[Na+].CI.[CH3:3][O:2][CH3:1].[O:11]=[C:10]([c:4]1[cH:5][cH:6][cH:7][cH:8][cH:9]1)[CH:12]([OH:13])[c:14]1[cH:15][cH:16][cH:17][cH:18][cH:19]1>CS(C)=O>[CH3:3][O:2][CH3:1].[CH3:1][C:12]([OH:13])([C:10](=[O:11])[c:4]1[cH:9][cH:8][cH:7][cH:6][cH:5]1)[c:14]1[cH:15][cH:16][cH:17][cH:18][cH:19]1 +03937723 [CH2:12]=[C:11]([CH3:13])[CH:10]1[CH2:9][CH2:8][C:7]([CH3:14])=[C:6]1[CH2:5][CH:2]([CH3:1])[CH2:3][OH:4]>CO>[CH3:14][C:7]1=[C:6]([CH2:5][CH:2]([CH3:1])[CH2:3][OH:4])[CH:10]([CH:11]([CH3:12])[CH3:13])[CH2:9][CH2:8]1 +03937730 [CH3:2][CH2:1][CH:3]1[CH2:8][CH2:7][CH2:6][CH:5]([CH3:9])[C:4]1=O.[CH3:15][O:14][CH2:13][CH:12]([CH3:11])[NH2:16]>[Cl-].[Cl-].[Cl-].[Cl-].[Ti+4].Cc1ccccc1>[CH3:2][CH2:1][CH:3]1[CH2:8][CH2:7][CH2:6][CH:5]([CH3:9])[C:4]1=[N:16][CH:12]([CH3:11])[CH2:13][O:14][CH3:15] +03937736 [OH-:24].[Na+].[CH3:6][CH2:7]O.CCO[CH:12]1[c:20]2[cH:19][cH:18][cH:17][cH:16][c:15]2[C:14](=[C:21]=[O:22])[C:13]1=[O:23].Br[CH2:4][CH2:3][CH2:2][Br:1]>O>[CH3:7][CH2:6][O:22][C:21](=[O:24])[C:14]1([CH2:4][CH2:3][CH2:2][Br:1])[C:13](=[O:23])[CH2:12][c:20]2[cH:19][cH:18][cH:17][cH:16][c:15]21 +03937738 CCO.[CH3:3][C:2]([CH3:1])=[O:4].[F:12][C:9]([F:13])([F:8])[S:10]Cl>ClCCl>[CH3:3][C:2](=[O:4])[CH2:1][S:10][C:9]([F:12])([F:13])[F:8] +03937801 [BH4-].[Na+].[CH3:1][O:2][C:3](=[O:33])[CH2:4][CH2:5][CH2:6][CH2:7][CH2:8][CH2:9][CH:10]1[CH:11](/[CH:22]=[CH:23]/[C:24](=[O:32])[CH2:25][CH:26]2[CH2:27][CH2:28][CH2:29][CH2:30][CH2:31]2)[CH2:12][CH2:13][CH:14]1[O:15][CH:16]1[CH2:21][CH2:20][CH2:19][CH2:18][O:17]1.CC(=O)O>CO>[CH3:1][O:2][C:3](=[O:33])[CH2:4][CH2:5][CH2:6][CH2:7][CH2:8][CH2:9][CH:10]1[CH:11](/[CH:22]=[CH:23]/[CH:24]([OH:32])[CH2:25][CH:26]2[CH2:27][CH2:28][CH2:29][CH2:30][CH2:31]2)[CH2:12][CH2:13][CH:14]1[O:15][CH:16]1[CH2:21][CH2:20][CH2:19][CH2:18][O:17]1 +03937805 [Na+].[Na+].[CH3:11][CH2:9][CH2:7][CH2:5][CH2:3][CH3:2].O=[C:2](O)[C@H:3](O)[C@@H:5](O)[C@H:7](O)[C@H:9](O)[CH2:11]O.O=[C:2](O)[C@H:3](O)[C@@H:5](O)[C@H:7](O)[C@H:9](O)[CH2:11]O.[O:34]=[P:33]([O-:35])([O-:36])[F:37]>O>[CH3:11][CH2:9][CH2:7][CH2:5][CH2:3][CH3:2].[O:34]=[P:33]([OH:35])([OH:36])[F:37] +03937824 [K+].[K+].[I-].[CH3:26][CH2:25][O:24][P:22](=[O:23])([O-:30])[O:27][CH2:28][CH3:29].[CH3:11][CH2:10][N:9]([CH2:12][CH3:13])[C:8](=[O:14])[O:7][C:3](=[N:4][O:5][CH3:6])[CH:2](Cl)[c:15]1[cH:16][cH:17][c:18]([Cl:21])[cH:19][cH:20]1>CCC(C)=O>[CH3:26][CH2:25][O:24][P:22](=[O:23])([O:27][CH2:28][CH3:29])[O:30][CH:2]([C:3](=[N:4][O:5][CH3:6])[O:7][C:8](=[O:14])[N:9]([CH2:10][CH3:11])[CH2:12][CH3:13])[c:15]1[cH:16][cH:17][c:18]([Cl:21])[cH:19][cH:20]1 +03937824 C=CC[c:48]1ccc[c:50]([N:54]=[C:55]=[O:56])[cH:49]1.[CH3:19][CH2:18][CH2:17][CH2:16][CH2:15][CH2:14][CH2:19][CH2:18][CH2:17][CH2:16][CH2:15][C:14](=O)[O-].[CH3:19][CH2:18][CH2:17][CH2:16][CH2:15][CH2:14][CH2:19][CH2:18][CH2:17][CH2:16][CH2:15][C:14](=O)[O-].CCCC[Sn+2]CCCC.[CH3:1][O:2][NH:3][C:4](=[O:7])[CH2:5][Cl:6]>c1ccccc1>[CH3:48][CH:49]=[CH:50][N:54]([C:55](=[O:56])[O:7][C:4]([CH2:5][Cl:6])=[N:3][O:2][CH3:1])[c:19]1[cH:14][cH:15][cH:16][cH:17][cH:18]1 +03937824 CCN(CC)CC.[CH3:23][CH2:22][N:24]([CH2:28][CH3:29])[C:25](=[O:26])Cl.[CH3:1][O:2][NH:3][C:4](=[O:14])[CH:5]([Cl:6])[c:7]1[cH:8][cH:9][c:10]([Cl:13])[cH:11][cH:12]1>c1ccccc1>[CH3:23][CH2:22][N:24]([CH2:28][CH3:29])[C:25](=[O:26])[O:14][C:4](=[N:3][O:2][CH3:1])[CH:5]([Cl:6])[c:7]1[cH:8][cH:9][c:10]([Cl:13])[cH:11][cH:12]1 +03937835 [K+].[I-].[CH3:26][CH2:25][NH:27][CH2:28][CH3:29].O=C(C[Cl:1])[c:5]1[cH:18][cH:17][c:16]2[c:7]([cH:6]1)[S:8][c:9]1[cH:10][c:11]([C:19](=[O:22])[CH2:20]Cl)[cH:12][cH:13][c:14]1[O:15]2.C1[CH2:33][CH2:34][O:30]C1>>[ClH:1].[ClH:1].[CH3:26][CH2:25][N:27]([CH2:28][CH3:29])[CH2:33][C:34](=[O:30])[c:18]1[cH:5][cH:6][c:7]2[c:16]([cH:17]1)[O:15][c:14]1[cH:13][cH:12][c:11]([C:19](=[O:22])[CH2:20][N:27]([CH2:25][CH3:26])[CH2:28][CH3:29])[cH:10][c:9]1[S:8]2 +03937837 [Na+].[Na+:4].Cl.[NH2:2][OH:3].O=C([O-])[O-].[O:22]=[C:21](Cl)[c:12]1[cH:11][o:10][c:19]2[cH:18][cH:17][cH:16][cH:15][c:14]2[c:13]1=[O:20]>O.ClCCl>[Na+:4].[O:22]=[C:21]([NH:2][O-:3])[c:12]1[cH:11][o:10][c:19]2[cH:18][cH:17][cH:16][cH:15][c:14]2[c:13]1=[O:20] +03937837 [OH2:20].[CH3:19][CH2:18][O:17][C:15](=[O:16])[c:4]1[o:5][c:6]2[cH:13][c:12]([OH:14])[cH:11][cH:10][c:7]2[c:8](=[O:9])[c:3]1[C:1]#[N:2]>O=S(=O)(O)O>[CH3:19][CH2:18][O:17][C:15](=[O:16])[c:4]1[o:5][c:6]2[cH:13][c:12]([OH:14])[cH:11][cH:10][c:7]2[c:8](=[O:9])[c:3]1[C:1]([NH2:2])=[O:20] +03937837 [NH2:17][C:16]([NH2:15])=[O:18].[O:13]=[C:12](Cl)[c:3]1[cH:2][o:1][c:10]2[cH:9][cH:8][cH:7][cH:6][c:5]2[c:4]1=[O:11].O=S(=O)(O)O>c1ccccc1>[NH2:17][C:16](=[O:18])[NH:15][C:12](=[O:13])[c:3]1[cH:2][o:1][c:10]2[cH:9][cH:8][cH:7][cH:6][c:5]2[c:4]1=[O:11] +03937837 CC(=O)O[C:15]([CH3:14])=[O:16].[N:8]#[C:7][CH2:6][C:4](=[O:5])[c:3]1[cH:9][cH:10][c:11]([OH:13])[cH:12][c:2]1[OH:1].[cH:21]1[cH:22]cncc1>>[CH3:14][C:15](=[O:16])[O:13][c:11]1[cH:10][cH:9][c:3]2[c:2]([cH:12]1)[o:1][c:21]([CH3:22])[c:6]([C:7]#[N:8])[c:4]2=[O:5] +03937838 [BH4-].[Na+].CO.[CH3:27][C:26]([CH3:28])([CH3:29])[N:25]([CH2:24][C:23](=[O:37])[c:11]1[cH:10][c:9]([O:8][CH2:1][c:2]2[cH:3][cH:4][cH:5][cH:6][cH:7]2)[cH:14][c:13]([O:15][CH2:16][c:17]2[cH:18][cH:19][cH:20][cH:21][cH:22]2)[cH:12]1)[CH2:30][c:31]1[cH:32][cH:33][cH:34][cH:35][cH:36]1>CCO>[CH3:27][C:26]([CH3:28])([CH3:29])[N:25]([CH2:30][c:31]1[cH:32][cH:33][cH:34][cH:35][cH:36]1)[CH2:24][CH:23]([OH:37])[c:11]1[cH:12][c:13]([O:15][CH2:16][c:17]2[cH:22][cH:21][cH:20][cH:19][cH:18]2)[cH:14][c:9]([O:8][CH2:1][c:2]2[cH:3][cH:4][cH:5][cH:6][cH:7]2)[cH:10]1 +03937840 [OH-].[K+].[CH3:23][CH2:22][CH2:21][CH2:20]Br.[CH3:13][c:8]1[cH:9][cH:10][cH:11][cH:12][c:7]1[C:6](=[O:14])[NH:5][c:4]1[cH:15][cH:16][cH:17][c:2]([OH:1])[cH:3]1>O.CS(C)=O>[CH3:23][CH2:22][CH2:21][CH2:20][O:1][c:2]1[cH:17][cH:16][cH:15][c:4]([NH:5][C:6](=[O:14])[c:7]2[cH:12][cH:11][cH:10][cH:9][c:8]2[CH3:13])[cH:3]1 +03937840 CCN(CC)CC.[CH3:11][O:12][c:13]1[cH:19][cH:18][cH:17][c:15]([NH2:16])[cH:14]1.[CH3:1][c:2]1[cH:10][cH:9][cH:8][cH:7][c:3]1[C:4](=O)[OH:6].ClP(Cl)Cl>Cc1ccccc1>[CH3:11][O:12][c:13]1[cH:19][cH:18][cH:17][c:15]([NH:16][C:4](=[O:6])[c:3]2[cH:7][cH:8][cH:9][cH:10][c:2]2[CH3:1])[cH:14]1 +03938985 [CH3:1][O:2][c:3]1[n:4][c:5]([NH:13][CH2:14][CH2:15][OH:16])[n:6][c:7]([NH:9][CH:10]([CH3:11])[CH3:12])[n:8]1.[O:26]=[C:25]=[N:24][c:19]1[cH:20][cH:21][cH:22][cH:23][c:18]1[F:17]>CCN(CC)CC>[CH3:1][O:2][c:3]1[n:4][c:5]([NH:13][CH2:14][CH2:15][O:16][C:25](=[O:26])[NH:24][c:19]2[cH:20][cH:21][cH:22][cH:23][c:18]2[F:17])[n:6][c:7]([NH:9][CH:10]([CH3:11])[CH3:12])[n:8]1 +03939149 CCN(CC)CC.[CH3:10][Si:8]([CH3:11])([CH3:7])Cl.[S:6]=[C:2]1[NH:3][CH2:4][CH2:5][NH:1]1>C1CCOC1>[CH3:10][Si:8]([CH3:11])([CH3:7])[N:1]1[CH2:5][CH2:4][NH:3][C:2]1=[S:6] +03939150 [Mg+2].[CH3:35][CH2:34][N:33]([CH2:36][CH3:37])[CH2:32][CH3:31].[CH3:4][C:3]1([CH3:5])[S:2][C@@H:1]2[C@H:10]([NH:11][C:12](=[O:13])[C@H:14]([NH2:15])[C:16]3=[CH:17][CH2:18][CH:19]=[CH:20][CH2:21]3)[C:8](=[O:9])[N:7]2[C@H:6]1[C:22](=[O:24])[OH:23].O=S(=O)([O-])[O-]>ClCCl>[CH3:35][CH2:34][N:33]([CH2:36][CH3:37])[CH2:32][CH3:31].[CH3:5][C:3]1([CH3:4])[S:2][C@@H:1]2[C@H:10]([NH:11][C:12](=[O:13])[C@H:14]([NH2:15])[C:16]3=[CH:17][CH2:18][CH:19]=[CH:20][CH2:21]3)[C:8](=[O:9])[N:7]2[C@H:6]1[C:22](=[O:23])[OH:24] +03939155 [Li].N.[CH3:21][C@:20]12[CH2:37][CH2:36][C@H:35]3[C@@H:25]([CH2:26][CH2:27][C:28]4=[CH:29][C:30](=[O:38])[CH:31]=[CH:32][C@@:33]43[CH3:34])[C@@H:22]1[CH2:23][CH2:24][C:19]21[CH2:18][C:17](=[O:39])[CH2:16][O:15]1.N#CC1=C(C#N)C(=O)C(Cl)=C(Cl)C1=O>C1CCOC1.C1COCCO1>[CH3:21][C@:20]12[CH2:37][CH2:36][C@H:35]3[C@@H:25]([CH2:26][CH2:27][C:28]4=[CH:29][C:30](=[O:38])[CH2:31][CH2:32][C@@:33]43[CH3:34])[C@@H:22]1[CH2:23][CH2:24][C:19]21[CH2:18][C:17](=[O:39])[CH2:16][O:15]1 +03939155 Cl.CO.[CH3:6][C@:5]12[CH2:21][CH2:20][C@@H:19]3[C:18]4=[C:13]([CH2:12][CH2:11][C@H:10]3[C@@H:7]1[CH2:8][CH2:9][C:4]21[CH2:3][CH:2]([OH:1])[CH2:24][O:23]1)[CH2:14][C:15](=[O:22])[CH2:16][CH2:17]4>O>[CH3:6][C@:5]12[CH2:21][CH2:20][C@@H:19]3[C@H:18]4[CH2:17][CH2:16][C:15](=[O:22])[CH:14]=[C:13]4[CH2:12][CH2:11][C@H:10]3[C@@H:7]1[CH2:8][CH2:9][C:4]21[CH2:3][CH:2]([OH:1])[CH2:24][O:23]1 +03939157 O.[CH3:29][C:28]#[C:27][CH2:26][S:25][CH:24]1[NH:23][C:22](=[O:30])[CH:21]1[NH:20][C:7]([c:1]1[cH:2][cH:3][cH:4][cH:5][cH:6]1)([c:8]1[cH:9][cH:10][cH:11][cH:12][cH:13]1)[c:14]1[cH:15][cH:16][cH:17][cH:18][cH:19]1.[CH3:37][C:36]([CH3:38])([CH3:39])[O:35][C:31](=[O:34])[CH:32]=[O:33]>c1ccccc1>[CH3:29][C:28]#[C:27][CH2:26][S:25][CH:24]1[CH:21]([NH:20][C:7]([c:8]2[cH:9][cH:10][cH:11][cH:12][cH:13]2)([c:1]2[cH:2][cH:3][cH:4][cH:5][cH:6]2)[c:14]2[cH:15][cH:16][cH:17][cH:18][cH:19]2)[C:22](=[O:30])[N:23]1[CH:32]([OH:33])[C:31](=[O:34])[O:35][C:36]([CH3:37])([CH3:38])[CH3:39] +03939158 C[C:4]1=[N:5][C:6]([Cl:8])=[N:7][CH:2]([Cl:1])[N:3]1N.[NH2:31][C:29](=[O:30])[NH:28][c:23]1nc(Cl)nc(Cl)n1.Nc1nc(Cl)nc(Cl)n1>>[CH3:23][N:28]([C:29]([NH2:31])=[O:30])[c:4]1[n:5][c:6]([Cl:8])[n:7][c:2]([Cl:1])[n:3]1 +03939159 [OH-].[K+].[CH3:10][O:11][c:12]1[cH:13][cH:14][c:15]([NH2:16])[c:17]([N+:19](=[O:21])[O-:20])[cH:18]1.CO[CH:5]1[CH2:6][CH2:7][CH:3](OC)O1.CC(=O)O>O>[CH3:10][O:11][c:12]1[cH:13][cH:14][c:15](-[n:16]2[cH:5][cH:6][cH:7][cH:3]2)[c:17]([N+:19](=[O:21])[O-:20])[cH:18]1 +03939159 [CH3:27][O:26][c:24]1[cH:23][cH:22][c:21](-[n:28]2[cH:29][cH:30][cH:31][cH:32]2)[c:20]([NH2:19])[cH:25]1.CC(=O)O.O=[C:11]1[CH2:10][CH2:9][N:8]([CH2:1][c:2]2[cH:3][cH:4][cH:5][cH:6][cH:7]2)[CH2:13][CH2:12]1>CCO>[CH3:27][O:26][c:24]1[cH:23][cH:22][c:21]2[c:20]([cH:25]1)[NH:19][C:11]1([CH2:10][CH2:9][N:8]([CH2:1][c:2]3[cH:3][cH:4][cH:5][cH:6][cH:7]3)[CH2:13][CH2:12]1)[c:32]1[cH:31][cH:30][cH:29][n:28]1-2 +03939164 [CH3:17][O:16][CH:13]([CH2:14][NH2:15])[O:12][CH3:11].O=[CH:4][c:3]1[cH:6][cH:7][cH:8][c:9]([Cl:10])[c:2]1[Cl:1]>Cc1ccccc1>[CH3:17][O:16][CH:13]([O:12][CH3:11])[C:14]([NH2:15])=[CH:4][c:3]1[cH:6][cH:7][cH:8][c:9]([Cl:10])[c:2]1[Cl:1] +03939164 [O:15]=[C:14]([OH:13])/[CH:16]=[CH:17]\[C:18](=[O:20])[OH:19].[Cl:1][c:2]1[cH:3][cH:4][c:5]2[c:10]([c:11]1[Cl:12])[CH2:9][NH:8][CH2:7][CH2:6]2>CCO>[O:13]=[C:14]([O-:15])/[CH:16]=[CH:17]\[C:18](=[O:19])[O-:20].[Cl:1][c:2]1[cH:3][cH:4][c:5]2[c:10]([c:11]1[Cl:12])[CH2:9][NH:8][CH2:7][CH2:6]2 +03939166 [N:19]#[C:18][c:3]1[cH:4][c:5]([N+:15](=[O:16])[O-:17])[c:6]2[n:7][c:8]([C:11]([F:12])([F:13])[F:14])[nH:9][c:10]2[c:2]1Cl.[CH2:20]1[CH2:21][CH2:22][NH:23][CH2:24][CH2:25]1>>[N:19]#[C:18][c:3]1[cH:4][c:5]([N+:15](=[O:16])[O-:17])[c:6]2[n:7][c:8]([C:11]([F:12])([F:13])[F:14])[nH:9][c:10]2[c:2]1[N:23]1[CH2:22][CH2:21][CH2:20][CH2:25][CH2:24]1 +03939166 [Na].[CH3:28][CH2:27][CH2:26][CH2:25][CH2:24][CH2:23][CH2:22][CH2:21][OH:29].[N:19]#[C:18][c:3]1[cH:4][c:5]([N+:15](=[O:16])[O-:17])[c:6]2[n:7][c:8]([C:11]([F:12])([F:13])[F:14])[nH:9][c:10]2[c:2]1Cl>>[CH3:28][CH2:27][CH2:26][CH2:25][CH2:24][CH2:23][CH2:22][CH2:21][O:29][c:2]1[c:10]2[nH:9][c:8]([C:11]([F:12])([F:13])[F:14])[n:7][c:6]2[c:5]([N+:15](=[O:16])[O-:17])[cH:4][c:3]1[C:18]#[N:19] +03939166 [Na].[CH3:22][CH2:23][OH:24].[O:16]=[N+:15]([O-:17])[c:5]1[cH:4][c:3]([C:18]([F:19])([F:20])[F:21])[c:2](Cl)[c:10]2[nH:9][c:8]([C:11]([F:12])([F:13])[F:14])[n:7][c:6]21>O>[CH3:22][CH2:23][O:24][c:2]1[c:10]2[nH:9][c:8]([C:11]([F:12])([F:13])[F:14])[n:7][c:6]2[c:5]([N+:15](=[O:16])[O-:17])[cH:4][c:3]1[C:18]([F:19])([F:20])[F:21] +03939166 [CH3:22][CH:23]1[CH2:28][CH2:27][CH2:26][CH2:25][CH:24]1[NH2:29].[O:16]=[N+:15]([O-:17])[c:5]1[cH:4][c:3]([C:18]([F:19])([F:20])[F:21])[c:2](Cl)[c:10]2[nH:9][c:8]([C:11]([F:12])([F:13])[F:14])[n:7][c:6]21>>[CH3:22][CH:23]1[CH2:28][CH2:27][CH2:26][CH2:25][CH:24]1[NH:29][c:2]1[c:10]2[nH:9][c:8]([C:11]([F:12])([F:13])[F:14])[n:7][c:6]2[c:5]([N+:15](=[O:16])[O-:17])[cH:4][c:3]1[C:18]([F:19])([F:20])[F:21] +03939167 Cl.CCOC(C)=O.CC(=O)[Br:28].[CH3:1][S:2](=O)[CH2:4][C:5](=[O:6])[c:7]1[cH:11][c:10](-[c:12]2[cH:13][cH:14][cH:15][cH:16][cH:17]2)[o:9][n:8]1>ClCCl>[CH3:1][S:2][CH:4]([Br:28])[C:5](=[O:6])[c:7]1[cH:11][c:10](-[c:12]2[cH:13][cH:14][cH:15][cH:16][cH:17]2)[o:9][n:8]1 +03939171 [CH3:21][CH2:20][O:22][C:23](=[O:28])[CH2:24][C:25](=[NH:27])[NH2:26].CCO[C:4](=O)[CH2:5][C:6](=O)[CH:8]=[C:9]1[CH2:10][CH:11]=[CH:12][c:13]2[cH:14][cH:15][cH:16][cH:17][c:18]21>CCO>[CH3:21][CH2:20][O:22][C:23](=[O:28])[C:6]1=[C:5]([CH3:4])[NH:27][C:25]([NH2:26])=[C:24]([C:23](=[O:28])[O:22][CH2:20][CH3:21])[CH:8]1[c:9]1[cH:10][cH:11][cH:12][c:13]2[cH:14][cH:15][cH:16][cH:17][c:18]21 +03939172 CCO.CCOP(OCC)OCC.[NH2:15][c:16]1[cH:20][s:19][cH:18][n:17]1.O=[CH:6][c:5]1[cH:8][cH:9][cH:10][cH:11][c:4]1[N+:1](=O)[O-]>O.ClC(Cl)Cl>[cH:18]1[n:17][c:16](-[n:15]2[cH:6][c:5]3[cH:8][cH:9][cH:10][cH:11][c:4]3[n:1]2)[cH:20][s:19]1 +03939175 [H-].[Na+].Cl.[CH3:65][CH2:64][CH2:63][CH2:62][CH2:61][CH2:60]Br.[CH3:2][C:1]([CH3:3])([CH3:4])[c:5]1[cH:6][c:7]([CH2:16][CH2:17][C:18]2([CH3:56])[NH:22][C:21](=[O:23])[N:20]([CH2:24][CH2:25][CH2:26][CH2:27][CH2:28][CH2:29][N:30]3[C:31](=[O:54])[NH:32][C:33]([CH3:53])([CH2:36][CH2:37][c:38]4[cH:39][c:40]([C:49]([CH3:50])([CH3:51])[CH3:52])[c:41]([OH:48])[c:42]([C:44]([CH3:45])([CH3:46])[CH3:47])[cH:43]4)[C:34]3=[O:35])[C:19]2=[O:55])[cH:8][c:9]([C:12]([CH3:13])([CH3:14])[CH3:15])[c:10]1[OH:11]>O.CN(C)C=O>[CH3:8][CH2:9][CH2:10][CH2:5][CH2:1][CH2:2][N:22]1[C:21](=[O:23])[N:20]([CH2:24][CH2:25][CH2:26][CH2:27][CH2:28][CH2:29][N:30]2[C:31](=[O:54])[N:32]([CH2:60][CH2:61][CH2:62][CH2:63][CH2:64][CH3:65])[C:33]([CH3:53])([CH2:36][CH2:37][c:38]3[cH:43][c:42]([C:44]([CH3:45])([CH3:46])[CH3:47])[c:41]([OH:48])[c:40]([C:49]([CH3:50])([CH3:51])[CH3:52])[cH:39]3)[C:34]2=[O:35])[C:19](=[O:55])[C:18]1([CH3:56])[CH2:17][CH2:16][c:7]1[cH:6][c:5]([C:1]([CH3:4])([CH3:3])[CH3:2])[c:10]([OH:11])[c:9]([C:12]([CH3:13])([CH3:14])[CH3:15])[cH:8]1 +03939178 [CH3:20][O:19][C:13](=[O:18])[CH2:14][C:15]([CH3:17])=O.Cc1ccc(S(=O)(=O)O)cc1.[SH:12][CH2:11][CH2:10][c:3]1[cH:2][nH:1][c:9]2[cH:8][cH:7][cH:6][cH:5][c:4]12>c1ccccc1>[CH3:20][O:19][C:13](=[O:18])[CH2:14][C:15]1([CH3:17])[S:12][CH2:11][CH2:10][c:3]2[c:4]3[cH:5][cH:6][cH:7][cH:8][c:9]3[nH:1][c:2]21 +03939182 [Br-].[Li]CCCC.C=CC[P+]([c:18]1[cH:19][cH:20][cH:21][cH:22][cH:23]1)([c:18]1[cH:19][cH:20][cH:21][cH:22][cH:23]1)[c:18]1[cH:19][cH:20][cH:21][cH:22][cH:23]1.[CH3:40][O:39][C:37](=[O:38])[CH2:36][CH2:35][CH2:34][CH2:33]CCC=O>CCCCCC>[CH2:18]=[CH:23][CH:22]=[CH:21][CH2:20][CH2:19][CH2:33][CH2:34][CH2:35][CH2:36][C:37](=[O:38])[O:39][CH3:40] +03939186 [OH-].[K+].CO.[CH3:9][O:8]S(=O)(=O)OC.[CH3:14][C@:13]12[CH2:12][CH2:11][C@@H:10]3[c:29]4[cH:28][cH:27][c:25]([OH:26])[cH:24][c:23]4[CH2:22][CH2:21][C@H:20]3[C@@H:19]1[CH2:18][CH2:17][C:15]2=[O:16]>O>[CH3:9][O:8][CH3:10].[CH3:14][C@:13]12[CH2:12][CH2:11][C@@H:10]3[c:29]4[cH:28][cH:27][c:25]([OH:26])[cH:24][c:23]4[CH2:22][CH2:21][C@H:20]3[C@@H:19]1[CH2:18][CH2:17][C:15]2=[O:16] +03939186 [OH-].[Na+].COS(=O)(=O)O[CH3:21].[CH3:5][C@:4]12[CH2:3][CH2:2][C@@H:1]3[c:20]4[cH:19][cH:18][c:16]([OH:17])[cH:15][c:14]4[CH2:13][CH2:12][C@H:11]3[C@@H:10]1[CH2:9][CH2:8][C:6]2=[O:7]>O.CCC(C)=O>[CH3:16][O:17][CH3:21].[CH3:5][C@:4]12[CH2:3][CH2:2][C@@H:1]3[c:20]4[cH:19][cH:18][c:16]([OH:17])[cH:15][c:14]4[CH2:13][CH2:12][C@H:11]3[C@@H:10]1[CH2:9][CH2:8][C:6]2=[O:7] +03939190 [O:25]=[C:24]([OH:26])[c:23]1[cH:27][cH:28][cH:29][cH:30][c:22]1[OH:21].O=[Sb:7]([c:1]1[cH:2][cH:3][cH:4][cH:5][cH:6]1)([c:8]1[cH:9][cH:10][cH:11][cH:12][cH:13]1)[c:14]1[cH:15][cH:16][cH:17][cH:18][cH:19]1>>[O:25]=[C:24]([O-:26])[c:23]1[cH:27][cH:28][cH:29][cH:30][c:22]1[OH:21].[O:25]=[C:24]([O-:26])[c:23]1[cH:27][cH:28][cH:29][cH:30][c:22]1[OH:21].[O:25]=[C:24]([OH:26])[c:23]1[cH:27][cH:28][cH:29][cH:30][c:22]1[OH:21].[O:25]=[C:24]([OH:26])[c:23]1[cH:27][cH:28][cH:29][cH:30][c:22]1[OH:21].[cH:17]1[cH:18][cH:19][c:14]([Sb:7]([c:8]2[cH:9][cH:10][cH:11][cH:12][cH:13]2)[c:1]2[cH:6][cH:5][cH:4][cH:3][cH:2]2)[cH:15][cH:16]1.[cH:17]1[cH:18][cH:19][c:14]([Sb+2:7]([c:8]2[cH:9][cH:10][cH:11][cH:12][cH:13]2)[c:1]2[cH:6][cH:5][cH:4][cH:3][cH:2]2)[cH:15][cH:16]1 +03939196 [CH2:8]=[CH:7][c:6]1[cH:5][cH:4][c:3]([O:2][CH3:1])[cH:10][cH:9]1.CCN(CC)CC.[F:14][C:13]([F:15])=[C:12]([Cl:16])[Cl:11]>O>[CH3:1][O:2][c:3]1[cH:4][cH:5][c:6]([CH:7]2[CH2:8][C:13]([F:14])([F:15])[C:12]2([Cl:16])[Cl:11])[cH:9][cH:10]1 +03939197 [OH-].[Na+].[Na+].[Na+].Cl.[CH2:15]=[CH:16][CH2:17][CH2:18][CH2:19][CH2:20][CH2:21][CH2:22][CH2:23][CH2:24][CH2:25][CH2:26][CH3:27].CC1CO1.CC(C)(C)OOC(C)(C)C.O=C([O-])[O-].O=S(=O)=O.[OH:1][CH2:2][CH:3]1[CH2:4][CH:5]=[CH:6][CH2:7][CH2:8]1.C1=CCCCC1>>[CH3:15][CH2:16][CH2:17][CH2:18][CH2:19][CH2:20][CH2:21][CH2:22][CH2:23][CH2:24][CH2:25][CH2:26][CH2:27][C:4]1=[C:3]([CH2:2][OH:1])[CH2:8][CH2:7][CH2:6][CH2:5]1 +03939203 [Al+3].[Cl-].[Cl-].[Cl-].[Cl-].Cl.[CH3:21][CH:20]([CH3:22])[c:14]1[cH:15][cH:16][cH:17][cH:18][cH:19]1.[O:3]=[N+:2]([O-:1])[c:4]1[cH:5][cH:6][cH:7][cH:8][cH:9]1>ClC(Cl)Cl>[CH3:21][CH:20]([CH3:22])[c:14]1[cH:15][cH:16][cH:17][cH:18][cH:19]1.[O:1]=[N+:2]([O-:3])[c:4]1[cH:5][cH:6][cH:7][cH:8][cH:9]1 +03939229 [Na+].[Na+].[Na+].[K+].[K+].[CH2:27]=[CH:26][CH2:25][O:24][P:23]([O:28][CH2:29][CH:30]=[CH2:31])[O:32][CH2:33][CH:34]=[CH2:35].O=C([O-])[O-:3].O=C([O-])O.O=[Cr](=O)([O-])O[Cr](=O)(=O)[O-]>[O].O>[CH2:27]=[CH:26][CH2:25][O:24][P:23](=[O:3])([O:32][CH2:33][CH:34]=[CH2:35])[O:28][CH2:29][CH:30]=[CH2:31] +03939253 CC(=O)O[C:22](C)=[O:23].[CH3:19][C:18](=[O:20])[O:17][c:16]1[cH:15][cH:14][c:7]([CH2:8][C@H:9]([NH2:10])[C:11](=[O:12])[OH:13])[cH:6][c:5]1[O:4][C:1]([CH3:2])=[O:3]>O=CO>[CH3:19][C:18](=[O:20])[O:17][c:16]1[cH:15][cH:14][c:7]([CH2:8][C@H:9]([NH:10][CH:22]=[O:23])[C:11](=[O:12])[OH:13])[cH:6][c:5]1[O:4][C:1]([CH3:2])=[O:3] +03939267 [CH3:2][C:1](=[O:3])[NH:4][c:5]1[cH:6][cH:7][c:8]([O:9][c:10]2[c:11]([N+:23](=[O:24])[O-:25])[cH:12][c:13]([C:14](=[O:15])[OH:16])[cH:17][c:18]2[S:19]([NH2:20])(=[O:21])=[O:22])[cH:26][cH:27]1.CC(=O)O[C:29]([CH3:28])=[O:30]>>[CH3:2][C:1](=[O:3])[NH:4][c:5]1[cH:6][cH:7][c:8]([O:9][c:10]2[c:11]([N+:23](=[O:24])[O-:25])[cH:12][c:13]([C:14](=[O:15])[OH:16])[cH:17][c:18]2[S:19](=[O:22])(=[O:21])[NH:20][C:29]([CH3:28])=[O:30])[cH:26][cH:27]1 +03939267 Cl.C[N:30](C)C=O.N[CH2:19][C:20](=[O:21])[NH:22][c:23]1[cH:24][cH:25][cH:26][cH:27][cH:28]1.[O:7]=[C:6]([OH:8])[c:5]1[cH:4][c:3]([N+:15](=[O:16])[O-:17])[c:2]([Cl:1])[c:10]([S:11](=[O:12])(=[O:13])Cl)[cH:9]1>O>[CH3:19][C:20](=[O:21])[NH:22][c:23]1[cH:28][cH:27][cH:26][cH:25][c:24]1[NH:30][S:11](=[O:12])(=[O:13])[c:10]1[cH:9][c:5]([C:6](=[O:7])[OH:8])[cH:4][c:3]([N+:15](=[O:16])[O-:17])[c:2]1[Cl:1] +03939267 [OH-].[Na+].[CH3:29][CH2:28][CH2:27][CH2:26][NH:25][c:13]1[cH:14][c:15]([C:16](=[O:17])[OH:18])[cH:19][c:20]([S:21]([NH2:22])(=[O:23])=[O:24])[c:12]1[S:11][c:8]1[cH:7][cH:6][c:5]([NH:4]C(C)=O)[cH:10][cH:9]1>>[CH3:29][CH2:28][CH2:27][CH2:26][NH:25][c:13]1[cH:14][c:15]([C:16](=[O:17])[OH:18])[cH:19][c:20]([S:21]([NH2:22])(=[O:23])=[O:24])[c:12]1[S:11][c:8]1[cH:7][cH:6][c:5]([NH2:4])[cH:10][cH:9]1 +03939267 [OH-].[Na+].CC(=O)[NH:4][c:5]1[cH:10][cH:9][c:8]([CH3:11])[cH:7][c:6]1[O:12][c:13]1[c:14]([NH:26][CH2:27][c:28]2[cH:29][cH:30][cH:31][cH:32][cH:33]2)[cH:15][c:16]([C:17](=[O:18])[OH:19])[cH:20][c:21]1[S:22]([NH2:23])(=[O:24])=[O:25]>>[CH3:11][c:8]1[cH:9][cH:10][c:5]([NH2:4])[c:6]([O:12][c:13]2[c:14]([NH:26][CH2:27][c:28]3[cH:33][cH:32][cH:31][cH:30][cH:29]3)[cH:15][c:16]([C:17](=[O:18])[OH:19])[cH:20][c:21]2[S:22]([NH2:23])(=[O:25])=[O:24])[cH:7]1 +03939268 COCCOC.[O:18]=[S:15]1[CH2:14][CH2:13][N:12]([c:4]2[n:3][c:2](Cl)[n:7][c:6]3[cH:8][cH:9][cH:10][n:11][c:5]32)[CH2:17][CH2:16]1.[CH2:20]1[CH2:19][NH:24][CH2:23][CH2:22][NH:21]1>C1COCCO1>[O:18]=[S:15]1[CH2:14][CH2:13][N:12]([c:4]2[n:3][c:2]([N:21]3[CH2:20][CH2:19][NH:24][CH2:23][CH2:22]3)[n:7][c:6]3[cH:8][cH:9][cH:10][n:11][c:5]32)[CH2:17][CH2:16]1 +03939276 [Na+].[Na+:23].O=C([O-])[O-].[O:21]=[C:20]([OH:22])[c:2]1[cH:3][cH:4][c:5]2[c:14]([cH:1]1)[C:13](=[O:15])[c:12]1[cH:11][cH:10][c:9]([C:16](=[O:17])[OH:18])[cH:8][c:7]1[C:6]2=[O:19]>>[Na+:23].[Na+:23].[O:21]=[C:20]([O-:22])[c:2]1[cH:3][cH:4][c:5]2[c:14]([cH:1]1)[C:13](=[O:15])[c:12]1[cH:11][cH:10][c:9]([C:16](=[O:17])[O-:18])[cH:8][c:7]1[C:6]2=[O:19] +03939276 [K+:27].O=C([O-])O.[O:21]=[C:20]([OH:22])[c:2]1[cH:3][cH:4][c:5]2[c:14]([cH:1]1)[C:13](=[O:15])[c:12]1[cH:11][cH:10][c:9]([C:16](=[O:17])[OH:18])[cH:8][c:7]1[C:6]2=[O:19]>O>[K+:27].[K+:27].[O:21]=[C:20]([O-:22])[c:2]1[cH:3][cH:4][c:5]2[c:14]([cH:1]1)[C:13](=[O:15])[c:12]1[cH:11][cH:10][c:9]([C:16](=[O:17])[O-:18])[cH:8][c:7]1[C:6]2=[O:19] +03939278 N.[Na].[Cl-].CCO[CH2:33][CH3:32].CC(=O)[c:8]1[cH:7][cH:6][c:5]([O:4][c:3]2[cH:14][cH:15][cH:16][cH:17][c:2]2[F:1])[cH:10][cH:9]1.O=P(Cl)(Cl)Cl.ClP(Cl)(Cl)(Cl)Cl>[NH4+].O.[Cl-]>[CH:33]#[C:32][c:7]1[cH:8][cH:9][cH:10][c:5]([O:4][c:3]2[cH:14][cH:15][cH:16][cH:17][c:2]2[F:1])[cH:6]1 +03940259 [Na+].[CH3:19][CH2:18][c:11]1[cH:12][cH:13][cH:14][c:15]([CH2:16][CH3:17])[c:10]1[NH:9][CH2:8][CH:2]1[O:3][CH2:4][CH2:5][CH2:6][CH2:7][O:1]1.O=C([O-])O.[O:34]=[C:33](Cl)[CH2:32][Cl:31].C1COCCO1>O>[CH3:19][CH2:18][c:11]1[cH:12][cH:13][cH:14][c:15]([CH2:16][CH3:17])[c:10]1[N:9]([CH2:8][CH:2]1[O:1][CH2:7][CH2:6][CH2:5][CH2:4][O:3]1)[C:33](=[O:34])[CH2:32][Cl:31] +03940259 [K+].[K+].[CH3:1][c:2]1[cH:8][cH:7][c:6]([Cl:9])[cH:5][c:3]1[NH2:4].O=C([O-])[O-].Cl[CH2:11][CH:12]1[O:13][CH2:14][CH2:15][O:16]1>CN(C)C=O>[CH3:1][c:2]1[cH:8][cH:7][c:6]([Cl:9])[cH:5][c:3]1[NH:4][CH2:11][CH:12]1[O:16][CH2:15][CH2:14][O:13]1 +03940259 [K+].[K+].[CH3:2][CH2:1][c:3]1[cH:9][cH:8][cH:7][c:6]([CH2:10][CH3:11])[c:4]1[NH2:5].O=C([O-])[O-].Cl[CH2:13][CH:14]1[O:15][CH2:16][CH2:17][CH2:18][O:19]1>CN(C)C=O>[CH3:2][CH2:1][c:3]1[cH:9][cH:8][cH:7][c:6]([CH2:10][CH3:11])[c:4]1[NH:5][CH2:13][CH:14]1[O:19][CH2:18][CH2:17][CH2:16][O:15]1 +03940383 [CH3:1][NH:2][C:3](=[O:15])[NH:4][C@@H:5]1[C@@H:6]([OH:14])[C@H:7]([O:8][CH3:9])[O:10][CH2:11][C@H:12]1[OH:13].O=N[N+:17](=O)[O-:16]>O>[CH3:9][O:8][C@@H:7]1[O:10][CH2:11][C@@H:12]([OH:13])[C@H:5]([NH:4][C:3](=[O:15])[N:2]([CH3:1])[N:17]=[O:16])[C@H:6]1[OH:14] +03940390 [Cl-].[O:22]=[C:21]=[N:20][CH:12]1[CH2:13][CH2:14][CH2:15][CH2:16][CH2:17][CH2:18][CH2:19]1.O=[C:7]([OH:9])[CH2:6][CH2:5][CH2:4][CH2:3][C:2](=O)[OH:11].c1ccncc1>Cc1ccccc1C>[O:22]=[c:21]1[o:11][c:2]2[c:6]([c:7](=[O:9])[n:20]1[CH:12]1[CH2:13][CH2:14][CH2:15][CH2:16][CH2:17][CH2:18][CH2:19]1)[CH2:5][CH2:4][CH2:3]2 +03940394 [Na+].[Na+].[CH3:2][CH2:1][O:3][C:4](=[O:15])[CH2:5][S:6][c:7]1[n:8][c:9]([Cl:14])[cH:10][c:11](Cl)[n:12]1.[NH2:23][CH2:22][CH2:21][c:20]1[cH:19][cH:18][c:17]([Cl:16])[cH:25][cH:24]1.O=C([O-])[O-]>CCO>[CH3:2][CH2:1][O:3][C:4](=[O:15])[CH2:5][S:6][c:7]1[n:8][c:9]([Cl:14])[cH:10][c:11]([NH:23][CH2:22][CH2:21][c:20]2[cH:19][cH:18][c:17]([Cl:16])[cH:25][cH:24]2)[n:12]1 +03940394 [Na+].[Na+].Cl.CC[O:3][C:4](=[O:16])[CH:5]([CH3:6])[S:7][c:8]1[n:9][c:10](Cl)[cH:11][c:12]([Cl:14])[n:13]1.[NH2:23][CH2:22][c:21]1[cH:20][cH:19][c:18]([Cl:17])[cH:25][cH:24]1.O=C([O-])[O-]>CCO>[CH3:6][CH:5]([S:7][c:8]1[n:13][c:12]([Cl:14])[cH:11][c:10]([NH:23][CH2:22][c:21]2[cH:20][cH:19][c:18]([Cl:17])[cH:25][cH:24]2)[n:9]1)[C:4](=[O:16])[OH:3] +03940394 CCN(CC)c1ccccc1.[O:11]=[C:10]([OH:12])[CH2:9][S:8][c:4]1[n:5][cH:6][cH:7][c:2](O)[n:3]1.O=P([Cl:26])(Cl)Cl>>[O:11]=[C:10]([OH:12])[CH2:9][S:8][c:4]1[n:5][cH:6][cH:7][c:2]([Cl:26])[n:3]1 +03940394 [Na+].[Na+].[CH3:2][CH2:1][O:3][C:4](=[O:15])[CH2:5][S:6][c:7]1[n:8][c:9]([Cl:14])[cH:10][c:11](Cl)[n:12]1.[CH3:24][c:22]1[cH:21][c:20]([CH3:25])[c:18]([NH2:19])[c:17]([CH3:16])[cH:23]1.O=C([O-])[O-]>CCO>[CH3:2][CH2:1][O:3][C:4](=[O:15])[CH2:5][S:6][c:7]1[n:8][c:9]([Cl:14])[cH:10][c:11]([NH:19][c:18]2[c:17]([CH3:16])[cH:23][c:22]([CH3:24])[cH:21][c:20]2[CH3:25])[n:12]1 +03940394 [NH4+:22].[OH-].[CH3:15][c:11]1[cH:12][cH:13][cH:14][c:9]([NH:8][c:6]2[cH:7][c:2]([Cl:1])[n:3][c:4]([S:17][CH2:18][C:19](=O)[OH:21])[n:5]2)[c:10]1[CH3:16]>CCO>[CH3:15][c:11]1[cH:12][cH:13][cH:14][c:9]([NH:8][c:6]2[cH:7][c:2]([Cl:1])[n:3][c:4]([S:17][CH2:18][C:19]([NH2:22])=[O:21])[n:5]2)[c:10]1[CH3:16] +03940395 [CH3:15][O:16][CH2:17][CH2:18][CH2:19][NH2:20].[Cl:8][c:6]1[cH:7][c:2](Cl)[n:3][c:4](-[c:9]2[cH:10][cH:11][cH:12][cH:13][cH:14]2)[n:5]1>>[CH3:15][O:16][CH2:17][CH2:18][CH2:19][NH:20][c:2]1[cH:7][c:6]([Cl:8])[n:5][c:4](-[c:9]2[cH:10][cH:11][cH:12][cH:13][cH:14]2)[n:3]1 +03940395 [NH2:16][CH2:17][CH2:18][N:19]1[CH2:20][CH2:21][O:22][CH2:23][CH2:24]1.[Cl:15][c:12]1[cH:11][cH:10][c:9](-[c:4]2[n:5][c:6]([Cl:8])[cH:7][c:2](Cl)[n:3]2)[cH:14][cH:13]1>>[Cl:15][c:12]1[cH:11][cH:10][c:9](-[c:4]2[n:5][c:6]([Cl:8])[cH:7][c:2]([NH:16][CH2:17][CH2:18][N:19]3[CH2:20][CH2:21][O:22][CH2:23][CH2:24]3)[n:3]2)[cH:14][cH:13]1 +03940395 [CH3:22][N:18]([CH3:17])[CH2:19][CH2:20][NH2:21].[Cl:8][c:6]1[cH:7][c:2](Cl)[n:3][c:4](-[c:9]2[cH:14][cH:13][c:12]([Cl:15])[c:11]([Cl:16])[cH:10]2)[n:5]1>O>[CH3:17][N:18]([CH3:22])[CH2:19][CH2:20][NH:21][c:2]1[cH:7][c:6]([Cl:8])[n:5][c:4](-[c:9]2[cH:14][cH:13][c:12]([Cl:15])[c:11]([Cl:16])[cH:10]2)[n:3]1 +03940395 [OH-].[Na+].[CH3:12][O:11][CH2:10][CH2:9][NH:8][c:6]1[cH:7][c:2](Cl)[n:3][c:4](-[c:13]2[cH:14][cH:15][c:16]([O:19][CH3:20])[cH:17][cH:18]2)[n:5]1.[SH:28][c:25]1[cH:24][cH:23][c:22]([Cl:21])[cH:27][cH:26]1>>[CH3:12][O:11][CH2:10][CH2:9][NH:8][c:6]1[cH:7][c:2]([S:28][c:25]2[cH:24][cH:23][c:22]([Cl:21])[cH:27][cH:26]2)[n:3][c:4](-[c:13]2[cH:14][cH:15][c:16]([O:19][CH3:20])[cH:17][cH:18]2)[n:5]1 +03940395 [CH3:16][O:15][c:12]1[cH:11][cH:10][c:9](-[c:4]2[n:5][c:6]([Cl:8])[cH:7][c:2](Cl)[n:3]2)[cH:14][cH:13]1.[CH3:17][N:18]1[CH2:19][CH2:20][NH:21][CH2:22][CH2:23]1>CCO>[CH3:16][O:15][c:12]1[cH:11][cH:10][c:9](-[c:4]2[n:5][c:6]([Cl:8])[cH:7][c:2]([N:21]3[CH2:20][CH2:19][N:18]([CH3:17])[CH2:23][CH2:22]3)[n:3]2)[cH:14][cH:13]1 +03940395 [CH3:16][CH2:15][N:17]([CH2:21][CH3:22])[CH2:18][CH2:19][NH2:20].[SH:30][c:27]1[cH:26][cH:25][c:24]([Cl:23])[cH:29][cH:28]1.Cl[c:6]1[cH:7][c:2](Cl)[n:3][c:4](-[c:9]2[cH:10][cH:11][cH:12][cH:13][cH:14]2)[n:5]1>>[CH3:16][CH2:15][N:17]([CH2:21][CH3:22])[CH2:18][CH2:19][NH:20][c:6]1[cH:7][c:2]([S:30][c:27]2[cH:26][cH:25][c:24]([Cl:23])[cH:29][cH:28]2)[n:3][c:4](-[c:9]2[cH:10][cH:11][cH:12][cH:13][cH:14]2)[n:5]1 +03940395 [Na].Cl.CCO[C:15](=[O:16])[CH2:14][C:13](=[O:20])OCC.[NH:9]=[C:8]([NH2:10])[c:7]1[cH:6][cH:5][c:4]([Cl:3])[cH:12][cH:11]1>CCO>[O:16]=[C:15]1[CH2:14][C:13](=[O:20])[NH:10][C:8]([c:7]2[cH:6][cH:5][c:4]([Cl:3])[cH:12][cH:11]2)=[N:9]1 +03940395 [CH3:15][O:16][CH2:17][CH2:18][NH2:19].[Cl:8][c:6]1[cH:7][c:2](Cl)[n:3][c:4](-[c:9]2[cH:10][cH:11][cH:12][cH:13][cH:14]2)[n:5]1>O>[CH3:15][O:16][CH2:17][CH2:18][NH:19][c:2]1[cH:7][c:6]([Cl:8])[n:5][c:4](-[c:9]2[cH:10][cH:11][cH:12][cH:13][cH:14]2)[n:3]1 +03940402 [NH4+].[Cl-].[CH3:29][CH2:28][CH2:27][CH2:26][CH2:25][CH2:24][CH2:23][CH2:22][CH2:21][CH2:20][CH2:19][CH2:18][CH2:17][CH2:16][CH2:15][CH2:14][CH2:13][CH2:12][NH:11][CH3:10].CN([SiH](C)C)[Si:4]([CH3:5])([CH3:6])[CH3:7]>>[CH3:29][CH2:28][CH2:27][CH2:26][CH2:25][CH2:24][CH2:23][CH2:22][CH2:21][CH2:20][CH2:19][CH2:18][CH2:17][CH2:16][CH2:15][CH2:14][CH2:13][CH2:12][N:11]([CH3:10])[Si:4]([CH3:5])([CH3:6])[CH3:7] +03940402 [CH3:7][CH2:6][CH2:5][CH2:4][CH2:3][CH2:2]Br.CN(C)[S+](N(C)C)N(C)C.[N:10]#[C:9][S-:8]>CC#N>[CH3:7][CH2:6][CH2:5][CH2:4][CH2:3][CH2:2][S:8][C:9]#[N:10] +03940403 [CH2:3]=[N+:1]=[N-:2].[CH3:33][CH2:32][O:31][C:29](=[O:30])[CH2:28][CH2:27][c:24]1[cH:25][n:26][c:18]([O:11][c:12]2[cH:13][cH:14][cH:15][cH:16][cH:17]2)[cH:19][c:20]1[C:21](=[O:22])Cl.NC(=O)NCN=O>>[CH3:33][CH2:32][O:31][C:29](=[O:30])[CH2:28][CH2:27][c:24]1[cH:25][n:26][c:18]([O:11][c:12]2[cH:17][cH:16][cH:15][cH:14][cH:13]2)[cH:19][c:20]1[C:21](=[O:22])[CH:3]=[N+:1]=[N-:2] +03940403 [H-].[Na+].[CH3:21]I.[CH3:17][O:16][C:14](=[O:15])[CH:13]([CH3:18])[c:11]1[cH:10][cH:9][n:8][c:7]([O:6][c:5]2[cH:4][cH:3][c:2]([Cl:1])[cH:20][cH:19]2)[cH:12]1>C1CCOC1>[CH3:17][O:16][C:14](=[O:15])[C:13]([CH3:18])([CH3:21])[c:11]1[cH:10][cH:9][n:8][c:7]([O:6][c:5]2[cH:19][cH:20][c:2]([Cl:1])[cH:3][cH:4]2)[cH:12]1 +03940407 [NH2:27][CH2:26][CH2:25][O:24][c:23]1[cH:22][cH:21][c:20]([C:17]([NH2:18])=[O:19])[cH:29][cH:28]1.[cH:15]1[s:14][n:13][n:12][c:11]1-[c:8]1[cH:7][cH:6][c:5]([O:4][CH2:3][CH:2]2[CH2:16][O:1]2)[cH:10][cH:9]1>CCO>[NH2:18][C:17](=[O:19])[c:20]1[cH:21][cH:22][c:23]([O:24][CH2:25][CH2:26][NH:27][CH2:16][CH:2]([OH:1])[CH2:3][O:4][c:5]2[cH:6][cH:7][c:8](-[c:11]3[cH:15][s:14][n:13][n:12]3)[cH:9][cH:10]2)[cH:28][cH:29]1 +03940407 [CH3:18][C:17]([CH3:19])([CH3:20])[NH2:21].[cH:12]1[n:13][n:14][s:15][c:11]1-[c:8]1[cH:7][cH:6][c:5]([O:4][CH2:3][CH:2]2[CH2:16][O:1]2)[cH:10][cH:9]1>CC(C)(C)O>[CH3:18][C:17]([CH3:19])([CH3:20])[NH:21][CH2:16][CH:2]([OH:1])[CH2:3][O:4][c:5]1[cH:6][cH:7][c:8](-[c:11]2[cH:12][n:13][n:14][s:15]2)[cH:9][cH:10]1 +03940407 [OH-].[Na+].CO.CC[O:23][C:21](=[O:22])[c:20]1[s:19][n:18][n:17][c:16]1-[c:13]1[cH:12][cH:11][c:10]([O:9][CH2:8][CH:7]([OH:26])[CH2:6][NH:5][C:1]([CH3:2])([CH3:3])[CH3:4])[cH:15][cH:14]1>O>[CH3:3][C:1]([CH3:2])([CH3:4])[NH:5][CH2:6][CH:7]([OH:26])[CH2:8][O:9][c:10]1[cH:11][cH:12][c:13](-[c:16]2[n:17][n:18][s:19][c:20]2[C:21](=[O:22])[OH:23])[cH:14][cH:15]1 +03940407 [Na+].[CH3:15][CH:14](O)[c:11]1[cH:10][cH:9][c:8]([O:7][CH:2]2[CH2:3][CH2:4][CH2:5][CH2:6][O:1]2)[cH:13][cH:12]1.O=S(=O)([O-:18])O>ClCCl>[O:18]=[CH:15][CH2:14][c:11]1[cH:10][cH:9][c:8]([O:7][CH:2]2[CH2:3][CH2:4][CH2:5][CH2:6][O:1]2)[cH:13][cH:12]1 +03940407 [CH3:18][C:17]([CH3:19])([CH3:20])[NH2:21].[cH:15]1[s:14][n:13][n:12][c:11]1-[c:8]1[cH:7][cH:6][c:5]([O:4][CH2:3][CH:2]2[CH2:16][O:1]2)[cH:10][cH:9]1>CC(C)(C)O>[CH3:18][C:17]([CH3:19])([CH3:20])[NH:21][CH2:16][CH:2]([OH:1])[CH2:3][O:4][c:5]1[cH:6][cH:7][c:8](-[c:11]2[cH:15][s:14][n:13][n:12]2)[cH:9][cH:10]1 +03940411 CCO.CCO[C:10](=[NH:14])[c:3]1[n:4][cH:5][c:6]([N+:7](=[O:8])[O-:9])[n:2]1[CH3:1].[NH2:18][NH:19][C:20]([NH2:22])=[S:21]>CC(=O)O>[CH3:1][n:2]1[c:3]([C:10](=[NH:14])[NH:18][NH:19][C:20]([NH2:22])=[S:21])[n:4][cH:5][c:6]1[N+:7](=[O:8])[O-:9] +03940411 CCO[C:10](=[NH:11])[c:12]1[n:16][cH:15][c:14]([N+:17](=[O:18])[O-:19])[n:13]1[CH3:20].[CH3:3][CH2:2][C:1](=[O:4])[NH:5][NH2:6]>>[CH3:3][CH2:2][C:1](=[O:4])[NH:5][NH:6][C:10](=[NH:11])[c:12]1[n:16][cH:15][c:14]([N+:17](=[O:18])[O-:19])[n:13]1[CH3:20] +03940411 CCO[C:23](=[NH:27])[c:16]1[n:17][cH:18][c:19]([N+:20](=[O:21])[O-:22])[n:15]1[CH3:14].[CH3:2][CH2:1][N:3]([NH2:4])[C:5]([NH2:7])=[O:6].[CH3:8][NH:9][C:10](=[O:13])[NH:11][NH2:12]>>[CH3:2][CH2:1][N:3]([NH:4][C:23](=[NH:27])[c:16]1[n:17][cH:18][c:19]([N+:20](=[O:21])[O-:22])[n:15]1[CH3:14])[C:5]([NH2:7])=[O:6].[CH3:8][NH:9][C:10](=[O:13])[NH:11][NH:12][C:23](=[NH:27])[c:16]1[n:17][cH:18][c:19]([N+:20](=[O:21])[O-:22])[n:15]1[CH3:14] +03940416 [CH3:22][CH2:21][NH:23][CH2:24][CH3:25].[O:18]=[S:17](=[O:19])(Cl)[c:3]1[c:4]2[nH:8][c:7]([C:9]([F:10])([F:11])[F:12])[n:6][c:5]2[c:13]([Cl:16])[c:14]([Cl:15])[c:2]1[Cl:1]>CC(C)=O>[CH3:22][CH2:21][N:23]([CH2:24][CH3:25])[S:17](=[O:18])(=[O:19])[c:3]1[c:4]2[nH:8][c:7]([C:9]([F:10])([F:11])[F:12])[n:6][c:5]2[c:13]([Cl:16])[c:14]([Cl:15])[c:2]1[Cl:1] +03940418 [OH-].[Na+].Cl.C[O:22][C:20](=[O:21])[c:10]1[n:11][n:12](-[c:14]2[cH:15][cH:16][cH:17][cH:18][cH:19]2)[c:13]2[c:9]1[CH2:8][CH2:7][c:6]1[cH:24][c:2]([Cl:1])[cH:3][cH:4][c:5]1-2>CO>[O:21]=[C:20]([OH:22])[c:10]1[n:11][n:12](-[c:14]2[cH:15][cH:16][cH:17][cH:18][cH:19]2)[c:13]2[c:9]1[CH2:8][CH2:7][c:6]1[cH:24][c:2]([Cl:1])[cH:3][cH:4][c:5]1-2 +03940419 [Cl-:22].O=[C:16]([OH:18])[C:10]1([N:7]2[C:5](=[O:6])[c:4]3[cH:19][cH:20][cH:21][c:2](Cl)[c:3]3[C:8]2=[O:9])[CH2:11][CH2:12][CH2:13][CH2:14][CH2:15]1>>[O:18]=[C:16]([Cl:22])[C:10]1([N:7]2[C:8](=[O:9])[CH:3]3[CH2:2][CH:21]=[CH:20][CH2:19][CH:4]3[C:5]2=[O:6])[CH2:11][CH2:12][CH2:13][CH2:14][CH2:15]1 +03940421 [CH3:17][CH2:16][CH2:15][CH2:14][CH2:13][CH:2]([CH3:1])[CH:3]([CH3:4])[c:5]1[cH:11][c:9]([OH:10])[cH:8][c:7]([OH:12])[cH:6]1.[CH3:27][O:26][C:24](=[O:25])[CH:20]1[S:21][CH2:22][CH2:23][C:19]1=O>CCO>[CH3:17][CH2:16][CH2:15][CH2:14][CH2:13][CH:2]([CH3:1])[CH:3]([CH3:4])[c:5]1[cH:11][c:9]([OH:10])[c:8]2[c:19]3[c:20]([c:24](=[O:25])[o:12][c:7]2[cH:6]1)[S:21][CH2:22][CH2:23]3.[O:25]=[c:24]1[cH:20][cH:19][c:23]2[cH:22][cH:3][cH:2][cH:1][c:27]2[o:26]1 +03940421 [CH3:22][CH2:21][CH2:20][CH2:19][CH2:18][CH:17]([CH3:23])[CH:15]([CH3:16])[c:13]1[cH:12][c:11]([OH:24])[c:5]2[c:4]([cH:14]1)[O:3][C:2]([CH3:25])([CH3:1])[C:7]1=[C:6]2[CH2:10][CH2:9][S:8]1.CNC.C[N:31]([CH3:30])[c:32]1ccccc1.O=C([O-])Cl.[O:29]=[C:27](Cl)Cl>>[CH3:22][CH2:21][CH2:20][CH2:19][CH2:18][CH:17]([CH3:23])[CH:15]([CH3:16])[c:13]1[cH:12][c:11]([O:24][C:27](=[O:29])[N:31]([CH3:30])[CH3:32])[c:5]2[c:4]([cH:14]1)[O:3][C:2]([CH3:1])([CH3:25])[C:7]1=[C:6]2[CH2:10][CH2:9][S:8]1 +03940421 Cl.[CH3:30]CO.[CH3:9][CH2:8][CH2:7][CH2:6][CH2:5][CH2:4][CH:3]([CH2:2]C)[c:10]1[cH:16][c:14]([OH:15])[cH:13][c:12]([OH:17])[cH:11]1.CO[C:25](=[O:26])[CH:20]1[S:21][CH2:22][CH2:23][CH2:24][C:19]1=O>>[CH3:9][CH2:8][CH2:7][CH2:6][CH2:5][CH:4]([CH3:30])[CH:3]([CH3:2])[c:10]1[cH:11][c:12]([OH:17])[c:13]2[c:14]([cH:16]1)[o:15][c:25](=[O:26])[c:20]1[c:19]2[CH2:24][CH2:23][CH2:22][S:21]1 +03940421 [CH3:15][CH2:14][CH2:13][CH2:12][CH2:11][c:16]1[cH:22][c:20]([OH:21])[cH:19]c(O)[cH:17]1.[CH3:10][O:9][C:7](=[O:8])[CH:3]1[S:4][CH2:5][CH2:6][C:2]1=O>>[CH3:15][CH2:14][CH2:13][CH2:12][CH2:11][c:16]1[cH:22][c:20]([OH:21])[c:19]2[c:2]3[c:3]([c:7](=[O:8])[o:9][c:10]2[cH:17]1)[S:4][CH2:5][CH2:6]3 +03940421 [Br-].[CH3:28][CH2:27][CH2:26][CH2:25][CH2:24][CH2:23][Mg+].[CH3:6][CH:5]([CH2:4][CH:1]1[CH2:2][CH2:3]1)[c:7]1[cH:20][c:19]([OH:21])[c:10]2[c:11]3[c:12]([c:13](=O)[o:14][c:9]2[cH:8]1)[S:16][CH2:17][CH2:18]3>>[CH3:28][CH2:27][CH2:26][CH2:25][CH2:24][CH2:23][C:13]1([CH2:3][CH2:2][CH2:1][CH2:4][CH2:5][CH3:6])[O:14][c:9]2[cH:8][c:7]([CH:5]([CH3:6])[CH2:4][CH:1]3[CH2:2][CH2:3]3)[cH:20][c:19]([OH:21])[c:10]2[C:11]2=[C:12]1[S:16][CH2:17][CH2:18]2 +03940422 C[O:36][C:27](=[O:35])[c:28]1[cH:34][cH:33][cH:32][cH:31][c:29]1[NH2:30].[CH3:21][O:20][c:19]1[cH:18][cH:17][c:11]([CH:12]=[CH:13][C:14](=O)[OH:16])[cH:10][c:9]1[O:8][CH3:7].O=P(Cl)(Cl)Cl.C1COCCO1>c1ccncc1>[CH3:21][O:20][c:19]1[cH:18][cH:17][c:11]([CH:12]=[CH:13][C:14](=[O:16])[NH:30][c:29]2[cH:31][cH:32][cH:33][cH:34][c:28]2[C:27](=[O:35])[OH:36])[cH:10][c:9]1[O:8][CH3:7] +03940434 O=C[c:9]1[cH:12][cH:13][cH:14][cH:15][c:8]1[CH:1]1[CH2:2][CH2:3][CH2:4][CH2:5][CH2:6][CH2:7]1.Cl[CH:30](Cl)[O:32]C(Cl)Cl.c1ccc(C2CCCCCC2)cc1>[Cl-].[Cl-].[Cl-].[Cl-].[Ti+4].ClCCl>[O:32]=[CH:30][c:13]1[cH:14][cH:15][c:8]([CH:1]2[CH2:7][CH2:6][CH2:5][CH2:4][CH2:3][CH2:2]2)[cH:9][cH:12]1 +03940437 [O:2]=[CH:1][c:3]1[cH:12][cH:11][c:10]2[c:5]([cH:4]1)[CH2:6][CH2:7][CH2:8][CH2:9]2.[O:14]=[S:13](=[O:15])=[O:16]>>[O:2]=[CH:1][c:3]1[cH:4][c:5]2[c:10]([c:11]([S:13](=[O:14])(=[O:15])[OH:16])[cH:12]1)[CH2:9][CH2:8][CH2:7][CH2:6]2 +03940444 [BH4-].[OH-].[Na+].[K+].[CH3:23][CH2:24][OH:25].[CH3:6][CH2:5][C:4](=[O:7])[CH:3]=[C:2]([CH3:1])[CH:8]=[CH:9][CH2:10][CH:11]([CH3:18])[CH2:12][CH2:13][CH:14]=[C:15]([CH3:16])[CH3:17]>>[CH3:23][CH2:24][O:25][C:15]([CH3:17])([CH3:16])[CH2:14][CH2:13][CH2:12][CH:11]([CH3:18])[CH2:10][CH:9]=[CH:8][C:2]([CH3:1])=[CH:3][C:4](=[O:7])[CH2:5][CH3:6] +03940484 [NH3:15].[CH3:1][C:2]1([C:8](=O)[CH2:10]Br)[CH2:3][CH2:4][CH2:5][CH2:6][CH2:7]1.[NH2:14][CH:12]=O>>[CH3:1][C:2]1([c:8]2[cH:10][nH:14][cH:12][n:15]2)[CH2:3][CH2:4][CH2:5][CH2:6][CH2:7]1 +03940486 [Na+].[Na+].[O:17]=[N:16][O-].O=C([O-])O.[O:9]=[C:8]([CH2:1][c:2]1[cH:3][cH:4][cH:5][cH:6][cH:7]1)[c:10]1[cH:15][cH:14][cH:13][n:12][cH:11]1>O.Cl.CCO>[O:9]=[C:8]([C:1](=[N:16][OH:17])[c:2]1[cH:7][cH:6][cH:5][cH:4][cH:3]1)[c:10]1[cH:15][cH:14][cH:13][n:12][cH:11]1 +03940489 [Na+].[CH3:26][C:25]([CH3:27])([CH3:28])Br.[N:2]#[C:1][c:3]1[cH:14][cH:13][cH:12][c:5]([O:6][CH2:7][CH:8]([OH:11])[CH2:9][NH2:10])[cH:4]1.O=C([O-])O.C1CCOC1>CN(C)C=O>[CH3:26][C:25]([CH3:27])([CH3:28])[NH:10][CH2:9][CH:8]([OH:11])[CH2:7][O:6][c:5]1[cH:12][cH:13][cH:14][c:3]([C:1]#[N:2])[cH:4]1 +03941581 [Na+].[Cl-].[CH3:8][CH2:7][C:6](=[O:9])[NH:5][c:4]1[cH:10][cH:11][cH:12][c:2]([NH2:1])[cH:3]1.[CH3:14][C:15](=[O:17])[O-].O=C(Cl)Cl.[CH2:23]1C[CH2:22]1>CC(=O)O>[CH3:8][CH2:7][C:6](=[O:9])[NH:5][c:4]1[cH:10][cH:11][cH:12][c:2]([NH:1][C:15](=[O:17])[CH:14]2[CH2:22][CH2:23]2)[cH:3]1 +03941782 [ClH:28].[CH3:26][CH2:25][CH2:24][CH2:23][CH2:22][CH:21]([CH3:27])[CH:19]([CH3:20])[c:4]1[cH:3][c:2]([OH:1])[c:11]2[c:6]([cH:5]1)[O:7][C:8]([CH3:17])([CH3:18])[C:9]1=[C:10]2[CH:12]([CH3:16])[CH2:13][CH2:14][CH2:15]1.[O:38]=[C:37](O)[CH2:36][CH2:35][CH2:34][N:29]1[CH2:30][CH2:31][CH2:32][CH2:33]1>>[ClH:28].[CH3:26][CH2:25][CH2:24][CH2:23][CH2:22][CH:21]([CH3:27])[CH:19]([CH3:20])[c:4]1[cH:3][c:2]([O:1][C:37](=[O:38])[CH2:36][CH2:35][CH2:34][N:29]2[CH2:30][CH2:31][CH2:32][CH2:33]2)[c:11]2[c:6]([cH:5]1)[O:7][C:8]([CH3:18])([CH3:17])[C:9]1=[C:10]2[CH:12]([CH3:16])[CH2:13][CH2:14][CH2:15]1 +03941782 Cl.[ClH:41].[CH3:22][CH2:21][CH2:20][CH2:19][CH2:18][CH:17]([CH3:23])[CH:15]([CH3:16])[c:13]1[cH:12][c:11]([OH:24])[c:5]2[c:4]([cH:14]1)[O:3][C:2]([CH3:25])([CH3:1])[C:7]1=[C:6]2[CH2:10][CH2:9][CH2:8]1.[O:51]=[C:50](O)[CH2:49][CH2:48][N:42]1[CH2:43][CH2:44][CH2:45][CH2:46][CH2:47]1.C(=NC1CCCCC1)=NC1CCCCC1>ClCCl>[ClH:41].[CH3:22][CH2:21][CH2:20][CH2:19][CH2:18][CH:17]([CH3:23])[CH:15]([CH3:16])[c:13]1[cH:12][c:11]([O:24][C:50](=[O:51])[CH2:49][CH2:48][N:42]2[CH2:43][CH2:44][CH2:45][CH2:46][CH2:47]2)[c:5]2[c:4]([cH:14]1)[O:3][C:2]([CH3:1])([CH3:25])[C:7]1=[C:6]2[CH2:10][CH2:9][CH2:8]1 +03941782 O.[BrH:14].C[O:12][C:10](=[O:11])[CH2:9][CH2:8][CH2:7][N:4]1[CH2:3][CH2:2][O:1][CH2:6][CH2:5]1>CC(C)=O>[BrH:14].[O:11]=[C:10]([OH:12])[CH2:9][CH2:8][CH2:7][N:4]1[CH2:5][CH2:6][O:1][CH2:2][CH2:3]1 +03941789 [CH3:20][c:16]1[cH:17][cH:18][cH:19][c:14]([N:11]2[CH2:10][CH2:9][N:8]([CH2:7][CH2:6][c:5]3[cH:4][cH:3][c:2]([NH2:1])[cH:22][cH:21]3)[CH2:13][CH2:12]2)[cH:15]1.[O:29]=[C:28]=[N:27][CH2:26][CH2:25][CH2:24][Cl:23]>Cc1ccccc1>[CH3:20][c:16]1[cH:17][cH:18][cH:19][c:14]([N:11]2[CH2:10][CH2:9][N:8]([CH2:7][CH2:6][c:5]3[cH:21][cH:22][c:2]([NH:1][C:28](=[O:29])[NH:27][CH2:26][CH2:25][CH2:24][Cl:23])[cH:3][cH:4]3)[CH2:13][CH2:12]2)[cH:15]1 +03941793 O.[Na+].[Na+].[CH3:15][CH2:14][CH2:13][CH2:12][c:9]1[cH:8][cH:7][c:6]2[n:5][c:4]([C:16](=[O:17])[O:18][CH2:19][CH3:20])[cH:3][c:2](O)[c:11]2[cH:10]1.O=C([O-])[O-].O=P([Cl:23])(Cl)Cl>CCO>[CH3:15][CH2:14][CH2:13][CH2:12][c:9]1[cH:8][cH:7][c:6]2[n:5][c:4]([C:16](=[O:17])[O:18][CH2:19][CH3:20])[cH:3][c:2]([Cl:23])[c:11]2[cH:10]1 +03941795 Cl.Cl.[CH3:34][C:33]([CH3:35])([CH3:36])[c:30]1[cH:29][cH:28][c:27]([C:25](=[O:26])[CH2:24][CH2:23][CH2:22][N:19]2[CH2:18][CH2:17][CH:16]([C:8]([OH:15])([c:9]3[cH:10][cH:11][cH:12][cH:13][cH:14]3)[CH:2]3[CH2:3][CH2:4][CH2:5][CH2:6][CH2:7]3)[CH2:21][CH2:20]2)[cH:32][cH:31]1.CC(C)(C)c1ccc(C(O)(c2ccccc2)C2CCN(CCCC(=O)c3ccccc3)CC2)cc1>>[CH3:35][C:33]([CH3:34])([CH3:36])[c:30]1[cH:31][cH:32][c:27]([CH:25]([OH:26])[CH2:24][CH2:23][CH2:22][N:19]2[CH2:20][CH2:21][CH:16]([C:8]([OH:15])([c:2]3[cH:7][cH:6][cH:5][cH:4][cH:3]3)[CH:9]3[CH2:14][CH2:13][CH2:12][CH2:11][CH2:10]3)[CH2:17][CH2:18]2)[cH:28][cH:29]1 +03941796 [BrH:31].C[O:9][c:8]1[cH:7][cH:6][c:5]([C:11]2([c:17]3[cH:22][cH:21][cH:20][c:19]([CH2:23][CH2:24][c:25]4[cH:26][cH:27][cH:28][cH:29][cH:30]4)[n:18]3)[O:12]CCCO2)[cH:4][c:3]1[O:2]C>>[BrH:31].[O:12]=[C:11]([c:5]1[cH:6][cH:7][c:8]([OH:9])[c:3]([OH:2])[cH:4]1)[c:17]1[cH:22][cH:21][cH:20][c:19]([CH2:23][CH2:24][c:25]2[cH:26][cH:27][cH:28][cH:29][cH:30]2)[n:18]1 +03941798 [Na+].[Cl-:5].[CH3:7][CH:6]([CH3:8])[c:9]1[n:10][n:11](-[c:15]2[cH:20][cH:19][c:18]([Cl:21])[cH:17][c:16]2[N+:22](=[O:23])[O-:24])[c:12](=[O:14])[o:13]1.O=N[O-]>O.Cl>[CH3:7][CH:6]([CH3:8])[CH:9]1[N:10]=[N:11][C:12](=[O:14])[O:13]1.[O:23]=[N+:22]([O-:24])[c:16]1[cH:17][c:18]([Cl:21])[cH:19][cH:20][c:15]1[Cl:5] +03941803 [CH2:22]=[O:23].[O:21]=[C:8]([c:3]1[cH:4][cH:5][cH:6][cH:7][c:2]1[Cl:1])[c:9]1[cH:14][c:13]([Cl:15])[cH:12][cH:11][c:10]1-[n:16]1[cH:20][cH:19][n:18][cH:17]1>>[O:21]=[C:8]([c:3]1[cH:4][cH:5][cH:6][cH:7][c:2]1[Cl:1])[c:9]1[cH:14][c:13]([Cl:15])[cH:12][cH:11][c:10]1-[n:16]1[cH:20][cH:19][n:18][c:17]1[CH2:22][OH:23] +03941803 NN.O=C(c1ccccc1)[c:6]1[cH:15][c:2]([Cl:1])[cH:3][cH:4][c:5]1-[n:16]1[cH:20][cH:19][n:18][c:17]1[CH2:21][N:22]1C(=O)[c:24]2[cH:31][cH:30][cH:29][cH:28][c:25]2[C:26]1=O>CCO>[Cl:1][c:2]1[cH:3][cH:4][c:5]2[c:6]([cH:15]1)[C:26]([c:25]1[cH:24][cH:31][cH:30][cH:29][cH:28]1)=[N:22][CH2:21][c:17]1[n:18][cH:19][cH:20][n:16]1-2 +03941806 [Na+].CC(=O)[O-].[CH3:12][C:13](=O)[CH2:15][c:16]1[cH:17][cH:18][cH:19][cH:20][cH:21]1.N[N:2]1[CH2:3][CH2:4][c:5]2[cH:6][c:7]([Cl:11])[cH:8][cH:9][c:10]21>CC(=O)O>[CH3:12][c:13]1[c:15](-[c:16]2[cH:17][cH:18][cH:19][cH:20][cH:21]2)[c:9]2[cH:8][c:7]([Cl:11])[cH:6][c:5]3[c:10]2[n:2]1[CH2:3][CH2:4]3 +03941806 [OH-].[Na+].CC[OH:21].[CH3:1][c:2]1[c:3](-[c:13]2[cH:14][cH:15][cH:16][cH:17][cH:18]2)[c:4]2[cH:5][cH:6][cH:7][c:8]3[c:12]2[n:11]1[CH2:10][CH2:9]3.O=S(=O)(O)O>O>[CH3:1][C:2](=[O:21])[CH:3]([c:13]1[cH:14][cH:15][cH:16][cH:17][cH:18]1)[c:4]1[cH:5][cH:6][cH:7][c:8]2[c:12]1[NH:11][CH2:10][CH2:9]2 +03941811 O.O.O.O.O.[Na+].[Na+].[Na+].[Na+].[Ag+:19].O=[N+]([O-])[O-].[O-:7][Si:6]([O-:8])([O-:9])[O-:10]>O>[Ag+:19].[Ag+:19].[Ag+:19].[Ag+:19].[O-:7][Si:6]([O-:8])([O-:9])[O-:10] +03941813 [H-].[H-].[H-].[H-].[Li+].[Al+3].CCOC(C)=O.[O:12]=[C:3]1[O:2][CH:1]2[CH2:9][CH:8]3[CH2:7][CH:6]([CH2:11]2)[O:5][CH:4]1[O:10]3>COCCOC>[OH:12][CH2:3][CH:4]1[O:10][CH:8]2[CH2:9][CH:1]([OH:2])[CH2:11][CH:6]([CH2:7]2)[O:5]1 +03941813 [F-].[Na+].[Na+].[Cl-].CCCC[N+](CCCC)(CCCC)CCCC.[CH3:20][S:17](=[O:18])(=[O:19])[O:16][CH2:15][CH:10]1[O:9][CH:8]2[CH2:7][CH:6](OS(C)(=O)=O)[CH2:13][CH:12]([CH2:14]2)[O:11]1.O=C([O-])O>O.CN(C)C=O.ClCCl>[CH3:20][S:17](=[O:19])(=[O:18])[O:16][CH2:15][CH:10]1[O:11][CH:12]2[CH:13]=[CH:6][CH2:7][CH:8]([CH2:14]2)[O:9]1 +03941815 [O:6]=[C:5]1[CH:4]=[CH:3][C:2](=[O:1])[c:12]2[cH:11][cH:10][cH:9][cH:8][c:7]21.O=[N+:19]([O-:20])[OH:18].O=S(=O)(O)O>O>[O:1]=[C:2]1[CH:3]=[CH:4][C:5](=[O:6])[c:7]2[c:12]1[cH:11][cH:10][cH:9][c:8]2[N+:19](=[O:18])[O-:20] +03941818 [Cl-].[Cl-:1].[Zn+2:2].[CH3:4][S:5][CH2:6][CH2:7][CH:8]([NH2:9])[C:10](=[O:12])[OH:11]>O>[Cl-:1].[Cl-:1].[Zn+2:2].[CH3:4][S:5][CH2:6][CH2:7][C@H:8]([NH2:9])[C:10](=[O:11])[OH:12] +03941821 [H-].[Na+].CI.[CH3:26][CH2:25][O:24][C:22](=[O:23])[CH:21]([OH:27])[c:18]1[cH:17][cH:16][c:15](-[c:10]2[cH:11][cH:12][cH:13][cH:14][c:9]2[OH:8])[cH:20][cH:19]1.CN([CH3:3])C=O>O>[CH3:26][CH2:25][O:24][C:22](=[O:23])[CH:21]([OH:27])[c:18]1[cH:17][cH:16][c:15](-[c:10]2[cH:11][cH:12][cH:13][cH:14][c:9]2[O:8][CH3:3])[cH:20][cH:19]1 +03941821 [OH-].[K+].CC[O:17][C:15](=[O:16])[CH:14]([OH:20])[c:11]1[cH:10][cH:9][c:8](-[c:3]2[cH:4][cH:5][cH:6][cH:7][c:2]2[Cl:1])[cH:13][cH:12]1>CC(C)O>[O:16]=[C:15]([OH:17])[CH:14]([OH:20])[c:11]1[cH:10][cH:9][c:8](-[c:3]2[cH:4][cH:5][cH:6][cH:7][c:2]2[Cl:1])[cH:13][cH:12]1 +03941821 CC[O:5][C:3](=O)[CH:2]([Cl:1])[c:8]1[cH:9][cH:10][c:11](-[c:14]2[cH:19][cH:18][cH:17][cH:16][c:15]2[Cl:20])[cH:12][cH:13]1.[CH3:23][CH:22]([CH3:21])[NH2:24]>>[CH3:21][CH:22]([CH3:23])[NH:24][C:3](=[O:5])[CH:2]([Cl:1])[c:8]1[cH:13][cH:12][c:11](-[c:14]2[cH:19][cH:18][cH:17][cH:16][c:15]2[Cl:20])[cH:10][cH:9]1 +03941821 CCOC(=O)C(Br)c1ccc(-c2ccccc2[Cl:20])cc1.[CH3:48][CH2:47][O:46][C:44](=[O:45])[CH:43]([I:42])[c:49]1[cH:50][cH:51][c:52](-[c:55]2[cH:60][cH:59][cH:58][cH:57][c:56]2Cl)[cH:53][cH:54]1.CC(C)NC(=O)C(Br)c1ccc(-c2ccccc2Cl)cc1.CC(C)NC(=O)C(I)c1ccc(-c2ccccc2Cl)cc1>>[CH3:48][CH2:47][O:46][C:44](=[O:45])[CH:43]([I:42])[c:49]1[cH:54][cH:53][c:52]([CH:55]2[CH2:56][CH2:57][CH2:58][CH2:59][CH2:60]2)[c:51]([Cl:20])[cH:50]1 +03941821 CCCOC(=O)C(=O)c1ccc(-c2ccccc2Cl)cc1.COC(=O)C(=O)[c:11]1[cH:10][cH:9][c:8](-[c:3]2[cH:4][cH:5][cH:6][cH:7][c:2]2[Cl:1])[cH:13][cH:12]1.CC(C)(C)OC(=O)C(=O)c1ccc(-c2ccccc2Cl)cc1.O=C(OCc1ccccc1)C(=O)c1ccc(-c2ccccc2Cl)cc1>>[Cl:1][c:2]1[cH:7][cH:6][cH:5][cH:4][c:3]1-[c:8]1[cH:13][cH:12][cH:11][cH:10][cH:9]1 +03941821 [CH3:21]I.[CH3:19][CH2:18][O:17][C:15](=[O:16])[CH:14]([OH:20])[c:11]1[cH:10][cH:9][c:8](-[c:3]2[cH:4][cH:5][cH:6][cH:7][c:2]2[NH2:1])[cH:13][cH:12]1>c1ccncc1>[CH3:19][CH2:18][O:17][C:15](=[O:16])[CH:14]([OH:20])[c:11]1[cH:10][cH:9][c:8](-[c:3]2[cH:4][cH:5][cH:6][cH:7][c:2]2[NH:1][CH3:21])[cH:13][cH:12]1 +03941825 [NH2:14][N:13]=[C:12]([NH2:15])[NH:11][NH2:10].O=[CH:6][c:5]1[cH:4][cH:3][c:2]([Br:1])[cH:9][cH:8]1.[O:19]=[N+:17]([O-:18])[O-:16].O=[N+]([O-])O>O.CCO>[NH:15]=[C:12]([NH:11][N:10]=[CH:6][c:5]1[cH:4][cH:3][c:2]([Br:1])[cH:9][cH:8]1)[NH:13][N:14]=[CH:6][c:5]1[cH:4][cH:3][c:2]([Br:1])[cH:9][cH:8]1.[O:16]=[N+:17]([O-:19])[O-:18] +03941825 [NH:14]=[C:13]([NH:15][NH2:16])[NH:12][NH2:11].O=[CH:5][c:4]1[cH:7][cH:8][c:9]([Cl:10])[c:2]([Cl:1])[cH:3]1.[O:20]=[N+:18]([O-:19])[O-:17].O=[N+]([O-])O>O.CCO>[NH:14]=[C:13]([NH:15][N:16]=[CH:5][c:4]1[cH:7][cH:8][c:9]([Cl:10])[c:2]([Cl:1])[cH:3]1)[NH:12][N:11]=[CH:5][c:4]1[cH:7][cH:8][c:9]([Cl:10])[c:2]([Cl:1])[cH:3]1.[O:17]=[N+:18]([O-:20])[O-:19] +03941825 [OH-].[Na+].Cl.CCO.[NH:5]=[C:4]([NH:6][NH2:7])[NH:3][NH2:2].O=[CH:16][c:15]1[cH:14][cH:13][c:12]([Cl:11])[cH:19][cH:18]1>O>[ClH:11].[NH:5]=[C:4]([NH:3][NH2:2])[NH:6][N:7]=[CH:16][c:15]1[cH:14][cH:13][c:12]([Cl:11])[cH:19][cH:18]1 +03941826 N.O.[C-:16]#[N:17].[CH3:1][S:2][c:3]1[cH:8][c:7]([CH:9]([CH3:10])[CH3:11])[c:6](Br)[cH:5][c:4]1[CH:13]([CH3:14])[CH3:15]>CN1CCCC1=O>[CH3:1][S:2][c:3]1[cH:8][c:7]([CH:9]([CH3:10])[CH3:11])[c:6]([C:16]#[N:17])[cH:5][c:4]1[CH:13]([CH3:14])[CH3:15] +03941826 [OH-].[Na+].COS(=O)(=O)O[CH3:17].[CH3:13][CH:12]([CH3:14])[c:4]1[cH:3][c:2]([Br:1])[c:7]([CH:8]([CH3:9])[CH3:10])[cH:6][c:5]1[SH:11]>O>[CH3:17][S:11][c:5]1[cH:6][c:7]([CH:8]([CH3:10])[CH3:9])[c:2]([Br:1])[cH:3][c:4]1[CH:12]([CH3:13])[CH3:14] +03941826 [CH3:13][CH:12]([CH3:14])[c:4]1[cH:3][c:2]([Cl:1])[c:7]([CH:8]([CH3:9])[CH3:10])[cH:6][c:5]1[SH:11].CC(C)c1c[c:16](Br)c(C(C)C)cc1S>>[CH3:16][S:11][c:5]1[cH:6][c:7]([CH:8]([CH3:10])[CH3:9])[c:2]([Cl:1])[cH:3][c:4]1[CH:12]([CH3:13])[CH3:14] +03941828 [Na+].[Na+].[CH3:14][CH2:13][C:12]#[C:11][CH2:10][C:2]1(Cl)C(=O)[CH2:4][CH2:5][CH2:6][C:7]1=[O:8].O=C([O-])[O-]>Cc1ccccc1C>[CH3:14][CH2:13][C:12]#[C:11][CH2:10][C:2]1=[CH:4][CH2:5][CH2:6][C:7]1=[O:8] +03941830 [K].[CH3:10][O:9][C:7](=[O:8])[c:6]1[cH:11][c:2](Cl)[cH:3][cH:4][c:5]1[N+:12](=[O:13])[O-:14].[OH:16][c:17]1[c:18]([Cl:19])[cH:20][c:21]([Cl:22])[cH:23][c:24]1[Cl:25]>O.CS(C)=O>[CH3:10][O:9][C:7](=[O:8])[c:6]1[cH:11][c:2]([O:16][c:17]2[c:24]([Cl:25])[cH:23][c:21]([Cl:22])[cH:20][c:18]2[Cl:19])[cH:3][cH:4][c:5]1[N+:12](=[O:13])[O-:14] +03941831 [ClH:29].[CH3:16][O:17][C:18](=[O:28])[C@@H:19]([NH2:20])[CH2:21][c:22]1[cH:23][cH:24][cH:25][cH:26][cH:27]1.CC(=O)N[C@H](Cc1ccccc1)C(=O)O>O>[ClH:29].[CH3:16][O:17][C:18](=[O:28])[C@@H:19]([NH2:20])[CH2:21][c:22]1[cH:23][cH:24][cH:25][cH:26][cH:27]1 +03941841 [CH3:15][CH2:14][O:13][C:8]1=[CH:7][C:6]([CH3:16])=[C:5]([C:3](=[O:4])[O:2][CH3:1])[C:10]([CH3:11])([CH3:12])[CH2:9]1.Cc1ccc(S(=O)(=O)O)cc1.OCC[OH:17]>c1ccccc1>[CH3:1][O:2][C:3](=[O:4])[C:5]1=[C:6]([CH3:16])[CH2:7][C:8]2([CH2:9][C:10]1([CH3:11])[CH3:12])[O:13][CH2:14][CH2:15][O:17]2 +03941846 [CH3:9][CH:8]([CH2:7][CH2:6][C:5](C)([OH:13])[CH2:4][N+](=O)[O-])[N+:10](=[O:11])[O-:12]>c1ccccc1>[CH3:4][C:5](=[O:13])[CH2:6][CH2:7][CH:8]([CH3:9])[N+:10](=[O:11])[O-:12] +03941881 C[O:6][S:3](=[O:4])(=[O:5])[O:2][CH3:1].[CH3:8][n:9]1[n:10][c:11](-[c:15]2[cH:16][cH:17][cH:18][cH:19][cH:20]2)[cH:12][c:13]1[Cl:14]>Cc1ccccc1C>[CH3:1][O:2][S:3](=[O:4])(=[O:5])[O-:6].[CH3:8][n:9]1[c:13]([Cl:14])[cH:12][c:11](-[c:15]2[cH:20][cH:19][cH:18][cH:17][cH:16]2)[n+:10]1[CH3:1] +03941883 [H][H].[CH3:10][c:7]1[cH:8][cH:9][c:4]([N+:1](=O)[O-])[cH:5][c:6]1[N:11]1[C:12](=[O:22])[c:13]2[cH:20][cH:19][cH:18][c:17]([Cl:21])[c:14]2[C:15]1=[O:16]>CCOC(C)=O>[CH3:10][c:7]1[cH:8][cH:9][c:4]([NH2:1])[cH:5][c:6]1[N:11]1[C:12](=[O:22])[c:13]2[cH:20][cH:19][cH:18][c:17]([Cl:21])[c:14]2[C:15]1=[O:16] +03941884 [H-].[OH2:14].[Na+].[CH3:20][CH2:19][CH2:18][CH2:17][CH2:16][CH3:15].Br[CH2:3][c:4]1[cH:12][cH:11][c:10]2[c:6]([cH:5]1)[O:7][CH2:8][O:9]2>>[CH2:6]=[CH:5][CH2:4][CH2:12][CH2:11][CH2:20][CH2:19][CH2:18][CH2:17][CH2:16][CH2:15][O:14][CH2:3][c:4]1[cH:12][cH:11][c:10]2[c:6]([cH:5]1)[O:7][CH2:8][O:9]2 +03941889 O=P([Cl:3])(Cl)Cl.O[c:7]1[n:8][cH:9][n:10][cH:11][c:12]1[O:13][c:14]1[cH:15][cH:16][cH:17][cH:18][cH:19]1>>[Cl:3][c:7]1[n:8][cH:9][n:10][cH:11][c:12]1[O:13][c:14]1[cH:15][cH:16][cH:17][cH:18][cH:19]1 +03942972 [Na+].[CH3:18][CH2:17][c:10]1[cH:11][cH:12][cH:13][c:14]([CH2:15][CH3:16])[c:9]1[NH:8][CH2:7][CH:2]1[O:3][CH2:4][CH2:5][CH2:6][O:1]1.O=C([O-])O.[O:33]=[C:32](Cl)[CH2:31][Cl:30].C1COCCO1>O>[CH3:18][CH2:17][c:10]1[cH:11][cH:12][cH:13][c:14]([CH2:15][CH3:16])[c:9]1[N:8]([CH2:7][CH:2]1[O:1][CH2:6][CH2:5][CH2:4][O:3]1)[C:32](=[O:33])[CH2:31][Cl:30] +03942972 [K+].[K+].[CH3:2][CH2:1][c:3]1[cH:9][cH:8][cH:7][c:6]([CH2:10][CH3:11])[c:4]1[NH2:5].O=C([O-])[O-].Cl[CH2:13][CH:14]1[O:15][CH2:16][CH2:17][O:18]1>CN(C)C=O>[CH3:2][CH2:1][c:3]1[cH:9][cH:8][cH:7][c:6]([CH2:10][CH3:11])[c:4]1[NH:5][CH2:13][CH:14]1[O:18][CH2:17][CH2:16][O:15]1 +03942972 [K+].[K+].[CH3:2][CH2:1][c:3]1[cH:9][cH:8][cH:7][c:6]([CH2:10][CH3:11])[c:4]1[NH2:5].O=C([O-])[O-].Cl[CH2:13][CH:14]1[S:15][CH2:16][CH2:17][CH2:18][CH2:19][S:20]1>CN(C)C=O>[CH3:2][CH2:1][c:3]1[cH:9][cH:8][cH:7][c:6]([CH2:10][CH3:11])[c:4]1[NH:5][CH2:13][CH:14]1[S:20][CH2:19][CH2:18][CH2:17][CH2:16][S:15]1 +03943124 [OH-].[Na+].[K+].[I-].CCCC[N+](CCCC)(CCCC)CCCC.[CH3:51][C:50](=[O:52])[O:53][CH2:54]Cl.[CH3:13][C@:12]12[CH2:14][C:15](=[O:21])[C@H:16]3[C@@H:7]([CH2:6][CH2:5][C@H:4]4[CH2:3][C@H:2]([OH:1])[CH2:19][CH2:18][C@@:17]43[CH3:20])[C@@H:8]1[CH2:9][CH2:10][C@@H:11]2[C:22](=[O:23])[OH:24].O=C([O-])O>CC(C)=O>[CH3:51][C:50](=[O:52])[O:53][CH2:54][O:23][C:22](=[O:24])[C@H:11]1[CH2:10][CH2:9][C@H:8]2[C@@H:7]3[CH2:6][CH2:5][C@H:4]4[CH2:3][C@H:2]([OH:1])[CH2:19][CH2:18][C@:17]4([CH3:20])[C@H:16]3[C:15](=[O:21])[CH2:14][C@:12]12[CH3:13] +03943124 [Li+].[Ca+2].[Br-].[CH3:25][O:24][C:22](=[O:23])[C@H:12]1[CH2:11][CH2:10][C@H:9]2[C@@H:8]3[CH2:7][CH2:6][C@H:5]4[CH2:4][C@H:3]([OH:26])[C@@H:2](Br)[CH2:19][C@:18]4([CH3:20])[C@H:17]3[C:16](=[O:21])[CH2:15][C@:13]12[CH3:14].Cc1ccc(S(=O)(=O)O)cc1.O=C([O-])[O-].C1=COCCC1>CC(=O)N(C)C.c1ccccc1>[CH3:25][O:24][C:22](=[O:23])[C@H:12]1[CH2:11][CH2:10][C@H:9]2[C@@H:8]3[CH2:7][CH2:6][C@H:5]4[CH2:4][C@H:3]([OH:26])[CH:2]=[CH:19][C@:18]4([CH3:20])[C@H:17]3[C:16](=[O:21])[CH2:15][C@:13]12[CH3:14] +03943124 Cl.[CH3:1][O:2][C:3](=[O:4])[C@H:5]1[CH2:10][CH2:9][C@H:8]2[C@@H:11]3[CH2:12][CH2:13][C@H:14]4[CH2:15][C@@H:16](OS(=O)(=O)c5ccc(C)cc5)[CH2:17][CH2:18][C@:19]4([CH3:20])[C@H:21]3[C:22](=[O:24])[CH2:23][C@:6]12[CH3:7]>Cc1cc(C)nc(C)c1>[CH3:1][O:2][C:3](=[O:4])[C@H:5]1[CH2:10][CH2:9][C@H:8]2[C@@H:11]3[CH2:12][CH2:13][C@H:14]4[CH2:15][CH:16]=[CH:17][CH2:18][C@:19]4([CH3:20])[C@H:21]3[C:22](=[O:24])[CH2:23][C@:6]12[CH3:7] +03943124 [CH3:5][C@:4]12[CH2:21][C:20](=[O:22])[C@H:19]3[C@@H:9]([CH2:10][CH2:11][C@H:12]4[CH2:13][CH:14]=[CH:15][CH2:16][C@@:17]43[CH3:18])[C@@H:6]1[CH2:7][CH2:8][C@@H:3]2[C:1]#[N:2].[O:31]=C(OO)c1cccc(Cl)c1>ClC(Cl)Cl>[CH3:5][C@:4]12[CH2:21][C:20](=[O:22])[C@H:19]3[C@@H:9]([CH2:10][CH2:11][C@H:12]4[CH2:13][C@@H:14]5[O:31][C@@H:15]5[CH2:16][C@@:17]43[CH3:18])[C@@H:6]1[CH2:7][CH2:8][C@@H:3]2[C:1]#[N:2] +03943124 [CH3:6][C@:5]12[CH2:22][CH2:21][C@H:20]3[C@@H:10]([CH2:11][CH2:12][C@H:13]4[CH2:14][C:15](=[O:23])[CH2:16][CH2:17][C@@:18]43[CH3:19])[C@@H:7]1[CH2:8][CH2:9][C@@H:4]2[C:1]([NH2:2])=O>ClC(Cl)Cl>[CH3:6][C@:5]12[CH2:22][CH2:21][C@H:20]3[C@@H:10]([CH2:11][CH2:12][C@H:13]4[CH2:14][C:15](=[O:23])[CH2:16][CH2:17][C@@:18]43[CH3:19])[C@@H:7]1[CH2:8][CH2:9][C@@H:4]2[C:1]#[N:2] +03943124 [CH3:26][OH:27].[CH3:25][O:24][C:22](=[O:23])[C@H:12]1[CH2:11][CH2:10][C@H:9]2[C@@H:8]3[CH2:7][CH2:6][C@H:5]4[CH2:4][C@@H:3]5[O:1][C@@H:2]5[CH2:19][C@:18]4([CH3:20])[C@H:17]3[C:16](=[O:21])[CH2:15][C@:13]12[CH3:14].O=S(=O)(O)O>O>[CH3:25][O:24][C:22](=[O:23])[C@H:12]1[CH2:11][CH2:10][C@H:9]2[C@@H:8]3[CH2:7][CH2:6][C@H:5]4[CH2:4][C@H:3]([OH:1])[C@@H:2]([O:27][CH3:26])[CH2:19][C@:18]4([CH3:20])[C@H:17]3[C:16](=[O:21])[CH2:15][C@:13]12[CH3:14] +03943125 [CH3:16][NH:15][c:5]1[n:4][c:3]([NH:2][CH3:1])[c:8]([N+:9](=O)[O-])[cH:7][c:6]1[N+:12](=O)[O-].CS(=O)(=O)O>CO>[CH3:16][NH:15][c:5]1[n:4][c:3]([NH:2][CH3:1])[c:8]([NH2:9])[cH:7][c:6]1[NH2:12] +03943133 [Al+3].[Cl-].[Cl-].[Cl-].[CH3:21][c:20]1[cH:19][cH:18][cH:17][cH:16][c:15]1[CH3:14].Cl[c:4]1[n:6][c:7](Cl)[n:9][c:2](Cl)[n:3]1>O>[CH3:21][c:20]1[cH:19][cH:18][c:17](-[c:2]2[n:3][c:4](-[c:17]3[cH:18][cH:19][c:20]([CH3:21])[c:15]([CH3:14])[cH:16]3)[n:6][c:7](-[c:17]3[cH:18][cH:19][c:20]([CH3:21])[c:15]([CH3:14])[cH:16]3)[n:9]2)[cH:16][c:15]1[CH3:14] +03943141 CC(=O)OC(C)=O.[CH3:24][c:21]1[cH:20][cH:19][c:18]2[c:17](=[O:25])[c:16]([C:26](=[O:27])[OH:28])[cH:15][n:14]([CH2:13][CH2:12]O)[c:23]2[n:22]1.[O:2]=[CH:1][OH:3]>c1ccncc1>[CH3:24][c:21]1[cH:20][cH:19][c:18]2[c:17](=[O:25])[c:16]([C:26](=[O:27])[OH:28])[cH:15][n:14]([CH2:13][CH2:12][O:3][CH:1]=[O:2])[c:23]2[n:22]1 +03943141 [CH3:13][CH2:12][n:9]1[cH:8][c:7]([C:14](=[O:15])O)[c:6](=[O:17])[c:5]2[cH:4][cH:3][c:2]([Cl:1])[n:11][c:10]21.O=S([Cl:20])Cl>>[CH3:13][CH2:12][n:9]1[cH:8][c:7]([C:14](=[O:15])[Cl:20])[c:6](=[O:17])[c:5]2[cH:4][cH:3][c:2]([Cl:1])[n:11][c:10]21 +03943143 [CH3:14][CH2:13][N:12]([CH2:15][CH3:16])[CH2:11][CH3:10].[S:19]=[C:18]=[S:17].[Cl:8][C:2]([Cl:9])([Cl:1])[CH:3]1[NH:7][CH2:6][CH2:5][O:4]1>>[CH3:10][CH2:11][NH+:12]([CH2:13][CH3:14])[CH2:15][CH3:16].[S:17]=[C:18]([S-:19])[N:7]1[CH2:6][CH2:5][O:4][CH:3]1[C:2]([Cl:8])([Cl:9])[Cl:1] +03943145 [Na+].[Na+].[Na+].CC(=O)[O-].[N-]=[N+:29]=[N-:28].[NH2:1][c:2]1[cH:16][cH:15][c:14]([Cl:17])[cH:13][c:3]1[C:4](=[O:5])[c:6]1[cH:11][cH:10][cH:9][cH:8][c:7]1[Cl:12].O=N[O-]>O.Cl.CC(=O)O>[N-:29]=[N+:28]=[N:1][c:2]1[cH:16][cH:15][c:14]([Cl:17])[cH:13][c:3]1[C:4](=[O:5])[c:6]1[cH:11][cH:10][cH:9][cH:8][c:7]1[Cl:12] +03943148 [H][H].CI.CN([CH3:19])C=O.[CH3:1][C:2]12[CH2:3][CH2:4][C:5](=[O:18])[N:6]1[CH2:7][CH2:8][c:9]1[c:17]3[cH:16][cH:15][cH:14][cH:13][c:12]3[nH:11][c:10]12>CCOC(C)=O.ClC(Cl)(Cl)Cl>[CH3:19][n:11]1[c:12]2[cH:13][cH:14][cH:15][cH:16][c:17]2[c:9]2[c:10]1[C:2]1([CH3:1])[CH2:3][CH2:4][C:5](=[O:18])[N:6]1[CH2:7][CH2:8]2 +03943153 Cl.[CH3:4][CH:3]([Br:5])[CH:2]([OH:1])[P:6](=[O:9])([O-:7])[O-:8]>>[CH3:4][CH:3]([Br:5])[CH:2]([OH:1])[P:6](=[O:7])([OH:8])[OH:9] +03943154 O.CCCCN(CCCC)CCCC.[N:14]#[C:13][CH:12]=[CH:11][S:8](=[O:9])(=[O:10])[c:5]1[cH:4][cH:3][c:2]([NH2:1])[cH:7][cH:6]1.[O:23]=[S:22](=[O:24])(Cl)[c:19]1[cH:18][cH:17][c:16]([F:15])[cH:21][cH:20]1>CC(C)=O>[N:14]#[C:13][CH:12]=[CH:11][S:8](=[O:9])(=[O:10])[c:5]1[cH:6][cH:7][c:2]([NH:1][S:22](=[O:23])(=[O:24])[c:19]2[cH:18][cH:17][c:16]([F:15])[cH:21][cH:20]2)[cH:3][cH:4]1 +03943154 O.[CH3:16][C:15](=[O:17])[NH:18][c:19]1[cH:20][cH:21][c:22]([S:25](=[O:26])(=[O:27])Cl)[cH:23][cH:24]1.[N:14]#[C:13][CH:12]=[CH:11][S:8](=[O:9])(=[O:10])[c:5]1[cH:4][cH:3][c:2]([NH2:1])[cH:7][cH:6]1.c1ccncc1>ClC(Cl)Cl>[CH3:16][C:15](=[O:17])[NH:18][c:19]1[cH:24][cH:23][c:22]([S:25](=[O:26])(=[O:27])[NH:1][c:2]2[cH:7][cH:6][c:5]([S:8](=[O:9])(=[O:10])[CH:11]=[CH:12][C:13]#[N:14])[cH:4][cH:3]2)[cH:21][cH:20]1 +03943154 [CH2:18]=[CH:17][C:16]([F:19])([F:20])[F:15].CCOP(=O)([O-])Cl.CC(=O)[NH:4][c:5]1[cH:6][cH:7][c:8]([S:11](=[O:12])(=[O:13])I)[cH:9][cH:10]1.C1CN2CCN1CC2>CC(C)=O>[NH2:4][c:5]1[cH:10][cH:9][c:8]([S:11](=[O:13])(=[O:12])[CH:18]=[CH:17][C:16]([F:15])([F:19])[F:20])[cH:7][cH:6]1 +03943154 CCN(CC)CC.[CH3:38][c:28]1[cH:29][cH:30][c:31]([S:34](=[O:35])(=[O:36])Cl)[cH:32][cH:33]1.[NH2:15][C:13](=[O:14])[CH:12]=[CH:11][S:8](=[O:9])(=[O:10])[c:5]1[cH:4][cH:3][c:2]([NH2:1])[cH:7][cH:6]1.O=S(=O)(O)O>O.CN(C)C=O>[CH3:38][c:28]1[cH:29][cH:30][c:31]([S:34](=[O:35])(=[O:36])[NH:1][c:2]2[cH:3][cH:4][c:5]([S:8](=[O:9])(=[O:10])[CH:11]=[CH:12][C:13]([NH2:15])=[O:14])[cH:6][cH:7]2)[cH:32][cH:33]1 +03943154 [CH3:11][CH:10]([CH3:12])[c:8]1[cH:9][c:4]([CH:1]([CH3:2])[CH3:3])[c:5]([S:16](=[O:17])(=[O:18])Cl)[c:6]([CH:13]([CH3:14])[CH3:15])[cH:7]1.[N:33]#[C:32][CH:31]=[CH:30][S:27](=[O:28])(=[O:29])[c:24]1[cH:23][cH:22][c:21]([NH2:20])[cH:26][cH:25]1.c1ccncc1>C1COCCO1>[CH3:11][CH:10]([CH3:12])[c:8]1[cH:9][c:4]([CH:1]([CH3:2])[CH3:3])[c:5]([S:16](=[O:17])(=[O:18])[NH:20][c:21]2[cH:26][cH:25][c:24]([S:27](=[O:28])(=[O:29])[CH:30]=[CH:31][C:32]#[N:33])[cH:23][cH:22]2)[c:6]([CH:13]([CH3:14])[CH3:15])[cH:7]1 +03943169 [Al+3].[Cl-].[Cl-].[Cl-].Cl.[CH3:12][CH2:11][O:10][c:9]1[cH:8][cH:7][c:6](C)[cH:5][c:4]1[O:3][CH2:1][CH3:2].[O:19]=[C:18]1[CH2:17][CH2:16][C:15](=[O:14])[O:20]1.Cl[CH2:26]Cl>ClC(Cl)(Cl)Cl>[CH3:26][CH2:12][CH2:11][O:10][c:9]1[cH:8][c:7]([C:18](=[O:19])[CH2:17][CH2:16][C:15](=[O:14])[OH:20])[cH:6][cH:5][c:4]1[O:3][CH2:1][CH3:2] +03943176 [CH3:16][C:12]1([CH3:17])[CH2:11][C:10](=[O:18])[C:9]([S:8][CH2:7][CH:1]2[CH2:2][CH2:3][CH2:4][CH2:5][CH2:6]2)=[C:14]([OH:15])[CH2:13]1.O[OH:19]>CC(=O)O>[CH3:17][C:12]1([CH3:16])[CH2:13][C:14](=[O:15])[C:9]([S:8](=[O:19])[CH2:7][CH:1]2[CH2:6][CH2:5][CH2:4][CH2:3][CH2:2]2)=[C:10]([OH:18])[CH2:11]1 +03943176 CC(=O)[OH:24].[CH3:15][C:11]1([CH3:16])[CH2:10][C:9](=[O:17])[C:8]([S:7][CH2:6][c:5]2[cH:4][cH:3][c:2]([F:1])[cH:19][cH:18]2)=[C:13]([OH:14])[CH2:12]1.OO>O>[CH3:15][C:11]1([CH3:16])[CH2:12][C:13](=[O:14])[C:8]([S:7](=[O:24])[CH2:6][c:5]2[cH:18][cH:19][c:2]([F:1])[cH:3][cH:4]2)=[C:9]([OH:17])[CH2:10]1 +03943201 [NH4+:1].[OH-].[CH3:3][O:4][C:5](=[O:6])[P:7](=[O:10])([OH:8])[OH:9]>>[NH4+:1].[NH4+:1].[CH3:3][O:4][C:5](=[O:6])[P:7](=[O:8])([O-:9])[O-:10] +03944409 [CH3:13][CH2:12][CH2:11][NH:14][CH2:15][CH:16]=[O:17].[CH3:1][S:2][c:3]1[n:4][n:5][c:6]([N:8]=[C:9]=[O:10])[s:7]1>c1ccccc1>[CH3:13][CH2:12][CH2:11][N:14]([CH2:15][CH:16]=[O:17])[C:9](=[O:10])[NH:8][c:6]1[n:5][n:4][c:3]([S:2][CH3:1])[s:7]1 +03944409 [CH3:12][NH:13][CH2:14][CH:15]=[O:16].[CH3:1][S:2](=[O:3])[c:4]1[n:5][n:6][c:7]([N:9]=[C:10]=[O:11])[s:8]1>c1ccccc1>[CH3:12][N:13]([CH2:14][CH:15]=[O:16])[C:10](=[O:11])[NH:9][c:7]1[n:6][n:5][c:4]([S:2]([CH3:1])=[O:3])[s:8]1 +03944409 [CH3:16][NH:17][CH2:18][CH:19]=[O:20].[O:15]=[C:14]=[N:13][c:11]1[n:10][n:9][c:8]([CH:1]2[CH2:2][CH2:3][CH2:4][CH2:5][CH2:6][CH2:7]2)[s:12]1>c1ccccc1>[CH3:16][N:17]([CH2:18][CH:19]=[O:20])[C:14](=[O:15])[NH:13][c:11]1[n:10][n:9][c:8]([CH:1]2[CH2:7][CH2:6][CH2:5][CH2:4][CH2:3][CH2:2]2)[s:12]1 +03944409 [CH3:5][c:6]1[n:7][n:8][c:9]([NH2:11])[s:10]1.[O:4]=[C:2](Cl)Cl>CCOC(C)=O>[CH3:5][c:6]1[n:7][n:8][c:9]([N:11]=[C:2]=[O:4])[s:10]1 +03944409 [CH3:5][S:6][c:7]1[n:8][n:9][c:10]([NH2:12])[s:11]1.[O:4]=[C:2](Cl)Cl>CCOC(C)=O>[CH3:5][S:6][c:7]1[n:8][n:9][c:10]([N:12]=[C:2]=[O:4])[s:11]1 +03944410 [OH-].[Na+].CCO[C:20](=[O:21])Cl.[O:5]=[C:4]([NH:3][C:2]([F:15])([F:16])[F:1])[N:6]([OH:7])[c:8]1[cH:9][cH:10][c:11]([F:14])[cH:12][cH:13]1>C1COCCO1>[O:21]=[c:20]1[o:7][n:6](-[c:8]2[cH:9][cH:10][c:11]([F:14])[cH:12][cH:13]2)[c:4](=[O:5])[n:3]1[C:2]([F:16])([F:1])[F:15] +03944410 [OH-].[Na+].CCO[C:20](=[O:21])Cl.[CH3:14][c:10]1[cH:11][cH:12][cH:13][c:8]([N:6]([OH:7])[C:4](=[O:5])[NH:3][C:2]([F:15])([F:16])[F:1])[cH:9]1>C1COCCO1>[CH3:14][c:10]1[cH:11][cH:12][cH:13][c:8](-[n:6]2[o:7][c:20](=[O:21])[n:3]([C:2]([F:1])([F:16])[F:15])[c:4]2=[O:5])[cH:9]1 +03944531 [CH3:17][C:16]([CH3:18])=[CH:15][CH2:14][CH2:13][C:12]([CH3:19])=[CH:11][CH2:10]Br.[CH3:8][c:3]1[cH:2][cH:1][c:6]([SH:7])[cH:5][cH:4]1>>[CH3:17][C:16]([CH3:18])=[CH:15][CH2:14][CH2:13][C:12]([CH3:19])=[CH:11][CH2:10][S:7][c:6]1[cH:1][cH:2][c:3]([CH3:8])[cH:4][cH:5]1 +03944531 CO[C:12](=[O:28])[c:13]1[cH:14][cH:15][c:16]([O:19][CH:20]([CH3:27])[CH2:21][CH2:22][CH2:23][CH:24]([CH3:25])[CH3:26])[cH:17][cH:18]1.[CH3:3][CH:2]([CH3:4])[CH2:1][NH:5][CH2:6][CH:7]([CH3:8])[CH3:9]>>[CH3:26][CH:24]([CH3:25])[CH2:23][CH2:22][CH2:21][CH:20]([CH3:27])[O:19][c:16]1[cH:17][cH:18][c:13]([C:12](=[O:28])[N:5]([CH2:1][CH:2]([CH3:3])[CH3:4])[CH2:6][CH:7]([CH3:8])[CH3:9])[cH:14][cH:15]1 +03944553 [K+].[I-:29].[CH3:24][c:20]1[cH:21][cH:22][cH:23][c:18](N)[c:19]1[N+:25](=[O:26])[O-:27].Cc1c(C)c(-c2ccccc2)cc(N)c1N.O=NO>>[CH3:24][c:20]1[cH:21][cH:22][cH:23][c:18]([I:29])[c:19]1[N+:25](=[O:26])[O-:27] +03944560 [OH-].[Na+].Cl.CCO.[CH3:21][CH2:20][O:19][C:17](=[O:18])[NH:16][c:14]1[cH:13][cH:12][c:9]2[c:8]([cH:15]1)[O:7][CH2:6][C:5]([CH2:22][N:23](C(C)=O)[CH:27]([CH3:28])[CH3:29])([O:4]C(C)=O)[CH2:11][O:10]2>O>[CH3:21][CH2:20][O:19][C:17](=[O:18])[NH:16][c:14]1[cH:13][cH:12][c:9]2[c:8]([cH:15]1)[O:7][CH2:6][C:5]([OH:4])([CH2:22][NH:23][CH:27]([CH3:29])[CH3:28])[CH2:11][O:10]2 +03944560 [OH-].O.[Na+].[CH3:2][CH:1]([CH3:3])[N:4]1[CH2:8][C:7]2([CH2:14][O:13][c:12]3[cH:15][cH:16][c:17]([N+:19](=[O:20])[O-:21])[cH:18][c:11]3[O:10][CH2:9]2)[O:6]C1=O>CCO>[CH3:2][CH:1]([CH3:3])[NH:4][CH2:8][C:7]1([OH:6])[CH2:14][O:13][c:12]2[cH:15][cH:16][c:17]([N+:19](=[O:20])[O-:21])[cH:18][c:11]2[O:10][CH2:9]1 +03944560 [H-].[Na+].[H][H].[CH3:3][O:4][C:5]1([CH3:15])[O:9][c:8]2[cH:10][cH:11][cH:12][c:13]([OH:14])[c:7]2[O:6]1.Cl[CH2:19][c:20]1[cH:21][cH:22][cH:23][cH:24][cH:25]1>CC(=O)O.CN(C)P(=O)(N(C)C)N(C)C>[CH3:3][O:4][C:5]1([CH3:15])[O:9][c:8]2[cH:10][cH:11][cH:12][c:13]([O:14][CH2:19][c:20]3[cH:21][cH:22][cH:23][cH:24][cH:25]3)[c:7]2[O:6]1 +03944560 O.[K+].CO[C:7](=[O:8])[CH2:11][O:12][c:13]1[cH:18][cH:17][cH:16][cH:15][c:14]1[O:19][CH2:20][C:21](=[O:22])[O:23][CH3:24].CC(=O)O.CC(C)(C)[O-]>CS(C)=O>[CH3:24][O:23][C:21](=[O:22])[CH:20]1[O:19][c:14]2[cH:15][cH:16][cH:17][cH:18][c:13]2[O:12][CH2:11][C:7]1=[O:8] +03944560 [K+].[K+].CC(C)=O.[N:12]#[C:11][CH2:10]Cl.O=C([O-])[O-].[OH:8][c:7]1[cH:6][cH:5][cH:4][cH:3][c:2]1[OH:1]>[OH-].[Na+]>[N:12]#[C:11][CH2:10][O:8][c:7]1[cH:6][cH:5][cH:4][cH:3][c:2]1[OH:1] +03944560 [IH:1].[CH3:7][CH2:6][NH:5][C:4](=[NH:8])SC.[NH2:22][CH2:21][C:10]1([OH:9])[CH2:11][O:12][c:13]2[cH:20][cH:19][cH:18][cH:17][c:14]2[O:15][CH2:16]1>CCO>[IH:1].[CH3:7][CH2:6][NH:5][C:4](=[NH:8])[NH:22][CH2:21][C:10]1([OH:9])[CH2:16][O:15][c:14]2[cH:17][cH:18][cH:19][cH:20][c:13]2[O:12][CH2:11]1 +03944560 [OH-].[OH-].O.O.O.O.O.O.O.O.[Ba+2].[CH3:15][CH:14]([CH3:16])[N:10]1[CH2:9][C:8]2([CH2:7][O:6][c:5]3[cH:19][cH:20][c:2]([OH:1])[cH:3][c:4]3[O:18][CH2:17]2)[O:12]C1=O>O>[CH3:15][CH:14]([CH3:16])[NH:10][CH2:9][C:8]1([OH:12])[CH2:7][O:6][c:5]2[cH:19][cH:20][c:2]([OH:1])[cH:3][c:4]2[O:18][CH2:17]1 +03944560 COc1cccc2c1OCC1(CO1)CO2.[CH3:55][O:54][c:53]1[cH:52][cH:51][cH:50][c:47]2[c:46]1[O:45][CH2:44][C:43]([OH:56])([CH2:42][NH:41][C:37]([CH3:38])([CH3:39])[CH3:40])[CH2:49][O:48]2.CC(C)(C)N.O=C(O)/C=C\C(=O)O.O=C(O)/C=C\C(=O)O>CO.CCOC(C)=O>[CH3:55][O:54][c:53]1[cH:52][cH:51][cH:50][c:47]2[c:46]1[O:45][CH2:44][C:43]([OH:56])([CH2:42][NH:41][C:37]([CH3:38])([CH3:39])[CH3:40])[CH2:49][O:48]2 +03944560 [H][H].[CH3:2][C:1](=[O:3])[O:4][C:5]1([CH2:19][N:20]([C:21]([CH3:22])=[O:23])[CH:24]([CH3:25])[CH3:26])[CH2:11][O:10][c:9]2[cH:12][cH:13][c:14]([N+:16](=O)[O-])[cH:15][c:8]2[O:7][CH2:6]1>[Pt].CCOC(C)=O>[CH3:2][C:1](=[O:3])[O:4][C:5]1([CH2:19][N:20]([C:21]([CH3:22])=[O:23])[CH:24]([CH3:25])[CH3:26])[CH2:11][O:10][c:9]2[cH:12][cH:13][c:14]([NH2:16])[cH:15][c:8]2[O:7][CH2:6]1 +03944567 N[c:2]1[cH:3][c:4]2[cH:9][cH:8][cH:7][cH:6][c:5]2[s:1]1.[S:12]=[C:11]([n:13]1[cH:17][cH:16][n:15][cH:14]1)n1ccnc1.ClCCl>ClC(Cl)Cl>[S:12]=[C:11]=[N:13][CH:9]1[CH2:8][CH2:7][CH2:6][c:5]2[s:1][cH:2][cH:3][c:4]21.[cH:16]1[cH:17][nH:13][cH:14][n:15]1 +03944567 [ClH:14].O=C[NH:11][CH:10]1[CH2:9][CH2:8][CH2:7][c:5]2[s:6][c:2]([Br:1])[cH:3][c:4]21>>[ClH:14].[NH2:11][CH:10]1[CH2:9][CH2:8][CH2:7][c:5]2[s:6][c:2]([Br:1])[cH:3][c:4]21 +03944576 [CH3:20][O:21][CH2:22][Cl:23].[cH:4]1[cH:3][cH:2][c:1]([P:7]([c:8]2[cH:9][cH:10][cH:11][cH:12][cH:13]2)[c:14]2[cH:15][cH:16][cH:17][cH:18][cH:19]2)[cH:6][cH:5]1>>[Cl-:23].[CH3:20][O:21][CH2:22][P+:7]([c:14]1[cH:19][cH:18][cH:17][cH:16][cH:15]1)([c:8]1[cH:9][cH:10][cH:11][cH:12][cH:13]1)[c:1]1[cH:6][cH:5][cH:4][cH:3][cH:2]1 +03944589 [BH4-].[Na+].[CH3:15][C:14](=[O:16])[c:11]1[cH:10][cH:9][c:8]([C:5]2=[CH:4][CH2:3][CH:2]([CH3:1])[CH2:7][CH2:6]2)[cH:13][cH:12]1>O.CO>[CH3:15][CH:14]([OH:16])[c:11]1[cH:10][cH:9][c:8]([C:5]2=[CH:4][CH2:3][CH:2]([CH3:1])[CH2:7][CH2:6]2)[cH:13][cH:12]1 +03944589 [Cl-].[CH3:18][CH:14]([C:15](=O)[OH:17])[c:11]1[cH:10][cH:9][c:8]([C:2]2=[CH:3][CH2:4][CH2:5][CH2:6][CH2:7]2)[cH:13][cH:12]1.[CH3:24][N:20]([CH3:19])[CH2:21][CH2:22][NH2:23]>Cc1ccccc1>[CH3:18][CH:14]([C:15](=[O:17])[NH:23][CH2:22][CH2:21][N:20]([CH3:24])[CH3:19])[c:11]1[cH:12][cH:13][c:8]([C:2]2=[CH:3][CH2:4][CH2:5][CH2:6][CH2:7]2)[cH:9][cH:10]1 +03944589 [OH-].[Na+].CC[O:16][C:14](=[O:15])[CH2:13][c:10]1[cH:9][cH:8][c:7]([C:1]2=[CH:2][CH2:3][CH2:4][CH2:5][CH2:6]2)[cH:12][cH:11]1>CCO>[O:15]=[C:14]([OH:16])[CH2:13][c:10]1[cH:11][cH:12][c:7]([C:1]2=[CH:2][CH2:3][CH2:4][CH2:5][CH2:6]2)[cH:8][cH:9]1 +03944594 C[O:33][C:31](=[O:32])[CH2:30][CH2:29][c:20]1[cH:19][c:18]([C:14]([CH3:15])([CH3:16])[CH3:17])[c:23]([OH:24])[c:22]([C:25]([CH3:26])([CH3:27])[CH3:28])[cH:21]1.[OH:13][CH2:12][CH2:11][O:10][CH2:9][CH2:8][O:7][CH2:6][CH2:5][O:4][CH2:3][CH2:2][OH:1]>>[CH3:16][C:14]([CH3:15])([CH3:17])[c:18]1[cH:19][c:20]([CH2:29][CH2:30][C:31](=[O:32])[OH:33])[cH:21][c:22]([C:25]([CH3:28])([CH3:27])[CH3:26])[c:23]1[OH:24].[CH3:16][C:14]([CH3:15])([CH3:17])[c:18]1[cH:19][c:20]([CH2:29][CH2:30][C:31](=[O:32])[OH:33])[cH:21][c:22]([C:25]([CH3:28])([CH3:27])[CH3:26])[c:23]1[OH:24].[OH:1][CH2:2][CH2:3][O:4][CH2:5][CH2:6][O:7][CH2:8][CH2:9][O:10][CH2:11][CH2:12][OH:13] +03944600 [Cl-].[K+].[CH3:12][S:13][c:14]1[cH:15][cH:16][c:17]([CH2:18][P+](c2ccccc2)(c2ccccc2)c2ccccc2)[cH:38][cH:39]1.[CH3:51][CH:45]1[CH2:44][c:43]2[cH:42][c:41]([F:40])[cH:49][cH:48][c:47]2[C:46]1=O.CS(C)=O.CC(C)(C)[O-]>O.c1ccccc1>[CH3:12][S:13][c:14]1[cH:39][cH:38][c:17]([CH:18]=[C:46]2[c:47]3[cH:48][cH:49][c:41]([F:40])[cH:42][c:43]3[CH2:44][CH:45]2[CH3:51])[cH:16][cH:15]1 +03944600 Cc1ccccc1C.[CH3:12][CH:9]([CH2:10]O)[C:8](=[O:13])[c:5]1[cH:4][cH:3][c:2]([F:1])[cH:7][cH:6]1>O>[CH3:12][CH:9]1[CH2:10][c:6]2[cH:7][c:2]([F:1])[cH:3][cH:4][c:5]2[C:8]1=[O:13] +03944600 [CH3:13][CH:3]([CH2:2]Cl)[C:4](=[O:5])[c:6]1[cH:7][cH:8][c:9]([F:12])[cH:10][cH:11]1.O=S(=O)(O)O>>[CH3:13][CH:3]1[CH2:2][c:7]2[cH:8][c:9]([F:12])[cH:10][cH:11][c:6]2[C:4]1=[O:5] +03944607 [Na+].[CH:5]#[C:4][CH2:3][NH:2][CH3:1].O=C([O-])O.[O:9]=[C:8](Br)[CH2:7][Br:6]>ClCCl>[CH:5]#[C:4][CH2:3][N:2]([CH3:1])[C:8](=[O:9])[CH2:7][Br:6] +03944617 [Na+].[Na+].[CH3:5][CH2:4][CH:3]([CH2:2][Cl:1])[N:6]=[C:7]([CH3:8])Cl.O=C([O-])[O-:12]>>[CH3:5][CH2:4][CH:3]([CH2:2][Cl:1])[NH:6][C:7]([CH3:8])=[O:12] +03944666 CCCCO.[CH3:12][CH2:11][CH2:10][CH2:9][O:8][P:7](=[O:13])(Cl)[c:1]1[cH:2][cH:3][cH:4][cH:5][cH:6]1.ClP(Cl)[c:17]1[cH:18][cH:19]cc[cH:22]1>CCOCC>[CH3:12][CH2:11][CH2:10][CH2:9][O:8][P:7]([O:13][CH2:22][CH2:17][CH2:18][CH3:19])[c:1]1[cH:2][cH:3][cH:4][cH:5][cH:6]1 +03944672 B.N.Cl.[N:13]#[C:12][c:7]1[nH:8][c:9]2[cH:10][cH:11][c:3]([Cl:2])[cH:4][c:5]2[c:6]1-[c:14]1[c:15]([F:21])[cH:16][cH:17][cH:18][c:19]1[F:20]>C1CCOC1>[NH2:13][CH2:12][c:7]1[nH:8][c:9]2[cH:10][cH:11][c:3]([Cl:2])[cH:4][c:5]2[c:6]1-[c:14]1[c:15]([F:21])[cH:16][cH:17][cH:18][c:19]1[F:20] +03944674 [O:2]=[CH:1][c:3]1[cH:4][cH:5][cH:6][cH:7][c:8]1[OH:9].O=P(O)(O)O.[OH:12][CH2:11][CH2:10]O>[Cl-].[Cl-].[Zn+2].c1ccccc1>[OH:9][c:8]1[cH:7][cH:6][cH:5][cH:4][c:3]1[CH:1]1[O:12][CH2:11][CH2:10][O:2]1 +03944674 Cl.[CH3:15][c:16]1ccccc1.[CH3:2][CH:1]([SH:3])[SH:4].[O:6]=[CH:5][c:7]1[cH:8][cH:9][cH:10]cc1O>>[OH:6][c:5]1[cH:7][cH:8][cH:9][cH:10][c:2]1[CH:1]1[S:4][CH2:15][CH2:16][S:3]1 +03944675 [Cl-].[CH3:23][O:22][c:19]1[cH:20][cH:21][c:16]([NH2:15])[cH:17][c:18]1[O:24][CH3:25].[O:13]=[C:12](O)[C:2]12[CH2:3][CH:4]3[CH2:5][CH:6]([CH2:7][CH:8]([CH2:10]3)[CH2:9]1)[CH2:11]2>CCN(CC)CC>[CH3:23][O:22][c:19]1[cH:20][cH:21][c:16]([NH:15][C:12](=[O:13])[C:2]23[CH2:11][CH:6]4[CH2:5][CH:4]([CH2:10][CH:8]([CH2:7]4)[CH2:9]2)[CH2:3]3)[cH:17][c:18]1[O:24][CH3:25] +03944675 [Cl-].CCN(CC)CC.[NH2:19][c:18]1[cH:20][cH:21][c:22]([F:23])[c:16]([F:15])[cH:17]1.O=[C:12]([OH:14])[C:2]12[CH2:3][CH:4]3[CH2:5][CH:6]([CH2:7][CH:8]([CH2:10]3)[CH2:9]1)[CH2:11]2>CCOCC>[O:14]=[C:12]([NH:19][c:18]1[cH:20][cH:21][c:22]([F:23])[c:16]([F:15])[cH:17]1)[C:2]12[CH2:9][CH:8]3[CH2:10][CH:4]([CH2:5][CH:6]([CH2:7]3)[CH2:11]1)[CH2:3]2 +03944675 [NH4+].[OH-].Cl.[CH3:21][C:20]([CH3:22])([CH3:23])[C:19](=[O:24])Cl.[NH2:2][CH2:3][CH2:4][c:5]1[cH:12][cH:11][c:9]([OH:10])[c:7]([OH:8])[cH:6]1.c1ccncc1>O.CO>[CH3:21][C:20]([CH3:22])([CH3:23])[C:19](=[O:24])[NH:2][CH2:3][CH2:4][c:5]1[cH:12][cH:11][c:9]([OH:10])[c:7]([OH:8])[cH:6]1 +03944675 [Li+].[I-].C[O:11][c:10]1[cH:9][cH:8][c:7]([CH2:13][CH2:14][NH:15][C:16](=[O:21])[C:17]([CH3:18])([CH3:19])[CH3:20])[cH:6][c:5]1[O:4]C>>[CH3:20][C:17]([CH3:18])([CH3:19])[C:16](=[O:21])[NH:15][CH2:14][CH2:13][c:7]1[cH:8][cH:9][c:10]([OH:11])[c:5]([OH:4])[cH:6]1 +03945995 CN(C)C=O.O=[C:21]([OH:23])[c:12]1[cH:13][n:14][c:15]2[cH:16][cH:17][cH:18][n:19][c:20]2[c:11]1[OH:10].O=S([Cl:8])Cl>c1ccccc1>[ClH:8].[O:23]=[C:21]([Cl:8])[c:12]1[cH:13][n:14][c:15]2[cH:16][cH:17][cH:18][n:19][c:20]2[c:11]1[OH:10] +03945997 [K].[CH2:16]=[C:15]([CH2:14]Br)[c:17]1[cH:18][cH:19][cH:20][cH:21][cH:22]1.[O:6]=[C:4]1[NH:5][C:1](=[O:11])[c:2]2[cH:10][cH:9][cH:8][cH:7][c:3]21>O.CN(C)C=O>[CH2:14]=[C:15]([CH2:16][N:5]1[C:4](=[O:6])[c:3]2[cH:7][cH:8][cH:9][cH:10][c:2]2[C:1]1=[O:11])[c:17]1[cH:18][cH:19][cH:20][cH:21][cH:22]1 +03945998 [CH3:14][C:2]([NH2:1])([CH2:3][OH:4])[CH2:5][O:6][CH2:7][c:8]1[cH:9][cH:10][cH:11][cH:12][cH:13]1.O=[C:16](O)[c:18]1[cH:19][cH:20][c:21]([N+:24](=[O:26])[O-:25])[cH:22][cH:23]1>Cc1ccccc1C>[CH3:14][C:2]1([CH2:5][O:6][CH2:7][c:8]2[cH:9][cH:10][cH:11][cH:12][cH:13]2)[CH2:3][O:4][C:16]([c:18]2[cH:19][cH:20][c:21]([N+:24](=[O:25])[O-:26])[cH:22][cH:23]2)=[N:1]1 +03946000 [CH2:14]=[N+:12]=[N-:13].[O:8]=[C:1]([N:9]=[C:10]=[S:11])[c:2]1[cH:3][cH:4][cH:5][cH:6][cH:7]1>>[O:8]=[C:1]([NH:9][c:10]1[cH:14][n:12][n:13][s:11]1)[c:2]1[cH:3][cH:4][cH:5][cH:6][cH:7]1 +03946004 [CH3:18][CH2:17][CH2:16][CH2:15][CH:19]1[CH2:20][CH2:21][C:22](=O)[NH:23]1.[cH:2]1[cH:3][cH:4][c:5]2[c:14]([cH:1]1)[NH:13][c:12]1[cH:11][cH:10][cH:9][cH:8][c:7]1[S:6]2>>[CH3:18][CH2:17][CH2:16][CH2:15][CH:19]1[CH2:20][CH2:21][C:22]([N:23]2[C:22]([N:13]3[c:12]4[cH:11][cH:10][cH:9][cH:8][c:7]4[S:6][c:5]4[cH:4][cH:3][cH:2][cH:1][c:14]43)=[CH:21][CH2:20][CH:19]2[CH2:15][CH2:16][CH2:17][CH3:18])=[N:23]1 +03946004 [OH-].[K+].[CH3:1][CH:2]1[CH2:3][CH2:4][C:5](=O)[NH:6]1.[CH3:28][C:14]1([CH3:13])[c:15]2[cH:16][cH:17][cH:18][cH:19][c:20]2[NH:21][c:22]2[cH:23][cH:24][cH:25][cH:26][c:27]21.O=P(Cl)(Cl)Cl>CCCCCCC.ClCCCl>[CH3:1][CH:2]1[CH2:3][CH2:4][C:5]([N:6]2[C:5]([N:21]3[c:22]4[cH:23][cH:24][cH:25][cH:26][c:27]4[C:14]([CH3:28])([CH3:13])[c:15]4[cH:16][cH:17][cH:18][cH:19][c:20]43)=[CH:4][CH2:3][CH:2]2[CH3:1])=[N:6]1 +03946004 Cl.[F:17][C:2]([F:18])([F:1])[c:3]1[cH:16][cH:15][c:14]2[c:5]([cH:4]1)[NH:6][c:7]1[cH:8][cH:9][cH:10][cH:11][c:12]1[O:13]2.Cl[C:21]1=[CH:25][CH2:24][CH2:23][N:22]1[C:26]1=[N:27][CH2:28][CH2:29][CH2:30]1>>[F:17][C:2]([F:1])([F:18])[c:3]1[cH:16][cH:15][c:14]2[c:5]([cH:4]1)[N:6]([C:21]1=[CH:25][CH2:24][CH2:23][N:22]1[C:26]1=[N:27][CH2:28][CH2:29][CH2:30]1)[c:7]1[cH:8][cH:9][cH:10][cH:11][c:12]1[O:13]2 +03946008 CC[OH:29].[CH3:24][CH2:23][N:22]([CH2:25][CH3:26])[CH2:21][CH3:20].[CH3:1][O:2][c:3]1[cH:4][c:5]2[o:18][c:17](=[O:19])[c:12]3[c:11]([c:6]2[cH:7][c:8]1[O:9][CH3:10])[CH2:16][CH2:15][NH:14][CH2:13]3>>[CH3:1][O:2][c:3]1[cH:4][c:5]2[o:18][c:17](=[O:19])[c:12]3[c:11]([c:6]2[cH:7][c:8]1[O:9][CH3:10])[CH2:16][CH2:15][N:14]([CH2:20][CH2:21][N:22]1[CH2:23][CH2:24][O:29][CH2:26][CH2:25]1)[CH2:13]3 +03946008 [K+].[K+].[CH3:27][CH2:26]OS(=O)(=O)OCC.C[C:42]([CH3:41])=O.O=C([O-])[O-].[O:25]=[c:23]1[o:24][c:4]2[cH:3][c:2]([OH:1])[c:7]([OH:8])[cH:6][c:5]2[c:9]2[c:10]1[CH2:11][N:12]([CH2:15][CH2:16][N:17]1[CH2:18][CH2:19][CH2:20][CH2:21][CH2:22]1)[CH2:13][CH2:14]2>>[CH3:27][CH2:26][O:1][c:2]1[cH:3][c:4]2[o:24][c:23](=[O:25])[c:10]3[c:9]([c:5]2[cH:6][c:7]1[O:8][CH2:41][CH3:42])[CH2:14][CH2:13][N:12]([CH2:15][CH2:16][N:17]1[CH2:22][CH2:21][CH2:20][CH2:19][CH2:18]1)[CH2:11]3 +03946009 [Na+].[CH3:20][O:19][c:8]1[cH:9][n:10][c:11]([O:12][c:13]2[cH:14][cH:15][cH:16][cH:17][cH:18]2)[c:6](O)[n:7]1.O=N[O-].O=P([Cl:23])(Cl)Cl>>[CH3:20][O:19][c:8]1[cH:9][n:10][c:11]([O:12][c:13]2[cH:14][cH:15][cH:16][cH:17][cH:18]2)[c:6]([Cl:23])[n:7]1 +03946009 [Na].[CH3:11][OH:12].[NH2:1][c:2]1[n:3][cH:4][c:5]([Br:9])[n:6][c:7]1Br>>[CH3:11][O:12][c:7]1[n:6][c:5]([Br:9])[cH:4][n:3][c:2]1[NH2:1] +03946009 [NH2:1][c:2]1[n:3][cH:4][c:5]([Br:9])[n:6][c:7]1Br.[CH2:14]1[CH2:13][O:12][CH2:11][CH2:10][NH:15]1>>[NH2:1][c:2]1[n:3][cH:4][c:5]([Br:9])[n:6][c:7]1[N:15]1[CH2:14][CH2:13][O:12][CH2:11][CH2:10]1 +03946009 [NH4+:15].[OH-].[OH:1][c:2]1[n:3][cH:4][c:5](Br)[n:6][c:7]1[N:8]1[CH2:9][CH2:10][O:11][CH2:12][CH2:13]1>>[NH2:15][c:5]1[cH:4][n:3][c:2]([OH:1])[c:7]([N:8]2[CH2:9][CH2:10][O:11][CH2:12][CH2:13]2)[n:6]1 +03946009 C[c:2]1c[cH:4][c:5]([NH:8][CH2:9][C:10](=O)[OH:12])[cH:6][cH:7]1.O=C(O)C[NH:18]C1CCCC1>>[NH2:18][C:10](=[O:12])[CH2:9][NH:8][CH:5]1[CH2:6][CH2:7][CH2:2][CH2:4]1 +03946009 [CH3:9][c:4]1[cH:5][n:6][c:7]([CH3:8])[c:2](O)[n:3]1.O=P([Cl:12])(Cl)Cl>>[CH3:9][c:4]1[cH:5][n:6][c:7]([CH3:8])[c:2]([Cl:12])[n:3]1 +03946018 CC[N:25](CC)CC.CC(=O)O.N[c:2]1[cH:3][cH:4][c:5]([CH:8]2[NH:9][C:10](=[O:18])[CH2:11][c:12]3[cH:13][cH:14][cH:15][cH:16][c:17]32)[cH:6][cH:7]1.[O:33]=[C:32](Cl)[CH2:31][Cl:30]>O>[NH2:25][c:4]1[cH:3][c:2]([C:32](=[O:33])[CH2:31][Cl:30])[cH:7][cH:6][c:5]1[CH:8]1[NH:9][C:10](=[O:18])[CH2:11][c:12]2[cH:13][cH:14][cH:15][cH:16][c:17]21 +03946018 [CH3:2][CH2:1][NH:3][CH2:4][C:5](=[O:6])[c:7]1[cH:12][cH:11][c:10]([CH:13]2[NH:14][C:15](=[O:23])[CH2:16][c:17]3[cH:18][cH:19][cH:20][cH:21][c:22]32)[c:9]([NH2:24])[cH:8]1.[O:27]=[C:26]([OH:25])/[CH:28]=[CH:29]\[C:30](=[O:32])[OH:31]>CCO>[CH3:2][CH2:1][NH:3][CH2:4][C:5](=[O:6])[c:7]1[cH:12][cH:11][c:10]([CH:13]2[NH:14][C:15](=[O:23])[CH2:16][c:17]3[cH:18][cH:19][cH:20][cH:21][c:22]32)[c:9]([NH2:24])[cH:8]1.[O:25]=[C:26]([OH:27])/[CH:28]=[CH:29]\[C:30](=[O:31])[OH:32] +03946019 [CH3:29][c:19]1[cH:20][cH:21][c:22]([S:25](=[O:26])(=[O:27])Cl)[cH:23][cH:24]1.[N:18]#[C:17][K].[cH:3]1[cH:4][cH:5][n:1](-[c:6]2[cH:7][cH:8][cH:9][c:10]3[cH:11][cH:12][n:13][cH:14][c:15]32)[cH:2]1>O.ClCCl>[CH3:29][c:19]1[cH:20][cH:21][c:22]([S:25](=[O:26])(=[O:27])[N:13]2[CH:12]=[CH:11][c:10]3[cH:9][cH:8][cH:7][c:6](-[n:1]4[cH:2][cH:3][cH:4][cH:5]4)[c:15]3[CH:14]2[C:17]#[N:18])[cH:23][cH:24]1 +03946020 [Na+].[Na+].[Al+3:5].[O:11]=[N+]([O-])[O-].[O:7]=[N+]([O-])[O-].[O:2]=[N+]([O-])[O-].[O:19]=[Si:17]([O-:18])[O-:16]>>[OH-:11].[OH-:7].[OH-:2].[Al+3:5].[OH:16][Si:17]([OH:18])([OH:11])[OH:19] +03946021 [CH3:27][CH2:26][n:11]1c2ccc(C(=O)CCCCl)c[c:18]2[c:17]2cc(C(=O)CCCCl)cc[c:12]21.[CH3:55][CH2:54][n:38]1[c:39]2[cH:40][cH:41][c:42]([C:47](=[O:53])[CH:48]([CH3:52])[CH2:49][CH2:50]Cl)[cH:43][c:44]2[c:45]2[cH:46][c:34]([C:32](=[O:33])[CH:31]([CH3:56])[CH2:30][CH2:29]Cl)[cH:35][cH:36][c:37]21>>[CH3:55][CH2:54][n:38]1[c:39]2[cH:40][cH:41][c:42]([C:47](=[O:53])[CH:48]([CH3:52])[CH2:49][CH2:50][N:11]3[CH2:26][CH2:27][CH2:18][CH2:17][CH2:12]3)[cH:43][c:44]2[c:45]2[cH:46][c:34]([C:32](=[O:33])[CH:31]([CH3:56])[CH2:30][CH2:29][N:11]3[CH2:12][CH2:17][CH2:18][CH2:27][CH2:26]3)[cH:35][cH:36][c:37]21 +03946022 [K+].[K+].[I-].O=C([O-])O.[O:27]=[C:26]([CH2:25][CH2:24][CH2:23][CH2:22][Cl:21])[c:28]1[cH:29][cH:30][cH:31][cH:32][cH:33]1.[OH:8][C:7]([c:1]1[cH:2][cH:3][cH:4][cH:5][cH:6]1)([c:15]1[cH:16][cH:17][cH:18][cH:19][cH:20]1)[CH:9]1[CH2:10][CH2:11][NH:12][CH2:13][CH2:14]1>O.Cc1ccccc1>[ClH:21].[O:27]=[C:26]([CH2:25][CH2:24][CH2:23][CH2:22][N:12]1[CH2:11][CH2:10][CH:9]([C:7]([OH:8])([c:1]2[cH:6][cH:5][cH:4][cH:3][cH:2]2)[c:15]2[cH:16][cH:17][cH:18][cH:19][cH:20]2)[CH2:14][CH2:13]1)[c:28]1[cH:29][cH:30][cH:31][cH:32][cH:33]1 +03946022 Cl.Cl.[NH2:36][OH:37].O=[C:9]([CH2:10][CH2:11][CH2:12][CH2:13][N:14]1[CH2:15][CH2:16][CH:17]([C:20]([OH:33])([c:21]2[cH:22][cH:23][cH:24][cH:25][cH:26]2)[c:27]2[cH:28][cH:29][cH:30][cH:31][cH:32]2)[CH2:18][CH2:19]1)[c:6]1[cH:5][cH:4][c:3]([F:2])[cH:8][cH:7]1>c1ccncc1>[OH:37][N:36]=[C:9]([CH2:10][CH2:11][CH2:12][CH2:13][N:14]1[CH2:15][CH2:16][CH:17]([C:20]([OH:33])([c:21]2[cH:22][cH:23][cH:24][cH:25][cH:26]2)[c:27]2[cH:28][cH:29][cH:30][cH:31][cH:32]2)[CH2:18][CH2:19]1)[c:6]1[cH:5][cH:4][c:3]([F:2])[cH:8][cH:7]1 +03946025 [Na].[CH3:15][CH2:14][CH2:13][CH:12]([Cl:16])[CH2:11]Br.[SH:9][c:4]1[cH:5][cH:6][cH:7][cH:8][c:3]1[Br:2]>CCO>[CH3:15][CH2:14][CH2:13][CH:12]([Cl:16])[CH2:11][S:9][c:4]1[cH:5][cH:6][cH:7][cH:8][c:3]1[Br:2] +03946027 [CH3:13][CH2:12][O:14][C:15](=[O:20])/[CH:16]=[C:17](/[CH3:18])[NH2:19].[CH3:22][CH2:21][O:23][C:24](=[O:33])[CH2:25][C:26](=O)[C:28](=[O:29])[O:30][CH2:31][CH3:32].O=[CH:7][c:6]1[cH:9][cH:10][cH:11][c:4]([N+:1](=[O:2])[O-:3])[cH:5]1>CCO>[CH3:32][CH2:31][O:30][C:28](=[O:29])[C:26]1=[C:25]([C:24](=[O:33])[O:23][CH2:21][CH3:22])[CH:7]([c:6]2[cH:9][cH:10][cH:11][c:4]([N+:1](=[O:2])[O-:3])[cH:5]2)[C:16]([C:15](=[O:20])[O:14][CH2:12][CH3:13])=[C:17]([CH3:18])[NH:19]1 +03946027 [CH3:25][CH2:24][O:26][C:27](=[O:32])/[CH:28]=[C:29](/[CH3:30])[NH2:31].[CH3:12][CH2:11][O:13][C:14](=[O:23])[CH2:15][C:16](=O)[C:18](=[O:19])[O:20][CH2:21][CH3:22].[CH3:1][O:2][c:3]1[cH:10][cH:9][cH:8][c:5]([CH:6]=O)[cH:4]1>CCO>[CH3:22][CH2:21][O:20][C:18](=[O:19])[C:16]1=[C:15]([C:14](=[O:23])[O:13][CH2:11][CH3:12])[CH:6]([c:5]2[cH:8][cH:9][cH:10][c:3]([O:2][CH3:1])[cH:4]2)[C:28]([C:27](=[O:32])[O:26][CH2:24][CH3:25])=[C:29]([CH3:30])[NH:31]1 +03946028 [CH3:35][CH2:34][O:33][C:31](=[O:32])[CH2:30][C:29](=[NH:36])[C:28](=[O:37])[O:27][CH2:25][CH3:26].[CH3:13][CH2:12][O:14][C:15](=[O:24])[CH2:16][C:17](=O)[C:19](=[O:20])[O:21][CH2:22][CH3:23].O=[CH:6][c:5]1[cH:8][cH:9][cH:10][cH:11][c:4]1[N+:1](=[O:2])[O-:3]>>[CH3:23][CH2:22][O:21][C:19](=[O:20])[C:17]1=[C:16]([C:15](=[O:24])[O:14][CH2:12][CH3:13])[CH:6]([c:5]2[cH:8][cH:9][cH:10][cH:11][c:4]2[N+:1](=[O:2])[O-:3])[C:30]([C:31](=[O:32])[O:33][CH2:34][CH3:35])=[C:29]([C:28](=[O:37])[O:27][CH2:25][CH3:26])[NH:36]1 +03946028 [CH3:34][CH2:33][O:32][C:30](=[O:31])[CH2:29][C:28](=[NH:35])[C:27](=[O:36])[O:26][CH2:24][CH3:25].[CH3:12][CH2:11][O:13][C:14](=[O:23])[CH2:15][C:16](=O)[C:18](=[O:19])[O:20][CH2:21][CH3:22].[CH3:1][O:2][c:3]1[cH:10][cH:9][cH:8][c:5]([CH:6]=O)[cH:4]1>CCO>[CH3:22][CH2:21][O:20][C:18](=[O:19])[C:16]1=[C:15]([C:14](=[O:23])[O:13][CH2:11][CH3:12])[CH:6]([c:5]2[cH:8][cH:9][cH:10][c:3]([O:2][CH3:1])[cH:4]2)[C:29]([C:30](=[O:31])[O:32][CH2:33][CH3:34])=[C:28]([C:27](=[O:36])[O:26][CH2:24][CH3:25])[NH:35]1 +03946030 [S].[CH3:8][c:3]1[cH:4][cH:5][cH:6][cH:7][c:2]1[NH2:1].[S:12]=[C:11]=[S:10]>>[CH3:8][c:3]1[cH:4][cH:5][cH:6][c:7]2[s:10][c:11]([SH:12])[n:1][c:2]21 +03946031 [Br].[S:7]=[C:6]([NH:8][c:9]1[n:13][c:12]2[cH:14][cH:15][cH:16][cH:17][c:11]2[nH:10]1)[c:3]1[cH:4][cH:5][o:1][cH:2]1>ClC(Cl)Cl>[cH:5]1[cH:4][c:3](-[c:6]2[n:8][c:9]3[n:13][c:12]4[cH:14][cH:15][cH:16][cH:17][c:11]4[n:10]3[s:7]2)[cH:2][o:1]1 +03946036 Cl.[CH3:13][CH2:14]O.[O:10]=[C:9]([OH:11])[CH2:8][c:5]1[cH:4][cH:3][c:2]([SH:1])[cH:7][cH:6]1>>[CH3:14][CH2:13][O:10][C:9](=[O:11])[CH2:8][c:5]1[cH:6][cH:7][c:2]([SH:1])[cH:3][cH:4]1 +03946036 N.[Na].[CH3:25]I.CC[O:5][C:6](=[O:24])[CH2:7][c:8]1[cH:23][cH:22][c:11]2[c:10]([cH:9]1)[C:16](=[O:17])[c:15]1[cH:18][cH:19][cH:20][cH:21][c:14]1[CH2:13][S:12]2>[Fe+3].O=[N+]([O-])[O-].O=[N+]([O-])[O-].O=[N+]([O-])[O-]>[CH3:25][CH:7]([C:6](=[O:24])[OH:5])[c:8]1[cH:23][cH:22][c:11]2[c:10]([cH:9]1)[C:16](=[O:17])[c:15]1[cH:18][cH:19][cH:20][cH:21][c:14]1[CH2:13][S:12]2 +03946038 [NH2:11][CH2:10][CH2:9][NH2:8].[O:6]=[S:1]1(=[O:7])[CH:2]=[CH:3][CH:4]=[CH:5]1>>[O:6]=[S:1]1(=[O:7])[CH2:5][CH2:4][CH:3]([NH:11][CH:10]2[CH2:2][CH2:3][CH2:4][CH2:5][CH:9]2[NH:8][CH:3]2[CH2:4][CH2:5][S:1](=[O:7])(=[O:6])[CH2:2]2)[CH2:2]1 +03946041 [ClH:41].[CH3:2][CH2:1][O:3][C:4](=[O:40])[c:5]1[c:10]([C:11](=[O:35])[CH2:12][c:13]2[c:18]([CH2:19][CH2:20][NH:21][CH2:22]Cc3ccccc3)[cH:17][c:16]3[c:15]([c:14]2[O:33][CH3:34])[O:32][CH2:31][O:30]3)[cH:9][cH:8][c:7]([O:36][CH3:37])[c:6]1[O:38][CH3:39]>CCO>[ClH:41].[CH3:2][CH2:1][O:3][C:4](=[O:40])[c:5]1[c:10]([C:11](=[O:35])[CH2:12][c:13]2[c:18]([CH2:19][CH2:20][NH:21][CH3:22])[cH:17][c:16]3[c:15]([c:14]2[O:33][CH3:34])[O:32][CH2:31][O:30]3)[cH:9][cH:8][c:7]([O:36][CH3:37])[c:6]1[O:38][CH3:39] +03946044 [K+].[K+].[CH3:2][CH2:1][c:3]1[cH:9][cH:8][cH:7][c:6]([CH3:10])[c:4]1[NH2:5].O=C([O-])[O-].Cl[CH2:12][CH:13]1[O:14][CH2:15][CH2:16][O:17]1>CN(C)C=O>[CH3:2][CH2:1][c:3]1[cH:9][cH:8][cH:7][c:6]([CH3:10])[c:4]1[NH:5][CH2:12][CH:13]1[O:17][CH2:16][CH2:15][O:14]1 +03946045 [K+].[K+].[CH3:10][O:9][c:5]1[cH:6][cH:7][cH:8][c:2]([CH3:1])[c:3]1[NH2:4].O=C([O-])[O-].Cl[CH2:12][CH:13]1[CH2:14][O:15][CH2:16][O:17]1>[Cl-].CC[N+](CC)(CC)CC>[CH3:10][O:9][c:5]1[cH:6][cH:7][cH:8][c:2]([CH3:1])[c:3]1[NH:4][CH2:12][CH:13]1[CH2:14][O:15][CH2:16][O:17]1 +03946045 [K+].[K+].[CH3:12][CH:13]1[O:17][CH2:16][CH:15]([CH2:18]Cl)[O:14]1.[CH3:2][C:1]([CH3:3])([CH3:4])[c:5]1[cH:11][cH:10][cH:9][cH:8][c:6]1[NH2:7].O=C([O-])[O-]>[Cl-].CC[N+](CC)(CC)CC>[CH3:12][CH:13]1[O:17][CH2:16][CH:15]([CH2:18][NH:7][c:6]2[cH:8][cH:9][cH:10][cH:11][c:5]2[C:1]([CH3:3])([CH3:2])[CH3:4])[O:14]1 +03946049 [OH-].Cl.[K+].[N:21]#[C:20][c:18]1[cH:17][cH:16][c:15](-[c:12]2[cH:11][cH:10][c:9]([O:8][CH2:1][c:2]3[cH:3][cH:4][cH:5][cH:6][cH:7]3)[cH:14][cH:13]2)[o:19]1.[NH2:23][OH:24]>CCO>[NH2:21][C:20](=[N:23][OH:24])[c:18]1[cH:17][cH:16][c:15](-[c:12]2[cH:11][cH:10][c:9]([O:8][CH2:1][c:2]3[cH:7][cH:6][cH:5][cH:4][cH:3]3)[cH:14][cH:13]2)[o:19]1 +03946049 [OH-:17].[ClH:19].[K+].[N:16]#[C:15][c:13]1[cH:12][cH:11][c:10](-[c:5]2[cH:6][cH:7][cH:8][cH:9][c:4]2[N+:1](=[O:2])[O-:3])[o:14]1.[NH2:20]O>CC(C)O>[ClH:19].[NH2:16][C:15](=[N:20][OH:17])[c:13]1[cH:12][cH:11][c:10](-[c:5]2[cH:6][cH:7][cH:8][cH:9][c:4]2[N+:1](=[O:2])[O-:3])[o:14]1 +03946059 [S].CCO[Si](CCC[S:8][S:9][CH2:10][CH2:11][CH2:12][Si:13]([O:14][CH2:15][CH3:16])([O:17][CH2:18][CH3:19])[O:20][CH2:21][CH3:22])(OCC)OCC>>[CH3:16][CH2:15][O:14][Si:13]([CH2:12][CH2:11][CH2:10][S:9][S:8][S:9][CH2:10][CH2:11][CH2:12][Si:13]([O:20][CH2:21][CH3:22])([O:17][CH2:18][CH3:19])[O:14][CH2:15][CH3:16])([O:17][CH2:18][CH3:19])[O:20][CH2:21][CH3:22] +03946065 [Na+].[Na+].[Na+].[I-].[CH3:5][CH2:4][O:3][C:1](=[O:2])[CH2:6][CH2:7][CH2:8][CH2:9][CH2:10][CH2:11][CH:12]1[CH:13]([C:23]#[N:24])[CH:14](C(C)=O)[CH2:15][CH:16]1C(C)=O.[O:28]=[C:27]([O:26]O)[c:29]1cccc(Cl)c1.O=S([O-])([O-])=S>ClC(Cl)Cl>[CH3:5][CH2:4][O:3][C:1](=[O:2])[CH2:6][CH2:7][CH2:8][CH2:9][CH2:10][CH2:11][CH:12]1[CH:13]([C:23]#[N:24])[CH:14]([O:26][C:27]([CH3:29])=[O:28])[CH2:15][CH:16]1[O:3][C:1]([CH3:6])=[O:2] +03946078 [H-].[H-].[H-].[H-].[Li+].[Al+3].[CH2:1]=[C:2]1[CH2:7][CH2:6][CH2:5][C:4]([CH3:8])([CH3:9])[CH:3]1[CH:10]([OH:14])[C:11]#[C:12][CH3:13]>>[CH2:1]=[C:2]1[CH2:7][CH2:6][CH2:5][C:4]([CH3:8])([CH3:9])[CH:3]1[CH:10]([OH:14])/[CH:11]=[CH:12]/[CH3:13] +03946111 [CH3:28][CH2:27][CH2:26][CH2:25][CH2:24][CH:13]([CH3:12])[CH:14]([CH3:15])[c:16]1[cH:22][c:20]([OH:21])[cH:19]c(O)[cH:17]1.[CH3:10][O:9][C:7](=[O:8])[CH:4]1[S:5][CH2:6][CH:2]([CH3:1])[C:3]1=O.O=P(Cl)(Cl)Cl.Oc1cccc(O)c1>c1ccccc1>[CH3:28][CH2:27][CH2:26][CH2:25][CH2:24][CH:13]([CH3:12])[CH:14]([CH3:15])[c:16]1[cH:22][c:20]([OH:21])[c:19]2[c:3]3[c:4]([c:7](=[O:8])[o:9][c:10]2[cH:17]1)[S:5][CH2:6][CH:2]3[CH3:1] +03946111 [CH3:5][CH2:4][CH2:3][CH2:2][CH2:1][c:6]1[cH:12][c:10]([OH:11])[cH:9][c:8]([OH:13])[cH:7]1.CO[C:20](=[O:21])[CH:18]1[S:19][CH:15]([CH3:14])[CH2:16][C:17]1=O>>[CH3:5][CH2:4][CH2:3][CH2:2][CH2:1][c:6]1[cH:7][c:8]([OH:13])[c:9]2[c:17]3[c:18]([c:20](=[O:21])[o:11][c:10]2[cH:12]1)[S:19][CH:15]([CH3:14])[CH2:16]3 +03947263 [OH2:30].[K+].[CH3:1][c:2]1[cH:7][cH:6][cH:5][cH:4][c:3]1-[c:8]1[n:12][n:11][c:10](-[c:13]2[cH:14][cH:15][cH:16][cH:17][cH:18]2)[s:9]1.O=[Mn](=O)(=O)[O-].[O:20]=[Mn](=O)(=O)[O-]>>[O:30]=[C:1]([OH:20])[c:2]1[cH:7][cH:6][cH:5][cH:4][c:3]1-[c:8]1[n:12][n:11][c:10](-[c:13]2[cH:14][cH:15][cH:16][cH:17][cH:18]2)[s:9]1 +03947406 [NH3:11].[Na+].Cl.[CH3:12][O-:13].[CH3:1][CH:2]1[CH2:7][CH2:6][CH2:5][C:4](=[O:8])[CH2:3]1.OO>O.CO>[CH3:1][CH:2]1[CH2:7][CH2:6][CH2:5][C:4](=[O:8])[CH2:3]1.[CH3:5][CH:4]1[CH2:3][CH2:2][CH2:7][CH2:6][NH:11][C:12]1=[O:13] +03947408 B.C[n:21]1[c:15]2[cH:14][cH:13][c:12]([N+:9](=[O:10])[O-:11])[cH:24][c:16]2[c:17](=O)o[c:20]1=O.[O:3]=[C:2](O)[CH:4]1[CH2:5][CH2:6][CH2:7][NH:8]1>C1CCOC1>[CH3:20][N:21]1[c:15]2[cH:14][cH:13][c:12]([N+:9](=[O:10])[O-:11])[cH:24][c:16]2[CH2:17][N:8]2[CH2:7][CH2:6][CH2:5][CH:4]2[C:2]1=[O:3] +03947408 B.Cl.CO.[CH3:12][N:11]1[c:5]2[cH:4][cH:3][c:2]([Cl:1])[cH:18][c:6]2[C:7](=O)[N:8]2[CH2:16][CH2:15][CH2:14][CH:9]2[C:10]1=[O:13]>C1CCOC1>[CH3:12][N:11]1[c:5]2[cH:4][cH:3][c:2]([Cl:1])[cH:18][c:6]2[CH2:7][N:8]2[CH2:16][CH2:15][CH2:14][CH:9]2[C:10]1=[O:13] +03947408 B.[CH3:1][N:2]1[c:8]2[cH:9][cH:10][c:11]([C:13]([F:14])([F:15])[F:16])[cH:12][c:7]2[C:6](=O)[N:5]2[CH2:18][CH2:19][CH2:20][CH:4]2[C:3]1=[O:21]>C1CCOC1>[CH3:1][N:2]1[c:8]2[cH:9][cH:10][c:11]([C:13]([F:15])([F:14])[F:16])[cH:12][c:7]2[CH2:6][N:5]2[CH2:18][CH2:19][CH2:20][CH:4]2[C:3]1=[O:21] +03947409 CC(=O)[O:4][C@@H:5]1[CH2:24][CH2:23][C@@:22]2([CH3:25])[CH:7]([CH2:8][CH2:9][C@H:10]3[C@@H:11]4[CH2:12][C:13]([CH3:28])=[C:14]([C:15]([CH3:16])=[O:17])[C@@:18]4([CH3:27])[CH2:19][C:20](=[O:26])[C@@H:21]32)[CH2:6]1.O[OH:29]>CO>[CH3:16][C:15](=[O:17])[C@@:14]12[O:29][C@:13]1([CH3:28])[CH2:12][C@H:11]1[C@@H:10]3[CH2:9][CH2:8][CH:7]4[CH2:6][C@H:5]([OH:4])[CH2:24][CH2:23][C@:22]4([CH3:25])[C@H:21]3[C:20](=[O:26])[CH2:19][C@@:18]12[CH3:27] +03947416 [Pb+4].CC(=O)[O-].CC(=O)[O-].CC(=O)[O-].CC(=O)[O-].C[N:14](C)[CH:15]=[O:16].NC(=O)[c:3]1[cH:7][cH:8][cH:9][cH:10][c:2]1[C:1](=[O:11])[OH:12]>O>[O:16]=[c:15]1[nH:14][c:3]2[cH:7][cH:8][cH:9][cH:10][c:2]2[c:1](=[O:11])[o:12]1 +03947416 [Pb+4].C[NH:2][C:3](=O)[c:4]1[cH:12][cH:11][cH:10]cc1C(N)=O.CC(=O)[O-].CC(=O)[O-].CC(=O)[O-].[CH3:20][C:19](=O)[O-:22].[CH3:18][N:15](C)[CH:16]=[O:17]>O>[CH3:18][n:15]1[c:16](=[O:17])[nH:2][c:3]2[cH:4][cH:12][cH:11][cH:10][c:20]2[c:19]1=[O:22] +03947417 N.[CH3:36][CH2:35][O:34]C(=O)Cl.CC[N:28](CC)CC.O=C(O)c1[n:19][c:20]([CH2:21][Cl:22])[n:16](-[c:10]2[cH:11][cH:12][c:13]([Cl:15])[cH:14][c:9]2[C:1](=[O:8])[c:2]2[cH:3][cH:4][cH:5][cH:6][cH:7]2)[n:17]1>O.C1CCOC1>[NH2:28][C:35](=[O:34])[c:36]1[n:19][c:20]([CH2:21][Cl:22])[n:16](-[c:10]2[cH:11][cH:12][c:13]([Cl:15])[cH:14][c:9]2[C:1](=[O:8])[c:2]2[cH:3][cH:4][cH:5][cH:6][cH:7]2)[n:17]1 +03947417 [NH3:25].[CH3:23][CH2:22][O:21][C:19](=[O:20])[CH:18](Br)[N:17]=[N:16][c:10]1[cH:11][cH:12][c:13]([Cl:15])[cH:14][c:9]1[C:1](=[O:8])[c:2]1[cH:3][cH:4][cH:5][cH:6][cH:7]1>>[CH3:23][CH2:22][O:21][C:19](=[O:20])[CH:18]([NH2:25])[N:17]=[N:16][c:10]1[cH:11][cH:12][c:13]([Cl:15])[cH:14][c:9]1[C:1](=[O:8])[c:2]1[cH:3][cH:4][cH:5][cH:6][cH:7]1 +03947434 [CH3:16][CH2:15][c:4]1[cH:3][c:2]([Cl:1])[c:11]2[c:10]3[nH:12][cH:13][n:14][c:9]3[cH:8][cH:7][c:6]2[n:5]1.[CH3:17][O:18][c:19]1[cH:20][cH:21][c:22]([NH2:25])[cH:23][cH:24]1>CCO>[ClH:1].[CH3:16][CH2:15][c:4]1[cH:3][c:2]([NH:25][c:22]2[cH:21][cH:20][c:19]([O:18][CH3:17])[cH:24][cH:23]2)[c:11]2[c:10]3[nH:12][cH:13][n:14][c:9]3[cH:8][cH:7][c:6]2[n:5]1 +03947440 [H][H].C=O.[CH3:12]C(=O)O.[CH3:10][c:5]1[cH:6][c:7]([OH:9])[n:8][c:3]([N:2]([CH3:11])[CH3:1])[n:4]1>O.[Zn+2].CC(=O)[O-].CC(=O)[O-]>[CH3:10][c:5]1[n:4][c:3]([N:2]([CH3:11])[CH3:1])[n:8][c:7]([OH:9])[c:6]1[CH3:12] +03947441 [Na].Cl.[CH3:21][O:20][c:12]1[cH:11][c:10]([CH2:9][c:5]2[cH:4][n:3][c:2]([NH2:1])[n:7][c:6]2Cl)[cH:15][c:14]([O:16][CH3:17])[c:13]1[O:18][CH3:19].[NH2:23][OH:24]>CO>[CH3:21][O:20][c:12]1[cH:11][c:10]([CH2:9][c:5]2[cH:4][n:3][c:2]([NH2:1])[n:7][c:6]2[NH:23][OH:24])[cH:15][c:14]([O:16][CH3:17])[c:13]1[O:18][CH3:19] +03947442 [Pb+4].C[NH:2][C:3](=O)[c:4]1[cH:12][cH:11][cH:10]cc1C(N)=O.CC(=O)[O-].CC(=O)[O-].CC(=O)[O-].[CH3:20][C:19](=O)[O-:22].[CH3:18][N:15](C)[CH:16]=[O:17]>O>[CH3:18][n:15]1[c:16](=[O:17])[nH:2][c:3]2[cH:4][cH:12][cH:11][cH:10][c:20]2[c:19]1=[O:22] +03947445 CC[O:14][C:12](=O)[C@H:3]1[CH2:4][CH2:5][C@@H:6]([C:7](=[O:8])[O:9][CH2:10][CH3:11])[N:2]1[CH3:1].[NH2:17][CH2:18][c:19]1[cH:20][cH:21][cH:22][cH:23][cH:24]1>Cc1ccccc1C>[CH3:11][CH2:10][O:9][C:7](=[O:8])[C@H:6]1[CH2:5][CH2:4][C@@H:3]([C:12](=[O:14])[NH:17][CH2:18][c:19]2[cH:20][cH:21][cH:22][cH:23][cH:24]2)[N:2]1[CH3:1] +03947445 [OH-].[Na+].Cl.Cl.[CH3:19][CH2:18][N:20]([CH2:24][CH3:25])[C:21](=[O:22])Cl.[CH3:3][N:4]1[CH:5]2[CH2:11][CH2:10][CH:9]1[CH2:8][NH:7][CH2:6]2.[Cl:15]C(Cl)Cl>O>[ClH:15].[CH3:19][CH2:18][N:20]([CH2:24][CH3:25])[C:21](=[O:22])[N:7]1[CH2:6][CH:5]2[CH2:11][CH2:10][CH:9]([CH2:8]1)[N:4]2[CH3:3] +03947445 Cl.CCO.[CH3:16][N:11]1[CH2:10][CH:9]2[CH2:15][CH2:14][CH:13]([CH2:12]1)[N:8]2Cc1ccccc1>O>[CH3:16][N:11]1[CH2:12][CH:13]2[CH2:14][CH2:15][CH:9]([CH2:10]1)[NH:8]2 +03947446 Cl.[K+].[K+].[K+].[I-].[CH3:20][c:21]1[cH:26][cH:25][cH:24][cH:23][c:22]1[N:27]1[CH2:28][CH2:29][N:30]([CH2:33][CH2:34][CH2:35][Cl:36])[CH2:31][CH2:32]1.O=C([O-])[O-].[OH:1][c:2]1[cH:3][cH:4][cH:5][c:6]2[c:11]1[CH2:10][CH2:9][CH2:8][CH2:7]2>CCC(C)=O>[ClH:36].[CH3:20][c:21]1[cH:26][cH:25][cH:24][cH:23][c:22]1[N:27]1[CH2:32][CH2:31][N:30]([CH2:33][CH2:34][CH2:35][O:1][c:2]2[cH:3][cH:4][cH:5][c:6]3[c:11]2[CH2:10][CH2:9][CH2:8][CH2:7]3)[CH2:29][CH2:28]1 +03947448 O=S(=O)=O.[O:22]=[S:19](=O)([OH:20])[OH:21].[O:10]=[S:9](=[O:11])([OH:12])[C:2]1([OH:1])[CH:7]=[CH:6][C:5]([OH:8])=[CH:4][CH2:3]1.C1COCCO1>ClC(Cl)=C(Cl)Cl>[O:20]=[S:19](=[O:21])([OH:22])[CH:7]1[CH:6]=[C:5]([OH:8])[CH:4]=[CH:3][C:2]1([OH:1])[S:9](=[O:11])(=[O:10])[OH:12] +03947458 CN.[CH3:15][N:16]([CH2:17][CH:18]1[CH2:19][CH2:20][CH2:21][CH2:22][CH2:23]1)CC1CCCCC1.C1=CCCCC1.C1CCNCC1>>[CH3:15][NH:16][CH2:17][CH:18]1[CH2:19][CH2:20][CH2:21][CH2:22][CH2:23]1 +03947462 C/C=[C:10](\[CH3:9])[C:11](=[O:12])O.[OH:7][c:6]1[cH:5][cH:4][cH:3][c:2](O)[cH:8]1>>[O:12]=[c:11]1[cH:10][cH:9][o:7][c:6]2[cH:8][cH:2][cH:3][cH:4][c:5]12 +03947466 [Na+].[BH3-][C:28]#[N:29].[CH3:32]C(=O)O.N[CH2:16][c:13]1[n:14][n:15][c:11]2[n:12]1-[c:6]1[cH:5][cH:4][c:3]([C:2]([F:26])([F:27])[F:1])[cH:25][c:7]1[C:8]([c:18]1[cH:23][cH:22][cH:21][cH:20][c:19]1[Cl:24])=[N:9][CH2:10]2>CC#N>[CH3:32][N:29]([CH3:28])[CH2:16][c:13]1[n:14][n:15][c:11]2[n:12]1-[c:6]1[cH:5][cH:4][c:3]([C:2]([F:26])([F:27])[F:1])[cH:25][c:7]1[C:8]([c:18]1[cH:23][cH:22][cH:21][cH:20][c:19]1[Cl:24])=[N:9][CH2:10]2 +03947466 [Na+].[BH3-][C:29]#N.[CH3:27][CH2:26][CH:25]=O.[CH3:33][C:34](=O)O.[NH2:16][CH2:15][c:12]1[n:13][n:14][c:10]2[n:11]1-[c:5]1[cH:4][cH:3][c:2]([Cl:1])[cH:24][c:6]1[C:7]([c:17]1[cH:22][cH:21][cH:20][cH:19][c:18]1[Cl:23])=[N:8][CH2:9]2>CC#N>[CH3:27][CH2:26][CH2:25][N:16]([CH2:29][CH2:34][CH3:33])[CH2:15][c:12]1[n:13][n:14][c:10]2[n:11]1-[c:5]1[cH:4][cH:3][c:2]([Cl:1])[cH:24][c:6]1[C:7]([c:17]1[cH:22][cH:21][cH:20][cH:19][c:18]1[Cl:23])=[N:8][CH2:9]2 +03947466 O.NN.O=C(c1ccccc1)[c:6]1[cH:15][c:2]([Cl:1])[cH:3][cH:4][c:5]1-[n:16]1[c:17]([CH2:33][N:34]2C(=O)c3ccccc3C2=O)[n:18][n:19][c:20]1[CH2:21][N:22]1[C:23](=O)[c:24]2[cH:31][cH:30][cH:29][cH:28][c:25]2C1=O.O=C1NC(=O)c2ccccc21>CCO>[NH2:34][CH2:33][c:17]1[n:18][n:19][c:20]2[n:16]1-[c:5]1[cH:6][cH:15][c:2]([Cl:1])[cH:3][c:4]1[C:23]([c:24]1[cH:31][cH:30][cH:29][cH:28][cH:25]1)=[N:22][CH2:21]2 +03947466 [Na+].[BH3-][C:27]#[N:28].[CH3:31]CC(=O)O.N[CH2:17][c:14]1[n:15][n:16][c:12]2[n:13]1-[c:7]1[cH:6][cH:5][c:4]([N+:1](=[O:2])[O-:3])[cH:26][c:8]1[C:9]([c:19]1[cH:24][cH:23][cH:22][cH:21][c:20]1[Cl:25])=[N:10][CH2:11]2>CC#N>[CH3:31][N:28]([CH3:27])[CH2:17][c:14]1[n:15][n:16][c:12]2[n:13]1-[c:7]1[cH:6][cH:5][c:4]([N+:1](=[O:2])[O-:3])[cH:26][c:8]1[C:9]([c:19]1[cH:24][cH:23][cH:22][cH:21][c:20]1[Cl:25])=[N:10][CH2:11]2 +03947467 [CH3:34][n:27]1[c:28]([N+:31](=[O:32])[O-:33])[cH:29][n:30][c:26]1-[c:20]1[n:21][n:22]([CH2:23][CH2:24]O)[c:18]([NH2:17])[c:19]1[C:35]#[N:36].O=S([Cl:15])Cl.FP(F)F.ClP(Cl)Cl.BrP(Br)Br>CN(C)C=O.c1ccccc1>[CH3:34][n:27]1[c:28]([N+:31](=[O:32])[O-:33])[cH:29][n:30][c:26]1-[c:20]1[n:21][n:22]([CH2:23][CH2:24][Cl:15])[c:18]([NH2:17])[c:19]1[C:35]#[N:36] +03947468 [CH3].[O].[H][H].CC(=O)c1ccc(Cl)cc1.C[C:37]1(c2ccc(Cl)cc2)[O:42][c:41]2[cH:43][cH:44][cH:45][cH:46][c:40]2-[c:39]2[cH:47][cH:48][cH:49][cH:50][c:38]21.O=P(O)(F)F.Oc1ccccc1.Oc1cccc2c1-c1ccccc1C2c1ccc(Cl)cc1.Oc1ccccc1-c1ccccc1>O.CO.C[N+](=O)[O-]>[cH:49]1[cH:48][cH:47][c:39]2[c:38]([cH:50]1)[CH2:37][O:42][c:41]1[cH:43][cH:44][cH:45][cH:46][c:40]1-2 +03947470 [ClH:1].[CH3:3][CH2:2][N:4]([CH2:17][CH3:18])[CH2:5][CH2:6][O:7][c:8]1[cH:9][cH:10][c:11]([C:12](=[O:13])O)[cH:15][cH:16]1.O=S([Cl:21])Cl>ClCCl>[ClH:21].[CH3:3][CH2:2][N:4]([CH2:17][CH3:18])[CH2:5][CH2:6][O:7][c:8]1[cH:9][cH:10][c:11]([C:12](=[O:13])[Cl:1])[cH:15][cH:16]1 +03947470 Cl.[CH3:18][CH2:17][N:19]([CH2:32][CH3:33])[CH2:20][CH2:21][O:22][c:23]1[cH:31][cH:30][cH:29][cH:28][c:24]1[C:25](=[O:26])Cl.[cH:11]1[c:10]2[cH:12][cH:13][cH:14][cH:15][c:9]2[o:8][c:7]1-[c:1]1[cH:2][cH:3][cH:4][cH:5][cH:6]1>>[CH3:33][CH2:32][N:19]([CH2:17][CH3:18])[CH2:20][CH2:21][O:22][c:23]1[cH:31][cH:30][cH:29][cH:28][c:24]1[C:25](=[O:26])[c:11]1[c:10]2[cH:12][cH:13][cH:14][cH:15][c:9]2[o:8][c:7]1-[c:1]1[cH:2][cH:3][cH:4][cH:5][cH:6]1 +03947470 [CH3:25][O:24][c:21]1[cH:20][cH:19][c:18]([C:17](=[O:26])Cl)[cH:23][cH:22]1.[Cl:1][c:2]1[cH:3][cH:4][c:5]2[o:9][c:8](-[c:10]3[cH:11][cH:12][cH:13][cH:14][cH:15]3)[cH:7][c:6]2[cH:16]1>>[CH3:25][O:24][c:21]1[cH:20][cH:19][c:18]([C:17](=[O:26])[c:7]2[c:6]3[cH:16][c:2]([Cl:1])[cH:3][cH:4][c:5]3[o:9][c:8]2-[c:10]2[cH:11][cH:12][cH:13][cH:14][cH:15]2)[cH:23][cH:22]1 +03947470 [CH3:31][CH2:30][NH:32][CH2:33][CH3:34].[O:28]=[C:16]([c:7]1[c:6]2[cH:29][c:2]([Cl:1])[cH:3][cH:4][c:5]2[o:9][c:8]1-[c:10]1[cH:11][cH:12][cH:13][cH:14][cH:15]1)[c:17]1[cH:18][cH:19][c:20]([O:23][CH2:24][CH2:25][CH2:26]Br)[cH:21][cH:22]1>CCO>[CH3:31][CH2:30][N:32]([CH2:33][CH3:34])[CH2:26][CH2:25][CH2:24][O:23][c:20]1[cH:19][cH:18][c:17]([C:16](=[O:28])[c:7]2[c:6]3[cH:29][c:2]([Cl:1])[cH:3][cH:4][c:5]3[o:9][c:8]2-[c:10]2[cH:11][cH:12][cH:13][cH:14][cH:15]2)[cH:22][cH:21]1 +03947470 COc1ccc(C(=O)Cl)cc1.C[O:47][c:44]1[cH:43][cH:42][c:41]([C:40](=[O:49])[c:39]2[c:38]3[cH:50][cH:51][cH:52][cH:53][c:37]3[o:36][c:35]2-[c:32]2[cH:31][cH:30][c:29]([Cl:28])[cH:34][cH:33]2)[cH:46][cH:45]1.Clc1ccc(-c2cc3ccccc3o2)cc1>>[O:49]=[C:40]([c:39]1[c:38]2[cH:50][cH:51][cH:52][cH:53][c:37]2[o:36][c:35]1-[c:32]1[cH:31][cH:30][c:29]([Cl:28])[cH:34][cH:33]1)[c:41]1[cH:42][cH:43][c:44]([OH:47])[cH:45][cH:46]1 +03947470 COc1ccc(C(=O)Cl)cc1.C[O:28][c:29]1[cH:30][cH:31][c:32]([C:33](=[O:34])[c:35]2[o:36][c:37]3[cH:49][cH:48][cH:47][cH:46][c:38]3[c:39]2-[c:40]2[cH:41][cH:42][cH:43][cH:44][cH:45]2)[cH:50][cH:51]1.c1oc2ccccc2c1-c1ccccc1>>[O:34]=[C:33]([c:35]1[o:36][c:37]2[cH:49][cH:48][cH:47][cH:46][c:38]2[c:39]1-[c:40]1[cH:41][cH:42][cH:43][cH:44][cH:45]1)[c:32]1[cH:50][cH:51][c:29]([OH:28])[cH:30][cH:31]1 +03947470 [CH3:30][CH2:29][NH:31][CH2:32][CH3:33].[O:11]=[C:10]([c:12]1[o:13][c:14]2[cH:26][cH:25][cH:24][cH:23][c:15]2[c:16]1-[c:17]1[cH:18][cH:19][cH:20][cH:21][cH:22]1)[c:9]1[cH:8][cH:7][c:6]([O:5][CH2:4][CH2:3][CH2:2]Br)[cH:28][cH:27]1>CCO>[CH3:30][CH2:29][N:31]([CH2:32][CH3:33])[CH2:2][CH2:3][CH2:4][O:5][c:6]1[cH:7][cH:8][c:9]([C:10](=[O:11])[c:12]2[o:13][c:14]3[cH:26][cH:25][cH:24][cH:23][c:15]3[c:16]2-[c:17]2[cH:18][cH:19][cH:20][cH:21][cH:22]2)[cH:27][cH:28]1 +03947470 [CH3:29][O:28][c:25]1[cH:24][cH:23][c:22]([C:21](=[O:30])Cl)[cH:27][cH:26]1.[F:19][C:2]([F:20])([F:1])[c:3]1[cH:18][cH:17][cH:16][c:5]([CH2:6][c:7]2[cH:11][c:10]3[cH:12][cH:13][cH:14][cH:15][c:9]3[o:8]2)[cH:4]1>>[CH3:29][O:28][c:25]1[cH:24][cH:23][c:22]([C:21](=[O:30])[c:11]2[c:10]3[cH:12][cH:13][cH:14][cH:15][c:9]3[o:8][c:7]2[CH2:6][c:5]2[cH:16][cH:17][cH:18][c:3]([C:2]([F:20])([F:19])[F:1])[cH:4]2)[cH:27][cH:26]1 +03947470 [K+].[K+].[CH3:28][CH2:27][CH2:26][CH2:25][N:29]([CH2:34][CH2:35][CH2:36][CH3:37])[CH2:30][CH2:31][CH2:32]Cl.CCC(C)=O.O=C([O-])[O-].[O:7]=[C:6]([c:8]1[c:12]2[cH:13][cH:14][cH:15][cH:16][c:11]2[o:10][c:9]1-[c:17]1[cH:18][cH:19][cH:20][cH:21][cH:22]1)[c:5]1[cH:4][cH:3][c:2]([OH:1])[cH:24][cH:23]1>O>[CH3:37][CH2:36][CH2:35][CH2:34][N:29]([CH2:25][CH2:26][CH2:27][CH3:28])[CH2:30][CH2:31][CH2:32][O:1][c:2]1[cH:24][cH:23][c:5]([C:6](=[O:7])[c:8]2[c:12]3[cH:13][cH:14][cH:15][cH:16][c:11]3[o:10][c:9]2-[c:17]2[cH:22][cH:21][cH:20][cH:19][cH:18]2)[cH:4][cH:3]1 +03947470 [CH3:29][O:28][c:21]1[cH:22][c:23]([C:24]#N)[cH:26][cH:27][c:20]1[O:19]C(C)=O.O=C([OH:30])C(F)(F)F.[cH:11]1[c:10]2[cH:12][cH:13][cH:14][cH:15][c:9]2[o:8][c:7]1-[c:1]1[cH:2][cH:3][cH:4][cH:5][cH:6]1>>[CH3:29][O:28][c:21]1[cH:22][c:23]([C:24](=[O:30])[c:11]2[c:10]3[cH:12][cH:13][cH:14][cH:15][c:9]3[o:8][c:7]2-[c:1]2[cH:2][cH:3][cH:4][cH:5][cH:6]2)[cH:26][cH:27][c:20]1[OH:19] +03947470 [CH3:57][CH2:56][N:58]([CH2:63][CH3:64])[CH2:59][CH2:60]CCl.COc1ccc(C(=O)Cl)cc1.[CH3:49][O:48][c:45]1[cH:44][cH:43][c:42]([C:41](=[O:50])[c:40]2[c:36]([CH2:29][c:30]3[cH:31][cH:32][cH:33][cH:34][cH:35]3)[o:37][c:38]3[cH:54][cH:53][c:52]([Br:55])[cH:51][c:39]32)[cH:47][cH:46]1.Brc1ccc2oc(Cc3ccccc3)cc2c1>>[CH3:60][CH2:59][N:58]([CH2:63][CH3:64])[CH2:56][CH2:57][CH2:49][O:48][c:45]1[cH:44][cH:43][c:42]([C:41](=[O:50])[c:40]2[c:39]3[cH:51][c:52]([Br:55])[cH:53][cH:54][c:38]3[o:37][c:36]2[CH2:29][c:30]2[cH:35][cH:34][cH:33][cH:32][cH:31]2)[cH:47][cH:46]1 +03947470 [CH3:20]O.[CH3:2][CH2:1][c:3]1[cH:4][c:5]([C:6](=[O:7])[OH:8])[cH:9][c:10]([CH2:13][CH3:14])[c:11]1[OH:12].O=S(=O)(O)O>>[CH3:14][CH2:13][c:10]1[cH:9][c:5]([C:6](=[O:8])[O:7][CH3:20])[cH:4][c:3]([CH2:1][CH3:2])[c:11]1[OH:12] +03947470 O.[Li]CCCC.[CH3:11][CH2:10][c:7]1[cH:6][cH:5][c:4]([CH:3]=[C:2](Br)Br)[cH:9][cH:8]1.C1CCOC1>CCCCCC>[CH:2]#[C:3][c:4]1[cH:5][cH:6][c:7]([CH2:10][CH3:11])[cH:8][cH:9]1 +03947470 [Cl-].[CH3:27][O:26][c:25]1[c:24]([CH3:28])[cH:23][c:19]([C:20](=[O:21])Cl)[cH:18][c:17]1[CH3:16].ClCCl.[cH:11]1[c:10]2[cH:12][cH:13][cH:14][cH:15][c:9]2[o:8][c:7]1-[c:1]1[cH:2][cH:3][cH:4][cH:5][cH:6]1>O>[CH3:27][O:26][c:25]1[c:24]([CH3:28])[cH:23][c:19]([C:20](=[O:21])[c:11]2[c:10]3[cH:12][cH:13][cH:14][cH:15][c:9]3[o:8][c:7]2-[c:1]2[cH:2][cH:3][cH:4][cH:5][cH:6]2)[cH:18][c:17]1[CH3:16] +03947472 [Al+3].[Cl-].[Cl-].[Cl-].[CH3:13][O:12][c:3]1[cH:4][cH:5][c:6]2[cH:7][cH:8][cH:9][cH:10][c:11]2[c:2]1[Cl:1].[CH3:14][C:15](=[O:17])Cl>O=[N+]([O-])c1ccccc1>[CH3:13][O:12][c:3]1[cH:4][cH:5][c:6]2[cH:7][c:8]([C:15]([CH3:14])=[O:17])[cH:9][cH:10][c:11]2[c:2]1[Cl:1] +03947473 [H][H].[CH3:21][O:20][C:14]1([CH3:19])[CH2:13][CH2:12][c:11]2[cH:10][c:9]([O:8]Cc3ccccc3)[cH:18][cH:17][c:16]2[O:15]1>CCO>[CH3:21][O:20][C:14]1([CH3:19])[CH2:13][CH2:12][c:11]2[cH:10][c:9]([OH:8])[cH:18][cH:17][c:16]2[O:15]1 +03947473 [OH2:28].Cl.[CH3:25][OH:26].CC(=O)[O:14][c:11]1[c:10]([CH3:18])[c:9]([CH3:19])[c:8]([O:20]C(C)=O)[c:7]([CH2:6][CH2:5][C:3]([CH3:4])([OH:24])[C:1]#N)[c:12]1[CH3:13]>>[CH3:25][O:26][C:1](=[O:28])[C:3]([CH3:4])([OH:24])[CH2:5][CH2:6][c:7]1[c:12]([CH3:13])[c:11]([OH:14])[c:10]([CH3:18])[c:9]([CH3:19])[c:8]1[OH:20] +03947473 [CH2:25]=[CH:24]C(C)=O.C=CC(=C)[O:30][CH3:29].C=CC(C)(OC)OC.[CH3:56][OH:57].[CH3:49]OCCC(C)=O.[CH3:1][O:2][c:3]1[cH:9][cH:8][c:6](O)[c:5]([CH3:10])[c:4]1[CH3:11].COC(OC)OC.CC(=O)CCO.O=S(=O)(O)O>>[CH3:29][O:30][C:1]1([CH3:49])[CH2:6][CH2:8][c:9]2[c:24]([CH3:25])[c:56]([OH:57])[c:5]([CH3:10])[c:4]([CH3:11])[c:3]2[O:2]1 +03947473 [H-].CO[C:22](=[O:23])[CH2:21][C:14]1([CH3:26])[CH2:13][CH2:12][c:11]2[c:10]([CH3:27])[c:9]([O:8][CH2:1][c:2]3[cH:3][cH:4][cH:5][cH:6][cH:7]3)[c:18]([CH3:19])[c:17]([CH3:20])[c:16]2[O:15]1.CC(C)C[Al+]CC(C)C>CCCCC>[CH3:19][c:18]1[c:17]([CH3:20])[c:16]2[c:11]([c:10]([CH3:27])[c:9]1[O:8][CH2:1][c:2]1[cH:3][cH:4][cH:5][cH:6][cH:7]1)[CH2:12][CH2:13][C:14]([CH3:26])([CH2:21][CH:22]=[O:23])[O:15]2 +03947473 [OH-].[Na+].CC[OH:28].[CH3:19][c:18]1[c:17]([CH3:20])[c:16]2[c:11]([c:10]([CH3:25])[c:9]1[O:8][CH2:1][c:2]1[cH:3][cH:4][cH:5][cH:6][cH:7]1)[CH2:12][CH2:13][C:14]([CH3:24])([CH2:21][CH:22]=[O:23])[O:15]2>O.[Ag+].O=[N+]([O-])[O-]>[CH3:19][c:18]1[c:17]([CH3:20])[c:16]2[c:11]([c:10]([CH3:25])[c:9]1[O:8][CH2:1][c:2]1[cH:3][cH:4][cH:5][cH:6][cH:7]1)[CH2:12][CH2:13][C:14]([CH3:24])([CH2:21][C:22](=[O:23])[OH:28])[O:15]2 +03947473 [CH3:2][C:1](=[O:3])[O:4][c:5]1[c:14]([CH3:15])[c:13]([CH3:16])[c:12]2[c:7]([c:6]1[CH3:22])[CH2:8][CH2:9][C:10]([CH3:17])([CH2:18][C:19](=[O:20])O)[O:11]2.O=C([Cl:23])C(=O)Cl>c1ccccc1>[CH3:2][C:1](=[O:3])[O:4][c:5]1[c:14]([CH3:15])[c:13]([CH3:16])[c:12]2[c:7]([c:6]1[CH3:22])[CH2:8][CH2:9][C:10]([CH3:17])([CH2:18][C:19](=[O:20])[Cl:23])[O:11]2 +03947473 CC(=O)O[C:20]([CH3:19])=[O:21].[CH3:17][C:7]1=[C:8]([CH3:16])[C:9](C)([OH:15])[CH2:10][C:11]2=[C:6]1[O:5][C:4]([CH3:18])([C:1](=[O:2])[OH:3])[CH2:13][CH2:12]2.[cH:26]1ccncc1>>[CH3:19][C:20](=[O:21])[O:15][c:9]1[c:8]([CH3:16])[c:7]([CH3:17])[c:6]2[c:11]([c:10]1[CH3:26])[CH2:12][CH2:13][C:4]([CH3:18])([C:1](=[O:2])[OH:3])[O:5]2 +03947488 N.CO.C[C]=O.CC(=O)O[C:13]1([C:24](C)=[O:26])[O:18][C@H:19](CO)[C@@H:20]([OH:21])[C@:12]1([O:11]Cl)C(C)=O.[cH:6]1[n:5][c:4]2[n:3][cH:2][n:1][cH:9][c:8]2[nH:7]1>ClC(Cl)Cl>[OH:26][CH2:24][C@H:13]1[O:18][C@@H:19]([n:5]2[cH:6][n:7][c:8]3[cH:9][n:1][cH:2][n:3][c:4]32)[C@H:20]([OH:21])[C@@H:12]1[OH:11] +03947488 [CH3:8][C:9](=[O:11])Cl.[O-:1][c:2]1[cH:3][cH:4][cH:5][cH:6][cH:7]1>>[CH3:8][C:9](=[O:11])[O:1][c:2]1[cH:3][cH:4][cH:5][cH:6][cH:7]1 +03947491 [Na+].[Na+:25].[CH3:8][N+:7]([CH3:9])([CH3:10])[CH2:6][CH2:5][O:4][C:1](=O)[OH:2].O=C(O)[c:14]1[cH:15][cH:16][cH:17][cH:18][c:19]1[OH:20].[O:22]=[S:21]([O-:23])[O-:24]>>[Na+:25].[CH3:8][N+:7]([CH3:9])([CH3:10])[CH2:6][CH2:5][O:4][C:1](=[O:2])[c:18]1[cH:17][cH:16][cH:15][cH:14][c:19]1[OH:20].[O:22]=[S:21]([O-:23])[O-:24] +03947520 [OH-].[K+].CCO.[CH3:23][O:22][c:18]1[cH:19][cH:20][c:21]2[c:16]([cH:17]1)[CH2:15][CH2:14][C@H:13]([c:24]1[cH:25][cH:26][cH:27][cH:28][cH:29]1)[C@@H:12]2[c:9]1[cH:8][cH:7][c:6]([O:5][CH2:4][CH:3]([OH:30])[CH2:2][NH2:1])[cH:11][cH:10]1.S=[C:37]=[S:36]>>[CH3:23][O:22][c:18]1[cH:19][cH:20][c:21]2[c:16]([cH:17]1)[CH2:15][CH2:14][C@H:13]([c:24]1[cH:29][cH:28][cH:27][cH:26][cH:25]1)[C@@H:12]2[c:9]1[cH:10][cH:11][c:6]([O:5][CH2:4][CH:3]2[CH2:2][NH:1][C:37](=[S:36])[O:30]2)[cH:7][cH:8]1 +03947577 [Na].[CH3:10][c:11]1[cH:12][c:13]([C:14](=O)[NH:16][NH2:17])[cH:18][cH:19][n:20]1.[N:3]#[C:2][c:4]1[cH:5][cH:6][n:7][cH:8][cH:9]1>CO>[CH3:10][c:11]1[cH:12][c:13](-[c:14]2[n:16][nH:17][c:2](-[c:4]3[cH:5][cH:6][n:7][cH:8][cH:9]3)[n:3]2)[cH:18][cH:19][n:20]1 +03947577 [H-].[Na+].[CH3:25][N:21]([CH3:20])[C:22](=[O:23])Cl.[cH:2]1[cH:3][c:4](-[c:7]2[n:8][nH:9][c:10](-[c:12]3[cH:13][cH:14][n:15][cH:16][cH:17]3)[n:11]2)[cH:5][cH:6][n:1]1>C1CCOC1>[CH3:25][N:21]([CH3:20])[C:22](=[O:23])[n:8]1[n:9][c:10](-[c:12]2[cH:13][cH:14][n:15][cH:16][cH:17]2)[n:11][c:7]1-[c:4]1[cH:3][cH:2][n:1][cH:6][cH:5]1 +03947577 [H-].[Na+].[CH3:27][CH2:26][CH2:25]I.CN(C)C=O.[cH:2]1[cH:3][c:4](-[c:7]2[n:8][nH:9][c:10](-[c:12]3[cH:13][cH:14][n:15][cH:16][cH:17]3)[n:11]2)[cH:5][cH:6][n:1]1>C1CCOC1>[CH3:27][CH2:26][CH2:25][n:8]1[n:9][c:10](-[c:12]2[cH:13][cH:14][n:15][cH:16][cH:17]2)[n:11][c:7]1-[c:4]1[cH:3][cH:2][n:1][cH:6][cH:5]1 +03947582 C[c:28]1ccc(Cl)cc1.N[c:21]1[cH:26][cH:25][cH:24][cH:23][c:22]1[OH:27].[NH2:1][c:2]1[cH:7][cH:6][cH:5][c:4]([Cl:8])[c:3]1[OH:9].[NH2:10][c:11]1[cH:16][c:15]([Cl:17])[cH:14][c:13]([Cl:18])[c:12]1[OH:19]>>[CH3:28][c:15]1[cH:16][cH:11][c:12]([C:22](=[O:27])[NH:1][c:2]2[cH:7][cH:6][cH:5][c:4]([Cl:8])[c:3]2[OH:9])[cH:13][cH:14]1.[CH3:28][c:24]1[cH:23][cH:22][c:21]([C:3](=[O:9])[NH:10][c:11]2[cH:16][c:15]([Cl:17])[cH:14][c:13]([Cl:18])[c:12]2[OH:19])[cH:26][cH:25]1 +03947582 [CH3:2][CH2:1][c:3]1[cH:4][cH:5][c:6](-[c:9]2[n:13][c:12]3[cH:14][cH:15][cH:16][cH:17][c:11]3[o:10]2)[cH:7][cH:8]1.O=C(OOC(=O)c1ccccc1)c1ccccc1.O=C1CCC(=O)N1[Br:18]>ClC(Cl)(Cl)Cl>[CH3:2][CH:1]([Br:18])[c:3]1[cH:4][cH:5][c:6](-[c:9]2[n:13][c:12]3[cH:14][cH:15][cH:16][cH:17][c:11]3[o:10]2)[cH:7][cH:8]1 +03947582 [CH2:16]=[C:12]([C:13]([NH2:15])=[O:14])[c:11]1[cH:10][cH:9][c:8]([C:5](=[O:6])O)[cH:18][cH:17]1.O=S([Cl:3])Cl>>[CH2:16]=[C:12]([C:13]([NH2:15])=[O:14])[c:11]1[cH:10][cH:9][c:8]([C:5](=[O:6])[Cl:3])[cH:18][cH:17]1 +03947582 Fc1cc(-[c:64]2[n:68]c3ccccc3o2)ccc1CBr.[Cl:19][c:20]1[cH:36][c:24]2[n:25][c:26](-[c:28]3[cH:29][cH:30][c:31]([CH2:34]Br)[cH:32][cH:33]3)[o:27][c:23]2[c:22]([Cl:37])[cH:21]1.[Cl:1][c:2]1[cH:3][cH:4][cH:5][c:6]2[n:7][c:8](-[c:11]3[cH:12][cH:13][c:14]([CH2:17]Br)[cH:15][cH:16]3)[o:9][c:10]21.Br[C:51]1=[CH:52][c:49]2[cH:48][c:47](-[c:39]3[n:40][c:41]4[cH:46][cH:45][cH:44][cH:43][c:42]4[o:38]3)[cH:55][cH:54][c:50]21>>[N:25]#[C:24][CH2:17][c:14]1[cH:13][cH:12][c:11](-[c:8]2[n:7][c:6]3[cH:5][cH:4][cH:3][c:2]([Cl:1])[c:10]3[o:9]2)[cH:16][cH:15]1.[N:40]#[C:39][CH2:34][c:31]1[cH:30][cH:29][c:28](-[c:26]2[n:25][c:24]3[cH:36][c:20]([Cl:19])[cH:21][c:22]([Cl:37])[c:23]3[o:27]2)[cH:33][cH:32]1.[N:68]#[C:64][C:51]1=[CH:52][c:49]2[cH:48][c:47](-[c:39]3[n:40][c:41]4[cH:46][cH:45][cH:44][cH:43][c:42]4[o:38]3)[cH:55][cH:54][c:50]21 +03947582 Cl.[CH3:14][CH2:15]O.[CH3:2][CH2:1][c:3]1[cH:11][cH:10][c:6]([C:7](=[O:8])[OH:9])[c:5]([NH2:12])[cH:4]1>>[CH3:15][CH2:14][O:9][C:7](=[O:8])[c:6]1[cH:10][cH:11][c:3]([CH2:1][CH3:2])[cH:4][c:5]1[NH2:12] +03947584 [CH3:14][CH2:13][C:2]([CH3:1])([NH2:15])[CH2:3][c:4]1[cH:5][nH:6][c:7]2[cH:8][cH:9][cH:10][cH:11][c:12]12.[O:17]=[CH:16]Oc1ccccc1>>[CH3:14][CH2:13][C:2]([CH3:1])([CH2:3][c:4]1[cH:5][nH:6][c:7]2[cH:8][cH:9][cH:10][cH:11][c:12]12)[NH:15][CH:16]=[O:17] +03947585 [H-].[Na+].CCO.CCO[CH:22]=[O:23].[O:17]=[C:6]1[CH2:7][CH2:8][N:9]=[C:10]([c:11]2[cH:12][cH:13][cH:14][cH:15][cH:16]2)[c:4]2[cH:3][c:2]([Cl:1])[cH:19][cH:18][c:5]21>O.CCOCC>[ClH:1].[O:17]=[C:6]1[c:5]2[cH:18][cH:19][c:2]([Cl:1])[cH:3][c:4]2[C:10]([c:11]2[cH:12][cH:13][cH:14][cH:15][cH:16]2)=[N:9][CH2:8][C:7]1=[CH:22][OH:23] +03947585 [CH3:28][N:24]([CH3:23])[C:25](=[O:26])Cl.[Cl:1][c:2]1[cH:22][cH:21][c:5]2[c:4]([cH:3]1)[C:10]([c:11]1[cH:16][cH:15][cH:14][cH:13][c:12]1[Cl:17])=[N:9][CH2:8][c:7]1[cH:18][n:19][nH:20][c:6]1-2.c1ccncc1>ClCCl>[CH3:23][N:24]([CH3:28])[C:25](=[O:26])[n:19]1[cH:18][c:7]2[c:6]([n:20]1)-[c:5]1[cH:21][cH:22][c:2]([Cl:1])[cH:3][c:4]1[C:10]([c:11]1[cH:16][cH:15][cH:14][cH:13][c:12]1[Cl:17])=[N:9][CH2:8]2 +03947585 [Na+].[K+].C#[C:8][CH2:7][C:10](=[O:11])[c:12]1[cH:13][cH:14][c:15]([Cl:18])[cH:16][cH:17]1.CC(=O)[OH:21].C[C:2]([CH3:5])(C)[O-:4].O=C([O-])O>CCOCC.OCCO>[O:11]=[C:10]([CH2:7][CH:8]1[O:4][CH2:2][CH2:5][O:21]1)[c:12]1[cH:17][cH:16][c:15]([Cl:18])[cH:14][cH:13]1 +03947593 [CH3:27][CH2:26][n:11]1[c:10]2[cH:9]cc(C(=O)CCCCl)cc2[c:17]2cc(C(=O)CCCCl)c[cH:13][c:12]21.CNC.C[n:60]1[c:61]2[cH:62]cccc2[c:67]2cccc[c:72]21.[CH3:58][n:42]1[c:41]2[cH:40][cH:39][c:38]([C:36](=[O:37])[CH2:35][CH2:34][CH2:33][CH2:32]Cl)[cH:50][c:49]2[c:48]2[cH:47][c:46]([C:51](=[O:57])[CH2:52][CH2:53][CH2:54][CH2:55]Cl)[cH:45][cH:44][c:43]21.O=C(Cl)CCCCCl>>[CH3:9][CH2:10][NH:11][CH2:12][CH3:13].[CH3:27][CH2:26][N:11]([CH2:12][CH3:17])[CH2:32][CH2:33][CH2:34][CH2:35][C:36](=[O:37])[c:38]1[cH:39][cH:40][c:41]2[c:49]([cH:50]1)[c:48]1[cH:47][c:46]([C:51](=[O:57])[CH2:52][CH2:53][CH2:54][CH2:55][N:60]([CH2:61][CH3:62])[CH2:72][CH3:67])[cH:45][cH:44][c:43]1[n:42]2[CH3:58] +03947593 [Na+].Cl.C[O-].[CH3:11][CH2:10][N:12]([CH2:16][CH3:17])[CH2:13][CH2:14][Cl:15].[CH3:2][CH2:1][N:3]([CH2:7][CH3:8])[CH2:4][CH2:5][Cl:6].[O:33]=[C:22]1[c:23]2[cH:24][c:25]([OH:32])[cH:26][cH:27][c:28]2-[c:29]2[cH:30][cH:31][c:19]([OH:18])[cH:20][c:21]21>Cc1ccccc1>[ClH:15].[ClH:6].[CH3:2][CH2:1][N:3]([CH2:7][CH3:8])[CH2:4][CH2:5][O:18][c:19]1[cH:31][cH:30][c:29]2[c:21]([cH:20]1)[C:22](=[O:33])[c:23]1[cH:24][c:25]([O:32][CH2:14][CH2:13][N:12]([CH2:16][CH3:17])[CH2:10][CH3:11])[cH:26][cH:27][c:28]1-2 +03947593 [Na+].C[O-].[CH3:10][CH2:9][n:11]1[c:12]2[cH:13][cH:14][c:15]([OH:25])[cH:16][c:17]2[c:18]2[cH:19][c:20]([OH:24])[cH:21][cH:22][c:23]21.CC(=O)O.CC(=O)O.[Cl:26][CH2:27][CH2:28]Br.[Cl:33][c:34]1[cH:35]cccc1>>[CH3:10][CH2:9][n:11]1[c:23]2[cH:22][cH:21][c:20]([O:24][CH2:35][CH2:34][Cl:33])[cH:19][c:18]2[c:17]2[cH:16][c:15]([O:25][CH2:28][CH2:27][Cl:26])[cH:14][cH:13][c:12]21 +03948596 CC(=O)O[C:11]([CH3:10])=[O:12].[NH2:8][c:5]1[cH:6][cH:7][c:2]([Cl:1])[c:3]([OH:9])[cH:4]1>C1COCCO1>[CH3:10][C:11](=[O:12])[NH:8][c:5]1[cH:6][cH:7][c:2]([Cl:1])[c:3]([OH:9])[cH:4]1 +03948816 [Na].[SH2:14].[CH3:12][CH2:11][CH2:10][CH2:9][CH2:8][CH:7]=[CH:6][C:5](=[O:13])[O:4][CH2:2][CH3:3]>CCO>[CH3:12][CH2:11][CH2:10][CH2:9][CH2:8][CH:7]([SH:14])[CH2:6][C:5](=[O:13])[O:4][CH2:2][CH3:3] +03948892 [OH-].[Na+].[CH3:15][O:16][CH:17]([C:18](=O)[N:20]([CH3:21])[CH3:22])[c:23]1[cH:28][cH:27][cH:26][cH:25][n:24]1.[S:2]=P12SP3(=S)SP(=S)(S1)SP(=S)(S2)S3.c1ccncc1>O>[CH3:15][O:16][CH:17]([C:18](=[S:2])[N:20]([CH3:21])[CH3:22])[c:23]1[cH:28][cH:27][cH:26][cH:25][n:24]1 +03948892 [OH-].[Na+].[Na+].[Cl-].[CH3:3][O:4][CH:5]([C:6]([NH2:8])=O)[c:9]1[cH:14][cH:13][cH:12][cH:11][n:10]1.O=P(Cl)(Cl)Cl>ClCCCl>[CH3:3][O:4][CH:5]([C:6]#[N:8])[c:9]1[cH:14][cH:13][cH:12][cH:11][n:10]1 +03948892 [Na+].[Na+].CN.[CH3:13][N:2]([CH3:1])[CH:3]([C:4]([NH2:6])=[S:5])[c:7]1[cH:12][cH:11][cH:10][cH:9][n:8]1.O=[C:19]([O-])[O-]>>[CH3:19][NH:6][C:4](=[S:5])[CH:3]([c:7]1[cH:12][cH:11][cH:10][cH:9][n:8]1)[N:2]([CH3:13])[CH3:1] +03948892 [H-].[Na+].CI.CS([CH3:11])=O.[OH:8][CH2:7][c:2]1[cH:3][cH:4][cH:5][cH:6][n:1]1>O>[CH3:11][O:8][CH2:7][c:2]1[cH:3][cH:4][cH:5][cH:6][n:1]1 +03948892 [CH3:16][NH:15][CH3:14].CO[C:4](=[O:5])[CH:3]([O:2][CH3:1])[c:8]1[cH:13][cH:12][cH:11][cH:10][n:9]1>CCO>[CH3:1][O:2][CH:3]([C:4](=[O:5])[N:15]([CH3:14])[CH3:16])[c:8]1[cH:13][cH:12][cH:11][cH:10][n:9]1 +03948895 N.[OH-:13].[OH2:16].[Na+].[N:10]#[C:9][c:5]1[n:4][c:3]([C:11]#[N:12])[c:2]([NH2:1])[n:7][c:6]1[NH2:8]>>[NH2:10][C:9](=[O:13])[c:5]1[n:4][c:3]([C:11]([NH2:12])=[O:16])[c:2]([NH2:1])[n:7][c:6]1[NH2:8] +03948904 O=[C:10]([OH:12])[CH2:9][c:6]1[cH:5][cH:4][c:3]([CH2:2][Cl:1])[cH:8][cH:7]1.O=S([Cl:15])Cl>>[O:12]=[C:10]([Cl:15])[CH2:9][c:6]1[cH:5][cH:4][c:3]([CH2:2][Cl:1])[cH:8][cH:7]1 +03948904 [Na].[CH3:30][CH2:29][C:28](=[O:31])[O:27][CH2:26]Cl.[CH3:8][C:7](=[O:9])[O:10][CH2:11][C:12]1=[C:13]([C:22](=[O:23])[OH:24])[N:14]2[C:15](=[O:21])[CH:16]([NH2:20])[CH:17]2[S:18][CH2:19]1.CN(C)C=O>CCOC(C)=O>[CH3:30][CH2:29][C:28](=[O:31])[O:27][CH2:26][O:23][C:22](=[O:24])[C:13]1=[C:12]([CH2:11][O:10][C:7]([CH3:8])=[O:9])[CH2:19][S:18][CH:17]2[CH:16]([NH2:20])[C:15](=[O:21])[N:14]12 +03948904 [CH3:2][C:1](=[O:3])[O:4][CH2:5][C:6]1=[C:7]([C:16](=[O:17])[OH:18])[N:8]2[C:9](=[O:15])[CH:10]([NH2:14])[CH:11]2[S:12][CH2:13]1.[O:29]=[C:28](Cl)[CH2:27][c:24]1[cH:23][cH:22][c:21]([CH2:20][Cl:19])[cH:26][cH:25]1>CCOC(C)=O>[CH3:2][C:1](=[O:3])[O:4][CH2:5][C:6]1=[C:7]([C:16](=[O:17])[OH:18])[N:8]2[C:9](=[O:15])[CH:10]([NH:14][C:28](=[O:29])[CH2:27][c:24]3[cH:23][cH:22][c:21]([CH2:20][Cl:19])[cH:26][cH:25]3)[CH:11]2[S:12][CH2:13]1 +03948908 [CH3:20][O:19][c:16]1[cH:15][cH:14][c:13](-[c:11]2[cH:12][c:3]3[c:2](Cl)[n:7][n:6][c:5](Cl)[c:4]3[c:9]([CH3:21])[n:10]2)[cH:18][cH:17]1.[CH2:26]1[CH2:25][O:24][CH2:23][CH2:22][NH:27]1>>[CH3:20][O:19][c:16]1[cH:15][cH:14][c:13](-[c:11]2[cH:12][c:3]3[c:2]([N:27]4[CH2:22][CH2:23][O:24][CH2:25][CH2:26]4)[n:7][n:6][c:5]([N:27]4[CH2:26][CH2:25][O:24][CH2:23][CH2:22]4)[c:4]3[c:9]([CH3:21])[n:10]2)[cH:18][cH:17]1 +03948913 [CH3:21][NH2:22].C[c:10]1[n:9][c:8](S)[n:7][c:6]2[c:5]1[c:4](-[c:13]1[cH:17][cH:16][c:15]([N+:18](=[O:19])[O-:20])[o:14]1)[n:3][n:2]2[CH3:1]>CCO.CCOC(C)=O>[CH3:21][NH:22][c:10]1[n:9][cH:8][n:7][c:6]2[c:5]1[c:4](-[c:13]1[cH:17][cH:16][c:15]([N+:18](=[O:19])[O-:20])[o:14]1)[n:3][n:2]2[CH3:1] +03948913 CN(C)c1ccccc1.[CH3:1][n:2]1[n:3][c:4](-[c:12]2[cH:16][cH:15][c:14]([N+:17](=[O:18])[O-:19])[o:13]2)[c:5]2[c:6]1[n:7][cH:8][nH:9][c:10]2=O.O=P([Cl:31])(Cl)Cl>>[CH3:1][n:2]1[n:3][c:4](-[c:12]2[cH:16][cH:15][c:14]([N+:17](=[O:18])[O-:19])[o:13]2)[c:5]2[c:6]1[n:7][cH:8][n:9][c:10]2[Cl:31] +03948913 [CH3:9][CH:8]([CH3:10])[c:6]1[n:5][c:4]2[c:3]([c:13](-[c:14]3[cH:18][cH:17][c:16]([N+:19](=[O:20])[O-:21])[o:15]3)[n:12][n:11]2[CH3:22])[c:2](Cl)[n:7]1.Cn1nc(-c2ccc([N+](=O)[O-])o2)c2c1[n:27]cnc2Cl>>[CH3:9][CH:8]([CH3:10])[c:6]1[n:5][c:4]2[c:3]([c:13](-[c:14]3[cH:18][cH:17][c:16]([N+:19](=[O:20])[O-:21])[o:15]3)[n:12][n:11]2[CH3:22])[c:2]([NH2:27])[n:7]1 +03948914 CCN(CC)CC.[CH3:8][c:9]1[n:10][c:11]([Cl:19])[c:12]([N+:16](=[O:17])[O-:18])[c:13](Cl)[n:14]1.[CH3:22][CH:21]([CH3:20])[NH2:23]>O>[CH3:8][c:9]1[n:10][c:11]([Cl:19])[c:12]([N+:16](=[O:17])[O-:18])[c:13]([NH:23][CH:21]([CH3:20])[CH3:22])[n:14]1 +03948914 [CH3:10][CH:9]([CH3:11])[c:4]1[n:5][c:6]([OH:8])[cH:7][c:2]([OH:1])[n:3]1.O=[N+:13]([O-:14])[OH:12]>O>[CH3:10][CH:9]([CH3:11])[c:4]1[n:3][c:2]([OH:1])[c:7]([N+:13](=[O:12])[O-:14])[c:6]([OH:8])[n:5]1 +03948915 Cl.[CH3:7][O:6][C:5](=[NH:8])[CH2:4][C:2]#[N:3].N#[C:10][NH2:9]>c1ccccc1>[CH3:7][O:6][C:5]([CH2:4][C:2]#[N:3])=[N:8][C:10]#[N:9] +03948919 [ClH:25].[CH3:6][C:5]([CH3:7])([CH3:8])[NH:4][CH2:3][CH:2]([OH:1])[c:9]1[cH:10][cH:11][c:12]2[c:17]([n:18]1)[CH2:16][O:15]C(c1ccccc1)[O:13]2>O.CC(C)=O>[ClH:25].[ClH:25].[CH3:8][C:5]([CH3:6])([CH3:7])[NH:4][CH2:3][CH:2]([OH:1])[c:9]1[cH:10][cH:11][c:12]([OH:13])[c:17]([CH2:16][OH:15])[n:18]1 +03948925 CC[O:3][C:1]([NH2:2])=[S:6].[CH3:16][CH2:15][O:14][C:12](=[O:13])[CH2:11][C:9](=O)[CH2:8]Br>C1COCCO1>[CH3:16][CH2:15][O:14][C:12](=[O:13])[c:11]1[s:6][c:1](=[O:3])[nH:2][c:9]1[CH3:8] +03948927 [CH3:8][N:7]=[C:3]([NH:2]C)[N:4]([CH3:5])[CH3:6].[O:10]=[CH:9][OH:11]>>[CH3:8][N:7]=[C:3]([NH2:2])[N+:4]([CH3:5])([CH3:6])[CH3:9].[O:10]=[CH:9][O-:11] +03948928 [Na+].[Na+].Cl.[CH3:1][O:2][c:3]1[cH:4][cH:5][c:6]2[o:10][n:9][c:8]([CH2:11][C:12]#[N:13])[c:7]2[cH:14]1.[NH2:16][OH:17].O=C([O-])[O-]>O.CCO>[CH3:1][O:2][c:3]1[cH:4][cH:5][c:6]2[o:10][n:9][c:8]([CH2:11][C:12]([NH2:13])=[N:16][OH:17])[c:7]2[cH:14]1 +03948928 Cl.[ClH:1].CCO[C:13](=[NH:17])[CH2:12][c:9]1[n:10][o:11][c:7]2[cH:6][cH:5][c:4]([O:3][CH3:2])[cH:18][c:8]12.N[CH2:21][CH2:20][NH2:19]>CCO>[ClH:1].[CH3:2][O:3][c:4]1[cH:5][cH:6][c:7]2[o:11][n:10][c:9]([CH2:12][C:13]3=[N:17][CH2:21][CH2:20][NH:19]3)[c:8]2[cH:18]1 +03948929 [CH3:2][C:1](=[O:3])[C:4]#[C:5][c:6]1[cH:7][cH:8][cH:9][cH:10][cH:11]1.C[Si](C)(C)[N:16]=[N+:17]=[N-:18]>>[CH3:2][C:1](=[O:3])[c:4]1[n:16][n:17][nH:18][c:5]1-[c:6]1[cH:7][cH:8][cH:9][cH:10][cH:11]1 +03948931 [CH3:7][NH:6][CH3:5].CC(C)O.N#C[Na].[O:33]=[CH:32][c:29]1[n:30][n:31][c:20]2[n:21]1-[c:22]1[cH:27][cH:26][c:25]([Cl:28])[cH:24][c:23]1[C:17]([c:11]1[cH:12][cH:13][cH:14][cH:15][cH:16]1)=[N:18][CH2:19]2>CC(C)O.ClCCl.C1COCCO1.C1COCCO1>[CH3:7][N:6]([CH3:5])[C:32](=[O:33])[c:29]1[n:30][n:31][c:20]2[n:21]1-[c:22]1[cH:27][cH:26][c:25]([Cl:28])[cH:24][c:23]1[C:17]([c:11]1[cH:16][cH:15][cH:14][cH:13][cH:12]1)=[N:18][CH2:19]2 +03948931 [NH2:29][C:27](=O)[c:24]1[n:25][n:26][c:15]2[n:16]1-[c:17]1[cH:22][cH:21][c:20]([Cl:23])[cH:19][c:18]1[C:12]([c:6]1[cH:7][cH:8][cH:9][cH:10][cH:11]1)=[N:13][CH2:14]2.O=P(Cl)(Cl)Cl.ClCCCl>CN(C)C=O>[N:29]#[C:27][c:24]1[n:25][n:26][c:15]2[n:16]1-[c:17]1[cH:22][cH:21][c:20]([Cl:23])[cH:19][c:18]1[C:12]([c:6]1[cH:11][cH:10][cH:9][cH:8][cH:7]1)=[N:13][CH2:14]2 +03948934 C=CCBr.N[CH2:13][CH2:12][CH2:11]N.[O:2]=[N+:1]([O-:3])[CH:4]=[C:5]1[NH:6][CH2:7][CH2:8][CH2:9][NH:10]1>>[CH2:11]=[CH:12][CH2:13][N:6]1[CH2:7][CH2:8][CH2:9][NH:10][C:5]1=[CH:4][N+:1](=[O:2])[O-:3] +03948934 [CH2:14]=[CH:13][CH2:12]Br.[O:2]=[N+:1]([O-:3])[CH:4]=[C:5]1[NH:6][CH2:7][CH2:8][CH2:9][CH2:10][NH:11]1>>[CH2:12]=[CH:13][CH2:14][N:11]1[CH2:10][CH2:9][CH2:8][CH2:7][NH:6][C:5]1=[CH:4][N+:1](=[O:2])[O-:3] +03948937 O.Cl.[NH2:24][NH2:23].[O:15]=[C:14]([OH:16])[c:13]1[cH:17][cH:18][cH:19][cH:20][c:12]1[C:10](=O)[CH2:9][C:1](=O)[c:2]1[cH:3][cH:4][cH:5][cH:6][cH:7]1>O.CO>[O:15]=[C:14]([OH:16])[c:13]1[cH:17][cH:18][cH:19][cH:20][c:12]1-[c:10]1[cH:9][c:1](-[c:2]2[cH:3][cH:4][cH:5][cH:6][cH:7]2)[nH:24][n:23]1 +03948937 [CH3:23][O:22][C:20](=[O:21])[c:15]1[cH:16][cH:17][cH:18][cH:19][c:14]1-[c:11]1[cH:10][c:9](-[c:6]2[cH:5][cH:4][c:3]([O:2][CH3:1])[cH:8][cH:7]2)[nH:13][n:12]1.CC(=O)O[C:25]([CH3:24])=[O:26].c1ccncc1>O>[CH3:23][O:22][C:20](=[O:21])[c:15]1[cH:16][cH:17][cH:18][cH:19][c:14]1-[c:11]1[cH:10][c:9](-[c:6]2[cH:7][cH:8][c:3]([O:2][CH3:1])[cH:4][cH:5]2)[n:13]([C:25]([CH3:24])=[O:26])[n:12]1 +03948937 [CH3:22]I.[CH3:4][O:3][C:1](=[O:2])[C:5]1=[C:6]([c:11]2[cH:15][c:14](-[c:16]3[cH:17][cH:18][cH:19][cH:20][cH:21]3)[nH:13][n:12]2)[CH2:7][CH2:8][CH2:9][CH2:10]1>C1CCOC1>[CH3:4][O:3][C:1](=[O:2])[C:5]1=[C:6]([c:11]2[cH:15][c:14](-[c:16]3[cH:17][cH:18][cH:19][cH:20][cH:21]3)[n:13]([CH3:22])[n:12]2)[CH2:7][CH2:8][CH2:9][CH2:10]1 +03948939 [CH3:32][O:31][c:12]1[cH:11][cH:10][c:9]2[c:14]([cH:13]1)[c:15]1[c:20]([n:8]2[C:6](=[O:7])[c:5]2[cH:4][cH:3][c:2]([Cl:1])[cH:34][cH:33]2)[CH2:19][CH2:18][CH2:17][CH:16]1[C:21](=[O:22])[O:23]Cc1ccccc1>CCOC(C)=O>[CH3:32][O:31][c:12]1[cH:11][cH:10][c:9]2[c:14]([cH:13]1)[c:15]1[c:20]([n:8]2[C:6](=[O:7])[c:5]2[cH:33][cH:34][c:2]([Cl:1])[cH:3][cH:4]2)[CH2:19][CH2:18][CH2:17][CH:16]1[C:21](=[O:22])[OH:23] +03948939 C[c:24]1[cH:25][cH:26][c:27]([C:30](=[O:31])Cl)[cH:28][cH:29]1.CC(C)(C)OC(=O)C1CCCc2[nH]c3ccc([O:41]Cc4ccccc4)cc3c21.O=C(Cl)c1ccccc1.[O:15]=[C:14]([O:16]Cc1ccccc1)[CH:4]1[CH2:3][CH2:2][CH2:1][c:13]2[nH:12][c:11]3[cH:10][cH:9][cH:8][cH:7][c:6]3[c:5]21>>[O:15]=[C:14]([OH:16])[CH:4]1[CH2:3][CH2:2][CH2:1][c:13]2[c:5]1[c:6]1[cH:7][cH:8][cH:9][cH:10][c:11]1[n:12]2[C:30](=[O:31])[c:27]1[cH:26][cH:25][c:24]([OH:41])[cH:29][cH:28]1 +03948939 O=C=O.[O:23]=[C:22]([OH:24])[C:18]1(C(=O)O)[CH2:19][CH2:20][c:21]2[c:16]([c:15]3[cH:14][cH:13][cH:12][cH:11][c:10]3[n:9]2[C:1](=[O:8])[c:2]2[cH:3][cH:4][cH:5][cH:6][cH:7]2)[CH2:17]1>>[O:23]=[C:22]([OH:24])[CH:18]1[CH2:19][CH2:20][c:21]2[c:16]([c:15]3[cH:14][cH:13][cH:12][cH:11][c:10]3[n:9]2[C:1](=[O:8])[c:2]2[cH:7][cH:6][cH:5][cH:4][cH:3]2)[CH2:17]1 +03948939 [OH2:16].[CH3:15][c:5]1[cH:6][cH:7][c:8](S(=O)(=O)O)[cH:9][cH:10]1.[OH:4][CH2:3][CH2:2][OH:1]>c1ccccc1>[OH:16][CH2:15][CH:5]1[CH2:6][CH2:7][C:8]2([CH2:9][CH2:10]1)[O:1][CH2:2][CH2:3][O:4]2 +03948939 [CH3:1][O:2][c:3]1[cH:4][cH:5][c:6]([NH:9][NH2:10])[cH:7][cH:8]1.[CH3:20][CH:19]([CH3:21])O.[O:12]=[CH:11][c:13]1[cH:14][cH:15][cH:16][cH:17][cH:18]1>CO>[CH3:1][O:2][c:3]1[cH:4][cH:5][c:6]([N:9]([N:10]=[CH:20][c:19]2[cH:8][cH:3][cH:4][cH:5][cH:21]2)[C:11](=[O:12])[c:13]2[cH:14][cH:15][cH:16][cH:17][cH:18]2)[cH:7][cH:8]1 +03948939 [H-].[Na+].[CH3:40][c:31]1[cH:32][cH:33][c:34]([C:37](=[O:38])Cl)[cH:35][cH:36]1.CN(C)C=O.[O:22]=[C:21]([O:23][CH2:24][c:25]1[cH:26][cH:27][cH:28][cH:29][cH:30]1)[CH:11]1[CH2:10][CH2:9][CH2:8][c:20]2[nH:19][c:18]3[cH:17][cH:16][cH:15][cH:14][c:13]3[c:12]21>O.CC(=O)O>[CH3:40][c:31]1[cH:32][cH:33][c:34]([C:37](=[O:38])[n:19]2[c:18]3[cH:17][cH:16][cH:15][cH:14][c:13]3[c:12]3[c:20]2[CH2:8][CH2:9][CH2:10][CH:11]3[C:21](=[O:22])[O:23][CH2:24][c:25]2[cH:30][cH:29][cH:28][cH:27][cH:26]2)[cH:35][cH:36]1 +03948943 [CH3:14][CH2:13][O:12][C:10](=[O:11])[CH2:9][NH2:8].[CH3:2][C:1](=[O:3])OC(C)=O>c1ccncc1>[CH3:14][CH2:13][O:12][C:10](=[O:11])[CH2:9][NH:8][C:1]([CH3:2])=[O:3] +03948946 O.Cc1ccccc1.Cc1ccc(S(=O)(=O)O)cc1.[CH3:2][C:1]([CH3:3])([CH3:4])[c:5]1[cH:6][c:7]([CH:8]=[O:9])[cH:10][c:11]([C:14]([CH3:15])([CH3:16])[CH3:17])[c:12]1[OH:13].[CH3:24][C:19]([CH3:18])([CH2:20][OH:21])[CH2:22]O>O.CCOC(C)=O>[CH3:15][C:14]([CH3:16])([CH3:17])[c:11]1[cH:10][c:7]([CH:8]2[O:9][CH2:18][C:19]([CH3:22])([CH3:24])[CH2:20][O:21]2)[cH:6][c:5]([C:1]([CH3:2])([CH3:3])[CH3:4])[c:12]1[OH:13] +03948947 [OH-].[Na+].CCOC(=O)NN.CCOC(=O)[NH:29][NH:30][C:31](=[O:32])[N:33]([OH:48])[c:34]1[cH:35][cH:36][cH:37][c:38]2[c:47]1[S:46][c:45]1[cH:44][cH:43][cH:42][cH:41][c:40]1[O:39]2.ONc1cccc2c1Sc1ccccc1O2>C1COCCO1>[NH2:29][NH:30][C:31](=[O:32])[N:33]([OH:48])[c:34]1[cH:35][cH:36][cH:37][c:38]2[c:47]1[S:46][c:45]1[cH:44][cH:43][cH:42][cH:41][c:40]1[O:39]2 +03948947 [CH3:10][C:9](=[O:11])[NH:8][NH:7][C:6](=[O:12])[N:5]([O:4]C(C)=O)[CH:13]1[c:14]2[cH:15][cH:16][cH:17][cH:18][c:19]2[O:20][c:21]2[cH:22][cH:23][cH:24][cH:25][c:26]21.NNC(=O)N(O)C1c2ccccc2Oc2ccccc21>>[CH3:10][C:9](=[O:11])[NH:8][NH:7][C:6](=[O:12])[N:5]([OH:4])[CH:13]1[c:14]2[cH:15][cH:16][cH:17][cH:18][c:19]2[O:20][c:21]2[cH:22][cH:23][cH:24][cH:25][c:26]21 +03948947 [K+].[K+].[I-].O=C([O-])[O-].O=[C:4]([OH:6])[c:3]1[c:7]([F:11])[cH:8][cH:9][cH:10][c:2]1Cl.O=[N+]([O-])[c:15]1[cH:16][cH:17][cH:18][cH:19][cH:20]1.[SH:28]c1ccccc1>O.[Cu]>[OH:6][C:4](=[S:28])[c:3]1[c:7]([F:11])[cH:8][cH:9][cH:10][c:2]1-[c:15]1[cH:16][cH:17][cH:18][cH:19][cH:20]1 +03948947 CCN(CC)CC.[CH3:1][NH:2][CH:3]1[c:4]2[cH:5][cH:6][cH:7][cH:8][c:9]2[O:10][c:11]2[cH:12][cH:13][cH:14][cH:15][c:16]21.[O:27]=[C:25](Cl)[Cl:24]>Cc1ccccc1>[CH3:1][N:2]([C:25](=[O:27])[Cl:24])[CH:3]1[c:16]2[cH:15][cH:14][cH:13][cH:12][c:11]2[O:10][c:9]2[cH:8][cH:7][cH:6][cH:5][c:4]21 +03948947 [OH2:27].[OH:26][NH:25][CH:23]1[c:24]2[cH:11][cH:12][cH:13][cH:14][c:15]2[O:16][c:17]2[cH:18][cH:19][cH:20][cH:21][c:22]21.Cl[C:8](Cl)=[SH:7][c:1]1[cH:2][cH:3][cH:4][cH:5][cH:6]1>c1ccncc1>[O:27]=[C:8]([S:7][c:1]1[cH:2][cH:3][cH:4][cH:5][cH:6]1)[N:25]([OH:26])[CH:23]1[c:22]2[cH:21][cH:20][cH:19][cH:18][c:17]2[O:16][c:15]2[cH:14][cH:13][cH:12][cH:11][c:24]21 +03948949 [Na+].CC(=O)[OH:21].[CH3:18][CH:15]([CH2:16]N)[c:2]1[cH:3][cH:4][c:5]2[c:14]([cH:1]1)[CH2:13][c:12]1[cH:11][cH:10][cH:9][cH:8][c:7]1[O:6]2.O=N[O-]>O>[CH3:18][CH:15]([CH2:16][OH:21])[c:2]1[cH:3][cH:4][c:5]2[c:14]([cH:1]1)[CH2:13][c:12]1[cH:11][cH:10][cH:9][cH:8][c:7]1[O:6]2 +03948949 [P].I.[CH3:19][CH:16]([CH2:17][OH:18])[c:13]1[cH:12][cH:11][c:10]2[o:9][c:8]3[cH:7][cH:6][cH:5][cH:4][c:3]3[c:2](=O)[c:15]2[cH:14]1>>[CH3:19][CH:16]([CH2:17][OH:18])[c:13]1[cH:12][cH:11][c:10]2[c:15]([cH:14]1)[CH2:2][c:3]1[cH:4][cH:5][cH:6][cH:7][c:8]1[O:9]2 +03948950 [K+].[K+].[CH3:2][CH2:1][c:3]1[cH:9][cH:8][cH:7][c:6]([CH2:10][CH3:11])[c:4]1[NH2:5].O=C([O-])[O-].Cl[CH2:13][CH:14]1[O:15][CH2:16][CH2:17][CH2:18][CH2:19][O:20]1>CN(C)C=O>[CH3:2][CH2:1][c:3]1[cH:9][cH:8][cH:7][c:6]([CH2:10][CH3:11])[c:4]1[NH:5][CH2:13][CH:14]1[O:20][CH2:19][CH2:18][CH2:17][CH2:16][O:15]1 +03948950 [Na+].[CH3:17][CH2:16][c:9]1[cH:10][cH:11][cH:12][c:13]([CH2:14][CH3:15])[c:8]1[NH:7][CH2:6][CH:2]1[O:3][CH2:4][CH2:5][O:1]1.O=C([O-])O.[O:32]=[C:31](Cl)[CH2:30][Cl:29].C1COCCO1>O>[CH3:15][CH2:14][c:13]1[cH:12][cH:11][cH:10][c:9]([CH2:16][CH3:17])[c:8]1[N:7]([CH2:6][CH:2]1[O:1][CH2:5][CH2:4][O:3]1)[C:31](=[O:32])[CH2:30][Cl:29] +03948950 [Na+].[CH3:19][CH2:18][c:11]1[cH:12][cH:13][cH:14][c:15]([CH2:16][CH3:17])[c:10]1[NH:9][CH2:8][CH:2]1[S:3][CH2:4][CH2:5][CH2:6][CH2:7][S:1]1.O=C([O-])O.[O:34]=[C:33](Cl)[CH2:32][Cl:31].C1COCCO1>O>[CH3:19][CH2:18][c:11]1[cH:12][cH:13][cH:14][c:15]([CH2:16][CH3:17])[c:10]1[N:9]([CH2:8][CH:2]1[S:1][CH2:7][CH2:6][CH2:5][CH2:4][S:3]1)[C:33](=[O:34])[CH2:32][Cl:31] +03948952 C[c:10]1[cH:15]ccc[c:11]1S(=O)(=O)O.[OH:7][c:6]1[cH:5][cH:4][cH:3][c:2]([OH:1])[c:8]1[OH:9]>COC(C)(C)OC.c1ccccc1>[CH3:15][C:10]1([CH3:11])[O:7][c:6]2[cH:5][cH:4][cH:3][c:2]([OH:1])[c:8]2[O:9]1 +03948967 [CH3:13][NH:12][C:10](=[O:11])[N:9]([OH:14])[c:4]1[cH:5][cH:6][c:7]([Cl:8])[c:2]([Cl:1])[cH:3]1.[CH3:25][O:24][C:22](=[O:23])Cl.c1ccncc1>CC(C)O>[CH3:13][NH:12][C:10](=[O:11])[N:9]([O:14][C:22](=[O:23])[O:24][CH3:25])[c:4]1[cH:5][cH:6][c:7]([Cl:8])[c:2]([Cl:1])[cH:3]1 +03948967 [CH3:13][N:12]([CH3:14])[C:10](=[O:11])[N:9]([OH:15])[c:4]1[cH:5][cH:6][c:7]([Cl:8])[c:2]([Cl:1])[cH:3]1.[O:24]=[C:23](Cl)[O:25][c:26]1[cH:27][cH:28][cH:29][cH:30][cH:31]1.c1ccncc1>CC(C)O>[CH3:14][N:12]([CH3:13])[C:10](=[O:11])[N:9]([O:15][C:23](=[O:24])[O:25][c:26]1[cH:27][cH:28][cH:29][cH:30][cH:31]1)[c:4]1[cH:5][cH:6][c:7]([Cl:8])[c:2]([Cl:1])[cH:3]1 +03948971 Cl.[CH3:18][O:19][C:20](=[O:30])[C@@H:21]([NH2:22])[CH2:23][c:24]1[cH:25][cH:26][cH:27][cH:28][cH:29]1.CN(C)C=O.CC1(OC(=O)[NH:9][C@H:10]2[CH2:11][C:12](=[O:13])[O:14][C:15]2=[O:16])CCC1>CCN(CC)CC>[CH3:18][O:19][C:20](=[O:30])[C@H:21]([CH2:23][c:24]1[cH:25][cH:26][cH:27][cH:28][cH:29]1)[NH:22][C:15](=[O:16])[C@@H:10]([NH2:9])[CH2:11][C:12](=[O:13])[OH:14] +03948971 [CH3:1][C:2]1([OH:6])[CH2:3][CH2:4][CH2:5]1.[O:16]=[C:14](Cl)[Cl:13].c1ccncc1>c1ccccc1>[CH3:1][C:2]1([O:6][C:14](=[O:16])[Cl:13])[CH2:3][CH2:4][CH2:5]1 +03948971 Cl.[CH3:24][O:25][C:26](=[O:30])[C@H:27]([CH3:29])[NH2:28].[CH3:1][C:2]1([O:8][C:9](=[O:10])[NH:11][C@@H:12]([CH2:13][c:14]2[cH:15][cH:16][cH:17][cH:18][cH:19]2)[C:20](=[O:21])[OH:22])[CH2:3][CH2:4][CH2:5][CH2:6][CH2:7]1.C(=NC1CCCCC1)=NC1CCCCC1>CC#N.CCN(CC)CC>[CH3:24][O:25][C:26](=[O:30])[C@H:27]([CH3:29])[NH2:28].[CH3:1][C:2]1([O:8][C:9](=[O:10])[NH:11][C@@H:12]([CH2:13][c:14]2[cH:19][cH:18][cH:17][cH:16][cH:15]2)[C:20](=[O:21])[OH:22])[CH2:7][CH2:6][CH2:5][CH2:4][CH2:3]1 +03948973 [OH-].[Na+].[CH3:23]O.[CH3:7][CH:6]1[C:5](C)([c:9]2[cH:10][cH:11][c:12]([O:13][C:14]([CH3:18])([CH3:19])[C:15](=[O:16])[OH:17])[cH:20][cH:21]2)[C:4]1(Cl)Cl>>[CH3:7][CH:6]=[C:5]([CH3:4])[c:9]1[cH:10][cH:11][c:12]([O:13][C:14]([CH3:18])([CH3:19])[C:15](=[O:16])[O:17][CH3:23])[cH:20][cH:21]1 +03948973 C[O:13][c:10]1[cH:9][cH:8][c:7]([CH:3]2[C:4]([CH3:5])([CH3:6])[C:2]2([F:15])[F:1])[cH:12][cH:11]1.BrB(Br)Br>>[CH3:5][C:4]1([CH3:6])[CH:3]([c:7]2[cH:12][cH:11][c:10]([OH:13])[cH:9][cH:8]2)[C:2]1([F:15])[F:1] +03948973 [CH3:14][CH2:13][O:12][C:10](=[O:11])[C:9]([CH3:15])([CH3:16])[O:8][c:7]1[cH:6][cH:5][c:4]([CH:2]([CH3:3])O)[cH:18][cH:17]1.Cc1ccc(S(=O)(=O)Cl)cc1.c1ccncc1>O>[CH2:3]=[CH:2][c:4]1[cH:5][cH:6][c:7]([O:8][C:9]([CH3:15])([CH3:16])[C:10](=[O:11])[O:12][CH2:13][CH3:14])[cH:17][cH:18]1 +03948996 [Na+].[CH3:15][CH2:14][O:16][C:17](=[O:18])[CH:19]=[C:20]([CH3:30])[CH2:21]P(=O)(OCC)OCC.[CH3:1][S:2][C:3]([CH3:12])([CH3:13])[CH2:4][CH2:5][CH2:6][CH:7]([CH3:11])[CH2:8][CH:9]=O.C[CH:31](C)[O-]>CN(C)C=O>[CH3:1][S:2][C:3]([CH3:12])([CH3:13])[CH2:4][CH2:5][CH2:6][CH:7]([CH3:11])[CH2:8][CH:9]=[CH:21][C:20]([CH3:30])=[CH:19][C:17](=[O:18])[O:16][CH:14]([CH3:31])[CH3:15] +03948996 O.CCCCCC.CCN(CC)CC.[CH3:1][S:2][C:3]([CH3:12])([CH3:13])[CH2:4][CH2:5][CH2:6][CH:7]([CH3:11])[CH2:8][CH2:9][OH:10]>CS(C)=O>[CH3:1][S:2][C:3]([CH3:13])([CH3:12])[CH2:4][CH2:5][CH2:6][CH:7]([CH3:11])[CH2:8][CH:9]=[O:10] +03948996 [Na+].[CH3:16][O-].CI.[CH3:15][O:14][CH:3]([CH2:4][CH:5]([CH3:13])[CH2:6][CH2:7][CH2:8][C:9]([CH3:10])([CH3:11])[SH:12])[O:2][CH3:1]>CO>[CH3:15][O:14][CH:3]([CH2:4][CH:5]([CH3:13])[CH2:6][CH2:7][CH2:8][C:9]([CH3:11])([CH3:10])[S:12][CH3:16])[O:2][CH3:1] +03948996 Cl.[Li][CH2:20][CH3:21].[CH3:1][S:2][C:3]([CH3:18])([CH3:19])[CH2:4][CH2:5][CH2:6][CH:7]([CH3:17])[CH2:8][CH:9]=[CH:10][C:11]([CH3:16])=[CH:12][C:13](=O)[OH:15]>c1ccccc1>[CH3:21][CH2:20][C:13](=[O:15])[CH:12]=[C:11]([CH3:16])[CH:10]=[CH:9][CH2:8][CH:7]([CH3:17])[CH2:6][CH2:5][CH2:4][C:3]([CH3:18])([CH3:19])[S:2][CH3:1] +03949076 [CH3:7][C:8](=[O:9])[CH2:10]Cl.[CH3:1][C:2]1=[N:6][CH2:5][CH2:4][NH:3]1>CC(C)=O>[CH3:10][C:8](=[O:9])[CH2:7][N:6]1[CH2:5][CH2:4][N:3]=[C:2]1[CH3:1] +03949076 [NH3:10].[H][H].O=[CH:8][CH2:7][N:1]1[CH:2]=[N:3][CH2:4][CH2:5][CH2:6]1>CCO>[NH2:10][CH2:8][CH2:7][N:1]1[CH:2]=[N:3][CH2:4][CH2:5][CH2:6]1 +03949084 Cl.[K+].[K+].[CH3:22][CH:21]([CH3:23])Br.O=C([O-])[O-].[O:18]=[C:17]([OH:19])[c:9]1[cH:8][cH:7][c:6]2[o:5][c:4]3[cH:3][c:2]([SH:1])[cH:15][cH:14][c:13]3[c:12](=[O:16])[c:11]2[cH:10]1>CCO.CN(C)C=O>[CH3:22][CH:21]([CH3:23])[S:1][c:2]1[cH:15][cH:14][c:13]2[c:4]([cH:3]1)[o:5][c:6]1[cH:7][cH:8][c:9]([C:17](=[O:18])[OH:19])[cH:10][c:11]1[c:12]2=[O:16] +03949084 [NH3:23].[O:21]=[C:20]([OH:22])[c:12]1[cH:11][cH:10][c:9]2[o:8][c:7]3[cH:6][c:5]([S:2](=[O:3])(=[O:4])Cl)[cH:18][cH:17][c:16]3[c:15](=[O:19])[c:14]2[cH:13]1.C1COCCO1>O>[NH2:23][S:2](=[O:3])(=[O:4])[c:5]1[cH:18][cH:17][c:16]2[c:7]([cH:6]1)[o:8][c:9]1[cH:10][cH:11][c:12]([C:20](=[O:21])[OH:22])[cH:13][c:14]1[c:15]2=[O:19] +03949084 [OH-].[Na+].C[O:21][C:19](=[O:20])[c:11]1[cH:10][cH:9][c:8]2[o:7][c:6]3[cH:5][c:4]([CH:2]([CH3:3])[OH:1])[cH:17][cH:16][c:15]3[c:14](=[O:18])[c:13]2[cH:12]1>CCO>[CH3:3][CH:2]([OH:1])[c:4]1[cH:17][cH:16][c:15]2[c:6]([cH:5]1)[o:7][c:8]1[cH:9][cH:10][c:11]([C:19](=[O:20])[OH:21])[cH:12][c:13]1[c:14]2=[O:18] +03949084 [CH3:18][O:17][c:13]1[cH:14][cH:15][cH:16][c:11]([O:10][c:7]2[cH:8][cH:9][c:4]([C:1](=[O:2])[OH:3])[cH:5][c:6]2[C:19](=O)[OH:21])[cH:12]1.O=S1(=O)CCCC1>O>[CH3:18][O:17][c:13]1[cH:14][cH:15][c:16]2[c:11]([cH:12]1)[o:10][c:7]1[cH:8][cH:9][c:4]([C:1](=[O:2])[OH:3])[cH:5][c:6]1[c:19]2=[O:21] +03949084 [OH-].[Na+:23].[CH3:1][S:2](=[O:3])[c:4]1[cH:17][cH:16][c:15]2[c:6]([cH:5]1)[o:7][c:8]1[cH:9][cH:10][c:11]([C:19](=[O:20])[OH:21])[cH:12][c:13]1[c:14]2=[O:18]>CCO>[Na+:23].[CH3:1][S:2](=[O:3])[c:4]1[cH:17][cH:16][c:15]2[c:6]([cH:5]1)[o:7][c:8]1[cH:9][cH:10][c:11]([C:19](=[O:20])[O-:21])[cH:12][c:13]1[c:14]2=[O:18] +03949084 [Li+].[Li+].CI.O=[C:25]([O-])[O-].[O:18]=[C:17]([OH:19])[c:9]1[cH:8][cH:7][c:6]2[o:5][c:4]3[cH:3][c:2]([OH:1])[cH:15][cH:14][c:13]3[c:12](=[O:16])[c:11]2[cH:10]1>CN(C)C=O>[CH3:25][O:19][C:17](=[O:18])[c:9]1[cH:8][cH:7][c:6]2[o:5][c:4]3[cH:3][c:2]([OH:1])[cH:15][cH:14][c:13]3[c:12](=[O:16])[c:11]2[cH:10]1 +03949084 [Na+].[Na+].CCO.C[O:20][C:18](=[O:19])[c:10]1[cH:9][cH:8][c:7]2[o:6][c:5]3[cH:4][c:3]([S:2][CH3:1])[cH:16][cH:15][c:14]3[c:13](=[O:17])[c:12]2[cH:11]1.O=C([O-])[O-]>O>[CH3:1][S:2][c:3]1[cH:16][cH:15][c:14]2[c:5]([cH:4]1)[o:6][c:7]1[cH:8][cH:9][c:10]([C:18](=[O:19])[OH:20])[cH:11][c:12]1[c:13]2=[O:17] +03950307 [NH4+:16].[OH-].[O:6]=[C:5]1[O:7][C:8](=O)[c:3]2[c:4]1[c:10]([Br:15])[c:11]([Br:14])[c:12]([Br:13])[c:2]2[Br:1]>O>[O:6]=[C:5]1[NH:16][C:8](=[O:7])[c:3]2[c:4]1[c:10]([Br:15])[c:11]([Br:14])[c:12]([Br:13])[c:2]2[Br:1] +03950307 [K].[O:21]=[C:20](Cl)[c:19]1[cH:23][c:24]([Cl:28])[cH:25][c:26]([Cl:27])[c:18]1[Cl:17].[O:7]=[C:6]1[NH:8][C:9](=[O:10])[c:4]2[c:5]1[c:11]([Br:16])[c:12]([Br:15])[c:13]([Br:14])[c:3]2[Br:2]>C1COCCO1>[O:21]=[C:20]([c:19]1[cH:23][c:24]([Cl:28])[cH:25][c:26]([Cl:27])[c:18]1[Cl:17])[N:8]1[C:6](=[O:7])[c:5]2[c:4]([c:3]([Br:2])[c:13]([Br:14])[c:12]([Br:15])[c:11]2[Br:16])[C:9]1=[O:10] +03950320 [H][H].[CH3:39][CH2:38][CH:19]([C:18](=[O:40])[CH:17]([CH3:41])[CH:16]([OH:42])[CH:15]([CH3:43])[CH2:14][CH2:13][c:12]1[c:4]([N+:1](=O)[O-])[cH:5][c:6]([CH3:45])[c:7]([OH:44])[c:8]1[C:9](=[O:10])[OH:11])[CH:20]1[O:21][C:22]([CH2:36][CH3:37])([CH:26]2[CH2:31][CH2:30][C:29]([OH:32])([CH2:33][CH3:34])[CH:28]([CH3:35])[O:27]2)[CH2:23][CH:24]1[CH3:25]>CCO>[CH3:39][CH2:38][CH:19]([C:18](=[O:40])[CH:17]([CH3:41])[CH:16]([OH:42])[CH:15]([CH3:43])[CH2:14][CH2:13][c:12]1[c:4]([NH2:1])[cH:5][c:6]([CH3:45])[c:7]([OH:44])[c:8]1[C:9](=[O:10])[OH:11])[CH:20]1[O:21][C:22]([CH2:36][CH3:37])([CH:26]2[CH2:31][CH2:30][C:29]([OH:32])([CH2:33][CH3:34])[CH:28]([CH3:35])[O:27]2)[CH2:23][CH:24]1[CH3:25] +03950325 [Si+4].CC(=O)[O-].CC(=O)[O-].CC(=O)[O-].CC(=O)[O-].[NH2:1][c:2]1[cH:3][cH:4][n:5]([C@@H:6]2[O:7][C@H:8]([CH2:9][OH:10])[C@@H:11]([OH:12])[C@H:13]2[OH:14])[c:15](=[O:16])[n:17]1>CC(=O)O>[NH2:1][c:2]1[cH:3][cH:4][n:5]([C@@H:6]2[O:7][C@H:8]([CH2:9][OH:10])[C@@H:11]([OH:12])[C@@H:13]2[OH:14])[c:15](=[O:16])[n:17]1 +03950333 [CH3:1][CH2:2][NH2:3].CS[C:7](=[N:10][CH2:11][CH2:12][S:13][CH2:14][c:15]1[nH:19][cH:18][n:17][c:16]1[CH3:20])[NH:6][C:4]#[N:5]>CCO>[CH3:1][CH2:2][NH:3][C:7](=[N:10][CH2:11][CH2:12][S:13][CH2:14][c:15]1[nH:19][cH:18][n:17][c:16]1[CH3:20])[NH:6][C:4]#[N:5] +03950333 [CH3:39][N:38]=[C:35]([NH:34][C:32]#[N:33])SC.NCCN.[NH2:31][CH2:30][CH2:29][NH:28][CH2:27][CH2:26][c:18]1[n:17][c:21]2[cH:22][cH:23][cH:24][cH:25][c:20]2[nH:19]1.ClCCc1nc2ccccc2[nH]1>>[CH3:39][N:38]=[C:35]([NH:34][C:32]#[N:33])[NH:31][CH2:30][CH2:29][NH:28][CH2:27][CH2:26][c:18]1[n:17][c:21]2[cH:22][cH:23][cH:24][cH:25][c:20]2[nH:19]1 +03950333 [Pb].[CH3:1][NH:2][C:3](=S)[NH:5][CH2:6][CH2:7][CH2:8][S:9][CH2:10][c:11]1[nH:15][cH:14][n:13][c:12]1[CH3:16].[N:17]#[C:18][NH2:19]>>[CH3:1][NH:2][C:3](=[N:5][CH2:6][CH2:7][CH2:8][S:9][CH2:10][c:11]1[nH:15][cH:14][n:13][c:12]1[CH3:16])[NH:19][C:18]#[N:17] +03950333 CS[C:14](=[N:17]CCSCc1c[nH]cn1)[NH:13][C:11]#[N:12].[NH2:1][CH2:2][CH2:3][S:4][CH2:5][c:6]1[cH:10][nH:9][cH:8][n:7]1>CCO>[N:12]#[C:11][NH:13][C:14](=[NH:17])[NH:1][CH2:2][CH2:3][S:4][CH2:5][c:6]1[cH:10][nH:9][cH:8][n:7]1 +03950333 Cl.[BrH:21].CO.[CH3:7][c:5]1[cH:6][n:2]([CH3:1])[c:3]([CH2:8]O)[n:4]1.CC(C)O.[NH2:11][CH2:12][CH2:13][SH:14]>>[BrH:21].[BrH:21].[CH3:7][c:5]1[cH:6][n:2]([CH3:1])[c:3]([CH2:8][S:14][CH2:13][CH2:12][NH2:11])[n:4]1 +03950333 CS[C:14](=[N:17]CCSCc1cc[nH]n1)[NH:13][C:11]#[N:12].[NH2:1][CH2:2][CH2:3][S:4][CH2:5][c:6]1[cH:10][cH:9][nH:8][n:7]1>CCO>[N:12]#[C:11][NH:13][C:14](=[NH:17])[NH:1][CH2:2][CH2:3][S:4][CH2:5][c:6]1[cH:10][cH:9][nH:8][n:7]1 +03950333 [Pb].CCN=C=S.[CH3:17][CH2:16][NH:18][C:19](=S)[NH:21][CH2:22][CH2:23][NH:24][CH2:25][c:26]1[cH:30][cH:29][nH:28][n:27]1.[N:31]#[C:32][NH2:33].NCCNCc1cc[nH]n1>>[CH3:17][CH2:16][NH:18][C:19](=[N:21][CH2:22][CH2:23][NH:24][CH2:25][c:26]1[cH:30][cH:29][nH:28][n:27]1)[NH:33][C:32]#[N:31] +03950333 CN.[NH2:13]CCCS.[NH2:14][CH2:15][CH2:16][CH2:17][S:18][CH2:19][c:20]1[n:21][cH:22][cH:23][cH:24][n:25]1.OC[c:3]1[n:4][cH:5]c[cH:7][n:8]1>>[CH3:7][NH:8][C:3](=[N:14][CH2:15][CH2:16][CH2:17][S:18][CH2:19][c:20]1[n:25][cH:24][cH:23][cH:22][n:21]1)[NH:4][C:5]#[N:13] +03950333 CCCN.C[CH2:6][CH2:5][NH:8][C:9](=[NH:11])[NH2:10].C[N:13]([CH3:12])[CH2:14]CN>>[CH3:14][N:13]([CH3:12])[CH2:6][CH2:5][NH:8][C:9](=[NH:11])[NH2:10] +03950333 CS[C:14](=[NH:19])[NH:15][N+:16](=[O:17])[O-:18].[NH2:1][CH2:2][CH2:3][S:4][CH2:5][c:6]1[cH:11][cH:10][cH:9][n:8][n:7]1>>[NH:19]=[C:14]([NH:1][CH2:2][CH2:3][S:4][CH2:5][c:6]1[cH:11][cH:10][cH:9][n:8][n:7]1)[NH:15][N+:16](=[O:17])[O-:18] +03950333 [NH2:4][CH2:3][CH2:2][NH2:1].O=S(Cl)Cl.OCc1ncccn1.Cl[CH2:6][c:7]1[n:8][cH:9][cH:10][cH:11][n:12]1>>[NH2:4][CH2:3][CH2:2][NH:1][CH2:6][c:7]1[n:12][cH:11][cH:10][cH:9][n:8]1 +03950333 [NH2:4][CH2:3][CH2:2][NH2:1].Cl[CH2:6][c:7]1[cH:12][n:11][cH:10][cH:9][n:8]1>>[NH2:4][CH2:3][CH2:2][NH:1][CH2:6][c:7]1[cH:12][n:11][cH:10][cH:9][n:8]1 +03950333 [CH3:13][CH2:12][N:14]=[C:15]=[S:16].[NH2:11][CH2:10][CH2:9][NH:8][CH2:7][c:2]1[cH:3][n:4][cH:5][cH:6][n:1]1>>[CH3:13][CH2:12][NH:14][C:15](=[S:16])[NH:11][CH2:10][CH2:9][NH:8][CH2:7][c:2]1[cH:3][n:4][cH:5][cH:6][n:1]1 +03950333 [CH3:24][N:25]=[C:26]=[S:27].NCCN.[NH2:23][CH2:22][CH2:21][NH:20][CH2:19][c:15]1[cH:16][cH:17][cH:18][n:13][n:14]1.ClCc1cccnn1>>[CH3:24][NH:25][C:26](=[S:27])[NH:23][CH2:22][CH2:21][NH:20][CH2:19][c:15]1[cH:16][cH:17][cH:18][n:13][n:14]1 +03950333 CCN.CS[C:4](=[N:7][CH2:8][CH2:9][S:10][CH2:11][c:12]1[n:16][cH:15][cH:14][s:13]1)[NH:3][C:1]#[N:2].[NH2:17][CH2:18][CH2:19]SCc1nccs1>>[CH3:19][CH2:18][NH:17][C:4](=[N:7][CH2:8][CH2:9][S:10][CH2:11][c:12]1[n:16][cH:15][cH:14][s:13]1)[NH:3][C:1]#[N:2] +03950333 [Pb].[CH3:1][NH:2][C:3](=S)[NH:5][CH2:6][CH2:7][S:8][CH2:9][c:10]1[cH:14][s:13][c:12]([NH2:15])[n:11]1.[N:16]#[C:17][NH2:18]>>[CH3:1][NH:2][C:3](=[N:5][CH2:6][CH2:7][S:8][CH2:9][c:10]1[cH:14][s:13][c:12]([NH2:15])[n:11]1)[NH:18][C:17]#[N:16] +03950333 [CH3:17][NH2:18].CS[C:4](=[N:7][CH2:8][CH2:9][S:10][CH2:11][c:12]1[cH:16][cH:15][s:14][n:13]1)[NH:3][C:1]#[N:2]>>[CH3:17][N:18]=[C:4]([NH:3][C:1]#[N:2])[NH:7][CH2:8][CH2:9][S:10][CH2:11][c:12]1[cH:16][cH:15][s:14][n:13]1 +03950333 Cl.[BrH:14].[CH3:8][c:4]1[n:5][s:6][cH:7][c:3]1[CH2:2]O.[NH2:10][CH2:11][CH2:12][SH:13]>>[BrH:14].[CH3:8][c:4]1[n:5][s:6][cH:7][c:3]1[CH2:2][S:13][CH2:12][CH2:11][NH2:10] +03950333 [Pb].[CH3:1][NH:2][C:3](=S)[NH:5][CH2:6][CH2:7][CH2:8][S:9][c:10]1[n:14][cH:13][cH:12][o:11]1.[N:15]#[C:16][NH2:17]>>[CH3:1][NH:2][C:3](=[N:5][CH2:6][CH2:7][CH2:8][S:9][c:10]1[n:14][cH:13][cH:12][o:11]1)[NH:17][C:16]#[N:15] +03950333 Cl.[BrH:13].[NH2:9][CH2:10][CH2:11][SH:12].Cl[CH2:2][c:3]1[cH:7][cH:6][o:5][n:4]1>>[BrH:13].[NH2:9][CH2:10][CH2:11][S:12][CH2:2][c:3]1[cH:7][cH:6][o:5][n:4]1 +03950333 [CH3:12][CH2:11][N:13]=[C:14]=[S:15].[NH2:10][CH2:9][CH2:8][NH:7][CH2:6][c:2]1[n:3][cH:4][cH:5][s:1]1>>[CH3:12][CH2:11][NH:13][C:14](=[S:15])[NH:10][CH2:9][CH2:8][NH:7][CH2:6][c:2]1[n:3][cH:4][cH:5][s:1]1 +03950333 O=[C:13](O)[c:9]1[n:10][cH:11][o:12][c:8]1[CH2:1][c:2]1[cH:3][cH:4][cH:5][cH:6][cH:7]1.O=S([Cl:32])Cl.OCc1ncoc1Cc1ccccc1>>[Cl:32][CH2:13][c:9]1[n:10][cH:11][o:12][c:8]1[CH2:1][c:2]1[cH:3][cH:4][cH:5][cH:6][cH:7]1 +03950333 [CH3:2][CH2:1][O:3][CH2:4][C:5](=O)Cl.[CH3:8][NH:9][C:10](=[S:13])[NH:11][NH2:12]>c1ccncc1>[CH3:2][CH2:1][O:3][CH2:4][CH:5]1[N:12]=[N:11][C:10](=[S:13])[N:9]1[CH3:8] +03950333 [CH3:8][c:7]1[s:6][n:5][n:4][c:3]1[CH2:2]O.[NH2:9][CH2:10][CH2:11][SH:12]>>[CH3:8][c:7]1[s:6][n:5][n:4][c:3]1[CH2:2][S:12][CH2:11][CH2:10][NH2:9] +03950336 [CH3:14][CH2:13][O:15][C:16](=[O:21])[CH2:17][C:18](=[NH:20])[NH2:19].O=[CH:11][c:4]1[cH:3][cH:2][n:1][c:10]2[cH:9][cH:8][cH:7][cH:6][c:5]12>CCO>[CH3:14][CH2:13][O:15][C:16](=[O:21])[C:17]1=[C:18]([NH2:19])[NH:20][C:18]([NH2:19])=[C:17]([C:16](=[O:21])[O:15][CH2:13][CH3:14])[CH:11]1[c:4]1[cH:3][cH:2][n:1][c:10]2[cH:9][cH:8][cH:7][cH:6][c:5]21 +03950336 [CH3:13][CH2:12][O:14][C:15](=[O:20])[CH2:16][C:17](=[NH:19])[NH2:18].O=[CH:7][c:6]1[cH:9][cH:10][cH:11][c:4]([N+:1](=[O:2])[O-:3])[cH:5]1>CCO>[CH3:13][CH2:12][O:14][C:15](=[O:20])[C:16]1=[C:17]([NH2:18])[NH:19][C:17]([NH2:18])=[C:16]([C:15](=[O:20])[O:14][CH2:12][CH3:13])[CH:7]1[c:6]1[cH:9][cH:10][cH:11][c:4]([N+:1](=[O:2])[O-:3])[cH:5]1 +03950336 [CH3:14][CH2:13][O:15][C:16](=[O:21])[CH2:17][C:18](=[NH:20])[NH2:19].O=[CH:5][c:4]1[cH:7][cH:8][cH:9][cH:10][c:3]1[C:2]([F:11])([F:12])[F:1]>CCO>[CH3:14][CH2:13][O:15][C:16](=[O:21])[C:17]1=[C:18]([NH2:19])[NH:20][C:18]([NH2:19])=[C:17]([C:16](=[O:21])[O:15][CH2:13][CH3:14])[CH:5]1[c:4]1[cH:7][cH:8][cH:9][cH:10][c:3]1[C:2]([F:1])([F:11])[F:12] +03950338 [CH3:17][CH2:16][O:15][C:13](=[O:14])[c:10]1[cH:9][n:8]([CH2:18][CH3:19])[c:6]2[n:7][c:2](Cl)[n:3][cH:4][c:5]2[c:11]1=[O:12].[O:21]=[CH:20][N:22]1[CH2:23][CH2:24][NH:25][CH2:26][CH2:27]1>ClC(Cl)Cl>[CH3:17][CH2:16][O:15][C:13](=[O:14])[c:10]1[cH:9][n:8]([CH2:18][CH3:19])[c:6]2[n:7][c:2]([N:25]3[CH2:24][CH2:23][N:22]([CH:20]=[O:21])[CH2:27][CH2:26]3)[n:3][cH:4][c:5]2[c:11]1=[O:12] +03950338 [CH3:31][CH2:30][O:29][C:27](=[O:28])[c:24]1[cH:23][n:22]([CH2:32][CH3:33])[c:20]2[n:21][c:16](Cl)[n:17][cH:18][c:19]2[c:25]1=[O:26].[Cl:1][c:2]1[cH:3][cH:4][c:5]([CH2:6][N:7]2[CH2:8][CH2:9][NH:10][CH2:11][CH2:12]2)[cH:13][cH:14]1>>[CH3:31][CH2:30][O:29][C:27](=[O:28])[c:24]1[cH:23][n:22]([CH2:32][CH3:33])[c:20]2[n:21][c:16]([N:10]3[CH2:9][CH2:8][N:7]([CH2:6][c:5]4[cH:4][cH:3][c:2]([Cl:1])[cH:14][cH:13]4)[CH2:12][CH2:11]3)[n:17][cH:18][c:19]2[c:25]1=[O:26] +03950339 [Na+].[Na+].Cl.[N:27]#[C:26][CH2:25][S:24][c:9]1[n:10][c:11]([NH:13][CH2:14][c:15]2[cH:23][cH:22][c:21]3[c:17]([cH:16]2)[O:18][CH2:19][O:20]3)[cH:12][c:7](-[c:1]2[cH:2][cH:3][cH:4][cH:5][cH:6]2)[n:8]1.[NH2:29][OH:30].O=C([O-])[O-]>CN(C)C=O>[NH2:27][C:26]([CH2:25][S:24][c:9]1[n:10][c:11]([NH:13][CH2:14][c:15]2[cH:23][cH:22][c:21]3[c:17]([cH:16]2)[O:18][CH2:19][O:20]3)[cH:12][c:7](-[c:1]2[cH:6][cH:5][cH:4][cH:3][cH:2]2)[n:8]1)=[N:29][OH:30] +03950339 [Na+].[Na+].[CH3:8][c:6]1[cH:7][c:2](Cl)[n:3][c:4]([S:9][CH2:10][C:11]#[N:12])[n:5]1.[NH2:19][CH2:18][c:17]1[cH:16][cH:15][c:14]([Cl:13])[cH:21][cH:20]1.O=C([O-])[O-]>CCO>[CH3:8][c:6]1[cH:7][c:2]([NH:19][CH2:18][c:17]2[cH:16][cH:15][c:14]([Cl:13])[cH:21][cH:20]2)[n:3][c:4]([S:9][CH2:10][C:11]#[N:12])[n:5]1 +03950339 [Na+].[Na+].[N:17]#[C:16][CH2:15][S:14][c:4]1[n:3][c:2](Cl)[cH:7][c:6](-[c:8]2[cH:9][cH:10][cH:11][cH:12][cH:13]2)[n:5]1.[NH2:28][CH2:18][c:19]1[cH:27][cH:26][c:25]2[c:21]([cH:20]1)[O:22][CH2:23][O:24]2.O=C([O-])[O-]>CCO>[N:17]#[C:16][CH2:15][S:14][c:4]1[n:3][c:2]([NH:28][CH2:18][c:19]2[cH:27][cH:26][c:25]3[c:21]([cH:20]2)[O:22][CH2:23][O:24]3)[cH:7][c:6](-[c:8]2[cH:9][cH:10][cH:11][cH:12][cH:13]2)[n:5]1 +03950342 [CH3:24]O.[O:17]=[C:16]([OH:18])[c:2]1[cH:3][cH:4][c:5]2[o:6][c:7]3[cH:8][cH:9][cH:10][cH:11][c:12]3[c:13](=[O:15])[c:14]2[cH:1]1.O=S(=O)(O)O>>[CH3:24][O:18][C:16](=[O:17])[c:2]1[cH:3][cH:4][c:5]2[o:6][c:7]3[cH:8][cH:9][cH:10][cH:11][c:12]3[c:13](=[O:15])[c:14]2[cH:1]1 +03950343 [CH3:6][C:5](=[O:7])OC(C)=O.[cH:8]1[cH:9][cH:10][n:11][cH:12][cH:13]1>>[CH3:6][C:5](=[O:7])[N:11]1[CH2:12][c:13]2[cH:12][nH:11][c:10]3[cH:9][cH:8][cH:13][c:9]([c:8]23)[CH2:10]1 +03950350 [Na+].[CH3:39][O:38][c:35]1[cH:34][cH:33][c:32]([CH2:31][NH:30][C:29](=O)[CH:24]2[N:23]3[C:41](=[O:42])[CH:21]([NH:20][C:7]([c:1]4[cH:2][cH:3][cH:4][cH:5][cH:6]4)([c:8]4[cH:9][cH:10][cH:11][cH:12][cH:13]4)[c:14]4[cH:15][cH:16][cH:17][cH:18][cH:19]4)[C@H:22]3[S:26][C:25]2([CH3:27])[CH3:28])[cH:37][cH:36]1.[N-:50]=[N+:49]=[N-:48].O=S(Cl)Cl.O=P(Cl)(Cl)Cl>CO.CS(C)=O.ClCCl.ClC(Cl)Cl.c1ccncc1>[CH3:39][O:38][c:35]1[cH:34][cH:33][c:32]([CH2:31][n:30]2[n:50][n:49][n:48][c:29]2[CH:24]2[N:23]3[C:41](=[O:42])[CH:21]([NH:20][C:7]([c:1]4[cH:2][cH:3][cH:4][cH:5][cH:6]4)([c:14]4[cH:15][cH:16][cH:17][cH:18][cH:19]4)[c:8]4[cH:13][cH:12][cH:11][cH:10][cH:9]4)[C@H:22]3[S:26][C:25]2([CH3:27])[CH3:28])[cH:37][cH:36]1 +03950353 Cl.[ClH:1].[CH3:9][c:8]1[nH:7][cH:6][n:5][c:4]1[CH2:3]O.[NH2:11][CH2:12][CH2:13][SH:14]>CC(=O)O>[ClH:1].[ClH:1].[CH3:9][c:8]1[n:7][cH:6][nH:5][c:4]1[CH2:3][S:14][CH2:13][CH2:12][NH2:11] +03950353 [Na].Cl.[OH:14][CH2:13][CH2:12][CH2:11][OH:10].Cl[CH2:4][c:5]1[cH:9][nH:8][cH:7][n:6]1>>[OH:10][CH2:11][CH2:12][CH2:13][O:14][CH2:4][c:5]1[cH:9][nH:8][cH:7][n:6]1 +03950353 [K+].[K+].O=C([O-])[O-].O=C([NH:9][C:10](=[S:11])[NH:12][CH2:13][CH2:14][CH2:15][NH:16][c:17]1[cH:21][cH:20][nH:19][n:18]1)c1ccccc1>>[NH2:9][C:10](=[S:11])[NH:12][CH2:13][CH2:14][CH2:15][NH:16][c:17]1[cH:21][cH:20][nH:19][n:18]1 +03950353 C[N:2]=[C:3]=S.[CH3:28][NH:29][C:30](=[S:31])[NH:32][CH2:33][CH2:34]CSCc1ncccn1.O=[C:16]1[c:15]2ccccc2C(=O)[N:17]1[CH2:18][CH2:19][CH2:20][SH:21].[Cl:5]Cc1ncccn1>>[CH3:28][NH:29][C:30](=[S:31])[NH:32][CH2:33][CH2:34][S:21][CH2:20][c:19]1[cH:18][n:17][c:16]([CH3:15])[n:2][c:3]1[Cl:5] +03950353 [Na+].CC[O-].[NH2:12][CH2:11][CH2:10][CH2:9][NH2:8].Br[c:2]1[n:3][cH:4][cH:5][cH:6][n:7]1>CCO>[NH2:8][CH2:9][CH2:10][CH2:11][NH:12][c:2]1[n:3][cH:4][cH:5][cH:6][n:7]1 +03950353 [NH2:12][CH2:11][CH2:10][CH2:9][NH2:8].Cl[c:2]1[cH:7][n:6][cH:5][cH:4][n:3]1>>[NH2:8][CH2:9][CH2:10][CH2:11][NH:12][c:2]1[cH:7][n:6][cH:5][cH:4][n:3]1 +03950353 [CH3:19][N:13]([CH3:12])[CH2:14][CH2:15][N:16]=[C:17]=[S:18].[NH2:11][CH2:10][CH2:9][NH:8][CH2:7][c:3]1[cH:4][cH:5][cH:6][n:1][n:2]1>>[CH3:19][N:13]([CH3:12])[CH2:14][CH2:15][NH:16][C:17](=[S:18])[NH:11][CH2:10][CH2:9][NH:8][CH2:7][c:3]1[cH:4][cH:5][cH:6][n:1][n:2]1 +03950353 [CH3:13][CH2:12][O:11][C:9](=[O:10])[CH2:8][C:7](=[O:6])[CH2:14][CH3:15].O=S(=O)([Cl:4])Cl>ClC(Cl)Cl>[CH3:13][CH2:12][O:11][C:9](=[O:10])[CH:8]([Cl:4])[C:7](=[O:6])[CH2:14][CH3:15] +03950353 [H-].[H-].[H-].[H-].[Li+].[Al+3].[CH3:1][c:2]1[n:3][s:4][c:5]([CH3:10])[c:6]1[C:7](=[O:8])O>C1CCOC1>[CH3:1][c:2]1[n:3][s:4][c:5]([CH3:10])[c:6]1[CH2:7][OH:8] +03950353 [Na+].[CH3:15][CH2:14][O:13][C:11](=[O:12])[CH2:10][C:5](=[O:9])[CH:6]([CH3:7])[CH3:8].O=[N:1][O-:3]>O.CC(=O)O>[CH3:15][CH2:14][O:13][C:11](=[O:12])[C:10](=[N:1][OH:3])[C:5](=[O:9])[CH:6]([CH3:7])[CH3:8] +03950353 [CH3:22][N:23]=[C:24]=[O:25].NCCN.[NH2:10][CH2:9][CH2:8][NH:7][CH2:6][c:2]1[n:3][cH:4][cH:5][s:1]1.ClCc1nccs1>>[CH3:22][NH:23][C:24](=[O:25])[NH:10][CH2:9][CH2:8][NH:7][CH2:6][c:2]1[n:3][cH:4][cH:5][s:1]1 +03950353 [CH3:13][NH:14][C:15](=[S:16])[NH:17][CH2:18][CH2:19]CNCc1ccsn1.NCC[CH2:9][NH2:8].Br[CH2:2][c:3]1[cH:7][cH:6][s:5][n:4]1>>[CH3:13][NH:14][C:15](=[S:16])[NH:17][CH2:18][CH2:19][NH:8][CH2:9][CH2:2][c:3]1[cH:7][cH:6][s:5][n:4]1 +03950353 [CH3:2][CH2:1][O:3][CH2:4][C:5](=O)Cl.[CH3:8][NH:9][C:10](=[S:13])[NH:11][NH2:12]>c1ccncc1>[CH3:2][CH2:1][O:3][CH2:4][CH:5]1[N:12]=[N:11][C:10](=[S:13])[N:9]1[CH3:8] +03950353 [CH3:23][N:17]([CH3:16])[CH2:18][CH2:19][N:20]=[C:21]=[S:22].[NH2:4][CH2:3][CH2:2][NH2:1].Cl[CH2:6][c:7]1[n:11][c:10]2[cH:12][cH:13][cH:14][cH:15][c:9]2[nH:8]1>>[CH3:23][N:17]([CH3:16])[CH2:18][CH2:19][NH:20][C:21](=[S:22])[NH:1][CH2:2][CH2:3][NH:4][CH2:6][c:7]1[n:11][c:10]2[cH:12][cH:13][cH:14][cH:15][c:9]2[nH:8]1 +03950353 [CH3:12][N:13]=[C:14]=[O:15].[CH3:1][c:2]1[n:3][cH:4][nH:5][c:6]1[CH2:7][S:8][CH2:9][CH2:10][NH2:11]>CC#N>[CH3:12][NH:13][C:14](=[O:15])[NH:11][CH2:10][CH2:9][S:8][CH2:7][c:6]1[nH:5][cH:4][n:3][c:2]1[CH3:1] +03950356 [CH2:29]=[C:19]1[N:18](C)[c:26]2[cH:25][cH:24][cH:23][cH:22][c:21]2[C:20]1(C)C.O=C[c:3]1[c:2]([OH:1])ccc2cc([N+](=O)[O-])cc[c:4]21>CCO>[cH:23]1[cH:24][cH:25][c:26]2[c:21]([cH:22]1)[CH2:20][C:19]1([CH:29]=[CH:4][CH:3]=[CH:2][O:1]1)[NH:18]2 +03950362 [K+].[N:16]#[C:17][c:18]1[cH:19][cH:20][cH:21][cH:22][cH:23]1.O=C([O-])O.OO.C1=CC2CC3[O:9]C(CC13)O2>CO.ClCCl>[NH2:16][C:17](=[O:9])[c:18]1[cH:19][cH:20][cH:21][cH:22][cH:23]1 +03950362 [BH4-].O.[Na+].CC(=O)O.[O:12]=[C:3]1[O:2][CH:1]2[CH2:9][CH:8]3[CH2:7][CH:6]([CH2:11]2)[O:5][CH:4]1[O:10]3>CO>[OH:12][CH2:3][CH:4]1[O:10][CH:8]2[CH2:9][CH:1]([OH:2])[CH2:11][CH:6]([CH2:7]2)[O:5]1 +03950362 [OH-].[Na+].[K+].[CH3:20][S:17](=[O:18])(=[O:19])[O:16][CH2:15][CH:10]1[O:9][CH:8]2[CH2:7][CH:6](OS(C)(=O)=O)[CH2:13][CH:12]([CH2:14]2)[O:11]1.O=C([O-])O>CC(C)O>[CH3:20][S:17](=[O:19])(=[O:18])[O:16][CH2:15][CH:10]1[O:11][CH:12]2[CH:13]=[CH:6][CH2:7][CH:8]([CH2:14]2)[O:9]1 +03950375 [OH-:10].[Na+].[Na+].[Cl-].[CH3:7][CH2:6][CH2:5][O:4][C:2](=[O:3])Cl.[OH:9][OH:8]>>[CH3:7][CH2:6][CH2:5][O:4][C:2](=[O:3])[O:8][O:9][C:2](=[O:10])[O:4][CH2:5][CH2:6][CH3:7] +03950376 [CH3:20][O:19][c:16]1[cH:15][cH:14][c:13]([O:12][c:3]2[c:2]([NH2:1])[cH:10][c:6]([C:7](=[O:8])[OH:9])[cH:5][c:4]2[SH:11])[cH:18][cH:17]1.Br[CH2:22][c:23]1[cH:24][cH:25][cH:26][cH:27][cH:28]1>[Na+].O=C([O-])O>[CH3:20][O:19][c:16]1[cH:15][cH:14][c:13]([O:12][c:3]2[c:2]([NH2:1])[cH:10][c:6]([C:7](=[O:8])[OH:9])[cH:5][c:4]2[S:11][CH2:22][c:23]2[cH:24][cH:25][cH:26][cH:27][cH:28]2)[cH:18][cH:17]1 +03950376 [NH3:24].[CH3:16][CH2:15][S:14][c:7]1[cH:8][c:9]([C:10](=[O:11])[OH:12])[cH:13][c:5]([S:2](=[O:3])(=[O:4])Cl)[c:6]1[O:17][c:18]1[cH:19][cH:20][cH:21][cH:22][cH:23]1>>[CH3:16][CH2:15][S:14][c:7]1[cH:8][c:9]([C:10](=[O:11])[OH:12])[cH:13][c:5]([S:2]([NH2:24])(=[O:3])=[O:4])[c:6]1[O:17][c:18]1[cH:19][cH:20][cH:21][cH:22][cH:23]1 +03950376 Cl.[NH2:12][S:11](=[O:13])(=[O:14])[c:10]1[cH:9][c:5]([C:6](=[O:7])[OH:8])[cH:4][c:3]([SH:15])[c:2]1[Cl:1].Br[CH2:17][c:18]1[cH:19][cH:20][cH:21][cH:22][cH:23]1>[OH-].O.[Na+]>[NH2:12][S:11](=[O:13])(=[O:14])[c:10]1[cH:9][c:5]([C:6](=[O:7])[OH:8])[cH:4][c:3]([S:15][CH2:17][c:18]2[cH:19][cH:20][cH:21][cH:22][cH:23]2)[c:2]1[Cl:1] +03950376 [Na+].[CH3:16][CH2:15][O:14][C:12](=[O:13])[c:11]1[cH:10][c:9]([S:8][CH2:1][c:2]2[cH:3][cH:4][cH:5][cH:6][cH:7]2)[c:19](Cl)[c:18]([S:21]([NH2:22])(=[O:23])=[O:24])[cH:17]1.[S-]c1ccccc1.[SH:25][c:26]1[cH:27][cH:28][cH:29][cH:30][cH:31]1>CCO>[CH3:16][CH2:15][O:14][C:12](=[O:13])[c:11]1[cH:10][c:9]([S:8][CH2:1][c:2]2[cH:3][cH:4][cH:5][cH:6][cH:7]2)[c:19]([S:25][c:26]2[cH:27][cH:28][cH:29][cH:30][cH:31]2)[c:18]([S:21]([NH2:22])(=[O:23])=[O:24])[cH:17]1 +03950376 [Na].Cl.[O:11]=[C:10]([OH:12])[c:9]1[cH:13][c:5]([N+:2](=O)[O-])[c:6]([O:17][c:18]2[cH:19][cH:20][cH:21][cH:22][cH:23]2)[c:7]([S:14](=O)O)[cH:8]1>[Zn].CCO>[NH2:2][c:5]1[cH:13][c:9]([C:10](=[O:11])[OH:12])[cH:8][c:7]([SH:14])[c:6]1[O:17][c:18]1[cH:23][cH:22][cH:21][cH:20][cH:19]1 +03950378 [Na+].C[O-].[CH3:14][O:13][c:9]1[cH:8][c:5]([CH:6]=O)[cH:4][c:3]([O:2][CH3:1])[c:10]1[O:11][CH3:12].[CH3:15][N:16]([CH2:23][CH2:24][C:25]#[N:26])[c:17]1[cH:18][cH:19][cH:20][cH:21][cH:22]1.CS(C)=O>CO>[CH3:14][O:13][c:9]1[cH:8][c:5]([CH2:6][C:24]([C:25]#[N:26])=[CH:23][N:16]([CH3:15])[c:17]2[cH:18][cH:19][cH:20][cH:21][cH:22]2)[cH:4][c:3]([O:2][CH3:1])[c:10]1[O:11][CH3:12] +03950380 O.[CH3:31][CH2:30][CH2:29][CH2:28][O:32][c:33]1[cH:34][c:35]([C:36](=[O:37])[OH:38])[cH:39][c:40]([S:48](=[O:49])(=[O:50])Cl)[c:41]1-[c:42]1[cH:43][cH:44][cH:45][cH:46][cH:47]1.O=C(O)c1cc([NH:8]Cc2ccccc2)c(-c2ccccc2)c(S(=O)(=O)Cl)c1>>[CH3:31][CH2:30][CH2:29][CH2:28][O:32][c:33]1[cH:34][c:35]([C:36](=[O:37])[OH:38])[cH:39][c:40]([S:48]([NH2:8])(=[O:49])=[O:50])[c:41]1-[c:42]1[cH:43][cH:44][cH:45][cH:46][cH:47]1 +03950380 [CH3:43][CH2:42][c:41]1[cH:44][cH:45][cH:46][cH:47][c:40]1[O:39][c:32]1[cH:33][c:34]([C:35](=[O:36])[OH:37])[cH:38][c:30]([N+:27](=O)[O-])[c:31]1-[c:48]1[cH:49][cH:50][cH:51][cH:52][cH:53]1.O=C(O)c1cc(OCc2ccccc2)c(-c2ccccc2)c([N+](=O)[O-])c1>>[CH3:43][CH2:42][c:41]1[cH:44][cH:45][cH:46][cH:47][c:40]1[O:39][c:32]1[cH:33][c:34]([C:35](=[O:36])[OH:37])[cH:38][c:30]([NH2:27])[c:31]1-[c:48]1[cH:49][cH:50][cH:51][cH:52][cH:53]1 +03950380 Cl.C[O:9][C:7](=[O:8])[c:6]1[cH:5][c:4]([N+:1](=[O:2])[O-:3])[c:13](-[c:14]2[cH:15][cH:16][cH:17][cH:18][cH:19]2)[c:12]([N+:20](=[O:21])[O-:22])[cH:11]1>[OH-].O.[Na+].COCCO>[O:8]=[C:7]([OH:9])[c:6]1[cH:5][c:4]([N+:1](=[O:2])[O-:3])[c:13](-[c:14]2[cH:15][cH:16][cH:17][cH:18][cH:19]2)[c:12]([N+:20](=[O:21])[O-:22])[cH:11]1 +03950380 O.[CH3:30][CH:29]([CH3:31])[CH2:28][CH2:27][S:32][c:33]1[cH:34][c:35]([C:36](=[O:37])[OH:38])[cH:39][c:40]([N+:48](=O)[O-])[c:41]1-[c:42]1[cH:43][cH:44][cH:45][cH:46][cH:47]1.O=C(O)c1cc(OCc2ccccc2)c(-c2ccccc2)c([N+](=O)[O-])c1>>[CH3:30][CH:29]([CH3:31])[CH2:28][CH2:27][S:32][c:33]1[cH:34][c:35]([C:36](=[O:37])[OH:38])[cH:39][c:40]([NH2:48])[c:41]1-[c:42]1[cH:47][cH:46][cH:45][cH:44][cH:43]1 +03950380 [CH3:30][CH:29]=[CH:28][CH2:27][S:31][c:32]1[cH:33][c:34]([C:35](=[O:36])[OH:37])[cH:38][c:39]([N+:47](=O)[O-])[c:40]1-[c:41]1[cH:42][cH:43][cH:44][cH:45][cH:46]1.O=C(O)c1cc(OCc2ccccc2)c(-c2ccccc2)c([N+](=O)[O-])c1>>[CH3:30][CH:29]=[CH:28][CH2:27][S:31][c:32]1[cH:33][c:34]([C:35](=[O:36])[OH:37])[cH:38][c:39]([NH2:47])[c:40]1-[c:41]1[cH:46][cH:45][cH:44][cH:43][cH:42]1 +03950380 O=C(O)c1cc(NCc2ccccc2)c(-c2ccccc2)c([N+](=O)[O-])c1.[O:36]=[C:35]([OH:37])[c:34]1[cH:33][c:32]([S:39][CH2:40][c:41]2[cH:46][cH:45][cH:44][cH:43][n:42]2)[c:31](-[c:47]2[cH:48][cH:49][cH:50][cH:51][cH:52]2)[c:30]([N+:27](=O)[O-])[cH:38]1>>[NH2:27][c:30]1[cH:38][c:34]([C:35](=[O:36])[OH:37])[cH:33][c:32]([S:39][CH2:40][c:41]2[cH:46][cH:45][cH:44][cH:43][n:42]2)[c:31]1-[c:47]1[cH:48][cH:49][cH:50][cH:51][cH:52]1 +03950380 O.[CH3:24][CH2:23][CH2:22][CH2:21]I.[NH2:1][c:2]1[cH:3][c:4]([C:5](=[O:6])[OH:7])[cH:8][c:9]([S:17]([NH2:18])(=[O:19])=[O:20])[c:10]1-[c:11]1[cH:12][cH:13][cH:14][cH:15][cH:16]1>CCCCO>[CH3:24][CH2:23][CH2:22][CH2:21][NH:1][c:2]1[cH:3][c:4]([C:5](=[O:6])[OH:7])[cH:8][c:9]([S:17]([NH2:18])(=[O:19])=[O:20])[c:10]1-[c:11]1[cH:12][cH:13][cH:14][cH:15][cH:16]1 +03950380 [CH2:22]=[CH:21][c:23]1[cH:24][cH:25][n:26][cH:27][cH:28]1.CC(=O)O.[NH2:1][c:2]1[cH:3][c:4]([C:5](=[O:6])[OH:7])[cH:8][c:9]([S:17]([NH2:18])(=[O:19])=[O:20])[c:10]1-[c:11]1[cH:12][cH:13][cH:14][cH:15][cH:16]1>O.CO>[NH2:18][S:17](=[O:19])(=[O:20])[c:9]1[cH:8][c:4]([C:5](=[O:6])[OH:7])[cH:3][c:2]([NH:1][CH2:22][CH2:21][c:23]2[cH:24][cH:25][n:26][cH:27][cH:28]2)[c:10]1-[c:11]1[cH:12][cH:13][cH:14][cH:15][cH:16]1 +03950380 [NH4+:28].[OH-].[O:13]=[C:12]([OH:14])[c:11]1[cH:10][c:9]([O:8][CH2:1][c:2]2[cH:3][cH:4][cH:5][cH:6][cH:7]2)[c:17](-[c:18]2[cH:19][cH:20][cH:21][cH:22][cH:23]2)[c:16]([S:24](=[O:25])(=[O:26])Cl)[cH:15]1>>[NH2:28][S:24](=[O:25])(=[O:26])[c:16]1[cH:15][c:11]([C:12](=[O:13])[OH:14])[cH:10][c:9]([O:8][CH2:1][c:2]2[cH:3][cH:4][cH:5][cH:6][cH:7]2)[c:17]1-[c:18]1[cH:19][cH:20][cH:21][cH:22][cH:23]1 +03950383 Cl.[CH2:22]=[CH:23][C:24]#[N:25].[CH3:1][NH:2][CH2:3][C:4](=[O:5])[NH:6][c:7]1[cH:20][cH:19][c:18]([Cl:21])[cH:17][c:8]1[C:9](=[O:10])[c:11]1[cH:12][cH:13][cH:14][cH:15][cH:16]1>CCOCC>[ClH:21].[CH3:1][N:2]([CH2:22][CH2:23][C:24]#[N:25])[CH2:3][C:4](=[O:5])[NH:6][c:7]1[cH:20][cH:19][c:18]([Cl:21])[cH:17][c:8]1[C:9](=[O:10])[c:11]1[cH:12][cH:13][cH:14][cH:15][cH:16]1 +03950390 Cl.C[OH:10].C[CH2:15][O:14]CC.N#[C:7][C:2]1([OH:1])[CH2:3][CH:4]=[CH:5][CH2:6]1>>[CH3:15][O:14][C:7](=[O:10])[C:2]1([OH:1])[CH2:3][CH:4]=[CH:5][CH2:6]1 +03950393 N.[ClH:22].[CH3:21][CH2:20][O:19][C:17](=[O:18])[c:14]1[cH:15][cH:16][c:5]([NH:1]C(C)=O)[c:6]([CH2:7][N:8]([CH2:9][CH3:10])[CH2:11][CH3:12])[cH:13]1>CCO>[ClH:22].[CH3:21][CH2:20][O:19][C:17](=[O:18])[c:14]1[cH:15][cH:16][c:5]([NH2:1])[c:6]([CH2:7][N:8]([CH2:11][CH3:12])[CH2:9][CH3:10])[cH:13]1 +03950393 [CH3:18][NH:17][CH3:16].[CH3:11][O:10][c:7]1[cH:8][cH:9][c:2]([NH2:1])[c:3]([CH2:4]O)[cH:6]1.O=S(Cl)Cl>ClCCl>[CH3:11][O:10][c:7]1[cH:8][cH:9][c:2]([NH2:1])[c:3]([CH2:4][N:17]([CH3:16])[CH3:18])[cH:6]1 +03950393 [CH3:2][CH2:1][NH:3][CH2:4][CH3:5].[CH3:7][C:6](=[O:8])[NH:9][c:10]1[c:11]([CH2:12]Br)[cH:14][c:15]([Br:21])[cH:16][c:17]1[CH2:18]CBr>ClC(Cl)(Cl)Cl>[CH3:2][CH2:1][N:3]([CH2:4][CH3:5])[CH2:18][c:17]1[cH:16][c:15]([Br:21])[cH:14][c:11]([CH2:12][N:3]([CH2:1][CH3:2])[CH2:4][CH3:5])[c:10]1[NH:9][C:6]([CH3:7])=[O:8] +03950393 [ClH:26].[H][H].[CH3:23][CH2:22][O:21][C:19](=[O:20])[c:16]1[cH:17][cH:18][c:2]([NH2:1])[c:3]([CH2:4][N:5]([CH2:6][CH3:7])Cc2ccccc2)[cH:15]1>CO>[ClH:26].[CH3:7][CH2:6][NH:5][CH2:4][c:3]1[cH:15][c:16]([C:19](=[O:20])[O:21][CH2:22][CH3:23])[cH:17][cH:18][c:2]1[NH2:1] +03950393 [CH3:1][NH:2][CH:3]1[CH2:4][CH2:5][CH2:6][CH2:7][CH2:8]1.[CH3:10][C:9](=[O:11])[NH:12][c:13]1[cH:20][cH:19][c:18]([C:21]([CH3:22])([CH3:23])[CH3:24])[cH:17][c:14]1[CH2:15]Br>ClC(Cl)(Cl)Cl>[CH3:10][C:9](=[O:11])[NH:12][c:13]1[cH:20][cH:19][c:18]([C:21]([CH3:22])([CH3:23])[CH3:24])[cH:17][c:14]1[CH2:15][N:2]([CH3:1])[CH:3]1[CH2:4][CH2:5][CH2:6][CH2:7][CH2:8]1 +03950393 [OH-].[Na+].CC[OH:19].[CH3:7][CH2:6][N:5]([CH2:8][CH3:9])[CH2:4][c:3]1[cH:10][c:11]([C:15]#[N:16])[cH:12][c:13]([Br:14])[c:2]1[NH2:1]>O>[CH3:7][CH2:6][N:5]([CH2:8][CH3:9])[CH2:4][c:3]1[cH:10][c:11]([C:15]([NH2:16])=[O:19])[cH:12][c:13]([Br:14])[c:2]1[NH2:1] +03950405 N.N.O.[H][H].[N:5]#[C:4][C@H:6]1[CH2:11][CH2:10][C@H:9]([C:12](=[O:13])[OH:14])[CH2:8][CH2:7]1>[Co]>[NH2:5][CH2:4][C@H:6]1[CH2:7][CH2:8][C@H:9]([C:12](=[O:13])[OH:14])[CH2:10][CH2:11]1 +03950406 C[c:15]1[cH:16]cc(S(=O)(=O)O)cc1.[O:2]=[C:1]([OH:3])[CH2:4][CH2:5][CH2:6][CH2:7][CH2:8][C:9]1=[CH:13][CH2:12][CH2:11][C:10]1=[O:14]>CCO>[CH3:16][CH2:15][O:3][C:1](=[O:2])[CH2:4][CH2:5][CH2:6][CH2:7][CH2:8][C:9]1=[CH:13][CH2:12][CH2:11][C:10]1=[O:14] +03950406 [Ca+2].[Br].CC[O:18][C:16](=[O:17])[CH2:15][C:14]([CH3:21])([CH3:22])[CH2:13][CH2:12][CH2:11][CH2:10][C:6]1=[C:5]([O:4]C(C)=O)[CH2:9][CH2:8][CH2:7]1.O=C([O-])[O-]>O.CC(=O)N(C)C.ClC(Cl)Cl.ClC(Cl)(Cl)Cl>[CH3:21][C:14]([CH3:22])([CH2:13][CH2:12][CH2:11][CH2:10][C:6]1=[CH:7][CH2:8][CH2:9][C:5]1=[O:4])[CH2:15][C:16](=[O:17])[OH:18] +03950406 [OH].[OH-].[OH-].O.O.O.O.O.O.O.O.[K+].[K+].[Ba+2].CCOC(=O)CCCCCCC1=CC(O)CC1=O.CC[O:33][C:31](=[O:32])[CH2:30][CH2:29][CH2:28][CH2:27][CH2:26][CH2:25][C:21]1=[CH:20][CH:19]([O:18]C(C)=O)[CH2:23][C:22]1=[O:24].O=C([O-])[O-].Oc1ccc(O)cc1>O.CO>[O:32]=[C:31]([OH:33])[CH2:30][CH2:29][CH2:28][CH2:27][CH2:26][CH2:25][C:21]1=[CH:20][CH:19]([OH:18])[CH2:23][C:22]1=[O:24] +03950406 [O:15]=[C:14]([OH:16])[CH2:13][CH2:12][CH2:11][CH2:10][CH2:9][CH2:8][C:4]1=[CH:3][CH:2](Br)[CH2:6][C:5]1=[O:7].C1CC[O:17]C1>O>[O:15]=[C:14]([OH:16])[CH2:13][CH2:12][CH2:11][CH2:10][CH2:9][CH2:8][C:4]1=[CH:3][CH:2]([OH:17])[CH2:6][C:5]1=[O:7] +03950406 [CH:5]#[C:4][CH2:3][CH:2]([OH:1])[CH2:6][CH2:7][CH2:8][CH3:9].Br[C:16]([c:10]1[cH:11][cH:12][cH:13][cH:14][cH:15]1)([c:17]1[cH:18][cH:19][cH:20][cH:21][cH:22]1)[c:23]1[cH:24][cH:25][cH:26][cH:27][cH:28]1.c1ccncc1>O>[CH:5]#[C:4][CH2:3][CH:2]([CH2:6][CH2:7][CH2:8][CH3:9])[O:1][C:16]([c:10]1[cH:11][cH:12][cH:13][cH:14][cH:15]1)([c:17]1[cH:18][cH:19][cH:20][cH:21][cH:22]1)[c:23]1[cH:24][cH:25][cH:26][cH:27][cH:28]1 +03950406 [CH3:7][CH2:6][CH2:5][CH:4]([OH:8])[CH2:3][CH2:2][Cl:1].Cc1cccc(C)n1.Clc1ccccc1.Br[C:15]([c:9]1[cH:10][cH:11][cH:12][cH:13][cH:14]1)([c:16]1[cH:17][cH:18][cH:19][cH:20][cH:21]1)[c:22]1[cH:23][cH:24][cH:25][cH:26][cH:27]1>O>[CH3:7][CH2:6][CH2:5][CH:4]([CH2:3][CH2:2][Cl:1])[O:8][C:15]([c:16]1[cH:21][cH:20][cH:19][cH:18][cH:17]1)([c:22]1[cH:27][cH:26][cH:25][cH:24][cH:23]1)[c:9]1[cH:10][cH:11][cH:12][cH:13][cH:14]1 +03950406 [OH-].O.[K+].[CH:13]#[C:12][CH2:11][C@H:10]([CH2:14][CH2:15][CH2:16][CH3:17])[O:9]C(=O)c1ccccc1.CO>CCOC(C)=O>[CH:13]#[C:12][CH2:11][C@@H:10]([OH:9])[CH2:14][CH2:15][CH2:16][CH3:17] +03950406 O.[CH3:5][CH2:4][O:3][C:1](=[O:2])[CH2:6][CH2:7][CH2:8][CH2:9][CH:10]1[CH2:14][CH2:13][CH2:12][C:11]1=[O:15].CC(=O)O[C:17]([CH3:16])=[O:18].Cc1ccc(S(=O)(=O)O)cc1>>[CH3:5][CH2:4][O:3][C:1](=[O:2])[CH2:6][CH2:7][CH2:8][CH2:9][C:10]1=[C:11]([O:15][C:17]([CH3:16])=[O:18])[CH2:12][CH2:13][CH2:14]1 +03950406 [CH3:5][CH2:4][O:3][C:1](=[O:2])[CH2:6][C:7]([CH3:18])([CH3:19])[CH2:8][CH2:9][CH2:10][CH2:11][CH:12]1[CH2:16][CH2:15][CH2:14][C:13]1=[O:17].CC(=O)O[C:21]([CH3:20])=[O:22]>>[CH3:5][CH2:4][O:3][C:1](=[O:2])[CH2:6][C:7]([CH3:19])([CH3:18])[CH2:8][CH2:9][CH2:10][CH2:11][C:12]1=[C:13]([O:17][C:21]([CH3:20])=[O:22])[CH2:14][CH2:15][CH2:16]1 +03950423 CCO.CC(C)O.[O:13]=[C:6]1[c:5]2[cH:14][cH:15][cH:16][cH:17][c:4]2[C:3]([F:18])([F:19])[C:2]([F:20])([F:1])[c:8]2[cH:9][cH:10][cH:11][cH:12][c:7]21.C1COCCO1>C1CCOC1>[OH:13][CH:6]1[c:5]2[cH:14][cH:15][cH:16][cH:17][c:4]2[C:3]([F:19])([F:18])[C:2]([F:20])([F:1])[c:8]2[cH:9][cH:10][cH:11][cH:12][c:7]21 +03950423 [H-].[Na+].[CH3:7][CH2:6][O:5][C:3](=[O:4])[CH2:2][C:1](=[O:8])[O:9][CH2:10][CH3:11].[F:28][C:18]1([F:29])[c:17]2[cH:30][cH:31][cH:32][cH:33][c:16]2[CH:15](Cl)[c:21]2[cH:22][cH:23][cH:24][cH:25][c:20]2[C:19]1([F:26])[F:27]>>[CH3:11][CH2:10][O:9][C:1](=[O:8])[CH:2]([C:3](=[O:4])[O:5][CH2:6][CH3:7])[CH:15]1[c:21]2[cH:22][cH:23][cH:24][cH:25][c:20]2[C:19]([F:27])([F:26])[C:18]([F:28])([F:29])[c:17]2[cH:30][cH:31][cH:32][cH:33][c:16]21 +03950425 [Na+].[CH3:32][C:31]#[N:33].CC[O-].O=[C:2]1[CH2:20][CH2:19][C:5]2=[C:4]([CH2:3]1)[c:10]1[cH:11][cH:12][cH:13][cH:14][c:9]1[O:8][c:7]1[cH:15][cH:16][cH:17][cH:18][c:6]12.c1ccccc1>>[N:33]#[C:31][CH:32]=[C:2]1[CH2:20][CH2:19][C:5]2=[C:4]([CH2:3]1)[c:10]1[cH:11][cH:12][cH:13][cH:14][c:9]1[O:8][c:7]1[cH:15][cH:16][cH:17][cH:18][c:6]12 +03950427 [CH3:11][C:10](=[O:12])[CH2:9][CH2:8][c:6]1[cH:5][cH:4][c:3](-[c:13]2[cH:14][cH:15][cH:16][cH:17][cH:18]2)[c:2]([Cl:1])[cH:7]1>CCOC(C)=O.c1ccccc1>[CH3:11][CH:10]([OH:12])[CH2:9][CH2:8][c:6]1[cH:5][cH:4][c:3](-[c:13]2[cH:18][cH:17][cH:16][cH:15][cH:14]2)[c:2]([Cl:1])[cH:7]1 +03950427 Cl.CCOC(=O)/C=C(\C)[O:19][CH2:17][CH3:18].[CH3:2][C:1](=O)[c:4]1[cH:9][cH:8][c:7](-[c:10]2[cH:11][cH:12][cH:13][cH:14][cH:15]2)[c:6]([Cl:16])[cH:5]1.O=[C:30]=O>O.CN(C)C=O>[CH3:18][C:17](=[O:19])/[CH:2]=[C:1](\[CH3:30])[c:4]1[cH:9][cH:8][c:7](-[c:10]2[cH:11][cH:12][cH:13][cH:14][cH:15]2)[c:6]([Cl:16])[cH:5]1 +03950427 [OH-].[K+].CO.[CH3:18][C:17]([CH3:16])=[O:19].O=[CH:5][c:4]1[cH:7][cH:8][c:9]([CH:10]2[CH2:11][CH2:12][CH2:13][CH2:14][CH2:15]2)[c:2]([Cl:1])[cH:3]1>O>[CH3:18][C:17](=[O:19])/[CH:16]=[CH:5]/[c:4]1[cH:7][cH:8][c:9]([CH:10]2[CH2:11][CH2:12][CH2:13][CH2:14][CH2:15]2)[c:2]([Cl:1])[cH:3]1 +03950427 CCOC(=O)/[CH:21]=[C:20](\[CH3:27])[O:19]CC.[CH3:15][C:14](=O)[c:4]1[cH:5][cH:6][c:7]([CH:8]2[CH2:9][CH2:10][CH2:11][CH2:12][CH2:13]2)[c:2]([Br:1])[cH:3]1>CO>[CH3:27][C:20](=[O:19])/[CH:21]=[C:14](\[CH3:15])[c:4]1[cH:5][cH:6][c:7]([CH:8]2[CH2:9][CH2:10][CH2:11][CH2:12][CH2:13]2)[c:2]([Br:1])[cH:3]1 +03950427 CCOC(=O)/[CH:22]=[C:21](\[CH3:28])[O:20]CC.[CH3:16][C:15](=O)[c:4]1[cH:5][cH:6][c:7]([CH:8]2[CH2:9][CH2:10][CH2:11][CH2:12][CH2:13][CH2:14]2)[c:2]([Cl:1])[cH:3]1>>[CH3:28][C:21](=[O:20])/[CH:22]=[C:15](\[CH3:16])[c:4]1[cH:5][cH:6][c:7]([CH:8]2[CH2:9][CH2:10][CH2:11][CH2:12][CH2:13][CH2:14]2)[c:2]([Cl:1])[cH:3]1 +03950427 [BH4-].CC(C)=O.[CH3:22][C:21](=[O:23])/[CH:20]=[CH:19]/[c:9]1[cH:10][cH:11][c:12]([CH:13]2[CH2:14][CH2:15][CH2:16][CH2:17][CH2:18]2)[c:7]([Cl:6])[cH:8]1>>[CH3:22][C:21](=[O:23])[CH2:20][CH2:19][c:9]1[cH:10][cH:11][c:12]([CH:13]2[CH2:14][CH2:15][CH2:16][CH2:17][CH2:18]2)[c:7]([Cl:6])[cH:8]1 +03950427 CCOC(=O)/[CH:20]=[C:19](\[CH3:26])[O:18]CC.[CH3:14][C:13](=O)[c:4]1[cH:5][cH:6][c:7]([CH:8]2[CH2:9][CH2:10][CH2:11][CH2:12]2)[c:2]([Cl:1])[cH:3]1>>[CH3:26][C:19](=[O:18])/[CH:20]=[C:13](\[CH3:14])[c:4]1[cH:5][cH:6][c:7]([CH:8]2[CH2:9][CH2:10][CH2:11][CH2:12]2)[c:2]([Cl:1])[cH:3]1 +03950427 [CH3:11][C:10](=[O:12])/[CH:9]=[C:8](\[CH3:13])[c:6]1[cH:5][cH:4][c:3](-[c:14]2[cH:15][cH:16][cH:17][cH:18][cH:19]2)[c:2]([F:1])[cH:7]1.CC(C)OC(C)C>>[CH3:11][C:10](=[O:12])[CH2:9][CH:8]([CH3:13])[c:6]1[cH:5][cH:4][c:3](-[c:14]2[cH:19][cH:18][cH:17][cH:16][cH:15]2)[c:2]([F:1])[cH:7]1 +03950429 [CH3:12][SH:13].[CH3:11][C:3]1=[CH:4][C:5](=[O:10])[CH:6]2[CH:1]([CH2:2]1)[C:7]2([CH3:8])[CH3:9]>>[CH3:12][S:13][C:3]1([CH3:11])[CH2:4][C:5](=[O:10])[CH:6]2[CH:1]([CH2:2]1)[C:7]2([CH3:9])[CH3:8] +03950437 CC(=[O:11])OO.[CH3:8][c:3]1[cH:2][cH:1][c:6]([OH:7])[cH:5][cH:4]1>CC(C)=O>[CH3:8][c:3]1[cH:4][cH:5][c:6]([OH:7])[c:1]([OH:11])[cH:2]1 +03950437 CCCC(=O)O.COC.[CH3:1][O:2][c:3]1ccccc1.COP(=O)([O-])[O-].COP(=O)([O-])[O:13][CH3:14].[OH:32][c:31]1[cH:38][cH:37]c[cH:35][c:33]1O>>[CH3:3][O:2][CH3:1].[OH:32][c:31]1[cH:38][cH:37][c:14]([OH:13])[cH:35][cH:33]1 +03950437 CCCCc1ccccc1O.CC(=[O:14])OO.[CH3:2][C:1]([CH3:3])([CH3:4])[c:5]1[cH:6][cH:7][c:8]([OH:11])[cH:9][cH:10]1>CCOC(C)=O>[CH3:3][C:1]([CH3:2])([CH3:4])[c:5]1[cH:6][cH:7][c:8]([OH:11])[c:9]([OH:14])[cH:10]1 +03950437 [CH3:16][C:15]([CH3:17])([CH3:18])[CH2:14][C:11]([CH3:12])([CH3:13])[c:19]1[cH:20][cH:21][c:22]([OH:25])[cH:23][cH:24]1.OCc1cccc(C[OH:8])n1>>[CH3:16][C:15]([CH3:17])([CH3:18])[CH2:14][C:11]([CH3:13])([CH3:12])[c:19]1[cH:20][cH:21][c:22]([OH:25])[c:23]([OH:8])[cH:24]1 +03950522 [Li]c1ccccc1.[CH2:25]=[CH:24][CH2:23][N:26]=[C:27]=[S:28].[CH3:1][O:2][CH2:3][c:4]1[cH:9][cH:8][cH:7][cH:6][n:5]1.c1ccccc1>O>[CH2:25]=[CH:24][CH2:23][NH:26][C:27](=[S:28])[CH:3]([O:2][CH3:1])[c:4]1[cH:9][cH:8][cH:7][cH:6][n:5]1 +03950522 [Na+].Cl.[CH3:11][CH2:12][O-:13].Cl[CH2:3][c:4]1[cH:9][cH:8][cH:7][cH:6][n:5]1>CO>[CH3:11][CH2:12][O:13][CH2:3][c:4]1[cH:9][cH:8][cH:7][cH:6][n:5]1 +03950525 O.[ClH:25].[CH3:7][CH2:6][N:8]([CH2:22][CH3:23])[c:9]1[n:14][cH:13][n:12][c:11]2[c:15]3[cH:21][cH:20][cH:19][cH:18][c:16]3s[c:10]21.CN(C)C=O>CCOCC>[ClH:25].[CH3:23][CH2:22][N:8]([CH2:6][CH3:7])[c:9]1[cH:10][c:11](-[c:15]2[cH:16][cH:18][cH:19][cH:20][cH:21]2)[n:12][cH:13][n:14]1 +03950525 [Cl-].Cl.[ClH:1].[CH3:3][CH2:2][N:4]([CH2:20][CH3:21])[c:5]1[cH:10][c:9](-[c:11]2[cH:16][cH:15][cH:14][c:13]([N+:17](=O)[O-])[cH:12]2)[n:8][cH:7][n:6]1>ClC(Cl)Cl>[ClH:1].[ClH:1].[CH3:21][CH2:20][N:4]([CH2:2][CH3:3])[c:5]1[cH:10][c:9](-[c:11]2[cH:16][cH:15][cH:14][c:13]([NH2:17])[cH:12]2)[n:8][cH:7][n:6]1 +03950533 [K+].[K+].[K+].[I-].CCC[CH:20]1[CH:21]=C(S(=O)(=O)[O-])C=C[C:19]1(C)[O:18][CH3:17].O=C([O-])[O-].[OH:8][c:3]1[cH:4][cH:5][cH:6][cH:7][c:2]1[SH:1]>CC(C)=O>[CH3:17][O:18][CH2:19][CH:20]([CH3:21])[S:1][c:2]1[cH:7][cH:6][cH:5][cH:4][c:3]1[OH:8] +03951618 [OH-].[K+].CCO.C[O:29][C:27](=[O:28])[c:12]1[cH:11][cH:10][c:9]2[o:8][c:7]3[c:6]([S:5]C(=O)N(C)C)[cH:19][c:18]([S:20]C(=O)N(C)C)[cH:17][c:16]3[c:15](=[O:26])[c:14]2[cH:13]1>O>[O:28]=[C:27]([OH:29])[c:12]1[cH:11][cH:10][c:9]2[o:8][c:7]3[c:6]([SH:5])[cH:19][c:18]([SH:20])[cH:17][c:16]3[c:15](=[O:26])[c:14]2[cH:13]1 +03951618 [Li+].[Li+].CI.[CH3:18][S:17][c:15]1[cH:16][c:3]([S:2][CH3:1])[c:4]2[o:5][c:6]3[cH:7][cH:8][c:9]([C:20](=[O:21])[OH:22])[cH:10][c:11]3[c:12](=[O:19])[c:13]2[cH:14]1.O=[C:28]([O-])[O-]>CN(C)C=O>[CH3:28][O:22][C:20](=[O:21])[c:9]1[cH:8][cH:7][c:6]2[o:5][c:4]3[c:3]([S:2][CH3:1])[cH:16][c:15]([S:17][CH3:18])[cH:14][c:13]3[c:12](=[O:19])[c:11]2[cH:10]1 +03951640 [CH3:11][NH:10][c:7]1[n:8][n:9][c:5]([S:2]([CH3:1])(=[O:3])=[O:4])[s:6]1.[O:15]=[C:13](Cl)[Cl:12]>c1ccccc1>[CH3:11][N:10]([C:13](=[O:15])[Cl:12])[c:7]1[n:8][n:9][c:5]([S:2]([CH3:1])(=[O:3])=[O:4])[s:6]1 +03951640 [CH3:6][C:5]([CH3:7])([CH3:8])[c:9]1[n:13][n:12][c:11]([NH2:14])[s:10]1.[O:4]=[C:2](Cl)Cl>CCOC(C)=O>[CH3:6][C:5]([CH3:7])([CH3:8])[c:9]1[n:13][n:12][c:11]([N:14]=[C:2]=[O:4])[s:10]1 +03951846 [CH3:16][CH2:15][CH2:14][CH2:13][CH2:12][C:11](=[O:17])O[C:11](=[O:17])[CH2:12][CH2:13][CH2:14][CH2:15][CH3:16].[O:7]=[C:6]([OH:8])[c:5]1[cH:4][cH:3][c:2]([OH:1])[cH:10][cH:9]1.O=S(=O)(O)O>c1ccccc1>[CH3:16][CH2:15][CH2:14][CH2:13][CH2:12][C:11](=[O:17])[O:1][c:2]1[cH:3][cH:4][c:5]([C:6](=[O:7])[OH:8])[cH:9][cH:10]1 +03951957 [CH3:37][c:27]1[cH:28][cH:29][c:30]([S:33](=[O:34])(=[O:35])[OH:36])[cH:31][cH:32]1.[O:26]=[C:4]([CH2:5][NH:6]C(c1ccccc1)(c1ccccc1)c1ccccc1)[O:3][CH2:2][Cl:1]>CC(C)=O>[CH3:37][c:27]1[cH:32][cH:31][c:30]([S:33](=[O:35])(=[O:34])[OH:36])[cH:29][cH:28]1.[NH2:6][CH2:5][C:4](=[O:26])[O:3][CH2:2][Cl:1] +03951959 [H-].[Li+].[CH3:26][C:25](=[O:27])[O:24][c:7]1[cH:8][c:9]2[c:22]([c:5]([O:4][C:1]([CH3:2])=[O:3])[cH:6]1)[C@H:21]1[CH2:20][CH2:19][C@:17]3([CH3:18])[C:16](=[O:23])[CH2:15][CH2:14][C@H:13]3[C@H:12]1[CH2:11][CH2:10]2.CC(C)(C)O[Al](OC(C)(C)C)OC(C)(C)C>C1CCOC1>[CH3:26][C:25](=[O:27])[O:24][c:7]1[cH:8][c:9]2[c:22]([c:5]([O:4][C:1]([CH3:2])=[O:3])[cH:6]1)[C@H:21]1[CH2:20][CH2:19][C@:17]3([CH3:18])[C@@H:16]([OH:23])[CH2:15][CH2:14][C@H:13]3[C@H:12]1[CH2:11][CH2:10]2 +03951959 [H-].[Na+].[CH3:25][CH2:24][N:26]([CH2:31][CH3:32])[S:27](=[O:28])(=[O:29])Cl.[CH3:15][C@:14]12[CH2:16][CH2:17][C@@H:18]3[c:19]4[c:2]([OH:1])[cH:3][c:4]([OH:21])[cH:5][c:6]4[CH2:7][CH2:8][C@@H:9]3[C@@H:10]1[CH2:11][CH2:12][C:13]2=[O:20]>CS(C)=O>[CH3:25][CH2:24][N:26]([CH2:31][CH3:32])[S:27](=[O:28])(=[O:29])[O:21][c:4]1[cH:5][c:6]2[c:19]([c:2]([O:1][S:27](=[O:28])(=[O:29])[N:26]([CH2:24][CH3:25])[CH2:31][CH3:32])[cH:3]1)[C@H:18]1[CH2:17][CH2:16][C@:14]3([CH3:15])[C:13](=[O:20])[CH2:12][CH2:11][C@H:10]3[C@H:9]1[CH2:8][CH2:7]2 +03951967 Cc1cc2c(cc1S(N)(=O)=O)S(=O)(=O)NC=N2.N[S:15](=O)(=O)[c:4]1[cH:5][c:6]2[c:7]([cH:14][c:3]1[C:2](F)(F)F)[N:8]=[CH:9][NH:10][S:11]2(=[O:12])=[O:13]>>[CH3:2][c:3]1[cH:14][c:7]2[c:6]([cH:5][c:4]1[SH:15])[S:11](=[O:12])(=[O:13])[NH:10][CH:9]=[N:8]2 +03951967 [CH3:14][C:15](=O)Cl.[NH2:7][c:6]1[cH:8][c:9]([Cl:13])[c:10]([SH:12])[cH:11][c:5]1[S:1]([NH2:2])(=[O:3])=[O:4]>C1COCCO1>[CH3:14][C:15]1=[N:7][c:6]2[cH:8][c:9]([Cl:13])[c:10]([SH:12])[cH:11][c:5]2[S:1](=[O:4])(=[O:3])[NH:2]1 +03951971 [Na].[CH3:12][S:11][c:7]1[n:8][c:9](=[O:10])[n:4]([CH:1]([CH3:2])[CH3:3])[c:5](=[O:13])[nH:6]1.[CH3:15][C:16](=[O:18])Cl>C1CCOC1>[CH3:12][S:11][c:7]1[n:6][c:5](=[O:13])[n:4]([CH:1]([CH3:2])[CH3:3])[c:9](=[O:10])[n:8]1[C:16]([CH3:15])=[O:18] +03951976 [CH3:5][c:6]1[n:7][n:8][c:9]([NH2:11])[s:10]1.[O:4]=[C:2](Cl)Cl>CCOC(C)=O>[CH3:5][c:6]1[n:7][n:8][c:9]([N:11]=[C:2]=[O:4])[s:10]1 +03951976 [CH2:15]=[CH:14][CH2:13][NH:16][CH2:17][CH2:18][CH:19]=[O:20].[CH3:1][S:2](=[O:3])(=[O:4])[c:5]1[n:6][n:7][c:8]([N:10]=[C:11]=[O:12])[s:9]1>c1ccccc1>[CH2:15]=[CH:14][CH2:13][N:16]([CH2:17][CH2:18][CH:19]=[O:20])[C:11](=[O:12])[NH:10][c:8]1[n:7][n:6][c:5]([S:2]([CH3:1])(=[O:3])=[O:4])[s:9]1 +03951976 [CH3:13][NH:14][CH2:15][CH2:16][CH:17]=[O:18].[O:10]=[C:9]=[N:8][c:6]1[n:5][n:4][c:3]([C:2]([F:11])([F:12])[F:1])[s:7]1>c1ccccc1>[CH3:13][N:14]([CH2:15][CH2:16][CH:17]=[O:18])[C:9](=[O:10])[NH:8][c:6]1[n:5][n:4][c:3]([C:2]([F:12])([F:11])[F:1])[s:7]1 +03951976 [CH3:13][NH:14][CH2:15][CH2:16][CH:17]=[O:18].[CH3:2][C:1]([CH3:3])([CH3:4])[c:5]1[n:6][n:7][c:8]([N:10]=[C:11]=[O:12])[s:9]1>c1ccccc1>[CH3:13][N:14]([CH2:15][CH2:16][CH:17]=[O:18])[C:11](=[O:12])[NH:10][c:8]1[n:7][n:6][c:5]([C:1]([CH3:3])([CH3:2])[CH3:4])[s:9]1 +03951976 [OH-].[Na+].[CH:4]#[C:3][C:2]([CH3:5])([CH3:1])[NH2:6].[O:11]=[CH:10][CH2:9][CH2:8]Br>CO>[CH:4]#[C:3][C:2]([CH3:5])([CH3:1])[NH:6][CH2:8][CH2:9][CH:10]=[O:11] +03951976 Cl.[CH3:11][c:8]1[n:9][n:10][c:6]([NH:5][C:3](=[O:4])[N:2]([CH3:1])[CH2:12][CH2:13][CH:14]=[O:15])[s:7]1>O>[CH3:11][c:8]1[n:9][n:10][c:6]([N:5]2[C:3](=[O:4])[N:2]([CH3:1])[CH2:12][CH2:13][CH:14]2[OH:15])[s:7]1 +03951976 [CH3:5][S:6][c:7]1[n:8][n:9][c:10]([NH2:12])[s:11]1.[O:4]=[C:2](Cl)Cl>CCOC(C)=O>[CH3:5][S:6][c:7]1[n:8][n:9][c:10]([N:12]=[C:2]=[O:4])[s:11]1 +03951978 [Na+].[K+].[K+].[I-].O=C([O-])[O-].[O:7]=[C:6]([c:5]1[cH:4][cH:3][c:2]([F:1])[cH:14][cH:13]1)[CH:8](Br)[CH2:9][CH2:10][Cl:11].[OH:25][c:15]1[cH:16][cH:17][cH:18][c:19]2[cH:20][cH:21][cH:22][cH:23][c:24]12>CC(C)=O>[O:7]=[C:6]([c:5]1[cH:4][cH:3][c:2]([F:1])[cH:14][cH:13]1)[CH:8]([CH2:9][CH2:10][Cl:11])[O:25][c:15]1[cH:16][cH:17][cH:18][c:19]2[cH:20][cH:21][cH:22][cH:23][c:24]21 +03951980 Cl.Cl.Cl.Cl.Cl.CCN=C=O.[CH3:20][CH2:19][N:21](CC)[C:22](=[O:23])[N:24]1[CH2:29][CH:28]2[CH2:30][CH2:31][CH:25]1[CH2:26][N:27]2[CH3:32].CN1CC2CCC1CN2>CCOCC>[CH3:20][CH2:19][NH:21][C:22](=[O:23])[N:24]1[CH2:29][CH:28]2[CH2:30][CH2:31][CH:25]1[CH2:26][N:27]2[CH3:32] +03951980 Cl.Cl.CCN=C=O.[CH3:18][CH2:17][N:19](CC)[C:20](=[O:21])[N:22]1[CH2:28][CH:27]2[CH2:26][CH2:25][CH:24]([CH2:23]1)[N:29]2[CH3:30].CN1C2CCC1CNC2>>[CH3:18][CH2:17][NH:19][C:20](=[O:21])[N:22]1[CH2:28][CH:27]2[CH2:26][CH2:25][CH:24]([CH2:23]1)[N:29]2[CH3:30] +03951980 [OH-].[Na+].Cl.Cl.[CH3:19][CH2:18][O:17][C:15](=[O:16])Cl.[CH3:3][N:4]1[CH2:10][CH:9]2[CH2:8][CH2:7][CH:6]([CH2:5]1)[NH:11]2>ClC(Cl)Cl>[CH3:19][CH2:18][O:17][C:15](=[O:16])[N:11]1[CH:6]2[CH2:7][CH2:8][CH:9]1[CH2:10][N:4]([CH3:3])[CH2:5]2 +03951981 CS[C:7]1=[N:6][c:5]2[cH:16][cH:17][c:2]([Cl:1])[cH:3][c:4]2[NH:10][c:9]2[cH:11][s:12][cH:13][c:8]21.[CH3:18][N:19]1[CH2:20][CH2:21][NH:22][CH2:23][CH2:24]1>CC(=O)O>[CH3:18][N:19]1[CH2:20][CH2:21][N:22]([C:7]2=[N:6][c:5]3[cH:16][cH:17][c:2]([Cl:1])[cH:3][c:4]3[NH:10][c:9]3[cH:11][s:12][cH:13][c:8]32)[CH2:23][CH2:24]1 +03951981 O.CS[C:8]1=[N:7][c:6]2[cH:17][c:2]([OH:1])[cH:3][cH:4][c:5]2[NH:11][c:10]2[cH:12][s:13][cH:14][c:9]21.[cH:22]1[cH:21][cH:20][c:19]([N:25]2[CH2:26][CH2:27][NH:28][CH2:29][CH2:30]2)[cH:24][cH:23]1>CC(=O)O>[OH:1][c:2]1[cH:3][cH:4][c:5]2[c:6]([cH:17]1)[N:7]=[C:8]([N:28]1[CH2:27][CH2:26][N:25]([c:19]3[cH:20][cH:21][cH:22][cH:23][cH:24]3)[CH2:30][CH2:29]1)[c:9]1[cH:14][s:13][cH:12][c:10]1[NH:11]2 +03951981 CS[C:3]1=[N:9][c:8]2[cH:10][cH:11][cH:12][cH:13][c:7]2[NH:6][c:5]2[cH:14][s:15][cH:16][c:4]21.[CH2:18]1[CH2:17][NH:22][CH2:21][CH2:20][NH:19]1>CC(=O)O>[cH:14]1[s:15][cH:16][c:4]2[c:5]1[NH:6][c:7]1[cH:13][cH:12][cH:11][cH:10][c:8]1[N:9]=[C:3]2[N:19]1[CH2:18][CH2:17][NH:22][CH2:21][CH2:20]1 +03951981 [OH-].[K+].[CH3:19]OS(=O)(=O)O.[S:15]=[C:8]1[NH:7][c:6]2[cH:16][c:2]([Cl:1])[cH:3][cH:4][c:5]2[NH:11][c:10]2[cH:12][s:13][cH:14][c:9]21>CO.C1COCCO1>[CH3:19][S:15][C:8]1=[N:7][c:6]2[cH:16][c:2]([Cl:1])[cH:3][cH:4][c:5]2[NH:11][c:10]2[cH:12][s:13][cH:14][c:9]21 +03951982 [N:13]#[C:12][c:11]1[cH:14][cH:15][c:8](-[c:5]2[cH:4][cH:3][c:2](F)[cH:7][cH:6]2)[nH:9][c:10]1=[O:16].[CH2:19]1[CH2:20][CH2:21][N:17]([CH:22]2[CH2:23][CH2:24][NH:25][CH2:26][CH2:27]2)[CH2:18]1>CS(C)=O>[N:13]#[C:12][c:11]1[cH:14][cH:15][c:8](-[c:5]2[cH:4][cH:3][c:2]([N:25]3[CH2:24][CH2:23][CH:22]([N:17]4[CH2:18][CH2:19][CH2:20][CH2:21]4)[CH2:27][CH2:26]3)[cH:7][cH:6]2)[nH:9][c:10]1=[O:16] +03951982 [Na].[Na+].C[O-].CCCN1CCN(c2ccc(C(C)=O)cc2)CC1.[CH3:4][CH2:3][CH2:2][N:5]1[CH2:6][CH2:7][N:8]([c:11]2[cH:12][cH:13][c:14]([C:15](=O)[CH2:17][CH:18]=O)[cH:20][cH:21]2)[CH2:9][CH2:10]1.CCOC=O.[N:49]#[C:48][CH2:50][C:51]([NH2:53])=[O:52]>O.CC(=O)O.C1CCOC1>[CH3:4][CH2:3][CH2:2][N:5]1[CH2:6][CH2:7][N:8]([c:11]2[cH:12][cH:13][c:14](-[c:15]3[cH:17][cH:18][c:50]([C:48]#[N:49])[c:51](=[O:52])[nH:53]3)[cH:20][cH:21]2)[CH2:9][CH2:10]1.[CH2:20]1[CH2:14][CH2:15][NH:8][CH2:11][CH2:21]1 +03951982 [CH3:18][CH2:17][N:19]1[CH2:20][CH2:21][NH:22][CH2:23][CH2:24]1.[N:13]#[C:12][c:11]1[cH:14][cH:15][c:8](-[c:5]2[cH:4][cH:3][c:2](F)[cH:7][cH:6]2)[nH:9][c:10]1=[O:16]>CS(C)=O>[CH3:18][CH2:17][N:19]1[CH2:20][CH2:21][N:22]([c:2]2[cH:3][cH:4][c:5](-[c:8]3[cH:15][cH:14][c:11]([C:12]#[N:13])[c:10](=[O:16])[nH:9]3)[cH:6][cH:7]2)[CH2:23][CH2:24]1 +03951983 Cl.[K+].[K+].[CH3:23][O:22][c:17]1[cH:18][cH:19][cH:20][cH:21][c:16]1[N:13]1[CH2:12][CH2:11][N:10]([CH2:9][CH:8]([OH:24])[CH2:7][O:6][c:5]2[cH:25][cH:26][cH:27][cH:28][c:4]2[C:1](N)=[O:3])[CH2:15][CH2:14]1.O=C([O-:31])[O-]>>[CH3:23][O:22][c:17]1[cH:18][cH:19][cH:20][cH:21][c:16]1[N:13]1[CH2:12][CH2:11][N:10]([CH2:9][CH:8]([OH:24])[CH2:7][O:6][c:5]2[cH:25][cH:26][cH:27][cH:28][c:4]2[C:1](=[O:31])[OH:3])[CH2:15][CH2:14]1 +03951986 N.O.[CH3:17][O:16][c:11]1[cH:12][cH:13][cH:14][cH:15][c:10]1[N:7]1[CH2:6][CH2:5][N:4]([CH2:3][CH:2]([OH:1])[CH2:18][S:19][c:20]2[cH:21][cH:22][c:23]([F:26])[cH:24][cH:25]2)[CH2:9][CH2:8]1.O[OH:27]>CC(=O)O>[CH3:17][O:16][c:11]1[cH:12][cH:13][cH:14][cH:15][c:10]1[N:7]1[CH2:6][CH2:5][N:4]([CH2:3][CH:2]([OH:1])[CH2:18][S:19](=[O:27])[c:20]2[cH:25][cH:24][c:23]([F:26])[cH:22][cH:21]2)[CH2:9][CH2:8]1 +03951988 [CH3:20][CH2:19][O:18][C:16](=[O:17])[CH:21]=[C:22]1[NH:23][CH2:24][CH2:25][NH:26]1.[CH3:2][CH2:1][O:3][C:4](=[O:15])[C:5](=[CH:9][c:10]1[cH:11][cH:12][cH:13][o:14]1)[C:6]([CH3:8])=O>CCO>[CH3:20][CH2:19][O:18][C:16](=[O:17])[C:21]1=[C:22]2[NH:23][CH2:24][CH2:25][N:26]2[C:6]([CH3:8])=[C:5]([C:4](=[O:15])[O:3][CH2:1][CH3:2])[CH:9]1[c:10]1[cH:11][cH:12][cH:13][o:14]1 +03951989 [K+].[K+].[CH3:28][CH2:27]OS(=O)(=O)OCC.[CH3:2][CH2:1][n:3]1[cH:8][c:7]([C:9](=[O:10])[OH:11])[c:6](=[O:12])[c:5]2[cH:13][c:14]([CH3:16])[s:15][c:4]21.O=C([O-])[O-]>>[CH3:28][CH2:27][O:11][C:9](=[O:10])[c:7]1[cH:8][n:3]([CH2:1][CH3:2])[c:4]2[s:15][c:14]([CH3:16])[cH:13][c:5]2[c:6]1=[O:12] +03951989 [Br-:27].[CH3:17][CH2:16][O:15][C:13](=[O:14])[C:12](=[CH:11][NH:10][c:6]1[s:7][cH:8][cH:9][c:5]1[C:3](=[O:4])[O:2][CH3:1])[C:18](=[O:19])[O:20][CH2:21][CH3:22].ClC(Cl)Cl>c1ccncc1>[CH3:17][CH2:16][O:15][C:13](=[O:14])[C:12](=[CH:11][NH:10][c:6]1[s:7][c:8]([Br:27])[cH:9][c:5]1[C:3](=[O:4])[O:2][CH3:1])[C:18](=[O:19])[O:20][CH2:21][CH3:22] +03951989 [OH-].Cl.[K+].[CH3:20][CH2:19]I.CC[O:10][C:8](=[O:9])[c:7]1[cH:6][n:5][c:4]2[s:13][c:14]([CH3:16])[cH:15][c:3]2[c:2]1[OH:1]>O.CCO>[CH3:20][CH2:19][n:5]1[cH:6][c:7]([C:8](=[O:9])[OH:10])[c:2](=[O:1])[c:3]2[cH:15][c:14]([CH3:16])[s:13][c:4]21 +03951990 CC[O:3][C:4](=O)[CH:5]=[CH:6][c:7]1[cH:8][cH:9][cH:10][cH:11][cH:12]1.[CH3:15][CH2:14][O:16][C:17](=[O:22])[CH2:18][C:19](=[NH:21])[NH2:20]>CCO>[CH3:15][CH2:14][O:16][C:17](=[O:22])[C:18]1=[C:19]([NH2:20])[NH:21][C:4](=[O:3])[CH2:5][CH:6]1[c:7]1[cH:8][cH:9][cH:10][cH:11][cH:12]1 +03951992 CC[O:3][C:4](=O)[CH:5]=[CH:6][c:7]1[cH:8][cH:9][cH:10][cH:11][cH:12]1.[CH3:15][CH2:14][O:16][C:17](=[O:22])[CH2:18][C:19](=[NH:21])[NH2:20]>CCO>[CH3:15][CH2:14][O:16][C:17](=[O:22])[C:18]1=[C:19]([NH2:20])[NH:21][C:4](=[O:3])[CH2:5][CH:6]1[c:7]1[cH:8][cH:9][cH:10][cH:11][cH:12]1 +03951993 [CH3:21][CH2:20][O:19][C:18]([NH2:22])=[CH:17][C:16](=[O:23])[O:15][CH:12]([CH3:13])[CH3:14].O=[CH:7][c:6]1[cH:9][cH:10][cH:11][c:4]([N+:1](=[O:2])[O-:3])[cH:5]1>CCO>[CH3:21][CH2:20][O:19][C:18]1=[N:22][C:18]([NH2:22])=[C:17]([C:16](=[O:23])[O:15][CH:12]([CH3:13])[CH3:14])[CH:7]([c:6]2[cH:9][cH:10][cH:11][c:4]([N+:1](=[O:2])[O-:3])[cH:5]2)[CH:17]1[C:16](=[O:23])[O:15][CH:12]([CH3:14])[CH3:13] +03951999 [CH3:9][c:10]1[cH:11][cH:12][c:13]2[o:17][n:16][c:15](-[c:18]3[cH:19][cH:20][c:21]([Cl:24])[cH:22][cH:23]3)[c:14]2[cH:25]1.O=C(OOC(=O)c1ccccc1)c1ccccc1.O=C1CCC(=O)N1[Br:1]>ClC(Cl)(Cl)Cl>[Cl:24][c:21]1[cH:20][cH:19][c:18](-[c:15]2[n:16][o:17][c:13]3[cH:12][cH:11][c:10]([CH2:9][Br:1])[cH:25][c:14]32)[cH:23][cH:22]1 +03951999 [Na+].[Na+].C[c:12]1[cH:13][cH:14][c:9]([C:8](=[N:17][OH:18])[c:5]2[cH:4][cH:3][c:2]([Cl:1])[cH:7][cH:6]2)[c:10](O)[cH:11]1.O=[C:22]([O-])[O-].c1noc2ccccc12>O>[CH3:22][c:11]1[cH:12][cH:13][c:14]2[o:18][n:17][c:8](-[c:5]3[cH:6][cH:7][c:2]([Cl:1])[cH:3][cH:4]3)[c:9]2[cH:10]1 +03951999 [CH3:17][c:14]1[cH:15][cH:16][c:11]2[o:10][n:9][c:8](-[c:5]3[cH:4][cH:3][c:2]([Cl:1])[cH:7][cH:6]3)[c:12]2[cH:13]1.O=C1CCC(=O)N1[Br:18]>ClC(Cl)(Cl)Cl>[Cl:1][c:2]1[cH:7][cH:6][c:5](-[c:8]2[n:9][o:10][c:11]3[cH:16][cH:15][c:14]([CH2:17][Br:18])[cH:13][c:12]32)[cH:4][cH:3]1 +03951999 [CH3:2][CH2:1][c:3]1[cH:8][cH:7][cH:6][c:5]([OH:9])[cH:4]1.[O:12]=[C:11](Cl)[c:13]1[cH:14][cH:15][c:16]([Cl:17])[cH:18][cH:19]1>>[CH3:2][CH2:1][c:3]1[cH:8][cH:7][c:6]([C:11](=[O:12])[c:13]2[cH:14][cH:15][c:16]([Cl:17])[cH:18][cH:19]2)[c:5]([OH:9])[cH:4]1 +03952001 [CH3:4][CH2:3][CH2:2][CH2:1][S:5](=[O:6])(=[O:7])[c:8]1[n:12][cH:11][nH:10][n:9]1.[CH3:15][CH2:14][CH2:13][N:16]([CH2:20][CH2:21][CH3:22])[C:17](=[O:18])Cl.C1CCOC1>CCN(CC)CC>[CH3:4][CH2:3][CH2:2][CH2:1][S:5](=[O:7])(=[O:6])[c:8]1[n:12][cH:11][n:10]([C:17](=[O:18])[N:16]([CH2:13][CH2:14][CH3:15])[CH2:20][CH2:21][CH3:22])[n:9]1 +03952001 [CH2:3]=[CH:2][CH2:1][N:4]([CH2:8][CH:9]=[CH2:10])[C:5](=[O:6])Cl.[CH3:12][CH2:11][S:13][c:14]1[n:18][cH:17][nH:16][n:15]1.CCN(CC)CC>C1CCOC1>[CH2:3]=[CH:2][CH2:1][N:4]([CH2:8][CH:9]=[CH2:10])[C:5](=[O:6])[n:16]1[cH:17][n:18][c:14]([S:13][CH2:11][CH3:12])[n:15]1 +03952001 [CH2:12]=[CH:11][CH2:10][N:13]([CH2:17][CH:18]=[CH2:19])[C:14](=[O:15])Cl.[CH3:1][S:2](=[O:3])(=[O:4])[c:5]1[n:9][cH:8][nH:7][n:6]1.C1CCOC1>CCN(CC)CC>[CH2:12]=[CH:11][CH2:10][N:13]([CH2:17][CH:18]=[CH2:19])[C:14](=[O:15])[n:7]1[cH:8][n:9][c:5]([S:2]([CH3:1])(=[O:3])=[O:4])[n:6]1 +03952001 [CH3:13][CH2:12][CH2:11][N:14]([CH2:18][CH2:19][CH3:20])[C:15](=[O:16])Cl.[CH3:3][CH2:2][CH2:1][S:4](=[O:5])[c:6]1[n:10][cH:9][nH:8][n:7]1.C1CCOC1>CCN(CC)CC>[CH3:13][CH2:12][CH2:11][N:14]([CH2:18][CH2:19][CH3:20])[C:15](=[O:16])[n:8]1[cH:9][n:10][c:6]([S:4](=[O:5])[CH2:1][CH2:2][CH3:3])[n:7]1 +03952001 [CH2:15]=[CH:14][CH2:13][N:16]([CH2:20][CH:21]=[CH2:22])[C:17](=[O:18])Cl.[CH3:4][CH2:3][CH:1]([CH3:2])[S:5](=[O:6])(=[O:7])[c:8]1[n:12][cH:11][nH:10][n:9]1.C1CCOC1>CCN(CC)CC>[CH2:15]=[CH:14][CH2:13][N:16]([CH2:20][CH:21]=[CH2:22])[C:17](=[O:18])[n:10]1[cH:11][n:12][c:8]([S:5](=[O:7])(=[O:6])[CH:1]([CH3:2])[CH2:3][CH3:4])[n:9]1 +03952001 [CH3:3][CH2:2][CH2:1][S:4](=[O:5])[c:6]1[n:10][cH:9][nH:8][n:7]1.[CH3:12][CH2:11][N:13]([CH2:17][CH3:18])[C:14](=[O:15])Cl.C1CCOC1>CCN(CC)CC>[CH3:3][CH2:2][CH2:1][S:4](=[O:5])[c:6]1[n:10][cH:9][n:8]([C:14](=[O:15])[N:13]([CH2:11][CH3:12])[CH2:17][CH3:18])[n:7]1 +03952001 [CH3:12][CH2:11][CH2:10][CH2:9][N:13]([CH2:17][CH2:18][CH3:19])[C:14](=[O:15])Cl.[CH3:2][CH2:1][S:3][c:4]1[n:8][cH:7][nH:6][n:5]1.C1CCOC1>CCN(CC)CC>[CH3:12][CH2:11][CH2:10][CH2:9][N:13]([CH2:17][CH2:18][CH3:19])[C:14](=[O:15])[n:6]1[cH:7][n:8][c:4]([S:3][CH2:1][CH3:2])[n:5]1 +03952001 [CH3:15][CH2:14][CH2:13][N:16]([CH2:20][CH2:21][CH3:22])[C:17](=[O:18])Cl.CCN(CC)CC.[CH3:3][CH:2]([CH3:4])[CH2:1][S:5](=[O:6])(=[O:7])[c:8]1[n:12][cH:11][nH:10][n:9]1>C1CCOC1>[CH3:15][CH2:14][CH2:13][N:16]([CH2:20][CH2:21][CH3:22])[C:17](=[O:18])[n:10]1[cH:11][n:12][c:8]([S:5](=[O:7])(=[O:6])[CH2:1][CH:2]([CH3:3])[CH3:4])[n:9]1 +03952001 [CH2:13]=[CH:12][CH2:11][N:14]([CH2:18][CH:19]=[CH2:20])[C:15](=[O:16])Cl.[CH3:4][CH2:3][CH2:2][CH2:1][S:5][c:6]1[n:10][cH:9][nH:8][n:7]1.C1CCOC1>CCN(CC)CC>[CH2:13]=[CH:12][CH2:11][N:14]([CH2:18][CH:19]=[CH2:20])[C:15](=[O:16])[n:8]1[cH:9][n:10][c:6]([S:5][CH2:1][CH2:2][CH2:3][CH3:4])[n:7]1 +03952001 [OH-].[Na+].CCN.[CH3:2][CH2:1][NH:3][CH2:4][CH2:5][O:6][CH3:7].COCCBr.[O:21]=[C:19](Cl)[Cl:18]>>[CH3:2][CH2:1][N:3]([CH2:4][CH2:5][O:6][CH3:7])[C:19](=[O:21])[Cl:18] +03952001 [CH2:3]=[CH:2][CH2:1][O:4][CH2:5][CH2:6][S:7][c:8]1[n:12][cH:11][nH:10][n:9]1.CCN(CC)CC.[CH3:21][CH2:20][N:22]([CH2:26][CH3:27])[C:23](=[O:24])Cl>C1CCOC1>[CH2:3]=[CH:2][CH2:1][O:4][CH2:5][CH2:6][S:7][c:8]1[n:12][cH:11][n:10]([C:23](=[O:24])[N:22]([CH2:20][CH3:21])[CH2:26][CH3:27])[n:9]1 +03952001 [CH2:3]=[CH:2][CH2:1][N:4]([CH2:13][CH:14]=[CH2:15])[S:5](=[O:6])(=[O:7])[c:8]1[n:12][cH:11][nH:10][n:9]1.CCN(CC)CC.[CH3:17][CH2:16][N:18]([CH2:22][CH3:23])[C:19](=[O:20])Cl>C1CCOC1>[CH2:15]=[CH:14][CH2:13][N:4]([CH2:1][CH:2]=[CH2:3])[S:5](=[O:6])(=[O:7])[c:8]1[n:12][cH:11][n:10]([C:19](=[O:20])[N:18]([CH2:16][CH3:17])[CH2:22][CH3:23])[n:9]1 +03952001 [CH2:13]=[CH:12][CH2:11][N:14]([CH2:18][CH:19]=[CH2:20])[C:15](=[O:16])Cl.[CH3:3][CH:2]([CH3:4])[CH2:1][S:5][c:6]1[n:10][cH:9][nH:8][n:7]1.C1CCOC1>CCN(CC)CC>[CH2:13]=[CH:12][CH2:11][N:14]([CH2:18][CH:19]=[CH2:20])[C:15](=[O:16])[n:8]1[cH:9][n:10][c:6]([S:5][CH2:1][CH:2]([CH3:3])[CH3:4])[n:7]1 +03952003 [CH3:19][C:18](=[O:20])[N:14]([C:3]1=[C:2](Cl)[C:10](=[O:11])[c:9]2[c:5]([cH:6][n:7][n:8]2[CH3:12])[C:4]1=[O:13])[CH:15]1[CH2:16][CH2:17]1.[NH2:24][CH:21]1[CH2:22][CH2:23]1>CCO>[CH3:19][C:18](=[O:20])[N:14]([C:3]1=[C:2]([NH:24][CH:21]2[CH2:22][CH2:23]2)[C:10](=[O:11])[c:9]2[c:5]([cH:6][n:7][n:8]2[CH3:12])[C:4]1=[O:13])[CH:15]1[CH2:16][CH2:17]1 +03952006 O.[CH3:20][CH2:19][c:17]1[cH:18][c:9]2[c:10]([s:16]1)[NH:11][C:12](=S)[CH2:13][N:14]=[C:8]2[c:3]1[cH:4][cH:5][cH:6][cH:7][c:2]1[Cl:1].[NH2:23][NH2:22]>CCO>[CH3:20][CH2:19][c:17]1[cH:18][c:9]2[c:10]([s:16]1)[N:11]=[C:12]([NH:22][NH2:23])[CH2:13][N:14]=[C:8]2[c:3]1[cH:4][cH:5][cH:6][cH:7][c:2]1[Cl:1] +03952006 [CH3:33][CH2:32][c:20]1[cH:21][c:22]([C:23](=[O:31])[c:24]2[cH:29][cH:28][cH:27][cH:26][c:25]2[Cl:30])[c:18](-[n:17]2[c:16]([CH3:34])[n:15][n:14][c:13]2[CH2:12]OS(=O)(=O)c2ccc(C)cc2)[s:19]1.[CH3:35][N:36]1[CH2:37][CH2:38][NH:39][CH2:40][CH2:41]1.[O:44]=[C:43]([OH:42])[C:45](=[O:47])[OH:46]>CCO>[CH3:33][CH2:32][c:20]1[cH:21][c:22]([C:23](=[O:31])[c:24]2[cH:29][cH:28][cH:27][cH:26][c:25]2[Cl:30])[c:18](-[n:17]2[c:16]([CH3:34])[n:15][n:14][c:13]2[CH2:12][N:39]2[CH2:38][CH2:37][N:36]([CH3:35])[CH2:41][CH2:40]2)[s:19]1.[O:42]=[C:43]([OH:44])[C:45](=[O:46])[OH:47].[O:42]=[C:43]([OH:44])[C:45](=[O:46])[OH:47] +03952007 [CH3:20][c:7]1[n:6][cH:5][c:4]([N+:1](=[O:2])[O-:3])[n:8]1[CH2:9][CH2:10][O:11][C:12](=[O:19])[c:13]1[cH:14][cH:15][cH:16][cH:17][cH:18]1>CCO>[CH3:4][N:8]([CH3:9])[CH:7]=[CH:20][c:7]1[n:6][cH:5][c:4]([N+:1](=[O:2])[O-:3])[n:8]1[CH2:9][CH2:10][O:11][C:12](=[O:19])[c:13]1[cH:14][cH:15][cH:16][cH:17][cH:18]1 +03952008 CC[O:17][C:18](=O)[C:19](=[C:20]([NH2:24])OCC)[c:25]1[cH:26][cH:27][cH:28][cH:29][cH:30]1.Cc1ccc(S(=O)(=O)O)cc1.[CH3:12][c:11]1[cH:10][cH:9][c:5]([CH2:6][NH:7][NH2:8])[cH:4][c:3]1[C:2]([F:13])([F:14])[F:1]>CCO>[CH3:12][c:11]1[cH:10][cH:9][c:5]([CH2:6][n:7]2[nH:8][c:20]([NH2:24])[c:19](-[c:25]3[cH:30][cH:29][cH:28][cH:27][cH:26]3)[c:18]2=[O:17])[cH:4][c:3]1[C:2]([F:1])([F:14])[F:13] +03952010 O.[NH2:19][NH2:18].O=[C:9]([CH:8]=[CH:1][c:2]1[cH:3][cH:4][cH:5][cH:6][cH:7]1)[c:11]1[cH:12][cH:13][cH:14][cH:15][cH:16]1>CO>[cH:5]1[cH:4][cH:3][c:2]([C:1]2=[N:18][NH:19][CH:9]([c:11]3[cH:12][cH:13][cH:14][cH:15][cH:16]3)[CH2:8]2)[cH:7][cH:6]1 +03952012 [OH-].[Na+].CC[O:19][C:17](=[O:18])[CH2:16][c:13]1[cH:12][cH:11][c:10]([C:8](=[O:9])[c:7]2[cH:6][cH:5][c:4]([N+:1](=[O:2])[O-:3])[cH:23][cH:22]2)[n:14]1[CH3:15]>CCO>[CH3:15][n:14]1[c:13]([CH2:16][C:17](=[O:18])[OH:19])[cH:12][cH:11][c:10]1[C:8](=[O:9])[c:7]1[cH:6][cH:5][c:4]([N+:1](=[O:2])[O-:3])[cH:23][cH:22]1 +03952012 [OH-].[Na+].CC[OH:24].[CH3:17][CH:13]([C:14](=[O:15])[OH:16])[c:10]1[cH:9][cH:8][c:7]([CH2:6][c:5]2[cH:4][cH:3][c:2]([Cl:1])[cH:19][cH:18]2)[n:11]1[CH3:12]>O>[CH3:17][CH:13]([C:14](=[O:15])[OH:16])[c:10]1[cH:9][cH:8][c:7]([C:6](=[O:24])[c:5]2[cH:4][cH:3][c:2]([Cl:1])[cH:19][cH:18]2)[n:11]1[CH3:12] +03952012 [OH-:20].[OH2:25].[Na+].CCO.[CH3:14][CH2:13][n:12]1[c:11]([CH2:15][C:16]#N)[cH:10][cH:9][c:8]1[C:6](=[O:7])[c:5]1[cH:4][cH:3][c:2]([Cl:1])[cH:19][cH:18]1>>[CH3:14][CH2:13][n:12]1[c:11]([CH2:15][C:16](=[O:20])[OH:25])[cH:10][cH:9][c:8]1[C:6](=[O:7])[c:5]1[cH:4][cH:3][c:2]([Cl:1])[cH:19][cH:18]1 +03952012 N.[OH-:19].[OH2:23].[Na+].Cl.[CH3:13][n:12]1[c:11]([CH2:14][C:15]#N)[cH:10][cH:9][c:8]1[C:6](=[O:7])[c:5]1[cH:4][cH:3][c:2]([Cl:1])[cH:18][cH:17]1>CCO>[CH3:13][n:12]1[c:11]([CH2:14][C:15](=[O:19])[OH:23])[cH:10][cH:9][c:8]1[C:6](=[O:7])[c:5]1[cH:4][cH:3][c:2]([Cl:1])[cH:18][cH:17]1 +03952012 [Al+3].[Cl-].[Cl-].[Cl-].CCOC(=O)Cc1c(C)c[nH]c1C.[CH3:19][CH2:18][O:17][C:15](=[O:16])[CH2:14][c:10]1[c:11]([CH3:13])[nH:12][c:8]([C:6](=[O:7])[c:5]2[cH:4][cH:3][c:2](Cl)[cH:22][cH:21]2)[c:9]1[CH3:20].O=C(Cl)c1ccc(Cl)cc1>S=C=S>[CH3:19][CH2:18][O:17][C:15](=[O:16])[CH2:14][c:10]1[c:11]([CH3:13])[nH:12][c:8]([C:6](=[O:7])[c:5]2[cH:21][cH:22][cH:2][cH:3][cH:4]2)[c:9]1[CH3:20] +03952012 [Al+3].[Cl-].[Cl-].[Cl-].Cl.[CH3:5][c:6]1[cH:7][cH:8][c:9]([C:11](=[O:12])Cl)[s:10]1.[CH3:14][n:15]1[cH:19][cH:18][cH:17][c:16]1[CH2:20][C:21]#[N:22]>ClCCCl>[CH3:5][c:6]1[cH:7][cH:8][c:9]([C:11](=[O:12])[c:19]2[cH:18][cH:17][c:16]([CH2:20][C:21]#[N:22])[n:15]2[CH3:14])[s:10]1 +03952012 [OH-].[Na+].Cl.CC[O:17][C:15](=[O:16])[CH2:14][c:11]1[cH:10][c:9]([CH3:20])[c:8]([C:6](=[O:7])[c:5]2[cH:4][cH:3][c:2]([Cl:1])[cH:22][cH:21]2)[n:12]1[CH3:13]>>[CH3:20][c:9]1[cH:10][c:11]([CH2:14][C:15](=[O:16])[OH:17])[n:12]([CH3:13])[c:8]1[C:6](=[O:7])[c:5]1[cH:4][cH:3][c:2]([Cl:1])[cH:22][cH:21]1 +03952012 [CH3:25][CH2:24][O:23][C:21](=[O:22])[CH2:20][c:5]1[c:4](C(=O)O)[c:8]([CH3:9])[c:7]([C:10](=[O:11])[c:12]2[cH:13][cH:14][c:15]([CH3:18])[cH:16][cH:17]2)[n:6]1[CH3:19].c1ccc2ncccc2c1>[Cu+2].O=[Cr]([O-])[O-]>[CH3:25][CH2:24][O:23][C:21](=[O:22])[CH2:20][c:5]1[cH:4][c:8]([CH3:9])[c:7]([C:10](=[O:11])[c:12]2[cH:13][cH:14][c:15]([CH3:18])[cH:16][cH:17]2)[n:6]1[CH3:19] +03952012 [Al+3].[Cl-].[Cl-].[Cl-].Cl.CC(Cl)Cl.[CH3:19][n:20]1[cH:24][cH:23][cH:22][c:21]1[CH2:25][C:26]#[N:27].[O:13]=[C:12](Cl)[c:11]1[cH:15][cH:16][cH:17][cH:18][c:10]1[Cl:9]>>[CH3:19][n:20]1[c:21]([CH2:25][C:26]#[N:27])[cH:22][cH:23][c:24]1[C:12](=[O:13])[c:11]1[cH:15][cH:16][cH:17][cH:18][c:10]1[Cl:9] +03952012 [Al+3].[Cl-].[Cl-].[Cl-].Cl.[CH3:18][c:9]1[cH:10][cH:11][c:12]([C:15](=[O:16])Cl)[cH:13][cH:14]1.CC(Cl)Cl.[CH3:19][n:20]1[cH:24][cH:23][cH:22][c:21]1[CH2:25][C:26]#[N:27]>>[CH3:18][c:9]1[cH:10][cH:11][c:12]([C:15](=[O:16])[c:24]2[cH:23][cH:22][c:21]([CH2:25][C:26]#[N:27])[n:20]2[CH3:19])[cH:13][cH:14]1 +03952012 [Al+3].[Cl-].[Cl-].[Cl-].Cl.[CH3:28][CH2:27][O:26][C:24](=[O:25])[CH2:23][c:19]1[cH:20][cH:21][cH:22][n:18]1[CH3:17].[O:9]=[C:8](Cl)[c:7]1[cH:6][cH:5][c:4]([N+:1](=[O:2])[O-:3])[cH:12][cH:11]1>ClCCl>[CH3:28][CH2:27][O:26][C:24](=[O:25])[CH2:23][c:19]1[cH:20][cH:21][c:22]([C:8](=[O:9])[c:7]2[cH:6][cH:5][c:4]([N+:1](=[O:2])[O-:3])[cH:12][cH:11]2)[n:18]1[CH3:17] +03952013 [ClH:15].[CH3:13][c:9]1[cH:8][cH:7][c:6]([O:5][CH2:4][CH2:3][CH:2]([CH3:14])[CH3:1])[cH:12][c:10]1[NH2:11]>>[ClH:15].[CH3:13][c:9]1[cH:8][cH:7][c:6]([O:5][CH2:4][CH2:3][CH:2]([CH3:14])[CH3:1])[cH:12][c:10]1[NH2:11] +03952013 [K+].[K+].[CH3:16][CH2:15][O:14][C:12](=[O:13])[c:7]1[cH:6][c:5](=[O:17])[c:4]2[cH:3][c:2]([OH:1])[cH:11][cH:10][c:9]2[s:8]1.CC(C)=O.[CH3:21][CH:20]([CH3:22])[CH2:19][CH2:18]Br.O=C([O-])[O-]>CCO>[CH3:16][CH2:15][O:14][C:12](=[O:13])[c:7]1[cH:6][c:5](=[O:17])[c:4]2[cH:3][c:2]([O:1][CH2:18][CH2:19][CH:20]([CH3:22])[CH3:21])[cH:11][cH:10][c:9]2[s:8]1 +03952015 [CH2:11]1[CH2:10][O:9][CH2:8][CH2:7][O:6][CH2:5][C:4]2([CH2:19][O:18][CH2:17][CH2:16][O:15][CH2:14][CH2:13][NH:12]1)[CH2:3][O:2][CH2:1]2.[CH2:21]1[CH2:20][O:22]1>CO>[OH:22][CH2:21][CH2:20][N:12]1[CH2:13][CH2:14][O:15][CH2:16][CH2:17][O:18][CH2:19][C:4]2([CH2:5][O:6][CH2:7][CH2:8][O:9][CH2:10][CH2:11]1)[CH2:1][O:2][CH2:3]2 +03952016 [CH2:5]=[CH:6][CH2:7][CH2:8][CH2:9]CCC.[CH3:3][C:2]([CH3:1])=[O:4].O=S(=O)([OH:14])O>>[CH3:9][CH2:8][CH2:7][CH2:6][CH2:5][CH2:3][CH:2]([OH:4])[CH2:1][OH:14] +03952016 [OH-].O.[Na+].[Cl-].[CH3:13][CH2:12][CH2:11][CH2:10][CH2:9][CH2:8][CH2:7][CH2:6][OH:14].O=S(=O)(O)O.Cl[CH2:2][CH:3]1[CH2:4]O1>CC(C)=O>[CH3:13][CH2:12][CH2:11][CH2:10][CH2:9][CH2:8][CH2:7][CH2:6][O:14][CH2:2][CH2:3][CH2:4][CH2:6][CH2:7][CH2:8][CH2:9][CH3:10] +03952017 [CH3:2][C:1](=[O:3])[c:4]1[cH:5][cH:6][cH:7][c:8]2[c:14]1[CH2:13][CH2:12][c:11]1[cH:15][cH:16][cH:17][cH:18][c:10]1[C:9]2=[O:19].Cc1ccccc1.Cc1ccc(S(=O)(=O)O)cc1.O[CH2:22][CH2:21][OH:20]>O>[CH3:2][C:1]1([c:4]2[cH:5][cH:6][cH:7][c:8]3[c:14]2[CH2:13][CH2:12][c:11]2[cH:15][cH:16][cH:17][cH:18][c:10]2[C:9]3=[O:19])[O:3][CH2:22][CH2:21][O:20]1 +03952017 CCOC(=O)Cl.[CH3:1][c:2]1[cH:3][cH:4][cH:5][c:6]2[c:12]1[CH2:11][CH2:10][c:9]1[cH:13][cH:14][cH:15][cH:16][c:8]1[CH:7]2[CH2:17][CH2:18][CH2:19][N:20]([CH3:21])C>c1ccccc1>[CH3:21][NH:20][CH2:19][CH2:18][CH2:17][CH:7]1[c:8]2[cH:16][cH:15][cH:14][cH:13][c:9]2[CH2:10][CH2:11][c:12]2[c:2]([CH3:1])[cH:3][cH:4][cH:5][c:6]21 +03952017 N.[Na].[CH3:3][c:4]1[cH:5][cH:6][cH:7][c:8]2[c:14]1CC[c:5]1[cH:6][cH:7][cH:8][cH:14][c:4]1[C:3]2=O.[CH3:25][c:26]1[cH:27][cH:28][cH:29][c:30]2[c:36]1[CH2:35][CH2:34][c:33]1[cH:37][cH:38][cH:39][cH:40][c:32]1[C:31]2([OH:41])[CH2:42][CH2:43][CH2:44][NH2:45].NCCCCl>O.Cc1ccccc1>[CH3:25][c:26]1[cH:27][cH:28][cH:29][c:30]2[c:36]1[CH2:35][CH2:34][c:33]1[cH:37][cH:38][cH:39][cH:40][c:32]1[C:31]2([OH:41])[CH2:42][CH2:43][CH2:44][N:45]=[CH:3][c:4]1[cH:5][cH:6][cH:7][cH:8][cH:14]1 +03952021 [ClH:1].[CH3:39][O:38][c:37]1[cH:36][cH:35][c:6]([CH2:7][CH2:8][NH:9][CH2:10][CH:11]([OH:34])[c:12]2[cH:13][c:14]([O:26]Cc3ccccc3)[cH:15][c:16]([O:18]Cc3ccccc3)[cH:17]2)[cH:5][c:4]1[O:3][CH3:2]>[C].O.[Pd].CC(C)O>[ClH:1].[CH3:39][O:38][c:37]1[cH:36][cH:35][c:6]([CH2:7][CH2:8][NH:9][CH2:10][CH:11]([OH:34])[c:12]2[cH:13][c:14]([OH:26])[cH:15][c:16]([OH:18])[cH:17]2)[cH:5][c:4]1[O:3][CH3:2] +03952024 COS(=O)(=O)O[CH3:9].[CH3:1][c:2]1[cH:3][cH:4][c:5]([CH2:6][SH:7])[o:8]1>>[CH3:9][S:7][CH2:6][c:5]1[cH:4][cH:3][c:2]([CH3:1])[o:8]1.[CH3:1][c:2]1[cH:3][cH:4][c:5]([CH2:6][SH:7])[o:8]1 +03952024 [Li].[H][H].[Li]CCCC.[CH3:1][c:2]1[cH:6][s:5][cH:4][n:3]1.[CH3:18][CH:17]([CH3:19])[CH2:16][CH:15]=[O:20]>>[CH3:1][c:2]1[cH:6][s:5][c:4]([CH:15]([OH:20])[CH2:16][CH:17]([CH3:18])[CH3:19])[n:3]1 +03952025 CN(C)[CH:3]=[O:4].[O:9]=[C:8]([CH2:7]Br)[c:10]1[cH:11][cH:12][cH:13][cH:14][cH:15]1>O>[O:4]=[C:3]1[CH2:12][CH2:11][CH2:10][c:8]2[o:9][c:8](-[c:10]3[cH:11][cH:12][cH:13][cH:14][cH:15]3)[cH:7][c:7]21 +03952026 [SH:20][CH2:19][c:14]1[cH:15][cH:16][cH:17][s:18]1.[cH:11]1[cH:12][s:13][c:9]([CH2:8]O[CH2:8][c:9]2[cH:10][cH:11][cH:12][s:13]2)[cH:10]1>>[cH:16]1[cH:17][s:18][c:14]([CH2:19][S:20][CH2:8][c:9]2[cH:10][cH:11][cH:12][s:13]2)[cH:15]1 +03952026 [CH2:8]=[O:9].[CH3:2][CH2:1][n:3]1[cH:4][cH:5][cH:6][cH:7]1>>[CH3:2][CH2:1][n:3]1[cH:7][cH:6][cH:5][c:4]1[CH:8]=[O:9] +03952031 [FH:1].[CH3:19][C:18](=[O:20])[C@H:17]1[CH2:16][CH2:15][C@H:14]2[C@@H:13]3[CH2:12][CH2:11][C@H:10]4[CH2:9][C@@H:8]5[O:6][C@@H:7]5[CH2:26][C@:25]4([CH3:27])[C@H:24]3[C:23](=[O:28])[CH2:22][C@:21]12[CH3:29].NC(N)=O>[Na+].O=C([O-])O>[CH3:19][C:18](=[O:20])[C@H:17]1[CH2:16][CH2:15][C@H:14]2[C@@H:13]3[CH2:12][CH2:11][C@H:10]4[CH2:9][C@H:8]([OH:6])[C@@H:7]([F:1])[CH2:26][C@:25]4([CH3:27])[C@H:24]3[C:23](=[O:28])[CH2:22][C@:21]12[CH3:29] +03952031 [ClH:25].[CH3:14][C:13](=[O:15])[C:12]1=[CH:11][CH2:10][C@H:9]2[C@@H:8]3[CH2:7][CH2:6][C@H:5]4[CH2:4][C@@H:3]5[O:1][C@@H:2]5[CH2:21][C@:20]4([CH3:22])[C@H:19]3[C:18](=[O:23])[CH2:17][C@:16]12[CH3:24]>ClC(Cl)Cl>[CH3:14][C:13](=[O:15])[C:12]1=[CH:11][CH2:10][C@H:9]2[C@@H:8]3[CH2:7][CH2:6][C@H:5]4[CH2:4][C@H:3]([OH:1])[C@@H:2]([Cl:25])[CH2:21][C@:20]4([CH3:22])[C@H:19]3[C:18](=[O:23])[CH2:17][C@:16]12[CH3:24] +03952031 [K+].[CH3:14][C:13](=[O:15])[C@H:12]1[CH2:11][CH2:10][C@H:9]2[C@@H:8]3[CH2:7][CH2:6][C@H:5]4[CH2:4][C@@H:3]5[O:1][C@@H:2]5[CH2:21][C@:20]4([CH3:22])[C@H:19]3[C:18](=[O:23])[CH2:17][C@:16]12[CH3:24].O=C([O-])O.O=S(=O)(O)O.OCC[Br:25]>>[CH3:14][C:13](=[O:15])[C@H:12]1[CH2:11][CH2:10][C@H:9]2[C@@H:8]3[CH2:7][CH2:6][C@H:5]4[CH2:4][C@H:3]([OH:1])[C@@H:2]([Br:25])[CH2:21][C@:20]4([CH3:22])[C@H:19]3[C:18](=[O:23])[CH2:17][C@:16]12[CH3:24] +03952031 [CH3:17][C:16](=[O:18])[C@H:15]1[CH2:14][CH2:13][C@H:12]2[C@@H:11]3[CH2:10][CH2:9][C@H:8]4[CH2:7][C@H:6]([OH:28])[C@@H:5]([O:4][CH2:3][CH2:2][Cl:1])[CH2:24][C@:23]4([CH3:25])[C@H:22]3[C:21](=[O:26])[CH2:20][C@:19]12[CH3:27].Cc1ccc(S(=O)(=O)O)cc1.O[CH2:31][CH2:30][OH:29]>c1ccccc1>[CH3:17][C:16]1([C@H:15]2[CH2:14][CH2:13][C@H:12]3[C@@H:11]4[CH2:10][CH2:9][C@H:8]5[CH2:7][C@H:6]([OH:28])[C@@H:5]([O:4][CH2:3][CH2:2][Cl:1])[CH2:24][C@:23]5([CH3:25])[C@H:22]4[C:21](=[O:26])[CH2:20][C@@:19]32[CH3:27])[O:18][CH2:31][CH2:30][O:29]1 +03952031 [NH4+].[Cl-].[I-].[Li][CH2:1][CH2:2][CH2:3][CH3:4].CCCCCC.[CH3:26][C:25](=[O:27])[C@H:24]1[CH2:23][CH2:22][C@H:21]2[C@@H:20]3[CH2:19][CH2:18][C@H:17]4[CH2:16][C@@H:15]5[O:13][C@@H:14]5[CH2:33][C@:32]4([CH3:34])[C@H:31]3[C:30](=[O:35])[CH2:29][C@:28]12[CH3:36]>>[CH3:4][CH2:3][CH2:2][CH2:1][C@H:14]1[CH2:33][C@@:32]2([CH3:34])[C@@H:17]([CH2:18][CH2:19][C@H:20]3[C@@H:21]4[CH2:22][CH2:23][C@H:24]([C:25]([CH3:26])=[O:27])[C@@:28]4([CH3:36])[CH2:29][C:30](=[O:35])[C@@H:31]32)[CH2:16][C@@H:15]1[OH:13] +03952031 [Na+].[CH3:14][C:13](=[O:15])[C@H:12]1[CH2:11][CH2:10][C@H:9]2[C@@H:8]3[CH2:7][CH2:6][C@H:5]4[CH2:4][C@@H:3]5[O:1][C@@H:2]5[CH2:21][C@:20]4([CH3:22])[C@H:19]3[C:18](=[O:23])[CH2:17][C@:16]12[CH3:24].[N:26]#[C:25][CH2:27][CH2:28][OH:29].O=C([O-])O>CCOC(C)=O>[CH3:14][C:13](=[O:15])[C@H:12]1[CH2:11][CH2:10][C@H:9]2[C@@H:8]3[CH2:7][CH2:6][C@H:5]4[CH2:4][C@H:3]([OH:1])[C@@H:2]([O:29][CH2:28][CH2:27][C:25]#[N:26])[CH2:21][C@:20]4([CH3:22])[C@H:19]3[C:18](=[O:23])[CH2:17][C@:16]12[CH3:24] +03952031 O.[CH3:25][C:24](=[O:26])[C@H:23]1[CH2:22][CH2:21][C@H:20]2[C@@H:19]3[CH2:18][CH2:17][C@H:16]4[CH2:15][C@@H:14]5[O:12][C@@H:13]5[CH2:32][C@:31]4([CH3:33])[C@H:30]3[C:29](=[O:34])[CH2:28][C@:27]12[CH3:35].[CH3:11][c:1]1[cH:2][cH:3][c:4]([S:7](=[O:8])(=[O:9])[OH:10])[cH:5][cH:6]1>c1ccccc1>[CH3:25][C:24](=[O:26])[C@H:23]1[CH2:22][CH2:21][C@H:20]2[C@@H:19]3[CH2:18][CH2:17][C@H:16]4[CH2:15][C@H:14]([OH:12])[C@@H:13]([O:9][S:7](=[O:8])(=[O:10])[c:4]5[cH:5][cH:6][c:1]([CH3:11])[cH:2][cH:3]5)[CH2:32][C@:31]4([CH3:33])[C@H:30]3[C:29](=[O:34])[CH2:28][C@:27]12[CH3:35] +03952031 [Na+].[I-:33].[CH3:28][CH2:27][O:26][C@H:25]1[CH2:24][C@@:23]2([CH3:29])[C@@H:8]([CH2:9][CH2:10][C@H:11]3[C@@H:12]4[CH2:13][CH2:14][C@H:15]([C:16]([CH3:17])=[O:18])[C@@:19]4([CH3:31])[CH2:20][C:21](=[O:30])[C@@H:22]32)[CH2:7][C@@H:6]1[O:5][C:3](=[O:4])[CH2:2]Cl>CC(C)=O>[CH3:28][CH2:27][O:26][C@H:25]1[CH2:24][C@@:23]2([CH3:29])[C@@H:8]([CH2:9][CH2:10][C@H:11]3[C@@H:12]4[CH2:13][CH2:14][C@H:15]([C:16]([CH3:17])=[O:18])[C@@:19]4([CH3:31])[CH2:20][C:21](=[O:30])[C@@H:22]32)[CH2:7][C@@H:6]1[O:5][C:3](=[O:4])[CH2:2][I:33] +03952031 [ClH:25].[CH3:14][C:13](=[O:15])[C:12]1=[CH:11][CH2:10][C@H:9]2[C@@H:8]3[CH2:7][CH2:6][C@H:5]4[CH2:4][C@@H:3]5[O:1][C@@H:2]5[CH2:21][C@:20]4([CH3:22])[C@H:19]3[C:18](=[O:23])[CH2:17][C@:16]12[CH3:24]>ClC(Cl)Cl>[CH3:14][C:13](=[O:15])[C:12]1=[CH:11][CH2:10][C@H:9]2[C@@H:8]3[CH2:7][CH2:6][C@H:5]4[CH2:4][C@H:3]([OH:1])[C@@H:2]([Cl:25])[CH2:21][C@:20]4([CH3:22])[C@H:19]3[C:18](=[O:23])[CH2:17][C@:16]12[CH3:24] +03952031 Cl.[CH3:22][C:21](=[O:23])[C:20]1=[CH:19][CH2:18][C@H:17]2[C@@H:16]3[CH2:15][CH2:14][C@H:13]4[CH2:12][C@@H:11](OS(=O)(=O)c5ccc(C)cc5)[CH2:30][CH2:29][C@:28]4([CH3:31])[C@H:27]3[CH2:26][CH2:25][C@:24]12[CH3:32].Cc1cc(C)nc(C)c1>>[CH3:22][C:21](=[O:23])[C:20]1=[CH:19][CH2:18][C@H:17]2[C@@H:16]3[CH2:15][CH2:14][C@H:13]4[CH2:12][CH:11]=[CH:30][CH2:29][C@:28]4([CH3:31])[C@H:27]3[CH2:26][CH2:25][C@:24]12[CH3:32] +03952031 [K+].CC(=O)[O-].[CH3:22][C:21](=[O:23])[C:20]1=[CH:19][CH2:18][C@H:17]2[C@@H:16]3[CH2:15][CH2:14][C@H:13]4[CH2:12][C@@H:11]([O:10]S(=O)(=O)c5ccc(C)cc5)[CH2:30][CH2:29][C@:28]4([CH3:31])[C@H:27]3[C:26](=[O:32])[CH2:25][C@:24]12[CH3:33].CN(C)C=O>O>[CH3:22][C:21](=[O:23])[C:20]1=[CH:19][CH2:18][C@H:17]2[C@@H:16]3[CH2:15][CH2:14][C@H:13]4[CH2:12][C@H:11]([OH:10])[CH2:30][CH2:29][C@:28]4([CH3:31])[C@H:27]3[C:26](=[O:32])[CH2:25][C@:24]12[CH3:33] +03952031 [CH3:14][C:13](=[O:15])[C@H:12]1[CH2:11][CH2:10][C@H:9]2[C@@H:8]3[CH2:7][CH2:6][C@H:5]4C[C@@H]5O[C@@H]5[CH2:21][C@:20]4(C)[C@H:19]3[C:18](=[O:23])[CH2:17][C@:16]12[CH3:24].[O-:26][Cl+3]([O-])([O-])O.[CH2:32]1[CH2:33][CH2:34][O:30][CH2:31]1>O>[CH3:14][C:13](=[O:15])[C@H:12]1[CH2:11][CH2:10][C@H:9]2[C@@H:8]3[CH2:7][CH2:6][C@H:31]4[CH2:32][C@H:33]([OH:26])[C@@H:34]([OH:30])[CH2:21][C@:20]4([CH3:5])[C@H:19]3[C:18](=[O:23])[CH2:17][C@:16]12[CH3:24] +03952033 C[CH2:29][CH2:28][OH:31].[CH3:27][O:26][C:24](=[O:25])[CH2:23][CH2:22][CH2:21][CH2:20][c:16]1[cH:17][cH:18][cH:19][o:15]1.CC(C)OC(=O)CCC[c:2]1[cH:3]cc[o:1]1>[PH4+].CCO>[CH3:29][CH2:28][O:31][CH:19]1[CH:18]=[CH:17][C:16]([CH2:20][CH2:21][CH2:22][CH2:23][C:24](=[O:25])[O:26][CH3:27])([O:1][CH2:2][CH3:3])[O:15]1 diff --git a/Code/PgSQL/rdkit/expected/avalon.out b/Code/PgSQL/rdkit/expected/avalon.out new file mode 100644 index 000000000..cddd19bec --- /dev/null +++ b/Code/PgSQL/rdkit/expected/avalon.out @@ -0,0 +1,18 @@ +select tanimoto_sml(avalon_fp('c1ccccc1'::mol),avalon_fp('c1ccccc1'::mol)); + tanimoto_sml +-------------- + 1 +(1 row) + +select tanimoto_sml(avalon_fp('c1ccccc1'::mol),avalon_fp('c1ccccc1'::mol,true)); + tanimoto_sml +-------------- + 0.25 +(1 row) + +select tanimoto_sml(avalon_fp('c1ccccc1'::mol),avalon_fp('c1ccccn1'::mol)); + tanimoto_sml +------------------- + 0.333333333333333 +(1 row) + diff --git a/Code/PgSQL/rdkit/expected/reaction.out b/Code/PgSQL/rdkit/expected/reaction.out new file mode 100644 index 000000000..c871f851e --- /dev/null +++ b/Code/PgSQL/rdkit/expected/reaction.out @@ -0,0 +1,912 @@ +SET rdkit.ignore_reaction_agents=false; +SET rdkit.agent_FP_bit_ratio=0.2; +SET rdkit.rdkit_difference_FP_weight_agents=1; +SET rdkit.rdkit_difference_FP_weight_nonagents=10; +SET rdkit.move_unmmapped_reactants_to_agents=true; +SET rdkit.threshold_unmapped_reactant_atoms=0.2; +SET rdkit.init_reaction=true; +SELECT reaction_from_smiles('c1ccccc1>>c1cccnc1'); + reaction_from_smiles +---------------------- + c1ccccc1>>c1ccncc1 +(1 row) + +SELECT reaction_from_smiles('c1ccccc1>CC(=O)O>c1cccnc1'); + reaction_from_smiles +--------------------------- + c1ccccc1>CC(=O)O>c1ccncc1 +(1 row) + +SELECT reaction_from_smarts('[c1:1][c:2][c:3][c:4]c[c1:5]>CC(=O)O>[c1:1][c:2][c:3][c:4]n[c1:5]'); + reaction_from_smarts +----------------------------------------------------------------------------- + [cH2:5]c[cH:4][cH:3][cH:2][cH2:1]>CC(=O)O>[cH2:1][cH:2][cH:3][cH:4]n[cH2:5] +(1 row) + +SELECT reaction_from_smarts('C(F)(F)F.[c1:1][c:2][c:3][c:4]c[c1:5]>CC(=O)O>[c1:1][c:2][c:3][c:4]n[c1:5]'); + reaction_from_smarts +------------------------------------------------------------------------------------ + [cH2:5]c[cH:4][cH:3][cH:2][cH2:1]>CC(=O)O.FC(F)F>[cH2:1][cH:2][cH:3][cH:4]n[cH2:5] +(1 row) + +SELECT reaction_from_smarts('c1ccc[n,c]c1>>c1nccnc1'); + reaction_from_smarts +---------------------- + c1ccncc1>>c1cnccn1 +(1 row) + +SELECT reaction_to_smiles(reaction_from_smiles('c1ccccc1>>c1cccnc1')); + reaction_to_smiles +-------------------- + c1ccccc1>>c1ccncc1 +(1 row) + +SELECT reaction_to_smiles(reaction_from_smarts('c1ccc[n,c]c1>>c1nccnc1')); + reaction_to_smiles +-------------------- + c1ccncc1>>c1cnccn1 +(1 row) + +SELECT reaction_to_smarts(reaction_from_smarts('c1ccc[n,c]c1>>c1nccnc1')); + reaction_to_smarts +------------------------------------------------------------ + c1:,-c:,-c:,-c:,-[n,c]:,-c:,-1>>c1:,-n:,-c:,-c:,-n:,-c:,-1 +(1 row) + +SELECT reaction_to_smarts('c1cccnc1>>c1nccnc1'::reaction); + reaction_to_smarts +-------------------------------------------------------------------- + [#6]1:[#6]:[#6]:[#6]:[#7]:[#6]:1>>[#6]1:[#7]:[#6]:[#6]:[#7]:[#6]:1 +(1 row) + +SELECT reaction_to_ctab(reaction_from_smiles('c1ccccc1>>c1cccnc1')); + reaction_to_ctab +----------------------------------------------------------------------- + $RXN + + + + RDKit + + + + 1 1 + + $MOL + + + + RDKit + + + + 6 6 0 0 0 0 0 0 0 0999 V2000 + + 0.0000 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0+ + 0.0000 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0+ + 0.0000 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0+ + 0.0000 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0+ + 0.0000 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0+ + 0.0000 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0+ + 1 2 4 0 + + 2 3 4 0 + + 3 4 4 0 + + 4 5 4 0 + + 5 6 4 0 + + 6 1 4 0 + + M END + + $MOL + + + + RDKit + + + + 6 6 0 0 0 0 0 0 0 0999 V2000 + + 0.0000 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0+ + 0.0000 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0+ + 0.0000 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0+ + 0.0000 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0+ + 0.0000 0.0000 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0+ + 0.0000 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0+ + 1 2 4 0 + + 2 3 4 0 + + 3 4 4 0 + + 4 5 4 0 + + 5 6 4 0 + + 6 1 4 0 + + M END + + +(1 row) + +SELECT reaction_numreactants(reaction_from_smiles('[Cl].c1ccccc1>>c1cccnc1.[OH2]')); + reaction_numreactants +----------------------- + 2 +(1 row) + +SELECT reaction_numproducts(reaction_from_smiles('[Cl].c1ccccc1>>c1cccnc1.[OH2]')); + reaction_numproducts +---------------------- + 2 +(1 row) + +SELECT reaction_numagents(reaction_from_smiles('[Cl].c1ccccc1>CC(=O)O.[Na+]>c1cccnc1.[OH2]')); + reaction_numagents +-------------------- + 2 +(1 row) + +SELECT reaction_numagents(reaction_from_smarts('C(F)(F)F.[c1:1][c:2][c:3][c:4]c[c1:5]>CC(=O)O>[c1:1][c:2][c:3][c:4]n[c1:5]')); + reaction_numagents +-------------------- + 2 +(1 row) + +SET rdkit.move_unmmapped_reactants_to_agents=false; +SELECT reaction_numagents(reaction_from_smarts('C(F)(F)F.[c1:1][c:2][c:3][c:4]c[c1:5]>CC(=O)O>[c1:1][c:2][c:3][c:4]n[c1:5]')); + reaction_numagents +-------------------- + 1 +(1 row) + +SET rdkit.move_unmmapped_reactants_to_agents=true; +SET rdkit.threshold_unmapped_reactant_atoms=0.9; +SELECT reaction_numagents(reaction_from_smarts('C(F)(F)F.[c1:1][c:2][c:3][c:4]c[c1:5]>CC(=O)O>[c1:1][c:2][c:3][c:4]n[c1:5]')); + reaction_numagents +-------------------- + 3 +(1 row) + +SET rdkit.threshold_unmapped_reactant_atoms=0.2; +SELECT reaction_from_ctab('$RXN + + RDKit + + 1 1 +$MOL + + RDKit + + 6 6 0 0 0 0 0 0 0 0999 V2000 + 0.0000 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 4 0 + 2 3 4 0 + 3 4 4 0 + 4 5 4 0 + 5 6 4 0 + 6 1 4 0 +M END +$MOL + + RDKit + + 6 6 0 0 0 0 0 0 0 0999 V2000 + 0.0000 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 0.0000 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 4 0 + 2 3 4 0 + 3 4 4 0 + 4 5 4 0 + 5 6 4 0 + 6 1 4 0 +M END'); + reaction_from_ctab +-------------------- + c1ccccc1>>c1ccncc1 +(1 row) + +CREATE TABLE tmp (id integer, tmprxn text); +\copy tmp from 'data/reaction_test_data.out.rsmi'; +select * into pgreactions from (select id,reaction_from_smiles(tmprxn::cstring) rxn from tmp) as r where r is not null; +SET rdkit.move_unmmapped_reactants_to_agents=false; +select * into pgreactions_unchanged from (select id,reaction_from_smiles(tmprxn::cstring) rxn from tmp) as r where r is not null; +DROP table tmp; +SET rdkit.move_unmmapped_reactants_to_agents=true; +SELECT count(*) FROM pgreactions; + count +------- + 1000 +(1 row) + +SELECT count(*) FROM pgreactions_unchanged; + count +------- + 1000 +(1 row) + +SELECT SUM(reaction_numreactants(rxn)) FROM pgreactions; + sum +------ + 1898 +(1 row) + +SELECT SUM(reaction_numreactants(rxn)) FROM pgreactions_unchanged; + sum +------ + 3517 +(1 row) + +SELECT SUM(reaction_numproducts(rxn)) FROM pgreactions; + sum +------ + 1157 +(1 row) + +SELECT SUM(reaction_numproducts(rxn)) FROM pgreactions_unchanged; + sum +------ + 1157 +(1 row) + +SELECT SUM(reaction_numagents(rxn)) FROM pgreactions; + sum +------ + 2528 +(1 row) + +SELECT SUM(reaction_numagents(rxn)) FROM pgreactions_unchanged; + sum +----- + 909 +(1 row) + +CREATE INDEX rxnidx ON pgreactions USING gist(rxn); +SET enable_indexscan=off; +SET enable_bitmapscan=off; +SET enable_seqscan=on; +SELECT count(*) FROM pgreactions WHERE rxn@>'c1ccccc1>>c1ccncc1'; + count +------- + 47 +(1 row) + +SELECT count(*) FROM pgreactions WHERE rxn@>'c1cnccc1>>c1ccccc1'; + count +------- + 50 +(1 row) + +SELECT count(*) FROM pgreactions WHERE 'c1ccccc1>>c1ccncc1'<@rxn; + count +------- + 47 +(1 row) + +SELECT count(*) FROM pgreactions WHERE 'c1cnccc1>>c1ccccc1'<@rxn; + count +------- + 50 +(1 row) + +SELECT count(*) FROM pgreactions WHERE rxn@>'c1ccccc1>>'; + count +------- + 667 +(1 row) + +SELECT count(*) FROM pgreactions WHERE rxn@>'c1cnccc1>>'; + count +------- + 83 +(1 row) + +SELECT count(*) FROM pgreactions WHERE 'c1ccccc1>>'<@rxn; + count +------- + 667 +(1 row) + +SELECT count(*) FROM pgreactions WHERE 'c1cnccc1>>'<@rxn; + count +------- + 83 +(1 row) + +SELECT count(*) FROM pgreactions WHERE rxn@>'>>c1ccncc1'; + count +------- + 79 +(1 row) + +SELECT count(*) FROM pgreactions WHERE rxn@>'>>c1ccccc1'; + count +------- + 650 +(1 row) + +SELECT count(*) FROM pgreactions WHERE '>>c1ccncc1'<@rxn; + count +------- + 79 +(1 row) + +SELECT count(*) FROM pgreactions WHERE '>>c1ccccc1'<@rxn; + count +------- + 650 +(1 row) + +SET enable_indexscan=on; +SET enable_bitmapscan=on; +SET enable_seqscan=off; +SELECT count(*) FROM pgreactions WHERE rxn@>'c1ccccc1>>c1ccncc1'; + count +------- + 47 +(1 row) + +SELECT count(*) FROM pgreactions WHERE rxn@>'c1cnccc1>>c1ccccc1'; + count +------- + 50 +(1 row) + +SELECT count(*) FROM pgreactions WHERE 'c1ccccc1>>c1ccncc1'<@rxn; + count +------- + 47 +(1 row) + +SELECT count(*) FROM pgreactions WHERE 'c1cnccc1>>c1ccccc1'<@rxn; + count +------- + 50 +(1 row) + +SELECT count(*) FROM pgreactions WHERE rxn@>'c1ccccc1>>'; + count +------- + 667 +(1 row) + +SELECT count(*) FROM pgreactions WHERE rxn@>'c1cnccc1>>'; + count +------- + 83 +(1 row) + +SELECT count(*) FROM pgreactions WHERE 'c1ccccc1>>'<@rxn; + count +------- + 667 +(1 row) + +SELECT count(*) FROM pgreactions WHERE 'c1cnccc1>>'<@rxn; + count +------- + 83 +(1 row) + +SELECT count(*) FROM pgreactions WHERE rxn@>'>>c1ccncc1'; + count +------- + 79 +(1 row) + +SELECT count(*) FROM pgreactions WHERE rxn@>'>>c1ccccc1'; + count +------- + 650 +(1 row) + +SELECT count(*) FROM pgreactions WHERE '>>c1ccncc1'<@rxn; + count +------- + 79 +(1 row) + +SELECT count(*) FROM pgreactions WHERE '>>c1ccccc1'<@rxn; + count +------- + 650 +(1 row) + +SELECT count(*) FROM pgreactions WHERE rxn?>'c1ccccc1>>c1ccncc1'; + count +------- + 47 +(1 row) + +SELECT count(*) FROM pgreactions WHERE rxn?>'c1cnccc1>>c1ccccc1'; + count +------- + 50 +(1 row) + +SELECT count(*) FROM pgreactions WHERE 'c1ccccc1>>c1ccncc1'?>c1ccccc1'?'c1ccccc1>>'; + count +------- + 667 +(1 row) + +SELECT count(*) FROM pgreactions WHERE rxn?>'c1cnccc1>>'; + count +------- + 83 +(1 row) + +SELECT count(*) FROM pgreactions WHERE 'c1ccccc1>>'?>'?'>>c1ccncc1'; + count +------- + 79 +(1 row) + +SELECT count(*) FROM pgreactions WHERE rxn?>'>>c1ccccc1'; + count +------- + 650 +(1 row) + +SELECT count(*) FROM pgreactions WHERE '>>c1ccncc1'?>c1ccccc1'?>c1ccncc1',1), reaction_difference_fp('c1ccccc1>>c1ccncc1',1)); + tanimoto_sml +-------------- + 1 +(1 row) + +SELECT tanimoto_sml(reaction_difference_fp('c1ccccc1>>c1ccncc1',1), reaction_difference_fp('c1ncccc1>>c1ncncc1',1)); + tanimoto_sml +------------------- + 0.636363636363636 +(1 row) + +SELECT tanimoto_sml(reaction_difference_fp('c1ccccc1>CC(=O)O.[Na+]>c1ccncc1',1), reaction_difference_fp('c1ccccc1>CC(=O)O.[Na+]>c1ccncc1',1)); + tanimoto_sml +-------------- + 1 +(1 row) + +SELECT tanimoto_sml(reaction_difference_fp('c1ccccc1>CC(=O)O.[Na+]>c1ccncc1',1), reaction_difference_fp('c1ncccc1>[Na+]>c1ncncc1',1)); + tanimoto_sml +------------------- + 0.603448275862069 +(1 row) + +SELECT tanimoto_sml(reaction_difference_fp('c1ccccc1>>c1ccncc1',2), reaction_difference_fp('c1ccccc1>>c1ccncc1',2)); + tanimoto_sml +-------------- + 1 +(1 row) + +SELECT tanimoto_sml(reaction_difference_fp('c1ccccc1>>c1ccncc1',2), reaction_difference_fp('c1ncccc1>>c1ncncc1',2)); + tanimoto_sml +-------------- + 0.2 +(1 row) + +SELECT tanimoto_sml(reaction_difference_fp('c1ccccc1>CC(=O)O.[Na+]>c1ccncc1',2), reaction_difference_fp('c1ccccc1>CC(=O)O.[Na+]>c1ccncc1',2)); + tanimoto_sml +-------------- + 1 +(1 row) + +SELECT tanimoto_sml(reaction_difference_fp('c1ccccc1>CC(=O)O.[Na+]>c1ccncc1',2), reaction_difference_fp('c1ncccc1>[Na+]>c1ncncc1',2)); + tanimoto_sml +-------------- + 0.2 +(1 row) + +SELECT tanimoto_sml(reaction_difference_fp('c1ccccc1>>c1ccncc1',3), reaction_difference_fp('c1ccccc1>>c1ccncc1',3)); + tanimoto_sml +-------------- + 1 +(1 row) + +SELECT tanimoto_sml(reaction_difference_fp('c1ccccc1>>c1ccncc1',3), reaction_difference_fp('c1ncccc1>>c1ncncc1',3)); + tanimoto_sml +------------------- + 0.454545454545455 +(1 row) + +SELECT tanimoto_sml(reaction_difference_fp('c1ccccc1>CC(=O)O.[Na+]>c1ccncc1',3), reaction_difference_fp('c1ccccc1>CC(=O)O.[Na+]>c1ccncc1',3)); + tanimoto_sml +-------------- + 1 +(1 row) + +SELECT tanimoto_sml(reaction_difference_fp('c1ccccc1>CC(=O)O.[Na+]>c1ccncc1',3), reaction_difference_fp('c1ncccc1>[Na+]>c1ncncc1',3)); + tanimoto_sml +------------------- + 0.447368421052632 +(1 row) + +SELECT tanimoto_sml(reaction_structural_bfp('c1ccccc1>>c1ccncc1',1), reaction_structural_bfp('c1ccccc1>>c1ccncc1',1)); + tanimoto_sml +-------------- + 1 +(1 row) + +SELECT tanimoto_sml(reaction_structural_bfp('c1ccccc1>>c1ccncc1',1), reaction_structural_bfp('c1ncccc1>>c1ncncc1',1)); + tanimoto_sml +------------------- + 0.620689655172414 +(1 row) + +SELECT tanimoto_sml(reaction_structural_bfp('c1ccccc1>CC(=O)O.[Na+]>c1ccncc1',1), reaction_structural_bfp('c1ccccc1>CC(=O)O.[Na+]>c1ccncc1',1)); + tanimoto_sml +-------------- + 1 +(1 row) + +SELECT tanimoto_sml(reaction_structural_bfp('c1ccccc1>CC(=O)O.[Na+]>c1ccncc1',1), reaction_structural_bfp('c1ncccc1>[Na+]>c1ncncc1',1)); + tanimoto_sml +------------------- + 0.514285714285714 +(1 row) + +SELECT tanimoto_sml(reaction_structural_bfp('c1ccccc1>>c1ccncc1',2), reaction_structural_bfp('c1ccccc1>>c1ccncc1',2)); + tanimoto_sml +-------------- + 1 +(1 row) + +SELECT tanimoto_sml(reaction_structural_bfp('c1ccccc1>>c1ccncc1',2), reaction_structural_bfp('c1ncccc1>>c1ncncc1',2)); + tanimoto_sml +------------------- + 0.461538461538462 +(1 row) + +SELECT tanimoto_sml(reaction_structural_bfp('c1ccccc1>CC(=O)O.[Na+]>c1ccncc1',2), reaction_structural_bfp('c1ccccc1>CC(=O)O.[Na+]>c1ccncc1',2)); + tanimoto_sml +-------------- + 1 +(1 row) + +SELECT tanimoto_sml(reaction_structural_bfp('c1ccccc1>CC(=O)O.[Na+]>c1ccncc1',2), reaction_structural_bfp('c1ncccc1>[Na+]>c1ncncc1',2)); + tanimoto_sml +------------------- + 0.461538461538462 +(1 row) + +SELECT tanimoto_sml(reaction_structural_bfp('c1ccccc1>>c1ccncc1',3), reaction_structural_bfp('c1ccccc1>>c1ccncc1',3)); + tanimoto_sml +-------------- + 1 +(1 row) + +SELECT tanimoto_sml(reaction_structural_bfp('c1ccccc1>>c1ccncc1',3), reaction_structural_bfp('c1ncccc1>>c1ncncc1',3)); + tanimoto_sml +------------------- + 0.409090909090909 +(1 row) + +SELECT tanimoto_sml(reaction_structural_bfp('c1ccccc1>CC(=O)O.[Na+]>c1ccncc1',3), reaction_structural_bfp('c1ccccc1>CC(=O)O.[Na+]>c1ccncc1',3)); + tanimoto_sml +-------------- + 1 +(1 row) + +SELECT tanimoto_sml(reaction_structural_bfp('c1ccccc1>CC(=O)O.[Na+]>c1ccncc1',3), reaction_structural_bfp('c1ncccc1>[Na+]>c1ncncc1',3)); + tanimoto_sml +-------------- + 0.34375 +(1 row) + +SELECT tanimoto_sml(reaction_structural_bfp('c1ccccc1>>c1ccncc1',4), reaction_structural_bfp('c1ccccc1>>c1ccncc1',4)); + tanimoto_sml +-------------- + 1 +(1 row) + +SELECT tanimoto_sml(reaction_structural_bfp('c1ccccc1>>c1ccncc1',4), reaction_structural_bfp('c1ncccc1>>c1ncncc1',4)); + tanimoto_sml +------------------ + 0.27710843373494 +(1 row) + +SELECT tanimoto_sml(reaction_structural_bfp('c1ccccc1>CC(=O)O.[Na+]>c1ccncc1',4), reaction_structural_bfp('c1ccccc1>CC(=O)O.[Na+]>c1ccncc1',4)); + tanimoto_sml +-------------- + 1 +(1 row) + +SELECT tanimoto_sml(reaction_structural_bfp('c1ccccc1>CC(=O)O.[Na+]>c1ccncc1',4), reaction_structural_bfp('c1ncccc1>[Na+]>c1ncncc1',4)); + tanimoto_sml +------------------- + 0.237113402061856 +(1 row) + +SELECT tanimoto_sml(reaction_structural_bfp('c1ccccc1>>c1ccncc1',5), reaction_structural_bfp('c1ccccc1>>c1ccncc1',5)); + tanimoto_sml +-------------- + 1 +(1 row) + +SELECT tanimoto_sml(reaction_structural_bfp('c1ccccc1>>c1ccncc1',5), reaction_structural_bfp('c1ncccc1>>c1ncncc1',5)); + tanimoto_sml +------------------- + 0.771428571428571 +(1 row) + +SELECT tanimoto_sml(reaction_structural_bfp('c1ccccc1>CC(=O)O.[Na+]>c1ccncc1',5), reaction_structural_bfp('c1ccccc1>CC(=O)O.[Na+]>c1ccncc1',5)); + tanimoto_sml +-------------- + 1 +(1 row) + +SELECT tanimoto_sml(reaction_structural_bfp('c1ccccc1>CC(=O)O.[Na+]>c1ccncc1',5), reaction_structural_bfp('c1ncccc1>[Na+]>c1ncncc1',5)); + tanimoto_sml +------------------- + 0.578571428571429 +(1 row) + +SET rdkit.agent_FP_bit_ratio=0.5; +SET rdkit.rdkit_difference_FP_weight_agents=-3; +SET rdkit.rdkit_difference_FP_weight_nonagents=7; +SELECT tanimoto_sml(reaction_difference_fp('c1ccccc1>>c1ccncc1',1), reaction_difference_fp('c1ccccc1>>c1ccncc1',1)); + tanimoto_sml +-------------- + 1 +(1 row) + +SELECT tanimoto_sml(reaction_difference_fp('c1ccccc1>>c1ccncc1',1), reaction_difference_fp('c1ncccc1>>c1ncncc1',1)); + tanimoto_sml +------------------- + 0.636363636363636 +(1 row) + +SELECT tanimoto_sml(reaction_difference_fp('c1ccccc1>CC(=O)O.[Na+]>c1ccncc1',1), reaction_difference_fp('c1ccccc1>CC(=O)O.[Na+]>c1ccncc1',1)); + tanimoto_sml +-------------- + 1 +(1 row) + +SELECT tanimoto_sml(reaction_difference_fp('c1ccccc1>CC(=O)O.[Na+]>c1ccncc1',1), reaction_difference_fp('c1ncccc1>[Na+]>c1ncncc1',1)); + tanimoto_sml +-------------- + 0.546875 +(1 row) + +SELECT tanimoto_sml(reaction_difference_fp('c1ccccc1>>c1ccncc1',2), reaction_difference_fp('c1ccccc1>>c1ccncc1',2)); + tanimoto_sml +-------------- + 1 +(1 row) + +SELECT tanimoto_sml(reaction_difference_fp('c1ccccc1>>c1ccncc1',2), reaction_difference_fp('c1ncccc1>>c1ncncc1',2)); + tanimoto_sml +-------------- + 0.2 +(1 row) + +SELECT tanimoto_sml(reaction_difference_fp('c1ccccc1>CC(=O)O.[Na+]>c1ccncc1',2), reaction_difference_fp('c1ccccc1>CC(=O)O.[Na+]>c1ccncc1',2)); + tanimoto_sml +-------------- + 1 +(1 row) + +SELECT tanimoto_sml(reaction_difference_fp('c1ccccc1>CC(=O)O.[Na+]>c1ccncc1',2), reaction_difference_fp('c1ncccc1>[Na+]>c1ncncc1',2)); + tanimoto_sml +-------------- + 0.2 +(1 row) + +SELECT tanimoto_sml(reaction_difference_fp('c1ccccc1>>c1ccncc1',3), reaction_difference_fp('c1ccccc1>>c1ccncc1',3)); + tanimoto_sml +-------------- + 1 +(1 row) + +SELECT tanimoto_sml(reaction_difference_fp('c1ccccc1>>c1ccncc1',3), reaction_difference_fp('c1ncccc1>>c1ncncc1',3)); + tanimoto_sml +------------------- + 0.454545454545455 +(1 row) + +SELECT tanimoto_sml(reaction_difference_fp('c1ccccc1>CC(=O)O.[Na+]>c1ccncc1',3), reaction_difference_fp('c1ccccc1>CC(=O)O.[Na+]>c1ccncc1',3)); + tanimoto_sml +-------------- + 1 +(1 row) + +SELECT tanimoto_sml(reaction_difference_fp('c1ccccc1>CC(=O)O.[Na+]>c1ccncc1',3), reaction_difference_fp('c1ncccc1>[Na+]>c1ncncc1',3)); + tanimoto_sml +-------------- + 0.424 +(1 row) + +SELECT tanimoto_sml(reaction_structural_bfp('c1ccccc1>>c1ccncc1',1), reaction_structural_bfp('c1ccccc1>>c1ccncc1',1)); + tanimoto_sml +-------------- + 1 +(1 row) + +SELECT tanimoto_sml(reaction_structural_bfp('c1ccccc1>>c1ccncc1',1), reaction_structural_bfp('c1ncccc1>>c1ncncc1',1)); + tanimoto_sml +------------------- + 0.620689655172414 +(1 row) + +SELECT tanimoto_sml(reaction_structural_bfp('c1ccccc1>CC(=O)O.[Na+]>c1ccncc1',1), reaction_structural_bfp('c1ccccc1>CC(=O)O.[Na+]>c1ccncc1',1)); + tanimoto_sml +-------------- + 1 +(1 row) + +SELECT tanimoto_sml(reaction_structural_bfp('c1ccccc1>CC(=O)O.[Na+]>c1ccncc1',1), reaction_structural_bfp('c1ncccc1>[Na+]>c1ncncc1',1)); + tanimoto_sml +------------------- + 0.514285714285714 +(1 row) + +SELECT tanimoto_sml(reaction_structural_bfp('c1ccccc1>>c1ccncc1',2), reaction_structural_bfp('c1ccccc1>>c1ccncc1',2)); + tanimoto_sml +-------------- + 1 +(1 row) + +SELECT tanimoto_sml(reaction_structural_bfp('c1ccccc1>>c1ccncc1',2), reaction_structural_bfp('c1ncccc1>>c1ncncc1',2)); + tanimoto_sml +------------------- + 0.444444444444444 +(1 row) + +SELECT tanimoto_sml(reaction_structural_bfp('c1ccccc1>CC(=O)O.[Na+]>c1ccncc1',2), reaction_structural_bfp('c1ccccc1>CC(=O)O.[Na+]>c1ccncc1',2)); + tanimoto_sml +-------------- + 1 +(1 row) + +SELECT tanimoto_sml(reaction_structural_bfp('c1ccccc1>CC(=O)O.[Na+]>c1ccncc1',2), reaction_structural_bfp('c1ncccc1>[Na+]>c1ncncc1',2)); + tanimoto_sml +------------------- + 0.444444444444444 +(1 row) + +SELECT tanimoto_sml(reaction_structural_bfp('c1ccccc1>>c1ccncc1',3), reaction_structural_bfp('c1ccccc1>>c1ccncc1',3)); + tanimoto_sml +-------------- + 1 +(1 row) + +SELECT tanimoto_sml(reaction_structural_bfp('c1ccccc1>>c1ccncc1',3), reaction_structural_bfp('c1ncccc1>>c1ncncc1',3)); + tanimoto_sml +------------------- + 0.428571428571429 +(1 row) + +SELECT tanimoto_sml(reaction_structural_bfp('c1ccccc1>CC(=O)O.[Na+]>c1ccncc1',3), reaction_structural_bfp('c1ccccc1>CC(=O)O.[Na+]>c1ccncc1',3)); + tanimoto_sml +-------------- + 1 +(1 row) + +SELECT tanimoto_sml(reaction_structural_bfp('c1ccccc1>CC(=O)O.[Na+]>c1ccncc1',3), reaction_structural_bfp('c1ncccc1>[Na+]>c1ncncc1',3)); + tanimoto_sml +------------------- + 0.366666666666667 +(1 row) + +SELECT tanimoto_sml(reaction_structural_bfp('c1ccccc1>>c1ccncc1',4), reaction_structural_bfp('c1ccccc1>>c1ccncc1',4)); + tanimoto_sml +-------------- + 1 +(1 row) + +SELECT tanimoto_sml(reaction_structural_bfp('c1ccccc1>>c1ccncc1',4), reaction_structural_bfp('c1ncccc1>>c1ncncc1',4)); + tanimoto_sml +------------------- + 0.285714285714286 +(1 row) + +SELECT tanimoto_sml(reaction_structural_bfp('c1ccccc1>CC(=O)O.[Na+]>c1ccncc1',4), reaction_structural_bfp('c1ccccc1>CC(=O)O.[Na+]>c1ccncc1',4)); + tanimoto_sml +-------------- + 1 +(1 row) + +SELECT tanimoto_sml(reaction_structural_bfp('c1ccccc1>CC(=O)O.[Na+]>c1ccncc1',4), reaction_structural_bfp('c1ncccc1>[Na+]>c1ncncc1',4)); + tanimoto_sml +------------------- + 0.244897959183673 +(1 row) + +SELECT tanimoto_sml(reaction_structural_bfp('c1ccccc1>>c1ccncc1',5), reaction_structural_bfp('c1ccccc1>>c1ccncc1',5)); + tanimoto_sml +-------------- + 1 +(1 row) + +SELECT tanimoto_sml(reaction_structural_bfp('c1ccccc1>>c1ccncc1',5), reaction_structural_bfp('c1ncccc1>>c1ncncc1',5)); + tanimoto_sml +------------------- + 0.778846153846154 +(1 row) + +SELECT tanimoto_sml(reaction_structural_bfp('c1ccccc1>CC(=O)O.[Na+]>c1ccncc1',5), reaction_structural_bfp('c1ccccc1>CC(=O)O.[Na+]>c1ccncc1',5)); + tanimoto_sml +-------------- + 1 +(1 row) + +SELECT tanimoto_sml(reaction_structural_bfp('c1ccccc1>CC(=O)O.[Na+]>c1ccncc1',5), reaction_structural_bfp('c1ncccc1>[Na+]>c1ncncc1',5)); + tanimoto_sml +------------------ + 0.58695652173913 +(1 row) + +SET rdkit.ignore_reaction_agents=true; +SELECT tanimoto_sml(reaction_difference_fp('c1ccccc1>>c1ccncc1',1), reaction_difference_fp('c1ccccc1>>c1ccncc1',1)); + tanimoto_sml +-------------- + 1 +(1 row) + +SELECT tanimoto_sml(reaction_difference_fp('c1ccccc1>>c1ccncc1',1), reaction_difference_fp('c1ncccc1>>c1ncncc1',1)); + tanimoto_sml +------------------- + 0.636363636363636 +(1 row) + +SELECT tanimoto_sml(reaction_difference_fp('c1ccccc1>CC(=O)O.[Na+]>c1ccncc1',1), reaction_difference_fp('c1ccccc1>CC(=O)O.[Na+]>c1ccncc1',1)); + tanimoto_sml +-------------- + 1 +(1 row) + +SELECT tanimoto_sml(reaction_difference_fp('c1ccccc1>CC(=O)O.[Na+]>c1ccncc1',1), reaction_difference_fp('c1ncccc1>[Na+]>c1ncncc1',1)); + tanimoto_sml +------------------- + 0.636363636363636 +(1 row) + +SELECT tanimoto_sml(reaction_structural_bfp('c1ccccc1>>c1ccncc1',5), reaction_structural_bfp('c1ccccc1>>c1ccncc1',5)); + tanimoto_sml +-------------- + 1 +(1 row) + +SELECT tanimoto_sml(reaction_structural_bfp('c1ccccc1>>c1ccncc1',5), reaction_structural_bfp('c1ncccc1>>c1ncncc1',5)); + tanimoto_sml +------------------- + 0.778846153846154 +(1 row) + +SELECT tanimoto_sml(reaction_structural_bfp('c1ccccc1>CC(=O)O.[Na+]>c1ccncc1',5), reaction_structural_bfp('c1ccccc1>CC(=O)O.[Na+]>c1ccncc1',5)); + tanimoto_sml +-------------- + 1 +(1 row) + +SELECT tanimoto_sml(reaction_structural_bfp('c1ccccc1>CC(=O)O.[Na+]>c1ccncc1',5), reaction_structural_bfp('c1ncccc1>[Na+]>c1ncncc1',5)); + tanimoto_sml +------------------- + 0.778846153846154 +(1 row) + +SET enable_indexscan=on; +SET enable_bitmapscan=on; +SET enable_seqscan=on; +DROP INDEX rxnidx; diff --git a/Code/PgSQL/rdkit/guc.c b/Code/PgSQL/rdkit/guc.c index e5ec3670a..85d45a6a0 100644 --- a/Code/PgSQL/rdkit/guc.c +++ b/Code/PgSQL/rdkit/guc.c @@ -37,7 +37,12 @@ static double rdkit_tanimoto_smlar_limit = 0.5; static double rdkit_dice_smlar_limit = 0.5; +static double rdkit_agent_FP_bit_ratio = 0.2; +static double rdkit_threshold_unmapped_reactant_atoms = 0.2; static bool rdkit_do_chiral_sss = false; +static bool rdkit_ignore_reaction_agents = false; +static bool rdkit_move_unmmapped_reactants_to_agents = true; +static bool rdkit_init_reaction = true; static bool rdkit_guc_inited = false; #define SSS_FP_SIZE 2048 @@ -47,6 +52,13 @@ static bool rdkit_guc_inited = false; #define FEATMORGAN_FP_SIZE 512 #define HASHED_TORSION_FP_SIZE 1024 #define HASHED_PAIR_FP_SIZE 2048 +#define AVALON_FP_SIZE 512 +#define REACTION_SSS_FP_SIZE 4096 +#define REACTION_DIFFERENCE_FP_SIZE 2048 +#define REACTION_SSS_FP_TYPE 5 +#define REACTION_DIFFERENCE_FP_TYPE 1 +#define REACTION_DFP_WEIGHT_AGENTS 1 +#define REACTION_DFP_WEIGHT_NONAGENTS 10 static int rdkit_sss_fp_size = SSS_FP_SIZE; static int rdkit_morgan_fp_size = MORGAN_FP_SIZE; @@ -55,6 +67,13 @@ static int rdkit_layered_fp_size = LAYERED_FP_SIZE; static int rdkit_rdkit_fp_size = RDKIT_FP_SIZE; static int rdkit_hashed_torsion_fp_size = HASHED_TORSION_FP_SIZE; static int rdkit_hashed_atompair_fp_size = HASHED_PAIR_FP_SIZE; +static int rdkit_avalon_fp_size = AVALON_FP_SIZE; +static int rdkit_reaction_sss_fp_size = REACTION_SSS_FP_SIZE; +static int rdkit_reaction_difference_fp_size = REACTION_DIFFERENCE_FP_SIZE; +static int rdkit_reaction_sss_fp_type = REACTION_SSS_FP_TYPE; +static int rdkit_reaction_difference_fp_type = REACTION_DIFFERENCE_FP_TYPE; +static int rdkit_difference_FP_weight_agents = REACTION_DFP_WEIGHT_AGENTS; +static int rdkit_difference_FP_weight_nonagents = REACTION_DFP_WEIGHT_NONAGENTS; #if PG_VERSION_NUM < 80400 #error The earliest supported postgresql version is 8.4 @@ -222,10 +241,196 @@ initRDKitGUC() NULL, #if PG_VERSION_NUM >= 90000 NULL, +#endif + NULL + ); + DefineCustomIntVariable( + "rdkit.reaction_sss_fp_size", + "Size (in bits) of structural chemical reaction fingerprint", + "Size (in bits) of structural chemical reaction fingerprint", + &rdkit_reaction_sss_fp_size, + REACTION_SSS_FP_SIZE, + 64, + 9192, + PGC_USERSET, + 0, + NULL, +#if PG_VERSION_NUM >= 90000 + NULL, +#endif + NULL + ); + DefineCustomIntVariable( + "rdkit.reaction_difference_fp_size", + "Size (in bits) of difference chemical reaction fingerprint", + "Size (in bits) of difference chemical reaction fingerprint", + &rdkit_reaction_difference_fp_size, + REACTION_DIFFERENCE_FP_SIZE, + 64, + 9192, + PGC_USERSET, + 0, + NULL, +#if PG_VERSION_NUM >= 90000 + NULL, +#endif + NULL + ); + DefineCustomIntVariable( + "rdkit.reaction_sss_fp_type", + "Type of structural chemical reaction fingerprint (1=Atompairs, 2=Topologcal torsion, 3=Morgan2, 4=RDKit, 5=Pattern)", + "Type of structural chemical reaction fingerprint (1=Atompairs, 2=Topologcal torsion, 3=Morgan2, 4=RDKit, 5=Pattern)", + &rdkit_reaction_sss_fp_type, + REACTION_SSS_FP_TYPE, + 1, + 5, + PGC_USERSET, + 0, + NULL, +#if PG_VERSION_NUM >= 90000 + NULL, +#endif + NULL + ); + DefineCustomIntVariable( + "rdkit.reaction_difference_fp_type", + "Type of difference chemical reaction fingerprint (1=Atompairs, 2=Topologcal torsion, 3=Morgan2)", + "Type of difference chemical reaction fingerprint (1=Atompairs, 2=Topologcal torsion, 3=Morgan2)", + &rdkit_reaction_difference_fp_type, + REACTION_DIFFERENCE_FP_TYPE, + 1, + 3, + PGC_USERSET, + 0, + NULL, +#if PG_VERSION_NUM >= 90000 + NULL, +#endif + NULL + ); + DefineCustomBoolVariable( + "rdkit.ignore_reaction_agents", + "Should agents of a chemical reaction be taken into account ", + "If false (the default), agents (if provided) are taken into account for calculations/requests/similarity measures.", + &rdkit_ignore_reaction_agents, + false, + PGC_USERSET, + 0, + NULL, + #if PG_VERSION_NUM >= 90000 + NULL, + #endif + NULL + ); + DefineCustomRealVariable( + "rdkit.agent_FP_bit_ratio", + "Allow to weight the impact of agents contained in a chemical reaction fingerprint", + "A scaling factor below 1.0 down weighted the agents of a chemical reaction", + &rdkit_agent_FP_bit_ratio, + 0.2, + 0.0, + 3.0, + PGC_USERSET, + 0, + NULL, + #if PG_VERSION_NUM >= 90000 + NULL, + #endif + NULL + ); + DefineCustomBoolVariable( + "rdkit.move_unmmapped_reactants_to_agents", + "Should unmapped reactant agents of a chemical reaction be taken into account ", + "If true (the default), agents (if provided) are taken into account for calculations/requests/similarity measures.", + &rdkit_move_unmmapped_reactants_to_agents, + true, + PGC_USERSET, + 0, + NULL, + #if PG_VERSION_NUM >= 90000 + NULL, + #endif + NULL + ); + DefineCustomRealVariable( + "rdkit.threshold_unmapped_reactant_atoms", + "Set the ratio of allowed unmapped reactant atoms", + "If the ratio of unmapped atoms in a reactant is larger than this the reactant is removed and added to the agents.", + &rdkit_threshold_unmapped_reactant_atoms, + 0.2, + 0.0, + 1.0, + PGC_USERSET, + 0, + NULL, + #if PG_VERSION_NUM >= 90000 + NULL, + #endif + NULL + ); + DefineCustomBoolVariable( + "rdkit.init_reaction", + "Checks if the reaction is ready for use", + "By default it is true, however reactions can be used uninitialized too but be aware of potential upcoming errors.", + &rdkit_init_reaction, + true, + PGC_USERSET, + 0, + NULL, + #if PG_VERSION_NUM >= 90000 + NULL, + #endif + NULL + ); + DefineCustomIntVariable( + "rdkit.rdkit_difference_FP_weight_agents", + "In reaction difference fingerprints weight factor for agents comapred to reactants and products", + "In reaction difference fingerprints weight factor for agents comapred to reactants and products", + &rdkit_difference_FP_weight_agents, + REACTION_DFP_WEIGHT_AGENTS, + -10, + 10, + PGC_USERSET, + 0, + NULL, +#if PG_VERSION_NUM >= 90000 + NULL, +#endif + NULL + ); + DefineCustomIntVariable( + "rdkit.difference_FP_weight_nonagents", + "In reaction difference fingerprints weight factor for reactants and products comapred to agents", + "In reaction difference fingerprints weight factor for reactants and products comapred to agents", + &rdkit_difference_FP_weight_nonagents, + REACTION_DFP_WEIGHT_NONAGENTS, + 1, + 20, + PGC_USERSET, + 0, + NULL, +#if PG_VERSION_NUM >= 90000 + NULL, #endif NULL ); + DefineCustomIntVariable( + "rdkit.avalon_fp_size", + "Size (in bits) of avalon fingerprints", + "Size (in bits) of avalon fingerprints", + &rdkit_avalon_fp_size, + AVALON_FP_SIZE, + 64, + 9192, + PGC_USERSET, + 0, + NULL, +#if PG_VERSION_NUM >= 90000 + NULL, +#endif + NULL + ); rdkit_guc_inited = true; } @@ -295,6 +500,78 @@ getHashedAtomPairFpSize(void) { initRDKitGUC(); return rdkit_hashed_atompair_fp_size; } +int +getAvalonFpSize(void) { + if (!rdkit_guc_inited) + initRDKitGUC(); + return rdkit_avalon_fp_size; +} +int +getReactionSubstructFpSize(void) { + if (!rdkit_guc_inited) + initRDKitGUC(); + return rdkit_reaction_sss_fp_size; +} +int +getReactionDifferenceFpSize(void) { + if (!rdkit_guc_inited) + initRDKitGUC(); + return rdkit_reaction_difference_fp_size; +} +int +getReactionSubstructFpType(void) { + if (!rdkit_guc_inited) + initRDKitGUC(); + return rdkit_reaction_sss_fp_type; +} +int +getReactionDifferenceFpType(void) { + if (!rdkit_guc_inited) + initRDKitGUC(); + return rdkit_reaction_difference_fp_type; +} +bool +getIgnoreReactionAgents(void) { + if (!rdkit_guc_inited) + initRDKitGUC(); + return rdkit_ignore_reaction_agents; +} +double +getReactionStructuralFPAgentBitRatio(void) { + if (!rdkit_guc_inited) + initRDKitGUC(); + return rdkit_agent_FP_bit_ratio; +} +bool +getMoveUnmappedReactantsToAgents(void) { + if (!rdkit_guc_inited) + initRDKitGUC(); + return rdkit_move_unmmapped_reactants_to_agents; +} +double +getThresholdUnmappedReactantAtoms(void) { + if (!rdkit_guc_inited) + initRDKitGUC(); + return rdkit_threshold_unmapped_reactant_atoms; +} +bool +getInitReaction(void) { + if (!rdkit_guc_inited) + initRDKitGUC(); + return rdkit_init_reaction; +} +int +getReactionDifferenceFPWeightAgents(void) { + if (!rdkit_guc_inited) + initRDKitGUC(); + return rdkit_difference_FP_weight_agents; +} +int +getReactionDifferenceFPWeightNonagents(void) { + if (!rdkit_guc_inited) + initRDKitGUC(); + return rdkit_difference_FP_weight_nonagents; +} void _PG_init(void); void diff --git a/Code/PgSQL/rdkit/mol_op.c b/Code/PgSQL/rdkit/mol_op.c index f2b705eeb..2492eb4f4 100644 --- a/Code/PgSQL/rdkit/mol_op.c +++ b/Code/PgSQL/rdkit/mol_op.c @@ -135,14 +135,14 @@ mol_rsubstruct(PG_FUNCTION_ARGS) { fcinfo->flinfo->fn_extra, fcinfo->flinfo->fn_mcxt, PG_GETARG_DATUM(0), - NULL, &a, NULL); + NULL, &i, NULL); fcinfo->flinfo->fn_extra = SearchMolCache( fcinfo->flinfo->fn_extra, fcinfo->flinfo->fn_mcxt, PG_GETARG_DATUM(1), - NULL, &i, NULL); + NULL, &a, NULL); - PG_RETURN_BOOL(MolSubstruct(i, a)); + PG_RETURN_BOOL(MolSubstruct(a, i)); } PG_FUNCTION_INFO_V1(mol_substruct_count); diff --git a/Code/PgSQL/rdkit/rdkit.h b/Code/PgSQL/rdkit/rdkit.h index 40fc8e36e..0ab3b79f2 100644 --- a/Code/PgSQL/rdkit/rdkit.h +++ b/Code/PgSQL/rdkit/rdkit.h @@ -68,6 +68,16 @@ extern "C" { #define PG_GETARG_SPARSEFINGERPRINT_P_COPY(x) DatumGetSparseFingerPrintPCopy(PG_GETARG_DATUM(x)) #define PG_RETURN_SPARSEFINGERPRINT_P(x) PG_RETURN_DATUM(SparseFingerPrintPGetDatum(x)) + typedef bytea ChemReactionBA; + +#define DatumGetChemReactionP(x) ((ChemReactionBA*)PG_DETOAST_DATUM(x)) +#define DatumGetChemReactionPCopy(x) ((ChemReactionBA*)PG_DETOAST_DATUM_COPY(x)) +#define ChemReactionPGetDatum(x) (PointerGetDatum(x)) + +#define PG_GETARG_CHEMREACTION_P(x) DatumGetChemReactionP(PG_GETARG_DATUM(x)) +#define PG_GETARG_CHEMREACTION_P_COPY(x) DatumGetChemReactionPCopy(PG_GETARG_DATUM(x)) +#define PG_RETURN_CHEMREACTION_P(x) PG_RETURN_DATUM(ChemReactionPGetDatum(x)) + /* * GUC */ @@ -81,6 +91,18 @@ extern "C" { extern int getRDKitFpSize(void); extern int getHashedTorsionFpSize(void); extern int getHashedAtomPairFpSize(void); + extern int getAvalonFpSize(void); + extern int getReactionSubstructFpSize(void); + extern int getReactionSubstructFpType(void); + extern int getReactionDifferenceFpSize(void); + extern int getReactionDifferenceFpType(void); + extern bool getIgnoreReactionAgents(void); + extern double getReactionStructuralFPAgentBitRatio(void); + extern bool getMoveUnmappedReactantsToAgents(void); + extern double getThresholdUnmappedReactantAtoms(void); + extern bool getInitReaction(void); + extern int getReactionDifferenceFPWeightNonagents(void); + extern int getReactionDifferenceFPWeightAgents(void); /* * From/to C/C++ @@ -204,6 +226,7 @@ extern "C" { MolBitmapFingerPrint makeAtomPairBFP(CROMol data); MolBitmapFingerPrint makeTopologicalTorsionBFP(CROMol data); MolBitmapFingerPrint makeMACCSBFP(CROMol data); + MolBitmapFingerPrint makeAvalonBFP(CROMol data,bool isQuery,unsigned int bitFlags); /* * Indexes @@ -227,13 +250,15 @@ extern "C" { #define RDKitContains (3) #define RDKitContained (4) #define RDKitEquals (6) +#define RDKitSmaller (7) +#define RDKitGreater (8) bool calcConsistency(bool isLeaf, uint16 strategy, double nCommonUp, double nCommonDown, double nKey, double nQuery); /* - * Cache subsystem. Moleculas and fingerprints I/O is extremely expensive. + * Cache subsystem. Molecules and fingerprints I/O is extremely expensive. */ struct MemoryContextData; /* forward declaration to prevent conflicts with C++ */ void* SearchMolCache( void *cache, struct MemoryContextData * ctx, Datum a, @@ -243,6 +268,39 @@ extern "C" { void* SearchSparseFPCache( void *cache, struct MemoryContextData * ctx, Datum a, SparseFingerPrint **f, MolSparseFingerPrint *fp, bytea **val); + /* Chemical Reactions + * RDKit::ChemicalReaction */ + typedef void * CChemicalReaction; + + void* SearchChemReactionCache( void *cache, struct MemoryContextData * ctx, Datum a, + ChemReactionBA **r, CChemicalReaction *rxn, bytea **sign); + + void freeChemReaction(CChemicalReaction data); + + CChemicalReaction constructChemReact(ChemReactionBA* data); + ChemReactionBA * deconstructChemReact(CChemicalReaction data); + + CChemicalReaction parseChemReactBlob(char *data,int len); + CChemicalReaction parseChemReactText(char *data,bool asSmarts,bool warnOnFail); + CChemicalReaction parseChemReactCTAB(char *data,bool warnOnFail); + char *makeChemReactBlob(CChemicalReaction data, int *len); + char *makeChemReactText(CChemicalReaction data, int *len,bool asSmarts); + char *makeCTABChemReact(CChemicalReaction data, int *len); + + int ChemReactNumReactants(CChemicalReaction rxn); + int ChemReactNumProducts(CChemicalReaction rxn); + int ChemReactNumAgents(CChemicalReaction rxn); + + /* Reaction substructure search */ + bytea *makeReactionSign(CChemicalReaction data); + int ReactionSubstruct(CChemicalReaction rxn, CChemicalReaction rxn2); + int reactioncmp(CChemicalReaction rxn, CChemicalReaction rxn2); + MolBitmapFingerPrint makeReactionBFP(CChemicalReaction data, int size, int fpType); + + /* Reaction difference fingerprint */ + MolSparseFingerPrint makeReactionDifferenceSFP(CChemicalReaction data, int size, int fpType); + + #ifdef __cplusplus } #endif diff --git a/Code/PgSQL/rdkit/rdkit.sql91.in b/Code/PgSQL/rdkit/rdkit.sql91.in index 4f739f4ea..990ea81e7 100644 --- a/Code/PgSQL/rdkit/rdkit.sql91.in +++ b/Code/PgSQL/rdkit/rdkit.sql91.in @@ -231,6 +231,13 @@ RETURNS bfp AS 'MODULE_PATHNAME' LANGUAGE C STRICT IMMUTABLE; +CREATE OR REPLACE FUNCTION avalon_fp(mol,bool default false,int default 15761407) +RETURNS bfp +AS 'MODULE_PATHNAME' +LANGUAGE C STRICT IMMUTABLE; + + + CREATE OR REPLACE FUNCTION tanimoto_sml(bfp, bfp) RETURNS float8 @@ -1119,3 +1126,240 @@ AS STORAGE bytea; + +CREATE OR REPLACE FUNCTION reaction_in(cstring) +RETURNS reaction +AS 'MODULE_PATHNAME' +LANGUAGE C STRICT IMMUTABLE; + +CREATE OR REPLACE FUNCTION reaction_out(reaction) +RETURNS cstring +AS 'MODULE_PATHNAME' +LANGUAGE C STRICT IMMUTABLE; + +CREATE OR REPLACE FUNCTION reaction_recv(internal) +RETURNS reaction +AS 'MODULE_PATHNAME' +LANGUAGE C STRICT IMMUTABLE; + +CREATE OR REPLACE FUNCTION reaction_send(reaction) +RETURNS bytea +AS 'MODULE_PATHNAME' +LANGUAGE C STRICT IMMUTABLE; + +CREATE TYPE reaction ( + INTERNALLENGTH = -1, + INPUT = reaction_in, + OUTPUT = reaction_out, + RECEIVE = reaction_recv, + SEND = reaction_send, + STORAGE = extended +); + +CREATE OR REPLACE FUNCTION reaction_from_smiles(cstring) +RETURNS reaction +AS 'MODULE_PATHNAME' +LANGUAGE C STRICT IMMUTABLE; + +CREATE OR REPLACE FUNCTION reaction_from_smarts(cstring) +RETURNS reaction +AS 'MODULE_PATHNAME' +LANGUAGE C STRICT IMMUTABLE; + +CREATE OR REPLACE FUNCTION reaction_to_smiles(reaction) +RETURNS cstring +AS 'MODULE_PATHNAME' +LANGUAGE C STRICT IMMUTABLE; + +CREATE OR REPLACE FUNCTION reaction_to_smarts(reaction) +RETURNS cstring +AS 'MODULE_PATHNAME' +LANGUAGE C STRICT IMMUTABLE; + +CREATE OR REPLACE FUNCTION reaction_from_ctab(cstring) +RETURNS reaction +AS 'MODULE_PATHNAME' +LANGUAGE C STRICT IMMUTABLE; + +CREATE OR REPLACE FUNCTION reaction_to_ctab(reaction) +RETURNS cstring +AS 'MODULE_PATHNAME' +LANGUAGE C STRICT IMMUTABLE; + +CREATE OR REPLACE FUNCTION reaction_numreactants(reaction) +RETURNS integer +AS 'MODULE_PATHNAME' +LANGUAGE C STRICT IMMUTABLE; + +CREATE OR REPLACE FUNCTION reaction_numproducts(reaction) +RETURNS integer +AS 'MODULE_PATHNAME' +LANGUAGE C STRICT IMMUTABLE; + +CREATE OR REPLACE FUNCTION reaction_numagents(reaction) +RETURNS integer +AS 'MODULE_PATHNAME' +LANGUAGE C STRICT IMMUTABLE; + +CREATE OR REPLACE FUNCTION substruct(reaction, reaction) +RETURNS bool +AS 'MODULE_PATHNAME', 'reaction_substruct' +LANGUAGE C STRICT IMMUTABLE; + +CREATE OPERATOR @> ( + LEFTARG = reaction, + RIGHTARG = reaction, + PROCEDURE = substruct(reaction, reaction), + COMMUTATOR = '<@', + RESTRICT = contsel, + JOIN = contjoinsel +); + +CREATE OR REPLACE FUNCTION substructFP(reaction, reaction) +RETURNS bool +AS 'MODULE_PATHNAME', 'reaction_substructFP' +LANGUAGE C STRICT IMMUTABLE; + +CREATE OPERATOR ?> ( + LEFTARG = reaction, + RIGHTARG = reaction, + PROCEDURE = substructFP(reaction, reaction), + COMMUTATOR = '?<', + RESTRICT = contsel, + JOIN = contjoinsel +); + + +CREATE OR REPLACE FUNCTION rsubstruct(reaction, reaction) +RETURNS bool +AS 'MODULE_PATHNAME', 'reaction_rsubstruct' +LANGUAGE C STRICT IMMUTABLE; + +CREATE OPERATOR <@ ( + LEFTARG = reaction, + RIGHTARG = reaction, + PROCEDURE = rsubstruct(reaction, reaction), + COMMUTATOR = '@>', + RESTRICT = contsel, + JOIN = contjoinsel +); + +CREATE OR REPLACE FUNCTION rsubstructFP(reaction, reaction) +RETURNS bool +AS 'MODULE_PATHNAME', 'reaction_rsubstructFP' +LANGUAGE C STRICT IMMUTABLE; + + +CREATE OPERATOR ?< ( + LEFTARG = reaction, + RIGHTARG = reaction, + PROCEDURE = rsubstructFP(reaction, reaction), + COMMUTATOR = '?>', + RESTRICT = contsel, + JOIN = contjoinsel +); + +CREATE OR REPLACE FUNCTION reaction_ne(reaction,reaction) +RETURNS bool +AS 'MODULE_PATHNAME' +LANGUAGE C STRICT IMMUTABLE; + +CREATE OPERATOR <> ( + LEFTARG = reaction, + RIGHTARG = reaction, + PROCEDURE = reaction_ne, + COMMUTATOR = '<>', + NEGATOR = '=', + RESTRICT = neqsel, + JOIN = neqjoinsel +); + +CREATE OR REPLACE FUNCTION reaction_eq(reaction,reaction) +RETURNS bool +AS 'MODULE_PATHNAME' +LANGUAGE C STRICT IMMUTABLE; + +CREATE OPERATOR @= ( + LEFTARG = reaction, + RIGHTARG = reaction, + PROCEDURE = reaction_eq, + COMMUTATOR = '=', + NEGATOR = '<>', + RESTRICT = eqsel, + JOIN = eqjoinsel +); + +CREATE OR REPLACE FUNCTION greaction_consistent(bytea,internal,int4) + RETURNS bool + AS 'MODULE_PATHNAME' + LANGUAGE C IMMUTABLE; + +CREATE OR REPLACE FUNCTION greaction_compress(internal) + RETURNS internal + AS 'MODULE_PATHNAME' + LANGUAGE C IMMUTABLE; + +CREATE OPERATOR CLASS reaction_ops +DEFAULT FOR TYPE reaction USING gist +AS + OPERATOR 3 @> (reaction, reaction), + OPERATOR 4 <@ (reaction, reaction), + OPERATOR 6 @= (reaction, reaction), + OPERATOR 7 ?> (reaction, reaction), + OPERATOR 8 ?< (reaction, reaction), + FUNCTION 1 greaction_consistent (bytea, internal, int4), + FUNCTION 2 gmol_union (bytea, internal), + FUNCTION 3 greaction_compress (internal), + FUNCTION 4 gmol_decompress (internal), + FUNCTION 5 gmol_penalty (internal, internal, internal), + FUNCTION 6 gmol_picksplit (internal, internal), + FUNCTION 7 gmol_same (bytea, bytea, internal), +STORAGE bytea; + +CREATE OR REPLACE FUNCTION has_reaction_substructmatch(queryreaction char, tablename regclass, columnname text) + RETURNS SETOF reaction AS +$BODY$ +DECLARE + nof_all_entries real; + nof_index_matches real; + match_ratio real; +BEGIN + SET enable_seqscan=off; + SET enable_bitmapscan=on; + SET enable_indexscan=on; + RAISE NOTICE 'Your query: %', queryreaction; + EXECUTE 'SELECT COUNT(*) FROM ' || tablename INTO nof_all_entries; + RAISE NOTICE 'Number of reactions in table: %', nof_all_entries; + EXECUTE 'SELECT COUNT(*) FROM ' || tablename || ' WHERE ' || quote_ident(columnname) || '?>' || quote_literal(queryreaction) INTO nof_index_matches; + RAISE NOTICE 'Number of matched reactions in the index: %', nof_index_matches; + match_ratio := nof_index_matches/nof_all_entries; + RAISE NOTICE 'Match ratio: %', match_ratio; + IF match_ratio > 0.7 THEN + SET enable_seqscan=on; + SET enable_bitmapscan=off; + SET enable_indexscan=off; + IF match_ratio >= 1.0 THEN + RAISE NOTICE 'Your query matches % percent of the index. You are sure you already have build an index?', match_ratio*100.0; + END IF; + RAISE NOTICE 'Your query matches % percent of the index. Executing strategy: SequentialScan. Starting substructure matching..', match_ratio*100.0; + ELSE + SET enable_seqscan=off; + SET enable_bitmapscan=on; + SET enable_indexscan=on; + RAISE NOTICE 'Executing strategy: IndexScan and BitMapHeapScan. % matches have to be rechecked. Starting substructure matching...', nof_index_matches; + END IF; + RETURN QUERY EXECUTE 'SELECT * FROM ' || tablename || ' WHERE ' || quote_ident(columnname) || '@>' || quote_literal(queryreaction); +END +$BODY$ +LANGUAGE plpgsql; + +CREATE OR REPLACE FUNCTION reaction_difference_fp(reaction, int default 1) +RETURNS sfp +AS 'MODULE_PATHNAME' +LANGUAGE C STRICT IMMUTABLE; + +CREATE OR REPLACE FUNCTION reaction_structural_bfp(reaction,int default 5) +RETURNS bfp +AS 'MODULE_PATHNAME' +LANGUAGE C STRICT IMMUTABLE; + \ No newline at end of file diff --git a/Code/PgSQL/rdkit/rdkit_gist.c b/Code/PgSQL/rdkit/rdkit_gist.c index 2b3caf054..0f66cee2e 100644 --- a/Code/PgSQL/rdkit/rdkit_gist.c +++ b/Code/PgSQL/rdkit/rdkit_gist.c @@ -298,7 +298,7 @@ gmol_same(PG_FUNCTION_ARGS) static int hemdistsign(bytea *a, bytea *b) { - int i, + unsigned i, dist = 0; unsigned char *as = (unsigned char *)VARDATA(a), *bs = (unsigned char *)VARDATA(b); @@ -312,9 +312,14 @@ hemdistsign(bytea *a, bytea *b) dist += number_of_ones[diff]; } #else - for(i=0;ileafkey) { + CChemicalReaction rxn = constructChemReact(DatumGetMolP(entry->key)); + + retval = (GISTENTRY *) palloc(sizeof(GISTENTRY)); + + gistentryinit(*retval, PointerGetDatum(makeReactionSign(rxn)), + entry->rel, entry->page, + entry->offset, FALSE); + freeChemReaction(rxn); + } + else if ( !ISALLTRUE(DatumGetPointer(entry->key)) ) + { + retval = compressAllTrue(entry); + } + + PG_RETURN_POINTER(retval); +} + +PG_FUNCTION_INFO_V1(greaction_consistent); +Datum greaction_consistent(PG_FUNCTION_ARGS); +Datum +greaction_consistent(PG_FUNCTION_ARGS) +{ + GISTENTRY *entry = (GISTENTRY *) PG_GETARG_POINTER(0); + StrategyNumber strategy = (StrategyNumber) PG_GETARG_UINT16(2); + bool *recheck = (bool *) PG_GETARG_POINTER(4); + bytea *key = (bytea*)DatumGetPointer(entry->key); + bytea *query; + bool res = true; + + fcinfo->flinfo->fn_extra = SearchChemReactionCache( + fcinfo->flinfo->fn_extra, + fcinfo->flinfo->fn_mcxt, + PG_GETARG_DATUM(1), + NULL, NULL,&query); + + switch(strategy) + { + case RDKitContains: + *recheck = true; + + if (!ISALLTRUE(key)) + { + int i; + unsigned char *k = (unsigned char*)VARDATA(key), + *q = (unsigned char*)VARDATA(query); + + if (SIGLEN(key) != SIGLEN(query)) + elog(ERROR, "All fingerprints should be the same length"); + + for(i=0; res && iflinfo->fn_extra = SearchChemReactionCache( + fcinfo->flinfo->fn_extra, + fcinfo->flinfo->fn_mcxt, + PG_GETARG_DATUM(0), + NULL, &rxn, NULL); + str = makeChemReactText(rxn, &len,false); + + PG_RETURN_CSTRING( pnstrdup(str, len) ); +} + +PG_FUNCTION_INFO_V1(reaction_send); +Datum reaction_send(PG_FUNCTION_ARGS); +Datum +reaction_send(PG_FUNCTION_ARGS) { + CChemicalReaction rxn; + bytea *res; + char *str; + int len; + + fcinfo->flinfo->fn_extra = SearchChemReactionCache( + fcinfo->flinfo->fn_extra, + fcinfo->flinfo->fn_mcxt, + PG_GETARG_DATUM(0), + NULL, &rxn, NULL); + str = makeChemReactBlob(rxn, &len); + + res=(bytea *)palloc(len+VARHDRSZ); + SET_VARSIZE(res,len+VARHDRSZ); + memcpy(VARDATA(res),str,len); + PG_RETURN_BYTEA_P( res ); +} + +PG_FUNCTION_INFO_V1(reaction_from_ctab); +Datum reaction_from_ctab(PG_FUNCTION_ARGS); +Datum +reaction_from_ctab(PG_FUNCTION_ARGS) { + char *data = PG_GETARG_CSTRING(0); + CChemicalReaction rxn; + ChemReactionBA *rxnBA; + + rxn = parseChemReactCTAB(data,true); + if(!rxn) PG_RETURN_NULL(); + rxnBA = deconstructChemReact(rxn); + freeChemReaction(rxn); + + PG_RETURN_CHEMREACTION_P(rxnBA); +} + +PG_FUNCTION_INFO_V1(reaction_from_smarts); +Datum reaction_from_smarts(PG_FUNCTION_ARGS); +Datum +reaction_from_smarts(PG_FUNCTION_ARGS) { + char *data = PG_GETARG_CSTRING(0); + CChemicalReaction rxn; + ChemReactionBA *rxnBA; + + rxn = parseChemReactText(data,true,true); + if(!rxn) PG_RETURN_NULL(); + rxnBA = deconstructChemReact(rxn); + freeChemReaction(rxn); + + PG_RETURN_CHEMREACTION_P(rxnBA); +} + +PG_FUNCTION_INFO_V1(reaction_from_smiles); +Datum reaction_from_smiles(PG_FUNCTION_ARGS); +Datum +reaction_from_smiles(PG_FUNCTION_ARGS) { + char *data = PG_GETARG_CSTRING(0); + CChemicalReaction rxn; + ChemReactionBA *rxnBA; + + rxn = parseChemReactText(data,false,true); + if(!rxn) PG_RETURN_NULL(); + rxnBA = deconstructChemReact(rxn); + freeChemReaction(rxn); + + PG_RETURN_CHEMREACTION_P(rxnBA); +} + +PG_FUNCTION_INFO_V1(reaction_to_ctab); +Datum reaction_to_ctab(PG_FUNCTION_ARGS); +Datum +reaction_to_ctab(PG_FUNCTION_ARGS) { + CChemicalReaction rxn; + char *str; + int len; + + fcinfo->flinfo->fn_extra = SearchChemReactionCache( + fcinfo->flinfo->fn_extra, + fcinfo->flinfo->fn_mcxt, + PG_GETARG_DATUM(0), + NULL, &rxn, NULL); + + str = makeCTABChemReact(rxn, &len); + + PG_RETURN_CSTRING( pnstrdup(str, len) ); +} + +PG_FUNCTION_INFO_V1(reaction_to_smiles); +Datum reaction_to_smiles(PG_FUNCTION_ARGS); +Datum +reaction_to_smiles(PG_FUNCTION_ARGS) { + CChemicalReaction rxn; + char *str; + int len; + + fcinfo->flinfo->fn_extra = SearchChemReactionCache( + fcinfo->flinfo->fn_extra, + fcinfo->flinfo->fn_mcxt, + PG_GETARG_DATUM(0), + NULL, &rxn, NULL); + str = makeChemReactText(rxn, &len,false); + + PG_RETURN_CSTRING( pnstrdup(str, len) ); +} + + +PG_FUNCTION_INFO_V1(reaction_to_smarts); +Datum reaction_to_smarts(PG_FUNCTION_ARGS); +Datum +reaction_to_smarts(PG_FUNCTION_ARGS) { + CChemicalReaction rxn; + char *str; + int len; + + fcinfo->flinfo->fn_extra = SearchChemReactionCache( + fcinfo->flinfo->fn_extra, + fcinfo->flinfo->fn_mcxt, + PG_GETARG_DATUM(0), + NULL, &rxn, NULL); + str = makeChemReactText(rxn, &len,true); + + PG_RETURN_CSTRING( pnstrdup(str, len) ); +} + + diff --git a/Code/PgSQL/rdkit/rxn_op.c b/Code/PgSQL/rdkit/rxn_op.c new file mode 100644 index 000000000..acec9bf68 --- /dev/null +++ b/Code/PgSQL/rdkit/rxn_op.c @@ -0,0 +1,175 @@ +// $Id$ +// +// Copyright (c) 2014, Novartis Institutes for BioMedical Research Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following +// disclaimer in the documentation and/or other materials provided +// with the distribution. +// * Neither the name of Novartis Institutes for BioMedical Research Inc. +// nor the names of its contributors may be used to endorse or promote +// products derived from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +#include "rdkit.h" +#include "fmgr.h" + +static int +bfpcmp(BitmapFingerPrint *a, BitmapFingerPrint *b) { + int res; + + res = memcmp(VARDATA(a), VARDATA(b), Min(VARSIZE(a), VARSIZE(b)) - VARHDRSZ); + if ( res ) + return res; + + if (VARSIZE(a) == VARSIZE(b)) + return 0; + return (VARSIZE(a) > VARSIZE(b)) ? 1 : -1; +} +/***************** chem reaction operations ***********************/ + + +#define CHEMREACTDESCR( name, func, ret ) \ + PG_FUNCTION_INFO_V1(reaction_##name); \ + Datum reaction_##name(PG_FUNCTION_ARGS); \ + Datum \ + reaction_##name(PG_FUNCTION_ARGS){ \ + CChemicalReaction rxn; \ + fcinfo->flinfo->fn_extra = SearchChemReactionCache( \ + fcinfo->flinfo->fn_extra, \ + fcinfo->flinfo->fn_mcxt, \ + PG_GETARG_DATUM(0), \ + NULL, &rxn, NULL); \ + PG_RETURN_##ret( func(rxn) ); \ +} + + +CHEMREACTDESCR(numreactants,ChemReactNumReactants,INT32) +CHEMREACTDESCR(numproducts,ChemReactNumProducts,INT32) +CHEMREACTDESCR(numagents,ChemReactNumAgents,INT32) + +PG_FUNCTION_INFO_V1(reaction_substruct); +Datum reaction_substruct(PG_FUNCTION_ARGS); +Datum +reaction_substruct(PG_FUNCTION_ARGS) { + CChemicalReaction rxn, rxn2; + + fcinfo->flinfo->fn_extra = SearchChemReactionCache( + fcinfo->flinfo->fn_extra, + fcinfo->flinfo->fn_mcxt, + PG_GETARG_DATUM(0), + NULL, &rxn, NULL); + fcinfo->flinfo->fn_extra = SearchChemReactionCache( + fcinfo->flinfo->fn_extra, + fcinfo->flinfo->fn_mcxt, + PG_GETARG_DATUM(1), + NULL, &rxn2, NULL); + + PG_RETURN_BOOL(ReactionSubstruct(rxn, rxn2)); +} + +PG_FUNCTION_INFO_V1(reaction_rsubstruct); +Datum reaction_rsubstruct(PG_FUNCTION_ARGS); +Datum +reaction_rsubstruct(PG_FUNCTION_ARGS) { + CChemicalReaction rxn, rxn2; + + fcinfo->flinfo->fn_extra = SearchChemReactionCache( + fcinfo->flinfo->fn_extra, + fcinfo->flinfo->fn_mcxt, + PG_GETARG_DATUM(0), + NULL, &rxn, NULL); + fcinfo->flinfo->fn_extra = SearchChemReactionCache( + fcinfo->flinfo->fn_extra, + fcinfo->flinfo->fn_mcxt, + PG_GETARG_DATUM(1), + NULL, &rxn2, NULL); + + PG_RETURN_BOOL(ReactionSubstruct(rxn2, rxn)); +} + +PG_FUNCTION_INFO_V1(reaction_substructFP); +Datum reaction_substructFP(PG_FUNCTION_ARGS); +Datum +reaction_substructFP(PG_FUNCTION_ARGS) { + CChemicalReaction rxn, rxn2; + + fcinfo->flinfo->fn_extra = SearchChemReactionCache( + fcinfo->flinfo->fn_extra, + fcinfo->flinfo->fn_mcxt, + PG_GETARG_DATUM(0), + NULL, &rxn, NULL); + fcinfo->flinfo->fn_extra = SearchChemReactionCache( + fcinfo->flinfo->fn_extra, + fcinfo->flinfo->fn_mcxt, + PG_GETARG_DATUM(1), + NULL, &rxn2, NULL); + + PG_RETURN_BOOL(ReactionSubstructFP(rxn, rxn2)); +} + +PG_FUNCTION_INFO_V1(reaction_rsubstructFP); +Datum reaction_rsubstructFP(PG_FUNCTION_ARGS); +Datum +reaction_rsubstructFP(PG_FUNCTION_ARGS) { + CChemicalReaction rxn, rxn2; + + fcinfo->flinfo->fn_extra = SearchChemReactionCache( + fcinfo->flinfo->fn_extra, + fcinfo->flinfo->fn_mcxt, + PG_GETARG_DATUM(0), + NULL, &rxn, NULL); + fcinfo->flinfo->fn_extra = SearchChemReactionCache( + fcinfo->flinfo->fn_extra, + fcinfo->flinfo->fn_mcxt, + PG_GETARG_DATUM(1), + NULL, &rxn2, NULL); + + PG_RETURN_BOOL(ReactionSubstructFP(rxn2, rxn)); +} + +#define REACTIONCMPFUNC( type, action, ret ) \ + PG_FUNCTION_INFO_V1(reaction_##type); \ + Datum reaction_##type(PG_FUNCTION_ARGS); \ + Datum \ + reaction_##type(PG_FUNCTION_ARGS) \ + { \ + CChemicalReaction rxn, rxn2; \ + int res; \ + \ + fcinfo->flinfo->fn_extra = SearchChemReactionCache( \ + fcinfo->flinfo->fn_extra, \ + fcinfo->flinfo->fn_mcxt, \ + PG_GETARG_DATUM(0), \ + NULL, &rxn, NULL); \ + fcinfo->flinfo->fn_extra = SearchChemReactionCache( \ + fcinfo->flinfo->fn_extra, \ + fcinfo->flinfo->fn_mcxt, \ + PG_GETARG_DATUM(1), \ + NULL, &rxn2, NULL); \ + res = reactioncmp(rxn, rxn2); \ + PG_RETURN_##ret( res action 0 ); \ + } \ +// /* keep compiler quiet - no extra ; */ \ +// extern int no_such_variable + +REACTIONCMPFUNC(eq, ==, BOOL); +REACTIONCMPFUNC(ne, !=, BOOL); diff --git a/Code/PgSQL/rdkit/sfp_op.c b/Code/PgSQL/rdkit/sfp_op.c index 67e939518..17a347a9f 100644 --- a/Code/PgSQL/rdkit/sfp_op.c +++ b/Code/PgSQL/rdkit/sfp_op.c @@ -389,5 +389,25 @@ torsion_fp(PG_FUNCTION_ARGS) { PG_RETURN_SPARSEFINGERPRINT_P(sfp); } +PG_FUNCTION_INFO_V1(reaction_difference_fp); +Datum reaction_difference_fp(PG_FUNCTION_ARGS); +Datum +reaction_difference_fp(PG_FUNCTION_ARGS) { + CChemicalReaction rxn; + MolSparseFingerPrint fp; + SparseFingerPrint *sfp; + fcinfo->flinfo->fn_extra = SearchChemReactionCache( + fcinfo->flinfo->fn_extra, + fcinfo->flinfo->fn_mcxt, + PG_GETARG_DATUM(0), + NULL, &rxn, NULL); + + fp = makeReactionDifferenceSFP(rxn, getReactionDifferenceFpSize(), + PG_GETARG_INT32(1) /* Fingerprinttype */ ); + sfp = deconstructMolSparseFingerPrint(fp); + freeMolSparseFingerPrint(fp); + + PG_RETURN_SPARSEFINGERPRINT_P(sfp); +} diff --git a/Code/PgSQL/rdkit/sql/avalon.sql b/Code/PgSQL/rdkit/sql/avalon.sql new file mode 100644 index 000000000..f2ee2008c --- /dev/null +++ b/Code/PgSQL/rdkit/sql/avalon.sql @@ -0,0 +1,3 @@ +select tanimoto_sml(avalon_fp('c1ccccc1'::mol),avalon_fp('c1ccccc1'::mol)); +select tanimoto_sml(avalon_fp('c1ccccc1'::mol),avalon_fp('c1ccccc1'::mol,true)); +select tanimoto_sml(avalon_fp('c1ccccc1'::mol),avalon_fp('c1ccccn1'::mol)); diff --git a/Code/PgSQL/rdkit/sql/reaction.sql b/Code/PgSQL/rdkit/sql/reaction.sql new file mode 100644 index 000000000..1236b4cc8 --- /dev/null +++ b/Code/PgSQL/rdkit/sql/reaction.sql @@ -0,0 +1,217 @@ +SET rdkit.ignore_reaction_agents=false; +SET rdkit.agent_FP_bit_ratio=0.2; +SET rdkit.rdkit_difference_FP_weight_agents=1; +SET rdkit.rdkit_difference_FP_weight_nonagents=10; +SET rdkit.move_unmmapped_reactants_to_agents=true; +SET rdkit.threshold_unmapped_reactant_atoms=0.2; +SET rdkit.init_reaction=true; + +SELECT reaction_from_smiles('c1ccccc1>>c1cccnc1'); +SELECT reaction_from_smiles('c1ccccc1>CC(=O)O>c1cccnc1'); +SELECT reaction_from_smarts('[c1:1][c:2][c:3][c:4]c[c1:5]>CC(=O)O>[c1:1][c:2][c:3][c:4]n[c1:5]'); +SELECT reaction_from_smarts('C(F)(F)F.[c1:1][c:2][c:3][c:4]c[c1:5]>CC(=O)O>[c1:1][c:2][c:3][c:4]n[c1:5]'); +SELECT reaction_from_smarts('c1ccc[n,c]c1>>c1nccnc1'); +SELECT reaction_to_smiles(reaction_from_smiles('c1ccccc1>>c1cccnc1')); +SELECT reaction_to_smiles(reaction_from_smarts('c1ccc[n,c]c1>>c1nccnc1')); +SELECT reaction_to_smarts(reaction_from_smarts('c1ccc[n,c]c1>>c1nccnc1')); +SELECT reaction_to_smarts('c1cccnc1>>c1nccnc1'::reaction); +SELECT reaction_to_ctab(reaction_from_smiles('c1ccccc1>>c1cccnc1')); +SELECT reaction_numreactants(reaction_from_smiles('[Cl].c1ccccc1>>c1cccnc1.[OH2]')); +SELECT reaction_numproducts(reaction_from_smiles('[Cl].c1ccccc1>>c1cccnc1.[OH2]')); +SELECT reaction_numagents(reaction_from_smiles('[Cl].c1ccccc1>CC(=O)O.[Na+]>c1cccnc1.[OH2]')); +SELECT reaction_numagents(reaction_from_smarts('C(F)(F)F.[c1:1][c:2][c:3][c:4]c[c1:5]>CC(=O)O>[c1:1][c:2][c:3][c:4]n[c1:5]')); +SET rdkit.move_unmmapped_reactants_to_agents=false; +SELECT reaction_numagents(reaction_from_smarts('C(F)(F)F.[c1:1][c:2][c:3][c:4]c[c1:5]>CC(=O)O>[c1:1][c:2][c:3][c:4]n[c1:5]')); +SET rdkit.move_unmmapped_reactants_to_agents=true; +SET rdkit.threshold_unmapped_reactant_atoms=0.9; +SELECT reaction_numagents(reaction_from_smarts('C(F)(F)F.[c1:1][c:2][c:3][c:4]c[c1:5]>CC(=O)O>[c1:1][c:2][c:3][c:4]n[c1:5]')); +SET rdkit.threshold_unmapped_reactant_atoms=0.2; +SELECT reaction_from_ctab('$RXN + + RDKit + + 1 1 +$MOL + + RDKit + + 6 6 0 0 0 0 0 0 0 0999 V2000 + 0.0000 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 4 0 + 2 3 4 0 + 3 4 4 0 + 4 5 4 0 + 5 6 4 0 + 6 1 4 0 +M END +$MOL + + RDKit + + 6 6 0 0 0 0 0 0 0 0999 V2000 + 0.0000 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 0.0000 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 4 0 + 2 3 4 0 + 3 4 4 0 + 4 5 4 0 + 5 6 4 0 + 6 1 4 0 +M END'); + +CREATE TABLE tmp (id integer, tmprxn text); +\copy tmp from 'data/reaction_test_data.out.rsmi'; +select * into pgreactions from (select id,reaction_from_smiles(tmprxn::cstring) rxn from tmp) as r where r is not null; +SET rdkit.move_unmmapped_reactants_to_agents=false; +select * into pgreactions_unchanged from (select id,reaction_from_smiles(tmprxn::cstring) rxn from tmp) as r where r is not null; +DROP table tmp; +SET rdkit.move_unmmapped_reactants_to_agents=true; +SELECT count(*) FROM pgreactions; +SELECT count(*) FROM pgreactions_unchanged; +SELECT SUM(reaction_numreactants(rxn)) FROM pgreactions; +SELECT SUM(reaction_numreactants(rxn)) FROM pgreactions_unchanged; +SELECT SUM(reaction_numproducts(rxn)) FROM pgreactions; +SELECT SUM(reaction_numproducts(rxn)) FROM pgreactions_unchanged; +SELECT SUM(reaction_numagents(rxn)) FROM pgreactions; +SELECT SUM(reaction_numagents(rxn)) FROM pgreactions_unchanged; +CREATE INDEX rxnidx ON pgreactions USING gist(rxn); +SET enable_indexscan=off; +SET enable_bitmapscan=off; +SET enable_seqscan=on; +SELECT count(*) FROM pgreactions WHERE rxn@>'c1ccccc1>>c1ccncc1'; +SELECT count(*) FROM pgreactions WHERE rxn@>'c1cnccc1>>c1ccccc1'; +SELECT count(*) FROM pgreactions WHERE 'c1ccccc1>>c1ccncc1'<@rxn; +SELECT count(*) FROM pgreactions WHERE 'c1cnccc1>>c1ccccc1'<@rxn; +SELECT count(*) FROM pgreactions WHERE rxn@>'c1ccccc1>>'; +SELECT count(*) FROM pgreactions WHERE rxn@>'c1cnccc1>>'; +SELECT count(*) FROM pgreactions WHERE 'c1ccccc1>>'<@rxn; +SELECT count(*) FROM pgreactions WHERE 'c1cnccc1>>'<@rxn; +SELECT count(*) FROM pgreactions WHERE rxn@>'>>c1ccncc1'; +SELECT count(*) FROM pgreactions WHERE rxn@>'>>c1ccccc1'; +SELECT count(*) FROM pgreactions WHERE '>>c1ccncc1'<@rxn; +SELECT count(*) FROM pgreactions WHERE '>>c1ccccc1'<@rxn; +SET enable_indexscan=on; +SET enable_bitmapscan=on; +SET enable_seqscan=off; +SELECT count(*) FROM pgreactions WHERE rxn@>'c1ccccc1>>c1ccncc1'; +SELECT count(*) FROM pgreactions WHERE rxn@>'c1cnccc1>>c1ccccc1'; +SELECT count(*) FROM pgreactions WHERE 'c1ccccc1>>c1ccncc1'<@rxn; +SELECT count(*) FROM pgreactions WHERE 'c1cnccc1>>c1ccccc1'<@rxn; +SELECT count(*) FROM pgreactions WHERE rxn@>'c1ccccc1>>'; +SELECT count(*) FROM pgreactions WHERE rxn@>'c1cnccc1>>'; +SELECT count(*) FROM pgreactions WHERE 'c1ccccc1>>'<@rxn; +SELECT count(*) FROM pgreactions WHERE 'c1cnccc1>>'<@rxn; +SELECT count(*) FROM pgreactions WHERE rxn@>'>>c1ccncc1'; +SELECT count(*) FROM pgreactions WHERE rxn@>'>>c1ccccc1'; +SELECT count(*) FROM pgreactions WHERE '>>c1ccncc1'<@rxn; +SELECT count(*) FROM pgreactions WHERE '>>c1ccccc1'<@rxn; +SELECT count(*) FROM pgreactions WHERE rxn?>'c1ccccc1>>c1ccncc1'; +SELECT count(*) FROM pgreactions WHERE rxn?>'c1cnccc1>>c1ccccc1'; +SELECT count(*) FROM pgreactions WHERE 'c1ccccc1>>c1ccncc1'?>c1ccccc1'?'c1ccccc1>>'; +SELECT count(*) FROM pgreactions WHERE rxn?>'c1cnccc1>>'; +SELECT count(*) FROM pgreactions WHERE 'c1ccccc1>>'?>'?'>>c1ccncc1'; +SELECT count(*) FROM pgreactions WHERE rxn?>'>>c1ccccc1'; +SELECT count(*) FROM pgreactions WHERE '>>c1ccncc1'?>c1ccccc1'?>c1ccncc1',1), reaction_difference_fp('c1ccccc1>>c1ccncc1',1)); +SELECT tanimoto_sml(reaction_difference_fp('c1ccccc1>>c1ccncc1',1), reaction_difference_fp('c1ncccc1>>c1ncncc1',1)); +SELECT tanimoto_sml(reaction_difference_fp('c1ccccc1>CC(=O)O.[Na+]>c1ccncc1',1), reaction_difference_fp('c1ccccc1>CC(=O)O.[Na+]>c1ccncc1',1)); +SELECT tanimoto_sml(reaction_difference_fp('c1ccccc1>CC(=O)O.[Na+]>c1ccncc1',1), reaction_difference_fp('c1ncccc1>[Na+]>c1ncncc1',1)); +SELECT tanimoto_sml(reaction_difference_fp('c1ccccc1>>c1ccncc1',2), reaction_difference_fp('c1ccccc1>>c1ccncc1',2)); +SELECT tanimoto_sml(reaction_difference_fp('c1ccccc1>>c1ccncc1',2), reaction_difference_fp('c1ncccc1>>c1ncncc1',2)); +SELECT tanimoto_sml(reaction_difference_fp('c1ccccc1>CC(=O)O.[Na+]>c1ccncc1',2), reaction_difference_fp('c1ccccc1>CC(=O)O.[Na+]>c1ccncc1',2)); +SELECT tanimoto_sml(reaction_difference_fp('c1ccccc1>CC(=O)O.[Na+]>c1ccncc1',2), reaction_difference_fp('c1ncccc1>[Na+]>c1ncncc1',2)); +SELECT tanimoto_sml(reaction_difference_fp('c1ccccc1>>c1ccncc1',3), reaction_difference_fp('c1ccccc1>>c1ccncc1',3)); +SELECT tanimoto_sml(reaction_difference_fp('c1ccccc1>>c1ccncc1',3), reaction_difference_fp('c1ncccc1>>c1ncncc1',3)); +SELECT tanimoto_sml(reaction_difference_fp('c1ccccc1>CC(=O)O.[Na+]>c1ccncc1',3), reaction_difference_fp('c1ccccc1>CC(=O)O.[Na+]>c1ccncc1',3)); +SELECT tanimoto_sml(reaction_difference_fp('c1ccccc1>CC(=O)O.[Na+]>c1ccncc1',3), reaction_difference_fp('c1ncccc1>[Na+]>c1ncncc1',3)); + +SELECT tanimoto_sml(reaction_structural_bfp('c1ccccc1>>c1ccncc1',1), reaction_structural_bfp('c1ccccc1>>c1ccncc1',1)); +SELECT tanimoto_sml(reaction_structural_bfp('c1ccccc1>>c1ccncc1',1), reaction_structural_bfp('c1ncccc1>>c1ncncc1',1)); +SELECT tanimoto_sml(reaction_structural_bfp('c1ccccc1>CC(=O)O.[Na+]>c1ccncc1',1), reaction_structural_bfp('c1ccccc1>CC(=O)O.[Na+]>c1ccncc1',1)); +SELECT tanimoto_sml(reaction_structural_bfp('c1ccccc1>CC(=O)O.[Na+]>c1ccncc1',1), reaction_structural_bfp('c1ncccc1>[Na+]>c1ncncc1',1)); +SELECT tanimoto_sml(reaction_structural_bfp('c1ccccc1>>c1ccncc1',2), reaction_structural_bfp('c1ccccc1>>c1ccncc1',2)); +SELECT tanimoto_sml(reaction_structural_bfp('c1ccccc1>>c1ccncc1',2), reaction_structural_bfp('c1ncccc1>>c1ncncc1',2)); +SELECT tanimoto_sml(reaction_structural_bfp('c1ccccc1>CC(=O)O.[Na+]>c1ccncc1',2), reaction_structural_bfp('c1ccccc1>CC(=O)O.[Na+]>c1ccncc1',2)); +SELECT tanimoto_sml(reaction_structural_bfp('c1ccccc1>CC(=O)O.[Na+]>c1ccncc1',2), reaction_structural_bfp('c1ncccc1>[Na+]>c1ncncc1',2)); +SELECT tanimoto_sml(reaction_structural_bfp('c1ccccc1>>c1ccncc1',3), reaction_structural_bfp('c1ccccc1>>c1ccncc1',3)); +SELECT tanimoto_sml(reaction_structural_bfp('c1ccccc1>>c1ccncc1',3), reaction_structural_bfp('c1ncccc1>>c1ncncc1',3)); +SELECT tanimoto_sml(reaction_structural_bfp('c1ccccc1>CC(=O)O.[Na+]>c1ccncc1',3), reaction_structural_bfp('c1ccccc1>CC(=O)O.[Na+]>c1ccncc1',3)); +SELECT tanimoto_sml(reaction_structural_bfp('c1ccccc1>CC(=O)O.[Na+]>c1ccncc1',3), reaction_structural_bfp('c1ncccc1>[Na+]>c1ncncc1',3)); +SELECT tanimoto_sml(reaction_structural_bfp('c1ccccc1>>c1ccncc1',4), reaction_structural_bfp('c1ccccc1>>c1ccncc1',4)); +SELECT tanimoto_sml(reaction_structural_bfp('c1ccccc1>>c1ccncc1',4), reaction_structural_bfp('c1ncccc1>>c1ncncc1',4)); +SELECT tanimoto_sml(reaction_structural_bfp('c1ccccc1>CC(=O)O.[Na+]>c1ccncc1',4), reaction_structural_bfp('c1ccccc1>CC(=O)O.[Na+]>c1ccncc1',4)); +SELECT tanimoto_sml(reaction_structural_bfp('c1ccccc1>CC(=O)O.[Na+]>c1ccncc1',4), reaction_structural_bfp('c1ncccc1>[Na+]>c1ncncc1',4)); +SELECT tanimoto_sml(reaction_structural_bfp('c1ccccc1>>c1ccncc1',5), reaction_structural_bfp('c1ccccc1>>c1ccncc1',5)); +SELECT tanimoto_sml(reaction_structural_bfp('c1ccccc1>>c1ccncc1',5), reaction_structural_bfp('c1ncccc1>>c1ncncc1',5)); +SELECT tanimoto_sml(reaction_structural_bfp('c1ccccc1>CC(=O)O.[Na+]>c1ccncc1',5), reaction_structural_bfp('c1ccccc1>CC(=O)O.[Na+]>c1ccncc1',5)); +SELECT tanimoto_sml(reaction_structural_bfp('c1ccccc1>CC(=O)O.[Na+]>c1ccncc1',5), reaction_structural_bfp('c1ncccc1>[Na+]>c1ncncc1',5)); + +SET rdkit.agent_FP_bit_ratio=0.5; +SET rdkit.rdkit_difference_FP_weight_agents=-3; +SET rdkit.rdkit_difference_FP_weight_nonagents=7; + +SELECT tanimoto_sml(reaction_difference_fp('c1ccccc1>>c1ccncc1',1), reaction_difference_fp('c1ccccc1>>c1ccncc1',1)); +SELECT tanimoto_sml(reaction_difference_fp('c1ccccc1>>c1ccncc1',1), reaction_difference_fp('c1ncccc1>>c1ncncc1',1)); +SELECT tanimoto_sml(reaction_difference_fp('c1ccccc1>CC(=O)O.[Na+]>c1ccncc1',1), reaction_difference_fp('c1ccccc1>CC(=O)O.[Na+]>c1ccncc1',1)); +SELECT tanimoto_sml(reaction_difference_fp('c1ccccc1>CC(=O)O.[Na+]>c1ccncc1',1), reaction_difference_fp('c1ncccc1>[Na+]>c1ncncc1',1)); +SELECT tanimoto_sml(reaction_difference_fp('c1ccccc1>>c1ccncc1',2), reaction_difference_fp('c1ccccc1>>c1ccncc1',2)); +SELECT tanimoto_sml(reaction_difference_fp('c1ccccc1>>c1ccncc1',2), reaction_difference_fp('c1ncccc1>>c1ncncc1',2)); +SELECT tanimoto_sml(reaction_difference_fp('c1ccccc1>CC(=O)O.[Na+]>c1ccncc1',2), reaction_difference_fp('c1ccccc1>CC(=O)O.[Na+]>c1ccncc1',2)); +SELECT tanimoto_sml(reaction_difference_fp('c1ccccc1>CC(=O)O.[Na+]>c1ccncc1',2), reaction_difference_fp('c1ncccc1>[Na+]>c1ncncc1',2)); +SELECT tanimoto_sml(reaction_difference_fp('c1ccccc1>>c1ccncc1',3), reaction_difference_fp('c1ccccc1>>c1ccncc1',3)); +SELECT tanimoto_sml(reaction_difference_fp('c1ccccc1>>c1ccncc1',3), reaction_difference_fp('c1ncccc1>>c1ncncc1',3)); +SELECT tanimoto_sml(reaction_difference_fp('c1ccccc1>CC(=O)O.[Na+]>c1ccncc1',3), reaction_difference_fp('c1ccccc1>CC(=O)O.[Na+]>c1ccncc1',3)); +SELECT tanimoto_sml(reaction_difference_fp('c1ccccc1>CC(=O)O.[Na+]>c1ccncc1',3), reaction_difference_fp('c1ncccc1>[Na+]>c1ncncc1',3)); + +SELECT tanimoto_sml(reaction_structural_bfp('c1ccccc1>>c1ccncc1',1), reaction_structural_bfp('c1ccccc1>>c1ccncc1',1)); +SELECT tanimoto_sml(reaction_structural_bfp('c1ccccc1>>c1ccncc1',1), reaction_structural_bfp('c1ncccc1>>c1ncncc1',1)); +SELECT tanimoto_sml(reaction_structural_bfp('c1ccccc1>CC(=O)O.[Na+]>c1ccncc1',1), reaction_structural_bfp('c1ccccc1>CC(=O)O.[Na+]>c1ccncc1',1)); +SELECT tanimoto_sml(reaction_structural_bfp('c1ccccc1>CC(=O)O.[Na+]>c1ccncc1',1), reaction_structural_bfp('c1ncccc1>[Na+]>c1ncncc1',1)); +SELECT tanimoto_sml(reaction_structural_bfp('c1ccccc1>>c1ccncc1',2), reaction_structural_bfp('c1ccccc1>>c1ccncc1',2)); +SELECT tanimoto_sml(reaction_structural_bfp('c1ccccc1>>c1ccncc1',2), reaction_structural_bfp('c1ncccc1>>c1ncncc1',2)); +SELECT tanimoto_sml(reaction_structural_bfp('c1ccccc1>CC(=O)O.[Na+]>c1ccncc1',2), reaction_structural_bfp('c1ccccc1>CC(=O)O.[Na+]>c1ccncc1',2)); +SELECT tanimoto_sml(reaction_structural_bfp('c1ccccc1>CC(=O)O.[Na+]>c1ccncc1',2), reaction_structural_bfp('c1ncccc1>[Na+]>c1ncncc1',2)); +SELECT tanimoto_sml(reaction_structural_bfp('c1ccccc1>>c1ccncc1',3), reaction_structural_bfp('c1ccccc1>>c1ccncc1',3)); +SELECT tanimoto_sml(reaction_structural_bfp('c1ccccc1>>c1ccncc1',3), reaction_structural_bfp('c1ncccc1>>c1ncncc1',3)); +SELECT tanimoto_sml(reaction_structural_bfp('c1ccccc1>CC(=O)O.[Na+]>c1ccncc1',3), reaction_structural_bfp('c1ccccc1>CC(=O)O.[Na+]>c1ccncc1',3)); +SELECT tanimoto_sml(reaction_structural_bfp('c1ccccc1>CC(=O)O.[Na+]>c1ccncc1',3), reaction_structural_bfp('c1ncccc1>[Na+]>c1ncncc1',3)); +SELECT tanimoto_sml(reaction_structural_bfp('c1ccccc1>>c1ccncc1',4), reaction_structural_bfp('c1ccccc1>>c1ccncc1',4)); +SELECT tanimoto_sml(reaction_structural_bfp('c1ccccc1>>c1ccncc1',4), reaction_structural_bfp('c1ncccc1>>c1ncncc1',4)); +SELECT tanimoto_sml(reaction_structural_bfp('c1ccccc1>CC(=O)O.[Na+]>c1ccncc1',4), reaction_structural_bfp('c1ccccc1>CC(=O)O.[Na+]>c1ccncc1',4)); +SELECT tanimoto_sml(reaction_structural_bfp('c1ccccc1>CC(=O)O.[Na+]>c1ccncc1',4), reaction_structural_bfp('c1ncccc1>[Na+]>c1ncncc1',4)); +SELECT tanimoto_sml(reaction_structural_bfp('c1ccccc1>>c1ccncc1',5), reaction_structural_bfp('c1ccccc1>>c1ccncc1',5)); +SELECT tanimoto_sml(reaction_structural_bfp('c1ccccc1>>c1ccncc1',5), reaction_structural_bfp('c1ncccc1>>c1ncncc1',5)); +SELECT tanimoto_sml(reaction_structural_bfp('c1ccccc1>CC(=O)O.[Na+]>c1ccncc1',5), reaction_structural_bfp('c1ccccc1>CC(=O)O.[Na+]>c1ccncc1',5)); +SELECT tanimoto_sml(reaction_structural_bfp('c1ccccc1>CC(=O)O.[Na+]>c1ccncc1',5), reaction_structural_bfp('c1ncccc1>[Na+]>c1ncncc1',5)); + +SET rdkit.ignore_reaction_agents=true; + +SELECT tanimoto_sml(reaction_difference_fp('c1ccccc1>>c1ccncc1',1), reaction_difference_fp('c1ccccc1>>c1ccncc1',1)); +SELECT tanimoto_sml(reaction_difference_fp('c1ccccc1>>c1ccncc1',1), reaction_difference_fp('c1ncccc1>>c1ncncc1',1)); +SELECT tanimoto_sml(reaction_difference_fp('c1ccccc1>CC(=O)O.[Na+]>c1ccncc1',1), reaction_difference_fp('c1ccccc1>CC(=O)O.[Na+]>c1ccncc1',1)); +SELECT tanimoto_sml(reaction_difference_fp('c1ccccc1>CC(=O)O.[Na+]>c1ccncc1',1), reaction_difference_fp('c1ncccc1>[Na+]>c1ncncc1',1)); + +SELECT tanimoto_sml(reaction_structural_bfp('c1ccccc1>>c1ccncc1',5), reaction_structural_bfp('c1ccccc1>>c1ccncc1',5)); +SELECT tanimoto_sml(reaction_structural_bfp('c1ccccc1>>c1ccncc1',5), reaction_structural_bfp('c1ncccc1>>c1ncncc1',5)); +SELECT tanimoto_sml(reaction_structural_bfp('c1ccccc1>CC(=O)O.[Na+]>c1ccncc1',5), reaction_structural_bfp('c1ccccc1>CC(=O)O.[Na+]>c1ccncc1',5)); +SELECT tanimoto_sml(reaction_structural_bfp('c1ccccc1>CC(=O)O.[Na+]>c1ccncc1',5), reaction_structural_bfp('c1ncccc1>[Na+]>c1ncncc1',5)); + +SET enable_indexscan=on; +SET enable_bitmapscan=on; +SET enable_seqscan=on; +DROP INDEX rxnidx; diff --git a/Code/SimDivPickers/Wrap/MaxMinPicker.cpp b/Code/SimDivPickers/Wrap/MaxMinPicker.cpp index 6f7b361a3..d43c17ab2 100644 --- a/Code/SimDivPickers/Wrap/MaxMinPicker.cpp +++ b/Code/SimDivPickers/Wrap/MaxMinPicker.cpp @@ -57,21 +57,27 @@ namespace RDPickers { class pyobjFunctor { public: - pyobjFunctor(python::object obj) : dp_obj(obj) {} + pyobjFunctor(python::object obj,bool useCache) : dp_obj(obj), dp_cache(NULL) { + if(useCache) dp_cache= new std::map,double>(); + } + ~pyobjFunctor() { + delete dp_cache; + } double operator()(unsigned int i,unsigned int j) { double res; std::pair idxPair(i,j); - if(this->d_cache.count(idxPair)>0){ - res = this->d_cache[idxPair]; + if(dp_cache && dp_cache->count(idxPair)>0){ + res = (*dp_cache)[idxPair]; } else { res=python::extract(dp_obj(i,j)); - this->d_cache[idxPair]=res; + if(dp_cache) + (*dp_cache)[idxPair]=res; } return res; } private: python::object dp_obj; - std::map,double> d_cache; + std::map,double> *dp_cache; }; RDKit::INT_VECT LazyMaxMinPicks(MaxMinPicker *picker, @@ -79,47 +85,60 @@ namespace RDPickers { int poolSize, int pickSize, python::object firstPicks, - int seed) { - pyobjFunctor functor(distFunc); + int seed, + bool useCache) { RDKit::INT_VECT firstPickVect; for(unsigned int i=0;i(firstPicks.attr("__len__")());++i){ firstPickVect.push_back(python::extract(firstPicks[i])); } - RDKit::INT_VECT res=picker->lazyPick(functor, poolSize, pickSize,firstPickVect,seed); + RDKit::INT_VECT res; + pyobjFunctor functor(distFunc,useCache); + res=picker->lazyPick(functor, poolSize, pickSize,firstPickVect,seed); return res; } + // NOTE: TANIMOTO and DICE provably return the same results for the diversity picking + // this is still here just in case we ever later want to support other methods. typedef enum { TANIMOTO=1, DICE } DistanceMethod; + + template class pyBVFunctor { public: - pyBVFunctor(python::object obj,DistanceMethod method) : dp_obj(obj), d_method(method) {} + pyBVFunctor(const std::vector &obj,DistanceMethod method,bool useCache) : d_obj(obj), d_method(method), dp_cache(NULL) { + if(useCache) dp_cache = new std::map,double>(); + } + ~pyBVFunctor() { + delete dp_cache; + } double operator()(unsigned int i,unsigned int j) { - const ExplicitBitVect *bvi,*bvj; - try{ - bvi=python::extract(dp_obj[i]); - bvj=python::extract(dp_obj[j]); - } catch (...) { - throw_value_error("unable to extract ExplicitBitVect from sequence value"); - } double res=0.0; - switch(d_method){ - case TANIMOTO: - res = 1.-TanimotoSimilarity(*bvi,*bvj); - break; - case DICE: - res = 1.-DiceSimilarity(*bvi,*bvj); - break; - default: - throw_value_error("unsupported similarity value"); + std::pair idxPair(i,j); + if(dp_cache && dp_cache->count(idxPair)>0){ + res = (*dp_cache)[idxPair]; + } else { + switch(d_method){ + case TANIMOTO: + res = 1.-TanimotoSimilarity(*d_obj[i],*d_obj[j]); + break; + case DICE: + res = 1.-DiceSimilarity(*d_obj[i],*d_obj[j]); + break; + default: + throw_value_error("unsupported similarity value"); + } + if(dp_cache){ + (*dp_cache)[idxPair]=res; + } } return res; } private: - python::object dp_obj; + const std::vector &d_obj; DistanceMethod d_method; + std::map,double> *dp_cache; }; RDKit::INT_VECT LazyVectorMaxMinPicks(MaxMinPicker *picker, @@ -128,9 +147,13 @@ namespace RDPickers { int pickSize, python::object firstPicks, int seed, - DistanceMethod method + bool useCache ) { - pyBVFunctor functor(objs,method); + std::vector bvs(poolSize); + for(unsigned int i=0;i(objs[i]); + } + pyBVFunctor functor(bvs,TANIMOTO,useCache); RDKit::INT_VECT firstPickVect; for(unsigned int i=0;i(firstPicks.attr("__len__")());++i){ firstPickVect.push_back(python::extract(firstPicks[i])); @@ -142,9 +165,6 @@ namespace RDPickers { struct MaxMin_wrap { static void wrap() { - python::enum_("DistanceMethod") - .value("TANIMOTO", RDPickers::TANIMOTO) - .value("DICE", RDPickers::DICE); python::class_("MaxMinPicker", "A class for diversity picking of items using the MaxMin Algorithm\n") .def("Pick", RDPickers::MaxMinPicks, @@ -158,13 +178,13 @@ namespace RDPickers { " - poolSize: number of items in the pool\n" " - pickSize: number of items to pick from the pool\n" " - firstPicks: (optional) the first items to be picked (seeds the list)\n" - " - seed: (optional) seed for the random number genrator\n" + " - seed: (optional) seed for the random number generator\n" ) .def("LazyPick", RDPickers::LazyMaxMinPicks, (python::arg("self"),python::arg("distFunc"),python::arg("poolSize"), python::arg("pickSize"),python::arg("firstPicks")=python::tuple(), - python::arg("seed")=-1), + python::arg("seed")=-1,python::arg("useCache")=true), "Pick a subset of items from a pool of items using the MaxMin Algorithm\n" "Ashton, M. et. al., Quant. Struct.-Act. Relat., 21 (2002), 598-604 \n" "ARGUMENTS:\n\n" @@ -175,12 +195,15 @@ namespace RDPickers { " - poolSize: number of items in the pool\n" " - pickSize: number of items to pick from the pool\n" " - firstPicks: (optional) the first items to be picked (seeds the list)\n" - " - seed: (optional) seed for the random number genrator\n" + " - seed: (optional) seed for the random number generator\n" + " - useCache: (optional) toggles use of a cache for the distance calculation\n" + " This trades memory usage for speed.\n" ) .def("LazyBitVectorPick", RDPickers::LazyVectorMaxMinPicks, (python::arg("self"),python::arg("objects"),python::arg("poolSize"), python::arg("pickSize"),python::arg("firstPicks")=python::tuple(), - python::arg("seed")=-1,python::arg("method")=RDPickers::TANIMOTO), + python::arg("seed")=-1, + python::arg("useCache")=true), "Pick a subset of items from a pool of bit vectors using the MaxMin Algorithm\n" "Ashton, M. et. al., Quant. Struct.-Act. Relat., 21 (2002), 598-604 \n" "ARGUMENTS:\n\n" @@ -188,8 +211,10 @@ namespace RDPickers { " - poolSize: number of items in the pool\n" " - pickSize: number of items to pick from the pool\n" " - firstPicks: (optional) the first items to be picked (seeds the list)\n" - " - seed: (optional) seed for the random number genrator\n" - " - method: (optional) the distance measure to use\n" + " - seed: (optional) seed for the random number generator\n" + " - useCache: (optional) toggles use of a cache for the distance calculation\n" + " This trades memory usage for speed.\n" + ) ; }; diff --git a/Code/SimDivPickers/Wrap/testPickers.py b/Code/SimDivPickers/Wrap/testPickers.py index cb1eb4e05..14148c08e 100755 --- a/Code/SimDivPickers/Wrap/testPickers.py +++ b/Code/SimDivPickers/Wrap/testPickers.py @@ -31,6 +31,9 @@ class TestCase(unittest.TestCase): lmaxmin = pkr.LazyPick(func, self.n, self.m,(886,112)) self.assertEqual(list(lmaxmin),list(maxmin)) + lmaxmin = pkr.LazyPick(func, self.n, self.m,(886,112),useCache=False) + self.assertEqual(list(lmaxmin),list(maxmin)) + self.assertRaises(ValueError,lambda:pkr.Pick(self.dMat, self.n, self.m,(1012,))) self.assertRaises(ValueError,lambda:pkr.Pick(self.dMat, self.n, self.m,(-1,))) @@ -146,7 +149,40 @@ class TestCase(unittest.TestCase): picker = rdSimDivPickers.HierarchicalClusterPicker(rdSimDivPickers.ClusterMethod.WARD) p1 = list(picker.Pick(m,nvs,N)) - + + def testBitVectorMaxMin(self): + from rdkit import DataStructs + sz = 100 + nbits=200 + nBitsToSet=int(nbits*.1) + N=10 + vs = [] + for i in range(sz): + bv = DataStructs.ExplicitBitVect(nbits) + for j in range(nBitsToSet): + val= int(nbits*random.random()) + bv.SetBit(val) + vs.append(bv) + def func(i,j,bvs = vs): + d = DataStructs.TanimotoSimilarity(bvs[i],bvs[j],returnDistance=True) + return d + picker = rdSimDivPickers.MaxMinPicker() + mm1 = picker.LazyPick(func,len(vs),N) + self.assertEqual(len(mm1),N) + + mm2 = picker.LazyPick(func,len(vs),N,useCache=False) + self.assertEqual(len(mm2),N) + self.assertEqual(list(mm1),list(mm2)) + + mm2 = picker.LazyBitVectorPick(vs,len(vs),N) + self.assertEqual(len(mm2),N) + self.assertEqual(list(mm1),list(mm2)) + + mm2 = picker.LazyBitVectorPick(vs,len(vs),N,useCache=False) + self.assertEqual(len(mm2),N) + self.assertEqual(list(mm1),list(mm2)) + + if __name__ == '__main__': unittest.main() diff --git a/Docs/Book/RDKit_Book.rst b/Docs/Book/RDKit_Book.rst index 2d6eae225..46744fa90 100644 --- a/Docs/Book/RDKit_Book.rst +++ b/Docs/Book/RDKit_Book.rst @@ -505,15 +505,17 @@ This leads to the following behavior: +----------+---------+-------+ | OCO | C | Yes | +----------+---------+-------+ -| OCO | [CH] | Yes | +| OCO | [CH] | No | +----------+---------+-------+ -| OCO | [CH2] | Yes | +| OCO | [CH2] | No | +----------+---------+-------+ -| OCO | [CH3] | Yes | +| OCO | [CH3] | No | ++----------+---------+-------+ +| OCO | O[CH3] | Yes | +----------+---------+-------+ | O[CH2]O | C | Yes | +----------+---------+-------+ -| O[CH2]O | [CH2] | Yes | +| O[CH2]O | [CH2] | No | +----------+---------+-------+ diff --git a/External/INCHI-API/Wrap/pyInchi.cpp b/External/INCHI-API/Wrap/pyInchi.cpp index 603d098bb..cd8ae37ba 100644 --- a/External/INCHI-API/Wrap/pyInchi.cpp +++ b/External/INCHI-API/Wrap/pyInchi.cpp @@ -1,6 +1,5 @@ -// $Id$ // -// Copyright (c) 2011, Novartis Institutes for BioMedical Research Inc. +// Copyright (c) 2011-2014, Novartis Institutes for BioMedical Research Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without @@ -61,15 +60,36 @@ namespace { } BOOST_PYTHON_MODULE(rdinchi) { - std::string docString = "return a ROMol for a InChI string"; + std::string docString = "return a ROMol for a InChI string\n\ + Returns:\n\ + a tuple with:\n\ + - the molecule\n\ + - the return code from the InChI conversion\n\ + - a string with any messages from the InChI conversion\n\ + - a string with any log messages from the InChI conversion\n"; boost::python::def("InchiToMol", InchiToMol, (boost::python::arg("inchi"), boost::python::arg("sanitize")=true, boost::python::arg("removeHs")=true), docString.c_str() ); - docString = "return the InChI for a ROMol molecule. If options is an empty" - "string, standard InChI string is returned"; + docString = "return the InChI for a ROMol molecule.\n\ +\n\ + Arguments:\n\ + - mol: the molecule to use.\n\ + - options: the InChI generation options.\n\ + Options should be prefixed with either a - or a /\n\ + Available options are explained in the InChI technical FAQ:\n\ + http://www.inchi-trust.org/fileadmin/user_upload/html/inchifaq/inchi-faq.html#15.14\n\ + and the User Guide:\n\ + http://www.inchi-trust.org/fileadmin/user_upload/software/inchi-v1.04/InChI_UserGuide.pdf\n\ + Returns:\n\ + a tuple with:\n\ + - the InChI\n\ + - the return code from the InChI conversion\n\ + - a string with any messages from the InChI conversion\n\ + - a string with any log messages from the InChI conversion\n\ + - a string with the InChI AuxInfo\n"; boost::python::def("MolToInchi", MolToInchi, (boost::python::arg("mol"), boost::python::arg("options")=std::string()), diff --git a/External/INCHI-API/inchi.cpp b/External/INCHI-API/inchi.cpp index ca91d6701..05d1176ac 100644 --- a/External/INCHI-API/inchi.cpp +++ b/External/INCHI-API/inchi.cpp @@ -1786,23 +1786,24 @@ namespace RDKit { } Atom::ChiralType chiralTag; if ((chiralTag = atom->getChiralTag()) != Atom::CHI_UNSPECIFIED) { + bool pushIt=false; std::string cipCode(""); if (atom->hasProp("_CIPCode")) atom->getProp("_CIPCode", cipCode); if (cipCode == "R") { stereo0D.parity = INCHI_PARITY_EVEN; - stereo0DEntries.push_back(stereo0D); + pushIt=true; } else if (cipCode == "S") { stereo0D.parity = INCHI_PARITY_ODD; - stereo0DEntries.push_back(stereo0D); + pushIt=true; } else if (cipCode == "") { // empty cipCode. try read tag directly if (chiralTag == Atom::CHI_TETRAHEDRAL_CW) { stereo0D.parity = INCHI_PARITY_EVEN; - stereo0DEntries.push_back(stereo0D); + pushIt=true; } else if (chiralTag == Atom::CHI_TETRAHEDRAL_CCW) { stereo0D.parity = INCHI_PARITY_ODD; - stereo0DEntries.push_back(stereo0D); + pushIt=true; } else { BOOST_LOG(rdWarningLog) << "unrecognized chirality tag (" << chiralTag << ") on atom " << i << " is ignored." @@ -1812,6 +1813,27 @@ namespace RDKit { BOOST_LOG(rdWarningLog) << "unrecognized chirality (" << cipCode << ") on atom " << i << " is ignored." << std::endl; } + if(pushIt){ + // this was github #296 + // with molecules like C[S@@](=O)C(C)(C)C the stereochem of the sulfur from + // the inchi comes back reversed if we don't have wedged bonds. There must + // be something with the way S stereochem is being handled that I'm not + // getting. + // There's something of an explanation at around line 258 of inchi_api.h + // but that didn't help that much. + // For want of a better idea, detect this pattern + // and flip the stereochem: + if(atom->getAtomicNum()==16 && + atom->getDegree()==3 && atom->getExplicitValence()==4){ + if(stereo0D.parity==INCHI_PARITY_EVEN){ + stereo0D.parity=INCHI_PARITY_ODD; + } else if(stereo0D.parity==INCHI_PARITY_ODD){ + stereo0D.parity=INCHI_PARITY_EVEN; + } + } + stereo0DEntries.push_back(stereo0D); + } + } else { //std::string molParity; //atom->getProp("molParity", molParity); diff --git a/External/INCHI-API/inchi.h b/External/INCHI-API/inchi.h index 5e25404b7..6a94479e6 100644 --- a/External/INCHI-API/inchi.h +++ b/External/INCHI-API/inchi.h @@ -1,6 +1,5 @@ -// $Id$ // -// Copyright (c) 2011, Novartis Institutes for BioMedical Research Inc. +// Copyright (c) 2011-2014, Novartis Institutes for BioMedical Research Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without @@ -30,8 +29,8 @@ // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -#ifndef __RDKIT_INCHI_30JUNE2011__ -#define __RDKIT_INCHI_30JUNE2011__ +#ifndef RDKIT_INCHI_30JUNE2011 +#define RDKIT_INCHI_30JUNE2011 #include #include namespace RDKit { @@ -60,6 +59,10 @@ namespace RDKit { * \param options An null-terminated character string of space-deliminated * InChI options that is passed to InChI API as is (except that / is naively * converted to - to non-Windows platforms and - is converted to / on Windows) + * Available options are explained in the InChI technical FAQ: + * http://www.inchi-trust.org/fileadmin/user_upload/html/inchifaq/inchi-faq.html#15.14 + * and the User Guide: + * http://www.inchi-trust.org/fileadmin/user_upload/software/inchi-v1.04/InChI_UserGuide.pdf */ std::string MolToInchi(const ROMol& mol, ExtraInchiReturnValues& rv, const char *options=NULL); diff --git a/External/INCHI-API/test.cpp b/External/INCHI-API/test.cpp index e72218795..ce509a7c2 100644 --- a/External/INCHI-API/test.cpp +++ b/External/INCHI-API/test.cpp @@ -226,6 +226,33 @@ void testGithubIssue68(){ BOOST_LOG(rdInfoLog) <<"done" << std::endl; } +void testGithubIssue296(){ + BOOST_LOG(rdErrorLog) << "-------------------------------------" << std::endl; + BOOST_LOG(rdInfoLog) <<"testing github issue 296: problems with chiral S and inchi" << std::endl; + { + std::string smiles="C[S@@](=O)C(C)(C)C"; + ROMol *m = SmilesToMol(smiles); + TEST_ASSERT(m); + ExtraInchiReturnValues tmp; + std::string inchi=MolToInchi(*m,tmp); + TEST_ASSERT(inchi=="InChI=1S/C5H12OS/c1-5(2,3)7(4)6/h1-4H3/t7-/m1/s1"); + delete m; + } + + { + std::string fName= getenv("RDBASE"); + fName += "/External/INCHI-API/test_data/github296.mol"; + ROMol *m = static_cast(MolFileToMol(fName)); + TEST_ASSERT(m); + ExtraInchiReturnValues tmp; + std::string inchi=MolToInchi(*m,tmp); + TEST_ASSERT(inchi=="InChI=1S/C5H12OS/c1-5(2,3)7(4)6/h1-4H3/t7-/m1/s1"); + delete m; + } + + BOOST_LOG(rdInfoLog) <<"done" << std::endl; +} + //-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-* // @@ -238,4 +265,5 @@ int main(){ testGithubIssue40(); testGithubIssue67(); testGithubIssue68(); + testGithubIssue296(); } diff --git a/External/INCHI-API/test_data/github296.mol b/External/INCHI-API/test_data/github296.mol new file mode 100644 index 000000000..b69f8d43f --- /dev/null +++ b/External/INCHI-API/test_data/github296.mol @@ -0,0 +1,18 @@ + + Mrv0541 07211416442D + + 7 6 0 0 1 0 999 V2000 + 2.1434 0.4125 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.0164 0.7145 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.8414 -0.7145 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.4289 -0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.7145 -1.2375 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 0.7145 -0.4125 0.0000 S 0 0 1 0 0 0 0 0 0 0 0 0 + 4 1 1 0 0 0 0 + 4 2 1 0 0 0 0 + 4 3 1 0 0 0 0 + 7 4 1 0 0 0 0 + 7 5 1 6 0 0 0 + 7 6 2 0 0 0 0 +M END diff --git a/rdkit/Chem/PandasTools.py b/rdkit/Chem/PandasTools.py index 0ec50d136..82753be6e 100644 --- a/rdkit/Chem/PandasTools.py +++ b/rdkit/Chem/PandasTools.py @@ -93,7 +93,9 @@ try: else: if 'display.width' in pd.core.config._registered_options: pd.set_option('display.width',1000000000) - if 'display.height' in pd.core.config._registered_options: + if 'display.max_rows' in pd.core.config._registered_options: + pd.set_option('display.max_rows',1000000000) + elif 'display.height' in pd.core.config._registered_options: pd.set_option('display.height',1000000000) if 'display.max_colwidth' in pd.core.config._registered_options: pd.set_option('display.max_colwidth',1000000000)